Add history to ReviewerSettings. Fixes #2147. Commit ready for merge.

- Legacy-Id: 15804
This commit is contained in:
Robert Sparks 2018-12-03 22:23:01 +00:00
parent f69ad28e4c
commit cb707248e2
6 changed files with 108 additions and 2 deletions

View file

@ -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,
})

View file

@ -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', ]

View file

@ -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),
),
]

View file

@ -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)

View file

@ -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())

View file

@ -83,6 +83,24 @@
</form>
</div>
<h3>History</h3>
<div id="history">
<table class="table table-condensed table-striped">
<tr>
<th class="col-md-1">Date</th>
<th class="col-md-1">By</th>
<th class="col-md-10">Description</th>
</tr>
{% for h in reviewersettings.history.all %}
<tr>
<td>{{h.history_date|date}}</td>
<td>{{h.history_user.person}}</td>
<td>{{h.history_change_reason}}</td>
</tr>
{% endfor %}
</table>
</div>
<p style="padding-top: 2em;">
<a href="{{ back_url }}" class="btn btn-default">Back</a>
</p>