diff options
author | Étienne Loks <etienne.loks@iggdrasil.net> | 2016-09-12 15:05:16 +0200 |
---|---|---|
committer | Étienne Loks <etienne.loks@iggdrasil.net> | 2016-09-12 15:05:16 +0200 |
commit | 9ad7082177fb9402723fe704c48d63e078e299a0 (patch) | |
tree | 72fc70286340f5f6fd906fe8a2f781368f83612f /ishtar_common/forms_common.py | |
parent | 84480c3374eafc1c244d9e5491c2142b923e4267 (diff) | |
download | Ishtar-9ad7082177fb9402723fe704c48d63e078e299a0.tar.bz2 Ishtar-9ad7082177fb9402723fe704c48d63e078e299a0.zip |
Manual merge action (refs #3176)
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, |