From 2fa81f49400669c423d92fedf53170a4eb095f85 Mon Sep 17 00:00:00 2001 From: Bill Fenner Date: Wed, 27 Jun 2007 04:07:01 +0000 Subject: [PATCH] Initial work on allowing updates: * Allow update to pass in an object to be updated. * Pass initial values to rfclist, draftlist, 3 ContactForms and IprForm if we have an update. * Pass **kwargs through ipr_detail_form_callback to get the initial values. * Add a row in IprUpdate if updating Cleanups in that apply to both new and update: * Validate licensing_option in the clean function to allow it to be conditionally required. * Use a regular character field for date_applied, since it is a prose date in the database. * Fix typo in title setting: s/general/generic/ * Fix typo in 3rd-party title setting: s/submitter/ietf_name/ * Fix IprRfc object creation * Log the complete set of field errors * Move the validation of "one of the document fields must be filled in" to the form clean, since clean_data["draftlist"] isn't available in clean_rfclist() * Render non_field_errors since now we could have one. * Move the setting of the summary and title to after the form is cleaned, and use the clean version of the document names. - Legacy-Id: 683 --- ietf/ipr/new.py | 90 ++++++++++++++++++++++----------- ietf/ipr/views.py | 10 +++- ietf/templates/ipr/details.html | 7 +++ 3 files changed, 76 insertions(+), 31 deletions(-) diff --git a/ietf/ipr/new.py b/ietf/ipr/new.py index 953ca5136..2220f518e 100644 --- a/ietf/ipr/new.py +++ b/ietf/ipr/new.py @@ -16,14 +16,12 @@ from django.http import HttpResponseRedirect def ipr_detail_form_callback(field, **kwargs): if field.name == "licensing_option": - return forms.IntegerField(widget=forms.RadioSelect(choices=models.LICENSE_CHOICES), required=True) + return forms.IntegerField(widget=forms.RadioSelect(choices=models.LICENSE_CHOICES), required=False, **kwargs) if field.name in ["is_pending", "applies_to_all"]: - return forms.IntegerField(widget=forms.RadioSelect(choices=((1, "YES"), (2, "NO"))), required=False) + return forms.IntegerField(widget=forms.RadioSelect(choices=((1, "YES"), (2, "NO"))), required=False, **kwargs) if field.name in ["rfc_number", "id_document_tag"]: log(field.name) - return forms.CharFieldField(required=False) - if field.name in ["date_applied"]: - return forms.DateField() + return forms.CharFieldField(required=False, **kwargs) return field.formfield(**kwargs) def ipr_contact_form_callback(field, **kwargs): @@ -76,7 +74,7 @@ class ContactForm(BaseContactForm): # Form processing # ---------------------------------------------------------------- -def new(request, type): +def new(request, type, update=None): """Make a new IPR disclosure. This is a big function -- maybe too big. Things would be easier if we didn't have @@ -103,11 +101,24 @@ def new(request, type): if "submitter" in section_list: submitter = ContactForm(prefix="subm") def __init__(self, *args, **kw): + contact_type = {1:"holder_contact", 2:"ietf_contact", 3:"submitter"} + contact_initial = {} + if update: + for contact in update.contact.all(): + contact_initial[contact_type[contact.contact_type]] = contact.__dict__ + kwnoinit = kw.copy() + kwnoinit.pop('initial', None) 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["rfclist"] = forms.CharField(required=False) - self.base_fields["draftlist"] = forms.CharField(required=False) + self.base_fields[contact] = ContactForm(prefix=contact[:4], initial=contact_initial.get(contact, {}), *args, **kwnoinit) + rfclist_initial = "" + if update: + rfclist_initial = " ".join(["RFC%d" % rfc.document_id for rfc in update.rfcs.all()]) + self.base_fields["rfclist"] = forms.CharField(required=False, initial=rfclist_initial) + draftlist_initial = "" + if update: + draftlist_initial = " ".join([draft.document.filename + (draft.revision and "-%s" % draft.revision or "") for draft in update.drafts.all()]) + self.base_fields["draftlist"] = forms.CharField(required=False, initial=draftlist_initial) if "holder_contact" in section_list: self.base_fields["hold_contact_is_submitter"] = forms.BooleanField(required=False) if "ietf_contact" in section_list: @@ -116,6 +127,19 @@ def new(request, type): BaseIprForm.__init__(self, *args, **kw) # Special validation code + def clean(self): + print section_list.get("ietf_doc") + if section_list.get("ietf_doc", False): + # would like to put this in rfclist to get the error + # closer to the fields, but clean_data["draftlist"] + # isn't set yet. + rfclist = self.clean_data.get("rfclist", None) + draftlist = self.clean_data.get("draftlist", None) + other = self.clean_data.get("other_designations", None) + print "rfclist %s draftlist %s other %s" % (rfclist, draftlist, other) + if not rfclist and not draftlist and not other: + raise forms.ValidationError("One of the Document fields below must be filled in") + return self.clean_data def clean_rfclist(self): rfclist = self.clean_data.get("rfclist", None) if rfclist: @@ -127,13 +151,6 @@ def new(request, type): except: raise forms.ValidationError("Unknown RFC number: %s - please correct this." % rfc) rfclist = " ".join(rfclist) - else: - # Check that not all three fields are empty. We only need to - # do this for one of the fields. - draftlist = self.clean_data.get("draftlist", None) - other = self.clean_data.get("other_designations", None) - if not draftlist and not other: - raise forms.ValidationError("One of the Document fields below must be filled in") return rfclist def clean_draftlist(self): draftlist = self.clean_data.get("draftlist", None) @@ -166,6 +183,12 @@ def new(request, type): return self.ietf_contact.full_clean() def clean_submitter(self): return self.submitter.full_clean() + def clean_licensing_option(self): + licensing_option = self.clean_data['licensing_option'] + if section_list.get('licensing', False): + if licensing_option in (None, ''): + raise forms.ValidationError, 'This field is required.' + return licensing_option if request.method == 'POST': @@ -175,15 +198,6 @@ def new(request, type): data["generic"] = section_list["generic"] data["status"] = "0" data["comply"] = "1" - - if type == "general": - data["title"] = """%(legal_name)s's General License Statement""" % data - if type == "specific": - data["ipr_summary"] = get_ipr_summary(data) - data["title"] = """%(legal_name)s's Statement about IPR related to %(ipr_summary)s""" % data - if type == "third-party": - data["ipr_summary"] = get_ipr_summary(data) - data["title"] = """%(submitter)s's Statement about IPR related to %(ipr_summary)s belonging to %(legal_name)s""" % data for src in ["hold", "ietf"]: if "%s_contact_is_submitter" % src in data: @@ -199,7 +213,22 @@ def new(request, type): # IprDetail, IprContact+, IprDraft+, IprRfc+, IprNotification # Save IprDetail - instance = form.save() + instance = form.save(commit=False) + + if type == "generic": + instance.title = """%(legal_name)s's General License Statement""" % data + if type == "specific": + data["ipr_summary"] = get_ipr_summary(form.clean_data) + instance.title = """%(legal_name)s's Statement about IPR related to %(ipr_summary)s""" % data + if type == "third-party": + data["ipr_summary"] = get_ipr_summary(form.clean_data) + instance.title = """%(ietf_name)s's Statement about IPR related to %(ipr_summary)s belonging to %(legal_name)s""" % data + + instance.save() + + if update: + updater = models.IprUpdate(ipr=instance, updated=update, status_to_be=1, processed=0) + updater.save() contact_type = {"hold":1, "ietf":2, "subm": 3} # Save IprContact(s) @@ -230,7 +259,7 @@ def new(request, type): # Save IprRfc(s) for rfcnum in form.clean_data["rfclist"].split(): rfc = Rfc.objects.get(rfc_number=int(rfcnum)) - iprrfc = models.IprRfc(rfc_number=rfc, ipr=instance) + iprrfc = models.IprRfc(document=rfc, ipr=instance) iprrfc.save() return HttpResponseRedirect("/ipr/ipr-%s" % instance.ipr_id) @@ -242,12 +271,15 @@ def new(request, type): form.ietf_contact_is_submitter_checked = "checked" for error in form.errors: - log("Form error for field: %s"%error) + log("Form error for field: %s: %s"%(error, form.errors[error])) # Fall through, and let the partially bound form, with error # indications, be rendered again. pass else: - form = IprForm() + if update: + form = IprForm(initial=update.__dict__) + else: + form = IprForm() form.unbound_form = True # ietf.utils.log(dir(form.ietf_contact_is_submitter)) diff --git a/ietf/ipr/views.py b/ietf/ipr/views.py index 9a9efefc0..eb1e25c5a 100644 --- a/ietf/ipr/views.py +++ b/ietf/ipr/views.py @@ -5,6 +5,7 @@ from django.utils.html import escape from ietf.idtracker.models import IETFWG from ietf.ipr.models import IprDetail, SELECT_CHOICES, LICENSE_CHOICES from ietf.ipr.view_sections import section_table +from ietf.ipr.new import new from ietf.utils import log def linebreaks(value): @@ -80,8 +81,13 @@ def show(request, ipr_id=None): def update(request, ipr_id=None): """Update a specific IPR disclosure""" - # TODO: replace the placeholder code with the appropriate update code - return show(request, ipr_id) + ipr = IprDetail.objects.get(ipr_id=ipr_id) + type = "specific" + if ipr.generic: + type = "generic" + if ipr.third_party: + type = "third-party" + return new(request, type, ipr) diff --git a/ietf/templates/ipr/details.html b/ietf/templates/ipr/details.html index 7155bd967..4acc32dd4 100644 --- a/ietf/templates/ipr/details.html +++ b/ietf/templates/ipr/details.html @@ -180,6 +180,13 @@ {% if ipr.errors %}

There were errors in the submitted form -- see below. Please correct these and resubmit. + {% if ipr.non_field_errors %} +

+ {% endif %}

{% endif %}