Skip to content

Commit d143d41

Browse files
committed
To enable to select 'none' area in wizard page of none-wg-mailinglists without any
modification of TABLE 'Area'(see Bill's comment in ticket:205), I add the classes in mailinglists module. * ietf/settings.py At first, add CONSTANT, CODE_AREA in ietf/mailinglists/__init__.py for global access. CODE_AREA = { "none" : "-100", } To keep the code stability of 'area_acronym_id' in TABLE 'none_wg_mailing_list', CODE_AREAOther? assigned -100. * ietf/mailinglists/forms.py add 'SelectWidgetArea', it just add psuedo choice in 'area' select input box. * ietf/mailinglists/models.py add new ForeignKey type 'ForeignKeyArea' to keep the existing deep form-model relations, so this new field type handles normal area value and 'none'. The class, 'NonWgMailingList' has some changes. To prevent 'DoesNotExist' Exception when fetching the real acronym from 'Acronym', add setattr method. It stores 'none' area value in /* cache */ and return it. * ietf/mailinglists/views.py In the last step of update wizard, split the routine to check whether the area code is 'none' or not. If 'none', the approval persons is fetched from 'Role'(TABLE 'chairs'). There is changes only in 'mailinglists' module, so I guess this works. - Legacy-Id: 952
1 parent b4ca9ca commit d143d41

4 files changed

Lines changed: 100 additions & 5 deletions

File tree

ietf/mailinglists/__init__.py

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

3+
# for area code for Non-WG-Mailinglists
4+
CODE_AREA = {
5+
"none" : "-100",
6+
}
7+

ietf/mailinglists/forms.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
from django import newforms as forms
44
from models import NonWgMailingList, ImportedMailingList
55
from ietf.idtracker.models import PersonOrOrgInfo, IETFWG
6+
from ietf.mailinglists import CODE_AREA
67
import re
78

89
class NonWgStep1(forms.Form):
@@ -220,3 +221,12 @@ def clean(self, value):
220221

221222
class ApprovalComment(forms.Form):
222223
add_comment = forms.CharField(label="Approver's comments to the requestor (will be emailed to the requestor)", widget=forms.Textarea(attrs={'cols':41, 'rows': 4}))
224+
225+
226+
class SelectWidgetArea (forms.Select) :
227+
def render(self, name, value, attrs=None, choices=()) :
228+
choices = ((CODE_AREA["none"], "none", ), )
229+
return super(SelectWidgetArea, self).render(name, value, attrs, choices)
230+
231+
232+

ietf/mailinglists/models.py

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

33
from django.db import models
4+
from django.db.models.fields.related import ManyToOneRel
5+
from django import newforms as forms
6+
from django.newforms import Field, util
7+
from django.utils.text import capfirst
8+
from django.utils.translation import gettext
9+
410
from ietf.idtracker.models import Acronym, Area, PersonOrOrgInfo
511
from ietf.idtracker.models import Role
12+
from ietf.mailinglists import CODE_AREA
13+
614
import random
715
from datetime import datetime
816

@@ -120,6 +128,48 @@ class Meta:
120128
class Admin:
121129
pass
122130

131+
class AreaPsuedo (object) :
132+
"""
133+
Psuedo class for Area model.
134+
This only works when add new NonWgMailingList entry.
135+
"""
136+
area_acronym = CODE_AREA["none"]
137+
area_acronym_id = CODE_AREA["none"]
138+
start_date = datetime.now()
139+
concluded_date = datetime.now()
140+
status = 1
141+
comments = str()
142+
last_modified_date = datetime.now()
143+
extra_email_addresses = str()
144+
145+
def __str__ (self) :
146+
return CODE_AREA["none"]
147+
148+
class ModelChoiceFieldArea (forms.ModelChoiceField) :
149+
def clean(self, value):
150+
Field.clean(self, value)
151+
if value in ('', None):
152+
return None
153+
154+
if value in CODE_AREA.values() :
155+
return AreaPsuedo()
156+
else :
157+
try:
158+
value = self.queryset.model._default_manager.get(pk=value)
159+
except self.queryset.model.DoesNotExist:
160+
raise util.ValidationError(gettext(u'Select a valid choice. That choice is not one of the available choices.'))
161+
162+
return value
163+
164+
165+
class ForeignKeyArea (models.ForeignKey) :
166+
167+
def formfield(self, **kwargs):
168+
defaults = {'queryset': self.rel.to._default_manager.all(), 'required': not self.blank, 'label': capfirst(self.verbose_name), 'help_text': self.help_text}
169+
defaults.update(kwargs)
170+
return ModelChoiceFieldArea(**defaults)
171+
172+
123173
class NonWgMailingList(models.Model):
124174
id = models.CharField(primary_key=True, maxlength=35)
125175
s_name = models.CharField("Submitter's Name", blank=True, maxlength=255)
@@ -128,7 +178,7 @@ class NonWgMailingList(models.Model):
128178
list_url = models.CharField("List URL", maxlength=255)
129179
admin = models.TextField("Administrator(s)' Email Address(es)", blank=True)
130180
purpose = models.TextField(blank=True)
131-
area = models.ForeignKey(Area, db_column='area_acronym_id')
181+
area = ForeignKeyArea(Area, db_column='area_acronym_id', null=True)
132182
subscribe_url = models.CharField("Subscribe URL", blank=True, maxlength=255)
133183
subscribe_other = models.TextField("Subscribe Other", blank=True)
134184
# Can be 0, 1, -1, or what looks like a person_or_org_tag, positive or neg.
@@ -152,6 +202,15 @@ def save(self, *args, **kwargs):
152202
def choices():
153203
return [(list.id, list.list_name) for list in NonWgMailingList.objects.all().filter(status__gt=0)]
154204
choices = staticmethod(choices)
205+
206+
def __setattr__ (self, name, value) :
207+
if name == "area_id" and str(value) in CODE_AREA.values() :
208+
for k, v in CODE_AREA.iteritems() :
209+
if v == str(value) :
210+
setattr(self, "_area_cache", k)
211+
212+
super(NonWgMailingList, self).__setattr__(name,value)
213+
155214
class Meta:
156215
db_table = 'none_wg_mailing_list'
157216
ordering = ['list_name']

ietf/mailinglists/views.py

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
# Copyright The IETF Trust 2007, All Rights Reserved
22

3-
from forms import NonWgStep1, ListReqStep1, PickApprover, DeletionPickApprover, UrlMultiWidget, Preview, ListReqAuthorized, ListReqClose, MultiEmailField, AdminRequestor, ApprovalComment, ListApprover
3+
from forms import NonWgStep1, ListReqStep1, PickApprover, DeletionPickApprover, UrlMultiWidget, Preview, ListReqAuthorized, ListReqClose, MultiEmailField, AdminRequestor, ApprovalComment, ListApprover, SelectWidgetArea
44
from models import NonWgMailingList, MailingList, Domain
5-
from ietf.idtracker.models import Area, PersonOrOrgInfo, AreaDirector, WGChair
5+
from ietf.idtracker.models import Area, PersonOrOrgInfo, AreaDirector, WGChair, Role
6+
from ietf.mailinglists import CODE_AREA
67
from django import newforms as forms
78
from django.shortcuts import get_object_or_404, render_to_response
89
from django.template import RequestContext
@@ -15,6 +16,12 @@
1516
def formchoice(form, field):
1617
if not(form.is_valid()):
1718
return None
19+
20+
if field == "area" and str(form.clean_data[field]) in CODE_AREA.values() :
21+
for k, v in CODE_AREA.iteritems() :
22+
if v == str(form.clean_data[field]) :
23+
return k
24+
1825
d = str(form.clean_data[field])
1926
for k, v in form.fields[field].choices:
2027
if str(k) == d:
@@ -49,6 +56,7 @@ def formchoice(form, field):
4956
'purpose': forms.Textarea(attrs = {'rows': 4, 'cols': 70}),
5057
'subscribe_url': UrlMultiWidget(choices=(('n/a', 'Not Applicable'), ('http://', 'http://'), ('https://', 'https://')), attrs = {'size': 50}),
5158
'subscribe_other': forms.Textarea(attrs = {'rows': 3, 'cols': 50}),
59+
'area' : SelectWidgetArea(),
5260
}
5361

5462
nonwg_querysets = {
@@ -103,15 +111,28 @@ def process_step(self, request, form, step):
103111
self.form_list.append(forms.form_for_instance(NonWgMailingList.objects.get(pk=form.clean_data['list_id']), formfield_callback=nonwg_callback))
104112
elif form.clean_data['add_edit'] == 'delete':
105113
list = NonWgMailingList.objects.get(pk=form.clean_data['list_id_delete'])
106-
self.form_list.append(gen_approval([ad.person_id for ad in list.area.areadirector_set.all()], DeletionPickApprover))
114+
if str(list.area_id) in CODE_AREA.values() :
115+
__list_persons = [r.person.person_or_org_tag for r in Role.objects.filter(role_name__in=("IETF", "IAB"))]
116+
else :
117+
__list_persons = [ad.person_id for ad in list.area.areadirector_set.all()]
118+
119+
self.form_list.append(gen_approval(__list_persons, DeletionPickApprover))
120+
107121
self.form_list.append(Preview)
108122
else:
109123
self.clean_forms.append(form)
110124
if step == 1:
111125
form0 = self.clean_forms[0]
112126
add_edit = form0.clean_data['add_edit']
113127
if add_edit == 'add' or add_edit == 'edit':
114-
self.form_list.append(gen_approval([ad.person_id for ad in Area.objects.get(area_acronym=form.clean_data['area']).areadirector_set.all()], PickApprover))
128+
# if area value is in CODE_AREA, approval person must be in 'IETF' and 'IAB'.
129+
if str(form.clean_data["area"]) in CODE_AREA.values() :
130+
__list_persons = [r.person.person_or_org_tag for r in Role.objects.filter(role_name__in=("IETF", "IAB"))]
131+
else :
132+
__list_persons = [ad.person_id for ad in Area.objects.get(area_acronym=form.clean_data['area']).areadirector_set.all()]
133+
134+
self.form_list.append(gen_approval(__list_persons, PickApprover))
135+
115136
self.form_list.append(Preview)
116137
super(NonWgWizard, self).process_step(request, form, step)
117138
def done(self, request, form_list):

0 commit comments

Comments
 (0)