From 23442e9d1a477b199ff0f0ace4fe3f6681b08a07 Mon Sep 17 00:00:00 2001 From: Sebastien Robin <seb@nexedi.com> Date: Fri, 23 Jan 2004 10:32:44 +0000 Subject: [PATCH] first submission git-svn-id: https://svn.erp5.org/repos/public/erp5/trunk@261 20353a03-c40f-0410-a6d1-a30d3c3de9de --- product/ERP5Type/XMLExportImport.py | 165 ++++++++++++++++++++++++++++ 1 file changed, 165 insertions(+) create mode 100755 product/ERP5Type/XMLExportImport.py diff --git a/product/ERP5Type/XMLExportImport.py b/product/ERP5Type/XMLExportImport.py new file mode 100755 index 0000000000..bd4fab6fed --- /dev/null +++ b/product/ERP5Type/XMLExportImport.py @@ -0,0 +1,165 @@ +############################################################################## +# +# Copyright (c) 2002-2003 Nexedi SARL and Contributors. All Rights Reserved. +# Sebastien Robin <seb@nexedi.com> +# +# WARNING: This program as such is intended to be used by professional +# programmers who take the whole responsability of assessing all potential +# consequences resulting from its eventual inadequacies and bugs +# End users who are looking for a ready-to-use solution with commercial +# garantees and support are strongly adviced to contract a Free Software +# Service Company +# +# 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +############################################################################## + +from Acquisition import aq_base, aq_inner + +from cStringIO import StringIO +from email.MIMEBase import MIMEBase +from email import Encoders +import pickle + +from zLOG import LOG + +def Base_asXML(object, ident=0): + """ + Generate an xml text corresponding to the content of this object + """ + self = object + xml = '' + if ident==0: + xml += '<erp5>' + LOG('asXML',0,'Working on: %s' % str(self.getPhysicalPath())) + ident_string = '' # This is used in order to have the ident incremented + # for every sub-object + for i in range(0,ident): + ident_string += ' ' + xml += ident_string + '<object id=\"%s\" portal_type=\"%s\">\n' % \ + (self.getId(),self.portal_type) + + # We have to find every property + for prop_id in self.propertyIds(): + # In most case, we should not synchronize acquired properties + prop = '' + #if not prop.has_key('acquisition_base_category') \ + # and prop['id'] != 'categories_list' and prop['id'] != 'uid': + if prop_id not in ('uid','workflow_history'): + prop_type = self.getPropertyType(prop_id) + xml_prop_type = 'type="' + prop_type + '"' + #try: + value = self.getProperty(prop_id) + #except AttributeError: + # value=None + + xml += ident_string + ' <%s %s>' %(prop_id,xml_prop_type) + if value is None: + pass +# elif prop_type in ('image','file','document'): +# LOG('asXML',0,'value: %s' % str(value)) +# # This property is binary and should be converted with mime +# msg = MIMEBase('application','octet-stream') +# msg.set_payload(value.getvalue()) +# Encoders.encode_base64(msg) +# ascii_data = msg.get_payload() +# ascii_data = ascii_data.replace('\n','@@@\n') +# xml+=ascii_data + elif prop_type in ('pickle',): + # We may have very long lines, so we should split + value = pickle.dumps(value) + msg = MIMEBase('application','octet-stream') + msg.set_payload(value) + Encoders.encode_base64(msg) + ascii_data = msg.get_payload() + ascii_data = ascii_data.replace('\n','@@@\n') + xml+=ascii_data + elif self.getPropertyType(prop_id) in ['lines','tokens']: + i = 1 + for line in value: + xml += '%s' % line + if i<len(value): + xml+='@@@' # XXX very bad hack, must find something better + i += 1 + elif self.getPropertyType(prop_id) in ('text','string'): + xml += str(value).replace('\n','@@@') + else: + xml+= str(value) + xml += '</%s>\n' % prop_id + + # We have to describe the workflow history + if hasattr(self,'workflow_history'): + workflow_list = self.workflow_history + workflow_list_keys = workflow_list.keys() + workflow_list_keys.sort() # Make sure it is sorted + + for workflow_id in workflow_list_keys: + #xml += ident_string + ' <workflow_history id=\"%s\">\n' % workflow_id + for workflow_action in workflow_list[workflow_id]: # It is already sorted + xml += ident_string + ' <workflow_action id=\"%s\">\n' % workflow_id + worfklow_variable_list = workflow_action.keys() + worfklow_variable_list.sort() + for workflow_variable in worfklow_variable_list: # Make sure it is sorted + variable_type = "string" # Somewhat bad, should find a better way + if workflow_variable.find('time')>= 0: + variable_type = "date" + xml += ident_string + ' <%s type=\"%s\">%s' % (workflow_variable, + variable_type,workflow_action[workflow_variable]) + xml += '</%s>\n' % workflow_variable + xml += ident_string + ' </workflow_action>\n' + #xml += ident_string + ' </workflow_history>\n' + #xml += ident_string + ' </workflow_history>\n' + + # We should not describe security settings + for user_role in self.get_local_roles(): + xml += ident_string + ' <local_role>%s' % user_role[0] + for role in user_role[1]: + xml += '@@@' + xml += '%s' % role + xml += '</local_role>\n' + + # We have finished to generate the xml + xml += ident_string + '</object>\n' + if ident==0: + xml += '</erp5>' + # Now convert the string as unicode + if type(xml) is type(u"a"): + xml_unicode = xml + else: + xml_unicode = unicode(xml,encoding='iso-8859-1') + return xml_unicode.encode('utf-8') + +def Folder_asXML(object, ident=0): + """ + Generate an xml text corresponding to the content of this object + """ + self = object + xml = '' + xml += Base_asXML(self, ident=ident) + xml = xml[:xml.rfind('</object>')] + # Make sure the list of sub objects is ordered + object_value_list = list(self.objectValues()) + object_value_list.sort(lambda x, y: cmp(x.getId(), y.getId())) + # Append to the xml the xml of subobjects + for o in object_value_list: + aq_ob = aq_base(o) + if hasattr(aq_ob, 'asXML'): + o_xml = o.asXML(ident=ident+2) + if type(o_xml) is type('a'): + xml += o_xml + xml += '</object>\n' + if ident==0: + xml += '</erp5>' + return xml -- 2.30.9