diff options
| author | Étienne Loks <etienne.loks@peacefrogs.net> | 2011-01-02 22:49:30 +0100 | 
|---|---|---|
| committer | Étienne Loks <etienne.loks@peacefrogs.net> | 2011-01-02 22:49:30 +0100 | 
| commit | 6c5de269a1b4ffa1d374c68525870978ea872543 (patch) | |
| tree | d6f7a63daa6293ad0f477d8434a6c0b4d0244442 | |
| parent | cb791561a7668f1f21b0f28f46e6d85bda52ad37 (diff) | |
| download | Ishtar-6c5de269a1b4ffa1d374c68525870978ea872543.tar.bz2 Ishtar-6c5de269a1b4ffa1d374c68525870978ea872543.zip | |
Work on file form (refs #14)
| -rw-r--r-- | ishtar/furnitures/admin.py | 2 | ||||
| -rw-r--r-- | ishtar/furnitures/forms.py | 38 | ||||
| -rw-r--r-- | ishtar/furnitures/models.py | 46 | ||||
| -rw-r--r-- | ishtar/furnitures/urls.py | 6 | ||||
| -rw-r--r-- | ishtar/furnitures/views.py | 43 | ||||
| -rw-r--r-- | ishtar/urls.py | 1 | 
6 files changed, 117 insertions, 19 deletions
| diff --git a/ishtar/furnitures/admin.py b/ishtar/furnitures/admin.py index 1a0b7d867..6e9f1f63a 100644 --- a/ishtar/furnitures/admin.py +++ b/ishtar/furnitures/admin.py @@ -197,7 +197,7 @@ basic_models = [models.PersonType, models.IshtarUser, models.FileType,                  models.OperationType, models.DatingType, models.DatingQuality,                  models.SourceType, models.MaterialType, models.ParcelOwner,                  models.WarehouseType, models.ActType, models.AuthorType, -                models.TreatmentType] +                models.OrganizationType, models.TreatmentType]  if settings.COUNTRY == 'fr':      basic_models += [models.Arrondissement, models.Canton, models.SaisineType] diff --git a/ishtar/furnitures/forms.py b/ishtar/furnitures/forms.py index 7f9347197..b78a06644 100644 --- a/ishtar/furnitures/forms.py +++ b/ishtar/furnitures/forms.py @@ -33,6 +33,7 @@ from merlin.wizards.session import SessionWizard  import models  import widgets +from ishtar import settings  from django.utils.functional import lazy @@ -58,7 +59,7 @@ class Wizard(SessionWizard):  class FileWizard(Wizard):      def get_template(self, request, step, form): -        return ['templates/file_wizard_%s.html' % step, +        return ['file_wizard_%s.html' % step,                  'file_wizard.html']      def done(self, request, form_list): @@ -66,6 +67,20 @@ class FileWizard(Wizard):                          'form_data': [form.cleaned_data for form in form_list],           }) +    def process_step(self, request, step, form): +        if models.PREVENTIVE and 'file_type' in form.cleaned_data: +            file_type = int(form.cleaned_data['file_type']) +            if file_type == models.PREVENTIVE: +                preventive_step = Step('preventive', +                                   _(u"Preventive informations"), FileForm3) +                localisation_step = self.get_step(request, 'localisation') +                self.insert_after(request, localisation_step, +                                  preventive_step) +            else: +                preventive_step = self.get_step(request, 'preventive') +                self.remove_step(request, preventive_step) + +  class FileForm1(forms.Form):      in_charge = forms.IntegerField(label=_("Person in charge"),           widget=widgets.JQueryAutoComplete(reverse_lazy('autocomplete-person'), @@ -84,5 +99,22 @@ class FileForm1(forms.Form):  class FileForm2(forms.Form): -    town = forms.IntegerField(label=_(u"Town")) - +    town = forms.IntegerField(label=_(u"Town"), +         widget=widgets.JQueryAutoComplete(reverse_lazy('autocomplete-town'), +                                           associated_model=models.Town), +         validators=[models.Town.valid_id]) +    total_surface = forms.IntegerField(label=_("Total surface")) +    address = forms.CharField(label=_(u"Address"), widget=forms.Textarea) + +class FileForm3(forms.Form): +    general_contractor = forms.IntegerField(label=_(u"General contractor"), +            widget=widgets.JQueryAutoComplete( +                reverse_lazy('autocomplete-organization'), +                associated_model=models.Organization), +            validators=[models.Organization.valid_id]) +    total_developed_surface = forms.IntegerField( +                                             label=_("Total developed surface")) +    if settings.COUNTRY == 'fr': +        saisine_type = forms.ChoiceField(label=_("Saisine type"), +                                  choices=models.SaisineType.get_types()) +    reception_date = forms.DateField(label=_(u"Reception date")) diff --git a/ishtar/furnitures/models.py b/ishtar/furnitures/models.py index 28420118b..008ad1dc3 100644 --- a/ishtar/furnitures/models.py +++ b/ishtar/furnitures/models.py @@ -34,6 +34,13 @@ from simple_history.models import HistoricalRecords  from ishtar import settings +# valid ID validator for models +def valid_id(cls, value): +    try: +        cls.objects.get(pk=value) +    except ObjectDoesNotExist: +        raise ValidationError(_(u"Not a valid person.")) +  class OwnPerms:      """      Manage special permissions for object's owner @@ -129,6 +136,13 @@ class Organization(Address, OwnPerms):            ("delete_own_organization", ugettext(u"Can delete own Organization")),          ) +    @classmethod +    def valid_id(cls, value): +        valid_id(cls, value) + +    def __unicode__(self): +        return self.name +  class PersonType(GeneralType):      class Meta:          verbose_name = _(u"Person type") @@ -168,10 +182,7 @@ class Person(Address, OwnPerms) :      @classmethod      def valid_id(cls, value): -        try: -            cls.objects.get(pk=value) -        except ObjectDoesNotExist: -            raise ValidationError(_(u"Not a valid person.")) +        valid_id(cls, value)  class IshtarUser(models.Model):      user = models.ForeignKey(User, unique=True, related_name='profile', @@ -188,6 +199,11 @@ class FileType(GeneralType):          verbose_name = _(u"Archaeological file type")          verbose_name_plural = _(u"Archaeological file types") +try: +    PREVENTIVE = FileType.objects.filter(txt_idx="preventive").all()[0].pk +except: +    PREVENTIVE = 0 +  if settings.COUNTRY == 'fr':      class SaisineType(GeneralType):          delay = models.IntegerField(_(u"Delay (in days)")) @@ -209,11 +225,17 @@ class File(BaseHistorizedItem, OwnPerms):      towns = models.ManyToManyField("Town")      creation_date = models.DateField(_(u"Creation date"),                                       default=datetime.datetime.now) -    reception_date = models.DateField(_(u'Reception date')) +    reception_date = models.DateField(_(u'Reception date'), blank=True, +                                      null=True)      if settings.COUNTRY == 'fr': -        saisine_type = models.ForeignKey(SaisineType, +        saisine_type = models.ForeignKey(SaisineType, blank=True, null=True,                                           verbose_name= u"Type de saisine") -        reference_number = models.IntegerField(_(u"Reference number")) +        reference_number = models.IntegerField(_(u"Reference number"), +                                               blank=True, null=True) +    total_surface = models.IntegerField(_(u"Total surface")) +    total_developed_surface = models.IntegerField(_(u"Total developed surface"), +                                                  blank=True, null=True) +    address = models.TextField(_(u"Address"))      history = HistoricalRecords()      class Meta: @@ -527,14 +549,14 @@ if settings.COUNTRY == 'fr':          department = models.ForeignKey(Departement, verbose_name=u"Département")          def __unicode__(self): -            return self.name +            return u"%s - %s" % (self.name, unicode(self.department))      class Canton(models.Model):          name = models.CharField(u"Nom", max_length=30)          arrondissement = models.ForeignKey(Arrondissement,                                             verbose_name=u"Arrondissement")          def __unicode__(self): -            return self.name +            return u"%s - %s" % (self.name, unicode(self.arrondissement))  class Town(models.Model):      name = models.CharField(_(u"Name"), max_length=100) @@ -550,8 +572,14 @@ class Town(models.Model):          verbose_name_plural = _(u"Towns")      def __unicode__(self): +        if settings.COUNTRY == 'fr': +            return u"%s (%s)" % (self.name, unicode(self.canton))          return self.name +    @classmethod +    def valid_id(cls, value): +        valid_id(cls, value) +  class TreatmentType(GeneralType):      class Meta:          verbose_name = _(u"Treatment type") diff --git a/ishtar/furnitures/urls.py b/ishtar/furnitures/urls.py index ab347e548..5d1e0c710 100644 --- a/ishtar/furnitures/urls.py +++ b/ishtar/furnitures/urls.py @@ -35,6 +35,10 @@ urlpatterns += patterns('ishtar.furnitures.views',       url(BASE_URL + r'(?P<action_slug>' + actions + r')/(?P<slug>[A-Za-z0-9_-]+)/$',                      'action', name='action-form'),       url(BASE_URL + r'(?P<action_slug>' + actions + r')/$', 'action', name='action'), -     url(BASE_URL + r'autocomplete/$', 'autocomplete_person', +     url(BASE_URL + r'autocomplete-persone/$', 'autocomplete_person',                                        name='autocomplete-person'), +     url(BASE_URL + r'autocomplete-town/$', 'autocomplete_town', +                                      name='autocomplete-town'), +     url(BASE_URL + r'autocomplete-organization/$', 'autocomplete_organization', +                                      name='autocomplete-organization'),  ) diff --git a/ishtar/furnitures/views.py b/ishtar/furnitures/views.py index 995eafea9..bee8a305e 100644 --- a/ishtar/furnitures/views.py +++ b/ishtar/furnitures/views.py @@ -31,7 +31,7 @@ from django.core import serializers  from ishtar import settings  from menus import menu -from forms import Step, FileForm1, FileForm2, FileWizard +from forms import Step, FileForm1, FileForm2, FileForm3, FileWizard  import models  def index(request): @@ -60,13 +60,46 @@ def autocomplete_person(request):          return HttpResponseBadRequest()      query = Q()      for q in q.split(' '): -        query = query | Q(name__istartswith=q) | Q(surname__istartswith=q) | \ -                        Q(email__icontains=q) +        query = query & (Q(name__istartswith=q) | Q(surname__istartswith=q) | \ +                         Q(email__icontains=q)) +    limit = 15      persons = models.Person.objects.filter(query)[:limit]      data = json.dumps([{'id':person.pk, 'value':unicode(person)}                                            for person in persons])      return HttpResponse(data, mimetype='text/plain') +def autocomplete_town(request): +    if not request.GET.get('term'): +        return HttpResponse(mimetype='text/plain') +    q = request.GET.get('term') +    query = Q() +    for q in q.split(' '): +        extra = Q(name__icontains=q) +        if settings.COUNTRY == 'fr': +            extra = extra | (Q(canton__name__istartswith=q) | \ +                    Q(canton__arrondissement__name__istartswith=q) | \ +                    Q(canton__arrondissement__department__label__istartswith=q)) +        query = query & extra +    limit = 15 +    towns = models.Town.objects.filter(query)[:limit] +    data = json.dumps([{'id':town.pk, 'value':unicode(town)} +                                          for town in towns]) +    return HttpResponse(data, mimetype='text/plain') + +def autocomplete_organization(request): +    if not request.GET.get('term'): +        return HttpResponse(mimetype='text/plain') +    q = request.GET.get('term') +    query = Q() +    for q in q.split(' '): +        extra = Q(name__icontains=q) +        query = query & extra +    limit = 15 +    organizations = models.Organization.objects.filter(query)[:limit] +    data = json.dumps([{'id':org.pk, 'value':unicode(org)} +                                          for org in organizations]) +    return HttpResponse(data, mimetype='text/plain') +  def action(request, action_slug, obj_id=None, *args, **kwargs):      """      Action management @@ -100,7 +133,9 @@ def action(request, action_slug, obj_id=None, *args, **kwargs):  file_creation_wizard = FileWizard([              Step('general', _(u"General"), FileForm1), -            Step('localisation', _(u"Localisation"), FileForm2)]) +            Step('localisation', _(u"Localisation"), FileForm2), +            Step('preventive', _(u"Preventive informations"), FileForm3)]) +  def file_creation(request, dct, obj_id, *args, **kwargs):      return file_creation_wizard(request, *args, **kwargs) diff --git a/ishtar/urls.py b/ishtar/urls.py index af0c13dc5..d4abb83f8 100644 --- a/ishtar/urls.py +++ b/ishtar/urls.py @@ -14,5 +14,4 @@ urlpatterns = patterns('',  )  urlpatterns += patterns('ishtar.furnitures.views',       url(BASE_URL + '$', 'index', name='start'), -     #url(BASE_URL + '(?P<action>\w+)/$', 'action', name='action'),       ) | 
