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 @@