# HG changeset patch # User Marcin Kuzminski # Date 2017-07-20 10:59:53 # Node ID 04fca2a9ade8a06050218a0d81bbc98253cd2195 # Parent 746aac7f43d63471ba39625b29ce80c8bed0950c repository-groups: introduce last change for repository groups. diff --git a/rhodecode/__init__.py b/rhodecode/__init__.py --- a/rhodecode/__init__.py +++ b/rhodecode/__init__.py @@ -51,7 +51,7 @@ PYRAMID_SETTINGS = {} EXTENSIONS = {} __version__ = ('.'.join((str(each) for each in VERSION[:3]))) -__dbversion__ = 78 # defines current db version for migrations +__dbversion__ = 79 # defines current db version for migrations __platform__ = platform.system() __license__ = 'AGPLv3, and Commercial License' __author__ = 'RhodeCode GmbH' diff --git a/rhodecode/lib/dbmigrate/versions/079_version_4_9_0.py b/rhodecode/lib/dbmigrate/versions/079_version_4_9_0.py new file mode 100644 --- /dev/null +++ b/rhodecode/lib/dbmigrate/versions/079_version_4_9_0.py @@ -0,0 +1,35 @@ +import logging +import datetime + +from sqlalchemy import * +from rhodecode.model import meta +from rhodecode.lib.dbmigrate.versions import _reset_base, notify + +log = logging.getLogger(__name__) + + +def upgrade(migrate_engine): + """ + Upgrade operations go here. + Don't create your own engine; bind migrate_engine to your metadata + """ + _reset_base(migrate_engine) + from rhodecode.lib.dbmigrate.schema import db_4_7_0_1 as db + + repo_group_table = db.RepoGroup.__table__ + + updated_on = Column( + 'updated_on', DateTime(timezone=False), nullable=True, unique=None, + default=datetime.datetime.now) + updated_on.create(table=repo_group_table) + + fixups(db, meta.Session) + + +def downgrade(migrate_engine): + meta = MetaData() + meta.bind = migrate_engine + + +def fixups(models, _SESSION): + pass diff --git a/rhodecode/model/db.py b/rhodecode/model/db.py --- a/rhodecode/model/db.py +++ b/rhodecode/model/db.py @@ -2213,6 +2213,7 @@ class RepoGroup(Base, BaseModel): enable_locking = Column("enable_locking", Boolean(), nullable=False, unique=None, default=False) user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=False, unique=False, default=None) created_on = Column('created_on', DateTime(timezone=False), nullable=False, default=datetime.datetime.now) + updated_on = Column('updated_on', DateTime(timezone=False), nullable=True, unique=None, default=datetime.datetime.now) personal = Column('personal', Boolean(), nullable=True, unique=None, default=None) repo_group_to_perm = relationship('UserRepoGroupToPerm', cascade='all', order_by='UserRepoGroupToPerm.group_to_perm_id') @@ -2325,6 +2326,10 @@ class RepoGroup(Base, BaseModel): return groups @property + def last_db_change(self): + return self.updated_on + + @property def children(self): return RepoGroup.query().filter(RepoGroup.parent_group == self) diff --git a/rhodecode/model/repo.py b/rhodecode/model/repo.py --- a/rhodecode/model/repo.py +++ b/rhodecode/model/repo.py @@ -28,7 +28,7 @@ import re import shutil import time import traceback -from datetime import datetime, timedelta +import datetime from pyramid.threadlocal import get_current_request from zope.cachedescriptors.property import Lazy as LazyProperty @@ -207,9 +207,9 @@ class RepoModel(BaseModel): short_name=not admin, admin=False) def last_change(last_change): - if admin and isinstance(last_change, datetime) and not last_change.tzinfo: - last_change = last_change + timedelta(seconds= - (datetime.now() - datetime.utcnow()).seconds) + if admin and isinstance(last_change, datetime.datetime) and not last_change.tzinfo: + last_change = last_change + datetime.timedelta(seconds= + (datetime.datetime.now() - datetime.datetime.utcnow()).seconds) return _render("last_change", last_change) def rss_lnk(repo_name): @@ -374,6 +374,7 @@ class RepoModel(BaseModel): if ex_field: ex_field.field_value = kwargs[field] self.sa.add(ex_field) + cur_repo.updated_on = datetime.datetime.now() self.sa.add(cur_repo) if source_repo_name != new_name: @@ -899,7 +900,7 @@ class RepoModel(BaseModel): if os.path.exists(vcs_path): shutil.move(vcs_path, os.path.join(rm_path, 'rm__.%s' % alias)) - _now = datetime.now() + _now = datetime.datetime.now() _ms = str(_now.microsecond).rjust(6, '0') _d = 'rm__%s__%s' % (_now.strftime('%Y%m%d_%H%M%S_' + _ms), repo.just_name) diff --git a/rhodecode/model/repo_group.py b/rhodecode/model/repo_group.py --- a/rhodecode/model/repo_group.py +++ b/rhodecode/model/repo_group.py @@ -40,7 +40,7 @@ from rhodecode.model.db import (_hash_ke UserGroup, Repository) from rhodecode.model.settings import VcsSettingsModel, SettingsModel from rhodecode.lib.caching_query import FromCache -from rhodecode.lib.utils2 import action_logger_generic +from rhodecode.lib.utils2 import action_logger_generic, datetime_to_time log = logging.getLogger(__name__) @@ -501,7 +501,7 @@ class RepoGroupModel(BaseModel): if 'user' in form_data: repo_group.user = User.get_by_username(form_data['user']) - + repo_group.updated_on = datetime.datetime.now() self.sa.add(repo_group) # iterate over all members of this groups and do fixes @@ -518,6 +518,7 @@ class RepoGroupModel(BaseModel): log.debug('Fixing group %s to new name %s', obj.group_name, new_name) obj.group_name = new_name + obj.updated_on = datetime.datetime.now() elif isinstance(obj, Repository): # we need to get all repositories from this new group and # rename them accordingly to new group path @@ -525,6 +526,7 @@ class RepoGroupModel(BaseModel): log.debug('Fixing repo %s to new name %s', obj.repo_name, new_name) obj.repo_name = new_name + obj.updated_on = datetime.datetime.now() self.sa.add(obj) self._rename_group(old_path, new_path) @@ -685,6 +687,12 @@ class RepoGroupModel(BaseModel): def repo_group_lnk(repo_group_name): return _render('repo_group_name', repo_group_name) + def last_change(last_change): + if admin and isinstance(last_change, datetime.datetime) and not last_change.tzinfo: + last_change = last_change + datetime.timedelta(seconds= + (datetime.datetime.now() - datetime.datetime.utcnow()).seconds) + return _render("last_change", last_change) + def desc(desc, personal): prefix = h.escaped_stylize(u'[personal] ') if personal else '' @@ -712,6 +720,8 @@ class RepoGroupModel(BaseModel): "menu": quick_menu(group.group_name), "name": repo_group_lnk(group.group_name), "name_raw": group.group_name, + "last_change": last_change(group.last_db_change), + "last_change_raw": datetime_to_time(group.last_db_change), "desc": desc(group.description_safe, group.personal), "top_level_repos": 0, "owner": user_profile(group.user.username) diff --git a/rhodecode/templates/admin/repo_groups/repo_groups.mako b/rhodecode/templates/admin/repo_groups/repo_groups.mako --- a/rhodecode/templates/admin/repo_groups/repo_groups.mako +++ b/rhodecode/templates/admin/repo_groups/repo_groups.mako @@ -54,6 +54,9 @@ { data: 'menu', "bSortable": false, className: "quick_repo_menu" }, { data: {"_": "desc", "sort": "desc"}, title: "${_('Description')}", className: "td-description" }, + { data: {"_": "last_change", + "sort": "last_change_raw", + "type": Number}, title: "${_('Last Change')}", className: "td-time" }, { data: {"_": "top_level_repos", "sort": "top_level_repos"}, title: "${_('Number of top level repositories')}" }, { data: {"_": "owner", diff --git a/rhodecode/templates/index_base.mako b/rhodecode/templates/index_base.mako --- a/rhodecode/templates/index_base.mako +++ b/rhodecode/templates/index_base.mako @@ -98,6 +98,9 @@ { data: 'menu', "bSortable": false, className: "quick_repo_menu" }, { data: {"_": "desc", "sort": "desc"}, title: "${_('Description')}", className: "td-description" }, + { data: {"_": "last_change", + "sort": "last_change_raw", + "type": Number}, title: "${_('Last Change')}", className: "td-time" }, { data: {"_": "owner", "sort": "owner"}, title: "${_('Owner')}", className: "td-user" } ],