--- /dev/null
+#!/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()
+
+