Skip to content

Commit 8762d77

Browse files
committed
Import NomCom groups, and start/end events for groups
- Legacy-Id: 3060
1 parent bb2e2b1 commit 8762d77

3 files changed

Lines changed: 110 additions & 9 deletions

File tree

redesign/group/models.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
from redesign.name.models import *
55
from redesign.person.models import Email
66

7+
import datetime
8+
79
class Group(models.Model):
810
name = models.CharField(max_length=80)
911
acronym = models.CharField(max_length=16, db_index=True)
@@ -16,6 +18,31 @@ class Group(models.Model):
1618
comments = models.TextField(blank=True)
1719
def __unicode__(self):
1820
return self.name
21+
def latest_event(self, *args, **filter_args):
22+
"""Get latest group event with filter arguments, e.g.
23+
d.latest_event(type="xyz")."""
24+
e = GroupEvent.objects.filter(group=self).filter(**filter_args).order_by('-time', '-id')[:1]
25+
return e[0] if e else None
26+
27+
28+
GROUP_EVENT_CHOICES = [("proposed", "Proposed group"),
29+
("started", "Started group"),
30+
("concluded", "Concluded group"),
31+
]
32+
33+
class GroupEvent(models.Model):
34+
"""An occurrence for a group, used for tracking who, when and what."""
35+
group = models.ForeignKey(Group)
36+
time = models.DateTimeField(default=datetime.datetime.now, help_text="When the event happened")
37+
type = models.CharField(max_length=50, choices=GROUP_EVENT_CHOICES)
38+
by = models.ForeignKey(Email)
39+
desc = models.TextField()
40+
41+
def __unicode__(self):
42+
return u"%s %s at %s" % (self.by.get_name(), self.get_type_display().lower(), self.time)
43+
44+
class Meta:
45+
ordering = ['-time', 'id']
1946

2047
# This will actually be extended from Groups, but that requires Django 1.0
2148
# This will record the new state and the date it occurred for any changes

redesign/import-groups.py

Lines changed: 65 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,12 @@
1414

1515
from redesign.group.models import *
1616
from redesign.name.models import *
17-
from ietf.idtracker.models import AreaGroup, IETFWG, Area, AreaGroup, Acronym, AreaWGURL, IRTF
17+
from ietf.idtracker.models import AreaGroup, IETFWG, Area, AreaGroup, Acronym, AreaWGURL, IRTF, ChairsHistory, Role
1818

1919
# imports IETFWG, Area, AreaGroup, Acronym
2020

21+
# also creates nomcom groups
22+
2123
# FIXME: should also import IRTF
2224

2325
# make sure we got the names
@@ -54,7 +56,38 @@ def name(name_class, slug, name, desc=""):
5456
iesg_group.type = type_names["ietf"]
5557
iesg_group.save()
5658

59+
system_email, _ = Email.objects.get_or_create(address="(System)")
60+
61+
62+
# NomCom
63+
Group.objects.filter(acronym="nomcom").delete()
64+
65+
for o in ChairsHistory.objects.filter(chair_type=Role.NOMCOM_CHAIR).order_by("start_year"):
66+
group = Group()
67+
group.acronym = "nomcom"
68+
group.name = "IAB/IESG Nominating Committee %s/%s" % (o.start_year, o.end_year)
69+
if o.chair_type.person == o.person:
70+
s = state_names["active"]
71+
else:
72+
s = state_names["conclude"]
73+
group.state = s
74+
group.type = type_names["ietf"]
75+
group.parent = None
76+
group.save()
5777

78+
# we need start/end year so fudge events
79+
e = GroupEvent(group=group, type="started")
80+
e.time = datetime.datetime(o.start_year, 5, 1, 12, 0, 0)
81+
e.by = system_email
82+
e.desc = e.get_type_display()
83+
e.save()
84+
85+
e = GroupEvent(group=group, type="concluded")
86+
e.time = datetime.datetime(o.end_year, 5, 1, 12, 0, 0)
87+
e.by = system_email
88+
e.desc = e.get_type_display()
89+
e.save()
90+
5891
# Area
5992
for o in Area.objects.all():
6093
group, _ = Group.objects.get_or_create(acronym=o.area_acronym.acronym)
@@ -70,9 +103,20 @@ def name(name_class, slug, name, desc=""):
70103
group.parent = iesg_group
71104
group.comments = o.comments.strip() if o.comments else ""
72105

73-
# FIXME: missing fields from old: concluded_date, last_modified_date, extra_email_addresses
74-
75106
group.save()
107+
108+
# import events
109+
group.groupevent_set.all().delete()
110+
111+
if o.concluded_date:
112+
e = GroupEvent(group=group, type="concluded")
113+
e.time = datetime.datetime.combine(o.concluded_date, datetime.time(12, 0, 0))
114+
e.by = system_email
115+
e.desc = e.get_type_display()
116+
e.save()
117+
118+
# FIXME: missing fields from old: last_modified_date, extra_email_addresses
119+
76120

77121
# IETFWG, AreaGroup
78122
for o in IETFWG.objects.all():
@@ -129,8 +173,24 @@ def name(name_class, slug, name, desc=""):
129173

130174
group.list_email = o.email_address if o.email_address else ""
131175
group.comments = o.comments.strip() if o.comments else ""
132-
# FIXME: missing fields from old: proposed_date, start_date, dormant_date, concluded_date, meeting_scheduled, email_subscribe, email_keyword, email_archive, last_modified_date, meeting_scheduled_old
133176

134177
group.save()
135178

136-
# FIXME: IRTF
179+
# import events
180+
group.groupevent_set.all().delete()
181+
182+
def import_date_event(name):
183+
d = getattr(o, "%s_date" % name)
184+
if d:
185+
e = GroupEvent(group=group, type=name)
186+
e.time = datetime.datetime.combine(d, datetime.time(12, 0, 0))
187+
e.by = system_email
188+
e.desc = e.get_type_display()
189+
e.save()
190+
191+
import_date_event("proposed")
192+
import_date_event("start")
193+
import_date_event("concluded")
194+
# dormant_date is empty on all so don't bother with that
195+
196+
# FIXME: missing fields from old: meeting_scheduled, email_subscribe, email_keyword, email_archive, last_modified_date, meeting_scheduled_old

redesign/import-roles.py

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,18 +15,19 @@
1515
from redesign.person.models import *
1616
from redesign.group.models import *
1717
from redesign.name.models import *
18-
from ietf.idtracker.models import IESGLogin, AreaDirector, IDAuthor, PersonOrOrgInfo, WGEditor
18+
from ietf.idtracker.models import IESGLogin, AreaDirector, IDAuthor, PersonOrOrgInfo, WGEditor, ChairsHistory, Role as OldRole
1919

2020
# assumptions:
2121
# - groups have been imported
2222

2323
# PersonOrOrgInfo/PostalAddress/EmailAddress/PhoneNumber are not
2424
# imported, although some information is retrieved from those
2525

26-
# imports IESGLogin, AreaDirector, WGEditor and persons from IDAuthor
26+
# imports IESGLogin, AreaDirector, WGEditor, persons from IDAuthor,
27+
# NomCom chairs from ChairsHistory
2728

2829
# should probably import WGChair, WGSecretary,
29-
# WGTechAdvisor, Role, ChairsHistory, IRTFChair
30+
# WGTechAdvisor, Role, IRTFChair
3031

3132
# make sure names exist
3233
def name(name_class, slug, name, desc=""):
@@ -38,8 +39,9 @@ def name(name_class, slug, name, desc=""):
3839
return obj
3940

4041
area_director_role = name(RoleName, "ad", "Area Director")
41-
inactive_area_director_role = name(RoleName, "ex-ad", "Ex-Area Director", desc="In-active Area Director")
42+
inactive_area_director_role = name(RoleName, "ex-ad", "Ex-Area Director", desc="Inactive Area Director")
4243
wg_editor_role = name(RoleName, "wgeditor", "Working Group Editor")
44+
chair_role = name(RoleName, "chair", "Chair")
4345

4446
# helpers for creating the objects
4547
def get_or_create_email(o, create_fake):
@@ -73,6 +75,18 @@ def get_or_create_email(o, create_fake):
7375

7476
return e
7577

78+
nomcom_groups = list(Group.objects.filter(acronym="nomcom"))
79+
for o in ChairsHistory.objects.filter(chair_type=OldRole.NOMCOM_CHAIR):
80+
print "importing NOMCOM chair", o
81+
for g in nomcom_groups:
82+
if ("%s/%s" % (o.start_year, o.end_year)) in g.name:
83+
break
84+
85+
email = get_or_create_email(o, create_fake=False)
86+
87+
Role.objects.get_or_create(name=chair_role, group=g, email=email)
88+
89+
7690
# IESGLogin
7791
for o in IESGLogin.objects.all():
7892
print "importing IESGLogin", o.id, o.first_name, o.last_name

0 commit comments

Comments
 (0)