summaryrefslogtreecommitdiff
path: root/archaeological_operations/management/commands/import_operations.py
blob: de64931a0bf198b619fda13ef83b8a50a3aedb04 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
#!/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 datetime, unicodecsv

from django.conf import settings
from django.core.management.base import BaseCommand, CommandError

from archaeological_operations.data_importer import *

IMPORTERS = {
        'bibracte-operation':OperationImporterBibracte,
        'bibracte-parcelle':ParcelImporterBibracte,
        }

try:
    from archaeological_context_records.data_importer import *
    IMPORTERS['bibracte-UE'] = ContextRecordsImporterBibracte
    IMPORTERS['bibracte-rel-UE'] = ContextRecordsRelationImporterBibracte
except ImportError:
    pass

try:
    from archaeological_finds.data_importer import *
    IMPORTERS['bibracte-finds'] = FindsImporterBibracte
    IMPORTERS['bibracte-finds-alt'] = FindAltImporterBibracte
    IMPORTERS['bibracte-treatments'] = TreatmentImporterBibracte
except ImportError:
    pass

class Command(BaseCommand):
    args = '<filename> <importer_name> [<nb lines skipped>]'
    help = "Import archaeological operations"

    def handle(self, *args, **options):
        if not args or not args[0]:
            raise CommandError("No file provided.")
        if len(args) < 2 or args[1] not in IMPORTERS:
            msg = "Bad importer. \nAvailable importers are:\n"
            for key in IMPORTERS:
                msg += "\t* %s: %s\n" % (key, IMPORTERS[key].DESC.encode('utf-8')
                                     or "-")
            raise CommandError(msg)
        try:
            skip_lines = int(args[2])
        except:
            skip_lines = 0
        filename = args[0]
        importer = IMPORTERS[args[1]](skip_lines=skip_lines, output='cli')
        sys.stdout.write("*" * 72 + "\n")
        msg = "* Importer - %s" % importer.DESC
        if len(msg) < 72:
            msg += (71 - len(msg))*" " + "*\n"
        sys.stdout.write(msg)
        sys.stdout.write("*" * 72 + "\n\n")
        sys.stdout.write("Processing...")
        with open(filename) as csv_file:
            encodings = [settings.ENCODING, settings.ALT_ENCODING, 'utf-8']
            for encoding in encodings:
                try:
                    importer.importation([line for line in
                            unicodecsv.reader(csv_file, encoding='utf-8')])
                    errors = importer.get_csv_errors()
                    sys.stdout.write("\n")
                    if errors:
                        print errors
                        now = datetime.datetime.now().isoformat('-'
                                                ).replace(':','')
                        error_file = '.'.join(filename.split('.')[:-1]) \
                                     + "_errors_%s.csv" % now
                        sys.stdout.write("Some errors as occured during the ")
                        sys.stdout.write("import.\n")
                        try:
                            with open(error_file, 'w') as fle:
                                fle.write(errors.encode('utf-8'))
                            sys.stdout.write("A report has been create in file:"\
                                             " \"%s\"" % error_file)
                        except IOError:
                            sys.stdout.write("Cannot create CSV error file \"%s\"." %
                                             error_file)
                    sys.stdout.write(
                        "\n\n* %d item(s) updated, %d item(s) created.\n" % (
                            importer.number_updated, importer.number_created))
                    break
                except ImporterError, e:
                    if e.type == ImporterError.HEADER and encoding != encodings[-1]:
                        csv_file.seek(0)
                        continue
                except UnicodeDecodeError:
                    if encoding != encodings[-1]:
                        csv_file.seek(0)
                        continue
        sys.stdout.write("\n\n")