def create(cls, changes, ref, excluded_categories=set()): """Create a new change in all queues. :param changes: the change types, an iterable containing :class:`ChangeType` :param ref: the object reference (returned by `obj_ref`) of the changed object :param excluded_categories: set of categories (IDs) whose items will not be tracked """ ref = dict(ref) obj = obj_deref(ref) if isinstance(obj, Category): if any(c.id in excluded_categories for c in obj.chain_query): return else: event = obj if isinstance(obj, Event) else obj.event if excluded_categories & set(event.category_chain): return for change in changes: for agent in LiveSyncAgent.find(): entry = cls(agent=agent, change=change, **ref) db.session.add(entry) db.session.flush()
def create(cls, changes, ref, excluded_categories=set()): """Create a new change in all queues. :param changes: the change types, an iterable containing :class:`ChangeType` :param ref: the object reference (returned by `obj_ref`) of the changed object :param excluded_categories: set of categories (IDs) whose items will not be tracked """ ref = dict(ref) obj = obj_deref(ref) if isinstance(obj, Category): if any(c.id in excluded_categories for c in obj.chain_query): return else: event = obj if isinstance(obj, Event) else obj.event if event.category not in g.setdefault('livesync_excluded_categories_checked', {}): g.livesync_excluded_categories_checked[event.category] = excluded_categories & set(event.category_chain) if g.livesync_excluded_categories_checked[event.category]: return try: agents = g.livesync_agents except AttributeError: agents = g.livesync_agents = LiveSyncAgent.query.all() for change in changes: for agent in agents: entry = cls(agent=agent, change=change, **ref) db.session.add(entry) db.session.flush()
def add_object(self, ref, deleted=False): if self.closed: raise RuntimeError('Cannot add object to closed xml generator') if deleted: xg = XMLGen(init=False) xg.openTag(b'record') xg.openTag(b'datafield', [[b'tag', b'970'], [b'ind1', b' '], [b'ind2', b' ']]) xg.writeTag(b'subfield', b'INDICO.{}'.format(make_compound_id(ref)), [[b'code', b'a']]) xg.closeTag(b'datafield') xg.openTag(b'datafield', [[b'tag', b'980'], [b'ind1', b' '], [b'ind2', b' ']]) xg.writeTag(b'subfield', b'DELETED', [[b'code', b'c']]) xg.closeTag(b'datafield') xg.closeTag(b'record') self.xml_generator.xml += xg.xml elif ref['type'] in {EntryType.event, EntryType.contribution, EntryType.subcontribution}: obj = obj_deref(ref) if obj is None: raise ValueError('Cannot add deleted object') elif isinstance(obj, Category) and not obj.getOwner(): raise ValueError('Cannot add object without owner: {}'.format(obj)) if obj.is_deleted or obj.event_new.is_deleted: pass elif ref['type'] == EntryType.event: self.xml_generator.xml += self._event_to_marcxml(obj) elif ref['type'] == EntryType.contribution: self.xml_generator.xml += self._contrib_to_marcxml(obj) elif ref['type'] == EntryType.subcontribution: self.xml_generator.xml += self._subcontrib_to_marcxml(obj) elif ref['type'] == EntryType.category: pass # we don't send category updates else: raise ValueError('unknown object ref: {}'.format(ref['type'])) return self.xml_generator.getXml()
def run(self): records = self.fetch_records() if not records: self._print(cformat('%{yellow!}No records%{reset}')) return self._print(cformat('%{white!}Raw changes:%{reset}')) for record in records: self._print(record) self._print() self._print(cformat('%{white!}Simplified/cascaded changes:%{reset}')) for ref, change in process_records(records).iteritems(): obj = obj_deref(ref) self._print(cformat('%{white!}{}%{reset}: {}').format(_change_str(change), obj or ref)) self._print() self._print(cformat('%{white!}Resulting MarcXML:%{reset}')) uploader = DebugUploader(self) uploader.run(records) self.update_last_run()
def object(self): """Returns the changed object""" return obj_deref(self.object_ref)