Skip to content

Commit cb70724

Browse files
committed
Add history to ReviewerSettings. Fixes ietf-tools#2147. Commit ready for merge.
- Legacy-Id: 15804
1 parent f69ad28 commit cb70724

6 files changed

Lines changed: 108 additions & 2 deletions

File tree

ietf/group/views.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
import datetime
4141
from tempfile import mkstemp
4242
from collections import OrderedDict, defaultdict
43+
from simple_history.utils import update_change_reason
4344

4445
from django import forms
4546
from django.conf import settings
@@ -1675,6 +1676,8 @@ def change_reviewer_settings(request, acronym, reviewer_email, group_type=None):
16751676
settings_form = ReviewerSettingsForm(request.POST, instance=settings, exclude_fields=exclude_fields)
16761677
if settings_form.is_valid():
16771678
settings = settings_form.save()
1679+
if settings_form.has_changed():
1680+
update_change_reason(settings, "Updated %s" % ", ".join(settings_form.changed_data) )
16781681

16791682
changes = []
16801683
if settings.get_min_interval_display() != prev_min_interval:
@@ -1685,6 +1688,7 @@ def change_reviewer_settings(request, acronym, reviewer_email, group_type=None):
16851688
if changes:
16861689
email_reviewer_availability_change(request, group, reviewer_role, "\n\n".join(changes), request.user.person)
16871690

1691+
16881692
return HttpResponseRedirect(back_url)
16891693
else:
16901694
settings_form = ReviewerSettingsForm(instance=settings,exclude_fields=exclude_fields)
@@ -1785,6 +1789,7 @@ def change_reviewer_settings(request, acronym, reviewer_email, group_type=None):
17851789
'settings_form': settings_form,
17861790
'period_form': period_form,
17871791
'unavailable_periods': unavailable_periods,
1792+
'reviewersettings': settings,
17881793
})
17891794

17901795

ietf/review/admin.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
1+
import simple_history
2+
13
from django.contrib import admin
24

35
from ietf.review.models import (ReviewerSettings, ReviewSecretarySettings, UnavailablePeriod,
46
ReviewWish, NextReviewerInTeam, ReviewRequest, ReviewTeamSettings )
57

6-
class ReviewerSettingsAdmin(admin.ModelAdmin):
8+
class ReviewerSettingsAdmin(simple_history.admin.SimpleHistoryAdmin):
79
def acronym(self, obj):
810
return obj.team.acronym
911
list_display = ['id', 'person', 'acronym', 'min_interval', 'filter_re', 'remind_days_before_deadline', ]
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
# -*- coding: utf-8 -*-
2+
# Generated by Django 1.11.16 on 2018-11-09 08:31
3+
from __future__ import unicode_literals
4+
5+
from django.conf import settings
6+
from django.db import migrations, models
7+
import django.db.models.deletion
8+
import ietf.utils.models
9+
import ietf.utils.validators
10+
import simple_history.models
11+
12+
13+
class Migration(migrations.Migration):
14+
15+
dependencies = [
16+
('group', '0003_groupfeatures_data'),
17+
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
18+
('person', '0008_auto_20181014_1448'),
19+
('review', '0005_set_secdir_notify_ad_when'),
20+
]
21+
22+
operations = [
23+
migrations.CreateModel(
24+
name='HistoricalReviewerSettings',
25+
fields=[
26+
('id', models.IntegerField(auto_created=True, blank=True, db_index=True, verbose_name='ID')),
27+
('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')),
28+
('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')),
29+
('skip_next', models.IntegerField(default=0, verbose_name=b'Skip next assignments')),
30+
('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)),
31+
('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")),
32+
('history_id', models.AutoField(primary_key=True, serialize=False)),
33+
('history_change_reason', models.CharField(max_length=100, null=True)),
34+
('history_date', models.DateTimeField()),
35+
('history_type', models.CharField(choices=[('+', 'Created'), ('~', 'Changed'), ('-', 'Deleted')], max_length=1)),
36+
('history_user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL)),
37+
('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')),
38+
('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')),
39+
],
40+
options={
41+
'ordering': ('-history_date', '-history_id'),
42+
'get_latest_by': 'history_date',
43+
'verbose_name': 'historical reviewer settings',
44+
},
45+
bases=(simple_history.models.HistoricalChanges, models.Model),
46+
),
47+
]

ietf/review/models.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
import datetime
22

3+
from simple_history.models import HistoricalRecords
4+
35
from django.db import models
46

57
from ietf.doc.models import Document
@@ -27,6 +29,7 @@ class ReviewerSettings(models.Model):
2729
skip_next = models.IntegerField(default=0, verbose_name="Skip next assignments")
2830
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.")
2931
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='')
32+
history = HistoricalRecords()
3033

3134
def __unicode__(self):
3235
return u"{} in {}".format(self.person, self.team)

ietf/review/resources.py

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@
99

1010
from ietf.review.models import (ReviewerSettings, ReviewRequest,
1111
UnavailablePeriod, ReviewWish, NextReviewerInTeam,
12-
ReviewSecretarySettings, ReviewTeamSettings )
12+
ReviewSecretarySettings, ReviewTeamSettings,
13+
HistoricalReviewerSettings )
1314

1415

1516
from ietf.person.resources import PersonResource
@@ -173,3 +174,33 @@ class Meta:
173174
}
174175
api.review.register(ReviewTeamSettingsResource())
175176

177+
178+
179+
from ietf.person.resources import PersonResource
180+
from ietf.group.resources import GroupResource
181+
from ietf.utils.resources import UserResource
182+
class HistoricalReviewerSettingsResource(ModelResource):
183+
team = ToOneField(GroupResource, 'team', null=True)
184+
person = ToOneField(PersonResource, 'person', null=True)
185+
history_user = ToOneField(UserResource, 'history_user', null=True)
186+
class Meta:
187+
queryset = HistoricalReviewerSettings.objects.all()
188+
serializer = api.Serializer()
189+
cache = SimpleCache()
190+
#resource_name = 'historicalreviewersettings'
191+
filtering = {
192+
"id": ALL,
193+
"min_interval": ALL,
194+
"filter_re": ALL,
195+
"skip_next": ALL,
196+
"remind_days_before_deadline": ALL,
197+
"expertise": ALL,
198+
"history_id": ALL,
199+
"history_change_reason": ALL,
200+
"history_date": ALL,
201+
"history_type": ALL,
202+
"team": ALL_WITH_RELATIONS,
203+
"person": ALL_WITH_RELATIONS,
204+
"history_user": ALL_WITH_RELATIONS,
205+
}
206+
api.review.register(HistoricalReviewerSettingsResource())

ietf/templates/group/change_reviewer_settings.html

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,24 @@ <h4>Add a new period</h4>
8383
</form>
8484
</div>
8585

86+
<h3>History</h3>
87+
88+
<div id="history">
89+
<table class="table table-condensed table-striped">
90+
<tr>
91+
<th class="col-md-1">Date</th>
92+
<th class="col-md-1">By</th>
93+
<th class="col-md-10">Description</th>
94+
</tr>
95+
{% for h in reviewersettings.history.all %}
96+
<tr>
97+
<td>{{h.history_date|date}}</td>
98+
<td>{{h.history_user.person}}</td>
99+
<td>{{h.history_change_reason}}</td>
100+
</tr>
101+
{% endfor %}
102+
</table>
103+
</div>
86104
<p style="padding-top: 2em;">
87105
<a href="{{ back_url }}" class="btn btn-default">Back</a>
88106
</p>

0 commit comments

Comments
 (0)