diff options
author | Étienne Loks <etienne.loks@iggdrasil.net> | 2017-08-31 10:39:39 +0200 |
---|---|---|
committer | Étienne Loks <etienne.loks@iggdrasil.net> | 2017-08-31 10:39:39 +0200 |
commit | 80e8827b0ff40ffa4c37985a6979fca6d7eba097 (patch) | |
tree | bb6acadd1f70294bdc1322a0e08aa51f650cfc5f /ishtar_common/forms_common.py | |
parent | 14688dbd9435146b96b0743677579a622aa784ef (diff) | |
download | Ishtar-80e8827b0ff40ffa4c37985a6979fca6d7eba097.tar.bz2 Ishtar-80e8827b0ff40ffa4c37985a6979fca6d7eba097.zip |
Target key forms: choose whom to associated with (refs #3725)
Diffstat (limited to 'ishtar_common/forms_common.py')
-rw-r--r-- | ishtar_common/forms_common.py | 103 |
1 files changed, 92 insertions, 11 deletions
diff --git a/ishtar_common/forms_common.py b/ishtar_common/forms_common.py index 4d14e4544..42e390925 100644 --- a/ishtar_common/forms_common.py +++ b/ishtar_common/forms_common.py @@ -27,7 +27,7 @@ from django.contrib.auth.models import User from django.core import validators from django.core.exceptions import ObjectDoesNotExist from django.forms.formsets import formset_factory -from django.forms.models import BaseModelFormSet +from django.forms.models import BaseModelFormSet, BaseFormSet from django.utils.safestring import mark_safe from django.utils.translation import ugettext_lazy as _ @@ -103,10 +103,26 @@ class NewItemForm(forms.Form): class NewImportForm(forms.ModelForm): + error_css_class = 'error' + required_css_class = 'required' + class Meta: model = models.Import - fields = ('name', 'importer_type', 'imported_file', 'imported_images', - 'conservative_import', 'encoding', 'skip_lines') + fields = ( + 'name', 'importer_type', 'imported_file', 'imported_images', + 'associated_group', 'conservative_import', 'encoding', 'skip_lines') + + def __init__(self, *args, **kwargs): + user = kwargs.pop('user') + super(NewImportForm, self).__init__(*args, **kwargs) + groups = models.TargetKeyGroup.objects.filter(available=True) + if not user.is_superuser: + groups = groups.filter(all_user_can_use=True) + if not groups.count(): + self.fields.pop('associated_group') + else: + self.fields['associated_group'].choices = [(None, '--')] + \ + [(g.pk, unicode(g)) for g in groups.all()] def clean(self): data = self.cleaned_data @@ -131,21 +147,47 @@ class TargetKeyForm(forms.ModelForm): 'key': forms.TextInput(attrs={'readonly': 'readonly'}), 'value': forms.Select(), } + target = widgets.SelectReadonlyField( + model=models.ImportTarget, label=_(u"Target")) + remember = forms.ChoiceField(label=_(u"Remember"), choices=[], + required=False) + NULL_VALUE = '<NONE>' def __init__(self, *args, **kwargs): + self.user = kwargs.pop('user') super(TargetKeyForm, self).__init__(*args, **kwargs) instance = getattr(self, 'instance', None) self.associated_import = None if instance and instance.pk: self.associated_import = instance.associated_import - self.fields['target'].widget.attrs['readonly'] = True + self.fields['target'].choices = [(instance.target.pk, + instance.target.verbose_name)] self.fields['key'].widget.attrs['readonly'] = True self.fields['key'].widget.attrs['title'] = unicode(instance) - self.fields['value'].widget.choices = list( - instance.target.get_choices()) + self.fields['value'].widget.choices = list( + instance.target.get_choices()) + self.fields['value'].widget.choices.insert( + 1, (self.NULL_VALUE, _(u"Set to NULL"))) + self.fields['key'].required = False + self.fields['target'].required = False self.fields['value'].required = False + choices = [ + ('import', _(u"this import only")), + ('me', _(u"me")), + ] + if self.associated_import and self.associated_import.associated_group \ + and (self.associated_import.associated_group.all_user_can_modify + or self.user.is_superuser): + choices += [ + ('group', unicode(_(u"the current group: {}")).format( + self.associated_import.associated_group))] + if self.user.is_superuser: + choices += [('all', _("all users"))] + self.fields['remember'].choices = choices + self.fields['remember'].widget.attrs['class'] = 'auto' + def clean_target(self): instance = getattr(self, 'instance', None) if instance and instance.pk: @@ -162,10 +204,49 @@ class TargetKeyForm(forms.ModelForm): def save(self, commit=True): super(TargetKeyForm, self).save(commit) - if self.cleaned_data.get('value'): - self.instance.is_set = True + if not self.cleaned_data.get('value') or not self.user: + return + if self.cleaned_data['value'] == self.NULL_VALUE: + self.instance.value = None + self.instance.is_set = True + + can_edit_group = \ + self.associated_import and \ + self.associated_import.associated_group and \ + (self.associated_import.associated_group.all_user_can_modify + or self.user.is_superuser) + + remember = self.cleaned_data.get('remember') + if remember == 'import' and self.associated_import: self.instance.associated_import = self.associated_import - self.instance.save() + self.instance.associated_user = None + self.instance.associated_group = None + elif remember == 'group' and can_edit_group: + self.instance.associated_import = None + self.instance.associated_user = None + self.instance.associated_group = \ + self.associated_import.associated_group + elif remember == 'all' and self.user.is_superuser: + self.instance.associated_import = None + self.instance.associated_user = None + self.instance.associated_group = None + else: + # for me! + self.instance.associated_import = None + self.instance.associated_user = self.user.ishtaruser + self.instance.associated_group = None + self.instance.save() + + +class TargetKeyFormset(BaseModelFormSet): + def __init__(self, *args, **kwargs): + self.user = kwargs.pop('user') + super(TargetKeyFormset, self).__init__(*args, **kwargs) + + def get_form_kwargs(self, index): + kwargs = super(TargetKeyFormset, self).get_form_kwargs(index) + kwargs['user'] = self.user + return kwargs class OrganizationForm(ManageOldType, NewItemForm): @@ -698,9 +779,9 @@ class MergeFormSet(BaseModelFormSet): return super(BaseModelFormSet, self)._construct_form(i, **kwargs) def get_restricted_queryset(self): - ''' + """ Filter (from, to) when (to, from) is already here - ''' + """ q = self.queryset if self._cached_list: return self._cached_list |