Add person foreign key on Role to link the role and person directly instead of through Email, this will allow us to use non-personal emails on roles

- Legacy-Id: 3418
This commit is contained in:
Ole Laursen 2011-09-14 14:01:17 +00:00
parent 7f5fd62a3d
commit 5c5d534104
26 changed files with 109 additions and 88 deletions

View file

@ -52,7 +52,7 @@ def nomcomREDESIGN(request):
e = n.latest_event(type="concluded")
n.end_year = e.time.year if e else ""
chair = n.role_set.get(name="chair").email
chair = n.role_set.get(name="chair").person
announcements = Message.objects.filter(related_groups=n).order_by('-time')
for a in announcements:
a.to_name = address_re.sub("", a.to)

View file

@ -710,7 +710,7 @@ class BallotWrapper:
return
from redesign.person.models import Person
active_ads = Person.objects.filter(email__role__name="ad", email__role__group__state="active").distinct()
active_ads = Person.objects.filter(role__name="ad", role__group__state="active").distinct()
positions = []
seen = {}

View file

@ -313,7 +313,7 @@ def generate_approval_mail_approved(request, doc):
made_by = "This document is the product of the %s." % doc.group.name_with_wg
director = doc.ad
other_director = Person.objects.filter(email__role__group__role__email__person=director, email__role__group__role__name="ad").exclude(pk=director.pk)
other_director = Person.objects.filter(role__group__role__person=director, role__group__role__name="ad").exclude(pk=director.pk)
if doc.group.type_id != "individ" and other_director:
contacts = "The IESG contact persons are %s and %s." % (director.name, other_director[0].name)
@ -497,7 +497,7 @@ def generate_issue_ballot_mailREDESIGN(request, doc):
full_status = full_intended_status(doc.intended_std_level.name)
status = full_status.replace("a ", "").replace("an ", "")
active_ads = Person.objects.filter(email__role__name="ad", email__role__group__state="active").distinct()
active_ads = Person.objects.filter(role__name="ad", role__group__state="active").distinct()
e = doc.latest_event(type="started_iesg_process")
positions = BallotPositionDocEvent.objects.filter(doc=doc, type="changed_ballot_position", time__gte=e.time).order_by("-time", '-id').select_related('ad')

View file

@ -382,7 +382,7 @@ class EditInfoFormREDESIGN(forms.Form):
intended_std_level = forms.ModelChoiceField(IntendedStdLevelName.objects.all(), empty_label=None, required=True)
status_date = forms.DateField(required=False, help_text="Format is YYYY-MM-DD")
via_rfc_editor = forms.BooleanField(required=False, label="Via IRTF or RFC Editor")
ad = forms.ModelChoiceField(Person.objects.filter(email__role__name="ad", email__role__group__state="active").order_by('name'), label="Responsible AD", empty_label=None, required=True)
ad = forms.ModelChoiceField(Person.objects.filter(role__name="ad", role__group__state="active").order_by('name'), label="Responsible AD", empty_label=None, required=True)
create_in_state = forms.ModelChoiceField(IesgDocStateName.objects.filter(slug__in=("pub-req", "watching")), empty_label=None, required=True)
notify = forms.CharField(max_length=255, label="Notice emails", help_text="Separate email addresses with commas", required=False)
note = forms.CharField(widget=forms.Textarea, label="IESG note", required=False)

View file

@ -298,9 +298,9 @@ if settings.USE_DB_REDESIGN_PROXY_CLASSES:
def __init__(self, *args, **kwargs):
super(SearchForm, self).__init__(*args, **kwargs)
responsible = Document.objects.values_list('ad', flat=True).distinct()
active_ads = list(Person.objects.filter(email__role__name="ad",
email__role__group__type="area",
email__role__group__state="active").distinct())
active_ads = list(Person.objects.filter(role__name="ad",
role__group__type="area",
role__group__state="active").distinct())
inactive_ads = list(Person.objects.filter(pk__in=responsible)
.exclude(pk__in=[x.pk for x in active_ads]))
extract_last_name = lambda x: x.name_parts()[3]
@ -382,8 +382,8 @@ if settings.USE_DB_REDESIGN_PROXY_CLASSES:
docs = docs.filter(group__acronym=query["group"])
elif by == "area":
docs = docs.filter(Q(group__parent=query["area"]) |
Q(ad__email__role__name="ad",
ad__email__role__group=query["area"]))
Q(ad__role__name="ad",
ad__role__group=query["area"]))
elif by == "ad":
docs = docs.filter(ad=query["ad"])
elif by == "state":
@ -571,9 +571,9 @@ def by_ad(request, name):
ad_name = None
if settings.USE_DB_REDESIGN_PROXY_CLASSES:
responsible = Document.objects.values_list('ad', flat=True).distinct()
for p in Person.objects.filter(Q(email__role__name="ad",
email__role__group__type="area",
email__role__group__state="active")
for p in Person.objects.filter(Q(role__name="ad",
role__group__type="area",
role__group__state="active")
| Q(pk__in=responsible)):
if name == p.name.lower().replace(" ", "."):
ad_id = p.id

View file

@ -1060,6 +1060,7 @@ class Role(models.Model):
IAB_EXCUTIVE_DIRECTOR = 4
IRTF_CHAIR = 5
IAD_CHAIR = 6
RSOC_CHAIR = 7
# This __str__ makes it odd to use as a ForeignKey.
def __str__(self):

View file

@ -84,8 +84,8 @@ def has_role(user, role_names):
return False
role_qs = {
"Area Director": Q(email__person=person, name="ad", group__state="active"),
"Secretariat": Q(email__person=person, name="secr", group__acronym="secretariat")
"Area Director": Q(person=person, name="ad", group__type="area", group__state="active"),
"Secretariat": Q(person=person, name="secr", group__acronym="secretariat")
}
filter_expr = Q()
@ -108,4 +108,5 @@ def role_required(*role_names):
return decorate
if settings.USE_DB_REDESIGN_PROXY_CLASSES:
# overwrite group_required
group_required = lambda *group_names: role_required(*[n.replace("Area_Director", "Area Director") for n in group_names])

View file

@ -77,7 +77,7 @@ def profile(request):
person = None
try:
person = request.user.get_profile()
roles = Role.objects.filter(email__person=person).distinct()
roles = Role.objects.filter(person=person)
except Person.DoesNotExist:
pass

View file

@ -21,14 +21,14 @@ def is_wgchair(person):
return bool(person.wgchair_set.all())
def is_wgchairREDESIGN(person):
return bool(Role.objects.filter(name="chair", group__type="wg", group__state="active", email__person=person))
return bool(Role.objects.filter(name="chair", group__type="wg", group__state="active", person=person))
def is_wgdelegate(person):
return bool(person.wgdelegate_set.all())
def is_delegateREDESIGN(person):
return bool(Role.objects.filter(name="delegate", group__type="wg", group__state="active", email__person=person))
return bool(Role.objects.filter(name="delegate", group__type="wg", group__state="active", person=person))
def is_chair_of_draft(user, draft):
@ -47,7 +47,7 @@ def is_chair_of_draftREDESIGN(user, draft):
if not user.is_authenticated() or not user.get_profile() or not draft.group:
return False
return bool(Role.objects.filter(name="chair", group=draft.group, email__person=user.get_profile()))
return bool(Role.objects.filter(name="chair", group=draft.group, person=user.get_profile()))
if settings.USE_DB_REDESIGN_PROXY_CLASSES:
from ietf.wgchairs.accounts import is_secretariat, get_person_for_user

View file

@ -43,27 +43,27 @@ def get_person_for_user(user):
def is_areadirector(person):
return bool(Role.objects.filter(email__person=person, name="ad", group__state="active", group__type="area"))
return bool(Role.objects.filter(person=person, name="ad", group__state="active", group__type="area"))
def is_wgchair(person):
return bool(Role.objects.filter(email__person=person, name="chair", group__state="active", group__type="wg"))
return bool(Role.objects.filter(person=person, name="chair", group__state="active", group__type="wg"))
def is_wgsecretary(person):
return bool(Role.objects.filter(email__person=person, name="sec", group__state="active", group__type="wg"))
return bool(Role.objects.filter(person=person, name="sec", group__state="active", group__type="wg"))
def is_ietfchair(person):
return bool(Role.objects.filter(email__person=person, name="chair", group__acronym="ietf"))
return bool(Role.objects.filter(person=person, name="chair", group__acronym="ietf"))
def is_iabchair(person):
return bool(Role.objects.filter(email__person=person, name="chair", group__acronym="iab"))
return bool(Role.objects.filter(person=person, name="chair", group__acronym="iab"))
def is_iab_executive_director(person):
return bool(Role.objects.filter(email__person=person, name="execdir", group__acronym="iab"))
return bool(Role.objects.filter(person=person, name="execdir", group__acronym="iab"))
def can_add_outgoing_liaison(user):
@ -80,15 +80,15 @@ def can_add_outgoing_liaison(user):
def is_sdo_liaison_manager(person):
return bool(Role.objects.filter(email__person=person, name="liaiman", group__type="sdo"))
return bool(Role.objects.filter(person=person, name="liaiman", group__type="sdo"))
def is_sdo_authorized_individual(person):
return bool(Role.objects.filter(email__person=person, name="auth", group__type="sdo"))
return bool(Role.objects.filter(person=person, name="auth", group__type="sdo"))
def is_secretariat(user):
return user.is_authenticated() and bool(Role.objects.filter(email__person__user=user, name="secr", group__acronym="secretariat"))
return user.is_authenticated() and bool(Role.objects.filter(person__user=user, name="secr", group__acronym="secretariat"))
def can_add_incoming_liaison(user):
@ -109,13 +109,13 @@ def can_add_liaison(user):
def is_sdo_manager_for_outgoing_liaison(person, liaison):
if liaison.from_group and liaison.from_group.type_id == "sdo":
return bool(liaison.from_group.role_set.filter(name="liaiman", email__person=person))
return bool(liaison.from_group.role_set.filter(name="liaiman", person=person))
return False
def is_sdo_manager_for_incoming_liaison(person, liaison):
if liaison.to_group and liaison.to_group.type_id == "sdo":
return bool(liaison.to_group.role_set.filter(name="liaiman", email__person=person))
return bool(liaison.to_group.role_set.filter(name="liaiman", person=person))
return False

View file

@ -307,7 +307,7 @@ class IncomingLiaisonForm(LiaisonForm):
if is_secretariat(self.user):
sdos = Group.objects.filter(type="sdo", state="active")
else:
sdos = Group.objects.filter(type="sdo", state="active", role__email__person=self.person, role__name__in=("liaiman", "auth")).distinct()
sdos = Group.objects.filter(type="sdo", state="active", role__person=self.person, role__name__in=("liaiman", "auth")).distinct()
self.fields['from_field'].choices = [('sdo_%s' % i.pk, i.name) for i in sdos.order_by("name")]
self.fields['from_field'].widget.submitter = unicode(self.person)
@ -316,7 +316,7 @@ class IncomingLiaisonForm(LiaisonForm):
def get_post_only(self):
from_entity = self.get_from_entity()
if is_secretariat(self.user) or Role.objects.filter(email__person=self.person, group=from_entity.obj, name="auth"):
if is_secretariat(self.user) or Role.objects.filter(person=self.person, group=from_entity.obj, name="auth"):
return False
return True
@ -327,7 +327,7 @@ class IncomingLiaisonForm(LiaisonForm):
def liaison_manager_sdos(person):
return Group.objects.filter(type="sdo", state="active", role__email__person=person, role__name="liaiman").distinct()
return Group.objects.filter(type="sdo", state="active", role__person=person, role__name="liaiman").distinct()
class OutgoingLiaisonForm(LiaisonForm):

View file

@ -73,7 +73,7 @@ def send_sdo_reminder(sdo):
subject = 'Request for update of list of authorized individuals'
to_email = manager_role.email.address
name = manager_role.email.get_name()
name = manager_role.person.name
authorized_list = role_persons_with_fixed_email(sdo, "auth")
body = render_to_string('liaisons/sdo_reminder.txt', dict(

View file

@ -47,6 +47,7 @@ def make_liaison_models():
Role.objects.create(
name_id="liaiman",
group=sdo,
person=p,
email=email)
# authorized individual
@ -61,6 +62,7 @@ def make_liaison_models():
Role.objects.create(
name_id="auth",
group=sdo,
person=p,
email=email)
mars_group = Group.objects.get(acronym="mars")

View file

@ -29,10 +29,10 @@ class FakePerson(object):
# fine-grained enough so the form code also has some rules
def all_sdo_managers():
return [proxy_personify_role(r) for r in Role.objects.filter(group__type="sdo", name="liaiman").select_related("email").distinct()]
return [proxy_personify_role(r) for r in Role.objects.filter(group__type="sdo", name="liaiman").select_related("person").distinct()]
def role_persons_with_fixed_email(group, role_name):
return [proxy_personify_role(r) for r in Role.objects.filter(group=group, name=role_name).select_related("email").distinct()]
return [proxy_personify_role(r) for r in Role.objects.filter(group=group, name=role_name).select_related("person").distinct()]
class Entity(object):
@ -139,7 +139,7 @@ class AreaEntity(Entity):
def needs_approval(self, person=None):
# Check if person is an area director
if self.obj.role_set.filter(email__person=person, name="ad"):
if self.obj.role_set.filter(person=person, name="ad"):
return False
return True
@ -177,7 +177,7 @@ class WGEntity(Entity):
def needs_approval(self, person=None):
# Check if person is director of this wg area
if self.obj.parent and self.obj.parent.role_set.filter(email__person=person, name="ad"):
if self.obj.parent and self.obj.parent.role_set.filter(person=person, name="ad"):
return False
return True
@ -202,7 +202,7 @@ class SDOEntity(Entity):
return [p for p in role_persons_with_fixed_email(self.obj, "liaiman") if p != person]
def post_only(self, person, user):
if is_secretariat(user) or self.obj.role_set.filter(email__person=person, name="auth"):
if is_secretariat(user) or self.obj.role_set.filter(person=person, name="auth"):
return False
return True
@ -297,11 +297,11 @@ class AreaEntityManager(EntityManager):
return AreaEntity(name=obj.area_acronym.name, obj=obj)
def can_send_on_behalf(self, person):
query_filter = dict(role__email__person=person, role__name="ad")
query_filter = dict(role__person=person, role__name="ad")
return self.get_managed_list(query_filter)
def can_approve_list(self, person):
query_filter = dict(role__email__person=person, role__name="ad")
query_filter = dict(role__person=person, role__name="ad")
return self.get_managed_list(query_filter)
@ -328,12 +328,12 @@ class WGEntityManager(EntityManager):
return WGEntity(name=obj.group_acronym.name, obj=obj)
def can_send_on_behalf(self, person):
wgs = Group.objects.filter(role__email__person=person, role__name__in=("chair", "secretary")).values_list('pk', flat=True)
wgs = Group.objects.filter(role__person=person, role__name__in=("chair", "secretary")).values_list('pk', flat=True)
query_filter = {'pk__in': wgs}
return self.get_managed_list(query_filter)
def can_approve_list(self, person):
query_filter = dict(parent__role__email__person=person, parent__role__name="ad")
query_filter = dict(parent__role__person=person, parent__role__name="ad")
return self.get_managed_list(query_filter)

View file

@ -11,10 +11,9 @@ from ietf.utils.test_utils import login_testing_unauthorized
from ietf.utils.test_runner import mail_outbox
from ietf.utils.test_data import make_test_data
if settings.USE_DB_REDESIGN_PROXY_CLASSES:
from redesign.person.models import Person, Email
from redesign.group.models import Group, Role
from redesign.doc.models import Document
from redesign.person.models import Person, Email
from redesign.group.models import Group, Role
from redesign.doc.models import Document
class SubmitTestCase(django.test.TestCase):
fixtures = ['names']

View file

@ -5,12 +5,12 @@
<h1>IAB/IESG Nominating Committee</h1>
<h3>Current Committee Chair: <a href="mailto:{{ curr_chair.address }}">{{ curr_chair.get_name }}</a></h3>
<h3>Current Committee Chair: <a href="mailto:{{ curr_chair.email_address }}">{{ curr_chair.name }}</a></h3>
{% for regime in regimes %}
<hr>
<h1>Messages from {{ regime.group.start_year }} - {{ regime.group.end_year }}</h1>
<h4>Committee Chair: <a href="mailto:{{ regime.chair.address }}">{{ regime.chair.get_name }}</a></h4>
<h4>Committee Chair: <a href="mailto:{{ regime.chair.email_address }}">{{ regime.chair.name }}</a></h4>
<table class="ietf-table">
<tr>
<th width="10%">Date</th>

View file

@ -69,6 +69,7 @@ def make_test_data():
Role.objects.create(
name_id="ad",
group=area,
person=p,
email=email)
# create a bunch of ads for swarm tests
@ -86,6 +87,7 @@ def make_test_data():
Role.objects.create(
name_id="ad",
group=area,
person=p,
email=email)
# group chair
@ -101,6 +103,7 @@ def make_test_data():
Role.objects.create(
name_id="chair",
group=group,
person=p,
email=wgchair,
)
@ -117,6 +120,7 @@ def make_test_data():
Role.objects.create(
name_id="delegate",
group=group,
person=p,
email=email,
)
@ -132,6 +136,7 @@ def make_test_data():
Role.objects.create(
name_id="secr",
group=secretariat,
person=p,
email=email,
)

View file

@ -11,7 +11,7 @@ def is_area_director_for_group(person, group):
return bool(group.area.area.areadirector_set.filter(person=person).count())
def is_area_director_for_groupREDESIGN(person, group):
return bool(Role.objects.filter(group=group.parent, email__person=person, name="ad"))
return bool(Role.objects.filter(group=group.parent, person=person, name="ad"))
def is_group_chair(person, group):
@ -20,14 +20,14 @@ def is_group_chair(person, group):
return False
def is_group_chairREDESIGN(person, group):
return bool(Role.objects.filter(group=group, email__person=person, name="chair"))
return bool(Role.objects.filter(group=group, person=person, name="chair"))
def is_group_delegate(person, group):
return bool(group.wgdelegate_set.filter(person=person).count())
def is_group_delegateREDESIGN(person, group):
return bool(Role.objects.filter(group=group, email__person=person, name="delegate"))
return bool(Role.objects.filter(group=group, person=person, name="delegate"))
def get_person_for_user(user):

View file

@ -264,9 +264,9 @@ class AddDelegateForm(RelatedWGForm):
if settings.USE_DB_REDESIGN_PROXY_CLASSES:
created = False
e = Email.objects.get(address=self.cleaned_data.get('email'))
if not Role.objects.filter(name="delegate", group=self.wg, email=e):
if not Role.objects.filter(name="delegate", group=self.wg, person=person, email=e):
delegate, created = Role.objects.get_or_create(
name=RoleName.objects.get(slug="delegate"), group=self.wg, email=e)
name=RoleName.objects.get(slug="delegate"), group=self.wg, person=e.person, email=e)
else:
(delegate, created) = WGDelegate.objects.get_or_create(wg=self.wg,
person=person)

View file

@ -47,10 +47,7 @@ class ProtoWriteUp(models.Model):
if settings.USE_DB_REDESIGN_PROXY_CLASSES:
from redesign.group.models import Role
class WGDelegateProxy(Role):
#person = models.ForeignKey(PersonOrOrgInfo)
@property
def person(self):
return self.email.person
#person = models.ForeignKey(PersonOrOrgInfo) # same name
#wg = models.ForeignKey(IETFWG)
@property
def wg(self):

View file

@ -383,7 +383,7 @@ class InternetDraft(Document):
elif self.ad:
# return area for AD
try:
area = Group.objects.get(role__name="ad", role__email=self.ad, state="active")
area = Group.objects.get(role__name="ad", role__person=self.ad, state="active")
return Area().from_object(area)
except Group.DoesNotExist:
return None
@ -566,7 +566,7 @@ class InternetDraft(Document):
# return remarks
def active_positions(self):
"""Returns a list of dicts, with AD and Position tuples"""
active_ads = Person.objects.filter(email__role__name="ad", email__role__group__state="active")
active_ads = Person.objects.filter(role__name="ad", role__group__state="active")
res = []
def add(ad, pos):
from person.proxy import IESGLogin as IESGLoginProxy

View file

@ -22,10 +22,10 @@ class GroupAdmin(admin.ModelAdmin):
raw_id_fields = ["charter", "parent", "ad"]
def role_list(self, obj):
roles = Role.objects.filter(group=obj).order_by("name", "email__person__name").select_related('email')
roles = Role.objects.filter(group=obj).order_by("name", "person__name").select_related('person')
res = []
for r in roles:
res.append(u'<a href="../../person/person/%s/">%s</a> (<a href="../../group/role/%s/">%s)' % (r.email.person.pk, escape(r.email.person.name), r.pk, r.name.name))
res.append(u'<a href="../../person/person/%s/">%s</a> (<a href="../../group/role/%s/">%s)' % (r.person.pk, escape(r.person.name), r.pk, r.name.name))
return ", ".join(res)
role_list.short_description = "Persons"
role_list.allow_tags = True
@ -98,11 +98,12 @@ admin.site.register(Group, GroupAdmin)
admin.site.register(GroupHistory)
class RoleAdmin(admin.ModelAdmin):
list_display = ["name", "email", "group"]
list_display = ["name", "person", "email", "group"]
list_display_links = ["name"]
search_fields = ["name", "email"]
search_fields = ["name", "person", "email"]
list_filter = ["name"]
ordering = ["id"]
raw_id_fields = ["email", "group"]
raw_id_fields = ["email", "person", "group"]
admin.site.register(Role, RoleAdmin)
admin.site.register(RoleHistory, RoleAdmin)

View file

@ -84,6 +84,7 @@ class GroupEvent(models.Model):
class Role(models.Model):
name = models.ForeignKey(RoleName)
group = models.ForeignKey(Group)
person = models.ForeignKey(Person)
email = models.ForeignKey(Email, help_text="Email address used by person for this role")
def __unicode__(self):
return u"%s is %s in %s" % (self.email.get_name(), self.name.name, self.group.acronym or self.group.name)
@ -96,6 +97,7 @@ class RoleHistory(models.Model):
# GroupHistory instead
name = models.ForeignKey(RoleName)
group = models.ForeignKey(GroupHistory)
person = models.ForeignKey(Person)
email = models.ForeignKey(Email, help_text="Email address used by person for this role")
def __unicode__(self):
return u"%s is %s in %s" % (self.email.get_name(), self.name.name, self.group.acronym)

View file

@ -51,7 +51,7 @@ for o in WGDelegate.objects.all().order_by("pk"):
group = Group.objects.get(acronym=o.wg.group_acronym.acronym)
email = get_or_create_email(o, create_fake=False)
Role.objects.get_or_create(name=delegate_role, group=group, email=email)
Role.objects.get_or_create(name=delegate_role, group=group, person=email.person, email=email)
# SDOAuthorizedIndividual
for o in SDOAuthorizedIndividual.objects.all().order_by("pk"):
@ -60,7 +60,7 @@ for o in SDOAuthorizedIndividual.objects.all().order_by("pk"):
group = Group.objects.get(name=o.sdo.sdo_name, type="sdo")
email = get_or_create_email(o, create_fake=False)
Role.objects.get_or_create(name=authorized_role, group=group, email=email)
Role.objects.get_or_create(name=authorized_role, group=group, person=email.person, email=email)
# LiaisonManagers
for o in LiaisonManagers.objects.all().order_by("pk"):
@ -69,7 +69,7 @@ for o in LiaisonManagers.objects.all().order_by("pk"):
group = Group.objects.get(name=o.sdo.sdo_name, type="sdo")
email = Email.objects.get(address__iexact=o.person.email(priority=o.email_priority)[1])
Role.objects.get_or_create(name=liaison_manager_role, group=group, email=email)
Role.objects.get_or_create(name=liaison_manager_role, group=group, person=email.person, email=email)
# Role
for o in OldRole.objects.all().order_by('pk'):
@ -81,6 +81,9 @@ for o in OldRole.objects.all().order_by('pk'):
print "importing Role", o.id, o.role_name
email = get_or_create_email(o, create_fake=False)
official_email = email
if o.role_name.endswith("Executive Director"):
acronym = acronym[:-(len("Executive Director") + 1)]
role = exec_director_role
@ -88,11 +91,20 @@ for o in OldRole.objects.all().order_by('pk'):
if o.id == OldRole.IAD_CHAIR:
acronym = "ietf"
role = adm_director_role
official_email, _ = Email.objects.get_or_create(address="iad@ietf.org")
if o.id == OldRole.IETF_CHAIR:
official_email, _ = Email.objects.get_or_create(address="chair@ietf.org")
if o.id == OldRole.IAB_CHAIR:
official_email, _ = Email.objects.get_or_create(address="iab-chair@ietf.org")
if o.id == OldRole.RSOC_CHAIR:
official_email, _ = Email.objects.get_or_create(address="rsoc-chair@iab.org")
group = Group.objects.get(acronym=acronym)
email = get_or_create_email(o, create_fake=False)
Role.objects.get_or_create(name=role, group=group, email=email)
Role.objects.get_or_create(name=role, group=group, person=email.person, email=official_email)
# WGEditor
for o in WGEditor.objects.all():
@ -102,7 +114,7 @@ for o in WGEditor.objects.all():
email = get_or_create_email(o, create_fake=True)
group = Group.objects.get(acronym=acronym)
Role.objects.get_or_create(name=editor_role, group=group, email=email)
Role.objects.get_or_create(name=editor_role, group=group, person=email.person, email=email)
# WGSecretary
for o in WGSecretary.objects.all():
@ -112,7 +124,7 @@ for o in WGSecretary.objects.all():
email = get_or_create_email(o, create_fake=True)
group = Group.objects.get(acronym=acronym)
Role.objects.get_or_create(name=secretary_role, group=group, email=email)
Role.objects.get_or_create(name=secretary_role, group=group, person=email.person, email=email)
# WGTechAdvisor
for o in WGTechAdvisor.objects.all():
@ -122,7 +134,7 @@ for o in WGTechAdvisor.objects.all():
email = get_or_create_email(o, create_fake=True)
group = Group.objects.get(acronym=acronym)
Role.objects.get_or_create(name=techadvisor_role, group=group, email=email)
Role.objects.get_or_create(name=techadvisor_role, group=group, person=email.person, email=email)
# WGChair
for o in WGChair.objects.all():
@ -149,7 +161,7 @@ for o in WGChair.objects.all():
email = get_or_create_email(o, create_fake=True)
Role.objects.get_or_create(name=chair_role, group=group, email=email)
Role.objects.get_or_create(name=chair_role, group=group, person=email.person, email=email)
# IRTFChair
for o in IRTFChair.objects.all():
@ -159,9 +171,10 @@ for o in IRTFChair.objects.all():
email = get_or_create_email(o, create_fake=True)
group = Group.objects.get(acronym=acronym)
Role.objects.get_or_create(name=chair_role, group=group, email=email)
Role.objects.get_or_create(name=chair_role, group=group, person=email.person, email=email)
# NomCom chairs
official_email, _ = Email.objects.get_or_create(address="nomcom-chair@ietf.org")
nomcom_groups = list(Group.objects.filter(acronym__startswith="nomcom").exclude(acronym="nomcom"))
for o in ChairsHistory.objects.filter(chair_type=OldRole.NOMCOM_CHAIR):
print "importing NOMCOM chair", o
@ -170,8 +183,8 @@ for o in ChairsHistory.objects.filter(chair_type=OldRole.NOMCOM_CHAIR):
break
email = get_or_create_email(o, create_fake=False)
Role.objects.get_or_create(name=chair_role, group=g, email=email)
Role.objects.get_or_create(name=chair_role, group=g, person=email.person, email=official_email)
# IESGLogin
for o in IESGLogin.objects.all():
@ -188,8 +201,8 @@ for o in IESGLogin.objects.all():
email = get_or_create_email(o, create_fake=False)
# current ADs are imported below
if email and o.user_level == IESGLogin.SECRETARIAT_LEVEL:
if not Role.objects.filter(name=secretary_role, email=email):
Role.objects.create(name=secretary_role, group=Group.objects.get(acronym="secretariat"), email=email)
if not Role.objects.filter(name=secretary_role, person=email.person):
Role.objects.create(name=secretary_role, group=Group.objects.get(acronym="secretariat"), person=email.person, email=email)
# AreaDirector
for o in AreaDirector.objects.all():
@ -209,13 +222,13 @@ for o in AreaDirector.objects.all():
role_type = inactive_area_director_role
r = Role.objects.filter(name__in=(area_director_role, inactive_area_director_role),
email=email)
person=email.person)
if r and r[0].group == "iesg":
r[0].group = area
r[0].name = role_type
r[0].save()
else:
Role.objects.get_or_create(name=role_type, group=area, email=email)
Role.objects.get_or_create(name=role_type, group=area, person=email.person, email=email)
# IESGHistory
emails_for_time = {}
@ -241,13 +254,13 @@ for o in IESGHistory.objects.all().order_by('meeting__start_date', 'pk'):
emails_for_time[key].append(email)
history = find_history_active_at(area, meeting_time)
if (history and history.rolehistory_set.filter(email__person=email.person) or
not history and area.role_set.filter(email__person=email.person)):
if (history and history.rolehistory_set.filter(person=email.person) or
not history and area.role_set.filter(person=email.person)):
continue
if history and history.time == meeting_time:
# add to existing GroupHistory
RoleHistory.objects.create(name=area_director_role, group=history, email=email)
RoleHistory.objects.create(name=area_director_role, group=history, person=email.person, email=email)
else:
existing = history if history else area
@ -271,5 +284,5 @@ for o in IESGHistory.objects.all().order_by('meeting__start_date', 'pk'):
# we need to add all emails for this area at this time
# because the new GroupHistory resets the known roles
for e in emails_for_time[key]:
RoleHistory.objects.get_or_create(name=area_director_role, group=h, email=e)
RoleHistory.objects.get_or_create(name=area_director_role, group=h, person=e.person, email=e)

View file

@ -48,10 +48,10 @@ class IESGLogin(Person):
def __unicode__(self):
return self.name
def is_current_ad(self):
return self in Person.objects.filter(email__role__name="ad", email__role__group__state="active").distinct()
return self in Person.objects.filter(role__name="ad", role__group__state="active").distinct()
@staticmethod
def active_iesg():
return IESGLogin.objects.filter(email__role__name="ad", email__role__group__state="active").distinct().order_by('name')
return IESGLogin.objects.filter(role__name="ad", role__group__state="active").distinct().order_by('name')
class Meta:
proxy = True

View file

@ -3,7 +3,7 @@ from django.db.models.query import QuerySet
def proxy_personify_role(role):
"""Turn role into person with email() method using email from role."""
p = role.email.person
p = role.person
p.email = lambda: (p.name, role.email.address)
return p