summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorÉtienne Loks <etienne.loks@proxience.com>2015-05-04 01:10:40 +0200
committerÉtienne Loks <etienne.loks@proxience.com>2015-05-04 01:10:40 +0200
commitbdc9cdab0d5e314b5d1a33a2d87fca22138d649d (patch)
treedcfa2689395822cf1475deb1a6107bebb6006701
parent274b8d44ccf1f099f2e22b5a6a70f9743b746c1d (diff)
downloadIshtar-bdc9cdab0d5e314b5d1a33a2d87fca22138d649d.tar.bz2
Ishtar-bdc9cdab0d5e314b5d1a33a2d87fca22138d649d.zip
Imports: manage unmatched item links
-rw-r--r--ishtar_common/forms_common.py37
-rw-r--r--ishtar_common/models.py42
-rw-r--r--ishtar_common/templates/ishtar/formset.html2
-rw-r--r--ishtar_common/templates/ishtar/import_list.html6
-rw-r--r--ishtar_common/urls.py6
-rw-r--r--ishtar_common/views.py17
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')