diff options
Diffstat (limited to 'ishtar_common/forms_common.py')
| -rw-r--r-- | ishtar_common/forms_common.py | 98 | 
1 files changed, 98 insertions, 0 deletions
| diff --git a/ishtar_common/forms_common.py b/ishtar_common/forms_common.py index e288745e2..77e9c8972 100644 --- a/ishtar_common/forms_common.py +++ b/ishtar_common/forms_common.py @@ -33,6 +33,7 @@ from django.utils.translation import ugettext_lazy as _  import models  import widgets +from ishtar_common.templatetags.link_to_window import link_to_window  from forms import FinalForm, FormSet, reverse_lazy, name_validator, \      TableSelect, ManageOldType @@ -228,6 +229,86 @@ class OrganizationFormSelection(forms.Form):          validators=[models.valid_id(models.Organization)]) +class ManualMerge(object): +    def clean_to_merge(self): +        value = self.cleaned_data.get('to_merge', None) or [] +        if value: +            value = value.split(',') +        values = [] +        for val in value: +            try: +                values.append(int(val)) +            except ValueError: +                pass +        if len(values) < 2: +            raise forms.ValidationError(_(u"At leat two items have to be " +                                          u"selected.")) +        self.cleaned_data['to_merge'] = values +        return values + +    def get_items(self): +        items = [] +        model = self.associated_models['to_merge'] +        for pk in sorted(self.cleaned_data['to_merge']): +            try: +                items.append(model.objects.get(pk=pk)) +            except model.DoesNotExist: +                pass +        return items + + +class MergeIntoForm(forms.Form): +    main_item = forms.ChoiceField( +        label=_("Merge all items into"), choices=[], +        widget=forms.RadioSelect()) + +    def __init__(self, *args, **kwargs): +        self.items = kwargs.pop('items') +        super(MergeIntoForm, self).__init__(*args, **kwargs) +        self.fields['main_item'].choices = [] +        for pk in self.items: +            try: +                item = self.associated_model.objects.get(pk=pk) +            except self.associated_model.DoesNotExist: +                continue +            self.fields['main_item'].choices.append( +                (item.pk, mark_safe(u"{} {}".format(link_to_window(item), +                                                    unicode(item))))) + +    def merge(self): +        model = self.associated_model +        try: +            main_item = model.objects.get(pk=self.cleaned_data['main_item']) +        except model.DoesNotExist: +            return +        for pk in self.items: +            if pk == unicode(main_item.pk): +                continue +            try: +                item = model.objects.get(pk=pk) +            except model.DoesNotExist: +                continue +            main_item.merge(item) +        return main_item + + +class OrgaMergeFormSelection(ManualMerge, forms.Form): +    form_label = _(u"Organization to merge") +    associated_models = {'to_merge': models.Organization} +    currents = {'to_merge': models.Organization} +    to_merge = forms.CharField( +        label="", required=False, +        widget=widgets.JQueryJqGrid( +            reverse_lazy('get-organization'), OrganizationSelect, +            models.Organization, +            multiple_select=True, +            source_full=reverse_lazy('get-organization-full')),) + + +class OrgaMergeIntoForm(MergeIntoForm): +    associated_model = models.Organization + +  class BaseOrganizationForm(forms.ModelForm):      form_prefix = "orga" @@ -266,6 +347,23 @@ class PersonFormSelection(forms.Form):          validators=[models.valid_id(models.Person)]) +class PersonMergeFormSelection(ManualMerge, forms.Form): +    form_label = _("Person to merge") +    associated_models = {'to_merge': models.Person} +    currents = {'to_merge': models.Person} +    to_merge = forms.CharField( +        label="", required=False, +        widget=widgets.JQueryJqGrid( +            reverse_lazy('get-person'), +            PersonSelect, models.Person, +            multiple_select=True, +            source_full=reverse_lazy('get-person-full')),) + + +class PersonMergeIntoForm(MergeIntoForm): +    associated_model = models.Person + +  class SimplePersonForm(ManageOldType, NewItemForm):      form_label = _("Identity")      associated_models = {'attached_to': models.Organization, | 
