Skip to content
Snippets Groups Projects
Commit 782197c1 authored by Todd Dembrey's avatar Todd Dembrey
Browse files

GH-957: set new users and dont remove old where needed

parent 9d3ee45b
No related branches found
No related tags found
No related merge requests found
...@@ -69,11 +69,15 @@ class UpdateReviewersForm(forms.ModelForm): ...@@ -69,11 +69,15 @@ class UpdateReviewersForm(forms.ModelForm):
self.request = kwargs.pop('request', None) self.request = kwargs.pop('request', None)
super().__init__(*args, **kwargs) super().__init__(*args, **kwargs)
reviewers = self.instance.reviewers.all()
self.submitted_reviewers = User.objects.filter(id__in=self.instance.reviews.values('author')) self.submitted_reviewers = User.objects.filter(id__in=self.instance.reviews.values('author'))
if self.can_alter_external_reviewers(self.instance, self.user): if self.can_alter_external_reviewers(self.instance, self.user):
self.prepare_field('reviewer_reviewers', reviewers, self.submitted_reviewers) reviewers = self.instance.reviewers.all()
self.prepare_field(
'reviewer_reviewers',
initial=reviewers,
excluded=self.submitted_reviewers
)
else: else:
self.fields.pop('reviewer_reviewers') self.fields.pop('reviewer_reviewers')
...@@ -82,8 +86,7 @@ class UpdateReviewersForm(forms.ModelForm): ...@@ -82,8 +86,7 @@ class UpdateReviewersForm(forms.ModelForm):
assigned_roles = { assigned_roles = {
assigned.role: assigned.reviewer assigned.role: assigned.reviewer
for assigned in AssignedReviewers.objects.filter( for assigned in self.instance.assigned.filter(
submission=self.instance,
role__isnull=False role__isnull=False
) )
} }
...@@ -127,21 +130,37 @@ class UpdateReviewersForm(forms.ModelForm): ...@@ -127,21 +130,37 @@ class UpdateReviewersForm(forms.ModelForm):
def save(self, *args, **kwargs): def save(self, *args, **kwargs):
instance = super().save(*args, **kwargs) instance = super().save(*args, **kwargs)
assigned_roles = {
role: self.cleaned_data[field]
for field, role in self.roles.items()
}
missing_staff = instance.staff_not_reviewed.filter(
assignedreviewers__submission=instance,
assignedreviewers__role__isnull=True
).exclude(
id__in=[user.id for user in assigned_roles.values()]
)
if self.can_alter_external_reviewers(self.instance, self.user): if self.can_alter_external_reviewers(self.instance, self.user):
reviewers = self.cleaned_data.get('reviewer_reviewers') reviewers = self.cleaned_data.get('reviewer_reviewers')
else: else:
reviewers = instance.reviewers_not_reviewed reviewers = instance.reviewers_not_reviewed
current_reviewers = set(reviewers | self.submitted_reviewers) current_reviewers = set(reviewers | self.submitted_reviewers | missing_staff)
for reviewer in current_reviewers:
AssignedReviewers.objects.update_or_create( instance.assigned.filter(role=None).delete()
AssignedReviewers.objects.bulk_create(
AssignedReviewers(
submission=instance, submission=instance,
role=None, role=None,
defaults={'reviewer': reviewer}, reviewer=reviewer,
) ) for reviewer in current_reviewers
)
for field, role in self.roles.items(): for role, reviewer in assigned_roles.items():
reviewer = self.cleaned_data[field]
if reviewer: if reviewer:
AssignedReviewers.objects.update_or_create( AssignedReviewers.objects.update_or_create(
submission=instance, submission=instance,
......
...@@ -685,7 +685,9 @@ class AssignedReviewers(models.Model): ...@@ -685,7 +685,9 @@ class AssignedReviewers(models.Model):
) )
submission = models.ForeignKey( submission = models.ForeignKey(
ApplicationSubmission, ApplicationSubmission,
on_delete=models.CASCADE) related_name='assigned',
on_delete=models.CASCADE
)
role = models.ForeignKey( role = models.ForeignKey(
'funds.ReviewerRole', 'funds.ReviewerRole',
related_name='+', related_name='+',
...@@ -695,3 +697,6 @@ class AssignedReviewers(models.Model): ...@@ -695,3 +697,6 @@ class AssignedReviewers(models.Model):
class Meta: class Meta:
unique_together = ('submission', 'role') unique_together = ('submission', 'role')
def __str__(self):
return f'{self.reviewer} as {self.role}'
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment