summaryrefslogtreecommitdiff
path: root/ishtar_common/forms_common.py
diff options
context:
space:
mode:
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
commit9ad7082177fb9402723fe704c48d63e078e299a0 (patch)
tree72fc70286340f5f6fd906fe8a2f781368f83612f /ishtar_common/forms_common.py
parent84480c3374eafc1c244d9e5491c2142b923e4267 (diff)
downloadIshtar-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.py98
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,