#!/usr/bin/env python # -*- coding: utf-8 -*- """ Forms """ from django import forms from django.contrib.gis.db import models from chimere.main.models import Marker, PropertyModel, Property class MarkerAdminForm(forms.ModelForm): """ Main form for marker """ # declare properties for property in PropertyModel.objects.filter(available=True): exec('property_%d_%d = forms.CharField(label="%s", widget=forms.%s, \ required=False)' % (property.order, property.id, property.name, PropertyModel.TYPE_WIDGET[property.type])) class Meta: model = Marker def __init__(self, *args, **keys): """ Custom initialization method in order to manage properties """ if 'instance' in keys and keys['instance']: instance = keys['instance'] property_dct = {} for pm in PropertyModel.objects.filter(available=True): property = instance.getProperty(pm) if property: property_dct[pm.getNamedId()] = property.value if 'initial' in keys: keys['initial'].update(property_dct) else: keys['initial'] = property_dct super(MarkerAdminForm, self).__init__(*args, **keys) def save(self, *args, **keys): """ Custom save method in order to manage associeted properties """ new_marker = super(MarkerAdminForm, self).save(*args, **keys) if 'status' not in self.cleaned_data: new_marker.status = 'S' new_marker.save() # save each property for propertymodel in PropertyModel.objects.filter(available=True): properties = Property.objects.filter(marker=new_marker, propertymodel=propertymodel) # new property if not properties: new_property = Property.objects.create(marker=new_marker, propertymodel=propertymodel, value=self.cleaned_data['property_%d_%d' % ( propertymodel.order, propertymodel.id)]) new_property.save() else: # in case of multiple edition as the same time delete arbitrary # the others if len(properties) > 1: for property in properties[1:]: property.delete() property = properties[0] property.value = self.cleaned_data['property_%d_%d' % ( propertymodel.order, propertymodel.id)] property.save() return new_marker class MarkerForm(MarkerAdminForm): """ Form for the edit page """ class Meta: model = Marker exclude = ('status',)