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

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

bugfix, cleanup

  • Property mode set to 100755
File size: 7.4 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
21from django.contrib.auth.models import User
22
23
24class Logger:
25
26    def __init__(self, file):
27        self.logger = logging.getLogger('myapp')
28        self.hdlr = logging.FileHandler(file)
29        self.formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s')
30        self.hdlr.setFormatter(self.formatter)
31        self.logger.addHandler(self.hdlr)
32        self.logger.setLevel(logging.INFO)
33
34    def info(self, prefix, message):
35        self.logger.info(' ' + prefix + ' : ' + message.decode('utf8'))
36
37    def error(self, prefix, message):
38        self.logger.error(prefix + ' : ' + message.decode('utf8'))
39
40
41class TelemetaWavImport:
42
43    def __init__(self, source_dir, log_file, pattern):
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')
49
50    def write_file(self, item, wav_file, overwrite=False):
51        if os.path.exists(wav_file):
52            if not item.file or overwrite:
53                f = open(wav_file, 'r')
54                file_content = ContentFile(f.read())
55                item.file.save(filename, file_content)
56                f.close()
57                item.code = new_ref
58                item.save()
59                item.set_revision(self.user)
60            else:
61                msg = code + ' : fichier ' + wav_file + ' déjà existant ! PASS'
62                self.logger.error(collection, msg)
63        else:
64            msg = code + ' : fichier audio ' + wav_file + ' inexistant ! PASS'
65            self.logger.error(collection, msg)
66           
67    def wav_import(self):
68        from telemeta.models import MediaItem,  MediaCollection
69       
70        for collection in self.collections:
71            collection_dir = self.source_dir + os.sep + collection
72            collection_files = os.listdir(collection_dir)
73           
74            if not '/.' in collection_dir and self.pattern in collection_dir:
75                collection_name = collection.split(os.sep)[-1]
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, PASS '
90                    self.logger.info(collection, msg)
91                   
92        for collection in self.collections:
93            collection_dir = self.source_dir + os.sep + collection
94           
95            if not '/.' in collection_dir and self.pattern in collection_dir:
96                collection_name = collection.split(os.sep)[-1]
97                msg = '************************ ' + collection + ' ******************************'
98                self.logger.info(collection, msg[:70])
99                collection_files = os.listdir(collection_dir)
100               
101                if not collection + '.csv' in collection_files:
102                    msg = collection + ' pas de fichier CSV dans la collection'
103                    self.logger.info(collection, msg[:70])
104                    c = MediaCollection.objects.filter(code=collection_name)
105                   
106                    if not c:
107                        msg = collection + ' collection NON présente dans la BDD, CREATION '
108                        self.logger.info(collection, msg)
109                        c = MediaCollection(code=collection_name)
110                        c.save()
111                    else:
112                        msg = ' : id = '+str(c.id)+" : title = "+c.title+' SELECTION'
113                        self.logger.info(collection, msg)
114                        c = c[0]
115                       
116                    for filename in collection_files:
117                        wav_file = self.source_dir + os.sep + collection + os.sep + filename
118                        code = filename.split('.')[0]
119                        items = MediaItem.objects.filter(code=code)
120                       
121                        if len(items) != 0:
122                            msg = ' : id = '+str(item.id)+" : title = "+item.title+' SELECTION'
123                            self.logger.info(item, msg)
124                            item = items[0]
125                        else:
126                            msg = item.code + ' : item NON présent dans la base de données, CREATION'
127                            self.logger.info(item, msg)
128                            item = MediaItem(code=code, collection=c)
129                           
130                        self.write_file(item, wav_file, True)
131
132                else:
133                    csv_file = self.source_dir + os.sep + collection + os.sep + collection + '.csv'
134                    c = csv.reader(open(csv_file), delimiter=';')
135                   
136                    for row in c:
137                        old_ref = row[0]
138                        new_ref = row[1]
139                        filename = new_ref + '.wav'
140                        wav_file = self.source_dir + os.sep + collection + os.sep + filename
141                        items = MediaItem.objects.filter(old_code=old_ref)
142               
143                        if items:
144                            item = items[0]
145                            msg = item.old_code + ' : id = ' + str(item.id) + " : title = " + item.title
146                            self.logger.info(item, msg)
147                            self.write_file(item, wav_file, True)
148                        else:
149                            msg = old_ref + ' : item inexistant dans la base de données ! PASS'
150                            self.logger.error(item, msg)
151
152
153def print_usage(tool_name):
154    print "Usage: "+tool_name+" <project_dir> <source_dir> <pattern> <log_file>"
155    print "  project_dir: the directory of the Django project which hosts Telemeta"
156    print "  source_dir: the directory containing the wav files to include"
157    print "  pattern: a pattern to match the collection names"
158    print "  log_file: a log file to write logs"
159
160def run():
161    if len(sys.argv) < 3:
162        print_usage(os.path.basename(sys.argv[0]))
163        sys.exit(1)
164    else:
165        project_dir = sys.argv[-4]
166        source_dir = sys.argv[-3]
167        pattern = sys.argv[-2]
168        log_file = sys.argv[-1]
169        sys.path.append(project_dir)
170        import settings
171        setup_environ(settings)
172        t = TelemetaWavImport(source_dir, log_file, pattern)
173        t.wav_import()
174
175if __name__ == '__main__':
176    run()
Note: See TracBrowser for help on using the repository browser.