diff options
Diffstat (limited to 'ishtar_common/forms.py')
-rw-r--r-- | ishtar_common/forms.py | 110 |
1 files changed, 108 insertions, 2 deletions
diff --git a/ishtar_common/forms.py b/ishtar_common/forms.py index 3dfcad09e..26da204fd 100644 --- a/ishtar_common/forms.py +++ b/ishtar_common/forms.py @@ -26,6 +26,7 @@ import re import types from django import forms +from django.contrib.auth.models import User from django.contrib.contenttypes.models import ContentType from django.core.urlresolvers import reverse from django.core import validators @@ -114,7 +115,7 @@ JSON_VALUE_TYPES_FIELDS = { 'T': (forms.CharField, None), 'LT': (forms.CharField, forms.Textarea), 'I': (forms.IntegerField, None), - 'F': (forms.FloatField, None), + 'F': (FloatField, None), 'D': (DateField, None), 'B': (forms.NullBooleanField, None), 'C': (widgets.Select2DynamicField, None), @@ -239,10 +240,14 @@ class CustomForm(object): if field.help_text: attrs['help_text'] = field.help_text if widget: - attrs['widget'] = widget(attrs={"class": "form-control"}) + attrs['widget'] = widget() if field_cls == widgets.Select2DynamicField: attrs['choices'] = cls._get_dynamic_choices(key) f = field_cls(**attrs) + kls = 'form-control' + if 'class' in f.widget.attrs: + kls = f.widget.attrs['class'] + " " + kls + f.widget.attrs['class'] = kls fields.append((field.order or 1, key, f)) return fields @@ -455,6 +460,8 @@ class IshtarForm(forms.Form): if not getattr(profile, profile_key): for field_key in self.PROFILE_FILTER[profile_key]: self.fields.pop(field_key) + if getattr(self, 'confirm', False): + return for field in self.TYPES: self._init_type(field) for k in self.fields: @@ -510,6 +517,31 @@ class TableSelect(IshtarForm): return self.fields.keys() +class HistorySelect(CustomForm, TableSelect): + history_modifier = forms.IntegerField( + label=_(u"Last modified by"), + widget=widgets.JQueryAutoComplete( + reverse_lazy('autocomplete-user'), + associated_model=User), required=False + ) + modified_since = forms.DateField( + label=_(u"Modified since"), widget=DatePicker, + required=False) + + def __init__(self, *args, **kwargs): + super(HistorySelect, self).__init__(*args, **kwargs) + field_order = self.fields.keys() + current_fields = ["history_modifier", "modified_since"] + fields = OrderedDict() + for k in field_order: + if k in current_fields: + continue + fields[k] = self.fields[k] + for k in current_fields: + fields[k] = self.fields[k] + self.fields = fields + + def get_now(): format = formats.get_format('DATE_INPUT_FORMATS')[0] value = datetime.datetime.now().strftime(format) @@ -640,6 +672,80 @@ class ManageOldType(IshtarForm): self.fields[field.key].help_text = field.get_help() +class QAForm(CustomForm, ManageOldType): + MULTI = False + SINGLE_FIELDS = [] + REPLACE_FIELDS = [] + + def __init__(self, *args, **kwargs): + self.items = kwargs.pop('items') + self.confirm = kwargs.pop('confirm') + super(QAForm, self).__init__(*args, **kwargs) + for k in self.fields.keys(): + if self.MULTI and k in self.SINGLE_FIELDS: + self.fields.pop(k) + continue + if self.confirm: + if 'data' not in kwargs or not kwargs['data'].get(k, None): + self.fields.pop(k) + continue + if getattr(self.fields[k].widget, 'allow_multiple_selected', + None): + self.fields[k].widget = forms.MultipleHiddenInput() + else: + self.fields[k].widget = forms.HiddenInput() + if k in kwargs['data'] and kwargs['data'][k]: + if hasattr(self, "_get_" + k): + self.fields[k].rendered_value = getattr( + self, "_get_" + k)(kwargs['data'][k]) + elif hasattr(self.fields[k], "choices"): + values = [] + for v in kwargs['data'].getlist(k): + values.append( + dict(self.fields[k].choices)[int(v)]) + self.fields[k].rendered_value = mark_safe( + u" ; ".join(values)) + if k not in self.REPLACE_FIELDS: + self.fields[k].label = unicode(self.fields[k].label) + \ + unicode(u" - append to existing") + else: + self.fields[k].label = unicode(self.fields[k].label) + \ + unicode(u" - replace") + + def _set_value(self, item, base_key): + value = self.cleaned_data[base_key] + if not value: + return + key = base_key[len("qa_"):] + field = item._meta.get_field(key) + if getattr(field, 'related_model', None): + if type(value) == list: + value = [field.related_model.objects.get(pk=v) + for v in value] + else: + value = field.related_model.objects.get(pk=value) + if getattr(field, 'many_to_many', None): + if type(value) not in (list, tuple): + value = [value] + for v in value: + getattr(item, key).add(v) + else: + if base_key not in self.REPLACE_FIELDS: + if getattr(item, key): + value = getattr(item, key) + u"\n" + value + setattr(item, key, value) + + def save(self, items, user): + for item in items: + for base_key in self.cleaned_data: + if hasattr(self, '_set_' + base_key): + getattr(self, '_set_' + base_key)(item, user) + else: + self._set_value(item, base_key) + item.history_modifier = user + item.save() + + class DocumentGenerationForm(forms.Form): """ Form to generate document by choosing the template |