command to export data to xml files.
authorcavaliet
Fri, 15 Feb 2013 19:03:15 +0100
changeset 42 277ebc746baf
parent 41 92e530850200
child 43 119cd616faa4
command to export data to xml files.
src/egonomy/management/commands/export_to_xml.py
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/egonomy/management/commands/export_to_xml.py	Fri Feb 15 19:03:15 2013 +0100
@@ -0,0 +1,141 @@
+# -*- coding: utf-8 -*-
+'''
+Created on Jan 31, 2013
+
+@author: ymh
+'''
+
+from ..utils import show_progress
+from django.core.management.base import BaseCommand, CommandError
+from django.conf import settings
+from egonomy.models import Image, ImageInfo, ImageMetadata
+import os.path
+
+
+class Command(BaseCommand):
+    '''
+    Export data in xml files
+    '''
+
+    args = 'path_to_folder'
+    help = 'Export data to xml in senseetive format. Only one argument is needed : the folder where xml files will be saved.'
+    
+    
+    def __safe_get(self, dict_arg, key, conv = lambda x: x, default= None):
+        val = dict_arg.get(key, default)
+        return conv(val) if val else default
+
+    def __safe_decode(self, s):
+        if not isinstance(s, basestring):
+            return s
+        try:
+            return s.decode('utf8')
+        except:
+            try:
+                return s.decode('latin1')
+            except:
+                return s.decode('utf8','replace')
+
+    def handle(self, *args, **options):
+        """
+        <?xml version="1.0" encoding="UTF-8"?>
+        <content>
+            <title>T</title>
+            <abstract>A</abstract>
+            <keyword>KW 1/keyword>
+            <keyword>KW 2</keyword>
+            <keyword>KW 3</keyword>
+            <!-- metadatas are : cliche, inventaire, date, longueur, hauteur, profondeur, diametre, photographe, auteur, 
+                                 droits, mentions, periode, technique, site, lieu, localisation -->
+            <metadata>
+                <name>name of metadata 1</name>
+                <value>value of metadata 1</value>
+            </metadata>
+            <metadata>
+                <name>name of metadata 2</name>
+                <value>name of metadata 2</value>
+            </metadata>
+        </content>
+
+        """
+        if len(args) != 1:
+            raise CommandError("The command has no argument or too much arguments. Only one is needed : the folder where xml files will be saved.")
+        
+        path = args[0].rstrip(os.sep) + os.sep
+        
+        do_export = True
+        if (not os.listdir(path)==[]) and not (len(os.listdir(path))==1 and os.listdir(path)[0]=='.DS_Store'):
+            confirm = raw_input("""
+    The folder already contains files or subfolders. The command will create a LOT of folders and xml files. Do you want to continue ?
+
+    Type 'y' to continue, or 'n' to quit: """)
+            do_export = (confirm == "y")
+        
+        if do_export:
+            print("Beginning...")
+            writer = None
+            counter = 0
+            print("Getting info from images...")
+            img_list = Image.objects.all().select_related('info', 'metadata')
+            nb_img = img_list.count()
+            print("Creating xml files from %d images..." % nb_img)
+            writer = show_progress(counter, nb_img, "", 40, writer)
+            errors = []
+            for img in img_list:
+                counter += 1
+                # An img.info.image_file path is like "images/XX/YYY.jpg" so we split and create XX folder and YYY.xml file path
+                if img.info and img.info.image_file:
+                    file_array = img.info.image_file.name.split("/")
+                    file_folder = path + file_array[-2]
+                    file_name = file_array[-1].split(".")[0] + ".xml"
+                    if not os.path.isdir(file_folder):
+                        os.makedirs(file_folder)
+                    file_path = file_folder + os.sep + file_name
+                else:
+                    # If image_file is none, the xml file is put in path folder
+                    file_path = path + img.id + ".xml"
+                    errors.append(img.id + ".xml")
+                    
+                if os.path.exists(file_path):
+                    os.remove(file_path)
+                    
+                # Open file
+                fd = os.open(file_path, os.O_RDWR|os.O_CREAT)
+                # Build xml string
+                xml_str = u"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<content>\n\t<title>" + (img.metadata.titre if img.metadata.titre else "") + u"</title>\n\t<abstract>" + (img.metadata.description if img.metadata.description else "") + u"</abstract>\n"
+                # tags
+                if img.metadata.mots_cles:
+                    tags = img.metadata.mots_cles.split(",")
+                    for t in tags:
+                        xml_str += u"\t<keyword>" + t.strip() + u"</keyword>\n"
+                # metadatas
+                xml_str += u"\t<metadata>\n\t\t<name>cliche<name>\n\t\t<value>" + (img.metadata.cliche if img.metadata.cliche else "") + u"</value>\n\t</metadata>\n"
+                xml_str += u"\t<metadata>\n\t\t<name>inventaire<name>\n\t\t<value>" + (img.metadata.inventaire if img.metadata.inventaire else "") + u"</value>\n\t</metadata>\n"
+                xml_str += u"\t<metadata>\n\t\t<name>date<name>\n\t\t<value>" + str((img.metadata.date if img.metadata.date else "")) + u"</value>\n\t</metadata>\n"
+                xml_str += u"\t<metadata>\n\t\t<name>longueur<name>\n\t\t<value>" + str((img.metadata.longueur if img.metadata.longueur else "")) + u"</value>\n\t</metadata>\n"
+                xml_str += u"\t<metadata>\n\t\t<name>hauteur<name>\n\t\t<value>" + str((img.metadata.hauteur if img.metadata.hauteur else "")) + u"</value>\n\t</metadata>\n"
+                xml_str += u"\t<metadata>\n\t\t<name>profondeur<name>\n\t\t<value>" + str((img.metadata.profondeur if img.metadata.profondeur else "")) + u"</value>\n\t</metadata>\n"
+                xml_str += u"\t<metadata>\n\t\t<name>diametre<name>\n\t\t<value>" + str((img.metadata.diametre if img.metadata.diametre else "")) + u"</value>\n\t</metadata>\n"
+                xml_str += u"\t<metadata>\n\t\t<name>photographe<name>\n\t\t<value>" + (img.metadata.photographe if img.metadata.photographe else "") + u"</value>\n\t</metadata>\n"
+                xml_str += u"\t<metadata>\n\t\t<name>auteur<name>\n\t\t<value>" + (img.metadata.auteur if img.metadata.auteur else "") + u"</value>\n\t</metadata>\n"
+                xml_str += u"\t<metadata>\n\t\t<name>droits<name>\n\t\t<value>" + (img.metadata.droits if img.metadata.droits else "") + u"</value>\n\t</metadata>\n"
+                xml_str += u"\t<metadata>\n\t\t<name>mentions<name>\n\t\t<value>" + (img.metadata.mentions if img.metadata.mentions else "") + u"</value>\n\t</metadata>\n"
+                xml_str += u"\t<metadata>\n\t\t<name>periode<name>\n\t\t<value>" + (img.metadata.periode if img.metadata.periode else "") + u"</value>\n\t</metadata>\n"
+                xml_str += u"\t<metadata>\n\t\t<name>technique<name>\n\t\t<value>" + (img.metadata.technique if img.metadata.technique else "") + u"</value>\n\t</metadata>\n"
+                xml_str += u"\t<metadata>\n\t\t<name>site<name>\n\t\t<value>" + (img.metadata.site if img.metadata.site else "") + u"</value>\n\t</metadata>\n"
+                xml_str += u"\t<metadata>\n\t\t<name>lieu<name>\n\t\t<value>" + (img.metadata.lieu if img.metadata.lieu else "") + u"</value>\n\t</metadata>\n"
+                xml_str += u"\t<metadata>\n\t\t<name>localisation<name>\n\t\t<value>" + (img.metadata.localisation if img.metadata.localisation else "") + u"</value>\n\t</metadata>\n"
+                xml_str += u"</content>"
+                # Write xml string
+                os.write(fd, xml_str.encode('utf8'))
+                # Close opened file
+                os.close(fd)
+                # Show progress
+                writer = show_progress(counter, nb_img, u"%s" % (file_name), 40, writer)
+            # Show "errors" at the end : img that did not have image_file data and whom xml are put in root path folder.
+            if len(errors)>0:
+                print("Some entires had no image file and folder. The following xml files are in root folder %s :" % path)
+                for e in errors:
+                    print(e)
+            print("End of export_to_xml command.")
+        
\ No newline at end of file