Skip to content

Commit ba29fa9

Browse files
committed
Import IESGHistory as GroupHistory and port meeting views to it
- Legacy-Id: 3301
1 parent be6f266 commit ba29fa9

8 files changed

Lines changed: 127 additions & 15 deletions

File tree

ietf/meeting/proxy.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -498,3 +498,26 @@ def file_loc(self):
498498
return "%s/slides/%s" % (self.meeting_id, self.external_url)
499499
class Meta:
500500
proxy = True
501+
502+
class IESGHistoryProxy(Person):
503+
def from_object(self, base):
504+
for f in base._meta.fields:
505+
setattr(self, f.name, getattr(base, f.name))
506+
return self
507+
508+
#meeting = models.ForeignKey(Meeting, db_column='meeting_num')
509+
def from_role(self, role):
510+
self.from_object(role.email.person)
511+
from redesign.group.proxy import Area
512+
self.area = Area().from_object(role.group)
513+
self.affiliation = "" #role.email.affiliation
514+
return self
515+
#area = models.ForeignKey(Area, db_column='area_acronym_id')
516+
#person = models.ForeignKey(PersonOrOrgInfo, db_column='person_or_org_tag')
517+
@property
518+
def person(self):
519+
return self
520+
#def __str__(self):
521+
# return "IESG%s: %s (%s)" % (self.meeting_id, self.person,self.area)
522+
class Meta:
523+
proxy = True

ietf/meeting/views.py

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -138,11 +138,18 @@ def agenda_infoREDESIGN(num=None):
138138

139139
update = Switches().from_object(meeting)
140140
venue = meeting.meeting_venue
141-
142-
ads = list(IESGHistory.objects.select_related().filter(meeting=int(meeting.number)))
143-
if not ads:
144-
ads = list(IESGHistory.objects.select_related().filter(meeting=int(meeting.number)-1))
145-
ads.sort(key=(lambda item: item.area.area_acronym.acronym))
141+
142+
ads = []
143+
meeting_time = datetime.datetime.combine(meeting.date, datetime.time(0, 0, 0))
144+
from redesign.group.models import Group, find_group_history_active_at
145+
for g in Group.objects.filter(type="area").order_by("acronym"):
146+
history = find_group_history_active_at(g, meeting_time)
147+
if history:
148+
if history.state_id == "active":
149+
ads.extend(IESGHistory().from_role(x) for x in history.rolehistory_set.filter(name="ad"))
150+
else:
151+
if g.state_id == "active":
152+
ads.extend(IESGHistory().from_role(x) for x in g.role_set.filter(name="ad"))
146153

147154
from redesign.doc.models import Document
148155
plenary_agendas = Document.objects.filter(timeslot__meeting=meeting, timeslot__type="plenary", type="agenda").distinct()

ietf/proceedings/admin.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@ class IESGHistoryAdmin(admin.ModelAdmin):
77
list_display = ['meeting', 'area', 'person']
88
list_filter = ['meeting', ]
99
raw_id_fields = ["person", ]
10-
admin.site.register(IESGHistory, IESGHistoryAdmin)
10+
if not settings.USE_DB_REDESIGN_PROXY_CLASSES:
11+
admin.site.register(IESGHistory, IESGHistoryAdmin)
1112

1213
class MeetingAdmin(admin.ModelAdmin):
1314
list_display=('meeting_num', 'start_date', 'city', 'state', 'country', 'time_zone')

ietf/proceedings/models.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -593,7 +593,8 @@ class Meta:
593593
WgMeetingSessionOld = WgMeetingSession
594594
SlideOld = Slide
595595
SwitchesOld = Switches
596-
from ietf.meeting.proxy import MeetingProxy as Meeting, ProceedingProxy as Proceeding, MeetingVenueProxy as MeetingVenue, MeetingTimeProxy as MeetingTime, WgMeetingSessionProxy as WgMeetingSession, SlideProxy as Slide, SwitchesProxy as Switches
596+
IESGHistoryOld = IESGHistory
597+
from ietf.meeting.proxy import MeetingProxy as Meeting, ProceedingProxy as Proceeding, MeetingVenueProxy as MeetingVenue, MeetingTimeProxy as MeetingTime, WgMeetingSessionProxy as WgMeetingSession, SlideProxy as Slide, SwitchesProxy as Switches, IESGHistoryProxy as IESGHistory
597598

598599
# changes done by convert-096.py:changed maxlength to max_length
599600
# removed core

redesign/group/models.py

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,4 +97,18 @@ class RoleHistory(models.Model):
9797
auth = models.CharField(max_length=255, blank=True) # unused?
9898
def __unicode__(self):
9999
return u"%s is %s in %s" % (self.email.get_name(), self.name.name, self.group.acronym)
100-
100+
101+
102+
def find_group_history_active_at(group, time):
103+
"""Return the GroupHistory object active at time, or None if the
104+
group itself was active at the time."""
105+
if group.time <= time:
106+
return None
107+
108+
histories = group.group_history.order_by('-time')
109+
110+
for h in histories:
111+
if h.time <= time:
112+
return h
113+
114+
return None

redesign/importing/import-groups.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -106,8 +106,11 @@
106106
group = Group(acronym=o.area_acronym.acronym)
107107
group.id = o.area_acronym_id # transfer id
108108

109-
if o.last_modified_date:
110-
group.time = datetime.datetime.combine(o.last_modified_date, datetime.time(12, 0, 0))
109+
# we could use last_modified_date for group.time, but in the new
110+
# schema, group.time is supposed to change when the roles change
111+
# too and some of the history logic depends on this, so it's going
112+
# to cause us too much trouble
113+
111114
group.name = o.area_acronym.name
112115
if o.status.status == "Active":
113116
s = state_names["active"]

redesign/importing/import-persons.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,12 @@
5858

5959
get_or_create_email(o, create_fake=False)
6060

61+
# IESGHistory persons
62+
for o in PersonOrOrgInfo.objects.filter(iesghistory__id__gte=1).order_by("pk").distinct():
63+
print "importing IESGHistory person", o.pk, o.first_name.encode('utf-8'), o.last_name.encode('utf-8')
64+
65+
email = get_or_create_email(o, create_fake=False)
66+
6167
# WgMeetingSession persons
6268
for o in PersonOrOrgInfo.objects.filter(wgmeetingsession__pk__gte=1).distinct().order_by("pk").iterator():
6369
print "importing WgMeetingSession persons", o.pk, o.first_name.encode('utf-8'), o.last_name.encode('utf-8')

redesign/importing/import-roles.py

Lines changed: 62 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,15 @@
1818
from redesign.importing.utils import get_or_create_email
1919

2020
from ietf.idtracker.models import IESGLogin, AreaDirector, PersonOrOrgInfo, WGChair, WGEditor, WGSecretary, WGTechAdvisor, ChairsHistory, Role as OldRole, Acronym, IRTFChair
21+
from ietf.proceedings.models import IESGHistory
2122

2223

2324
# assumptions:
2425
# - persons have been imported
2526
# - groups have been imported
2627

2728
# imports IESGLogin, AreaDirector, WGEditor, WGChair, IRTFChair,
28-
# WGSecretary, WGTechAdvisor, NomCom chairs from ChairsHistory,
29+
# WGSecretary, WGTechAdvisor, NomCom chairs from ChairsHistory, IESGHistory
2930

3031
# FIXME: should probably import Role, LegacyWgPassword, LegacyLiaisonUser
3132

@@ -81,15 +82,16 @@
8182
except PersonOrOrgInfo.DoesNotExist:
8283
print "SKIPPING WGChair", acronym, "with invalid person id", o.person_id
8384
continue
84-
85-
if acronym in ("apples", "apptsv", "usac", "null", "dirdir"):
86-
print "SKIPPING WGChair", acronym, o.person
85+
86+
try:
87+
group = Group.objects.get(acronym=acronym)
88+
except Group.DoesNotExist:
89+
print "SKIPPING WGChair", o.person, "with non-existing group", acronym
8790
continue
8891

8992
print "importing WGChair", acronym, o.person
9093

9194
email = get_or_create_email(o, create_fake=True)
92-
group = Group.objects.get(acronym=acronym)
9395

9496
Role.objects.get_or_create(name=chair_role, group=group, email=email)
9597

@@ -170,4 +172,59 @@
170172
else:
171173
Role.objects.get_or_create(name=role_type, group=area, email=email)
172174

175+
# IESGHistory
176+
emails_for_time = {}
177+
for o in IESGHistory.objects.all().order_by('meeting__start_date', 'pk'):
178+
print "importing IESGHistory", o.pk, o.area, o.person, o.meeting
179+
email = get_or_create_email(o, create_fake=False)
180+
if not email:
181+
"SKIPPING IESGHistory with unknown email"
182+
continue
173183

184+
# our job here is to make sure we either have the same AD today or
185+
# got proper GroupHistory and RoleHistory objects in the database;
186+
# there's only incomplete information available in the database so
187+
# the reconstructed history will necessarily not be entirely
188+
# accurate, just good enough to conclude who was AD
189+
area = Group.objects.get(acronym=o.area.area_acronym.acronym, type="area")
190+
meeting_time = datetime.datetime.combine(o.meeting.start_date, datetime.time(0, 0, 0))
191+
192+
key = (area, meeting_time)
193+
if not key in emails_for_time:
194+
emails_for_time[key] = []
195+
196+
emails_for_time[key].append(email)
197+
198+
history = find_group_history_active_at(area, meeting_time)
199+
if (history and history.rolehistory_set.filter(email__person=email.person) or
200+
not history and area.role_set.filter(email__person=email.person)):
201+
continue
202+
203+
if history and history.time == meeting_time:
204+
# add to existing GroupHistory
205+
RoleHistory.objects.create(name=area_director_role, group=history, email=email)
206+
else:
207+
existing = history if history else area
208+
209+
h = GroupHistory(group=area,
210+
charter=existing.charter,
211+
time=meeting_time,
212+
name=existing.name,
213+
acronym=existing.acronym,
214+
state=existing.state,
215+
type=existing.type,
216+
parent=existing.parent,
217+
iesg_state=existing.iesg_state,
218+
ad=existing.ad,
219+
list_email=existing.list_email,
220+
list_subscribe=existing.list_subscribe,
221+
list_archive=existing.list_archive,
222+
comments=existing.comments,
223+
)
224+
h.save()
225+
226+
# we need to add all emails for this area at this time
227+
# because the new GroupHistory resets the known roles
228+
for e in emails_for_time[key]:
229+
RoleHistory.objects.get_or_create(name=area_director_role, group=h, email=e)
230+

0 commit comments

Comments
 (0)