Skip to content

Commit ed0277c

Browse files
committed
Create liaison manager group.
Users in that group can send outgoing liaisons from any ietf entity. Users in that group can send incoming liaisons from any sdo. Fixes ietf-tools#356 - Legacy-Id: 2467
1 parent 8e7295c commit ed0277c

4 files changed

Lines changed: 140 additions & 12 deletions

File tree

ietf/liaisons/accounts.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,8 @@ def can_add_outgoing_liaison(user):
6262

6363
if (is_areadirector(person) or is_wgchair(person) or
6464
is_wgsecretary(person) or is_ietfchair(person) or
65-
is_iabchair(person) or is_iab_executive_director(person)):
65+
is_iabchair(person) or is_iab_executive_director(person) or
66+
is_ietf_liaison_manager(user)):
6667
return True
6768
return False
6869

@@ -75,13 +76,18 @@ def is_sdo_authorized_individual(person):
7576
return bool(person.sdoauthorizedindividual_set.all())
7677

7778

79+
def is_ietf_liaison_manager(user):
80+
return bool(user.groups.filter(name='Liaison_Manager'))
81+
82+
7883
def can_add_incoming_liaison(user):
7984
person = get_person_for_user(user)
8085
if not person:
8186
return False
8287

8388
if (is_sdo_liaison_manager(person) or
84-
is_sdo_authorized_individual(person)):
89+
is_sdo_authorized_individual(person) or
90+
is_ietf_liaison_manager(user)):
8591
return True
8692
return False
8793

ietf/liaisons/forms.py

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@
55
from django.template.loader import render_to_string
66

77
from ietf.liaisons.accounts import (can_add_outgoing_liaison, can_add_incoming_liaison,
8-
get_person_for_user)
9-
from ietf.liaisons.models import LiaisonDetail, Uploads, OutgoingLiaisonApproval
8+
get_person_for_user, is_ietf_liaison_manager)
9+
from ietf.liaisons.models import LiaisonDetail, Uploads, OutgoingLiaisonApproval, SDOs
1010
from ietf.liaisons.utils import IETFHM
1111
from ietf.liaisons.widgets import (FromWidget, ReadOnlyWidget, ButtonWidget,
1212
ShowAttachmentsWidget)
@@ -51,6 +51,7 @@ class Media:
5151
"/css/jquery-ui-themes/jquery-ui-1.8.2.custom.css")}
5252

5353
def __init__(self, user, *args, **kwargs):
54+
self.user = user
5455
self.person = get_person_for_user(user)
5556
if kwargs.get('data', None):
5657
kwargs['data'].update({'person': self.person.pk})
@@ -180,9 +181,12 @@ def save_attachments(self, instance):
180181
class IncomingLiaisonForm(LiaisonForm):
181182

182183
def set_from_field(self):
183-
sdo_managed = [i.sdo for i in self.person.liaisonmanagers_set.all()]
184-
sdo_authorized = [i.sdo for i in self.person.sdoauthorizedindividual_set.all()]
185-
sdos = set(sdo_managed).union(sdo_authorized)
184+
if is_ietf_liaison_manager(self.user):
185+
sdos = SDOs.objects.all()
186+
else:
187+
sdo_managed = [i.sdo for i in self.person.liaisonmanagers_set.all()]
188+
sdo_authorized = [i.sdo for i in self.person.sdoauthorizedindividual_set.all()]
189+
sdos = set(sdo_managed).union(sdo_authorized)
186190
self.fields['from_field'].choices = [('sdo_%s' % i.pk, i.sdo_name) for i in sdos]
187191
self.fields['from_field'].widget.submitter = unicode(self.person)
188192

@@ -204,7 +208,10 @@ def get_to_entity(self):
204208
return organization
205209

206210
def set_from_field(self):
207-
self.fields['from_field'].choices = self.hm.get_entities_for_person(self.person)
211+
if is_ietf_liaison_manager(self.user):
212+
self.fields['from_field'].choices = self.hm.get_all_incoming_entities()
213+
else:
214+
self.fields['from_field'].choices = self.hm.get_entities_for_person(self.person)
208215
self.fields['from_field'].widget.submitter = unicode(self.person)
209216
self.fieldsets[0] = ('From', ('from_field', 'replyto', 'approved'))
210217

@@ -239,8 +246,7 @@ def save_extra_fields(self, liaison):
239246
approval_date = None
240247
approval = OutgoingLiaisonApproval.objects.create(
241248
approved = approved,
242-
approval_date = approval_date,
243-
normalized_entity_code = self.cleaned_data.get('from_field'))
249+
approval_date = approval_date)
244250
liaison.approval = approval
245251
liaison.save()
246252

Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
2+
from south.db import db
3+
from django.contrib.auth.models import Group
4+
from django.db import models
5+
from ietf.liaisons.models import *
6+
7+
class Migration:
8+
9+
def forwards(self, orm):
10+
11+
# Adding Liaison_Manager user group
12+
Group.objects.get_or_create(name=u'Liaison_Manager')
13+
14+
15+
16+
def backwards(self, orm):
17+
18+
pass
19+
20+
21+
22+
models = {
23+
'idtracker.personororginfo': {
24+
'Meta': {'db_table': "'person_or_org_info'"},
25+
'address_type': ('django.db.models.fields.CharField', [], {'max_length': '4', 'null': 'True', 'blank': 'True'}),
26+
'created_by': ('django.db.models.fields.CharField', [], {'max_length': '8', 'null': 'True', 'blank': 'True'}),
27+
'date_created': ('django.db.models.fields.DateField', [], {'auto_now_add': 'True', 'null': 'True', 'blank': 'True'}),
28+
'date_modified': ('django.db.models.fields.DateField', [], {'auto_now': 'True', 'null': 'True', 'blank': 'True'}),
29+
'first_name': ('django.db.models.fields.CharField', [], {'max_length': '20', 'blank': 'True'}),
30+
'first_name_key': ('django.db.models.fields.CharField', [], {'max_length': '20', 'blank': 'True'}),
31+
'last_name': ('django.db.models.fields.CharField', [], {'max_length': '50', 'blank': 'True'}),
32+
'last_name_key': ('django.db.models.fields.CharField', [], {'max_length': '50', 'blank': 'True'}),
33+
'middle_initial': ('django.db.models.fields.CharField', [], {'max_length': '4', 'null': 'True', 'blank': 'True'}),
34+
'middle_initial_key': ('django.db.models.fields.CharField', [], {'max_length': '4', 'null': 'True', 'blank': 'True'}),
35+
'modified_by': ('django.db.models.fields.CharField', [], {'max_length': '8', 'null': 'True', 'blank': 'True'}),
36+
'name_prefix': ('django.db.models.fields.CharField', [], {'max_length': '10', 'null': 'True', 'blank': 'True'}),
37+
'name_suffix': ('django.db.models.fields.CharField', [], {'max_length': '10', 'null': 'True', 'blank': 'True'}),
38+
'person_or_org_tag': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
39+
'record_type': ('django.db.models.fields.CharField', [], {'max_length': '8', 'null': 'True', 'blank': 'True'})
40+
},
41+
'liaisons.frombodies': {
42+
'Meta': {'db_table': "'from_bodies'"},
43+
'body_name': ('django.db.models.fields.CharField', [], {'max_length': '35', 'blank': 'True'}),
44+
'email_priority': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
45+
'from_id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
46+
'is_liaison_manager': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
47+
'other_sdo': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
48+
'poc': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['idtracker.PersonOrOrgInfo']", 'null': 'True', 'db_column': "'poc'"})
49+
},
50+
'liaisons.liaisondetail': {
51+
'Meta': {'db_table': "'liaison_detail'"},
52+
'approval': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['liaisons.OutgoingLiaisonApproval']", 'null': 'True', 'blank': 'True'}),
53+
'body': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
54+
'by_secretariat': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
55+
'cc1': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
56+
'cc2': ('django.db.models.fields.CharField', [], {'max_length': '50', 'null': 'True', 'blank': 'True'}),
57+
'deadline_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}),
58+
'detail_id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
59+
'from_id': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
60+
'from_raw_body': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
61+
'from_raw_code': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
62+
'last_modified_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}),
63+
'person': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['idtracker.PersonOrOrgInfo']", 'null': 'True', 'db_column': "'person_or_org_tag'"}),
64+
'purpose': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['liaisons.LiaisonPurpose']", 'null': 'True'}),
65+
'purpose_text': ('django.db.models.fields.TextField', [], {'null': 'True', 'db_column': "'purpose'", 'blank': 'True'}),
66+
'replyto': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
67+
'response_contact': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
68+
'submitted_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}),
69+
'submitter_email': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
70+
'submitter_name': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
71+
'technical_contact': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
72+
'title': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
73+
'to_body': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
74+
'to_email': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
75+
'to_poc': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'})
76+
},
77+
'liaisons.liaisonmanagers': {
78+
'Meta': {'db_table': "'liaison_managers'"},
79+
'email_priority': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
80+
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
81+
'person': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['idtracker.PersonOrOrgInfo']", 'db_column': "'person_or_org_tag'"}),
82+
'sdo': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['liaisons.SDOs']"})
83+
},
84+
'liaisons.liaisonpurpose': {
85+
'Meta': {'db_table': "'liaison_purpose'"},
86+
'purpose_id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
87+
'purpose_text': ('django.db.models.fields.CharField', [], {'max_length': '50', 'blank': 'True'})
88+
},
89+
'liaisons.outgoingliaisonapproval': {
90+
'approval_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}),
91+
'approved': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}),
92+
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'})
93+
},
94+
'liaisons.sdoauthorizedindividual': {
95+
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
96+
'person': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['idtracker.PersonOrOrgInfo']", 'db_column': "'person_or_org_tag'"}),
97+
'sdo': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['liaisons.SDOs']"})
98+
},
99+
'liaisons.sdos': {
100+
'Meta': {'db_table': "'sdos'"},
101+
'sdo_id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
102+
'sdo_name': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'})
103+
},
104+
'liaisons.uploads': {
105+
'Meta': {'db_table': "'uploads'"},
106+
'detail': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['liaisons.LiaisonDetail']"}),
107+
'file_extension': ('django.db.models.fields.CharField', [], {'max_length': '10', 'blank': 'True'}),
108+
'file_id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
109+
'file_title': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
110+
'person': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['idtracker.PersonOrOrgInfo']", 'db_column': "'person_or_org_tag'"})
111+
}
112+
}
113+
114+
complete_apps = ['liaisons']

ietf/liaisons/views.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -87,10 +87,12 @@ def liaison_list(request):
8787
user = request.user
8888
can_send_outgoing = can_add_outgoing_liaison(user)
8989
can_send_incoming = can_add_incoming_liaison(user)
90+
can_approve = False
9091

9192
person = get_person_for_user(request.user)
92-
approval_codes = IETFHM.get_all_can_approve_codes(person)
93-
can_approve = LiaisonDetail.objects.filter(approval__isnull=False, approval__approved=False, from_raw_code__in=approval_codes).count()
93+
if person:
94+
approval_codes = IETFHM.get_all_can_approve_codes(person)
95+
can_approve = LiaisonDetail.objects.filter(approval__isnull=False, approval__approved=False, from_raw_code__in=approval_codes).count()
9496

9597
public_liaisons = LiaisonDetail.objects.filter(Q(approval__isnull=True)|Q(approval__approved=True)).order_by("-submitted_date")
9698

0 commit comments

Comments
 (0)