fccfacb6b5
* Corrects inconcsistent capitalization. Fixes bug 956760. * Adds a default value for CIDR and updates handling code. Fixes bug 956771. * Corrects the way SelfHandlingForm access the cleaned data. Fixes bug 958971. Change-Id: I66afeb4b530be350f33f63c8f9a60bd4a20e01bf
104 lines
3.4 KiB
Python
104 lines
3.4 KiB
Python
# vim: tabstop=4 shiftwidth=4 softtabstop=4
|
|
|
|
# Copyright 2012 United States Government as represented by the
|
|
# Administrator of the National Aeronautics and Space Administration.
|
|
# All Rights Reserved.
|
|
#
|
|
# Copyright 2012 Nebula, Inc.
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
# not use this file except in compliance with the License. You may obtain
|
|
# a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
# License for the specific language governing permissions and limitations
|
|
# under the License.
|
|
|
|
from datetime import date
|
|
import logging
|
|
|
|
from django import forms
|
|
from django.utils import dates
|
|
|
|
from horizon import exceptions
|
|
|
|
|
|
LOG = logging.getLogger(__name__)
|
|
|
|
|
|
class SelfHandlingForm(forms.Form):
|
|
"""
|
|
A base :class:`Form <django:django.forms.Form>` class which includes
|
|
processing logic in its subclasses and handling errors raised during
|
|
form processing.
|
|
|
|
.. attribute:: method
|
|
|
|
A :class:`CharField <django:django.forms.CharField>` instance
|
|
rendered with a
|
|
:class:`CharField <django:django.forms.widgets.HiddenInput>`
|
|
widget which is automatically set to the value of the class name.
|
|
|
|
This is used to determine whether this form should handle the
|
|
input it is given or not.
|
|
"""
|
|
method = forms.CharField(required=True, widget=forms.HiddenInput)
|
|
|
|
def __init__(self, *args, **kwargs):
|
|
initial = kwargs.pop('initial', {})
|
|
initial['method'] = self.__class__.__name__
|
|
kwargs['initial'] = initial
|
|
super(SelfHandlingForm, self).__init__(*args, **kwargs)
|
|
|
|
@classmethod
|
|
def _instantiate(cls, request, *args, **kwargs):
|
|
""" Instantiates the form. Allows customization in subclasses. """
|
|
return cls(*args, **kwargs)
|
|
|
|
@classmethod
|
|
def maybe_handle(cls, request, *args, **kwargs):
|
|
"""
|
|
If the form is valid,
|
|
:meth:`~horizon.forms.SelfHandlingForm.maybe_handle` calls a
|
|
``handle(request, data)`` method on its subclass to
|
|
determine what action to take.
|
|
|
|
Any exceptions raised during processing are captured and
|
|
converted to messages.
|
|
"""
|
|
|
|
if request.method != 'POST' or \
|
|
cls.__name__ != request.POST.get('method'):
|
|
return cls._instantiate(request, *args, **kwargs), None
|
|
|
|
if request.FILES:
|
|
form = cls._instantiate(request, request.POST, request.FILES,
|
|
*args, **kwargs)
|
|
else:
|
|
form = cls._instantiate(request, request.POST, *args, **kwargs)
|
|
|
|
if not form.is_valid():
|
|
return form, None
|
|
|
|
try:
|
|
return form, form.handle(request, form.cleaned_data)
|
|
except:
|
|
exceptions.handle(request)
|
|
return form, None
|
|
|
|
|
|
class DateForm(forms.Form):
|
|
""" A simple form for selecting a start date. """
|
|
month = forms.ChoiceField(choices=dates.MONTHS.items())
|
|
year = forms.ChoiceField()
|
|
|
|
def __init__(self, *args, **kwargs):
|
|
super(DateForm, self).__init__(*args, **kwargs)
|
|
years = [(year, year) for year in xrange(2009, date.today().year + 1)]
|
|
years.reverse()
|
|
self.fields['year'].choices = years
|