diff options
Diffstat (limited to 'ishtar_common/admin.py')
| -rw-r--r-- | ishtar_common/admin.py | 95 | 
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',) | 
