source: tools/scripts/telemeta-crem-import.py @ 1eb6b294

cremcrem2crem3devdev2diademsdj1.6feature/breadcrumbsfeature/ts-0.5feature/ts-0.5.4feature/writecacheformagenericinstru_searchlamlam2mapsv3mergenlivemultiproductionrelease/1.4.4sabiodsearchsecurityserversocialstoragetelecastertestvideo
Last change on this file since 1eb6b294 was 1eb6b294, checked in by yomguy <yomguy@…>, 3 years ago

collection edit: fix null doc_type
import crem: add special cases, simplify

  • Property mode set to 100755
File size: 7.9 KB
Line 
1#!/usr/bin/python
2# -*- coding: utf-8 -*-
3#
4# Copyright (C) 2010 Guillaume Pellerin
5# All rights reserved.
6#
7# This software is licensed as described in the file COPYING, which
8# you should have received as part of this distribution. The terms
9# are also available at http://svn.parisson.org/telemeta/TelemetaLicense.
10#
11# Author: Guillaume Pellerin <yomguy@parisson.com>
12#
13
14import os
15import sys
16import csv
17import logging
18import datetime
19from django.core.management import setup_environ
20from django.core.files.base import ContentFile
21
22
23class Logger:
24
25    def __init__(self, file):
26        self.logger = logging.getLogger('myapp')
27        self.hdlr = logging.FileHandler(file)
28        self.formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s')
29        self.hdlr.setFormatter(self.formatter)
30        self.logger.addHandler(self.hdlr)
31        self.logger.setLevel(logging.INFO)
32
33    def info(self, prefix, message):
34        self.logger.info(' ' + prefix + ' : ' + message.decode('utf8'))
35
36    def error(self, prefix, message):
37        self.logger.error(prefix + ' : ' + message.decode('utf8'))
38
39
40class TelemetaWavImport:
41
42    def __init__(self, source_dir, log_file, pattern):
43        from django.contrib.auth.models import User
44        self.logger = Logger(log_file)
45        self.source_dir = source_dir
46        self.collections = os.listdir(self.source_dir)
47        self.pattern = pattern
48        self.user = User.objects.filter(username='admin')[0]
49
50    def write_file(self, item, wav_file, overwrite=False):
51        filename = wav_file.split(os.sep)[-1]
52        if os.path.exists(wav_file):
53            if not item.file or overwrite:
54                f = open(wav_file, 'r')
55                file_content = ContentFile(f.read())
56                item.file.save(filename, file_content)
57                f.close()
58                item.set_revision(self.user)
59            else:
60                msg = item.code + ' : fichier ' + item.file.name + ' deja inscrit dans la base de donnees !'
61                self.logger.error('item', msg)
62        else:
63            msg = item.code + ' : fichier audio ' + filename + ' inexistant dans le dossier !'
64            self.logger.error('item', msg)
65           
66    def wav_import(self):
67        from telemeta.models import MediaItem,  MediaCollection
68       
69        for collection in self.collections:
70            collection_dir = self.source_dir + os.sep + collection
71            collections = []
72           
73            if not '/.' in collection_dir and self.pattern in collection_dir:
74                collection_name = collection.split(os.sep)[-1]
75                collections.append(collection_name)
76                c = MediaCollection.objects.filter(code=collection_name)
77               
78                if not c and collection + '.csv' in collection_files:
79                    msg = collection + ' collection NON présente dans la base de données, SORTIE '
80                    self.logger.error(collection, msg)
81                    sys.exit(msg)
82                elif not c:
83                    msg = 'collection NON présente dans la base de données, CREATION '
84                    self.logger.info(collection, msg)
85                    c = MediaCollection(code=collection_name)
86                    c.save()
87                    c.set_revision(self.user)
88                else:
89                    msg = 'collection présente dans la base de données'
90                    self.logger.info(collection, msg)
91                   
92        for collection in collections:
93            collection_dir = self.source_dir + os.sep + collection
94            collection_name = collection
95            collection_files = os.listdir(collection_dir)
96            msg = '************************ ' + collection + ' ******************************'
97            self.logger.info(collection, msg[:70])
98            overwrite = True
99            csv_file = ''
100            rows = {}
101           
102            if collection + '.csv' in collection_files:
103                csv_file = self.source_dir + os.sep + collection + os.sep + collection + '.csv'
104                csv_data = csv.reader(open(csv_file), delimiter=';')
105                for row in csv_data:
106                    rows[row[1]] = row[0]
107                msg = collection + ' import du fichier CSV de la collection'
108                self.logger.info(collection, msg[:70])
109            else:
110                msg = collection + ' pas de fichier CSV dans la collection'
111                self.logger.info(collection, msg[:70])
112           
113            c = MediaCollection.objects.filter(code=collection_name)
114            if not c:
115                c = MediaCollection(code=collection_name)
116                c.save()
117                msg = ' collection NON présente dans la BDD, CREATION '
118                self.logger.info(c.code, msg)
119            else:
120                c = c[0]
121                msg = ' id = '+str(c.id)
122                self.logger.info(c.code, msg)
123           
124            audio_files = []
125            for file in collection_files:
126                ext = ['WAV', 'wav']
127                if file.split('.')[-1] in ext:
128                    audio_files.append(file)
129           
130            audio_files.sort()
131            nb_items = c.items.count()
132            counter = 0
133           
134            for file in audio_files:
135                code = file.split('.')[0]
136                wav_file = self.source_dir + os.sep + collection + os.sep + file
137               
138                if len(audio_files) <= nb_items:
139                    items = MediaItem.objects.filter(code=code)
140                   
141                    if code in rows and not items:
142                        old_ref = rows[code]
143                        items = MediaItem.objects.filter(old_code=old_ref)
144                       
145                    if items:
146                        item = items[0]
147                        msg = item.old_code + ' : Cas 1 ou 2 : id = ' + str(item.id)
148                        self.logger.info('item', msg)
149                        item.code = code
150                        item.save()
151                    else:
152                        item = MediaItem(code=code, collection=c)
153                        msg = item.code + ' : Cas 1 ou 2 : item NON présent dans la base de données, CREATION'
154                        self.logger.info('item', msg)
155                   
156                    self.write_file(item, wav_file, overwrite)
157                   
158                elif nb_items == 1 and len(audio_files) > 1:
159                    if counter == 0:
160                        msg = code + ' : Cas 3a : item n°01 présent dans la base de données, PASSE'
161                        self.logger.info('item', msg)
162                    else:
163                        item = MediaItem(code=code, collection=c)
164                        msg = item.code + ' : Cas 3a : item NON présent dans la base de données, CREATION'
165                        self.logger.info('item', msg)
166                        self.write_file(item, wav_file, overwrite)
167               
168                elif nb_items > 1 and nb_items < len(audio_files):
169                    msg = code + ' : Cas 3b : nb items < nb de fichiers audio, PAS de creation'
170                    self.logger.info('item', msg)
171
172                counter += 1
173
174def print_usage(tool_name):
175    print "Usage: "+tool_name+" <project_dir> <source_dir> <pattern> <log_file>"
176    print "  project_dir: the directory of the Django project which hosts Telemeta"
177    print "  source_dir: the directory containing the wav files to include"
178    print "  pattern: a pattern to match the collection names"
179    print "  log_file: a log file to write logs"
180
181def run():
182    if len(sys.argv) < 3:
183        print_usage(os.path.basename(sys.argv[0]))
184        sys.exit(1)
185    else:
186        project_dir = sys.argv[-4]
187        source_dir = sys.argv[-3]
188        pattern = sys.argv[-2]
189        log_file = sys.argv[-1]
190        sys.path.append(project_dir)
191        import settings
192        setup_environ(settings)
193        t = TelemetaWavImport(source_dir, log_file, pattern)
194        t.wav_import()
195
196if __name__ == '__main__':
197    run()
Note: See TracBrowser for help on using the repository browser.