SciPost Code Repository

Skip to content
Snippets Groups Projects
models.py 2.5 KiB
Newer Older
__copyright__ = "Copyright © Stichting SciPost (SciPost Foundation)"
Jorran de Wit's avatar
Jorran de Wit committed
__license__ = "AGPL v3"


from django.contrib.sites.models import Site
from django.urls import reverse
Jorran de Wit's avatar
Jorran de Wit committed
from django.db import models
from django.http import Http404

from submissions.exceptions import PreprintDocumentNotFoundError

Jorran de Wit's avatar
Jorran de Wit committed

class Preprint(models.Model):
    """
    A preprint object, either at SciPost or with link to external preprint server.
Jorran de Wit's avatar
Jorran de Wit committed

    If the instance is a SciPost preprint, the `_file` field should be filled.
Jorran de Wit's avatar
Jorran de Wit committed
    """

    # (arXiv) identifiers with/without version number
    identifier_w_vn_nr = models.CharField(max_length=128, unique=True, db_index=True)
Jorran de Wit's avatar
Jorran de Wit committed
    url = models.URLField(blank=True)
Jorran de Wit's avatar
Jorran de Wit committed

Jorran de Wit's avatar
Jorran de Wit committed
    _file = models.FileField(
        verbose_name='Preprint file', help_text='Preprint file for SciPost standalone preprints',
        upload_to='UPLOADS/PREPRINTS/%Y/%m/', max_length=200, blank=True)
Jorran de Wit's avatar
Jorran de Wit committed

    # Dates
    modified = models.DateTimeField(auto_now=True)
    created = models.DateTimeField(auto_now_add=True)

    class Meta:
        ordering = ['-identifier_w_vn_nr']


Jorran de Wit's avatar
Jorran de Wit committed
    def __str__(self):
        return 'Preprint {}'.format(self.identifier_w_vn_nr)

    def get_absolute_url(self):
        """Return either saved url or url to open the pdf."""
Jorran de Wit's avatar
Jorran de Wit committed
        if self.url:
            return self.url
        if self._file:
            return reverse('preprints:pdf', args=(self.identifier_w_vn_nr,))
Jorran de Wit's avatar
Jorran de Wit committed
        raise Http404
    def get_document(self):
        """
        Retrieve the preprint document itself, calling preprint server if necessary.
        """
        if self._file:  # SciPost-hosted,
            # return file directly since the url isn't yet publicly accessible
            return self._file.read()
        url = self.citation_pdf_url
        response = requests.get(url)
        if response.status_code != 200:
            raise PreprintDocumentNotFoundError(url)
    @property
    def citation_pdf_url(self):
        """Return the absolute URL of the pdf for the meta tag for Google Scholar."""
        if self._file: # means this is a SciPost-hosted preprint
            return "https://%s%s" % (Site.objects.get_current().domain, self.get_absolute_url())
            return '%s.pdf' % self.get_absolute_url().replace("/abs/", "/pdf/")
        else:
            return self.get_absolute_url()

    @property
    def is_arXiv(self):
        """Return True if this preprint is hosted on arXiv."""
        return 'arxiv.org' in self.url