Newer
Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
__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)
status = models.CharField(
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']
def __str__(self):
"""Summarize the EditorialAssignment's basic information."""
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
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:assignment_request', args=(self.id,))
@property
def notification_name(self):
"""Return string representation of this EditorialAssigment as shown in Notifications."""
return self.submission.preprint.identifier_w_vn_nr
@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)
mail_sender.send_mail()
EditorialAssignment.objects.filter(
id=self.id).update(date_invited=timezone.now(), status=STATUS_INVITED)
return True