def dump_record(record): """Dump a single record.""" rec = E.record() leader = record.get("leader") if leader: rec.append(E.leader(leader)) if isinstance(record, GroupableOrderedDict): items = record.iteritems(with_order=False, repeated=True) else: items = iteritems(record) for df, subfields in items: # Control fields if len(df) == 3: if isinstance(subfields, string_types): controlfield = E.controlfield(subfields) controlfield.attrib["tag"] = df[0:3] rec.append(controlfield) elif isinstance(subfields, (list, tuple, set)): for subfield in subfields: controlfield = E.controlfield(subfield) controlfield.attrib["tag"] = df[0:3] rec.append(controlfield) else: # Skip leader. if df == "leader": continue if not isinstance(subfields, (list, tuple, set)): subfields = (subfields, ) df = df.replace("_", " ") for subfield in subfields: if not isinstance(subfield, (list, tuple, set)): subfield = [subfield] for s in subfield: datafield = E.datafield() datafield.attrib["tag"] = df[0:3] datafield.attrib["ind1"] = df[3] datafield.attrib["ind2"] = df[4] if isinstance(s, GroupableOrderedDict): items = s.iteritems(with_order=False, repeated=True) elif isinstance(s, dict): items = iteritems(s) else: datafield.append(E.subfield(s)) items = tuple() for code, value in items: if not isinstance(value, string_types): for v in value: datafield.append(E.subfield(v, code=code)) else: datafield.append(E.subfield(value, code=code)) rec.append(datafield) return rec
def dump_record(record): """Dump a single record.""" rec_element = ElementMaker(namespace=self.MARC21_NS, nsmap={prefix: self.MARC21_NS}) rec = element.record() rec.append(element.recordPacking('xml')) rec.append(element.recordSchema('marcxml')) rec_record_data = element.recordData() rec_data = rec_element.record() rec_data.attrib['xmlns'] = self.MARC21_NS rec_data.attrib['type'] = "Bibliographic" leader = record.get('leader') if leader: rec_data.append(element.leader(leader)) if isinstance(record, GroupableOrderedDict): items = record.iteritems(with_order=False, repeated=True) else: items = iteritems(record) for df, subfields in items: # Control fields if len(df) == 3: if isinstance(subfields, string_types): controlfield = element.controlfield(subfields) controlfield.attrib['tag'] = df[0:3] rec_data.append(controlfield) elif isinstance(subfields, (list, tuple, set)): for subfield in subfields: controlfield = element.controlfield(subfield) controlfield.attrib['tag'] = df[0:3] rec_data.append(controlfield) else: # Skip leader. if df == 'leader': continue if not isinstance(subfields, (list, tuple, set)): subfields = (subfields, ) df = df.replace('_', ' ') for subfield in subfields: if not isinstance(subfield, (list, tuple, set)): subfield = [subfield] for s in subfield: datafield = element.datafield() datafield.attrib['tag'] = df[0:3] datafield.attrib['ind1'] = df[3] datafield.attrib['ind2'] = df[4] if isinstance(s, GroupableOrderedDict): items = s.iteritems(with_order=False, repeated=True) elif isinstance(s, dict): items = iteritems(s) else: datafield.append(element.subfield(s)) items = tuple() for code, value in items: if not isinstance(value, string_types): if value: for v in value: datafield.append( element.subfield(v, code=code)) else: datafield.append( element.subfield(value, code=code)) rec_data.append(datafield) rec_record_data.append(rec_data) rec.append(rec_record_data) return rec
def do(self, blob, ignore_missing=True, exception_handlers=None): """Translate blob values and instantiate new model instance. Takes out the indicators, if any, from the returned dictionary and puts them into the key. :param blob: ``dict``-like object on which the matching rules are going to be applied. :param ignore_missing: Set to ``False`` if you prefer to raise an exception ``MissingRule`` for the first key that it is not matching any rule. :param exception_handlers: Give custom exception handlers to take care of non-standard names that are installation specific. .. versionadded:: 1.0.0 ``ignore_missing`` allows to specify if the function should raise an exception. .. versionadded:: 1.1.0 ``exception_handlers`` allows unknown keys to treated in a custom fashion. """ handlers = {IgnoreKey: None} handlers.update(exception_handlers or {}) if ignore_missing: handlers.setdefault(MissingRule, None) output = [] if self.index is None: self.build() if '__order__' in blob and not isinstance(blob, GroupableOrderedDict): blob = GroupableOrderedDict(blob) if '__order__' in blob: items = blob.iteritems(repeated=True) else: items = iteritems(blob) for key, value in items: try: result = self.index.query(key) if not result: raise MissingRule(key) name, creator = result item = creator(output, key, value) if isinstance(item, MutableMapping): field = '{0}{1}{2}'.format(name, item.pop('$ind1', '_'), item.pop('$ind2', '_')) if '__order__' in item: item = GroupableOrderedDict(item) output.append((field, item)) elif isinstance(item, MutableSequence): for v in item: try: field = '{0}{1}{2}'.format(name, v.pop('$ind1', '_'), v.pop('$ind2', '_')) except AttributeError: field = name output.append((field, v)) else: output.append((name, item)) except Exception as exc: if exc.__class__ in handlers: handler = handlers[exc.__class__] if handler is not None: handler(exc, output, key, value) else: raise return GroupableOrderedDict(output)
def do( self, blob, ignore_missing=True, exception_handlers=None, init_fields=None, ): """Translate blob values and instantiate new model instance. Raises ``MissingRule`` when no rule matched and ``ignore_missing`` is ``False``. :param blob: ``dict``-like object on which the matching rules are going to be applied. :param ignore_missing: Set to ``False`` if you prefer to raise an exception ``MissingRule`` for the first key that it is not matching any rule. :param exception_handlers: Give custom exception handlers to take care of non-standard codes that are installation specific. """ handlers = {IgnoreKey: None} handlers.update(exception_handlers or {}) def clean_missing(exc, output, key, value, rectype=None): order = output.get("__order__") if order: order.remove(key) if ignore_missing: handlers.setdefault(MissingRule, clean_missing) output = {} if init_fields: output.update(**init_fields) if self.index is None: self.build() if isinstance(blob, GroupableOrderedDict): items = blob.iteritems(repeated=True, with_order=False) else: items = iteritems(blob) for key, value in items: try: result = self.index.query(key) if not result: raise MissingRule(key) name, creator = result data = creator(output, key, value) if getattr(creator, "__extend__", False): existing = output.get(name, []) existing.extend(data) output[name] = existing else: output[name] = data except Exception as exc: if exc.__class__ in handlers: handler = handlers[exc.__class__] if handler is not None: handler(exc, output, key, value, rectype=self.rectype) else: raise return output
def dump_record(record): """Dump a single record.""" rec = E.record() leader = record.get('leader') if leader: rec.append(E.leader(leader)) if isinstance(record, GroupableOrderedDict): items = record.iteritems(with_order=False, repeated=True) else: items = iteritems(record) for df, subfields in items: # Control fields if len(df) == 3: if isinstance(subfields, string_types): controlfield = E.controlfield(subfields) controlfield.attrib['tag'] = df[0:3] rec.append(controlfield) elif isinstance(subfields, (list, tuple, set)): for subfield in subfields: controlfield = E.controlfield(subfield) controlfield.attrib['tag'] = df[0:3] rec.append(controlfield) else: # Skip leader. if df == 'leader': continue if not isinstance(subfields, (list, tuple, set)): subfields = (subfields,) df = df.replace('_', ' ') for subfield in subfields: if not isinstance(subfield, (list, tuple, set)): subfield = [subfield] for s in subfield: datafield = E.datafield() datafield.attrib['tag'] = df[0:3] datafield.attrib['ind1'] = df[3] datafield.attrib['ind2'] = df[4] if isinstance(s, GroupableOrderedDict): items = s.iteritems(with_order=False, repeated=True) elif isinstance(s, dict): items = iteritems(s) else: datafield.append(E.subfield(s)) items = tuple() for code, value in items: if not isinstance(value, string_types): for v in value: datafield.append(E.subfield(v, code=code)) else: datafield.append(E.subfield(value, code=code)) rec.append(datafield) return rec
def do(self, blob, ignore_missing=True, exception_handlers=None): """Translate blob values and instantiate new model instance. Takes out the indicators, if any, from the returned dictionary and puts them into the key. :param blob: ``dict``-like object on which the matching rules are going to be applied. :param ignore_missing: Set to ``False`` if you prefer to raise an exception ``MissingRule`` for the first key that it is not matching any rule. :param exception_handlers: Give custom exception handlers to take care of non-standard names that are installation specific. .. versionadded:: 1.0.0 ``ignore_missing`` allows to specify if the function should raise an exception. .. versionadded:: 1.1.0 ``exception_handlers`` allows unknown keys to treated in a custom fashion. """ handlers = {IgnoreKey: None} handlers.update(exception_handlers or {}) if ignore_missing: handlers.setdefault(MissingRule, None) output = [] if self.index is None: self.build() if '__order__' in blob and not isinstance(blob, GroupableOrderedDict): blob = GroupableOrderedDict(blob) if '__order__' in blob: items = blob.iteritems(repeated=True) else: items = iteritems(blob) for key, value in items: try: result = self.index.query(key) if not result: raise MissingRule(key) name, creator = result item = creator(output, key, value) if isinstance(item, MutableMapping): field = '{0}{1}{2}'.format( name, item.pop('$ind1', '_'), item.pop('$ind2', '_')) if '__order__' in item: item = GroupableOrderedDict(item) output.append((field, item)) elif isinstance(item, MutableSequence): for v in item: try: field = '{0}{1}{2}'.format( name, v.pop('$ind1', '_'), v.pop('$ind2', '_')) except AttributeError: field = name output.append((field, v)) else: output.append((name, item)) except Exception as exc: if exc.__class__ in handlers: handler = handlers[exc.__class__] if handler is not None: handler(exc, output, key, value) else: raise return GroupableOrderedDict(output)