From d16f40cc09c19b8b12be3e08d6de6da96333c88b Mon Sep 17 00:00:00 2001 From: Adrian Moennich Date: Fri, 7 Nov 2014 11:27:49 +0100 Subject: [PATCH] Add more record handling code --- livesync/indico_livesync/__init__.py | 3 ++- livesync/indico_livesync/base.py | 14 ++++++++++++++ livesync/indico_livesync/cli.py | 18 +++++++++++++----- .../201410311223_1c2b0e17447d_create_tables.py | 1 + livesync/indico_livesync/models/queue.py | 7 +++++++ 5 files changed, 37 insertions(+), 6 deletions(-) diff --git a/livesync/indico_livesync/__init__.py b/livesync/indico_livesync/__init__.py index 546ee4c..97e32bb 100644 --- a/livesync/indico_livesync/__init__.py +++ b/livesync/indico_livesync/__init__.py @@ -16,6 +16,7 @@ from __future__ import unicode_literals -__all__ = ('LiveSyncPluginBase', 'LiveSyncAgentBase') +__all__ = ('LiveSyncPluginBase', 'LiveSyncAgentBase', 'SimpleChange', 'process_records') from .base import LiveSyncPluginBase, LiveSyncAgentBase +from .simplify import SimpleChange, process_records diff --git a/livesync/indico_livesync/base.py b/livesync/indico_livesync/base.py index 3689d11..6ce7081 100644 --- a/livesync/indico_livesync/base.py +++ b/livesync/indico_livesync/base.py @@ -21,6 +21,7 @@ from flask_pluginengine import depends, trim_docstring from indico.core.plugins import IndicoPlugin from indico.util.decorators import classproperty +from indico_livesync.models.queue import LiveSyncQueueEntry from indico_livesync.plugin import LiveSyncPlugin @@ -59,3 +60,16 @@ class LiveSyncAgentBase(object): return parts[1].strip() except IndexError: return 'no description available' + + def __init__(self, agent): + """ + :param agent: a `LiveSyncAgent` instance + """ + self.agent = agent + + def fetch_records(self, count=None): + return self.agent.queue.filter_by(processed=False).order_by(LiveSyncQueueEntry.timestamp).limit(count).all() + + def run(self): + """Runs the livsync export""" + raise NotImplementedError diff --git a/livesync/indico_livesync/cli.py b/livesync/indico_livesync/cli.py index 1b0d1d5..38d653f 100644 --- a/livesync/indico_livesync/cli.py +++ b/livesync/indico_livesync/cli.py @@ -16,11 +16,12 @@ from __future__ import unicode_literals +import transaction from flask_pluginengine import current_plugin from flask_script import Manager from terminaltables import AsciiTable -from indico.core.db import db +from indico.core.db import db, DBMgr from indico.core.db.sqlalchemy.util.session import update_session_options from indico.util.console import cformat @@ -98,14 +99,21 @@ def create_agent(agent_type, name=None): @cli_manager.command def run(agent_id=None): + """Runs the livesync agent""" + update_session_options(db) if agent_id is None: - agents = LiveSyncAgent.find_all() + agent_list = LiveSyncAgent.find_all() else: agent = LiveSyncAgent.find_first(id=int(agent_id)) if agent is None: print 'No such agent' return - agents = [agent] + agent_list = [agent] - for agent in agents: - pass # TODO + for agent in agent_list: + print cformat('Running agent: %{white!}{}%{reset}').format(agent.name) + with DBMgr.getInstance().global_connection(): + try: + agent.backend(agent).run() + finally: + transaction.abort() diff --git a/livesync/indico_livesync/migrations/201410311223_1c2b0e17447d_create_tables.py b/livesync/indico_livesync/migrations/201410311223_1c2b0e17447d_create_tables.py index 9602b4b..fe59d02 100644 --- a/livesync/indico_livesync/migrations/201410311223_1c2b0e17447d_create_tables.py +++ b/livesync/indico_livesync/migrations/201410311223_1c2b0e17447d_create_tables.py @@ -32,6 +32,7 @@ def upgrade(): sa.Column('id', sa.Integer(), nullable=False), sa.Column('agent_id', sa.Integer(), nullable=False, index=True), sa.Column('timestamp', UTCDateTime(), nullable=False), + sa.Column('processed', sa.Boolean(), nullable=False), sa.Column('change', sa.SmallInteger(), nullable=False), sa.Column('type', sa.String(), nullable=False), sa.Column('category_id', sa.String()), diff --git a/livesync/indico_livesync/models/queue.py b/livesync/indico_livesync/models/queue.py index a754d43..052038f 100644 --- a/livesync/indico_livesync/models/queue.py +++ b/livesync/indico_livesync/models/queue.py @@ -62,6 +62,13 @@ class LiveSyncQueueEntry(db.Model): default=now_utc ) + #: if this record has already been processed + processed = db.Column( + db.Boolean, + nullable=False, + default=False + ) + #: the change type, a :class:`ChangeType` change = db.Column( db.SmallInteger,