eggification
[photoprint.git] / Products / photoprint / _utils / import_printing_list.py
diff --git a/Products/photoprint/_utils/import_printing_list.py b/Products/photoprint/_utils/import_printing_list.py
new file mode 100755 (executable)
index 0000000..245e1e1
--- /dev/null
@@ -0,0 +1,119 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+#######################################################################################
+# Copyright © 2009 Benoît Pin <pin@cri.ensmp.fr>                                      #
+# Plinn - http://plinn.org                                                            #
+#                                                                                     #
+#                                                                                     #
+#   This program is free software; you can redistribute it and/or                     #
+#   modify it under the terms of the GNU General Public License                       #
+#   as published by the Free Software Foundation; either version 2                    #
+#   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 General Public License for more details.                                      #
+#                                                                                     #
+#   You should have received a copy of the GNU General Public License                 #
+#   along with this program; if not, write to the Free Software                       #
+#   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.   #
+#######################################################################################
+"""
+Downloads RSS based order description and make a local human readable file tree
+to facilitate printing tasks.
+
+"""
+
+
+from urllib2 import HTTPBasicAuthHandler
+from urllib2 import build_opener
+from urllib2 import urlopen
+from xml.dom.minidom import parseString
+from xml.dom import Node
+from os import mkdir, chdir
+from os.path import abspath, join, expanduser, exists
+from getpass import getpass
+
+ELEMENT_NODE = Node.ELEMENT_NODE
+
+def getHttpOpener(url, login, password) :
+       auth_handler = HTTPBasicAuthHandler()
+       host = '/'.join(url.split('/', 3)[:3])
+       auth_handler.add_password('Zope', host, login, password)
+       opener = build_opener(auth_handler)
+       return opener
+
+def getXml(url, opener) :
+       url = '%s?disable_cookie_login__=1' % url
+       xml = opener.open(url).read()
+       return xml
+
+def genFileTree(url, login, password, dest) :
+       opener = getHttpOpener(url, login, password)
+       xml = getXml(url, opener)
+       d = parseString(xml)
+       doc = d.documentElement
+       
+       channel = doc.getElementsByTagName('channel')[0]
+       orderName = getContentOf(channel, 'title')
+
+       chdir(dest)
+       mkdir(orderName)
+       
+       for item in iterElementChildsByTagName(d.documentElement, 'item') :
+               ppTitle = getContentOf(item, 'pp:title')
+               ppQuantity = getContentOf(item, 'pp:quantity')
+
+               printTypePath = join(orderName, ppTitle)
+               printQuantityPath = join(orderName, ppTitle, ppQuantity)
+               
+               if not exists(printTypePath) :
+                       mkdir(printTypePath)
+                       infoFile = open(join(printTypePath, 'info.txt'), 'w')
+                       infoFile.write(getContentOf(item, 'pp:title'))
+                       infoFile.write('\n\n')
+                       infoFile.write(getContentOf(item, 'pp:description'))
+                       infoFile.close()
+               
+               if not exists(printQuantityPath) :
+                       mkdir(printQuantityPath)
+
+               hdUrl = '%s?disable_cookie_login__=1' % getContentOf(item, 'link')
+               localFileName = getContentOf(item, 'title')
+               print localFileName
+               localFile = open(join(printQuantityPath, localFileName), 'w')
+               localFile.write(opener.open(hdUrl).read())
+               localFile.close()
+
+def iterElementChildsByTagName(parent, tagName) :
+       child  = parent.firstChild
+       while child :
+               if child.nodeType == ELEMENT_NODE and child.tagName == tagName :
+                       yield child
+               child = child.nextSibling
+
+def getContentOf(parent, tagName) :
+       child  = parent.firstChild
+       while child :
+               if child.nodeType == ELEMENT_NODE and child.tagName == tagName :
+                       return child.firstChild.nodeValue.encode('utf-8')
+               child = child.nextSibling
+       
+       raise ValueError("%r tag not found" % tagName)
+                       
+
+def main() :
+       url = raw_input('url flux xml de la commande : ')
+       login = raw_input('login : ')
+       password = getpass('mot de passe : ')
+       dest = raw_input('cible [~/Desktop]')
+       if not dest :
+               dest = expanduser('~/Desktop')
+       
+       genFileTree(url, login, password, dest)
+
+if __name__ == '__main__' :
+       main()
+
+