diff --git a/ietf/liaisons/accounts.py b/ietf/liaisons/accounts.py index b6c31d33f..8492b019b 100644 --- a/ietf/liaisons/accounts.py +++ b/ietf/liaisons/accounts.py @@ -62,7 +62,8 @@ def can_add_outgoing_liaison(user): if (is_areadirector(person) or is_wgchair(person) or is_wgsecretary(person) or is_ietfchair(person) or - is_iabchair(person) or is_iab_executive_director(person)): + is_iabchair(person) or is_iab_executive_director(person) or + is_ietf_liaison_manager(user)): return True return False @@ -75,13 +76,18 @@ def is_sdo_authorized_individual(person): return bool(person.sdoauthorizedindividual_set.all()) +def is_ietf_liaison_manager(user): + return bool(user.groups.filter(name='Liaison_Manager')) + + def can_add_incoming_liaison(user): person = get_person_for_user(user) if not person: return False if (is_sdo_liaison_manager(person) or - is_sdo_authorized_individual(person)): + is_sdo_authorized_individual(person) or + is_ietf_liaison_manager(user)): return True return False diff --git a/ietf/liaisons/forms.py b/ietf/liaisons/forms.py index 632d129cb..8bc7fa8fa 100644 --- a/ietf/liaisons/forms.py +++ b/ietf/liaisons/forms.py @@ -5,8 +5,8 @@ from django.forms.util import ErrorList 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, OutgoingLiaisonApproval + get_person_for_user, is_ietf_liaison_manager) +from ietf.liaisons.models import LiaisonDetail, Uploads, OutgoingLiaisonApproval, SDOs from ietf.liaisons.utils import IETFHM from ietf.liaisons.widgets import (FromWidget, ReadOnlyWidget, ButtonWidget, ShowAttachmentsWidget) @@ -51,6 +51,7 @@ class LiaisonForm(forms.ModelForm): "/css/jquery-ui-themes/jquery-ui-1.8.2.custom.css")} def __init__(self, user, *args, **kwargs): + self.user = user self.person = get_person_for_user(user) if kwargs.get('data', None): kwargs['data'].update({'person': self.person.pk}) @@ -180,9 +181,12 @@ class LiaisonForm(forms.ModelForm): class IncomingLiaisonForm(LiaisonForm): def set_from_field(self): - 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) + if is_ietf_liaison_manager(self.user): + sdos = SDOs.objects.all() + else: + 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 = [('sdo_%s' % i.pk, i.sdo_name) for i in sdos] self.fields['from_field'].widget.submitter = unicode(self.person) @@ -204,7 +208,10 @@ class OutgoingLiaisonForm(LiaisonForm): return organization def set_from_field(self): - self.fields['from_field'].choices = self.hm.get_entities_for_person(self.person) + if is_ietf_liaison_manager(self.user): + self.fields['from_field'].choices = self.hm.get_all_incoming_entities() + else: + self.fields['from_field'].choices = self.hm.get_entities_for_person(self.person) self.fields['from_field'].widget.submitter = unicode(self.person) self.fieldsets[0] = ('From', ('from_field', 'replyto', 'approved')) @@ -239,8 +246,7 @@ class OutgoingLiaisonForm(LiaisonForm): approval_date = None approval = OutgoingLiaisonApproval.objects.create( approved = approved, - approval_date = approval_date, - normalized_entity_code = self.cleaned_data.get('from_field')) + approval_date = approval_date) liaison.approval = approval liaison.save() diff --git a/ietf/liaisons/migrations/0005_add_liaison_manager_group.py b/ietf/liaisons/migrations/0005_add_liaison_manager_group.py new file mode 100644 index 000000000..37fa0cc76 --- /dev/null +++ b/ietf/liaisons/migrations/0005_add_liaison_manager_group.py @@ -0,0 +1,114 @@ + +from south.db import db +from django.contrib.auth.models import Group +from django.db import models +from ietf.liaisons.models import * + +class Migration: + + def forwards(self, orm): + + # Adding Liaison_Manager user group + Group.objects.get_or_create(name=u'Liaison_Manager') + + + + def backwards(self, orm): + + pass + + + + models = { + 'idtracker.personororginfo': { + 'Meta': {'db_table': "'person_or_org_info'"}, + 'address_type': ('django.db.models.fields.CharField', [], {'max_length': '4', 'null': 'True', 'blank': 'True'}), + 'created_by': ('django.db.models.fields.CharField', [], {'max_length': '8', 'null': 'True', 'blank': 'True'}), + 'date_created': ('django.db.models.fields.DateField', [], {'auto_now_add': 'True', 'null': 'True', 'blank': 'True'}), + 'date_modified': ('django.db.models.fields.DateField', [], {'auto_now': 'True', 'null': 'True', 'blank': 'True'}), + 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '20', 'blank': 'True'}), + 'first_name_key': ('django.db.models.fields.CharField', [], {'max_length': '20', 'blank': 'True'}), + 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '50', 'blank': 'True'}), + 'last_name_key': ('django.db.models.fields.CharField', [], {'max_length': '50', 'blank': 'True'}), + 'middle_initial': ('django.db.models.fields.CharField', [], {'max_length': '4', 'null': 'True', 'blank': 'True'}), + 'middle_initial_key': ('django.db.models.fields.CharField', [], {'max_length': '4', 'null': 'True', 'blank': 'True'}), + 'modified_by': ('django.db.models.fields.CharField', [], {'max_length': '8', 'null': 'True', 'blank': 'True'}), + 'name_prefix': ('django.db.models.fields.CharField', [], {'max_length': '10', 'null': 'True', 'blank': 'True'}), + 'name_suffix': ('django.db.models.fields.CharField', [], {'max_length': '10', 'null': 'True', 'blank': 'True'}), + 'person_or_org_tag': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'record_type': ('django.db.models.fields.CharField', [], {'max_length': '8', 'null': 'True', 'blank': 'True'}) + }, + 'liaisons.frombodies': { + 'Meta': {'db_table': "'from_bodies'"}, + 'body_name': ('django.db.models.fields.CharField', [], {'max_length': '35', 'blank': 'True'}), + 'email_priority': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'from_id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_liaison_manager': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'other_sdo': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'poc': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['idtracker.PersonOrOrgInfo']", 'null': 'True', 'db_column': "'poc'"}) + }, + 'liaisons.liaisondetail': { + 'Meta': {'db_table': "'liaison_detail'"}, + 'approval': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['liaisons.OutgoingLiaisonApproval']", 'null': 'True', 'blank': 'True'}), + 'body': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'by_secretariat': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'cc1': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'cc2': ('django.db.models.fields.CharField', [], {'max_length': '50', 'null': 'True', 'blank': 'True'}), + 'deadline_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), + 'detail_id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'from_id': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'from_raw_body': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'from_raw_code': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'last_modified_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), + 'person': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['idtracker.PersonOrOrgInfo']", 'null': 'True', 'db_column': "'person_or_org_tag'"}), + 'purpose': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['liaisons.LiaisonPurpose']", 'null': 'True'}), + 'purpose_text': ('django.db.models.fields.TextField', [], {'null': 'True', 'db_column': "'purpose'", 'blank': 'True'}), + 'replyto': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'response_contact': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'submitted_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), + 'submitter_email': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'submitter_name': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'technical_contact': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'to_body': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'to_email': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'to_poc': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}) + }, + 'liaisons.liaisonmanagers': { + 'Meta': {'db_table': "'liaison_managers'"}, + 'email_priority': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'person': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['idtracker.PersonOrOrgInfo']", 'db_column': "'person_or_org_tag'"}), + 'sdo': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['liaisons.SDOs']"}) + }, + 'liaisons.liaisonpurpose': { + 'Meta': {'db_table': "'liaison_purpose'"}, + 'purpose_id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'purpose_text': ('django.db.models.fields.CharField', [], {'max_length': '50', 'blank': 'True'}) + }, + 'liaisons.outgoingliaisonapproval': { + 'approval_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), + 'approved': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}) + }, + 'liaisons.sdoauthorizedindividual': { + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'person': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['idtracker.PersonOrOrgInfo']", 'db_column': "'person_or_org_tag'"}), + 'sdo': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['liaisons.SDOs']"}) + }, + 'liaisons.sdos': { + 'Meta': {'db_table': "'sdos'"}, + 'sdo_id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'sdo_name': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}) + }, + 'liaisons.uploads': { + 'Meta': {'db_table': "'uploads'"}, + 'detail': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['liaisons.LiaisonDetail']"}), + 'file_extension': ('django.db.models.fields.CharField', [], {'max_length': '10', 'blank': 'True'}), + 'file_id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'file_title': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), + 'person': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['idtracker.PersonOrOrgInfo']", 'db_column': "'person_or_org_tag'"}) + } + } + + complete_apps = ['liaisons'] diff --git a/ietf/liaisons/views.py b/ietf/liaisons/views.py index d3a595f7b..6a94d7975 100644 --- a/ietf/liaisons/views.py +++ b/ietf/liaisons/views.py @@ -87,10 +87,12 @@ def liaison_list(request): user = request.user can_send_outgoing = can_add_outgoing_liaison(user) can_send_incoming = can_add_incoming_liaison(user) + can_approve = False person = get_person_for_user(request.user) - approval_codes = IETFHM.get_all_can_approve_codes(person) - can_approve = LiaisonDetail.objects.filter(approval__isnull=False, approval__approved=False, from_raw_code__in=approval_codes).count() + if person: + approval_codes = IETFHM.get_all_can_approve_codes(person) + can_approve = LiaisonDetail.objects.filter(approval__isnull=False, approval__approved=False, from_raw_code__in=approval_codes).count() public_liaisons = LiaisonDetail.objects.filter(Q(approval__isnull=True)|Q(approval__approved=True)).order_by("-submitted_date")