summaryrefslogtreecommitdiff
path: root/ishtar_common/admin.py
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 /ishtar_common/admin.py
parent91c0aec5a99194f6fd1927b80354a56e135c1baf (diff)
downloadIshtar-88eb065e677ceb585af9b46ffbc5370ed48aee98.tar.bz2
Ishtar-88eb065e677ceb585af9b46ffbc5370ed48aee98.zip
Admin: action to add automatically department towns to an area
Diffstat (limited to 'ishtar_common/admin.py')
-rw-r--r--ishtar_common/admin.py95
1 files changed, 94 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',)