From eec8de1efe65247a238d07027b7608bca4b19ea5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20A=2E=20S=C3=A1nchez=20L=C3=B3pez?= Date: Fri, 23 Jul 2010 10:04:13 +0000 Subject: [PATCH] Save from of incoming liaisons. Manage CCs depending of sending entity. Fixes #345 - Legacy-Id: 2377 --- ietf/liaisons/forms.py | 18 ++++++++++----- ietf/liaisons/utils.py | 51 ++++++++++++++++++++++++++++++++++++++---- ietf/liaisons/views.py | 17 +++++--------- 3 files changed, 65 insertions(+), 21 deletions(-) diff --git a/ietf/liaisons/forms.py b/ietf/liaisons/forms.py index e2ff16907..bb5be72be 100644 --- a/ietf/liaisons/forms.py +++ b/ietf/liaisons/forms.py @@ -8,7 +8,7 @@ from django.template.loader import render_to_string from ietf.liaisons.accounts import (can_add_outgoing_liaison, can_add_incoming_liaison, get_person_for_user) from ietf.liaisons.models import LiaisonDetail, Uploads -from ietf.liaisons.utils import IETFHierarchyManager +from ietf.liaisons.utils import IETFHM from ietf.liaisons.widgets import (FromWidget, ReadOnlyWidget, ButtonWidget, ShowAttachmentsWidget) @@ -56,7 +56,7 @@ class LiaisonForm(forms.ModelForm): if kwargs.get('data', None): kwargs['data'].update({'person': self.person.pk}) super(LiaisonForm, self).__init__(*args, **kwargs) - self.hm = IETFHierarchyManager() + self.hm = IETFHM self.set_from_field() self.set_replyto_field() self.set_organization_field() @@ -123,7 +123,11 @@ class LiaisonForm(forms.ModelForm): self._errors['attachments'] = ErrorList([u'You must provide a body or attachment files']) return self.cleaned_data - def get_organization(self): + def get_from_entity(self): + organization_key = self.cleaned_data.get('from_field') + return self.hm.get_entity_by_key(organization_key) + + def get_to_entity(self): organization_key = self.cleaned_data.get('organization') return self.hm.get_entity_by_key(organization_key) @@ -132,7 +136,9 @@ class LiaisonForm(forms.ModelForm): liaison = super(LiaisonForm, self).save(*args, **kwargs) liaison.submitted_date = now liaison.last_modified_date = now - organization = self.get_organization() + from_entity = self.get_from_entity() + liaison.from_raw_body = from_entity.name + organization = self.get_to_entity() liaison.to_body = organization.name liaison.to_poc = ', '.join([i.email()[1] for i in organization.get_poc()]) liaison.submitter_name, liaison.submitter_email = self.person.email() @@ -166,11 +172,11 @@ class IncomingLiaisonForm(LiaisonForm): sdo_managed = [i.sdo for i in self.person.liaisonmanagers_set.all()] sdo_authorized = [i.sdo for i in self.person.sdoauthorizedindividual_set.all()] sdos = set(sdo_managed).union(sdo_authorized) - self.fields['from_field'].choices = [(i.pk, i.sdo_name) for i in sdos] + self.fields['from_field'].choices = [('sdo_%s' % i.pk, i.sdo_name) for i in sdos] self.fields['from_field'].widget.submitter = unicode(self.person) def set_organization_field(self): - self.fields['organization'].choices = self.hm.get_all_decorated_entities() + self.fields['organization'].choices = self.hm.get_all_incoming_entities() class OutgoingLiaisonForm(LiaisonForm): diff --git a/ietf/liaisons/utils.py b/ietf/liaisons/utils.py index c96c7f0fa..85d1d54ed 100644 --- a/ietf/liaisons/utils.py +++ b/ietf/liaisons/utils.py @@ -1,4 +1,5 @@ from ietf.idtracker.models import Area, IETFWG +from ietf.liaisons.models import SDOs IETFCHAIR = {'name': u'The IETF Chair', 'address': u'chair@ietf.org'} IESG = {'name': u'The IESG', 'address': u'iesg@ietf.org'} @@ -30,7 +31,7 @@ class IETFEntity(object): return [self.poc] return self.poc - def get_cc(self): + def get_cc(self, person=None): if not isinstance(self.cc, list): return [self.cc] return self.cc @@ -41,7 +42,7 @@ class AreaEntity(IETFEntity): def get_poc(self): return [i.person for i in self.obj.areadirector_set.all()] - def get_cc(self): + def get_cc(self, person=None): return [FakePerson(**IETFCHAIR)] @@ -50,7 +51,7 @@ class WGEntity(IETFEntity): def get_poc(self): return [i.person for i in self.obj.wgchair_set.all()] - def get_cc(self): + def get_cc(self, person=None): 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, @@ -58,6 +59,21 @@ class WGEntity(IETFEntity): return result +class SDOEntity(IETFEntity): + + def get_poc(self): + return [] + + def get_cc(self, person=None): + return [] + + def get_from_cc(self, person=None): + manager = self.obj.liaisonmanager() + if manager and manager.person!=person: + return [manager.person] + return [] + + class IETFEntityManager(object): def __init__(self, pk=None, name=None, queryset=None, poc=None, cc=None): @@ -114,6 +130,26 @@ class WGEntityManager(IETFEntityManager): return WGEntity(name=obj.group_acronym.name, obj=obj) +class SDOEntityManager(IETFEntityManager): + + def __init__(self, pk=None, name=None, queryset=None, poc=None): + super(SDOEntityManager, self).__init__(pk, name, queryset, poc) + if self.queryset == None: + self.queryset = SDOs.objects.all() + + def get_managed_list(self): + return [(u'%s_%s' % (self.pk, i.pk), i.sdo_name) for i in self.queryset.order_by('sdo_name')] + + def get_entity(self, pk=None): + if not pk: + return None + try: + obj = self.queryset.get(pk=pk) + except self.queryset.model.DoesNotExist: + return None + return SDOEntity(name=obj.sdo_name, obj=obj) + + class IETFHierarchyManager(object): def __init__(self): @@ -129,6 +165,7 @@ class IETFHierarchyManager(object): cc=FakePerson(**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'), } def get_entity_by_key(self, entity_id): @@ -147,7 +184,7 @@ class IETFHierarchyManager(object): entities += manager.get_managed_list() return entities - def get_all_decorated_entities(self): + def get_all_incoming_entities(self): entities = [] results = [] for key in ['ietf', 'iesg', 'iab']: @@ -156,3 +193,9 @@ class IETFHierarchyManager(object): entities.append(('IETF Areas', self.managers['area'].get_managed_list())) entities.append(('IETF Working Groups', self.managers['wg'].get_managed_list())) return entities + + def get_all_outgoing_entities(self): + entities = [(self.manager['sdo'].name, self.managers['sdo'].get_managed_list())] + return entities + +IETFHM = IETFHierarchyManager() diff --git a/ietf/liaisons/views.py b/ietf/liaisons/views.py index afa7b0fc2..7cd4df358 100644 --- a/ietf/liaisons/views.py +++ b/ietf/liaisons/views.py @@ -8,7 +8,7 @@ from ietf.liaisons.accounts import get_person_for_user from ietf.liaisons.decorators import can_submit_liaison from ietf.liaisons.forms import liaison_form_factory from ietf.liaisons.models import SDOs -from ietf.liaisons.utils import IETFHierarchyManager +from ietf.liaisons.utils import IETFHM @can_submit_liaison @@ -34,7 +34,7 @@ def get_poc_for_incoming(request): if not entity_id: result = {'poc': None, 'error': 'No entity id'} else: - entity = IETFHierarchyManager().get_entity_by_key(entity_id) + entity = IETFHM.get_entity_by_key(entity_id) if not entity: result = {'poc': None, 'error': 'Invalid entity id'} else: @@ -49,20 +49,15 @@ def get_cc_for_incoming(request): sdo_id = request.GET.get('sdo_id', None) if not entity_id and not sdo_id: result = {'cc': [], 'error': 'No entity id and no sdo id'} + person = get_person_for_user(request.user) if entity_id: - entity = IETFHierarchyManager().get_entity_by_key(entity_id) + entity = IETFHM.get_entity_by_key(entity_id) if not entity: result = {'cc': [], 'error': 'Invalid entity id'} else: result = {'error': False, 'cc': [i.email() for i in entity.get_cc()]} if sdo_id: - try: - sdo = SDOs.objects.get(pk=sdo_id) - manager = sdo.liaisonmanager() - person = get_person_for_user(request.user) - if manager and manager.person!=person: - result['cc'].append(manager.person.email()) - except SDOs.DoesNotExist: - result['error']='Invalid sdo id' + from_entity = IETFHM.get_entity_by_key(sdo_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')