summaryrefslogtreecommitdiff
path: root/ishtar_common/forms.py
diff options
context:
space:
mode:
Diffstat (limited to 'ishtar_common/forms.py')
-rw-r--r--ishtar_common/forms.py110
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