예제 #1
0
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)
예제 #2
0
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')
예제 #3
0
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)