summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorÉtienne Loks <etienne.loks@iggdrasil.net>2017-07-11 12:34:27 +0200
committerÉtienne Loks <etienne.loks@iggdrasil.net>2017-07-11 12:34:27 +0200
commit97c568b85ae2969cf30665e6ebcc1620721e1195 (patch)
treed37afa4bd2df2072a591465a4f48a3169c666c78
parentf7646d7c72bc781aa95b73dbbbb87ec329304581 (diff)
downloadIshtar-97c568b85ae2969cf30665e6ebcc1620721e1195.tar.bz2
Ishtar-97c568b85ae2969cf30665e6ebcc1620721e1195.zip
Simple migration script for old ODT templates (refs #3602)
-rw-r--r--archaeological_files/tests.py15
-rw-r--r--archaeological_operations/tests.py32
-rw-r--r--ishtar_common/management/commands/ishtar_migrate_odts.py91
-rw-r--r--ishtar_common/models.py40
-rw-r--r--ishtar_common/utils.py14
5 files changed, 191 insertions, 1 deletions
diff --git a/archaeological_files/tests.py b/archaeological_files/tests.py
index 8bbcf904a..a43068e6f 100644
--- a/archaeological_files/tests.py
+++ b/archaeological_files/tests.py
@@ -29,10 +29,23 @@ from ishtar_common.tests import TestCase
from ishtar_common.models import Town, IshtarSiteProfile
from archaeological_files import models
-from archaeological_operations.models import Parcel, ParcelOwner
+from archaeological_operations.models import Parcel, ParcelOwner, ActType, \
+ AdministrativeAct
from archaeological_operations.tests import OperationInitTest, FileInit
+def create_administrativact(user, fle):
+ act_type, created = ActType.objects.get_or_create(
+ txt_idx='act_type_F', intented_to='F')
+ dct = {'history_modifier': user,
+ 'act_type': act_type,
+ 'associated_file': fle,
+ 'signature_date': datetime.date(2017, 07, 10),
+ 'index': 22}
+ adminact, created = AdministrativeAct.objects.get_or_create(**dct)
+ return [act_type], [adminact]
+
+
class FileTest(TestCase, FileInit):
fixtures = [settings.ROOT_PATH +
'../fixtures/initial_data-auth-fr.json',
diff --git a/archaeological_operations/tests.py b/archaeological_operations/tests.py
index f2bb390bd..8ca14179f 100644
--- a/archaeological_operations/tests.py
+++ b/archaeological_operations/tests.py
@@ -1124,6 +1124,38 @@ class RegisterTest(TestCase, OperationInitTest):
z.close()
f.close()
+ def test_document_migration(self):
+ fe = FileInit()
+ fe.create_file()
+
+ from archaeological_files.tests import create_administrativact as ca_fle
+ ca_fle(self.user, fe.item)
+
+ tpl = open(
+ settings.ROOT_PATH +
+ '../ishtar_common/tests/old.odt',
+ 'rb')
+ template = SimpleUploadedFile(tpl.name, tpl.read())
+ doc = DocumentTemplate.objects.create(
+ name="Old",
+ associated_object_name=DocumentTemplate.CLASSNAMES[0][0],
+ available=True,
+ template=template
+ )
+ self.act_types[0].associated_template.add(doc)
+
+ doc.convert_from_v1()
+ with open(doc.template.path) as f:
+ try:
+ z = zipfile.ZipFile(f)
+ self.assertIsNone(z.testzip())
+ c = z.open('content.xml')
+ content = c.read()
+ self.assertIn('{{ adminact_operator_id }}', content)
+ finally:
+ c.close()
+ z.close()
+
class OperationWizardCreationTest(WizardTest, OperationInitTest, TestCase):
fixtures = [settings.ROOT_PATH +
diff --git a/ishtar_common/management/commands/ishtar_migrate_odts.py b/ishtar_common/management/commands/ishtar_migrate_odts.py
index e69de29bb..49ed9f2d8 100644
--- a/ishtar_common/management/commands/ishtar_migrate_odts.py
+++ b/ishtar_common/management/commands/ishtar_migrate_odts.py
@@ -0,0 +1,91 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+# Copyright (C) 2017 É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.
+
+from django.core.management.base import BaseCommand
+from optparse import make_option
+import sys
+
+from ishtar_common.models import DocumentTemplate
+from ishtar_common.utils import BColors
+
+try:
+ input = raw_input
+except NameError:
+ pass
+
+
+class Command(BaseCommand):
+ help = "Update ODT templates from v1 to v2"
+ option_list = BaseCommand.option_list + (
+ make_option('--quiet',
+ action='store_true',
+ dest='quiet',
+ default=False,
+ help='Proceed silently with no interactive input.'),
+ )
+
+ def interactive_start(self):
+ sys.stdout.write(
+ BColors.HEADER + BColors.BOLD +
+ "Update ODT templates from v1 to v2\n")
+ sys.stdout.write(
+ BColors.ENDC + BColors.WARNING +
+ "This script need to be run only once. Running it on already "
+ "migrated ODT files may be a source of error.\n")
+ sys.stdout.write(BColors.ENDC)
+ yes = None
+ while yes != "yes":
+ sys.stdout.write(
+ "Are you sure you want to proceed? (yes/[n])\n")
+ yes = input()
+ if not yes or yes == "n":
+ sys.stdout.write(BColors.FAIL + "Aborting\n")
+ sys.stdout.write(BColors.ENDC)
+ sys.exit()
+
+ def handle(self, *args, **options):
+ quiet = options['quiet']
+ if not quiet:
+ self.interactive_start()
+ q = DocumentTemplate.objects
+ nb = q.count()
+ len_of_nb = str(len(str(nb)))
+ if not quiet:
+ sys.stdout.write(BColors.OKGREEN)
+
+ errors = []
+ for idx, document in enumerate(q.all()):
+ if not quiet:
+ sys.stdout.write(
+ ("Processing {:" + len_of_nb + "d}/{}\r").format(
+ idx + 1, nb))
+ sys.stdout.flush()
+ try:
+ document.convert_from_v1()
+ except IOError as e:
+ errors.append("Document ({}): ".format(document.pk) +
+ str(e))
+ if errors:
+ sys.stdout.write(BColors.FAIL + "Error while processing:\n")
+ for error in errors:
+ sys.stdout.write("* {}\n".format(error))
+
+ sys.stdout.write(BColors.ENDC)
+ print("\n\n")
+
diff --git a/ishtar_common/models.py b/ishtar_common/models.py
index caf9be26c..2a7e386b2 100644
--- a/ishtar_common/models.py
+++ b/ishtar_common/models.py
@@ -1617,6 +1617,46 @@ class DocumentTemplate(models.Model):
output.write(result)
return output_name
+ def convert_from_v1(self):
+ """
+ Convert the current template from v1 to v2.
+ """
+ from old.ooo_replace import ooo_replace
+ from archaeological_operations.models import AdministrativeAct
+
+ old_dir = settings.MEDIA_ROOT + "/upload/templates/v1/"
+ if not os.path.exists(old_dir):
+ os.makedirs(old_dir)
+ shutil.copy(settings.MEDIA_ROOT + self.template.name, old_dir)
+
+ tempdir = tempfile.mkdtemp("-ishtardocs")
+ output_name = tempdir + os.path.sep + self.template.name.split(
+ os.sep)[-1]
+
+ objects = []
+ filters = [
+ {'operation__isnull': False},
+ {'associated_file__isnull': False},
+ {'treatment_file__isnull': False},
+ {'treatment__isnull': False},
+ ]
+ for filtr in filters:
+ q = AdministrativeAct.objects.filter(**filtr)
+ if q.count():
+ objects.append(q.all()[0])
+
+ if not objects:
+ return
+ values = {}
+ for obj in objects:
+ values.update(obj.get_values())
+ for key in values:
+ values[key] = "{{ " + key + " }}"
+
+ ooo_replace(self.template, output_name, values)
+ shutil.move(output_name, settings.MEDIA_ROOT + self.template.name)
+ return output_name
+
class State(models.Model):
label = models.CharField(_(u"Label"), max_length=30)
diff --git a/ishtar_common/utils.py b/ishtar_common/utils.py
index 555a338f8..19ff16394 100644
--- a/ishtar_common/utils.py
+++ b/ishtar_common/utils.py
@@ -32,6 +32,20 @@ from django.utils.translation import ugettext_lazy as _, ugettext
from django.template.defaultfilters import slugify
+class BColors:
+ """
+ Bash colors. Don't forget to finish your colored string with ENDC.
+ """
+ HEADER = '\033[95m'
+ OKBLUE = '\033[94m'
+ OKGREEN = '\033[92m'
+ WARNING = '\033[93m'
+ FAIL = '\033[91m'
+ ENDC = '\033[0m'
+ BOLD = '\033[1m'
+ UNDERLINE = '\033[4m'
+
+
def get_current_year():
return datetime.datetime.now().year