SciPost Code Repository

Skip to content
Snippets Groups Projects
assignment.py 3.14 KiB
Newer Older
__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 mails.utils import DirectMailUtil

from ..behaviors import SubmissionRelatedObjectMixin
from ..constants import (
    ASSIGNMENT_STATUSES,
    STATUS_PREASSIGNED,
    STATUS_INVITED,
    STATUS_REPLACED,
    STATUS_ACCEPTED,
    STATUS_DEPRECATED,
    STATUS_COMPLETED,
    ASSIGNMENT_REFUSAL_REASONS,
)
from ..managers import EditorialAssignmentQuerySet


class EditorialAssignment(SubmissionRelatedObjectMixin, models.Model):
    """Fellow assignment to a Submission to become Editor-in-Charge."""

    submission = models.ForeignKey("submissions.Submission", on_delete=models.CASCADE)
    to = models.ForeignKey("scipost.Contributor", on_delete=models.CASCADE)
        max_length=16, choices=ASSIGNMENT_STATUSES, default=STATUS_PREASSIGNED
    )
    refusal_reason = models.CharField(
        max_length=3, choices=ASSIGNMENT_REFUSAL_REASONS, blank=True, null=True
    )
    invitation_order = models.PositiveSmallIntegerField(default=0)

    date_created = models.DateTimeField(default=timezone.now)
    date_invited = models.DateTimeField(blank=True, null=True)
    date_answered = models.DateTimeField(blank=True, null=True)

    objects = EditorialAssignmentQuerySet.as_manager()

    class Meta:
        default_related_name = "editorial_assignments"
        ordering = ["-date_created"]
Jean-Sébastien Caux's avatar
Jean-Sébastien Caux committed
        """Summarize the EditorialAssignment's basic information."""
        return (
            self.to.user.first_name
            + " "
            + self.to.user.last_name
            + " to become EIC of "
            + self.submission.title[:30]
            + " by "
            + self.submission.author_list[:30]
            + ", requested on "
            + self.date_created.strftime("%Y-%m-%d")
        )

    def get_absolute_url(self):
        """Return the url of the assignment's processing page."""
        return reverse("submissions:pool:assignment_request", args=(self.id,))

    @property
    def preassigned(self):
        return self.status == STATUS_PREASSIGNED

    @property
    def invited(self):
        return self.status == STATUS_INVITED

    @property
    def replaced(self):
        return self.status == STATUS_REPLACED

    @property
    def accepted(self):
        return self.status == STATUS_ACCEPTED

    @property
    def deprecated(self):
        return self.status == STATUS_DEPRECATED

    @property
    def completed(self):
        return self.status == STATUS_COMPLETED

    def send_invitation(self):
        """Send invitation and update status."""
        if self.status != STATUS_PREASSIGNED:
            # Only send if status is appropriate to prevent double sending
            return False

        # Send mail
        mail_sender = DirectMailUtil(
            mail_code="eic/assignment_request", assignment=self
        )
        EditorialAssignment.objects.filter(id=self.id).update(
            date_invited=timezone.now(), status=STATUS_INVITED
        )