Update ticket 205

* remove clutter from previous commit

  * if we get rid of 'none' from the drop down and use '--------' instead, then we can even remove LooseModelChoiceField and simply use django's ModelChoiceField. However, it may be confused in user's perspective.
 - Legacy-Id: 953
This commit is contained in:
Michael Lee 2007-10-16 06:33:23 +00:00
parent d143d41653
commit 463182dd3f
4 changed files with 53 additions and 97 deletions

View file

@ -1,7 +1,2 @@
# Copyright The IETF Trust 2007, All Rights Reserved
# for area code for Non-WG-Mailinglists
CODE_AREA = {
"none" : "-100",
}

View file

@ -1,9 +1,10 @@
# Copyright The IETF Trust 2007, All Rights Reserved
from django import newforms as forms
from django.newforms.models import QuerySetIterator, ModelChoiceField
from django.newforms.fields import Field
from models import NonWgMailingList, ImportedMailingList
from ietf.idtracker.models import PersonOrOrgInfo, IETFWG
from ietf.mailinglists import CODE_AREA
import re
class NonWgStep1(forms.Form):
@ -222,11 +223,34 @@ class MultiEmailField(forms.CharField):
class ApprovalComment(forms.Form):
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}))
class LooseModelChoiceField (ModelChoiceField) :
def __init__(self, queryset, empty_label=u"---------", cache_choices=False,
required=True, widget=forms.Select, label=None, initial=None,
help_text=None):
class SelectWidgetArea (forms.Select) :
def render(self, name, value, attrs=None, choices=()) :
choices = ((CODE_AREA["none"], "none", ), )
return super(SelectWidgetArea, self).render(name, value, attrs, choices)
super(LooseModelChoiceField, self).__init__(queryset, empty_label, cache_choices, required, widget, label, initial, help_text)
def _get_choices(self):
return [i for i in super(LooseModelChoiceField, self)._get_choices()] + [("none", "none", )]
def _set_choices (self, value) :
return super(LooseModelChoiceField, self)._set_choices(value)
choices = property(_get_choices, _set_choices)
def clean(self, value):
Field.clean(self, value)
if value in ('', None):
return None
if value == "none" :
return value
try:
value = self.queryset.model._default_manager.get(pk=value)
except self.queryset.model.DoesNotExist:
raise ValidationError(gettext(u'Select a valid choice. That choice is not one of the available choices.'))
return value

View file

@ -1,16 +1,8 @@
# Copyright The IETF Trust 2007, All Rights Reserved
from django.db import models
from django.db.models.fields.related import ManyToOneRel
from django import newforms as forms
from django.newforms import Field, util
from django.utils.text import capfirst
from django.utils.translation import gettext
from ietf.idtracker.models import Acronym, Area, PersonOrOrgInfo
from ietf.idtracker.models import Role
from ietf.mailinglists import CODE_AREA
import random
from datetime import datetime
@ -128,48 +120,6 @@ class MailingList(models.Model):
class Admin:
pass
class AreaPsuedo (object) :
"""
Psuedo class for Area model.
This only works when add new NonWgMailingList entry.
"""
area_acronym = CODE_AREA["none"]
area_acronym_id = CODE_AREA["none"]
start_date = datetime.now()
concluded_date = datetime.now()
status = 1
comments = str()
last_modified_date = datetime.now()
extra_email_addresses = str()
def __str__ (self) :
return CODE_AREA["none"]
class ModelChoiceFieldArea (forms.ModelChoiceField) :
def clean(self, value):
Field.clean(self, value)
if value in ('', None):
return None
if value in CODE_AREA.values() :
return AreaPsuedo()
else :
try:
value = self.queryset.model._default_manager.get(pk=value)
except self.queryset.model.DoesNotExist:
raise util.ValidationError(gettext(u'Select a valid choice. That choice is not one of the available choices.'))
return value
class ForeignKeyArea (models.ForeignKey) :
def formfield(self, **kwargs):
defaults = {'queryset': self.rel.to._default_manager.all(), 'required': not self.blank, 'label': capfirst(self.verbose_name), 'help_text': self.help_text}
defaults.update(kwargs)
return ModelChoiceFieldArea(**defaults)
class NonWgMailingList(models.Model):
id = models.CharField(primary_key=True, maxlength=35)
s_name = models.CharField("Submitter's Name", blank=True, maxlength=255)
@ -178,7 +128,7 @@ class NonWgMailingList(models.Model):
list_url = models.CharField("List URL", maxlength=255)
admin = models.TextField("Administrator(s)' Email Address(es)", blank=True)
purpose = models.TextField(blank=True)
area = ForeignKeyArea(Area, db_column='area_acronym_id', null=True)
area = models.ForeignKey(Area, db_column='area_acronym_id', null=True)
subscribe_url = models.CharField("Subscribe URL", blank=True, maxlength=255)
subscribe_other = models.TextField("Subscribe Other", blank=True)
# Can be 0, 1, -1, or what looks like a person_or_org_tag, positive or neg.
@ -202,15 +152,6 @@ class NonWgMailingList(models.Model):
def choices():
return [(list.id, list.list_name) for list in NonWgMailingList.objects.all().filter(status__gt=0)]
choices = staticmethod(choices)
def __setattr__ (self, name, value) :
if name == "area_id" and str(value) in CODE_AREA.values() :
for k, v in CODE_AREA.iteritems() :
if v == str(value) :
setattr(self, "_area_cache", k)
super(NonWgMailingList, self).__setattr__(name,value)
class Meta:
db_table = 'none_wg_mailing_list'
ordering = ['list_name']

View file

@ -1,9 +1,8 @@
# Copyright The IETF Trust 2007, All Rights Reserved
from forms import NonWgStep1, ListReqStep1, PickApprover, DeletionPickApprover, UrlMultiWidget, Preview, ListReqAuthorized, ListReqClose, MultiEmailField, AdminRequestor, ApprovalComment, ListApprover, SelectWidgetArea
from forms import NonWgStep1, ListReqStep1, PickApprover, DeletionPickApprover, UrlMultiWidget, Preview, ListReqAuthorized, ListReqClose, MultiEmailField, AdminRequestor, ApprovalComment, ListApprover, LooseModelChoiceField
from models import NonWgMailingList, MailingList, Domain
from ietf.idtracker.models import Area, PersonOrOrgInfo, AreaDirector, WGChair, Role
from ietf.mailinglists import CODE_AREA
from django import newforms as forms
from django.shortcuts import get_object_or_404, render_to_response
from django.template import RequestContext
@ -13,15 +12,15 @@ from ietf.contrib import wizard, form_decorator
from ietf.utils.mail import send_mail_subj
from datetime import datetime
def get_approvers_from_area (area_id) :
if area_id == "none" :
return [ad.person_id for ad in Role.objects.filter(role_name__in=("IETF", "IAB", ))]
else :
return [ad.person_id for ad in Area.objects.get(area_acronym=area_id).areadirector_set.all()]
def formchoice(form, field):
if not(form.is_valid()):
return None
if field == "area" and str(form.clean_data[field]) in CODE_AREA.values() :
for k, v in CODE_AREA.iteritems() :
if v == str(form.clean_data[field]) :
return k
d = str(form.clean_data[field])
for k, v in form.fields[field].choices:
if str(k) == d:
@ -56,14 +55,12 @@ nonwg_widgets = {
'purpose': forms.Textarea(attrs = {'rows': 4, 'cols': 70}),
'subscribe_url': UrlMultiWidget(choices=(('n/a', 'Not Applicable'), ('http://', 'http://'), ('https://', 'https://')), attrs = {'size': 50}),
'subscribe_other': forms.Textarea(attrs = {'rows': 3, 'cols': 50}),
'area' : SelectWidgetArea(),
}
nonwg_querysets = {
'area': Area.objects.filter(status=1)
#'area': Area.objects.filter(status=1)
}
nonwg_callback = form_decorator(fields=nonwg_fields, widgets=nonwg_widgets, attrs=nonwg_attrs, querysets=nonwg_querysets)
def gen_approval(approvers, parent):
class BoundApproval(parent):
@ -102,22 +99,25 @@ class NonWgWizard(wizard.Wizard):
# def failed_hash(self, request, step):
# raise NotImplementedError("step %d hash failed" % step)
def process_step(self, request, form, step):
form.full_clean()
if step == 0:
self.clean_forms = [ form ]
if form.clean_data['add_edit'] == 'add':
nonwg_fields["area"] = LooseModelChoiceField(Area.objects.filter(status=1))
nonwg_callback = form_decorator(fields=nonwg_fields, widgets=nonwg_widgets, attrs=nonwg_attrs, querysets=nonwg_querysets)
self.form_list.append(forms.form_for_model(NonWgMailingList, formfield_callback=nonwg_callback))
elif form.clean_data['add_edit'] == 'edit':
self.form_list.append(forms.form_for_instance(NonWgMailingList.objects.get(pk=form.clean_data['list_id']), formfield_callback=nonwg_callback))
list = NonWgMailingList.objects.get(pk=form.clean_data['list_id'])
nonwg_fields["area"] = LooseModelChoiceField(Area.objects.filter(status=1), initial=list.area_id is None and "none" or list.area_id)
nonwg_callback = form_decorator(fields=nonwg_fields, widgets=nonwg_widgets, attrs=nonwg_attrs, querysets=nonwg_querysets)
self.form_list.append(forms.form_for_instance(list, formfield_callback=nonwg_callback))
elif form.clean_data['add_edit'] == 'delete':
list = NonWgMailingList.objects.get(pk=form.clean_data['list_id_delete'])
if str(list.area_id) in CODE_AREA.values() :
__list_persons = [r.person.person_or_org_tag for r in Role.objects.filter(role_name__in=("IETF", "IAB"))]
else :
__list_persons = [ad.person_id for ad in list.area.areadirector_set.all()]
self.form_list.append(gen_approval(__list_persons, DeletionPickApprover))
self.form_list.append(gen_approval(get_approvers_from_area(list.area is None and "none" or list.area_id), DeletionPickApprover))
self.form_list.append(Preview)
else:
self.clean_forms.append(form)
@ -125,14 +125,7 @@ class NonWgWizard(wizard.Wizard):
form0 = self.clean_forms[0]
add_edit = form0.clean_data['add_edit']
if add_edit == 'add' or add_edit == 'edit':
# if area value is in CODE_AREA, approval person must be in 'IETF' and 'IAB'.
if str(form.clean_data["area"]) in CODE_AREA.values() :
__list_persons = [r.person.person_or_org_tag for r in Role.objects.filter(role_name__in=("IETF", "IAB"))]
else :
__list_persons = [ad.person_id for ad in Area.objects.get(area_acronym=form.clean_data['area']).areadirector_set.all()]
self.form_list.append(gen_approval(__list_persons, PickApprover))
self.form_list.append(gen_approval(get_approvers_from_area(form.clean_data['area']), PickApprover))
self.form_list.append(Preview)
super(NonWgWizard, self).process_step(request, form, step)
def done(self, request, form_list):
@ -142,6 +135,9 @@ class NonWgWizard(wizard.Wizard):
if add_edit == 'add' or add_edit == 'edit':
template = 'mailinglists/nwg_addedit_email.txt'
approver = self.clean_forms[2].clean_data['approver']
if self.clean_forms[1].clean_data["area"] == "none" :
self.clean_forms[1].clean_data["area"] = None
list = NonWgMailingList(**self.clean_forms[1].clean_data)
list.__dict__.update(self.clean_forms[2].clean_data)
list.id = None # create a new row no matter what