Source code for cv.models.publications

"""Defines Django-CV publication models."""
from django.db import models
from django.core.exceptions import ValidationError
from django.core.validators import RegexValidator
from django.utils.translation import ugettext_lazy as _

from cv.utils import check_isbn

from markdown import markdown

from .base import DisplayableModel, VitaePublicationModel, Journal, \
    Collaborator, CollaborationModel, StudentCollaborationModel
from .works import Grant, Talk


[docs]class Article(VitaePublicationModel): """Store instance representing an article.""" authors = models.ManyToManyField( Collaborator, through='ArticleAuthorship', related_name='articles') journal = models.ForeignKey( Journal, on_delete=models.CASCADE, blank=True, null=True) volume = models.CharField(max_length=20, blank=True) issue = models.CharField(max_length=20, blank=True) start_page = models.CharField(max_length=10, blank=True) end_page = models.CharField(max_length=10, blank=True) series = models.CharField(max_length=100, blank=True) number = models.CharField(max_length=15, blank=True) url = models.URLField(_('URL to published article'), blank=True) doi = models.CharField(_('DOI'), max_length=200, blank=True) pmcid = models.CharField( 'PMCID', max_length=40, blank=True, help_text=_('PubMed Central reference number (for more info see: ' 'https://publicaccess.nih.gov/include-pmcid-citations.htm#Difference)')) pmid = models.CharField( 'PMID', max_length=40, blank=True, help_text=_('PubMed Central reference number (for more info see: ' 'https://publicaccess.nih.gov/include-pmcid-citations.htm#Difference)')) grants = models.ManyToManyField(Grant, blank=True) # talks = models.ManyToManyField(Talk, blank=True) # def save(self, force_insert=False, force_update=False, *args, **kwargs): # """Saves instance of article.""" # super(Article, self).save(force_insert, force_update, *args, **kwargs) # class Meta: # get_latest_by = 'pub_date' # permissions = ( # ("can_view_nonpublic", "Can view non-public articles"), # ) # def get_primary_files(self): # """Return queryset of :class:`cv.models.CVFile` objects designated # as "primary files" associated with article.""" # return self.files.filter(is_primary__exact=True) objects = models.Manager()
[docs]class ArticleAuthorship(CollaborationModel, StudentCollaborationModel): """Store object relating collaborators to article.""" article = models.ForeignKey( Article, related_name="authorship", on_delete=models.CASCADE) class Meta: ordering = ['article', 'display_order'] unique_together = ('article', 'display_order')
[docs]class Book(VitaePublicationModel): """Store instance representing a book.""" authors = models.ManyToManyField( Collaborator, through='BookAuthorship', related_name="books") publisher = models.CharField(max_length=100, blank=True) place = models.CharField(max_length=100, blank=True) volume = models.IntegerField(blank=True, null=True) series = models.CharField(max_length=100, blank=True) series_number = models.CharField(max_length=10, blank=True) num_pages = models.IntegerField( _('Number of pages'), blank=True, null=True) isbn = models.CharField( _('ISBN'), max_length=20, blank=True, validators=[RegexValidator(r'^\d+[0-9\-]+[Xx0-9]$')]) url = models.URLField(_('URL'), blank=True) grants = models.ManyToManyField(Grant, blank=True)
[docs] def add_edition(self, **kwargs): """Add edition to book.""" if 'edition' not in kwargs.keys(): raise ValidationError(_('The field "edition" cannot be blank')) kwargs['book'] = self BookEdition.objects.create(**kwargs)
[docs] def get_editions(self): """Return queryset of all editions associated with book.""" return self.editions.all().order_by('-pub_date')
objects = models.Manager()
[docs]class BookAuthorship(CollaborationModel, StudentCollaborationModel): """Store authorship object relating collaborators to book.""" book = models.ForeignKey( Book, related_name="authorship", on_delete=models.CASCADE) class Meta: ordering = ['book', 'display_order'] unique_together = ('book', 'display_order')
[docs]class BookEdition(DisplayableModel): """Store edition information of a book.""" book = models.ForeignKey( Book, on_delete=models.CASCADE, related_name="editions") edition = models.CharField(max_length=50) pub_date = models.DateField(blank=True, null=True) submission_date = models.DateField(blank=True, null=True) publisher = models.CharField(max_length=100, blank=True) place = models.CharField(blank=True, null=True, max_length=100) num_pages = models.IntegerField('Number of pages', blank=True, null=True) isbn = models.CharField( 'ISBN', max_length=20, blank=True, validators=[RegexValidator(r'^\d+[0-9\-]+[Xx0-9]$')])
[docs] def clean(self): if getattr(self, 'isbn', ''): self.isbn = check_isbn(self.isbn)
def __str__(self): return '%s ed. of %s' % (self.edition, str(self.book)) objects = models.Manager()
[docs]class Chapter(VitaePublicationModel): """Store instance representing book chapter.""" authors = models.ManyToManyField( Collaborator, through='ChapterAuthorship', related_name="chapters") editors = models.ManyToManyField( Collaborator, through='ChapterEditorship', related_name='editors') book_title = models.CharField(max_length=200) volume = models.CharField(max_length=50, null=True, blank=True) volumes = models.CharField( _("No. of volumes"), max_length=50, null=True, blank=True) edition = models.CharField(max_length=50, null=True, blank=True) publisher = models.CharField(max_length=100, blank=True) place = models.CharField(max_length=100, blank=True) series = models.CharField(max_length=100, blank=True, null=True) series_number = models.CharField(max_length=10, blank=True, null=True) start_page = models.CharField(max_length=10, blank=True) end_page = models.CharField(max_length=10, blank=True) isbn = models.CharField( _('ISBN'), max_length=20, blank=True, validators=[RegexValidator(r'^\d+[0-9\-]+[Xx0-9]$')]) url = models.URLField(_('URL'), blank=True) grants = models.ManyToManyField(Grant, blank=True) abstract_html = models.TextField(blank=True, editable=False) objects = models.Manager()
[docs]class ChapterAuthorship(CollaborationModel, StudentCollaborationModel): """Store object relating collaborators to article.""" chapter = models.ForeignKey( Chapter, related_name="authorship", on_delete=models.CASCADE) class Meta: ordering = ['display_order'] unique_together = (('chapter', 'display_order'))
[docs]class ChapterEditorship(CollaborationModel): """Store object relating editors to chapter.""" chapter = models.ForeignKey( Chapter, related_name="editorship", on_delete=models.CASCADE) class Meta: ordering = ['display_order'] unique_together = (('chapter', 'display_order'))
[docs]class Report(VitaePublicationModel): """Store instance representing reports.""" authors = models.ManyToManyField( Collaborator, through='ReportAuthorship', related_name="reports") report_number = models.CharField(max_length=100, blank=True, null=True) report_type = models.CharField(max_length=200, blank=True, null=True) series_title = models.CharField(max_length=200, blank=True, null=True) place = models.CharField(max_length=100, blank=True, null=True) institution = models.CharField(max_length=100, blank=True, null=True) pages = models.CharField(max_length=20, blank=True, null=True) url = models.URLField(blank=True) doi = models.CharField('DOI', max_length=200, blank=True) abstract_html = models.TextField(blank=True, editable=False) grants = models.ManyToManyField(Grant, blank=True) # def get_primary_files(self): # return self.files.filter(is_primary__exact=True) objects = models.Manager()
[docs]class ReportAuthorship(CollaborationModel, StudentCollaborationModel): """Store object relating collaborators to report.""" report = models.ForeignKey( Report, related_name="authorship", on_delete=models.CASCADE) class Meta: ordering = ['display_order'] unique_together = ('report', 'display_order')