diff options
Diffstat (limited to 'ishtar_common')
| -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') | 
