summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorÉtienne Loks <etienne.loks@iggdrasil.net>2020-11-16 11:08:14 +0100
committerÉtienne Loks <etienne.loks@iggdrasil.net>2020-11-16 11:08:14 +0100
commit88eb065e677ceb585af9b46ffbc5370ed48aee98 (patch)
treedf3abe7669024c6107ae583852f67d4ce658a040
parent91c0aec5a99194f6fd1927b80354a56e135c1baf (diff)
downloadIshtar-88eb065e677ceb585af9b46ffbc5370ed48aee98.tar.bz2
Ishtar-88eb065e677ceb585af9b46ffbc5370ed48aee98.zip
Admin: action to add automatically department towns to an area
-rw-r--r--ishtar_common/admin.py95
-rw-r--r--ishtar_common/templates/admin/area_change_list.html29
-rw-r--r--ishtar_common/templates/admin/create_area_dpt.html35
3 files changed, 158 insertions, 1 deletions
diff --git a/ishtar_common/admin.py b/ishtar_common/admin.py
index b79dd8e5f..ac88cfdc6 100644
--- a/ishtar_common/admin.py
+++ b/ishtar_common/admin.py
@@ -918,7 +918,100 @@ for model in general_models:
admin_site.register(model, GeneralTypeAdmin)
-class AreaAdmin(GeneralTypeAdmin):
+class CreateAreaForm(forms.Form):
+ department_number = forms.IntegerField(label=_("Department number"))
+ area_name = forms.CharField(label=_("Area name"), required=False)
+ area = forms.ChoiceField(label=_("Area"), required=False, choices=[])
+
+ def __init__(self, *args, **kwargs):
+ super(CreateAreaForm, self).__init__(*args, **kwargs)
+ self.fields["area"].choices = [('', '--')] + [
+ (area.pk, area.label)
+ for area in models.Area.objects.order_by("reference")]
+
+ def clean(self):
+ area_name = self.cleaned_data.get('area_name', "")
+ area = self.cleaned_data.get('area', 0)
+ if (not area_name and not area) or (area and area_name):
+ raise forms.ValidationError(_("Choose an area or set an area "
+ "reference."))
+ return self.cleaned_data
+
+ def clean_department_number(self):
+ value = self.cleaned_data.get('department_number', 0)
+ if value < 1 or (value > 95 and (value < 970 or value > 989)):
+ raise forms.ValidationError(_("Invalid department number."))
+ return value
+
+ def clean_area_name(self):
+ value = self.cleaned_data.get('area_name', '')
+ if not value:
+ return value
+ if models.Area.objects.filter(label=value).count():
+ raise forms.ValidationError(_("This name is already used by "
+ "another area."))
+ return value
+
+
+class CreateDepartmentActionAdmin(GeneralTypeAdmin):
+ change_list_template = "admin/area_change_list.html"
+
+ def get_urls(self):
+ urls = super(CreateDepartmentActionAdmin, self).get_urls()
+ my_urls = [
+ url(r'^create-department/$', self.create_area),
+ ]
+ return my_urls + urls
+
+ def create_area(self, request):
+ form = None
+
+ if 'apply' in request.POST:
+ form = CreateAreaForm(request.POST)
+ if form.is_valid():
+ area_name = form.cleaned_data.get("area_name", '')
+ if area_name:
+ slug = "dpt-" + area_name
+ while models.Area.objects.filter(txt_idx=slug).count():
+ slug += "b"
+ area = models.Area.objects.create(label=area_name,
+ txt_idx=slug)
+ self.message_user(
+ request,
+ str(_('Area "{}" created.')).format(area_name))
+ else:
+ area = models.Area.objects.get(
+ id=form.cleaned_data["area"])
+ dpt_num = form.cleaned_data['department_number']
+ if dpt_num < 10:
+ dpt_num = "0" + str(dpt_num)
+ else:
+ dpt_num = str(dpt_num)
+ current_towns = [a.numero_insee for a in area.towns.all()]
+ nb = 0
+ for town in models.Town.objects.filter(
+ numero_insee__startswith=dpt_num).exclude(
+ numero_insee__in=current_towns).all():
+ area.towns.add(town)
+ nb += 1
+ self.message_user(
+ request,
+ str(_('{} town(s) added to "{}".')).format(
+ nb, area_name or area.label))
+ url = reverse(
+ 'admin:%s_%s_changelist' % (
+ self.model._meta.app_label, self.model._meta.model_name)
+ )
+ return HttpResponseRedirect(url)
+ if not form:
+ form = CreateAreaForm()
+ return render(
+ request, 'admin/create_area_dpt.html',
+ {'form': form, 'current_action': 'create_area'}
+ )
+
+
+class AreaAdmin(CreateDepartmentActionAdmin):
list_display = ('label', 'reference', 'parent', 'available')
search_fields = ('label', 'reference')
list_filter = ('parent',)
diff --git a/ishtar_common/templates/admin/area_change_list.html b/ishtar_common/templates/admin/area_change_list.html
new file mode 100644
index 000000000..54aaceedd
--- /dev/null
+++ b/ishtar_common/templates/admin/area_change_list.html
@@ -0,0 +1,29 @@
+{% extends "admin/change_list.html" %}
+{% load i18n admin_urls static admin_list %}
+
+ {% block object-tools-items %}
+ {% if has_add_permission %}
+ <li>
+ {% url cl.opts|admin_urlname:'add' as add_url %}
+ <a href="{% add_preserved_filters add_url is_popup to_field %}" class="addlink">
+ {% blocktrans with cl.opts.verbose_name as name %}Add {{ name }}{% endblocktrans %}
+ </a>
+ </li>
+ <li>
+ <a href="import-from-json/" class="addlink">
+ {% trans "Import from JSON" %}
+ </a>
+ </li>
+ <li>
+ <a href="import-from-csv/" class="addlink">
+ {% trans "Import from CSV" %}
+ </a>
+ </li>
+ <li>
+ <a href="create-department/" class="addlink">
+ {% trans "Create or update department area" %}
+ </a>
+ </li>
+ {% endif %}
+ {% endblock %}
+
diff --git a/ishtar_common/templates/admin/create_area_dpt.html b/ishtar_common/templates/admin/create_area_dpt.html
new file mode 100644
index 000000000..40b6f9f48
--- /dev/null
+++ b/ishtar_common/templates/admin/create_area_dpt.html
@@ -0,0 +1,35 @@
+{% extends "admin/base_site.html" %}{% load i18n %}
+
+{% block content %}
+
+<form action="." method="post" enctype="multipart/form-data">
+ {{form.non_fields_error}}
+{% csrf_token %}
+ <ul class="errorlist">
+ {% for error in form.non_field_errors %}
+ <li><strong>{{ error|escape }}</strong></li>
+ {% endfor %}
+ </ul>
+
+ <p>
+ {{ form.department_number.errors }}<br>
+ {{ form.department_number.label_tag }}
+ {{ form.department_number }}
+ </p>
+ <p>
+ <em>{% trans "Create a new area"%}</em><br>
+ {{ form.area_name.errors }}<br>
+ {{ form.area_name.label_tag }}
+ {{ form.area_name }}
+ </p>
+ <p>
+ <em>{% trans "or update an existing area"%}</em><br>
+ {{ form.area.errors }}<br>
+ {{ form.area.label_tag }}
+ {{ form.area }}
+ </p>
+<input type="hidden" name="action" value="{{current_action}}" />
+<input type="submit" name="apply" value="Validate" />
+</form>
+
+{% endblock %}