diff options
-rw-r--r-- | ishtar_common/forms_common.py | 37 | ||||
-rw-r--r-- | ishtar_common/models.py | 42 | ||||
-rw-r--r-- | ishtar_common/templates/ishtar/formset.html | 2 | ||||
-rw-r--r-- | ishtar_common/templates/ishtar/import_list.html | 6 | ||||
-rw-r--r-- | ishtar_common/urls.py | 6 | ||||
-rw-r--r-- | ishtar_common/views.py | 17 |
6 files changed, 92 insertions, 18 deletions
diff --git a/ishtar_common/forms_common.py b/ishtar_common/forms_common.py index b6971c4f4..677656af6 100644 --- a/ishtar_common/forms_common.py +++ b/ishtar_common/forms_common.py @@ -98,6 +98,43 @@ class NewImportForm(forms.ModelForm): self.instance.user = user return super(NewImportForm, self).save(commit) +class TargetKeyForm(forms.ModelForm): + class Meta: + model = models.TargetKey + fields = ('target', 'value', 'key') + widgets = { + 'value': forms.TextInput(attrs={'readonly':'readonly'}), + 'key': forms.Select(), + } + + def __init__(self, *args, **kwargs): + super(TargetKeyForm, self).__init__(*args, **kwargs) + instance = getattr(self, 'instance', None) + if instance and instance.pk: + self.fields['target'].widget.attrs['readonly'] = True + self.fields['value'].widget.attrs['readonly'] = True + self.fields['key'].widget.choices = list(instance.target.get_choices()) + + def clean_target(self): + instance = getattr(self, 'instance', None) + if instance and instance.pk: + return instance.target + else: + return self.cleaned_data['target'] + + def clean_value(self): + instance = getattr(self, 'instance', None) + if instance and instance.pk: + return instance.value + else: + return self.cleaned_data['value'] + + def save(self, commit=True): + super(TargetKeyForm, self).save(commit) + if self.cleaned_data.get('value'): + self.instance.is_set = True + self.instance.save() + class OrganizationForm(NewItemForm): form_label = _(u"Organization") associated_models = {'organization_type':models.OrganizationType} diff --git a/ishtar_common/models.py b/ishtar_common/models.py index b43d3a50c..24b64bec0 100644 --- a/ishtar_common/models.py +++ b/ishtar_common/models.py @@ -973,7 +973,7 @@ def get_model_fields(model): """ fields = {} options = model._meta - for field in sorted(options.fields): + for field in sorted(options.fields + options.many_to_many): fields[field.name] = field return fields @@ -1041,6 +1041,17 @@ class ImporterType(models.Model): newclass = type(name, (Importer,), args) return newclass +def get_associated_model(parent_model, keys): + field = None + OBJECT_CLS = import_class(parent_model) + for idx, item in enumerate(keys): + if not idx: + field = get_model_fields(OBJECT_CLS)[item] + else: + raise NotImplemented() + if hasattr(field, 'rel') and hasattr(field.rel, 'to'): + return field.rel.to + class ImporterDefault(models.Model): """ Targets of default values in an import @@ -1057,15 +1068,7 @@ class ImporterDefault(models.Model): @property def associated_model(self): - field = None - OBJECT_CLS = import_class(self.importer_type.associated_models) - for idx, item in enumerate(self.keys): - if not idx: - field = get_model_fields(OBJECT_CLS)[item] - else: - raise NotImplemented() - if hasattr(field, 'rel') and hasattr(field.rel, 'to'): - return field.rel.to + return get_associated_model(self.importer_type.associated_models, self.keys) @property def values(self): @@ -1157,7 +1160,17 @@ class ImportTarget(models.Model): verbose_name_plural = _(u"Importer - Targets") def __unicode__(self): - return u" - ".join([unicode(self.column), self.target[:50]]) + return self.target[:50] + + @property + def associated_model(self): + return get_associated_model(self.column.importer_type.associated_models, + self.target.split('__')) + + def get_choices(self): + if not self.associated_model or not hasattr(self.associated_model, 'get_types'): + return [] + return self.associated_model.get_types() class TargetKey(models.Model): """ @@ -1298,6 +1311,10 @@ class Import(models.Model): return u"%s - %s" % (unicode(self.importer_type), unicode(self.user)) + def need_matching(self): + return bool(ImporterType.objects.filter(pk=self.importer_type.pk, + columns__targets__keys__is_set=False).count()) + def get_actions(self): """ Get available action relevant with the current status @@ -1306,9 +1323,6 @@ class Import(models.Model): if self.state == 'C': actions.append(('A', _(u"Analyse"))) if self.state == 'A': - if ImporterType.objects.filter(pk=self.importer_type.pk, - columns__targets__keys__is_set=False).count(): - actions.append(('L', _(u"Link unmatched items"))) actions.append(('A', _(u"Re-analyse"))) actions.append(('I', _(u"Launch import"))) actions.append(('D', _(u"Delete"))) diff --git a/ishtar_common/templates/ishtar/formset.html b/ishtar_common/templates/ishtar/formset.html index 5ae0e7c51..c8a92165e 100644 --- a/ishtar_common/templates/ishtar/formset.html +++ b/ishtar_common/templates/ishtar/formset.html @@ -1,7 +1,7 @@ {% extends "base.html" %} {% load i18n inline_formset %} {% block content %} -<h2>{% trans "Global variables" %}</h2> +<h2>{{page_name}}</h2> <div class='form' id='global-vars'> <form action="." method="post">{% csrf_token %} {% inline_formset ' ' formset %} diff --git a/ishtar_common/templates/ishtar/import_list.html b/ishtar_common/templates/ishtar/import_list.html index 868ca9c9e..76fc1cd72 100644 --- a/ishtar_common/templates/ishtar/import_list.html +++ b/ishtar_common/templates/ishtar/import_list.html @@ -1,5 +1,6 @@ {% extends "base.html" %} {% load i18n inline_formset %} +{% load url from future %} {% block content %} <h2>{{page_name}}</h2> <div class='form'> @@ -36,6 +37,11 @@ {% endfor%} </select> </td> + <td> + {% if import.need_matching %} + <a href='{% url "import_link_unmatched" import.importer_type.pk %}'>{% trans "Link unmatched items" %}</a> + {% endif %} + </td> </tr> {% endfor %} </table> diff --git a/ishtar_common/urls.py b/ishtar_common/urls.py index 81b96967a..76e1d778b 100644 --- a/ishtar_common/urls.py +++ b/ishtar_common/urls.py @@ -1,6 +1,6 @@ #!/usr/bin/env python # -*- coding: utf-8 -*- -# Copyright (C) 2010-2014 Étienne Loks <etienne.loks_AT_peacefrogsDOTnet> +# Copyright (C) 2010-2015 Étienne Loks <etienne.loks_AT_peacefrogsDOTnet> # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as @@ -52,7 +52,9 @@ urlpatterns = patterns('', url(r'import-list/$', views.ImportListView.as_view(), name='current_imports'), url(r'import-list-old/$', views.ImportOldListView.as_view(), - name='old_imports') + name='old_imports'), + url(r'import-link-unmatched/(?P<pk>[0-9]+)/$', + views.ImportLinkView.as_view(), name='import_link_unmatched'), ) for section in menu.childs: for menu_item in section.childs: diff --git a/ishtar_common/views.py b/ishtar_common/views.py index 3c2aa8b3c..0d7389949 100644 --- a/ishtar_common/views.py +++ b/ishtar_common/views.py @@ -856,11 +856,12 @@ class AdminLoginRequiredMixin(LoginRequiredMixin): return super(AdminLoginRequiredMixin, self).dispatch(request, *args, **kwargs) -class GlobalVarEdit(AdminLoginRequiredMixin, ModelFormSetView): +class GlobalVarEdit(IshtarMixin, AdminLoginRequiredMixin, ModelFormSetView): template_name = 'ishtar/formset.html' model = models.GlobalVar extra = 1 can_delete = True + page_name = _(u"Global variables") fields = ['slug', 'value', 'description'] class NewImportView(IshtarMixin, LoginRequiredMixin, CreateView): @@ -915,3 +916,17 @@ class ImportOldListView(ImportListView): user = models.IshtarUser.objects.get(pk=self.request.user.pk) return self.model.objects.filter(user=user, state='F' ).order_by('-creation_date') + +class ImportLinkView(IshtarMixin, LoginRequiredMixin, ModelFormSetView): + template_name = 'ishtar/formset.html' + model = models.TargetKey + page_name = _(u"Link unmatched items") + extra = 0 + form_class = forms.TargetKeyForm + + def get_queryset(self): + return self.model.objects.filter(is_set=False, + target__column__importer_type__pk=self.kwargs['pk']) + + def get_success_url(self): + return reverse('current_imports') |