diff options
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 |
commit | 88eb065e677ceb585af9b46ffbc5370ed48aee98 (patch) | |
tree | df3abe7669024c6107ae583852f67d4ce658a040 | |
parent | 91c0aec5a99194f6fd1927b80354a56e135c1baf (diff) | |
download | Ishtar-88eb065e677ceb585af9b46ffbc5370ed48aee98.tar.bz2 Ishtar-88eb065e677ceb585af9b46ffbc5370ed48aee98.zip |
Admin: action to add automatically department towns to an area
-rw-r--r-- | ishtar_common/admin.py | 95 | ||||
-rw-r--r-- | ishtar_common/templates/admin/area_change_list.html | 29 | ||||
-rw-r--r-- | ishtar_common/templates/admin/create_area_dpt.html | 35 |
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 %} |