Outgoing liaison form with automatic filled fields. See #343
- Legacy-Id: 2428
This commit is contained in:
parent
fbbf182329
commit
709181c978
|
@ -32,13 +32,13 @@ class LiaisonForm(forms.ModelForm):
|
|||
required_label='title and file'),
|
||||
required=False)
|
||||
|
||||
fieldsets = (('From', ('from_field', 'replyto')),
|
||||
fieldsets = [('From', ('from_field', 'replyto')),
|
||||
('To', ('organization', 'to_poc')),
|
||||
('Other email addresses', ('response_contact', 'technical_contact', 'cc1')),
|
||||
('Purpose', ('purpose', 'purpose_text', 'deadline_date')),
|
||||
('Liaison Statement', ('title', 'body', 'attachments')),
|
||||
('Add attachment', ('attach_title', 'attach_file', 'attach_button')),
|
||||
)
|
||||
]
|
||||
|
||||
class Meta:
|
||||
model = LiaisonDetail
|
||||
|
@ -129,7 +129,10 @@ class LiaisonForm(forms.ModelForm):
|
|||
|
||||
def get_to_entity(self):
|
||||
organization_key = self.cleaned_data.get('organization')
|
||||
return self.hm.get_entity_by_key(organization_key)
|
||||
organization = self.hm.get_entity_by_key(organization_key)
|
||||
if not organization and self.cleaned_data.get('other_organization', None):
|
||||
return self.cleaned_data.get('other_organization')
|
||||
return organization
|
||||
|
||||
def save(self, *args, **kwargs):
|
||||
now = datetime.datetime.now()
|
||||
|
@ -181,17 +184,22 @@ class IncomingLiaisonForm(LiaisonForm):
|
|||
|
||||
class OutgoingLiaisonForm(LiaisonForm):
|
||||
|
||||
to_poc = forms.CharField(label="POC", required=True)
|
||||
other_organization = forms.CharField(label="Other SDO", required=True)
|
||||
|
||||
def set_from_field(self):
|
||||
pass
|
||||
self.fields['from_field'].choices = self.hm.get_entities_for_person(self.person)
|
||||
self.fields['from_field'].widget.submitter = unicode(self.person)
|
||||
|
||||
def set_organization_field(self):
|
||||
pass
|
||||
self.fields['organization'].choices = self.hm.get_all_outgoing_entities()
|
||||
self.fieldsets[1] = ('To', ('organization', 'other_organization', 'to_poc'))
|
||||
|
||||
|
||||
def liaison_form_factory(request, **kwargs):
|
||||
user = request.user
|
||||
if can_add_incoming_liaison(user):
|
||||
return IncomingLiaisonForm(user, **kwargs)
|
||||
elif can_add_outgoing_liaison(user):
|
||||
if can_add_outgoing_liaison(user):
|
||||
return OutgoingLiaisonForm(user, **kwargs)
|
||||
elif can_add_incoming_liaison(user):
|
||||
return IncomingLiaisonForm(user, **kwargs)
|
||||
return None
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
from ietf.idtracker.models import Area, IETFWG
|
||||
from ietf.liaisons.models import SDOs
|
||||
from ietf.liaisons.accounts import is_ietfchair, is_iabchair, is_iab_executive_director
|
||||
|
||||
IETFCHAIR = {'name': u'The IETF Chair', 'address': u'chair@ietf.org'}
|
||||
IESG = {'name': u'The IESG', 'address': u'iesg@ietf.org'}
|
||||
|
@ -18,12 +19,10 @@ class FakePerson(object):
|
|||
return (self.name, self.address)
|
||||
|
||||
|
||||
class IETFEntity(object):
|
||||
class Entity(object):
|
||||
|
||||
def __init__(self, name, poc=None, obj=None, cc=None):
|
||||
def __init__(self, name, obj=None):
|
||||
self.name = name
|
||||
self.poc = poc
|
||||
self.cc = cc
|
||||
self.obj = obj
|
||||
|
||||
def get_poc(self):
|
||||
|
@ -36,8 +35,40 @@ class IETFEntity(object):
|
|||
return [self.cc]
|
||||
return self.cc
|
||||
|
||||
def get_from_cc(self, person=None):
|
||||
return []
|
||||
|
||||
class AreaEntity(IETFEntity):
|
||||
|
||||
class IETFEntity(Entity):
|
||||
|
||||
poc = FakePerson(**IETFCHAIR)
|
||||
cc = FakePerson(**IESG)
|
||||
|
||||
def get_from_cc(self, person):
|
||||
result = []
|
||||
if not is_ietfchair(person):
|
||||
result.append(self.poc)
|
||||
result.append(self.cc)
|
||||
return result
|
||||
|
||||
|
||||
class IABEntity(Entity):
|
||||
chair = FakePerson(**IABCHAIR)
|
||||
director = FakePerson(**IABEXECUTIVEDIRECTOR)
|
||||
poc = [chair, director]
|
||||
cc = FakePerson(**IAB)
|
||||
|
||||
def get_from_cc(self, person):
|
||||
result = []
|
||||
if not is_iabchair(person):
|
||||
result.append(self.chair)
|
||||
result.append(self.cc)
|
||||
if not is_iab_executive_director(person):
|
||||
result.append(self.director)
|
||||
return result
|
||||
|
||||
|
||||
class AreaEntity(Entity):
|
||||
|
||||
def get_poc(self):
|
||||
return [i.person for i in self.obj.areadirector_set.all()]
|
||||
|
@ -45,8 +76,13 @@ class AreaEntity(IETFEntity):
|
|||
def get_cc(self, person=None):
|
||||
return [FakePerson(**IETFCHAIR)]
|
||||
|
||||
def get_from_cc(self, person):
|
||||
result = [i.person for i in self.obj.areadirector_set.all() if i.person!=person]
|
||||
result.append(FakePerson(**IETFCHAIR))
|
||||
return result
|
||||
|
||||
class WGEntity(IETFEntity):
|
||||
|
||||
class WGEntity(Entity):
|
||||
|
||||
def get_poc(self):
|
||||
return [i.person for i in self.obj.wgchair_set.all()]
|
||||
|
@ -58,13 +94,24 @@ class WGEntity(IETFEntity):
|
|||
address = self.obj.email_address))
|
||||
return result
|
||||
|
||||
def get_from_cc(self, person):
|
||||
result = [i.person for i in self.obj.wgchair_set.all() if i.person!=person]
|
||||
result += [i.person for i in self.obj.area_directors()]
|
||||
if self.obj.email_address:
|
||||
result.append(FakePerson(name ='%s Discussion List' % self.obj.group_acronym.name,
|
||||
address = self.obj.email_address))
|
||||
return result
|
||||
|
||||
class SDOEntity(IETFEntity):
|
||||
|
||||
class SDOEntity(Entity):
|
||||
|
||||
def get_poc(self):
|
||||
return []
|
||||
|
||||
def get_cc(self, person=None):
|
||||
manager = self.obj.liaisonmanager()
|
||||
if manager:
|
||||
return [manager.person]
|
||||
return []
|
||||
|
||||
def get_from_cc(self, person=None):
|
||||
|
@ -74,31 +121,65 @@ class SDOEntity(IETFEntity):
|
|||
return []
|
||||
|
||||
|
||||
class IETFEntityManager(object):
|
||||
class EntityManager(object):
|
||||
|
||||
def __init__(self, pk=None, name=None, queryset=None, poc=None, cc=None):
|
||||
def __init__(self, pk=None, name=None, queryset=None):
|
||||
self.pk = pk
|
||||
self.name = name
|
||||
self.queryset = queryset
|
||||
self.poc = poc
|
||||
self.cc = cc
|
||||
|
||||
def get_entity(self, pk=None):
|
||||
return IETFEntity(name=self.name, poc=self.poc, cc=self.cc)
|
||||
return Entity(name=self.name, poc=self.poc, cc=self.cc)
|
||||
|
||||
def get_managed_list(self):
|
||||
return [(self.pk, self.name)]
|
||||
|
||||
def can_send_on_behalf(self, person):
|
||||
return []
|
||||
|
||||
class AreaEntityManager(IETFEntityManager):
|
||||
|
||||
def __init__(self, pk=None, name=None, queryset=None, poc=None):
|
||||
super(AreaEntityManager, self).__init__(pk, name, queryset, poc)
|
||||
class IETFEntityManager(EntityManager):
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
super(IETFEntityManager, self).__init__(*args, **kwargs)
|
||||
self.entity = IETFEntity(name=self.name)
|
||||
|
||||
def get_entity(self, pk=None):
|
||||
return self.entity
|
||||
|
||||
def can_send_on_behalf(self, person):
|
||||
if is_ietfchair(person):
|
||||
return self.get_managed_list()
|
||||
return []
|
||||
|
||||
|
||||
class IABEntityManager(EntityManager):
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
super(IABEntityManager, self).__init__(*args, **kwargs)
|
||||
self.entity = IABEntity(name=self.name)
|
||||
|
||||
def get_entity(self, pk=None):
|
||||
return self.entity
|
||||
|
||||
def can_send_on_behalf(self, person):
|
||||
if (is_iabchair(person) or
|
||||
is_iab_executive_director(person)):
|
||||
return self.get_managed_list()
|
||||
return []
|
||||
|
||||
|
||||
class AreaEntityManager(EntityManager):
|
||||
|
||||
def __init__(self, pk=None, name=None, queryset=None):
|
||||
super(AreaEntityManager, self).__init__(pk, name, queryset)
|
||||
if self.queryset == None:
|
||||
self.queryset = Area.active_areas()
|
||||
|
||||
def get_managed_list(self):
|
||||
return [(u'%s_%s' % (self.pk, i.pk), i.area_acronym.name) for i in self.queryset.order_by('area_acronym__name')]
|
||||
def get_managed_list(self, query_filter=None):
|
||||
if not query_filter:
|
||||
query_filter = {}
|
||||
return [(u'%s_%s' % (self.pk, i.pk), i.area_acronym.name) for i in self.queryset.filter(**query_filter).order_by('area_acronym__name')]
|
||||
|
||||
def get_entity(self, pk=None):
|
||||
if not pk:
|
||||
|
@ -109,16 +190,22 @@ class AreaEntityManager(IETFEntityManager):
|
|||
return None
|
||||
return AreaEntity(name=obj.area_acronym.name, obj=obj)
|
||||
|
||||
def can_send_on_behalf(self, person):
|
||||
query_filter = {'areadirector__in': person.areadirector_set.all()}
|
||||
return self.get_managed_list(query_filter)
|
||||
|
||||
class WGEntityManager(IETFEntityManager):
|
||||
|
||||
def __init__(self, pk=None, name=None, queryset=None, poc=None):
|
||||
super(WGEntityManager, self).__init__(pk, name, queryset, poc)
|
||||
class WGEntityManager(EntityManager):
|
||||
|
||||
def __init__(self, pk=None, name=None, queryset=None):
|
||||
super(WGEntityManager, self).__init__(pk, name, queryset)
|
||||
if self.queryset == None:
|
||||
self.queryset = IETFWG.objects.filter(group_type=1, status=IETFWG.ACTIVE, areagroup__area__status=Area.ACTIVE)
|
||||
|
||||
def get_managed_list(self):
|
||||
return [(u'%s_%s' % (self.pk, i.pk), i.group_acronym.name) for i in self.queryset.order_by('group_acronym__name')]
|
||||
def get_managed_list(self, query_filter=None):
|
||||
if not query_filter:
|
||||
query_filter = {}
|
||||
return [(u'%s_%s' % (self.pk, i.pk), i.group_acronym.name) for i in self.queryset.filter(**query_filter).order_by('group_acronym__name')]
|
||||
|
||||
def get_entity(self, pk=None):
|
||||
if not pk:
|
||||
|
@ -129,11 +216,17 @@ class WGEntityManager(IETFEntityManager):
|
|||
return None
|
||||
return WGEntity(name=obj.group_acronym.name, obj=obj)
|
||||
|
||||
def can_send_on_behalf(self, person):
|
||||
wgs = set([i.group_acronym.pk for i in person.wgchair_set.all()])
|
||||
wgs = wgs.union([i.group_acronym.pk for i in person.wgsecretary_set.all()])
|
||||
query_filter = {'pk__in': wgs}
|
||||
return self.get_managed_list(query_filter)
|
||||
|
||||
class SDOEntityManager(IETFEntityManager):
|
||||
|
||||
def __init__(self, pk=None, name=None, queryset=None, poc=None):
|
||||
super(SDOEntityManager, self).__init__(pk, name, queryset, poc)
|
||||
class SDOEntityManager(EntityManager):
|
||||
|
||||
def __init__(self, pk=None, name=None, queryset=None):
|
||||
super(SDOEntityManager, self).__init__(pk, name, queryset)
|
||||
if self.queryset == None:
|
||||
self.queryset = SDOs.objects.all()
|
||||
|
||||
|
@ -153,16 +246,9 @@ class SDOEntityManager(IETFEntityManager):
|
|||
class IETFHierarchyManager(object):
|
||||
|
||||
def __init__(self):
|
||||
self.managers = {'ietf': IETFEntityManager(pk='ietf', name=u'The IETF',
|
||||
poc=FakePerson(**IETFCHAIR),
|
||||
cc=FakePerson(**IESG)),
|
||||
'iesg': IETFEntityManager(pk='iesg', name=u'The IESG',
|
||||
poc=FakePerson(**IETFCHAIR),
|
||||
cc=FakePerson(**IESG)),
|
||||
'iab': IETFEntityManager(pk='iab', name=u'The IAB',
|
||||
poc=[FakePerson(**IABCHAIR),
|
||||
FakePerson(**IABEXECUTIVEDIRECTOR)],
|
||||
cc=FakePerson(**IAB)),
|
||||
self.managers = {'ietf': IETFEntityManager(pk='ietf', name=u'The IETF'),
|
||||
'iesg': IETFEntityManager(pk='iesg', name=u'The IESG'),
|
||||
'iab': IABEntityManager(pk='iab', name=u'The IAB'),
|
||||
'area': AreaEntityManager(pk='area', name=u'IETF Areas'),
|
||||
'wg': WGEntityManager(pk='wg', name=u'IETF Working Groups'),
|
||||
'sdo': SDOEntityManager(pk='sdo', name=u'Standards Development Organizations'),
|
||||
|
@ -195,7 +281,22 @@ class IETFHierarchyManager(object):
|
|||
return entities
|
||||
|
||||
def get_all_outgoing_entities(self):
|
||||
entities = [(self.manager['sdo'].name, self.managers['sdo'].get_managed_list())]
|
||||
entities = [(self.managers['sdo'].name, self.managers['sdo'].get_managed_list())]
|
||||
return entities
|
||||
|
||||
def get_entities_for_person(self, person):
|
||||
entities = []
|
||||
results = []
|
||||
for key in ['ietf', 'iesg', 'iab']:
|
||||
results += self.managers[key].can_send_on_behalf(person)
|
||||
if results:
|
||||
entities.append(('Main IETF Entities', results))
|
||||
areas = self.managers['area'].can_send_on_behalf(person)
|
||||
if areas:
|
||||
entities.append(('IETF Areas', areas))
|
||||
wgs = self.managers['wg'].can_send_on_behalf(person)
|
||||
if wgs:
|
||||
entities.append(('IETF Working Groups', wgs))
|
||||
return entities
|
||||
|
||||
IETFHM = IETFHierarchyManager()
|
||||
|
|
|
@ -48,8 +48,8 @@ def get_poc_for_incoming(request):
|
|||
@can_submit_liaison
|
||||
def get_cc_for_incoming(request):
|
||||
entity_id = request.GET.get('to_entity_id', None)
|
||||
sdo_id = request.GET.get('sdo_id', None)
|
||||
if not entity_id and not sdo_id:
|
||||
from_entity_id = request.GET.get('from_entity_id', None)
|
||||
if not entity_id and not from_entity_id:
|
||||
result = {'cc': [], 'error': 'No entity id and no sdo id'}
|
||||
person = get_person_for_user(request.user)
|
||||
if entity_id:
|
||||
|
@ -58,8 +58,8 @@ def get_cc_for_incoming(request):
|
|||
result = {'cc': [], 'error': 'Invalid entity id'}
|
||||
else:
|
||||
result = {'error': False, 'cc': [i.email() for i in entity.get_cc()]}
|
||||
if sdo_id:
|
||||
from_entity = IETFHM.get_entity_by_key(sdo_id)
|
||||
if from_entity_id:
|
||||
from_entity = IETFHM.get_entity_by_key(from_entity_id)
|
||||
result['cc'] += [i.email() for i in from_entity.get_from_cc(person=person)]
|
||||
json_result = simplejson.dumps(result)
|
||||
return HttpResponse(json_result, mimetype='text/javascript')
|
||||
|
|
|
@ -6,7 +6,9 @@ class FromWidget(Select):
|
|||
|
||||
def render(self, name, value, attrs=None, choices=()):
|
||||
all_choices = list(self.choices) + list(choices)
|
||||
if len(all_choices)!=1:
|
||||
if len(all_choices)!=1 or \
|
||||
(isinstance(all_choices[0], (list, tuple)) and \
|
||||
len(all_choices[0][1])!=1):
|
||||
base = super(FromWidget, self).render(name, value, attrs, choices)
|
||||
else:
|
||||
base = u'<input type="hidden" value="%s" />%s' % all_choices[0]
|
||||
|
|
|
@ -166,7 +166,7 @@
|
|||
async: true,
|
||||
dataType: 'json',
|
||||
data: {to_entity_id: organization.val(),
|
||||
sdo_id: sdo.val()},
|
||||
from_entity_id: sdo.val()},
|
||||
success: function(response){
|
||||
if (!response.error) {
|
||||
render_mails_into(cc, response.cc);
|
||||
|
|
Loading…
Reference in a new issue