def provisioning2xml(self, provisioning_id): """Generic functionality to create a XML file from kernelE's kommischein information.""" provisioning_dict = Kerneladapter().get_kommischein(provisioning_id) xmlroot = self.root xml_provisioning = ET.SubElement(xmlroot, 'provisioning') # neccessary data from kommischein for fieldname in ['provpipeline_id', 'id']: _add_subelemententry(xml_provisioning, fieldname, provisioning_dict) # FIXME This is special treatment for archived provisionings. Is there a need to process the archived? for fieldname in ['parts']: attr_dict = provisioning_dict.get('attributes', provisioning_dict) _add_subelemententry(xml_provisioning, fieldname, attr_dict) # data from kommiauftrag fields = ['liefertermin', 'kundennr', 'auftragsnummer'] kommiauftrag = Kerneladapter().get_kommiauftrag(provisioning_dict["provpipeline_id"]) attr_dict = kommiauftrag.get('attributes', kommiauftrag) for fieldname in fields: _add_subelemententry(xml_provisioning, fieldname, attr_dict) # data from the kommischeins provisionings_ids weight_sum = 0 volume_sum = 0 # collect provisionings in a list of dictionaries -> for sorting provisionings = [] # XXX: provisionings called provisioning_ids in kernel and provisionings in archive # FIXME: do we need archived provisionings? for provisioningid in provisioning_dict.get("provisioning_ids", provisioning_dict.get("provisionings", [])): if provisioningid.startswith('P'): provisioning = Kerneladapter().get_pick(provisioningid) else: provisioning = Kerneladapter().get_movement(provisioningid) provisionings.append(provisioning) # process provisionings sorted by from_location for provisioning in sort_plaetze(provisionings, key='from_location'): xml_pos = ET.SubElement(xml_provisioning, 'provisioningposition') # FIXME was ist provisioning_type? -> pick/retrieval? wo wird das angedruckt? # FIXME: sowas wie from_location gibts bei archivierten daten nicht for fieldname in ['from_location', 'provisioning_type', 'menge']: _add_subelemententry(xml_pos, fieldname, provisioning) # article data artnr = provisioning['artnr'] pickmenge = provisioning['menge'] product = dict(cs.masterdata.article.eap(artnr)) # dict aus couchdb document machen product['artnr'] = artnr # ist sonst nur _id xml_product = ET.SubElement(xml_pos, 'product') volume = product.get('package_volume_liter') if volume: volume_sum += pickmenge * volume else: cs.zwitscher.zwitscher('%s: Volumen unbekannt' % artnr, username='******') weight = product.get('package_weight', 0)/1000. if weight: weight_sum += pickmenge * weight else: cs.zwitscher.zwitscher('%s: Gewicht unbekannt' % artnr, username='******') for fieldname in ['artnr', 'name', 'package_weight']: _add_subelemententry(xml_product, fieldname, product) if self.produktionsauftrag: ET.SubElement(xml_product, 'produktionshinweis').text = cs.masterdata.vorprodukte.produktionshinweis(artnr) products_per_export_package = product.get('products_per_export_package') if products_per_export_package: ET.SubElement(xml_pos, 'export_packages_per_position').text = unicode( pickmenge / float(products_per_export_package)) else: ET.SubElement(xml_pos, 'export_packages_per_position').text = '' ET.SubElement(xml_provisioning, 'volume_sum').text = str(volume_sum) ET.SubElement(xml_provisioning, 'weight_sum').text = str(weight_sum) return xmlroot