SciPost Code Repository

Skip to content
Snippets Groups Projects
models.py 2.29 KiB
Newer Older
__copyright__ = "Copyright 2016-2018, Stichting SciPost (SciPost Foundation)"
__license__ = "AGPL v3"


from django.db import models
Jorran de Wit's avatar
Jorran de Wit committed
from django.db.models import Q
from django.urls import reverse
Jorran de Wit's avatar
Jorran de Wit committed

from journals.models import Publication
from .managers import FunderQuerySet


class Funder(models.Model):
    """Funder is a Fundref regsitry.

    Funding info metadata is linked to funders from Crossref's
    """
    name = models.CharField(max_length=256)
    acronym = models.CharField(max_length=32, blank=True)
    identifier = models.CharField(max_length=200, unique=True)

    objects = FunderQuerySet.as_manager()

        ordering = ['name', 'acronym']
        result = self.name
        if self.acronym:
            result += ' (%s)' % self.acronym
        return result
    def get_absolute_url(self):
        """Return the Funder detail page."""
        return reverse('funders:funder_publications', args=(self.id,))

Jorran de Wit's avatar
Jorran de Wit committed
    def all_related_publications(self):
        """Return all Publication objects linked to this Funder."""
Jorran de Wit's avatar
Jorran de Wit committed
        return Publication.objects.filter(
            Q(funders_generic=self) | Q(grants__funder=self)).distinct()


class Grant(models.Model):
    """An instance of a grant, award or other funding.

    In a Publication's metadata, all grants are listed
    in the Crossmark part of the metadata.
    """
Jorran de Wit's avatar
Jorran de Wit committed
    funder = models.ForeignKey('funders.Funder', on_delete=models.CASCADE)
    number = models.CharField(max_length=64)
    recipient_name = models.CharField(max_length=64, blank=True)
    recipient = models.ForeignKey('scipost.Contributor', blank=True, null=True,
                                  on_delete=models.CASCADE)
    further_details = models.CharField(max_length=256, blank=True)
        default_related_name = 'grants'
        ordering = ['funder', 'recipient', 'recipient_name', 'number']
        unique_together = ('funder', 'number')

    def __str__(self):
        grantstring = '%s, grant number %s' % (str(self.funder), self.number)
        if self.recipient:
            grantstring += ' (%s)' % str(self.recipient)
        elif self.recipient_name:
            grantstring += ' (%s)' % self.recipient_name
        if self.further_details:
            grantstring += ' [%s]' % self.further_details