changeset 2287:8447d35b674e codereview

Added simple versioning for changeset status
author Marcin Kuzminski <marcin@python-works.com>
date Thu, 17 May 2012 00:47:45 +0200
parents 9265958e33bb
children e5c0f201ca0b
files rhodecode/model/changeset_status.py rhodecode/model/db.py
diffstat 2 files changed, 18 insertions(+), 22 deletions(-) [+]
line wrap: on
line diff
--- a/rhodecode/model/changeset_status.py	Thu May 17 00:02:52 2012 +0200
+++ b/rhodecode/model/changeset_status.py	Thu May 17 00:47:45 2012 +0200
@@ -49,7 +49,9 @@
 
     def get_status(self, repo, revision):
         """
-        Returns status of changeset for given revision
+        Returns status of changeset for given revision and version 0
+        versioning makes a history of statuses, and version == 0 is always the
+        current one
 
         :param repo:
         :type repo:
@@ -60,14 +62,16 @@
 
         status = ChangesetStatus.query()\
             .filter(ChangesetStatus.repo == repo)\
-            .filter(ChangesetStatus.revision == revision).scalar()
+            .filter(ChangesetStatus.revision == revision)\
+            .filter(ChangesetStatus.version == 0).scalar()
         status = status.status if status else status
         st = status or ChangesetStatus.DEFAULT
         return str(st)
 
     def set_status(self, repo, revision, status, user, comment):
         """
-        Creates new status for changeset or updates the old one
+        Creates new status for changeset or updates the old ones bumping their
+        version, leaving the current status at
 
         :param repo:
         :type repo:
@@ -82,11 +86,15 @@
         """
         repo = self.__get_repo(repo)
 
-        cur_status = ChangesetStatus.query()\
+        cur_statuses = ChangesetStatus.query()\
             .filter(ChangesetStatus.repo == repo)\
             .filter(ChangesetStatus.revision == revision)\
-            .scalar()
-        new_status = cur_status or ChangesetStatus()
+            .all()
+        if cur_statuses:
+            for st in cur_statuses:
+                st.version += 1
+                self.sa.add(st)
+        new_status = ChangesetStatus()
         new_status.author = self.__get_user(user)
         new_status.repo = self.__get_repo(repo)
         new_status.status = status
--- a/rhodecode/model/db.py	Thu May 17 00:02:52 2012 +0200
+++ b/rhodecode/model/db.py	Thu May 17 00:47:45 2012 +0200
@@ -686,7 +686,8 @@
         """
 
         statuses = ChangesetStatus.query()\
-            .filter(ChangesetStatus.repo == self)
+            .filter(ChangesetStatus.repo == self)\
+            .filter(ChangesetStatus.version == 0)
         if revisions:
             statuses = statuses.filter(ChangesetStatus.revision.in_(revisions))
         grouped = {}
@@ -1230,7 +1231,7 @@
 class ChangesetStatus(Base, BaseModel):
     __tablename__ = 'changeset_statuses'
     __table_args__ = (
-        UniqueConstraint('repo_id', 'revision'),
+        UniqueConstraint('repo_id', 'revision', 'version'),
         {'extend_existing': True, 'mysql_engine': 'InnoDB',
          'mysql_charset': 'utf8'}
     )
@@ -1250,7 +1251,7 @@
     status = Column('status', String(128), nullable=False, default=DEFAULT)
     changeset_comment_id = Column('changeset_comment_id', Integer(), ForeignKey('changeset_comments.comment_id'))
     modified_at = Column('modified_at', DateTime(), nullable=False, default=datetime.datetime.now)
-
+    version = Column('version', Integer(), nullable=False, default=0)
     author = relationship('User', lazy='joined')
     repo = relationship('Repository')
     comment = relationship('ChangesetComment', lazy='joined')
@@ -1260,19 +1261,6 @@
         return dict(self.STATUSES).get(self.status)
 
 
-class ChangesetStatusHistory(Base, BaseModel):
-    __tablename__ = 'changeset_statuses_history'
-    __table_args__ = (
-        {'extend_existing': True, 'mysql_engine': 'InnoDB',
-         'mysql_charset': 'utf8'}
-    )
-    #TODO: check if sqla has a nice history table implementation
-    changeset_status_id = Column('changeset_status_id', Integer(), ForeignKey('changeset_statuses.changeset_status_id'), nullable=False, primary_key=True)
-    user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=False, unique=None)
-    status = Column('status', String(128), nullable=False)
-    modified_at = Column('modified_at', DateTime(), nullable=False, default=datetime.datetime.now)
-
-
 class Notification(Base, BaseModel):
     __tablename__ = 'notifications'
     __table_args__ = (