Skip to content

Commit eec8de1

Browse files
committed
Save from of incoming liaisons. Manage CCs depending of sending entity. Fixes ietf-tools#345
- Legacy-Id: 2377
1 parent 61a512d commit eec8de1

File tree

3 files changed

+65
-21
lines changed

3 files changed

+65
-21
lines changed

ietf/liaisons/forms.py

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
from ietf.liaisons.accounts import (can_add_outgoing_liaison, can_add_incoming_liaison,
99
get_person_for_user)
1010
from ietf.liaisons.models import LiaisonDetail, Uploads
11-
from ietf.liaisons.utils import IETFHierarchyManager
11+
from ietf.liaisons.utils import IETFHM
1212
from ietf.liaisons.widgets import (FromWidget, ReadOnlyWidget, ButtonWidget,
1313
ShowAttachmentsWidget)
1414

@@ -56,7 +56,7 @@ def __init__(self, user, *args, **kwargs):
5656
if kwargs.get('data', None):
5757
kwargs['data'].update({'person': self.person.pk})
5858
super(LiaisonForm, self).__init__(*args, **kwargs)
59-
self.hm = IETFHierarchyManager()
59+
self.hm = IETFHM
6060
self.set_from_field()
6161
self.set_replyto_field()
6262
self.set_organization_field()
@@ -123,7 +123,11 @@ def clean(self):
123123
self._errors['attachments'] = ErrorList([u'You must provide a body or attachment files'])
124124
return self.cleaned_data
125125

126-
def get_organization(self):
126+
def get_from_entity(self):
127+
organization_key = self.cleaned_data.get('from_field')
128+
return self.hm.get_entity_by_key(organization_key)
129+
130+
def get_to_entity(self):
127131
organization_key = self.cleaned_data.get('organization')
128132
return self.hm.get_entity_by_key(organization_key)
129133

@@ -132,7 +136,9 @@ def save(self, *args, **kwargs):
132136
liaison = super(LiaisonForm, self).save(*args, **kwargs)
133137
liaison.submitted_date = now
134138
liaison.last_modified_date = now
135-
organization = self.get_organization()
139+
from_entity = self.get_from_entity()
140+
liaison.from_raw_body = from_entity.name
141+
organization = self.get_to_entity()
136142
liaison.to_body = organization.name
137143
liaison.to_poc = ', '.join([i.email()[1] for i in organization.get_poc()])
138144
liaison.submitter_name, liaison.submitter_email = self.person.email()
@@ -166,11 +172,11 @@ def set_from_field(self):
166172
sdo_managed = [i.sdo for i in self.person.liaisonmanagers_set.all()]
167173
sdo_authorized = [i.sdo for i in self.person.sdoauthorizedindividual_set.all()]
168174
sdos = set(sdo_managed).union(sdo_authorized)
169-
self.fields['from_field'].choices = [(i.pk, i.sdo_name) for i in sdos]
175+
self.fields['from_field'].choices = [('sdo_%s' % i.pk, i.sdo_name) for i in sdos]
170176
self.fields['from_field'].widget.submitter = unicode(self.person)
171177

172178
def set_organization_field(self):
173-
self.fields['organization'].choices = self.hm.get_all_decorated_entities()
179+
self.fields['organization'].choices = self.hm.get_all_incoming_entities()
174180

175181

176182
class OutgoingLiaisonForm(LiaisonForm):

ietf/liaisons/utils.py

Lines changed: 47 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
from ietf.idtracker.models import Area, IETFWG
2+
from ietf.liaisons.models import SDOs
23

34
IETFCHAIR = {'name': u'The IETF Chair', 'address': u'chair@ietf.org'}
45
IESG = {'name': u'The IESG', 'address': u'iesg@ietf.org'}
@@ -30,7 +31,7 @@ def get_poc(self):
3031
return [self.poc]
3132
return self.poc
3233

33-
def get_cc(self):
34+
def get_cc(self, person=None):
3435
if not isinstance(self.cc, list):
3536
return [self.cc]
3637
return self.cc
@@ -41,7 +42,7 @@ class AreaEntity(IETFEntity):
4142
def get_poc(self):
4243
return [i.person for i in self.obj.areadirector_set.all()]
4344

44-
def get_cc(self):
45+
def get_cc(self, person=None):
4546
return [FakePerson(**IETFCHAIR)]
4647

4748

@@ -50,14 +51,29 @@ class WGEntity(IETFEntity):
5051
def get_poc(self):
5152
return [i.person for i in self.obj.wgchair_set.all()]
5253

53-
def get_cc(self):
54+
def get_cc(self, person=None):
5455
result = [i.person for i in self.obj.area_directors()]
5556
if self.obj.email_address:
5657
result.append(FakePerson(name ='%s Discussion List' % self.obj.group_acronym.name,
5758
address = self.obj.email_address))
5859
return result
5960

6061

62+
class SDOEntity(IETFEntity):
63+
64+
def get_poc(self):
65+
return []
66+
67+
def get_cc(self, person=None):
68+
return []
69+
70+
def get_from_cc(self, person=None):
71+
manager = self.obj.liaisonmanager()
72+
if manager and manager.person!=person:
73+
return [manager.person]
74+
return []
75+
76+
6177
class IETFEntityManager(object):
6278

6379
def __init__(self, pk=None, name=None, queryset=None, poc=None, cc=None):
@@ -114,6 +130,26 @@ def get_entity(self, pk=None):
114130
return WGEntity(name=obj.group_acronym.name, obj=obj)
115131

116132

133+
class SDOEntityManager(IETFEntityManager):
134+
135+
def __init__(self, pk=None, name=None, queryset=None, poc=None):
136+
super(SDOEntityManager, self).__init__(pk, name, queryset, poc)
137+
if self.queryset == None:
138+
self.queryset = SDOs.objects.all()
139+
140+
def get_managed_list(self):
141+
return [(u'%s_%s' % (self.pk, i.pk), i.sdo_name) for i in self.queryset.order_by('sdo_name')]
142+
143+
def get_entity(self, pk=None):
144+
if not pk:
145+
return None
146+
try:
147+
obj = self.queryset.get(pk=pk)
148+
except self.queryset.model.DoesNotExist:
149+
return None
150+
return SDOEntity(name=obj.sdo_name, obj=obj)
151+
152+
117153
class IETFHierarchyManager(object):
118154

119155
def __init__(self):
@@ -129,6 +165,7 @@ def __init__(self):
129165
cc=FakePerson(**IAB)),
130166
'area': AreaEntityManager(pk='area', name=u'IETF Areas'),
131167
'wg': WGEntityManager(pk='wg', name=u'IETF Working Groups'),
168+
'sdo': SDOEntityManager(pk='sdo', name=u'Standards Development Organizations'),
132169
}
133170

134171
def get_entity_by_key(self, entity_id):
@@ -147,7 +184,7 @@ def get_all_entities(self):
147184
entities += manager.get_managed_list()
148185
return entities
149186

150-
def get_all_decorated_entities(self):
187+
def get_all_incoming_entities(self):
151188
entities = []
152189
results = []
153190
for key in ['ietf', 'iesg', 'iab']:
@@ -156,3 +193,9 @@ def get_all_decorated_entities(self):
156193
entities.append(('IETF Areas', self.managers['area'].get_managed_list()))
157194
entities.append(('IETF Working Groups', self.managers['wg'].get_managed_list()))
158195
return entities
196+
197+
def get_all_outgoing_entities(self):
198+
entities = [(self.manager['sdo'].name, self.managers['sdo'].get_managed_list())]
199+
return entities
200+
201+
IETFHM = IETFHierarchyManager()

ietf/liaisons/views.py

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
from ietf.liaisons.decorators import can_submit_liaison
99
from ietf.liaisons.forms import liaison_form_factory
1010
from ietf.liaisons.models import SDOs
11-
from ietf.liaisons.utils import IETFHierarchyManager
11+
from ietf.liaisons.utils import IETFHM
1212

1313

1414
@can_submit_liaison
@@ -34,7 +34,7 @@ def get_poc_for_incoming(request):
3434
if not entity_id:
3535
result = {'poc': None, 'error': 'No entity id'}
3636
else:
37-
entity = IETFHierarchyManager().get_entity_by_key(entity_id)
37+
entity = IETFHM.get_entity_by_key(entity_id)
3838
if not entity:
3939
result = {'poc': None, 'error': 'Invalid entity id'}
4040
else:
@@ -49,20 +49,15 @@ def get_cc_for_incoming(request):
4949
sdo_id = request.GET.get('sdo_id', None)
5050
if not entity_id and not sdo_id:
5151
result = {'cc': [], 'error': 'No entity id and no sdo id'}
52+
person = get_person_for_user(request.user)
5253
if entity_id:
53-
entity = IETFHierarchyManager().get_entity_by_key(entity_id)
54+
entity = IETFHM.get_entity_by_key(entity_id)
5455
if not entity:
5556
result = {'cc': [], 'error': 'Invalid entity id'}
5657
else:
5758
result = {'error': False, 'cc': [i.email() for i in entity.get_cc()]}
5859
if sdo_id:
59-
try:
60-
sdo = SDOs.objects.get(pk=sdo_id)
61-
manager = sdo.liaisonmanager()
62-
person = get_person_for_user(request.user)
63-
if manager and manager.person!=person:
64-
result['cc'].append(manager.person.email())
65-
except SDOs.DoesNotExist:
66-
result['error']='Invalid sdo id'
60+
from_entity = IETFHM.get_entity_by_key(sdo_id)
61+
result['cc'] += [i.email() for i in from_entity.get_from_cc(person=person)]
6762
json_result = simplejson.dumps(result)
6863
return HttpResponse(json_result, mimetype='text/javascript')

0 commit comments

Comments
 (0)