Skip to content

Commit 868427a

Browse files
committed
Merged in [13996] from rcross@amsl.com:
Move Announcement app From addresses out of code and into database table. Fixes ietf-tools#1681. - Legacy-Id: 14006 Note: SVN reference [13996] has been migrated to Git commit d49787a
1 parent 5c66ec2 commit 868427a

7 files changed

Lines changed: 218 additions & 98 deletions

File tree

ietf/message/admin.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
from django.contrib import admin
22

3-
from ietf.message.models import Message, SendQueue
3+
from ietf.message.models import Message, SendQueue, AnnouncementFrom
44

55
class MessageAdmin(admin.ModelAdmin):
66
list_display = ["subject", "by", "time", "groups"]
@@ -19,5 +19,8 @@ class SendQueueAdmin(admin.ModelAdmin):
1919
search_fields = ["message__body"]
2020
raw_id_fields = ["by", "message"]
2121
ordering = ["-time"]
22-
2322
admin.site.register(SendQueue, SendQueueAdmin)
23+
24+
class AnnouncementFromAdmin(admin.ModelAdmin):
25+
list_display = ['name', 'group', 'address', ]
26+
admin.site.register(AnnouncementFrom, AnnouncementFromAdmin)
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
# -*- coding: utf-8 -*-
2+
# Generated by Django 1.10.7 on 2017-07-28 11:36
3+
from __future__ import unicode_literals
4+
5+
from django.db import migrations, models
6+
import django.db.models.deletion
7+
8+
9+
class Migration(migrations.Migration):
10+
11+
dependencies = [
12+
('group', '0011_auto_20170301_0332'),
13+
('name', '0024_merge_20170606_1320'),
14+
('message', '0004_change_msgid_default'),
15+
]
16+
17+
operations = [
18+
migrations.CreateModel(
19+
name='AnnouncementFrom',
20+
fields=[
21+
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
22+
('address', models.EmailField(max_length=254)),
23+
('group', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='group.Group')),
24+
('name', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='name.RoleName')),
25+
],
26+
),
27+
]
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
# -*- coding: utf-8 -*-
2+
# Generated by Django 1.10.7 on 2017-07-05 16:10
3+
from __future__ import unicode_literals
4+
5+
from django.db import migrations
6+
7+
8+
def forwards(apps, schema_editor):
9+
AnnouncementFrom = apps.get_model('message', 'AnnouncementFrom')
10+
Group = apps.get_model('group', 'Group')
11+
RoleName = apps.get_model('name', 'RoleName')
12+
13+
chair = RoleName.objects.get(slug='chair')
14+
admdir = RoleName.objects.get(slug='admdir')
15+
execdir = RoleName.objects.get(slug='execdir')
16+
ceo = RoleName.objects.get(slug='ceo')
17+
secr = RoleName.objects.get(slug='secr')
18+
19+
# IETF Chair
20+
ietf = Group.objects.get(acronym='ietf')
21+
AnnouncementFrom.objects.create(name=chair,group=ietf,address='IETF Chair <chair@ietf.org>')
22+
AnnouncementFrom.objects.create(name=chair,group=ietf,address='The IESG <iesg@ietf.org>')
23+
24+
# IAB Chair
25+
iab = Group.objects.get(acronym='iab')
26+
AnnouncementFrom.objects.create(name=chair,group=iab,address='IAB Chair <iab-chair@ietf.org>')
27+
28+
# IAB Execdir
29+
AnnouncementFrom.objects.create(name=execdir,group=iab,address='IAB Executive Administrative Manager <execd@iab.org>')
30+
AnnouncementFrom.objects.create(name=execdir,group=iab,address='IAB Chair <iab-chair@ietf.org>')
31+
32+
# IAD
33+
AnnouncementFrom.objects.create(name=admdir,group=ietf,address='IETF Administrative Director <iad@ietf.org>')
34+
AnnouncementFrom.objects.create(name=admdir,group=ietf,address='The IETF Trust <ietf-trust@ietf.org>')
35+
AnnouncementFrom.objects.create(name=admdir,group=ietf,address='ISOC CEO <ceo@isoc.org>')
36+
AnnouncementFrom.objects.create(name=admdir,group=ietf,address='IAOC Chair <iaoc-chair@ietf.org>')
37+
38+
# RSOC Chair
39+
rsoc = Group.objects.get(acronym='rsoc')
40+
AnnouncementFrom.objects.create(name=chair,group=rsoc,address='RSOC Chair <rsoc-chair@iab.org>')
41+
42+
# IAOC Chair
43+
iaoc = Group.objects.get(acronym='iaoc')
44+
AnnouncementFrom.objects.create(name=chair,group=iaoc,address='IAOC Chair <iaoc-chair@ietf.org>')
45+
46+
# RSE Chair
47+
rse = Group.objects.get(acronym='rse')
48+
AnnouncementFrom.objects.create(name=chair,group=rse,address='RFC Series Editor <rse@rfc-editor.org>')
49+
50+
# Mentor Chair
51+
mentor = Group.objects.get(acronym='mentor')
52+
AnnouncementFrom.objects.create(name=chair,group=mentor,address='IETF Mentoring Program <mentoring@ietf.org>')
53+
54+
# ISOC CEO
55+
isoc = Group.objects.get(acronym='isoc')
56+
AnnouncementFrom.objects.create(name=ceo,group=isoc,address='ISOC CEO <ceo@isoc.org>')
57+
58+
# ISOC BOARD OF TRUSTEES
59+
isocbot = Group.objects.get(acronym='isocbot')
60+
AnnouncementFrom.objects.create(name=chair,group=isocbot,address='ISOC Board of Trustees <bob.hinden@gmail.com>')
61+
62+
# IETF TRUST
63+
ietftrust = Group.objects.get(acronym='ietf-trust')
64+
AnnouncementFrom.objects.create(name=chair,group=ietftrust,address='The IETF Trust <ietf-trust@ietf.org>')
65+
66+
# Misc
67+
secretariat = Group.objects.get(acronym='secretariat')
68+
AnnouncementFrom.objects.create(name=secr,group=secretariat,address='IETF Secretariat <ietf-secretariat@ietf.org>')
69+
AnnouncementFrom.objects.create(name=secr,group=secretariat,address='IESG Secretary <iesg-secretary@ietf.org>')
70+
AnnouncementFrom.objects.create(name=secr,group=secretariat,address='Internet-Drafts Administrator <internet-drafts@ietf.org>')
71+
AnnouncementFrom.objects.create(name=secr,group=secretariat,address='IETF Agenda <agenda@ietf.org>')
72+
AnnouncementFrom.objects.create(name=secr,group=secretariat,address='IETF Registrar <ietf-registrar@ietf.org>')
73+
AnnouncementFrom.objects.create(name=secr,group=secretariat,address='IETF Executive Director <exec-director@ietf.org>')
74+
75+
def backwards(apps, schema_editor):
76+
AnnouncementFrom = apps.get_model('announcement', "AnnouncementFrom")
77+
AnnouncementFrom.objects.all().delete()
78+
79+
80+
class Migration(migrations.Migration):
81+
82+
dependencies = [
83+
('message', '0005_announcementfrom'),
84+
]
85+
86+
operations = [
87+
migrations.RunPython(forwards, backwards),
88+
]

ietf/message/models.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
from ietf.person.models import Person
99
from ietf.group.models import Group
1010
from ietf.doc.models import Document
11+
from ietf.name.models import RoleName
1112

1213
class Message(models.Model):
1314
time = models.DateTimeField(default=datetime.datetime.now)
@@ -61,3 +62,16 @@ class Meta:
6162

6263
def __unicode__(self):
6364
return u"'%s' %s -> %s (sent at %s)" % (self.message.subject, self.message.frm, self.message.to, self.sent_at or "<not yet>")
65+
66+
67+
class AnnouncementFrom(models.Model):
68+
name = models.ForeignKey(RoleName)
69+
group = models.ForeignKey(Group)
70+
address = models.EmailField()
71+
72+
def __unicode__(self):
73+
return self.address
74+
75+
class Meta:
76+
verbose_name_plural='Announcement From addresses'
77+

ietf/message/resources.py

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
from ietf import api
99

10-
from ietf.message.models import Message, SendQueue, MessageAttachment
10+
from ietf.message.models import Message, SendQueue, MessageAttachment, AnnouncementFrom
1111
from ietf.person.resources import PersonResource
1212
from ietf.group.resources import GroupResource
1313
from ietf.doc.resources import DocumentResource
@@ -76,3 +76,22 @@ class Meta:
7676
}
7777
api.message.register(MessageAttachmentResource())
7878

79+
80+
81+
from ietf.group.resources import GroupResource
82+
from ietf.name.resources import RoleNameResource
83+
class AnnouncementFromResource(ModelResource):
84+
name = ToOneField(RoleNameResource, 'name')
85+
group = ToOneField(GroupResource, 'group')
86+
class Meta:
87+
queryset = AnnouncementFrom.objects.all()
88+
serializer = api.Serializer()
89+
cache = SimpleCache()
90+
#resource_name = 'announcementfrom'
91+
filtering = {
92+
"id": ALL,
93+
"address": ALL,
94+
"name": ALL_WITH_RELATIONS,
95+
"group": ALL_WITH_RELATIONS,
96+
}
97+
api.message.register(AnnouncementFromResource())

ietf/secr/announcement/forms.py

Lines changed: 26 additions & 90 deletions
Original file line numberDiff line numberDiff line change
@@ -2,40 +2,13 @@
22

33
from ietf.group.models import Group, Role
44
from ietf.ietfauth.utils import has_role
5-
from ietf.message.models import Message
6-
from ietf.secr.utils.group import current_nomcom
5+
from ietf.message.models import Message, AnnouncementFrom
76
from ietf.utils.fields import MultiEmailField
87

98
# ---------------------------------------------
109
# Globals
1110
# ---------------------------------------------
1211

13-
ANNOUNCE_FROM_GROUPS = ['ietf','rsoc','iab']
14-
if current_nomcom():
15-
ANNOUNCE_FROM_GROUPS += [ current_nomcom().acronym ]
16-
ANNOUNCE_TO_GROUPS= ['ietf']
17-
18-
# this list isn't currently available as a Role query so it's hardcoded
19-
FROM_LIST = ('IETF Secretariat <ietf-secretariat@ietf.org>',
20-
'IESG Secretary <iesg-secretary@ietf.org>',
21-
'The IESG <iesg@ietf.org>',
22-
'Internet-Drafts Administrator <internet-drafts@ietf.org>',
23-
'IETF Agenda <agenda@ietf.org>',
24-
'IETF Chair <chair@ietf.org>',
25-
'IAB Chair <iab-chair@ietf.org> ',
26-
'NomCom Chair <nomcom-chair@ietf.org>',
27-
'IETF Registrar <ietf-registrar@ietf.org>',
28-
'IETF Administrative Director <iad@ietf.org>',
29-
'IETF Executive Director <exec-director@ietf.org>',
30-
'IAOC Chair <iaoc-chair@ietf.org>',
31-
'The IETF Trust <ietf-trust@ietf.org>',
32-
'RSOC Chair <rsoc-chair@iab.org>',
33-
'ISOC Board of Trustees <bob.hinden@gmail.com>',
34-
'RFC Series Editor <rse@rfc-editor.org>',
35-
'IAB Executive Administrative Manager <execd@iab.org>',
36-
'IETF Mentoring Program <mentoring@ietf.org>',
37-
'ISOC CEO <ceo@isoc.org>')
38-
3912
TO_LIST = ('IETF Announcement List <ietf-announce@ietf.org>',
4013
'I-D Announcement List <i-d-announce@ietf.org>',
4114
'The IESG <iesg@ietf.org>',
@@ -53,85 +26,48 @@ def get_from_choices(user):
5326
all the Announced From choices. Including
5427
leadership chairs and other entities.
5528
'''
56-
person = user.person
57-
f = []
29+
addresses = []
5830
if has_role(user,'Secretariat'):
59-
f = FROM_LIST
60-
elif has_role(user,'IETF Chair'):
61-
f = (FROM_LIST[2],FROM_LIST[5])
62-
elif has_role(user,'IAB Chair'):
63-
f = (FROM_LIST[6],)
64-
elif has_role(user,'IAD'):
65-
f = (FROM_LIST[9],FROM_LIST[12],FROM_LIST[18],FROM_LIST[11],)
66-
#RSOC Chair, IAOC Chair aren't supported by has_role()
67-
elif Role.objects.filter(person=person,
68-
group__acronym='rsoc',
69-
name="chair"):
70-
f = (FROM_LIST[13],)
71-
elif Role.objects.filter(person=person,
72-
group__acronym='iaoc',
73-
name="chair"):
74-
f = (FROM_LIST[11],)
75-
elif Role.objects.filter(person=person,
76-
group__acronym='rse',
77-
name="chair"):
78-
f = (FROM_LIST[15],)
79-
elif Role.objects.filter(person=person,
80-
group__acronym='iab',
81-
name='execdir'):
82-
f = (FROM_LIST[6],FROM_LIST[16])
83-
elif Role.objects.filter(person=person,
84-
group__acronym='mentor',
85-
name="chair"):
86-
f = (FROM_LIST[17],)
87-
elif Role.objects.filter(person=person,
88-
group__acronym='isoc',
89-
name="ceo"):
90-
f = (FROM_LIST[18],)
91-
elif Role.objects.filter(person=person,
92-
group__acronym='isocbot',
93-
name="chair"):
94-
f = (FROM_LIST[14],)
95-
elif Role.objects.filter(person=person,
96-
group__acronym='ietf-trust',
97-
name="chair"):
98-
f = (FROM_LIST[12],)
99-
100-
# NomCom
31+
addresses = AnnouncementFrom.objects.values_list('address', flat=True).order_by('address').distinct()
32+
else:
33+
for role in user.person.role_set.all():
34+
addresses.extend(AnnouncementFrom.objects.filter(name=role.name, group=role.group).values_list('address', flat=True).order_by('address'))
35+
36+
nomcom_choices = get_nomcom_choices(user)
37+
if nomcom_choices:
38+
addresses = list(addresses) + nomcom_choices
39+
40+
return zip(addresses, addresses)
41+
42+
43+
def get_nomcom_choices(user):
44+
'''
45+
Returns the list of nomcom email addresses for given user
46+
'''
10147
nomcoms = Role.objects.filter(name="chair",
10248
group__acronym__startswith="nomcom",
10349
group__state="active",
10450
group__type="nomcom",
105-
person=person)
106-
if nomcoms:
107-
year = nomcoms[0].group.acronym[-4:]
108-
alias = 'NomCom Chair %s <nomcom-chair-%s@ietf.org>' % (year,year)
109-
f = (alias,)
51+
person=user.person)
52+
addresses = []
53+
for nomcom in nomcoms:
54+
year = nomcom.group.acronym[-4:]
55+
addresses.append('NomCom Chair %s <nomcom-chair-%s@ietf.org>' % (year,year))
11056

111-
return zip(f,f)
57+
return addresses
58+
11259

11360
def get_to_choices():
114-
#groups = Group.objects.filter(acronym__in=ANNOUNCE_TO_GROUPS)
115-
#roles = Role.objects.filter(group__in=(groups),name="Announce")
116-
#choices = [ (r.email, r.person.name) for r in roles ]
117-
#choices.append(('Other...','Other...'),)
11861
return zip(TO_LIST,TO_LIST)
11962

120-
# ---------------------------------------------
121-
# Select Choices
122-
# ---------------------------------------------
123-
TO_CHOICES = get_to_choices()
124-
#FROM_CHOICES = get_from_choices()
12563

12664
# ---------------------------------------------
12765
# Forms
12866
# ---------------------------------------------
12967

13068
class AnnounceForm(forms.ModelForm):
131-
#nomcom = forms.BooleanField(required=False)
13269
nomcom = forms.ModelChoiceField(queryset=Group.objects.filter(acronym__startswith='nomcom',type='nomcom',state='active'),required=False)
13370
to_custom = MultiEmailField(required=False,label='')
134-
#cc = MultiEmailField(required=False)
13571

13672
class Meta:
13773
model = Message
@@ -145,7 +81,7 @@ def __init__(self, *args, **kwargs):
14581
user = kwargs.pop('user')
14682
person = user.person
14783
super(AnnounceForm, self).__init__(*args, **kwargs)
148-
self.fields['to'].widget = forms.Select(choices=TO_CHOICES)
84+
self.fields['to'].widget = forms.Select(choices=get_to_choices())
14985
self.fields['to'].help_text = 'Select name OR select Other... and enter email below'
15086
self.fields['cc'].help_text = 'Use comma separated lists for emails (Cc, Bcc, Reply To)'
15187
self.fields['frm'].widget = forms.Select(choices=get_from_choices(user))

0 commit comments

Comments
 (0)