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 /ishtar_common | |
| parent | 91c0aec5a99194f6fd1927b80354a56e135c1baf (diff) | |
| download | Ishtar-88eb065e677ceb585af9b46ffbc5370ed48aee98.tar.bz2 Ishtar-88eb065e677ceb585af9b46ffbc5370ed48aee98.zip | |
Admin: action to add automatically department towns to an area
Diffstat (limited to 'ishtar_common')
| -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 %} | 
