def xml_from(record): # # Schema is at https://source.collectionspace.org/collection-space/src/services/tags/v1.9/services/collectionobject/jaxb/src/main/resources/collectionobjects_common.xsd # # updated to account for # http://wiki.collectionspace.org/display/collectionspace/Imports+Service+Home # #from pprint import pprint #pprint(record) CC = ElementMaker(namespace = "http://collectionspace.org/collectionobject", nsmap = {'collectionobjects_common': 'http://collectionspace.org/collectionobject'}) WAC = ElementMaker(namespace = "http://walkerart.org/collectionobject", nsmap = {'collectionobjects_wac': 'http://walkerart.org/collectionobject'}) cs_schema = E.schema({'name': 'collectionobjects_common'}) if record.has_key('acc_no'): cs_schema.append(CC.objectNumber(record['acc_no'])) if record.has_key('title'): title_list = CC('titleGroupList') for title in record['title']: title_list.append( CC.titleGroup( CC.title(title), CC.titleLanguage('eng') ) ) cs_schema.append(title_list) if record.has_key('date'): cs_schema.append( CC.objectProductionDateGroup( CC.dateDisplayDate(record['date']) ) ) if record.has_key('iaia_subject'): concepts = CC('contentConcepts') for concept in record['iaia_subject']: concepts.append(CC.contentConcept(concept)) cs_schema.append(concepts) if record.has_key('objectWorkType'): work_type_list = CC('objectNameList') for work_type in record['objectWorkType']: description_list.append( CC.objectNameGroup( CC.objectName(work_type), CC.objectNameCurrency('current'), CC.objectNameType('classified'), CC.objectNameSystem('In-house'), CC.objectNameLanguage('eng') ) ) if record.has_key('description'): cs_schema.append(CC.physicalDescription("\n".join(record['description']))) if record.has_key('edition') or record.has_key('cast_no'): values = [] for key in ['edition', 'cast_no']: if record.has_key(key): values += record[key] cs_schema.append(CC.editionNumber("\n".join(values))) # Actually, inscriptionContent could also include signature, workshop # number, signed/location, and printer's marks. Only one field to jam # them in. if record.has_key('inscription_location'): cs_schema.append(CC.inscriptionContent("\n".join(record['inscription_location']))) if record.has_key('running_time'): cs_schema.append( CC.dimensions( CC.dimensionList( CC.dimensionGroup( CC.value(record['running_time']), CC.measurementUnit('minutes'), CC.dimension('running-time') ) ) ) ) # There's probably a class of variables that we can easily handle with # just a fieldname mapping; let's set that up, and then let the # exceptions be exceptions # # WAC-specific # wac_schema = E.schema({'name': 'collectionobjects_wac'}) if record.has_key('condition') or record.has_key('condition_date'): values = [] for key in ['condition', 'condition_date']: if record.has_key(key): values += record[key] wac_schema.append(WAC.walkercondition("\n".join(values))) outer = E.imports( E('import', cs_schema, wac_schema, {'seq': '1', 'service': 'CollectionObjects', 'type': 'CollectionObject'} ) ) #print etree.tostring(outer, pretty_print=True) return etree.tostring(outer)