From 58988ef63e7de7fee9cfeefda18943b271dcb020 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20A=2E=20S=C3=A1nchez=20L=C3=B3pez?= Date: Thu, 29 Jul 2010 11:48:49 +0000 Subject: [PATCH] Save approval state of an outgoing liaison and do not public list the not approved ones. Fixes #353 - Legacy-Id: 2456 --- ietf/liaisons/forms.py | 24 +++- .../0003_add_outgoing_liaison_approval.py | 126 ++++++++++++++++++ ietf/liaisons/models.py | 8 ++ ietf/liaisons/urls.py | 3 +- static/js/liaisons.js | 3 +- 5 files changed, 158 insertions(+), 6 deletions(-) create mode 100644 ietf/liaisons/migrations/0003_add_outgoing_liaison_approval.py diff --git a/ietf/liaisons/forms.py b/ietf/liaisons/forms.py index ddd883621..73c99bb05 100644 --- a/ietf/liaisons/forms.py +++ b/ietf/liaisons/forms.py @@ -7,7 +7,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.models import LiaisonDetail, Uploads, OutgoingLiaisonApproval from ietf.liaisons.utils import IETFHM from ietf.liaisons.widgets import (FromWidget, ReadOnlyWidget, ButtonWidget, ShowAttachmentsWidget) @@ -153,6 +153,7 @@ class LiaisonForm(forms.ModelForm): liaison.cc1 = self.get_cc(from_entity, organization) liaison.save() self.save_attachments(liaison) + return liaison def save_attachments(self, instance): for key in self.files.keys(): @@ -190,7 +191,7 @@ class IncomingLiaisonForm(LiaisonForm): class OutgoingLiaisonForm(LiaisonForm): to_poc = forms.CharField(label="POC", required=True) - approval = forms.BooleanField(label="Obtained prior approval", required=False) + approved = forms.BooleanField(label="Obtained prior approval", required=False) other_organization = forms.CharField(label="Other SDO", required=True) def get_to_entity(self): @@ -203,7 +204,7 @@ class OutgoingLiaisonForm(LiaisonForm): def set_from_field(self): 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', 'approval')) + self.fieldsets[0] = ('From', ('from_field', 'replyto', 'approved')) def set_organization_field(self): self.fields['organization'].choices = self.hm.get_all_outgoing_entities() @@ -224,6 +225,23 @@ class OutgoingLiaisonForm(LiaisonForm): def get_poc(self, organization): return self.cleaned_data['to_poc'] + def save(self, *args, **kwargs): + liaison = super(OutgoingLiaisonForm, self).save(*args, **kwargs) + from_entity = self.get_from_entity() + needs_approval = from_entity.needs_approval(self.person) + if not needs_approval or self.cleaned_data.get('approved', False): + approved = True + approval_date = datetime.datetime.now() + else: + approved = False + approval_date = None + approval = OutgoingLiaisonApproval.objects.create( + approved = approved, + approval_date = approval_date, + normalized_entity_code = self.cleaned_data.get('from_field')) + liaison.approval = approval + liaison.save() + def liaison_form_factory(request, **kwargs): user = request.user diff --git a/ietf/liaisons/migrations/0003_add_outgoing_liaison_approval.py b/ietf/liaisons/migrations/0003_add_outgoing_liaison_approval.py new file mode 100644 index 000000000..82eda93d2 --- /dev/null +++ b/ietf/liaisons/migrations/0003_add_outgoing_liaison_approval.py @@ -0,0 +1,126 @@ + +from south.db import db +from django.db import models +from ietf.liaisons.models import * + +class Migration: + + def forwards(self, orm): + + # Adding model 'OutgoingLiaisonApproval' + db.create_table('liaisons_outgoingliaisonapproval', ( + ('id', orm['liaisons.outgoingliaisonapproval:id']), + ('approved', orm['liaisons.outgoingliaisonapproval:approved']), + ('approval_date', orm['liaisons.outgoingliaisonapproval:approval_date']), + ('normalized_entity_code', orm['liaisons.outgoingliaisonapproval:normalized_entity_code']), + )) + db.send_create_signal('liaisons', ['OutgoingLiaisonApproval']) + + # Adding field 'LiaisonDetail.approval' + db.add_column('liaison_detail', 'approval', orm['liaisons.liaisondetail:approval']) + + + + def backwards(self, orm): + + # Deleting model 'OutgoingLiaisonApproval' + db.delete_table('liaisons_outgoingliaisonapproval') + + # Deleting field 'LiaisonDetail.approval' + db.delete_column('liaison_detail', 'approval_id') + + + + 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'}), + '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'}), + 'normalized_entity_code': ('django.db.models.fields.CharField', [], {'max_length': '255'}) + }, + '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/models.py b/ietf/liaisons/models.py index 1b3f3deff..b98a08a1a 100644 --- a/ietf/liaisons/models.py +++ b/ietf/liaisons/models.py @@ -26,6 +26,13 @@ class FromBodies(models.Model): verbose_name = "From body" verbose_name_plural = "From bodies" + +class OutgoingLiaisonApproval(models.Model): + approved = models.BooleanField(default=True) + approval_date = models.DateField(null=True, blank=True) + normalized_entity_code = models.CharField(max_length=255) + + class LiaisonDetail(models.Model): detail_id = models.AutoField(primary_key=True) person = models.ForeignKey(PersonOrOrgInfo, null=True, db_column='person_or_org_tag') @@ -51,6 +58,7 @@ class LiaisonDetail(models.Model): purpose = models.ForeignKey(LiaisonPurpose,null=True) replyto = models.CharField(blank=True, null=True, max_length=255) from_raw_body = models.CharField(blank=True, null=True, max_length=255) + approval = models.ForeignKey(OutgoingLiaisonApproval, blank=True, null=True) def __str__(self): return self.title or "" def from_body(self): diff --git a/ietf/liaisons/urls.py b/ietf/liaisons/urls.py index 5162104dc..fc91b8b26 100644 --- a/ietf/liaisons/urls.py +++ b/ietf/liaisons/urls.py @@ -1,10 +1,11 @@ # Copyright The IETF Trust 2007, All Rights Reserved from django.conf.urls.defaults import patterns, url +from django.db.models import Q from ietf.liaisons.models import LiaisonDetail info_dict = { - 'queryset': LiaisonDetail.objects.all().order_by("-submitted_date"), + 'queryset': LiaisonDetail.objects.filter(Q(approval__isnull=True)|Q(approval__approved=True)).order_by("-submitted_date"), } # there's an opportunity for date-based filtering. diff --git a/static/js/liaisons.js b/static/js/liaisons.js index d9c14f576..eff969b6e 100644 --- a/static/js/liaisons.js +++ b/static/js/liaisons.js @@ -120,7 +120,7 @@ var other_purpose = form.find('#id_purpose_text'); var deadline = form.find('#id_deadline_date'); var other_organization = form.find('#id_other_organization'); - var approval = form.find('#id_approval'); + var approval = form.find('#id_approved'); var config = {}; var readConfig = function() { @@ -211,7 +211,6 @@ }; var initTriggers = function() { - organization.change(updateInfo); organization.change(updateInfo); organization.change(checkOtherSDO); from.change(updateInfo);