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:
parent
d143d41653
commit
463182dd3f
|
@ -1,7 +1,2 @@
|
|||
# Copyright The IETF Trust 2007, All Rights Reserved
|
||||
|
||||
# for area code for Non-WG-Mailinglists
|
||||
CODE_AREA = {
|
||||
"none" : "-100",
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -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']
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue