summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--archaeological_files/forms.py16
-rw-r--r--archaeological_operations/forms.py16
-rw-r--r--archaeological_operations/models.py5
-rw-r--r--archaeological_operations/tests.py89
-rw-r--r--archaeological_operations/views.py5
-rw-r--r--ishtar_common/models.py17
-rw-r--r--ishtar_common/views.py15
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