From d85d0702ae0933774ad942302a632f29bacf4550 Mon Sep 17 00:00:00 2001 From: Étienne Loks Date: Mon, 16 Nov 2020 11:08:14 +0100 Subject: Admin: action to add automatically department towns to an area --- ishtar_common/admin.py | 95 +++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 94 insertions(+), 1 deletion(-) (limited to 'ishtar_common/admin.py') 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',) -- cgit v1.2.3