diff options
| -rw-r--r-- | archaeological_files/forms.py | 16 | ||||
| -rw-r--r-- | archaeological_operations/forms.py | 16 | ||||
| -rw-r--r-- | archaeological_operations/models.py | 5 | ||||
| -rw-r--r-- | archaeological_operations/tests.py | 89 | ||||
| -rw-r--r-- | archaeological_operations/views.py | 5 | ||||
| -rw-r--r-- | ishtar_common/models.py | 17 | ||||
| -rw-r--r-- | ishtar_common/views.py | 15 | 
7 files changed, 134 insertions, 29 deletions
| diff --git a/archaeological_files/forms.py b/archaeological_files/forms.py index 48ed874ff..0879f428e 100644 --- a/archaeological_files/forms.py +++ b/archaeological_files/forms.py @@ -45,6 +45,9 @@ from archaeological_operations.forms import AdministrativeActOpeForm, \      ParcelField  from ishtar_common import widgets +GENERAL_CONTRACTOR, created = PersonType.objects.get_or_create( +                                    txt_idx='general_contractor') +  class FileSelect(TableSelect):      year = forms.IntegerField(label=_("Year"))      numeric_reference = forms.IntegerField(label=_("Numeric reference")) @@ -60,15 +63,14 @@ class FileSelect(TableSelect):              label=_(u"General contractor"),              widget=widgets.JQueryAutoComplete(                  reverse_lazy('autocomplete-person', -                args=[PersonType.objects.get(txt_idx='general_contractor').pk]), +                args=[GENERAL_CONTRACTOR.pk]),                  associated_model=Person),              validators=[valid_id(Person)])      general_contractor__attached_to = forms.IntegerField(                  label=_(u"Organization of general contractor"),              widget=widgets.JQueryAutoComplete(                  reverse_lazy('autocomplete-organization', -                args=[OrganizationType.objects.get( -                                        txt_idx='general_contractor').pk]), +                args=[GENERAL_CONTRACTOR.pk]),                  associated_model=Organization),              validators=[valid_id(Organization)])      in_charge = forms.IntegerField( @@ -165,6 +167,8 @@ class FileFormGeneralRO(FileFormGeneral):      numeric_reference = forms.IntegerField(label=_(u"Numeric reference"),                          widget=forms.TextInput(attrs={'readonly':True})) +RESPONSIBLE_PLANNING_SERVICE, created = PersonType.objects.get_or_create( +                               txt_idx='responsible_planning_service')  class FileFormPreventive(forms.Form):      form_label = _(u"Preventive informations")      associated_models = {'general_contractor':Person, @@ -181,8 +185,7 @@ class FileFormPreventive(forms.Form):              label=_(u"Responsible for town planning service"),              widget=widgets.JQueryAutoComplete(                  reverse_lazy('autocomplete-person', -                    args=[PersonType.objects.get( -                        txt_idx='responsible_planning_service').pk]), +                    args=[RESPONSIBLE_PLANNING_SERVICE.pk]),                      associated_model=Person, new=True),              validators=[valid_id(Person)])      permit_type = forms.ChoiceField(label=_(u"Permit type"), required=False, @@ -298,8 +301,7 @@ class AdministrativeActFileSelect(TableSelect):                  label=_(u"Organization of general contractor"),              widget=widgets.JQueryAutoComplete(                  reverse_lazy('autocomplete-organization', -                args=[OrganizationType.objects.get( -                                        txt_idx='general_contractor').pk]), +                args=[GENERAL_CONTRACTOR.pk]),                  associated_model=Organization),              validators=[valid_id(Organization)])      associated_file__numeric_reference = forms.IntegerField( diff --git a/archaeological_operations/forms.py b/archaeological_operations/forms.py index 9bdb9ac77..dc9513977 100644 --- a/archaeological_operations/forms.py +++ b/archaeological_operations/forms.py @@ -185,6 +185,10 @@ ParcelFormSet = formset_factory(ParcelForm, can_delete=True,                                  formset=ParcelFormSet)  ParcelFormSet.form_label = _(u"Parcels") +SRA_AGENT, created =PersonType.objects.get_or_create(txt_idx='sra_agent') +HEAD_SCIENTIST, created = PersonType.objects.get_or_create( +                                    txt_idx='head_scientist') +  class OperationSelect(TableSelect):      year = forms.IntegerField(label=_("Year"))      operation_code = forms.IntegerField(label=_(u"Numeric reference")) @@ -198,8 +202,7 @@ class OperationSelect(TableSelect):      scientist = forms.IntegerField(          widget=widgets.JQueryAutoComplete(reverse_lazy('autocomplete-person',            args=["_".join( -         [unicode(PersonType.objects.get(txt_idx='head_scientist').pk), -          unicode(PersonType.objects.get(txt_idx='sra_agent').pk)])]), +         [unicode(HEAD_SCIENTIST.pk), unicode(SRA_AGENT.pk)])]),          associated_model=Person), label=_(u"Scientist in charge"))      in_charge = forms.IntegerField(          widget=widgets.JQueryAutoComplete(reverse_lazy('autocomplete-person', @@ -284,6 +287,8 @@ class OperationFormFileChoice(forms.Form):                                             associated_model=File),           validators=[valid_id(File)], required=False) +OPERATOR, created  = OrganizationType.objects.get_or_create(txt_idx='operator') +  class OperationFormGeneral(forms.Form):      form_label = _(u"General")      base_model = 'archaeological_site' @@ -297,14 +302,12 @@ class OperationFormGeneral(forms.Form):      scientist = forms.IntegerField(label=_("Head scientist"),          widget=widgets.JQueryAutoComplete(reverse_lazy('autocomplete-person',            args=["_".join( -         [unicode(PersonType.objects.get(txt_idx='head_scientist').pk), -          unicode(PersonType.objects.get(txt_idx='sra_agent').pk)])]), +         [unicode(HEAD_SCIENTIST.pk), unicode(SRA_AGENT.pk)])]),          associated_model=Person, new=True),          validators=[valid_id(Person)], required=False)      operator = forms.IntegerField(label=_("Operator"),          widget=widgets.JQueryAutoComplete(reverse_lazy( -                'autocomplete-organization', -                args=[OrganizationType.objects.get(txt_idx='operator').pk]), +                'autocomplete-organization', args=[OPERATOR.pk]),          associated_model=Organization, new=True),          validators=[valid_id(Organization)], required=False)      in_charge = forms.IntegerField(label=_("In charge"), @@ -732,6 +735,7 @@ class GenerateDocForm(forms.Form):                  [(choice.pk , unicode(choice)) for choice in choices]  class AdministrativeActRegisterSelect(AdministrativeActOpeSelect): +    indexed = forms.NullBooleanField(label=_(u"Indexed?"))      def __init__(self, *args, **kwargs):          super(AdministrativeActRegisterSelect, self).__init__(*args, **kwargs) diff --git a/archaeological_operations/models.py b/archaeological_operations/models.py index 65f544721..7bd84c6e7 100644 --- a/archaeological_operations/models.py +++ b/archaeological_operations/models.py @@ -58,6 +58,10 @@ class OperationType(GeneralType):              except cls.DoesNotExist:                  pass          items = cls.objects.filter(**dct) +        if default: +            exclude.append(default.txt_idx) +        if exclude: +            items = items.exclude(txt_idx__in=exclude)          current_preventive, current_lst = None, None          for item in items.order_by(*cls._meta.ordering).all():              if not current_lst or item.preventive != current_preventive: @@ -486,6 +490,7 @@ class AdministrativeAct(BaseHistorizedItem, OwnPerms, ValueGetter):      _prefix = 'adminact_'      class Meta: +        ordering = ('index', 'act_type')          verbose_name = _(u"Administrative act")          verbose_name_plural = _(u"Administrative acts")          permissions = ( diff --git a/archaeological_operations/tests.py b/archaeological_operations/tests.py index 0a48f4d4a..afcbc39ff 100644 --- a/archaeological_operations/tests.py +++ b/archaeological_operations/tests.py @@ -1,6 +1,6 @@  #!/usr/bin/env python  # -*- coding: utf-8 -*- -# Copyright (C) 2012-2013 Étienne Loks  <etienne.loks_AT_peacefrogsDOTnet> +# Copyright (C) 2012-2014 Étienne Loks  <etienne.loks_AT_peacefrogsDOTnet>  # This program is free software: you can redistribute it and/or modify  # it under the terms of the GNU Affero General Public License as @@ -20,20 +20,27 @@  """  Unit tests  """ -import json, os +import json, os, datetime +from django.conf import settings  from django.core.management import call_command +from django.core.urlresolvers import reverse  from django.test import TestCase +from django.test.client import Client  from django.contrib.auth.models import User  import models -from ishtar_common.models import OrganizationType, Organization, Town +from ishtar_common.models import OrganizationType, Organization, Town, \ +                                 PersonType  class ImportOperationTest(TestCase): -    fixtures = [settings.ROOT_PATH + '../ishtar_common/fixtures/initial_data.json', -                settings.ROOT_PATH + '../archaeological_files/fixtures/initial_data.json', -                settings.ROOT_PATH + '../archaeological_operations/fixtures/initial_data-fr.json'] +    fixtures = [settings.ROOT_PATH + +                '../ishtar_common/fixtures/initial_data.json', +                settings.ROOT_PATH + +                '../archaeological_files/fixtures/initial_data.json', +                settings.ROOT_PATH + +                '../archaeological_operations/fixtures/initial_data-fr.json']      def setUp(self):          user = User.objects.create_user('username') @@ -296,3 +303,73 @@ class ImportOperationTest(TestCase):                                                         value)                               ) +def create_user(): +    username = 'username4277' +    password = 'dcbqj756456!@%' +    user = User.objects.create_superuser(username, "nomail@nomail.com", +                                              password) +    return username, password, user + +def create_operation(user): +    dct = {'year':2010, 'operation_type_id':1, +               'history_modifier':user,} +    operations = [models.Operation.objects.create(**dct)] +    return operations + +class OperationTest(TestCase): +    fixtures = [settings.ROOT_PATH + +                '../ishtar_common/fixtures/initial_data.json', +                settings.ROOT_PATH + +                '../archaeological_files/fixtures/initial_data.json', +                settings.ROOT_PATH + +                '../archaeological_operations/fixtures/initial_data-fr.json'] + +    def setUp(self): +        self.username, self.password, self.user = create_user() +        self.operations = create_operation(self.user) +        self.item = self.operations[0] + +    def testSearch(self): +        c = Client() +        response = c.get(reverse('get-operation'), {'year': '2010',}) +        # no result when no authentification +        self.assertTrue(not json.loads(response.content)) +        c.login(username=self.username, password=self.password) +        response = c.get(reverse('get-operation'), {'year': '2010',}) +        self.assertTrue(json.loads(response.content)['total'] == 1) + +def create_administrativact(user, operation): +    act_type, created = models.ActType.objects.get_or_create(txt_idx='act_type') +    dct = {'history_modifier':user, +           'act_type':act_type, +           'operation':operation, +           'signature_date':datetime.date(2014, 05, 12), +           'index':322} +    adminact, created = models.AdministrativeAct.objects.get_or_create(**dct) +    return [act_type], [adminact] + + +class RegisterTest(TestCase): +    fixtures = [settings.ROOT_PATH + +                '../ishtar_common/fixtures/initial_data.json', +                settings.ROOT_PATH + +                '../archaeological_files/fixtures/initial_data.json', +                settings.ROOT_PATH + +                '../archaeological_operations/fixtures/initial_data-fr.json'] + +    def setUp(self): +        self.username, self.password, self.user = create_user() +        self.operations = create_operation(self.user) +        self.act_types, self.operations = create_administrativact( +                                            self.user, self.operations[0]) + +    def testSearch(self): +        c = Client() +        response = c.get(reverse('get-administrativeact'), {'year': '2014',}) +        # no result when no authentification +        self.assertTrue(not json.loads(response.content)) +        c.login(username=self.username, password=self.password) +        response = c.get(reverse('get-administrativeact'), {'year': '2014',}) +        self.assertTrue(json.loads(response.content)['total'] == 1) +        response = c.get(reverse('get-administrativeact'), {'indexed': '2',}) +        self.assertTrue(json.loads(response.content)['total'] == 1) diff --git a/archaeological_operations/views.py b/archaeological_operations/views.py index 5d5038758..4156f09be 100644 --- a/archaeological_operations/views.py +++ b/archaeological_operations/views.py @@ -155,7 +155,10 @@ get_administrativeactop = get_item(models.AdministrativeAct,  get_administrativeact = get_item(models.AdministrativeAct,      'get_administrativeact', 'administrativeact', -    extra_request_keys={'year':'signature_date__year',}) +    extra_request_keys={'year':'signature_date__year', +                        'indexed':'index__isnull', +                        'operation__towns':'operation__towns__pk'}, +    reversed_bool_fields = ['index__isnull'],)  show_administrativeact = show_item(models.AdministrativeAct, 'administrativeact')  def dashboard_operation(request, *args, **kwargs): diff --git a/ishtar_common/models.py b/ishtar_common/models.py index 1ff809315..429c8217b 100644 --- a/ishtar_common/models.py +++ b/ishtar_common/models.py @@ -56,8 +56,7 @@ def post_save_user(sender, **kwargs):          ishtaruser = q.all()[0]      if ishtaruser.is_superuser \         and not ishtaruser.has_right('administrator'): -        ishtaruser.person.person_types.add(PersonType.objects.get( -                                                   txt_idx='administrator')) +        ishtaruser.person.person_types.add(ADMINISTRATOR)  post_save.connect(post_save_user, sender=User)  class ValueGetter(object): @@ -318,6 +317,12 @@ class GeneralType(models.Model):              for child in cls._get_childs(item, dct, instances, exclude=exclude):                  yield child +    def save(self, *args, **kwargs): +        if not self.id and not self.label: +            self.label = u" ".join(u" ".join(self.txt_idx.split('-') +                                                        ).split('_')).title() +        return super(GeneralType, self).save(*args, **kwargs) +  class ImageModel(models.Model):      image = models.ImageField(upload_to="upload/", blank=True, null=True)      thumbnail = models.ImageField(upload_to='upload/thumbs/', blank=True, @@ -758,6 +763,9 @@ class PersonType(GeneralType):          verbose_name_plural = _(u"Person types")          ordering = ('label',) +ADMINISTRATOR, created = PersonType.objects.get_or_create( +                                            txt_idx='administrator') +  class Person(Address, OwnPerms, ValueGetter) :      _prefix = 'person_'      TYPE = (('Mr', _(u'Mr')), @@ -859,9 +867,10 @@ class IshtarUser(User):          email = user.email          person_type = None          if user.is_superuser: -            person_type = PersonType.objects.get(txt_idx='administrator') +            person_type = ADMINISTRATOR          else: -            person_type = PersonType.objects.get(txt_idx='public_access') +            person_type, created = PersonType.objects.get_or_create( +                                                txt_idx='public_access')          person = Person.objects.create(title='Mr', surname=surname,                                         name=name, email=email,                                         history_modifier=user) diff --git a/ishtar_common/views.py b/ishtar_common/views.py index 7440e0170..9a20fadd5 100644 --- a/ishtar_common/views.py +++ b/ishtar_common/views.py @@ -217,17 +217,22 @@ def get_item(model, func_name, default_name, extra_request_keys=[],              if specific_perms and perm not in specific_perms:                  continue              if request.user.has_perm(perm) \ -             or request.user.ishtaruser.has_right(perm): +             or (request.user.is_authenticated() +                 and request.user.ishtaruser.has_right(perm)):                  allowed = True                  if "_own_" not in perm:                      own = False                      break # max right reach -        if not allowed: -            return HttpResponse(None, mimetype='text/plain') +        EMPTY, mimetype = '', 'text/plain'          if 'type' in dct:              data_type = dct.pop('type') +            if data_type == 'csv': +               mimetype = 'text/csv'          if not data_type: +            EMPTY = '[]'              data_type = 'json' +        if not allowed: +            return HttpResponse(EMPTY, mimetype='text/plain')          fields = [model._meta.get_field_by_name(k)[0]                    for k in model._meta.get_all_field_names()]          request_keys = dict([(field.name, @@ -247,7 +252,7 @@ def get_item(model, func_name, default_name, extra_request_keys=[],          try:              old = 'old' in request_items and int(request_items['old'])          except ValueError: -            return HttpResponse(None, mimetype='text/plain') +            return HttpResponse('[]', mimetype='text/plain')          for k in request_keys:              q = request_items.get(k)              if not q: @@ -452,7 +457,7 @@ def get_item(model, func_name, default_name, extra_request_keys=[],              for data in datas:                  writer.writerow([val.encode(ENCODING) for val in data[1:]])              return response -        return HttpResponse(None, mimetype='text/plain') +        return HttpResponse('{}', mimetype='text/plain')      return func | 
