1+ import re
12import models
2- from django . shortcuts import render_to_response as render
3+ import ietf . utils
34import django .newforms as forms
5+ from django .shortcuts import render_to_response as render
46from django .utils .html import escape , linebreaks
5- import ietf .utils
6- import syslog
7+ from ietf .contrib . form_decorator import form_decorator
8+ from ietf . utils import log as log
79
810def default (request ):
911 """Default page, with links to sub-pages"""
@@ -83,7 +85,6 @@ def show(request, ipr_id=None):
8385 ipr .discloser_identify = linebreaks (escape (ipr .discloser_identify ))
8486 ipr .comments = linebreaks (escape (ipr .comments ))
8587 ipr .other_notes = linebreaks (escape (ipr .other_notes ))
86- opt = ipr .licensing_option
8788 ipr .licensing_option = dict (models .LICENSE_CHOICES )[ipr .licensing_option ]
8889 ipr .selecttype = dict (models .SELECT_CHOICES )[ipr .selecttype ]
8990 if ipr .selectowned :
@@ -99,49 +100,97 @@ def new(request, type):
99100 """Make a new IPR disclosure"""
100101 debug = ""
101102
103+ # define callback methods for special field cases.
104+ def ipr_detail_form_callback (field , ** kwargs ):
105+ if field .name == "licensing_option" :
106+ return forms .IntegerField (widget = forms .RadioSelect (choices = models .LICENSE_CHOICES ))
107+ if field .name in ["selecttype" , "selectowned" ]:
108+ return forms .IntegerField (widget = forms .RadioSelect (choices = ((1 , "YES" ), (2 , "NO" ))))
109+ return field .formfield (** kwargs )
110+
111+ def ipr_contact_form_callback (field , ** kwargs ):
112+ phone_re = re .compile (r'^\+?[0-9 ]*(\([0-9]+\))?[0-9 -]+$' )
113+ error_message = """Phone numbers may have a leading "+", and otherwise only contain
114+ numbers [0-9]; dash, period or space; parentheses, and an optional
115+ extension number indicated by 'x'. """
116+
117+ if field .name == "telephone" :
118+ return forms .RegexField (phone_re , error_message = error_message , ** kwargs )
119+ if field .name == "fax" :
120+ return forms .RegexField (phone_re , error_message = error_message , required = False , ** kwargs )
121+ return field .formfield (** kwargs )
122+
123+ # Get a form class which renders fields using a given template
102124 CustomForm = ietf .utils .makeFormattingForm (template = "ipr/formfield.html" )
103- BaseIprForm = forms .form_for_model (models .IprDetail , form = CustomForm , formfield_callback = detail_field_fixup )
104- BaseContactForm = forms .form_for_model (models .IprContact , form = CustomForm )
125+
126+ # Get base form classes for our models
127+ BaseIprForm = forms .form_for_model (models .IprDetail , form = CustomForm , formfield_callback = ipr_detail_form_callback )
128+ BaseContactForm = forms .form_for_model (models .IprContact , form = CustomForm , formfield_callback = ipr_contact_form_callback )
105129
106130 section_list = section_table [type ]
107131 section_list .update ({"title" :False , "new_intro" :False , "form_intro" :True , "form_submit" :True , })
108132
109133 # Some subclassing:
134+
135+ # The contact form will be part of the IprForm, so it needs a widget.
136+ # Define one.
110137 class MultiformWidget (forms .Widget ):
111- def value_from_datadict (self , data , name ):
112- return data
113-
138+ def value_from_datadict (self , data , name ):
139+ return data
140+
114141 class ContactForm (BaseContactForm ):
115142 widget = MultiformWidget ()
116-
143+
117144 def add_prefix (self , field_name ):
118145 return self .prefix and ('%s_%s' % (self .prefix , field_name )) or field_name
119146 def clean (self , * value ):
120147 if value :
121148 return self .full_clean ()
122149 else :
123150 return self .clean_data
124-
151+
125152 class IprForm (BaseIprForm ):
126153 holder_contact = None
127154 rfclist = forms .CharField (required = False )
128155 draftlist = forms .CharField (required = False )
129156 stdonly_license = forms .BooleanField (required = False )
157+ ietf_contact_is_submitter = forms .BooleanField (required = False )
158+ if "holder_contact" in section_list :
159+ holder_contact = ContactForm (prefix = "hold" )
160+ if "ietf_contact" in section_list :
161+ ietf_contact = ContactForm (prefix = "ietf" )
162+ if "submitter" in section_list :
163+ submitter = ContactForm (prefix = "subm" )
130164 def __init__ (self , * args , ** kw ):
131165 for contact in ["holder_contact" , "ietf_contact" , "submitter" ]:
132166 if contact in section_list :
133167 self .base_fields [contact ] = ContactForm (prefix = contact [:4 ], * args , ** kw )
168+ self .base_fields ["ietf_contact_is_submitter" ] = forms .BooleanField (required = False )
134169 BaseIprForm .__init__ (self , * args , ** kw )
135170 # Special validation code
136171 def clean (self ):
137172 # Required:
138173 # Submitter form filled in or 'same-as-ietf-contact' marked
139174 # Only one of rfc, draft, and other info fields filled in
140175 # RFC exists or draft exists and has right rev. or ...
176+ if self .ietf_contact_is_submitter :
177+ self .submitter = self .ietf_contact
141178 pass
142179
143180 if request .method == 'POST' :
144- form = IprForm (request .POST )
181+ data = request .POST .copy ()
182+ if "ietf_contact_is_submitter" in data :
183+ for subfield in ["name" , "title" , "department" , "address1" , "address2" , "telephone" , "fax" , "email" ]:
184+ log ("Fixing subfield subm_%s ..." % subfield )
185+ try :
186+ data ["subm_%s" % subfield ] = data ["ietf_%s" % subfield ]
187+ log ("Set to %s" % data ["ietf_%s" % subfield ])
188+ except Exception , e :
189+ log ("Caught exception: %s" % e )
190+ pass
191+ form = IprForm (data )
192+ if form .ietf_contact_is_submitter :
193+ form .ietf_contact_is_submitter_checked = "checked"
145194 if form .is_valid ():
146195 #instance = form.save()
147196 #return HttpResponseRedirect("/ipr/ipr-%s" % instance.ipr_id)
@@ -154,14 +203,9 @@ def clean(self):
154203 form = IprForm ()
155204 form .unbound_form = True
156205
157- return render ("ipr/details.html" , {"ipr" : form , "section_list" :section_list , "debug" : "" })
206+ # ietf.utils.log(dir(form.ietf_contact_is_submitter))
207+ return render ("ipr/details.html" , {"ipr" : form , "section_list" :section_list , "debug" : debug })
158208
159- def detail_field_fixup (field ):
160- if field .name == "licensing_option" :
161- return forms .IntegerField (widget = forms .RadioSelect (choices = models .LICENSE_CHOICES ))
162- if field .name in ["selecttype" , "selectowned" ]:
163- return forms .IntegerField (widget = forms .RadioSelect (choices = ((1 , "YES" ), (2 , "NO" ))))
164- return field .formfield ()
165209
166210
167211# ---- Helper functions ------------------------------------------------------
0 commit comments