from django import forms from django.utils.safestring import mark_safe from django.utils.translation import ugettext as _ from django.db import models from django.conf import settings from common.utils import return_attrib class DetailSelectMultiple(forms.widgets.SelectMultiple): def __init__(self, queryset=None, *args, **kwargs): self.queryset=queryset super(DetailSelectMultiple, self).__init__(*args, **kwargs) def render(self, name, value, attrs=None, choices=()): if value is None: value = '' #final_attrs = self.build_attrs(attrs, name=name) output = u'\n') class PlainWidget(forms.widgets.Widget): def render(self, name, value, attrs=None): return mark_safe(u'%s' % value) class DetailForm(forms.ModelForm): def __init__(self, extra_fields=None, *args, **kwargs): super(DetailForm, self).__init__(*args, **kwargs) if extra_fields: for extra_field in extra_fields: result = return_attrib(self.instance, extra_field['field']) label = 'label' in extra_field and extra_field['label'] or None #TODO: Add others result types <=> Field types if isinstance(result, models.query.QuerySet): self.fields[extra_field['field']]=forms.ModelMultipleChoiceField(queryset=result, label=label) else: self.fields[extra_field['field']]=forms.CharField( label=extra_field['label'], #initial=getattr(self.instance, extra_field['field'], None), initial=return_attrib(self.instance, extra_field['field'], None), widget=PlainWidget) for field_name, field in self.fields.items(): if isinstance(field.widget, forms.widgets.SelectMultiple): self.fields[field_name].widget = DetailSelectMultiple( choices=field.widget.choices, attrs=field.widget.attrs, queryset=getattr(field, 'queryset', None), ) self.fields[field_name].help_text='' elif isinstance(field.widget, forms.widgets.Select): self.fields[field_name].widget = DetailSelectMultiple( choices=field.widget.choices, attrs=field.widget.attrs, queryset=getattr(field, 'queryset', None), ) self.fields[field_name].help_text='' class GenericConfirmForm(forms.Form): pass class GenericAssignRemoveForm(forms.Form): left_list = forms.ModelMultipleChoiceField(required=False, queryset=None) right_list = forms.ModelMultipleChoiceField(required=False, queryset=None) def __init__(self, left_list_qryset=None, right_list_qryset=None, left_filter=None, *args, **kwargs): super(GenericAssignRemoveForm, self).__init__(*args, **kwargs) if left_filter: self.fields['left_list'].queryset = left_list_qryset.filter(*left_filter) else: self.fields['left_list'].queryset = left_list_qryset self.fields['right_list'].queryset = right_list_qryset class FilterForm(forms.Form): def __init__(self, list_filters, *args, **kwargs): super(FilterForm, self).__init__(*args, **kwargs) for list_filter in list_filters: label = list_filter.get('title', list_filter['name']) self.fields[list_filter['name']] = forms.ModelChoiceField(queryset=list_filter['queryset'], label=label[0].upper() + label[1:], required=False)