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
42
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
__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):
"""Summerize 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: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