diff options
Diffstat (limited to 'archaeological_operations')
6 files changed, 30 insertions, 292 deletions
diff --git a/archaeological_operations/data_importer.py b/archaeological_operations/data_importer.py deleted file mode 100644 index b4cd2f0d0..000000000 --- a/archaeological_operations/data_importer.py +++ /dev/null @@ -1,280 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -# Copyright (C) 2015 É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 -# published by the Free Software Foundation, either version 3 of the -# License, or (at your option) any later version. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Affero General Public License for more details. - -# You should have received a copy of the GNU Affero General Public License -# along with this program. If not, see <http://www.gnu.org/licenses/>. - -# See the file COPYING for details. - -import re - -from django.db import IntegrityError -from django.template.defaultfilters import slugify - -from ishtar_common.data_importer import * -from ishtar_common.models import Town, OrganizationType, SourceType, \ - SupportType, Format, AuthorType - -from archaeological_operations import models -from archaeological_operations.forms import OPERATOR -from archaeological_operations.utils import parse_parcels - -RE_PERMIT_REFERENCE = re.compile('[A-Za-z]*(.*)') - - -class ImportParcelFormater(ImportFormater): - NEED = ['town', ] - PARCEL_OWNER_KEY = 'associated_file' - - def post_process(self, obj, context, value, owner=None): - value = value.strip() - base_dct = {self.PARCEL_OWNER_KEY: obj, 'history_modifier': owner} - if 'parcels' in context: - for key in context['parcels']: - if context['parcels'][key]: - base_dct[key] = context['parcels'][key] - for parcel_dct in parse_parcels(value, owner=owner): - parcel_dct.update(base_dct) - try: - models.Parcel.objects.get_or_create(**parcel_dct) - except IntegrityError: - try: - p = unicode(parcel_dct) - except UnicodeDecodeError: - try: - p = str(parcel_dct).decode('utf-8') - except UnicodeDecodeError: - p = u"" - raise ImporterError(u"Erreur d'import parcelle, contexte : %s" - % p) - - -class ImportYearFormater(ImportFormater): - def post_process(self, obj, context, value, owner=None): - value = self.formater.format(value) - if not value: - return - obj.year = value.year - obj.save() - - -class TownFormater(Formater): - def __init__(self, town_full_dct={}, town_dct={}): - self._town_full_dct = town_full_dct - self._town_dct = town_dct - self._initialized = False if not self._town_full_dct else True - - def town_dct_init(self): - for town in Town.objects.all(): - key = (slugify(town.name.strip()), town.numero_insee[:2]) - if key in self._town_full_dct: - # print("Danger! %s is ambiguous with another town on the same" - # " department." % town.name) - continue - self._town_full_dct[key] = town - key = slugify(town.name.strip()) - if key in self._town_dct: - # print("Warning %s is ambiguous with no department provided" % - # town.name) - continue - self._town_dct[key] = town - self._initialized = True - - def format(self, value, extra=None): - if not self._initialized: - self.town_dct_init() - m = RE_FILTER_CEDEX.match(value) - if m: - value = m.groups()[0] - if not value: - return None - if extra: - key = (slugify(value), extra) - if key in self._town_full_dct: - return self._town_full_dct[key] - key = slugify(value) - if key in self._town_dct: - return self._town_dct[key] - - -class TownINSEEFormater(Formater): - def __init__(self): - self._town_dct = {} - - def format(self, value, extra=None): - value = value.strip() - if not value: - return None - if value in self._town_dct: - return self._town_dct[value] - q = Town.objects.filter(numero_insee=value) - if not q.count(): - return - self._town_dct[value] = q.all()[0] - return self._town_dct[value] - - -class SurfaceFormater(Formater): - def test(self): - assert self.format(u"352 123") == 352123 - assert self.format(u"456 789 m²") == 456789 - assert self.format(u"78ha") == 780000 - - def format(self, value, extra=None): - value = value.strip() - if not value: - return None - factor = 1 - if value.endswith(u"m2") or value.endswith(u"m²"): - value = value[:-2] - if value.endswith(u"ha"): - value = value[:-2] - factor = 10000 - try: - return int(value.replace(' ', '')) * factor - except ValueError: - raise ImporterError("Erreur import surface : %s" % unicode(value)) - -# RE_ADD_CD_POSTAL_TOWN = re.compile("(.*)[, ](\d{5}) (.*?) *(?: "\ -# "*CEDEX|cedex|Cedex *\d*)*") - -RE_NAME_ADD_CD_POSTAL_TOWN = re.compile( - "(.+)?[, ]*" + NEW_LINE_BREAK + "(.+)?[, ]*(\d{2} *\d{3})[, ]*(.+)") - -RE_ADD_CD_POSTAL_TOWN = re.compile("(.+)?[, ]*(\d{2} *\d{3})[, ]*(.+)") - -RE_CD_POSTAL_FILTER = re.compile("(\d*) (\d*)") - -RE_ORGA = re.compile("([^,\n]*)") - - -class OperationImporterBibracte(Importer): - OBJECT_CLS = models.Operation - DESC = u"Exports Bibracte : importeur pour l'onglet opération" - DEFAULTS = { - ('operator',): { - 'organization_type': OPERATOR - }, - } - LINE_FORMAT = [ - # CODE OPE - ImportFormater('operation_code', IntegerFormater(),), - # REGION - None, - # TYPE operation - ImportFormater('operation_type', TypeFormater(models.OperationType),), - # NOM - ImportFormater('common_name', UnicodeFormater(120),), - # OPERATEUR - ImportFormater('operator__name', UnicodeFormater(120),), - # resp. lien IMPORT avec personne - ImportFormater('in_charge__raw_name', UnicodeFormater(300),), - # début - ImportFormater('start_date', DateFormater(['%Y/%m/%d']),), - # fin - ImportFormater('excavation_end_date', DateFormater(['%Y/%m/%d']),), - # Chronos - ImportFormater('periods', TypeFormater(models.Period, many_split="&"), - required=False), - ] - -RE_PARCEL_SECT_NUM = re.compile("([A-Za-z]*)([0-9]*)") -RE_NUM_INSEE = re.compile("([0-9]*)") - - -class ParcelImporterBibracte(Importer): - OBJECT_CLS = models.Parcel - DESC = u"Exports Bibracte : importeur pour l'onglet parcelles" - DEFAULTS = { - ('operator',): { - 'organization_type': OrganizationType.objects.get( - txt_idx="operator")}, - } - LINE_FORMAT = [ - # code OA - ImportFormater('operation__operation_code', IntegerFormater(),), - # identifiant parcelle - ImportFormater( - ['section', 'parcel_number'], - [UnicodeFormater(4), UnicodeFormater(6), ], - regexp=RE_PARCEL_SECT_NUM, - regexp_formater_args=[[0], [1]], required=False, - duplicate_fields=[('external_id', False)],), - # numero parcelle - ImportFormater('parcel_number', UnicodeFormater(6), - required=False,), - # section cadastre - ImportFormater('section', UnicodeFormater(4), - required=False,), - # annee cadastre - ImportFormater('year', YearFormater(), required=False,), - # nom commune - None, - # numero INSEE commune - ImportFormater('town__numero_insee', UnicodeFormater(6), - regexp=RE_NUM_INSEE, required=False,), - # nom departement - None, - # lieu dit adresse - ImportFormater('address', UnicodeFormater(500), - required=False,), - ] - -MAIN_AUTHOR, created = AuthorType.objects.get_or_create(txt_idx='main_author') - - -class DocImporterBibracte(Importer): - OBJECT_CLS = models.OperationSource - DEFAULTS = { - ('authors',): {'author_type': MAIN_AUTHOR}, - } - DESC = u"Exports Bibracte : importeur pour l'onglet documentation" - LINE_FORMAT = [ - # code OA - ImportFormater('operation__operation_code', IntegerFormater(),), - # identifiant documentation - ImportFormater('external_id', UnicodeFormater(12),), - # type - ImportFormater('source_type', TypeFormater(SourceType), - required=False), - # nature support - ImportFormater('support_type', TypeFormater(SupportType), - required=False), - # nombre element - ImportFormater('item_number', IntegerFormater(), required=False), - # auteur - ImportFormater('authors__person__raw_name', UnicodeFormater(300), - required=False), - # annee - ImportFormater('creation_date', DateFormater(['%Y']),), - # format - ImportFormater('format_type', TypeFormater(Format), required=False), - # description legende - ImportFormater('description', UnicodeFormater(1000), required=False), - # type contenant - None, - # numero contenant - None, - # commentaire - ImportFormater('comment', UnicodeFormater(1000), required=False), - # echelle - ImportFormater('scale', UnicodeFormater(30), required=False), - # type sous contenant - None, - # numero sous contenant - None, - # informations complementaires - ImportFormater('additional_information', UnicodeFormater(1000), - required=False), - ] diff --git a/archaeological_operations/models.py b/archaeological_operations/models.py index dd3e65534..70c1c02ba 100644 --- a/archaeological_operations/models.py +++ b/archaeological_operations/models.py @@ -853,6 +853,9 @@ class RecordRelations(GeneralRecordRelations, models.Model): verbose_name = _(u"Operation record relation") verbose_name_plural = _(u"Operation record relations") ordering = ('left_record', 'relation_type') + permissions = [ + ("view_operationrelation", u"Can view all Operation relations"), + ] post_delete.connect(post_delete_record_relation, sender=RecordRelations) diff --git a/archaeological_operations/templates/ishtar/sheet_administrativeact_pdf.html b/archaeological_operations/templates/ishtar/sheet_administrativeact_pdf.html index b6d257cb0..be3e24428 100644 --- a/archaeological_operations/templates/ishtar/sheet_administrativeact_pdf.html +++ b/archaeological_operations/templates/ishtar/sheet_administrativeact_pdf.html @@ -1,6 +1,5 @@ {% extends "ishtar/sheet_administrativeact.html" %} {% block header %} -<link rel="stylesheet" href="{{STATIC_URL}}/media/style_basic.css?ver={{VERSION}}" /> {% endblock %} {% block main_head %} {{ block.super }} @@ -10,9 +9,6 @@ Ishtar – {{APP_NAME}} – {{item}} {% endblock %} {%block head_sheet%}{%endblock%} {%block main_foot%} -<div id="pdffooter"> -– <pdf:pagenumber/> – -</div> </body> </html> {%endblock%} diff --git a/archaeological_operations/templates/ishtar/sheet_operation_pdf.html b/archaeological_operations/templates/ishtar/sheet_operation_pdf.html index dc3c8b46f..7d86bd924 100644 --- a/archaeological_operations/templates/ishtar/sheet_operation_pdf.html +++ b/archaeological_operations/templates/ishtar/sheet_operation_pdf.html @@ -1,6 +1,5 @@ {% extends "ishtar/sheet_operation.html" %} {% block header %} -<link rel="stylesheet" href="{{STATIC_URL}}/media/style_basic.css?ver={{VERSION}}" /> {% endblock %} {% block main_head %} {{ block.super }} @@ -10,9 +9,6 @@ Ishtar – {{APP_NAME}} – {{item}} {% endblock %} {%block head_sheet%}{%endblock%} {%block main_foot%} -<div id="pdffooter"> -– <pdf:pagenumber/> – -</div> </body> </html> {%endblock%} diff --git a/archaeological_operations/templates/ishtar/sheet_operationsource_pdf.html b/archaeological_operations/templates/ishtar/sheet_operationsource_pdf.html index 1b2cd9ff3..68eb7aa2d 100644 --- a/archaeological_operations/templates/ishtar/sheet_operationsource_pdf.html +++ b/archaeological_operations/templates/ishtar/sheet_operationsource_pdf.html @@ -1,6 +1,5 @@ {% extends "ishtar/sheet_operationsource.html" %} {% block header %} -<link rel="stylesheet" href="{{STATIC_URL}}/media/style_basic.css?ver={{VERSION}}" /> {% endblock %} {% block main_head %} {{ block.super }} @@ -10,9 +9,6 @@ Ishtar – {{APP_NAME}} – {{item}} {% endblock %} {%block head_sheet%}{%endblock%} {%block main_foot%} -<div id="pdffooter"> -– <pdf:pagenumber/> – -</div> </body> </html> {%endblock%} diff --git a/archaeological_operations/tests.py b/archaeological_operations/tests.py index 67b89ce11..b75c02cae 100644 --- a/archaeological_operations/tests.py +++ b/archaeological_operations/tests.py @@ -19,6 +19,7 @@ import json import datetime +from subprocess import Popen, PIPE import StringIO import zipfile @@ -1043,6 +1044,32 @@ class OperationTest(TestCase, OperationInitTest): self.assertEqual(response.status_code, 200) self.assertIn('class="sheet"', response.content) + def test_show_pdf(self): + operation = self.operations[0] + c = Client() + response = c.get(reverse('show-operation', + kwargs={'pk': operation.pk, 'type': 'pdf'})) + self.assertEqual(response.status_code, 200) + # empty content when not allowed + self.assertEqual(response.content, "") + c.login(username=self.username, password=self.password) + response = c.get(reverse('show-operation', + kwargs={'pk': operation.pk, 'type': 'pdf'})) + self.assertEqual(response.status_code, 200) + f = StringIO.StringIO(response.content) + filetype = Popen("/usr/bin/file -b --mime -", shell=True, stdout=PIPE, + stdin=PIPE).communicate(f.read(1024))[0].strip() + self.assertTrue(filetype.startswith('application/pdf')) + + def test_show_odt(self): + operation = self.operations[0] + c = Client() + response = c.get(reverse('show-operation', + kwargs={'pk': operation.pk, 'type': 'pdf'})) + self.assertEqual(response.status_code, 200) + # empty content when not allowed + self.assertEqual(response.content, "") + c.login(username=self.username, password=self.password) response = c.get(reverse('show-operation', kwargs={'pk': operation.pk, 'type': 'odt'})) self.assertEqual(response.status_code, 200) |