Source code for submissions.models.decision

__copyright__ = "Copyright © Stichting SciPost (SciPost Foundation)"
__license__ = "AGPL v3"


from django.db import models
from django.urls import reverse
from django.utils import timezone

from ..constants import EDITORIAL_DECISION_CHOICES, EIC_REC_PUBLISH
from ..managers import EditorialDecisionQuerySet


[docs]class EditorialDecision(models.Model): """Editorial decision, created by EdAdmin based on voting results. If the decision is to publish in the journal the authors submitted to, or in a higher one (e.g. Selections instead of flagship), authors are presumed to accept the outcome. If the decision is to publish in a Journal which is subsidiary to the one the authors submitted to, the authors are sent a publication offer which they have to accept before production is initiated. """ DRAFTED = 0 FIXED_AND_ACCEPTED = 1 AWAITING_PUBOFFER_ACCEPTANCE = 2 PUBOFFER_REFUSED_BY_AUTHORS = 3 APPEALED_BY_AUTHORS = 4 UNDER_REVIEW_BY_OMBUDSPERSON = 5 DEPRECATED = -1 EDITORIAL_DECISION_STATUSES = ( (DRAFTED, "Editorial decision drafted (yet to be communicated to authors)"), ( FIXED_AND_ACCEPTED, "Editorial decision fixed and (if required) accepted by authors", ), ( AWAITING_PUBOFFER_ACCEPTANCE, "Awaiting author acceptance of publication offer", ), ( PUBOFFER_REFUSED_BY_AUTHORS, "Publication offer refused by authors; manuscript will not be produced", ), (APPEALED_BY_AUTHORS, "Editorial decision appealed by authors"), ( UNDER_REVIEW_BY_OMBUDSPERSON, "Editorial decision under review by ombudsperson", ), (DEPRECATED, "Deprecated"), ) submission = models.ForeignKey("submissions.Submission", on_delete=models.CASCADE) for_journal = models.ForeignKey("journals.Journal", on_delete=models.CASCADE) decision = models.SmallIntegerField(choices=EDITORIAL_DECISION_CHOICES) taken_on = models.DateTimeField(default=timezone.now) remarks_for_authors = models.TextField( blank=True, verbose_name="optional remarks for the authors" ) remarks_for_editorial_college = models.TextField( blank=True, verbose_name="optional remarks for the Editorial College" ) status = models.SmallIntegerField(choices=EDITORIAL_DECISION_STATUSES) version = models.SmallIntegerField(default=1) objects = EditorialDecisionQuerySet.as_manager() class Meta: ordering = ["-submission__submission_date", "-version"] unique_together = ["submission", "version"] verbose_name = "Editorial Decision" verbose_name_plural = "Editorial Decisions" def __str__(self): return "%s: %s for journal %s" % ( self.submission.preprint.identifier_w_vn_nr, self.get_decision_display(), self.for_journal, )
[docs] def summary(self): return "For Journal %s: %s (status: %s)" % ( self.for_journal, self.get_decision_display(), self.get_status_display(), )
[docs] def get_absolute_url(self): return reverse( "submissions:editorial_decision_detail", kwargs={"identifier_w_vn_nr": self.submission.preprint.identifier_w_vn_nr}, )
@property def is_fixed_and_accepted(self): return self.status == self.FIXED_AND_ACCEPTED @property def publish(self): """Whether the decision is to publish (True) or reject (False).""" return self.decision == EIC_REC_PUBLISH @property def production_can_proceed(self): return self.status == self.FIXED_AND_ACCEPTED