Skip to content

Commit e6a49e0

Browse files
committed
Modified public_key field in the NomCom model to be not required. The chair will set the public_key after the NomCom object creation.
Added default templates for nomcom application. Duplicate default templates when creating a new NomCom object or a new Position object. Fixes ietf-tools#906 - Legacy-Id: 5099
1 parent a34fbba commit e6a49e0

4 files changed

Lines changed: 162 additions & 12 deletions

File tree

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<django-objects version="1.0">
3+
<object pk="1" model="dbtemplate.dbtemplate">
4+
<field type="CharField" name="path">/nomcom/defaults/home.rst</field>
5+
<field type="CharField" name="title">Home page of group</field>
6+
<field type="TextField" name="variables"></field>
7+
<field to="name.dbtemplatetypename" name="type" rel="ManyToOneRel">rst</field>
8+
<field type="TextField" name="content">Home page
9+
=========
10+
11+
This is the home page of the nomcom group.</field>
12+
<field to="group.group" name="group" rel="ManyToOneRel"><None></None></field>
13+
</object>
14+
<object pk="2" model="dbtemplate.dbtemplate">
15+
<field type="CharField" name="path">/nomcom/defaults/email/inexistent_person.txt</field>
16+
<field type="CharField" name="title">Email sent to chair of nomcom and secretariat when Email and Person are created if some of them don't exist</field>
17+
<field type="TextField" name="variables">$email: Newly created email
18+
$fullname: Fullname of the new person
19+
$person_id: Id of the new Person object
20+
$group: Name of the group</field>
21+
<field to="name.dbtemplatetypename" name="type" rel="ManyToOneRel">plain</field>
22+
<field type="TextField" name="content">Hello,
23+
24+
A new person with name $fullname and email $email has been created. The new Person object has the following id: '$i'.
25+
26+
Please, check if there is some more action nedeed.</field>
27+
<field to="group.group" name="group" rel="ManyToOneRel"><None></None></field>
28+
</object>
29+
<object pk="3" model="dbtemplate.dbtemplate">
30+
<field type="CharField" name="path">/nomcom/defaults/email/new_nominee.txt</field>
31+
<field type="CharField" name="title">Email sent to nominees when they are nominated</field>
32+
<field type="TextField" name="variables">$nominee: Full name of the nominee
33+
$position: Name of the position</field>
34+
<field to="name.dbtemplatetypename" name="type" rel="ManyToOneRel">plain</field>
35+
<field type="TextField" name="content">Hello $nominee.
36+
37+
You have been nominated for $position.</field>
38+
<field to="group.group" name="group" rel="ManyToOneRel"><None></None></field>
39+
</object>
40+
<object pk="4" model="dbtemplate.dbtemplate">
41+
<field type="CharField" name="path">/nomcom/defaults/email/new_nomination.txt</field>
42+
<field type="CharField" name="title">Email sent to nominators and secretariat when the nominators make the nominations</field>
43+
<field type="TextField" name="variables">$nominator: Full name of the nominator
44+
$email: Email of the nominator
45+
$nominee: Full name of the nominee
46+
$nominee_email: Email of the nominee
47+
$position: Nomination position</field>
48+
<field to="name.dbtemplatetypename" name="type" rel="ManyToOneRel">plain</field>
49+
<field type="TextField" name="content">A new nomination have been received.
50+
51+
Nominator: $nominator &lt;$email&gt;
52+
Nominee: $nominee &lt;$email&gt;
53+
Position: $position</field>
54+
<field to="group.group" name="group" rel="ManyToOneRel"><None></None></field>
55+
</object>
56+
<object pk="5" model="dbtemplate.dbtemplate">
57+
<field type="CharField" name="path">/nomcom/defaults/position/questionnaire.txt</field>
58+
<field type="CharField" name="title">Questionnaire sent to the nomine</field>
59+
<field type="TextField" name="variables">$nominee: Full name of the nomine
60+
$position: Position</field>
61+
<field to="name.dbtemplatetypename" name="type" rel="ManyToOneRel">plain</field>
62+
<field type="TextField" name="content">Hi $nominee, please fill this questionnaire for the position $position:
63+
64+
Questionnaire</field>
65+
<field to="group.group" name="group" rel="ManyToOneRel"><None></None></field>
66+
</object>
67+
<object pk="6" model="dbtemplate.dbtemplate">
68+
<field type="CharField" name="path">/nomcom/defaults/position/requirements.txt</field>
69+
<field type="CharField" name="title">Position requirements</field>
70+
<field type="TextField" name="variables">$position: Position</field>
71+
<field to="name.dbtemplatetypename" name="type" rel="ManyToOneRel">plain</field>
72+
<field type="TextField" name="content">These are the requirements for the position $position:
73+
74+
Requirements.</field>
75+
<field to="group.group" name="group" rel="ManyToOneRel"><None></None></field>
76+
</object>
77+
</django-objects>

ietf/nomcom/migrations/0001_initial.py

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ def forwards(self, orm):
1111
# Adding model 'NomCom'
1212
db.create_table('nomcom_nomcom', (
1313
('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
14-
('public_key', self.gf('django.db.models.fields.files.FileField')(max_length=100)),
14+
('public_key', self.gf('django.db.models.fields.files.FileField')(max_length=100, null=True, blank=True)),
1515
('group', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['group.Group'])),
1616
('send_questionnaire', self.gf('django.db.models.fields.BooleanField')(default=False)),
1717
))
@@ -65,8 +65,8 @@ def forwards(self, orm):
6565
('name', self.gf('django.db.models.fields.CharField')(max_length=255)),
6666
('description', self.gf('django.db.models.fields.TextField')()),
6767
('initial_text', self.gf('django.db.models.fields.TextField')(blank=True)),
68-
('requirement', self.gf('django.db.models.fields.related.ForeignKey')(related_name='requirement', to=orm['dbtemplate.DBTemplate'])),
69-
('questionnaire', self.gf('django.db.models.fields.related.ForeignKey')(related_name='questionnaire', to=orm['dbtemplate.DBTemplate'])),
68+
('requirement', self.gf('django.db.models.fields.related.ForeignKey')(related_name='requirement', null=True, to=orm['dbtemplate.DBTemplate'])),
69+
('questionnaire', self.gf('django.db.models.fields.related.ForeignKey')(related_name='questionnaire', null=True, to=orm['dbtemplate.DBTemplate'])),
7070
('is_open', self.gf('django.db.models.fields.BooleanField')(default=False)),
7171
('incumbent', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['person.Email'])),
7272
))
@@ -151,11 +151,11 @@ def backwards(self, orm):
151151
'Meta': {'object_name': 'DBTemplate'},
152152
'content': ('django.db.models.fields.TextField', [], {}),
153153
'group': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['group.Group']", 'null': 'True', 'blank': 'True'}),
154-
'help_text': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
155154
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
156155
'path': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
157-
'template_type': ('django.db.models.fields.CharField', [], {'default': "'rst'", 'max_length': '10'}),
158-
'title': ('django.db.models.fields.CharField', [], {'max_length': '255'})
156+
'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
157+
'type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['name.DBTemplateTypeName']"}),
158+
'variables': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'})
159159
},
160160
'doc.docalias': {
161161
'Meta': {'object_name': 'DocAlias'},
@@ -237,6 +237,14 @@ def backwards(self, orm):
237237
'unused_states': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['doc.State']", 'symmetrical': 'False', 'blank': 'True'}),
238238
'unused_tags': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['name.DocTagName']", 'symmetrical': 'False', 'blank': 'True'})
239239
},
240+
'name.dbtemplatetypename': {
241+
'Meta': {'ordering': "['order']", 'object_name': 'DBTemplateTypeName'},
242+
'desc': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
243+
'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
244+
'order': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
245+
'slug': ('django.db.models.fields.CharField', [], {'max_length': '8', 'primary_key': 'True'}),
246+
'used': ('django.db.models.fields.BooleanField', [], {'default': 'True'})
247+
},
240248
'name.docrelationshipname': {
241249
'Meta': {'ordering': "['order']", 'object_name': 'DocRelationshipName'},
242250
'desc': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
@@ -331,7 +339,7 @@ def backwards(self, orm):
331339
'Meta': {'object_name': 'NomCom'},
332340
'group': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['group.Group']"}),
333341
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
334-
'public_key': ('django.db.models.fields.files.FileField', [], {'max_length': '100'}),
342+
'public_key': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}),
335343
'send_questionnaire': ('django.db.models.fields.BooleanField', [], {'default': 'False'})
336344
},
337345
'nomcom.nomination': {
@@ -369,8 +377,8 @@ def backwards(self, orm):
369377
'is_open': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
370378
'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
371379
'nomcom': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['nomcom.NomCom']"}),
372-
'questionnaire': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'questionnaire'", 'to': "orm['dbtemplate.DBTemplate']"}),
373-
'requirement': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'requirement'", 'to': "orm['dbtemplate.DBTemplate']"})
380+
'questionnaire': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'questionnaire'", 'null': 'True', 'to': "orm['dbtemplate.DBTemplate']"}),
381+
'requirement': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'requirement'", 'null': 'True', 'to': "orm['dbtemplate.DBTemplate']"})
374382
},
375383
'person.email': {
376384
'Meta': {'object_name': 'Email'},

ietf/nomcom/models.py

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,18 @@
1212
from ietf.name.models import NomineePositionState, FeedbackType
1313
from ietf.dbtemplate.models import DBTemplate
1414

15+
from ietf.nomcom.utils import (initialize_templates_for_group,
16+
initialize_questionnaire_for_position,
17+
initialize_requirements_for_position)
18+
1519

1620
def upload_path_handler(instance, filename):
1721
return os.path.join(instance.group.acronym, filename)
1822

1923

2024
class NomCom(models.Model):
2125
public_key = models.FileField(storage=FileSystemStorage(location=settings.PUBLIC_KEYS_URL),
22-
upload_to=upload_path_handler)
26+
upload_to=upload_path_handler, blank=True, null=True)
2327

2428
group = models.ForeignKey(Group)
2529
send_questionnaire = models.BooleanField(verbose_name='Send automatically questionnaires"',
@@ -32,6 +36,11 @@ class Meta:
3236
def __unicode__(self):
3337
return self.group.acronym
3438

39+
def save(self, *args, **kwargs):
40+
created = not self.id
41+
super(NomCom, self).save(*args, **kwargs)
42+
if created:
43+
initialize_templates_for_group(self)
3544

3645
class Nomination(models.Model):
3746
position = models.ForeignKey('Position')
@@ -86,8 +95,8 @@ class Position(models.Model):
8695
description = models.TextField(verbose_name='Despcription')
8796
initial_text = models.TextField(verbose_name='Initial text for nominations',
8897
blank=True)
89-
requirement = models.ForeignKey(DBTemplate, related_name='requirement')
90-
questionnaire = models.ForeignKey(DBTemplate, related_name='questionnaire')
98+
requirement = models.ForeignKey(DBTemplate, related_name='requirement', null=True)
99+
questionnaire = models.ForeignKey(DBTemplate, related_name='questionnaire', null=True)
91100
is_open = models.BooleanField(verbose_name='Is open')
92101
incumbent = models.ForeignKey(Email)
93102

@@ -97,6 +106,19 @@ class Meta:
97106
def __unicode__(self):
98107
return u"%s: %s" % (self.nomcom, self.name)
99108

109+
def save(self, *args, **kwargs):
110+
created = not self.id
111+
super(Position, self).save(*args, **kwargs)
112+
changed = False
113+
if created and self.id and not self.requirement_id:
114+
self.requirement = initialize_requirements_for_position(self)
115+
changed = True
116+
if created and self.id and not self.questionnaire_id:
117+
self.questionnaire = initialize_questionnaire_for_position(self)
118+
changed = True
119+
if changed:
120+
self.save()
121+
100122

101123
class Feedback(models.Model):
102124
author = models.EmailField(verbose_name='Author')

ietf/nomcom/utils.py

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
from ietf.dbtemplate.models import DBTemplate
2+
3+
MAIN_NOMCOM_TEMPLATE_PATH = '/nomcom/defaults/'
4+
DEFAULT_NOMCOM_TEMPLATES = 'home.rst', 'email/inexistent_person.txt', 'email/new_nomination.txt', 'email/new_nominee.txt'
5+
DEFAULT_QUESTIONNAIRE_TEMPLATE = 'position/questionnaire.txt'
6+
DEFAULT_REQUIREMENTS_TEMPLATE = 'position/requirements.txt'
7+
8+
9+
def initialize_templates_for_group(group):
10+
for template_name in DEFAULT_NOMCOM_TEMPLATES:
11+
template_path = MAIN_NOMCOM_TEMPLATE_PATH + template_name
12+
template = DBTemplate.objects.get(path=template_path)
13+
DBTemplate.objects.create(
14+
group=group.group,
15+
title=template.title,
16+
path='/nomcom/' + group.group.acronym + '/' + template_name,
17+
variables=template.variables,
18+
type_id=template.type_id,
19+
content=template.content)
20+
21+
22+
def initialize_questionnaire_for_position(position):
23+
questionnaire_path = MAIN_NOMCOM_TEMPLATE_PATH + DEFAULT_QUESTIONNAIRE_TEMPLATE
24+
template = DBTemplate.objects.get(path=questionnaire_path)
25+
return DBTemplate.objects.create(
26+
group=position.nomcom.group,
27+
title=template.title + '[%s]' % position.name,
28+
path='/nomcom/' + position.nomcom.group.acronym + '/' + str(position.id) + '/' + DEFAULT_QUESTIONNAIRE_TEMPLATE,
29+
variables=template.variables,
30+
type_id=template.type_id,
31+
content=template.content)
32+
33+
34+
def initialize_requirements_for_position(position):
35+
requirements_path = MAIN_NOMCOM_TEMPLATE_PATH + DEFAULT_REQUIREMENTS_TEMPLATE
36+
template = DBTemplate.objects.get(path=requirements_path)
37+
return DBTemplate.objects.create(
38+
group=position.nomcom.group,
39+
title=template.title + '[%s]' % position.name,
40+
path='/nomcom/' + position.nomcom.group.acronym + '/' + str(position.id) + '/' + DEFAULT_REQUIREMENTS_TEMPLATE,
41+
variables=template.variables,
42+
type_id=template.type_id,
43+
content=template.content)

0 commit comments

Comments
 (0)