Skip to content

Commit 6e89f3b

Browse files
committed
Merge changes from old milestones branch
- Legacy-Id: 5198
2 parents 1fbcd78 + bbe5102 commit 6e89f3b

68 files changed

Lines changed: 4258 additions & 675 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
@@ -465,6 +465,7 @@ class DocReminder(models.Model):
465465
# WG events
466466
("changed_group", "Changed group"),
467467
("changed_protocol_writeup", "Changed protocol writeup"),
468+
("changed_charter_milestone", "Changed charter milestone"),
468469

469470
# charter events
470471
("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
@@ -66,17 +66,31 @@ class GroupURL(models.Model):
6666
def __unicode__(self):
6767
return u"%s (%s)" % (self.url, self.name)
6868

69-
class GroupMilestone(models.Model):
69+
class GroupMilestoneInfo(models.Model):
7070
group = models.ForeignKey(Group)
71-
desc = models.TextField(verbose_name="Description")
72-
expected_due_date = models.DateField()
73-
done = models.BooleanField()
74-
done_date = models.DateField(null=True, blank=True)
75-
time = models.DateTimeField(auto_now=True)
71+
# a group has two sets of milestones, current milestones
72+
# (active/under review/deleted) and charter milestones (active
73+
# during a charter/recharter event), events for charter milestones
74+
# are stored on the charter document
75+
state = models.ForeignKey(GroupMilestoneStateName)
76+
desc = models.CharField(verbose_name="Description", max_length=500)
77+
due = models.DateField()
78+
resolved = models.CharField(max_length=50, blank=True, help_text="Explanation of why milestone is resolved (usually \"Done\"), or empty if still due")
79+
80+
docs = models.ManyToManyField('doc.Document', blank=True)
81+
7682
def __unicode__(self):
7783
return self.desc[:20] + "..."
7884
class Meta:
79-
ordering = ['expected_due_date']
85+
abstract = True
86+
ordering = ['due', 'id']
87+
88+
class GroupMilestone(GroupMilestoneInfo):
89+
time = models.DateTimeField(auto_now=True)
90+
91+
class GroupMilestoneHistory(GroupMilestoneInfo):
92+
time = models.DateTimeField()
93+
milestone = models.ForeignKey(GroupMilestone, related_name="history_set")
8094

8195
class GroupStateTransitions(models.Model):
8296
"""Captures that a group has overriden the default available
@@ -93,6 +107,7 @@ def __unicode__(self):
93107
("added_comment", "Added comment"),
94108
("info_changed", "Changed metadata"),
95109
("requested_close", "Requested closing group"),
110+
("changed_milestone", "Changed milestone"),
96111
]
97112

98113
class GroupEvent(models.Model):
@@ -112,6 +127,9 @@ class Meta:
112127
class ChangeStateGroupEvent(GroupEvent):
113128
state = models.ForeignKey(GroupStateName)
114129

130+
class MilestoneGroupEvent(GroupEvent):
131+
milestone = models.ForeignKey(GroupMilestone)
132+
115133
class Role(models.Model):
116134
name = models.ForeignKey(RoleName)
117135
group = models.ForeignKey(Group)

0 commit comments

Comments
 (0)