Skip to content

Commit 58988ef

Browse files
committed
Save approval state of an outgoing liaison and do not public list the not approved ones. Fixes ietf-tools#353
- Legacy-Id: 2456
1 parent 1a2f155 commit 58988ef

5 files changed

Lines changed: 158 additions & 6 deletions

File tree

ietf/liaisons/forms.py

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
from ietf.liaisons.accounts import (can_add_outgoing_liaison, can_add_incoming_liaison,
99
get_person_for_user)
10-
from ietf.liaisons.models import LiaisonDetail, Uploads
10+
from ietf.liaisons.models import LiaisonDetail, Uploads, OutgoingLiaisonApproval
1111
from ietf.liaisons.utils import IETFHM
1212
from ietf.liaisons.widgets import (FromWidget, ReadOnlyWidget, ButtonWidget,
1313
ShowAttachmentsWidget)
@@ -153,6 +153,7 @@ def save(self, *args, **kwargs):
153153
liaison.cc1 = self.get_cc(from_entity, organization)
154154
liaison.save()
155155
self.save_attachments(liaison)
156+
return liaison
156157

157158
def save_attachments(self, instance):
158159
for key in self.files.keys():
@@ -190,7 +191,7 @@ def set_organization_field(self):
190191
class OutgoingLiaisonForm(LiaisonForm):
191192

192193
to_poc = forms.CharField(label="POC", required=True)
193-
approval = forms.BooleanField(label="Obtained prior approval", required=False)
194+
approved = forms.BooleanField(label="Obtained prior approval", required=False)
194195
other_organization = forms.CharField(label="Other SDO", required=True)
195196

196197
def get_to_entity(self):
@@ -203,7 +204,7 @@ def get_to_entity(self):
203204
def set_from_field(self):
204205
self.fields['from_field'].choices = self.hm.get_entities_for_person(self.person)
205206
self.fields['from_field'].widget.submitter = unicode(self.person)
206-
self.fieldsets[0] = ('From', ('from_field', 'replyto', 'approval'))
207+
self.fieldsets[0] = ('From', ('from_field', 'replyto', 'approved'))
207208

208209
def set_organization_field(self):
209210
self.fields['organization'].choices = self.hm.get_all_outgoing_entities()
@@ -224,6 +225,23 @@ def reset_required_fields(self):
224225
def get_poc(self, organization):
225226
return self.cleaned_data['to_poc']
226227

228+
def save(self, *args, **kwargs):
229+
liaison = super(OutgoingLiaisonForm, self).save(*args, **kwargs)
230+
from_entity = self.get_from_entity()
231+
needs_approval = from_entity.needs_approval(self.person)
232+
if not needs_approval or self.cleaned_data.get('approved', False):
233+
approved = True
234+
approval_date = datetime.datetime.now()
235+
else:
236+
approved = False
237+
approval_date = None
238+
approval = OutgoingLiaisonApproval.objects.create(
239+
approved = approved,
240+
approval_date = approval_date,
241+
normalized_entity_code = self.cleaned_data.get('from_field'))
242+
liaison.approval = approval
243+
liaison.save()
244+
227245

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

ietf/liaisons/models.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,13 @@ class Meta:
2626
verbose_name = "From body"
2727
verbose_name_plural = "From bodies"
2828

29+
30+
class OutgoingLiaisonApproval(models.Model):
31+
approved = models.BooleanField(default=True)
32+
approval_date = models.DateField(null=True, blank=True)
33+
normalized_entity_code = models.CharField(max_length=255)
34+
35+
2936
class LiaisonDetail(models.Model):
3037
detail_id = models.AutoField(primary_key=True)
3138
person = models.ForeignKey(PersonOrOrgInfo, null=True, db_column='person_or_org_tag')
@@ -51,6 +58,7 @@ class LiaisonDetail(models.Model):
5158
purpose = models.ForeignKey(LiaisonPurpose,null=True)
5259
replyto = models.CharField(blank=True, null=True, max_length=255)
5360
from_raw_body = models.CharField(blank=True, null=True, max_length=255)
61+
approval = models.ForeignKey(OutgoingLiaisonApproval, blank=True, null=True)
5462
def __str__(self):
5563
return self.title or "<no title>"
5664
def from_body(self):

ietf/liaisons/urls.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
# Copyright The IETF Trust 2007, All Rights Reserved
22

33
from django.conf.urls.defaults import patterns, url
4+
from django.db.models import Q
45
from ietf.liaisons.models import LiaisonDetail
56

67
info_dict = {
7-
'queryset': LiaisonDetail.objects.all().order_by("-submitted_date"),
8+
'queryset': LiaisonDetail.objects.filter(Q(approval__isnull=True)|Q(approval__approved=True)).order_by("-submitted_date"),
89
}
910

1011
# there's an opportunity for date-based filtering.

static/js/liaisons.js

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@
120120
var other_purpose = form.find('#id_purpose_text');
121121
var deadline = form.find('#id_deadline_date');
122122
var other_organization = form.find('#id_other_organization');
123-
var approval = form.find('#id_approval');
123+
var approval = form.find('#id_approved');
124124
var config = {};
125125

126126
var readConfig = function() {
@@ -211,7 +211,6 @@
211211
};
212212

213213
var initTriggers = function() {
214-
organization.change(updateInfo);
215214
organization.change(updateInfo);
216215
organization.change(checkOtherSDO);
217216
from.change(updateInfo);

0 commit comments

Comments
 (0)