diff --git a/ietf/group/views.py b/ietf/group/views.py index 988183b80..9c4110840 100644 --- a/ietf/group/views.py +++ b/ietf/group/views.py @@ -40,6 +40,7 @@ import itertools import datetime from tempfile import mkstemp from collections import OrderedDict, defaultdict +from simple_history.utils import update_change_reason from django import forms from django.conf import settings @@ -1675,6 +1676,8 @@ def change_reviewer_settings(request, acronym, reviewer_email, group_type=None): settings_form = ReviewerSettingsForm(request.POST, instance=settings, exclude_fields=exclude_fields) if settings_form.is_valid(): settings = settings_form.save() + if settings_form.has_changed(): + update_change_reason(settings, "Updated %s" % ", ".join(settings_form.changed_data) ) changes = [] if settings.get_min_interval_display() != prev_min_interval: @@ -1685,6 +1688,7 @@ def change_reviewer_settings(request, acronym, reviewer_email, group_type=None): if changes: email_reviewer_availability_change(request, group, reviewer_role, "\n\n".join(changes), request.user.person) + return HttpResponseRedirect(back_url) else: settings_form = ReviewerSettingsForm(instance=settings,exclude_fields=exclude_fields) @@ -1785,6 +1789,7 @@ def change_reviewer_settings(request, acronym, reviewer_email, group_type=None): 'settings_form': settings_form, 'period_form': period_form, 'unavailable_periods': unavailable_periods, + 'reviewersettings': settings, }) diff --git a/ietf/review/admin.py b/ietf/review/admin.py index 689b187cb..691cee738 100644 --- a/ietf/review/admin.py +++ b/ietf/review/admin.py @@ -1,9 +1,11 @@ +import simple_history + from django.contrib import admin from ietf.review.models import (ReviewerSettings, ReviewSecretarySettings, UnavailablePeriod, ReviewWish, NextReviewerInTeam, ReviewRequest, ReviewTeamSettings ) -class ReviewerSettingsAdmin(admin.ModelAdmin): +class ReviewerSettingsAdmin(simple_history.admin.SimpleHistoryAdmin): def acronym(self, obj): return obj.team.acronym list_display = ['id', 'person', 'acronym', 'min_interval', 'filter_re', 'remind_days_before_deadline', ] diff --git a/ietf/review/migrations/0006_historicalreviewersettings.py b/ietf/review/migrations/0006_historicalreviewersettings.py new file mode 100644 index 000000000..fe8704405 --- /dev/null +++ b/ietf/review/migrations/0006_historicalreviewersettings.py @@ -0,0 +1,47 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.16 on 2018-11-09 08:31 +from __future__ import unicode_literals + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import ietf.utils.models +import ietf.utils.validators +import simple_history.models + + +class Migration(migrations.Migration): + + dependencies = [ + ('group', '0003_groupfeatures_data'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('person', '0008_auto_20181014_1448'), + ('review', '0005_set_secdir_notify_ad_when'), + ] + + operations = [ + migrations.CreateModel( + name='HistoricalReviewerSettings', + fields=[ + ('id', models.IntegerField(auto_created=True, blank=True, db_index=True, verbose_name='ID')), + ('min_interval', models.IntegerField(blank=True, choices=[(7, b'Once per week'), (14, b'Once per fortnight'), (30, b'Once per month'), (61, b'Once per two months'), (91, b'Once per quarter')], null=True, verbose_name=b'Can review at most')), + ('filter_re', models.CharField(blank=True, help_text=b'Draft names matching this regular expression should not be assigned', max_length=255, validators=[ietf.utils.validators.RegexStringValidator()], verbose_name=b'Filter regexp')), + ('skip_next', models.IntegerField(default=0, verbose_name=b'Skip next assignments')), + ('remind_days_before_deadline', models.IntegerField(blank=True, help_text=b"To get an email reminder in case you forget to do an assigned review, enter the number of days before review deadline you want to receive it. Clear the field if you don't want a reminder.", null=True)), + ('expertise', models.TextField(blank=True, default=b'', help_text=b"Describe the reviewer's expertise in this team's area", max_length=2048, verbose_name=b"Reviewer's expertise in this team's area")), + ('history_id', models.AutoField(primary_key=True, serialize=False)), + ('history_change_reason', models.CharField(max_length=100, null=True)), + ('history_date', models.DateTimeField()), + ('history_type', models.CharField(choices=[('+', 'Created'), ('~', 'Changed'), ('-', 'Deleted')], max_length=1)), + ('history_user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL)), + ('person', ietf.utils.models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to='person.Person')), + ('team', ietf.utils.models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to='group.Group')), + ], + options={ + 'ordering': ('-history_date', '-history_id'), + 'get_latest_by': 'history_date', + 'verbose_name': 'historical reviewer settings', + }, + bases=(simple_history.models.HistoricalChanges, models.Model), + ), + ] diff --git a/ietf/review/models.py b/ietf/review/models.py index f02929ed9..122ed3927 100644 --- a/ietf/review/models.py +++ b/ietf/review/models.py @@ -1,5 +1,7 @@ import datetime +from simple_history.models import HistoricalRecords + from django.db import models from ietf.doc.models import Document @@ -27,6 +29,7 @@ class ReviewerSettings(models.Model): skip_next = models.IntegerField(default=0, verbose_name="Skip next assignments") remind_days_before_deadline = models.IntegerField(null=True, blank=True, help_text="To get an email reminder in case you forget to do an assigned review, enter the number of days before review deadline you want to receive it. Clear the field if you don't want a reminder.") expertise = models.TextField(verbose_name="Reviewer's expertise in this team's area", max_length=2048, blank=True, help_text="Describe the reviewer's expertise in this team's area", default='') + history = HistoricalRecords() def __unicode__(self): return u"{} in {}".format(self.person, self.team) diff --git a/ietf/review/resources.py b/ietf/review/resources.py index 989ca2ad5..6d279c67b 100644 --- a/ietf/review/resources.py +++ b/ietf/review/resources.py @@ -9,7 +9,8 @@ from ietf.api import ToOneField # pyflakes:ignore from ietf.review.models import (ReviewerSettings, ReviewRequest, UnavailablePeriod, ReviewWish, NextReviewerInTeam, - ReviewSecretarySettings, ReviewTeamSettings ) + ReviewSecretarySettings, ReviewTeamSettings, + HistoricalReviewerSettings ) from ietf.person.resources import PersonResource @@ -173,3 +174,33 @@ class ReviewTeamSettingsResource(ModelResource): } api.review.register(ReviewTeamSettingsResource()) + + +from ietf.person.resources import PersonResource +from ietf.group.resources import GroupResource +from ietf.utils.resources import UserResource +class HistoricalReviewerSettingsResource(ModelResource): + team = ToOneField(GroupResource, 'team', null=True) + person = ToOneField(PersonResource, 'person', null=True) + history_user = ToOneField(UserResource, 'history_user', null=True) + class Meta: + queryset = HistoricalReviewerSettings.objects.all() + serializer = api.Serializer() + cache = SimpleCache() + #resource_name = 'historicalreviewersettings' + filtering = { + "id": ALL, + "min_interval": ALL, + "filter_re": ALL, + "skip_next": ALL, + "remind_days_before_deadline": ALL, + "expertise": ALL, + "history_id": ALL, + "history_change_reason": ALL, + "history_date": ALL, + "history_type": ALL, + "team": ALL_WITH_RELATIONS, + "person": ALL_WITH_RELATIONS, + "history_user": ALL_WITH_RELATIONS, + } +api.review.register(HistoricalReviewerSettingsResource()) diff --git a/ietf/templates/group/change_reviewer_settings.html b/ietf/templates/group/change_reviewer_settings.html index cee48d9ea..9f89f393b 100644 --- a/ietf/templates/group/change_reviewer_settings.html +++ b/ietf/templates/group/change_reviewer_settings.html @@ -83,6 +83,24 @@ +

History

+ +
+ + + + + + + {% for h in reviewersettings.history.all %} + + + + + + {% endfor %} +
DateByDescription
{{h.history_date|date}}{{h.history_user.person}}{{h.history_change_reason}}
+

Back