From 8d7053fc5c7e97f20d16f7489193cf563c7ec44f Mon Sep 17 00:00:00 2001
From: Henrik Levkowetz
Date: Fri, 18 May 2007 15:50:30 +0000
Subject: [PATCH] * Removed InternationalPhoneNumber class, instead using the
form creation callback to provide a RegexpField class. * Added checkbox
for submitter contact information being the same as IETF contact
information; with javascript support and validation support. * Cleaned
out the old split_form() and mk_formatting_form() functions from
ietf.utils. - Legacy-Id: 138
---
ietf/ipr/models.py | 28 +--------
ietf/ipr/views.py | 84 +++++++++++++++++++------
ietf/templates/ipr/details.html | 10 ++-
ietf/templates/ipr/style.html | 39 +++++++++++-
ietf/utils/__init__.py | 105 --------------------------------
5 files changed, 112 insertions(+), 154 deletions(-)
diff --git a/ietf/ipr/models.py b/ietf/ipr/models.py
index 0bdfa433e..cb387107b 100644
--- a/ietf/ipr/models.py
+++ b/ietf/ipr/models.py
@@ -6,30 +6,6 @@ from django import newforms as forms
from ietf.idtracker.views import InternetDraft
from ietf.idtracker.models import Rfc
-# ------------------------------------------------------------------------
-# New field classes
-
-phone_re = re.compile(r'^\+?[0-9 ]*(\([0-9]+\))?[0-9 -]+$')
-class InternationalPhoneNumberField(models.CharField):
- error_message = 'Phone numbers may have a leading "+", and otherwise only contain numbers [0-9], dash, space, and parentheses. '
- def validate(self, field_data, all_data):
- if not phone_re.search(field_data):
- raise ValidationError, self.error_message + ' "%s" is invalid.' % field_data
-
- def clean(self, value):
- if value in EMPTY_VALUES:
- return u''
- self.validate(value, {})
- return smart_unicode(value)
-
- def formfield(self, **kwargs):
- defaults = {'required': not self.blank, 'label': capfirst(self.verbose_name),
- 'help_text': self.help_text,
- 'error_message': self.error_message + "Enter a valid phone number."}
- defaults.update(kwargs)
- return forms.RegexField(phone_re, **defaults)
-
-
# ------------------------------------------------------------------------
# Models
@@ -178,8 +154,8 @@ class IprContact(models.Model):
department = models.CharField(blank=True, maxlength=255)
address1 = models.CharField(blank=True, maxlength=255)
address2 = models.CharField(blank=True, maxlength=255)
- telephone = InternationalPhoneNumberField(maxlength=25, core=True)
- fax = InternationalPhoneNumberField(blank=True, maxlength=25)
+ telephone = models.CharField(maxlength=25, core=True)
+ fax = models.CharField(blank=True, maxlength=25)
email = models.EmailField(maxlength=255, core=True)
def __str__(self):
return self.name
diff --git a/ietf/ipr/views.py b/ietf/ipr/views.py
index f047f0f55..91a4221c3 100644
--- a/ietf/ipr/views.py
+++ b/ietf/ipr/views.py
@@ -1,9 +1,11 @@
+import re
import models
-from django.shortcuts import render_to_response as render
-import django.newforms as forms
-from django.utils.html import escape, linebreaks
import ietf.utils
-import syslog
+import django.newforms as forms
+from django.shortcuts import render_to_response as render
+from django.utils.html import escape, linebreaks
+from ietf.contrib.form_decorator import form_decorator
+from ietf.utils import log as log
def default(request):
"""Default page, with links to sub-pages"""
@@ -83,7 +85,6 @@ def show(request, ipr_id=None):
ipr.discloser_identify = linebreaks(escape(ipr.discloser_identify))
ipr.comments = linebreaks(escape(ipr.comments))
ipr.other_notes = linebreaks(escape(ipr.other_notes))
- opt = ipr.licensing_option
ipr.licensing_option = dict(models.LICENSE_CHOICES)[ipr.licensing_option]
ipr.selecttype = dict(models.SELECT_CHOICES)[ipr.selecttype]
if ipr.selectowned:
@@ -99,21 +100,47 @@ def new(request, type):
"""Make a new IPR disclosure"""
debug = ""
+ # define callback methods for special field cases.
+ def ipr_detail_form_callback(field, **kwargs):
+ if field.name == "licensing_option":
+ return forms.IntegerField(widget=forms.RadioSelect(choices=models.LICENSE_CHOICES))
+ if field.name in ["selecttype", "selectowned"]:
+ return forms.IntegerField(widget=forms.RadioSelect(choices=((1, "YES"), (2, "NO"))))
+ return field.formfield(**kwargs)
+
+ def ipr_contact_form_callback(field, **kwargs):
+ phone_re = re.compile(r'^\+?[0-9 ]*(\([0-9]+\))?[0-9 -]+$')
+ error_message = """Phone numbers may have a leading "+", and otherwise only contain
+ numbers [0-9]; dash, period or space; parentheses, and an optional
+ extension number indicated by 'x'. """
+
+ if field.name == "telephone":
+ return forms.RegexField(phone_re, error_message=error_message, **kwargs)
+ if field.name == "fax":
+ return forms.RegexField(phone_re, error_message=error_message, required=False, **kwargs)
+ return field.formfield(**kwargs)
+
+ # Get a form class which renders fields using a given template
CustomForm = ietf.utils.makeFormattingForm(template="ipr/formfield.html")
- BaseIprForm = forms.form_for_model(models.IprDetail, form=CustomForm, formfield_callback=detail_field_fixup)
- BaseContactForm = forms.form_for_model(models.IprContact, form=CustomForm)
+
+ # Get base form classes for our models
+ BaseIprForm = forms.form_for_model(models.IprDetail, form=CustomForm, formfield_callback=ipr_detail_form_callback)
+ BaseContactForm = forms.form_for_model(models.IprContact, form=CustomForm, formfield_callback=ipr_contact_form_callback)
section_list = section_table[type]
section_list.update({"title":False, "new_intro":False, "form_intro":True, "form_submit":True, })
# Some subclassing:
+
+ # The contact form will be part of the IprForm, so it needs a widget.
+ # Define one.
class MultiformWidget(forms.Widget):
- def value_from_datadict(self, data, name):
- return data
-
+ def value_from_datadict(self, data, name):
+ return data
+
class ContactForm(BaseContactForm):
widget = MultiformWidget()
-
+
def add_prefix(self, field_name):
return self.prefix and ('%s_%s' % (self.prefix, field_name)) or field_name
def clean(self, *value):
@@ -121,16 +148,24 @@ def new(request, type):
return self.full_clean()
else:
return self.clean_data
-
+
class IprForm(BaseIprForm):
holder_contact = None
rfclist = forms.CharField(required=False)
draftlist = forms.CharField(required=False)
stdonly_license = forms.BooleanField(required=False)
+ ietf_contact_is_submitter = forms.BooleanField(required=False)
+ if "holder_contact" in section_list:
+ holder_contact = ContactForm(prefix="hold")
+ if "ietf_contact" in section_list:
+ ietf_contact = ContactForm(prefix="ietf")
+ if "submitter" in section_list:
+ submitter = ContactForm(prefix="subm")
def __init__(self, *args, **kw):
for contact in ["holder_contact", "ietf_contact", "submitter"]:
if contact in section_list:
self.base_fields[contact] = ContactForm(prefix=contact[:4], *args, **kw)
+ self.base_fields["ietf_contact_is_submitter"] = forms.BooleanField(required=False)
BaseIprForm.__init__(self, *args, **kw)
# Special validation code
def clean(self):
@@ -138,10 +173,24 @@ def new(request, type):
# Submitter form filled in or 'same-as-ietf-contact' marked
# Only one of rfc, draft, and other info fields filled in
# RFC exists or draft exists and has right rev. or ...
+ if self.ietf_contact_is_submitter:
+ self.submitter = self.ietf_contact
pass
if request.method == 'POST':
- form = IprForm(request.POST)
+ data = request.POST.copy()
+ if "ietf_contact_is_submitter" in data:
+ for subfield in ["name", "title", "department", "address1", "address2", "telephone", "fax", "email"]:
+ log("Fixing subfield subm_%s ..."%subfield)
+ try:
+ data["subm_%s"%subfield] = data["ietf_%s"%subfield]
+ log("Set to %s"%data["ietf_%s"%subfield])
+ except Exception, e:
+ log("Caught exception: %s"%e)
+ pass
+ form = IprForm(data)
+ if form.ietf_contact_is_submitter:
+ form.ietf_contact_is_submitter_checked = "checked"
if form.is_valid():
#instance = form.save()
#return HttpResponseRedirect("/ipr/ipr-%s" % instance.ipr_id)
@@ -154,14 +203,9 @@ def new(request, type):
form = IprForm()
form.unbound_form = True
- return render("ipr/details.html", {"ipr": form, "section_list":section_list, "debug": ""})
+ # ietf.utils.log(dir(form.ietf_contact_is_submitter))
+ return render("ipr/details.html", {"ipr": form, "section_list":section_list, "debug": debug})
-def detail_field_fixup(field):
- if field.name == "licensing_option":
- return forms.IntegerField(widget=forms.RadioSelect(choices=models.LICENSE_CHOICES))
- if field.name in ["selecttype", "selectowned"]:
- return forms.IntegerField(widget=forms.RadioSelect(choices=((1, "YES"), (2, "NO"))))
- return field.formfield()
# ---- Helper functions ------------------------------------------------------
diff --git a/ietf/templates/ipr/details.html b/ietf/templates/ipr/details.html
index a14449e07..9f6954df6 100644
--- a/ietf/templates/ipr/details.html
+++ b/ietf/templates/ipr/details.html
@@ -129,7 +129,7 @@
-