Skip to content

Commit 5684bc3

Browse files
committed
Allow the secretariat to send liaisons on behalf of another user. Fixes ietf-tools#578
- Legacy-Id: 2787
1 parent 53fae6e commit 5684bc3

4 files changed

Lines changed: 71 additions & 4 deletions

File tree

ietf/liaisons/forms.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
from django.forms.fields import email_re
99
from django.template.loader import render_to_string
1010

11+
from ietf.idtracker.models import PersonOrOrgInfo
1112
from ietf.liaisons.accounts import (can_add_outgoing_liaison, can_add_incoming_liaison,
1213
get_person_for_user, is_secretariat, is_sdo_liaison_manager)
1314
from ietf.liaisons.models import LiaisonDetail, Uploads, OutgoingLiaisonApproval, SDOs
@@ -61,6 +62,9 @@ def __init__(self, user, *args, **kwargs):
6162
self.person = get_person_for_user(user)
6263
if kwargs.get('data', None):
6364
kwargs['data'].update({'person': self.person.pk})
65+
if is_secretariat(self.user) and 'from_fake_user' in kwargs['data'].keys():
66+
fake_person = PersonOrOrgInfo.objects.get(pk=kwargs['data']['from_fake_user'])
67+
kwargs['data'].update({'person': fake_person.pk})
6468
super(LiaisonForm, self).__init__(*args, **kwargs)
6569
self.hm = IETFHM
6670
self.set_from_field()

ietf/liaisons/utils.py

Lines changed: 35 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from ietf.idtracker.models import Area, IETFWG
2-
from ietf.liaisons.models import SDOs
3-
from ietf.liaisons.accounts import is_ietfchair, is_iabchair, is_iab_executive_director
2+
from ietf.liaisons.models import SDOs, LiaisonManagers
3+
from ietf.liaisons.accounts import (is_ietfchair, is_iabchair, is_iab_executive_director,
4+
get_ietf_chair, get_iab_chair, get_iab_executive_director)
45

56
IETFCHAIR = {'name': u'The IETF Chair', 'address': u'chair@ietf.org'}
67
IESG = {'name': u'The IESG', 'address': u'iesg@ietf.org'}
@@ -9,6 +10,10 @@
910
IABEXECUTIVEDIRECTOR = {'name': u'The IAB Executive Director', 'address': u'execd@iab.org'}
1011

1112

13+
def get_all_sdo_managers():
14+
return [i.person for i in LiaisonManagers.objects.all().distinct()]
15+
16+
1217
class FakePerson(object):
1318

1419
def __init__(self, name, address):
@@ -50,6 +55,9 @@ def can_approve(self):
5055
def post_only(self, person):
5156
return False
5257

58+
def full_user_list(self):
59+
return False
60+
5361

5462
class IETFEntity(Entity):
5563

@@ -71,6 +79,11 @@ def needs_approval(self, person=None):
7179
def can_approve(self):
7280
return [self.poc]
7381

82+
def full_user_list(self):
83+
result = get_all_sdo_managers()
84+
result.append(get_ietf_chair())
85+
return result
86+
7487

7588
class IABEntity(Entity):
7689
chair = FakePerson(**IABCHAIR)
@@ -95,6 +108,11 @@ def needs_approval(self, person=None):
95108
def can_approve(self):
96109
return [self.chair]
97110

111+
def full_user_list(self):
112+
result = get_all_sdo_managers()
113+
result += [get_iab_chair(), get_iab_executive_director()]
114+
return result
115+
98116

99117
class AreaEntity(Entity):
100118

@@ -118,6 +136,11 @@ def needs_approval(self, person=None):
118136
def can_approve(self):
119137
return self.get_poc()
120138

139+
def full_user_list(self):
140+
result = get_all_sdo_managers()
141+
result += self.get_poc()
142+
return result
143+
121144

122145
class WGEntity(Entity):
123146

@@ -148,6 +171,11 @@ def needs_approval(self, person=None):
148171
def can_approve(self):
149172
return [i.person for i in self.obj.area.area.areadirector_set.all()]
150173

174+
def full_user_list(self):
175+
result = get_all_sdo_managers()
176+
result += self.get_poc()
177+
return result
178+
151179

152180
class SDOEntity(Entity):
153181

@@ -169,6 +197,11 @@ def get_from_cc(self, person=None):
169197
def post_only(self, person):
170198
return bool(self.obj.liaisonmanagers_set.filter(person=person))
171199

200+
def full_user_list(self):
201+
result = [i.person for i in self.obj.liaisonmanagers_set.all().distinct()]
202+
result += [i.person for i in self.obj.sdoauthorizedindividual_set.all().distinct()]
203+
return result
204+
172205

173206
class EntityManager(object):
174207

ietf/liaisons/views.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
from ietf.liaisons.accounts import (get_person_for_user, can_add_outgoing_liaison,
1616
can_add_incoming_liaison, LIAISON_EDIT_GROUPS,
1717
is_ietfchair, is_iabchair, is_iab_executive_director,
18-
can_edit_liaison)
18+
can_edit_liaison, is_secretariat)
1919
from ietf.liaisons.decorators import can_submit_liaison
2020
from ietf.liaisons.forms import liaison_form_factory
2121
from ietf.liaisons.models import LiaisonDetail, OutgoingLiaisonApproval
@@ -53,7 +53,7 @@ def get_info(request):
5353
to_entity_id = request.GET.get('to_entity_id', None)
5454
from_entity_id = request.GET.get('from_entity_id', None)
5555

56-
result = {'poc': [], 'cc': [], 'needs_approval': False, 'post_only': False}
56+
result = {'poc': [], 'cc': [], 'needs_approval': False, 'post_only': False, 'full_list': []}
5757

5858
to_error = 'Invalid TO entity id'
5959
if to_entity_id:
@@ -76,6 +76,11 @@ def get_info(request):
7676
'poc': [i.email() for i in to_entity.get_poc()],
7777
'needs_approval': from_entity.needs_approval(person=person),
7878
'post_only': from_entity.post_only(person=person)})
79+
if is_secretariat(request.user):
80+
full_list = [(i.pk, i.email()) for i in from_entity.full_user_list()]
81+
full_list.sort(lambda x,y: cmp(x[1], y[1]))
82+
full_list = [(person.pk, person.email())] + full_list
83+
result.update({'full_list': full_list})
7984
json_result = simplejson.dumps(result)
8085
return HttpResponse(json_result, mimetype='text/javascript')
8186

static/js/liaisons.js

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,30 @@
180180
}
181181
};
182182

183+
var updateReplyTo = function() {
184+
var select = form.find('select[name=from_fake_user]');
185+
var option = select.find('option:selected');
186+
reply.val(option.attr('title'));
187+
updateFrom();
188+
}
189+
190+
var userSelect = function(user_list) {
191+
if (!user_list) {
192+
return;
193+
}
194+
var link = form.find('a.from_mailto');
195+
var select = form.find('select[name=from_fake_user]');
196+
var options = '';
197+
link.hide();
198+
$.each(user_list, function(index, person) {
199+
options += '<option value="' + person[0] + '" title="' + person[1][1] + '">'+ person[1][0] + ' &lt;' + person[1][1] + '&gt;</option>';
200+
});
201+
select.remove();
202+
link.after('<select name="from_fake_user">' + options +'</select>')
203+
form.find('select[name=from_fake_user]').change(updateReplyTo);
204+
updateReplyTo();
205+
};
206+
183207
var updateInfo = function() {
184208
var entity = organization;
185209
var to_entity = from;
@@ -198,6 +222,7 @@
198222
render_mails_into(poc, response.poc);
199223
toggleApproval(response.needs_approval);
200224
checkPostOnly(response.post_only);
225+
userSelect(response.full_list);
201226
}
202227
}
203228
});

0 commit comments

Comments
 (0)