def write_md(self, metadata, mdtype, mdtypeversion, othermdtype=None, section=None, stdout=False): """ Wraps XML metadata into MD element and writes it to a lxml.etree XML file in the workspace. The output filename is <mdtype>-<hash>-othermd.xml, where <mdtype> is the type of metadata given as parameter and <hash> is a string generated from the metadata. Serializing and hashing the root xml element can be rather time consuming and as such this method should not be called for each file unless more efficient way of separating files by the metadata can't be easily implemented. This implementation should be done by the subclasses of metadata_creator. :metadata (Element): metadata XML element :mdtype (string): Value of mdWrap MDTYPE attribute :mdtypeversion (string): Value of mdWrap MDTYPEVERSION attribute :othermdtype (string): Value of mdWrap OTHERMDTYPE attribute :section (string): Type of mets metadata section :stdout (boolean): Print also to stdout :returns: md_id, filename - Metadata id and filename """ digest = generate_digest(metadata) suffix = othermdtype if othermdtype else mdtype filename = encode_path("%s-%s-amd.xml" % (digest, suffix)) md_id = '_{}'.format(digest) filename = os.path.join(self.workspace, filename) if not os.path.exists(filename): xmldata = mets.xmldata() xmldata.append(metadata) mdwrap = mets.mdwrap(mdtype, mdtypeversion, othermdtype) mdwrap.append(xmldata) if section == 'digiprovmd': amd = mets.digiprovmd(md_id) else: amd = mets.techmd(md_id) amd.append(mdwrap) amdsec = mets.amdsec() amdsec.append(amd) mets_ = mets.mets() mets_.append(amdsec) with open(filename, 'wb+') as outfile: outfile.write(xml_helpers.utils.serialize(mets_)) if stdout: print(xml_helpers.utils.serialize(mets_).decode("utf-8")) print("Wrote lxml.etree %s administrative metadata to file " "%s" % (mdtype, outfile.name)) return md_id, filename
def _create_mets(premis_element, digiprovmd_id, mdtype): """Creates a METS XML element that contains PREMIS element :param premis_element: PREMIS element :param digiprovmd_id: ID attribute of digiprovMD element :param mdtype: MDTYPE of mdWrap element :returns: METS XML element """ xmldata = mets.xmldata(child_elements=[premis_element]) mdwrap = mets.mdwrap(mdtype, '2.3', child_elements=[xmldata]) digiprovmd = mets.digiprovmd(digiprovmd_id, child_elements=[mdwrap]) amdsec = mets.amdsec(child_elements=[digiprovmd]) _mets = mets.mets(child_elements=[amdsec]) return _mets
def main(arguments=None): """The main method for argparser""" args = parse_arguments(arguments) # Loop files and create premis objects files = collect_filepaths(dirs=args.files, base=args.base_path) for filename in files: if args.base_path != '': filerel = os.path.relpath(filename, args.base_path) else: filerel = filename xmldata = mets.xmldata() premis_object = create_premis_object( xmldata, filename, args.skip_inspection, args.format_name, args.format_version, args.digest_algorithm, args.message_digest, args.date_created, args.charset) mdwrap = mets.mdwrap('PREMIS:OBJECT', '2.3', child_elements=[xmldata]) techmd = mets.techmd(encode_id( encode_path(filerel, suffix="-techmd.xml")), child_elements=[mdwrap]) amdsec = mets.amdsec(child_elements=[techmd]) _mets = mets.mets(child_elements=[amdsec]) if args.stdout: print h.serialize(_mets) if not os.path.exists(args.workspace): os.makedirs(args.workspace) filename = encode_path(filerel, suffix="-techmd.xml") with open(os.path.join(args.workspace, filename), 'w+') as outfile: outfile.write(h.serialize(_mets)) print "Wrote METS technical metadata to file %s" % outfile.name return 0
def main(arguments=None): """The main method for premis_event""" args = parse_arguments(arguments) if args.agent_name: _mets = mets.mets() amdsec = mets.amdsec() _mets.append(amdsec) if args.event_target: agent_id = encode_id( encode_path('%s-%s-agent.xml' % (args.event_target, args.event_type))) output_file = os.path.join( args.workspace, encode_path('%s-%s-agent.xml' % (args.event_target, args.event_type))) else: agent_id = encode_id( encode_path('%s-agent.xml' % (args.event_type))) output_file = os.path.join( args.workspace, encode_path('%s-agent.xml' % (args.event_type))) linking_agent_identifier = create_premis_agent(amdsec, agent_id, args.agent_name, args.agent_type) if args.stdout: print h.serialize(_mets) if not os.path.exists(os.path.dirname(output_file)): os.makedirs(os.path.dirname(output_file)) with open(output_file, 'w+') as outfile: outfile.write(h.serialize(_mets)) print "premis_event created file: %s" % output_file else: linking_agent_identifier = None # Create event _mets = mets.mets() amdsec = mets.amdsec() _mets.append(amdsec) if args.event_target: event_id = encode_id( encode_path('%s-%s-event.xml' % (args.event_target, args.event_type))) output_file = os.path.join( args.workspace, encode_path('%s-%s-event.xml' % (args.event_target, args.event_type))) else: event_id = encode_id(encode_path('%s-event.xml' % (args.event_type))) output_file = os.path.join( args.workspace, encode_path('%s-event.xml' % (args.event_type))) create_premis_event(amdsec, args.event_type, args.event_datetime, args.event_detail, args.event_outcome, args.event_outcome_detail, linking_agent_identifier, event_id) if args.stdout: print h.serialize(_mets) if not os.path.exists(os.path.dirname(output_file)): os.makedirs(os.path.dirname(output_file)) with open(output_file, 'w+') as outfile: outfile.write(h.serialize(_mets)) print "premis_event created file: %s" % output_file return 0