class Citation(models.Model): portfolio_entry = models.ForeignKey(PortfolioEntry) # [0] url = models.URLField(null=True, verbose_name="URL") contributor_role = models.CharField(max_length=200, null=True) languages = models.CharField(max_length=200, null=True) first_commit_time = models.DateTimeField(null=True) date_created = models.DateTimeField(default=datetime.datetime.utcnow) is_published = models.BooleanField(default=False) # unpublished == Unread is_deleted = models.BooleanField(default=False) ignored_due_to_duplicate = models.BooleanField(default=False) old_summary = models.TextField(null=True, default=None) objects = models.Manager() untrashed = UntrashedCitationManager() @property def summary(self): # FIXME: Pluralize correctly. # FIXME: Use "since year_started" if self.url is not None: return url2printably_short(self.url, CUTOFF=38) elif self.languages is not None: return "Coded in %s." % (self.languages, ) def get_languages_as_list(self): if self.languages is None: return [] return [ lang.strip() for lang in self.languages.split(",") if lang.strip() ] def get_url_or_guess(self): if self.url: return self.url def save_and_check_for_duplicates(self): # FIXME: Cache summaries in the DB so this query is faster. duplicates = [ citation for citation in Citation.objects.filter( portfolio_entry=self.portfolio_entry) if (citation.pk != self.pk) and (citation.summary == self.summary) ] if duplicates: self.ignored_due_to_duplicate = True return self.save() # [0]: FIXME: Let's learn how to use Django's ManyToManyField etc. def __unicode__(self): if self.pk is not None: pk = self.pk else: pk = 'unassigned' return "pk=%s, summary=%s" % (pk, self.summary)
class PortfolioEntry(models.Model): # Managers objects = models.Manager() published_ones = PublishedPortfolioEntries() # FIXME: Constrain this so (person, project) pair uniquely finds a # PortfolioEntry person = models.ForeignKey(Person) project = models.ForeignKey(Project) project_description = models.TextField(blank=True) experience_description = models.TextField(blank=True) date_created = models.DateTimeField(default=datetime.datetime.utcnow) is_published = models.BooleanField(default=False) is_deleted = models.BooleanField(default=False) is_archived = models.BooleanField(default=False) sort_order = models.IntegerField(default=0) use_my_description = models.BooleanField(default=True, verbose_name='') receive_maintainer_updates = models.BooleanField(default=True) def get_published_citations(self): return Citation.untrashed.filter(portfolio_entry=self, is_published=True) @staticmethod def create_dummy(**kwargs): data = { 'project_description': "DESCRIPTION-----------------------------" + uuid.uuid4().hex } data.update(kwargs) ret = PortfolioEntry(**data) ret.save() return ret @staticmethod def create_dummy_with_project(**kwargs): data = {'project': Project.create_dummy()} data.update(kwargs) return PortfolioEntry.create_dummy(**data) class Meta: ordering = ('-sort_order', '-id')
class Citation(models.Model): portfolio_entry = models.ForeignKey(PortfolioEntry) # [0] url = models.URLField(null=True, verbose_name="URL") contributor_role = models.CharField(max_length=200, null=True) data_import_attempt = models.ForeignKey(DataImportAttempt, null=True) languages = models.CharField(max_length=200, null=True) first_commit_time = models.DateTimeField(null=True) date_created = models.DateTimeField(default=datetime.datetime.utcnow) is_published = models.BooleanField(default=False) # unpublished == Unread is_deleted = models.BooleanField(default=False) ignored_due_to_duplicate = models.BooleanField(default=False) old_summary = models.TextField(null=True, default=None) objects = models.Manager() untrashed = UntrashedCitationManager() @property def summary(self): # FIXME: Pluralize correctly. # FIXME: Use "since year_started" if self.data_import_attempt: if self.data_import_attempt.source == 'db' and ( self.contributor_role == 'Maintainer'): return 'Maintain a package in Debian.' if self.data_import_attempt.source == 'db' and ( self.contributor_role.startswith('Maintainer of')): return self.contributor_role if self.data_import_attempt.source in ('gh', 'ga'): return '%s a repository on Github.' % self.contributor_role if self.data_import_attempt.source in ['rs', 'ou']: if not self.languages: return "Committed to codebase (%s)" % ( self.data_import_attempt.get_source_display(), ) return "Coded in %s (%s)" % ( self.languages, self.data_import_attempt.get_source_display(), ) elif self.data_import_attempt.source == 'lp': return "Participated in %s (%s)" % ( self.contributor_role, self.data_import_attempt.get_source_display()) elif self.data_import_attempt.source == 'bb': return "Created a repository on Bitbucket." else: raise ValueError, "There's a DIA of a kind I don't know how to summarize." elif self.url is not None: return url2printably_short(self.url, CUTOFF=38) elif self.languages is not None: return "Coded in %s." % (self.languages, ) raise ValueError( "There's no DIA and I don't know how to summarize this.") def get_languages_as_list(self): if self.languages is None: return [] return [ lang.strip() for lang in self.languages.split(",") if lang.strip() ] def get_url_or_guess(self): if self.url: return self.url else: if self.data_import_attempt: if self.data_import_attempt.source in ['rs', 'ou']: try: project_name = unicode( self.portfolio_entry.project.name, 'utf-8') return "http://www.ohloh.net/search?%s" % http.urlencode( {u'q': project_name}) except: logger.warning( "During Citation.get_url_or_guess, we failed to encode the project name correctly." ) # This is just a temporary workaround since the above # line was causing errors. return "http://www.ohloh.net/search?q=%s" % self.portfolio_entry.project.name elif self.data_import_attempt.source == 'lp': return "https://launchpad.net/~%s" % urllib.quote( self.data_import_attempt.query) def save_and_check_for_duplicates(self): # FIXME: Cache summaries in the DB so this query is faster. duplicates = [ citation for citation in Citation.objects.filter( portfolio_entry=self.portfolio_entry) if (citation.pk != self.pk) and (citation.summary == self.summary) ] if duplicates: self.ignored_due_to_duplicate = True return self.save() # [0]: FIXME: Let's learn how to use Django's ManyToManyField etc. def __unicode__(self): if self.pk is not None: pk = self.pk else: pk = 'unassigned' return "pk=%s, summary=%s" % (pk, self.summary)