diff --git a/schema/versions/003_Add_Tags.py b/schema/versions/003_Add_Tags.py new file mode 100644 index 0000000..9e1b4b5 --- /dev/null +++ b/schema/versions/003_Add_Tags.py @@ -0,0 +1,24 @@ +from sqlalchemy import MetaData, Table, Column, String + +meta = MetaData() + + +def upgrade(migrate_engine): + meta.bind = migrate_engine + trees = Table('trees', meta, autoload=True) + tags = Column('tags', String(256), default="", server_default="", nullable=False) + tags.create(trees) + + status_stacks = Table('status_stacks', meta, autoload=True) + tags = Column('tags', String(256), default="", server_default="", nullable=False) + tags.create(status_stacks) + + + +def downgrade(migrate_engine): + meta.bind = migrate_engine + trees = Table('trees', meta, autoload=True) + trees.c.tags.drop() + + status_stacks = Table('status_stacks', meta, autoload=True) + status_stacks.c.tags.drop() diff --git a/treestatus/app.py b/treestatus/app.py index df5d5db..0ec0870 100644 --- a/treestatus/app.py +++ b/treestatus/app.py @@ -148,6 +148,7 @@ def get_tree(self, tree): t = request.session.query(model.DbTree).get(tree) if t: t = t.to_dict() + t['tags'] = loads(t['tags']) if self.memcache: self._mcPut('tree:%s' % tree, t, expires=60) @@ -166,6 +167,10 @@ def get_trees(self): treenames = [] for t in request.session.query(model.DbTree): trees[t.tree] = t.to_dict() + try: + trees[t.tree]['tags'] = loads(trees[t.tree]['tags']) + except: + trees[t.tree]['tags'] = "" treenames.append(t.tree) if self.memcache: self._mcPut('tree:%s' % t.tree, trees[t.tree], expires=60) @@ -184,6 +189,7 @@ def set_status(self, who, tree, status, reason, tags, flush_stack=True): db_tree = session.query(model.DbTree).get(tree) db_tree.status = status db_tree.reason = reason.strip() + db_tree.tags = tags if flush_stack: for s in session.query(model.DbStatusStackTree).filter_by(tree=tree): stack = s.stack @@ -212,7 +218,7 @@ def restore_status(self, who, stack_id): # Restore its state last_state = loads(tree.last_state) self.set_status(who, tree.tree, last_state['status'], last_state['reason'], - '', flush_stack=False) + last_state['tags'], flush_stack=False) # Delete everything for tree in stack.trees: @@ -220,7 +226,7 @@ def restore_status(self, who, stack_id): session.delete(stack) session.commit() - def remember_state(self, who, trees, status, reason): + def remember_state(self, who, trees, status, reason, tags): if not trees: return stack = model.DbStatusStack() @@ -228,6 +234,7 @@ def remember_state(self, who, trees, status, reason): stack.reason = reason stack.when = datetime.utcnow() stack.status = status + stack.tags = tags session = request.session session.add(stack) log.debug("Remembering %s", stack) diff --git a/treestatus/model.py b/treestatus/model.py index 9039cbb..1ddeadf 100644 --- a/treestatus/model.py +++ b/treestatus/model.py @@ -16,7 +16,6 @@ Session = None - def setup(config): engine = sa.engine_from_config(config, pool_recycle=60) # Make sure we're up-to-date @@ -28,7 +27,9 @@ def setup(config): # Put it under version control # If we have a 'trees' table, it's version 1, otherwise we're version 0 insp = Inspector.from_engine(engine) - if "trees" in insp.get_table_names(): + if "trees" in insp.get_table_names() and "tags" in insp.get_columns("trees"): + version = 2 + elif "trees" in insp.get_table_names(): version = 1 else: version = 0 @@ -49,6 +50,7 @@ class DbTree(DbBase): status = Column(String(64), default="open", nullable=False) reason = Column(String(256), default="", nullable=False) message_of_the_day = Column(String(800), default="", nullable=False) + tags = Column(String(256), default="", nullable=False) def to_dict(self): return dict( @@ -56,6 +58,7 @@ def to_dict(self): status=self.status, reason=self.reason, message_of_the_day=self.message_of_the_day, + tags = self.tags, ) @@ -104,6 +107,7 @@ class DbStatusStack(DbBase): reason = Column(String(256), nullable=False) when = Column(DateTime, nullable=False, index=True) status = Column(String(64), nullable=False) + tags = Column(String(256), nullable=False) class DbStatusStackTree(DbBase):