Skip to content

Commit b19f6d8

Browse files
committed
Merge in milestones branch
- Legacy-Id: 5091
2 parents dde89d1 + 3243091 commit b19f6d8

68 files changed

Lines changed: 4204 additions & 692 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

ietf/bin/send-milestone-reminders

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
#!/usr/bin/env python
2+
#
3+
# This script will send various milestone reminders. It's supposed to
4+
# be run daily, and will then send reminders weekly/monthly as
5+
# appropriate.
6+
7+
import datetime, os
8+
import syslog
9+
10+
from ietf import settings
11+
from django.core import management
12+
management.setup_environ(settings)
13+
14+
syslog.openlog(os.path.basename(__file__), syslog.LOG_PID, syslog.LOG_LOCAL0)
15+
16+
from ietf.wginfo.mails import *
17+
18+
today = datetime.date.today()
19+
20+
MONDAY = 1
21+
FIRST_DAY_OF_MONTH = 1
22+
23+
if today.isoweekday() == MONDAY:
24+
# send milestone review reminders - ideally we'd keep track of
25+
# exactly when we sent one last time for a group, but it's a bit
26+
# complicated because people can change the milestones in the mean
27+
# time, so dodge all of this by simply sending once a week only
28+
for g in groups_with_milestones_needing_review():
29+
mail_sent = email_milestone_review_reminder(g, grace_period=7)
30+
if mail_sent:
31+
syslog.syslog("Sent milestone review reminder for %s %s" % (g.acronym, g.type.name))
32+
33+
34+
early_warning_days = 30
35+
36+
# send any milestones due reminders
37+
for g in groups_needing_milestones_due_reminder(early_warning_days):
38+
email_milestones_due(g, early_warning_days)
39+
syslog.syslog("Sent milestones due reminder for %s %s" % (g.acronym, g.type.name))
40+
41+
if today.day == FIRST_DAY_OF_MONTH:
42+
# send milestone overdue reminders - once a month
43+
for g in groups_needing_milestones_overdue_reminder(grace_period=30):
44+
email_milestones_overdue(g)
45+
syslog.syslog("Sent milestones overdue reminder for %s %s" % (g.acronym, g.type.name))

ietf/doc/models.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -461,6 +461,7 @@ class DocReminder(models.Model):
461461
# WG events
462462
("changed_group", "Changed group"),
463463
("changed_protocol_writeup", "Changed protocol writeup"),
464+
("changed_charter_milestone", "Changed charter milestone"),
464465

465466
# charter events
466467
("initial_review", "Set initial review time"),

ietf/group/admin.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -116,9 +116,9 @@ class GroupHistoryAdmin(admin.ModelAdmin):
116116
admin.site.register(GroupHistory, GroupHistoryAdmin)
117117

118118
class GroupMilestoneAdmin(admin.ModelAdmin):
119-
list_display = ["group", "desc", "expected_due_date", "time"]
120-
search_fields = ["group__name", "group__acronym", "desc"]
121-
raw_id_fields = ["group"]
119+
list_display = ["group", "desc", "due", "resolved", "time"]
120+
search_fields = ["group__name", "group__acronym", "desc", "resolved"]
121+
raw_id_fields = ["group", "docs"]
122122

123123
admin.site.register(GroupMilestone, GroupMilestoneAdmin)
124124

ietf/group/migrations/0001_initial.py

Lines changed: 481 additions & 0 deletions
Large diffs are not rendered by default.

ietf/group/migrations/0002_auto__add_milestonegroupevent__del_field_groupmilestone_expected_due_d.py

Lines changed: 361 additions & 0 deletions
Large diffs are not rendered by default.

ietf/group/migrations/0003_fixup_milestone.py

Lines changed: 331 additions & 0 deletions
Large diffs are not rendered by default.

ietf/group/migrations/0004_auto__del_field_groupmilestone_done_date__del_field_groupmilestone_don.py

Lines changed: 322 additions & 0 deletions
Large diffs are not rendered by default.

ietf/group/migrations/0005_auto__add_groupmilestonehistory.py

Lines changed: 349 additions & 0 deletions
Large diffs are not rendered by default.

ietf/group/migrations/__init__.py

Whitespace-only changes.

ietf/group/models.py

Lines changed: 25 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -60,17 +60,31 @@ class GroupURL(models.Model):
6060
def __unicode__(self):
6161
return u"%s (%s)" % (self.url, self.name)
6262

63-
class GroupMilestone(models.Model):
63+
class GroupMilestoneInfo(models.Model):
6464
group = models.ForeignKey(Group)
65-
desc = models.TextField(verbose_name="Description")
66-
expected_due_date = models.DateField()
67-
done = models.BooleanField()
68-
done_date = models.DateField(null=True, blank=True)
69-
time = models.DateTimeField(auto_now=True)
65+
# a group has two sets of milestones, current milestones
66+
# (active/under review/deleted) and charter milestones (active
67+
# during a charter/recharter event), events for charter milestones
68+
# are stored on the charter document
69+
state = models.ForeignKey(GroupMilestoneStateName)
70+
desc = models.CharField(verbose_name="Description", max_length=500)
71+
due = models.DateField()
72+
resolved = models.CharField(max_length=50, blank=True, help_text="Explanation of why milestone is resolved (usually \"Done\"), or empty if still due")
73+
74+
docs = models.ManyToManyField('doc.Document', blank=True)
75+
7076
def __unicode__(self):
7177
return self.desc[:20] + "..."
7278
class Meta:
73-
ordering = ['expected_due_date']
79+
abstract = True
80+
ordering = ['due', 'id']
81+
82+
class GroupMilestone(GroupMilestoneInfo):
83+
time = models.DateTimeField(auto_now=True)
84+
85+
class GroupMilestoneHistory(GroupMilestoneInfo):
86+
time = models.DateTimeField()
87+
milestone = models.ForeignKey(GroupMilestone, related_name="history_set")
7488

7589
class GroupStateTransitions(models.Model):
7690
"""Captures that a group has overriden the default available
@@ -87,6 +101,7 @@ def __unicode__(self):
87101
("added_comment", "Added comment"),
88102
("info_changed", "Changed metadata"),
89103
("requested_close", "Requested closing group"),
104+
("changed_milestone", "Changed milestone"),
90105
]
91106

92107
class GroupEvent(models.Model):
@@ -106,6 +121,9 @@ class Meta:
106121
class ChangeStateGroupEvent(GroupEvent):
107122
state = models.ForeignKey(GroupStateName)
108123

124+
class MilestoneGroupEvent(GroupEvent):
125+
milestone = models.ForeignKey(GroupMilestone)
126+
109127
class Role(models.Model):
110128
name = models.ForeignKey(RoleName)
111129
group = models.ForeignKey(Group)

0 commit comments

Comments
 (0)