##// END OF EJS Templates
fixes #200, rewrote the whole caching mechanism to get rid of such problems. Now cached instances are attached...
fixes #200, rewrote the whole caching mechanism to get rid of such problems. Now cached instances are attached to db repository instance, and then fetched from cache. Also made all current test work.

File last commit:

r1366:9c0f5d55 beta
r1366:9c0f5d55 beta
Show More
db.py
703 lines | 29.3 KiB | text/x-python | PythonLexer
Models code cleanups
r759 # -*- coding: utf-8 -*-
"""
new improved models with helper functions for easier data fetching
r832 rhodecode.model.db
~~~~~~~~~~~~~~~~~~
source code cleanup: remove trailing white space, normalize file endings
r1203
added current db version into rhodecode,...
r834 Database Models for RhodeCode
source code cleanup: remove trailing white space, normalize file endings
r1203
Models code cleanups
r759 :created_on: Apr 08, 2010
:author: marcink
source code cleanup: remove trailing white space, normalize file endings
r1203 :copyright: (C) 2009-2011 Marcin Kuzminski <marcin@python-works.com>
Models code cleanups
r759 :license: GPLv3, see COPYING for more details.
"""
fixed license issue #149
r1206 # This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
source code cleanup: remove trailing white space, normalize file endings
r1203 #
Models code cleanups
r759 # This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
source code cleanup: remove trailing white space, normalize file endings
r1203 #
Models code cleanups
r759 # You should have received a copy of the GNU General Public License
fixed license issue #149
r1206 # along with this program. If not, see <http://www.gnu.org/licenses/>.
Added os.sep in models for better win support...
r1199
import os
Models code cleanups
r759 import logging
import datetime
fixes #200, rewrote the whole caching mechanism to get rid of such problems. Now cached instances are attached...
r1366 import traceback
Added grouping by days in journal
r994 from datetime import date
Models code cleanups
r759
fixed imports
r658 from sqlalchemy import *
Models code cleanups
r759 from sqlalchemy.exc import DatabaseError
fixes #200, rewrote the whole caching mechanism to get rid of such problems. Now cached instances are attached...
r1366 from sqlalchemy.orm import relationship, backref, joinedload
fixed Session problems in model class functions...
r1081 from sqlalchemy.orm.interfaces import MapperExtension
Models code cleanups
r759
fixes #200, rewrote the whole caching mechanism to get rid of such problems. Now cached instances are attached...
r1366 from beaker.cache import cache_region, region_invalidate
from vcs import get_backend
from vcs.utils.helpers import get_scm
from vcs.exceptions import RepositoryError, VCSError
from vcs.utils.lazy import LazyProperty
from vcs.nodes import FileNode
Fixed #161 form saves the create repository permission....
r1266 from rhodecode.lib import str2bool
fixed Session problems in model class functions...
r1081 from rhodecode.model.meta import Base, Session
Fixed #161 form saves the create repository permission....
r1266 from rhodecode.model.caching_query import FromCache
Models code cleanups
r759
renamed project to rhodecode
r547 log = logging.getLogger(__name__)
fixed Session problems in model class functions...
r1081 #==============================================================================
# MAPPER EXTENSIONS
#==============================================================================
class RepositoryMapper(MapperExtension):
def after_update(self, mapper, connection, instance):
pass
Moved BaseModel into base class for declarative base. Added some handy methods into...
r1065 class RhodeCodeSettings(Base):
renamed hg_app to rhodecode
r548 __tablename__ = 'rhodecode_settings'
Bumped sqlalchemy version to 0.7, replaced timerproxy with new event system for sqlalchemy....
r1360 __table_args__ = (UniqueConstraint('app_settings_name'), {'extend_existing':True})
fixed models for compatibility with database systems
r780 app_settings_id = Column("app_settings_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
added clone_uri,api_key into models. Fixed models for mysql compatibilty
r1113 app_settings_name = Column("app_settings_name", String(length=255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
app_settings_value = Column("app_settings_value", String(length=255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
renamed project to rhodecode
r547
Fixed dbmigrate issues.
r907 def __init__(self, k='', v=''):
Added settings model, and Exceptions lib....
r704 self.app_settings_name = k
self.app_settings_value = v
def __repr__(self):
Extended repo2db mapper with group creation via directory structures...
r878 return "<%s('%s:%s')>" % (self.__class__.__name__,
self.app_settings_name, self.app_settings_value)
Added settings model, and Exceptions lib....
r704
Fixed #161 form saves the create repository permission....
r1266
@classmethod
added some fixes to LDAP form re-submition, new simples ldap-settings getter....
r1292 def get_by_name(cls, ldap_key):
return Session.query(cls)\
.filter(cls.app_settings_name == ldap_key).scalar()
@classmethod
Fixed #161 form saves the create repository permission....
r1266 def get_app_settings(cls, cache=False):
ret = Session.query(cls)
if cache:
ret = ret.options(FromCache("sql_cache_short", "get_hg_settings"))
if not ret:
raise Exception('Could not get application settings !')
settings = {}
for each in ret:
settings['rhodecode_' + each.app_settings_name] = \
each.app_settings_value
return settings
@classmethod
def get_ldap_settings(cls, cache=False):
ret = Session.query(cls)\
.filter(cls.app_settings_name.startswith('ldap_'))\
.all()
fd = {}
for row in ret:
added some fixes to LDAP form re-submition, new simples ldap-settings getter....
r1292 fd.update({row.app_settings_name:row.app_settings_value})
Fixed #161 form saves the create repository permission....
r1266 return fd
Moved BaseModel into base class for declarative base. Added some handy methods into...
r1065 class RhodeCodeUi(Base):
renamed hg_app to rhodecode
r548 __tablename__ = 'rhodecode_ui'
Bumped sqlalchemy version to 0.7, replaced timerproxy with new event system for sqlalchemy....
r1360 __table_args__ = {'extend_existing':True}
fixed models for compatibility with database systems
r780 ui_id = Column("ui_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
added clone_uri,api_key into models. Fixed models for mysql compatibilty
r1113 ui_section = Column("ui_section", String(length=255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
ui_key = Column("ui_key", String(length=255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
ui_value = Column("ui_value", String(length=255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
fixed models for compatibility with database systems
r780 ui_active = Column("ui_active", Boolean(), nullable=True, unique=None, default=True)
Hacking for git support,and new faster repo scan
r631
#47 implemented Adding of new repo_groups+forms+validators. Fixed sorting of repo groups by main names in multiple locations. Removed some unneeded calls to self.sa for exchange to .query() methods....
r1345 @classmethod
def get_by_key(cls, key):
return Session.query(cls).filter(cls.ui_key == key)
Moved BaseModel into base class for declarative base. Added some handy methods into...
r1065 class User(Base):
renamed project to rhodecode
r547 __tablename__ = 'users'
Bumped sqlalchemy version to 0.7, replaced timerproxy with new event system for sqlalchemy....
r1360 __table_args__ = (UniqueConstraint('username'), UniqueConstraint('email'), {'extend_existing':True})
fixed models for compatibility with database systems
r780 user_id = Column("user_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
added clone_uri,api_key into models. Fixed models for mysql compatibilty
r1113 username = Column("username", String(length=255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
password = Column("password", String(length=255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
fixed models for compatibility with database systems
r780 active = Column("active", Boolean(), nullable=True, unique=None, default=None)
admin = Column("admin", Boolean(), nullable=True, unique=None, default=False)
added clone_uri,api_key into models. Fixed models for mysql compatibilty
r1113 name = Column("name", String(length=255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
lastname = Column("lastname", String(length=255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
email = Column("email", String(length=255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
fixed models for compatibility with database systems
r780 last_login = Column("last_login", DateTime(timezone=False), nullable=True, unique=None, default=None)
added clone_uri,api_key into models. Fixed models for mysql compatibilty
r1113 ldap_dn = Column("ldap_dn", String(length=255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
api_key = Column("api_key", String(length=255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
Hacking for git support,and new faster repo scan
r631
#56 implemented users groups editing,...
r972 user_log = relationship('UserLog', cascade='all')
user_perms = relationship('UserToPerm', primaryjoin="User.user_id==UserToPerm.user_id", cascade='all')
Hacking for git support,and new faster repo scan
r631
#56 implemented users groups editing,...
r972 repositories = relationship('Repository')
user_followers = relationship('UserFollowing', primaryjoin='UserFollowing.follows_user_id==User.user_id', cascade='all')
fixes #188 - relationship delete of repo_to_perm entry on user removal
r1325 repo_to_perm = relationship('RepoToPerm', primaryjoin='RepoToPerm.user_id==User.user_id', cascade='all')
fixed #72 show warning on removal when user still is owner of existing repositories...
r713
extended admin rescan to show what repositories was added and what removed...
r1039 group_member = relationship('UsersGroupMember', cascade='all')
Moved BaseModel into base class for declarative base. Added some handy methods into...
r1065
Models code cleanups
r759 @property
renamed project to rhodecode
r547 def full_contact(self):
return '%s %s <%s>' % (self.name, self.lastname, self.email)
Hacking for git support,and new faster repo scan
r631
Added some more details into user edit permissions view
r895 @property
made simple global rss and atom feed
r1088 def short_contact(self):
return '%s %s' % (self.name, self.lastname)
@property
Added some more details into user edit permissions view
r895 def is_admin(self):
return self.admin
renamed project to rhodecode
r547 def __repr__(self):
fixes #200, rewrote the whole caching mechanism to get rid of such problems. Now cached instances are attached...
r1366 return 'ahmmm'
Extended repo2db mapper with group creation via directory structures...
r878 return "<%s('id:%s:%s')>" % (self.__class__.__name__,
self.user_id, self.username)
Hacking for git support,and new faster repo scan
r631
Moved BaseModel into base class for declarative base. Added some handy methods into...
r1065 @classmethod
def by_username(cls, username):
return Session.query(cls).filter(cls.username == username).one()
renamed project to rhodecode
r547 def update_lastlogin(self):
"""Update user lastlogin"""
Hacking for git support,and new faster repo scan
r631
renamed project to rhodecode
r547 try:
session = Session.object_session(self)
self.last_login = datetime.datetime.now()
session.add(self)
session.commit()
log.debug('updated user %s lastlogin', self.username)
Models code cleanups
r759 except (DatabaseError,):
Hacking for git support,and new faster repo scan
r631 session.rollback()
Moved BaseModel into base class for declarative base. Added some handy methods into...
r1065 class UserLog(Base):
renamed project to rhodecode
r547 __tablename__ = 'user_logs'
Bumped sqlalchemy version to 0.7, replaced timerproxy with new event system for sqlalchemy....
r1360 __table_args__ = {'extend_existing':True}
fixed models for compatibility with database systems
r780 user_log_id = Column("user_log_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
removed unicode from models string params
r880 user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=False, unique=None, default=None)
Bumped sqlalchemy version to 0.7, replaced timerproxy with new event system for sqlalchemy....
r1360 repository_id = Column("repository_id", Integer(), ForeignKey('repositories.repo_id'), nullable=False, unique=None, default=None)
added clone_uri,api_key into models. Fixed models for mysql compatibilty
r1113 repository_name = Column("repository_name", String(length=255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
user_ip = Column("user_ip", String(length=255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
action = Column("action", UnicodeText(length=1200000, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
fixed models for compatibility with database systems
r780 action_date = Column("action_date", DateTime(timezone=False), nullable=True, unique=None, default=None)
Hacking for git support,and new faster repo scan
r631
Added grouping by days in journal
r994 @property
def action_as_day(self):
return date(*self.action_date.timetuple()[:3])
#56 implemented users groups editing,...
r972 user = relationship('User')
repository = relationship('Repository')
Hacking for git support,and new faster repo scan
r631
started working on issue #56
r956
Moved BaseModel into base class for declarative base. Added some handy methods into...
r1065 class UsersGroup(Base):
started working on issue #56
r956 __tablename__ = 'users_groups'
Bumped sqlalchemy version to 0.7, replaced timerproxy with new event system for sqlalchemy....
r1360 __table_args__ = {'extend_existing':True}
started working on issue #56
r956
#56 fixed found bugs, implemented adding of new group + forms+validators...
r959 users_group_id = Column("users_group_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
added clone_uri,api_key into models. Fixed models for mysql compatibilty
r1113 users_group_name = Column("users_group_name", String(length=255, convert_unicode=False, assert_unicode=None), nullable=False, unique=True, default=None)
#56 fixed found bugs, implemented adding of new group + forms+validators...
r959 users_group_active = Column("users_group_active", Boolean(), nullable=True, unique=None, default=None)
started working on issue #56
r956
#56 fixed relationship query behavior to speed up fetching, and...
r974 members = relationship('UsersGroupMember', cascade="all, delete, delete-orphan", lazy="joined")
started working on issue #56
r956
Fixed permissions for users groups, group can have create repo permission now....
r1271
@classmethod
def get_by_group_name(cls, group_name, cache=False, case_insensitive=False):
if case_insensitive:
gr = Session.query(cls)\
.filter(cls.users_group_name.ilike(group_name))
else:
gr = Session.query(UsersGroup)\
.filter(UsersGroup.users_group_name == group_name)
if cache:
gr = gr.options(FromCache("sql_cache_short",
"get_user_%s" % group_name))
return gr.scalar()
Moved BaseModel into base class for declarative base. Added some handy methods into...
r1065 class UsersGroupMember(Base):
started working on issue #56
r956 __tablename__ = 'users_groups_members'
Bumped sqlalchemy version to 0.7, replaced timerproxy with new event system for sqlalchemy....
r1360 __table_args__ = {'extend_existing':True}
started working on issue #56
r956
#56 fixed found bugs, implemented adding of new group + forms+validators...
r959 users_group_member_id = Column("users_group_member_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
users_group_id = Column("users_group_id", Integer(), ForeignKey('users_groups.users_group_id'), nullable=False, unique=None, default=None)
started working on issue #56
r956 user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=False, unique=None, default=None)
#56 fixed relationship query behavior to speed up fetching, and...
r974 user = relationship('User', lazy='joined')
#56 implemented users groups editing,...
r972 users_group = relationship('UsersGroup')
updated db migrations to schema 3
r1023 def __init__(self, gr_id='', u_id=''):
#56 implemented users groups editing,...
r972 self.users_group_id = gr_id
self.user_id = u_id
started working on issue #56
r956
Moved BaseModel into base class for declarative base. Added some handy methods into...
r1065 class Repository(Base):
renamed project to rhodecode
r547 __tablename__ = 'repositories'
Bumped sqlalchemy version to 0.7, replaced timerproxy with new event system for sqlalchemy....
r1360 __table_args__ = (UniqueConstraint('repo_name'), {'extend_existing':True},)
fixed Session problems in model class functions...
r1081 __mapper_args__ = {'extension':RepositoryMapper()}
fixed models for compatibility with database systems
r780 repo_id = Column("repo_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
added clone_uri,api_key into models. Fixed models for mysql compatibilty
r1113 repo_name = Column("repo_name", String(length=255, convert_unicode=False, assert_unicode=None), nullable=False, unique=True, default=None)
clone_uri = Column("clone_uri", String(length=255, convert_unicode=False, assert_unicode=None), nullable=True, unique=False, default=None)
repo_type = Column("repo_type", String(length=255, convert_unicode=False, assert_unicode=None), nullable=False, unique=False, default='hg')
removed unicode from models string params
r880 user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=False, unique=False, default=None)
fixed models for compatibility with database systems
r780 private = Column("private", Boolean(), nullable=True, unique=None, default=None)
fixes #62, added option to disable statistics for each repository
r810 enable_statistics = Column("statistics", Boolean(), nullable=True, unique=None, default=True)
implemented #84 downloads can be enabled/disabled per each repository from now.
r962 enable_downloads = Column("downloads", Boolean(), nullable=True, unique=None, default=True)
added clone_uri,api_key into models. Fixed models for mysql compatibilty
r1113 description = Column("description", String(length=10000, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
Added simple forks page, resolves issue #179
r1301 created_on = Column('created_on', DateTime(timezone=False), nullable=True, unique=None, default=datetime.datetime.now)
removed unicode from models string params
r880 fork_id = Column("fork_id", Integer(), ForeignKey('repositories.repo_id'), nullable=True, unique=False, default=None)
group_id = Column("group_id", Integer(), ForeignKey('groups.group_id'), nullable=True, unique=False, default=None)
Hacking for git support,and new faster repo scan
r631
added clone_uri,api_key into models. Fixed models for mysql compatibilty
r1113
#56 implemented users groups editing,...
r972 user = relationship('User')
fork = relationship('Repository', remote_side=repo_id)
group = relationship('Group')
fixed problem with caching
r1033 repo_to_perm = relationship('RepoToPerm', cascade='all', order_by='RepoToPerm.repo_to_perm_id')
Fixed permissions for users groups, group can have create repo permission now....
r1271 users_group_to_perm = relationship('UsersGroupRepoToPerm', cascade='all')
#56 implemented users groups editing,...
r972 stats = relationship('Statistics', cascade='all', uselist=False)
fixes #51 deleting a repo didn't delete it's dependent db entries....
r667
updated config files, and changed model repo_followers to followers
r1034 followers = relationship('UserFollowing', primaryjoin='UserFollowing.follows_repo_id==Repository.repo_id', cascade='all')
implemented user dashboards, and following system.
r734
Fixed links for repository, it's optional now to pass a link without a summary...
r976 logs = relationship('UserLog', cascade='all')
fixees for #106 relation issues on databases different than sqlite
r970
renamed project to rhodecode
r547 def __repr__(self):
Extended repo2db mapper with group creation via directory structures...
r878 return "<%s('%s:%s')>" % (self.__class__.__name__,
removed unicode from models string params
r880 self.repo_id, self.repo_name)
Extended repo2db mapper with group creation via directory structures...
r878
Moved BaseModel into base class for declarative base. Added some handy methods into...
r1065 @classmethod
def by_repo_name(cls, repo_name):
fixes #200, rewrote the whole caching mechanism to get rid of such problems. Now cached instances are attached...
r1366 q = Session.query(cls).filter(cls.repo_name == repo_name)
Moved BaseModel into base class for declarative base. Added some handy methods into...
r1065
fixes #200, rewrote the whole caching mechanism to get rid of such problems. Now cached instances are attached...
r1366 q = q.options(joinedload(Repository.fork))\
.options(joinedload(Repository.user))\
.options(joinedload(Repository.group))\
return q.one()
Added simple forks page, resolves issue #179
r1301
@classmethod
def get_repo_forks(cls, repo_id):
return Session.query(cls).filter(Repository.fork_id == repo_id)
added clone_uri,api_key into models. Fixed models for mysql compatibilty
r1113 @property
Added handy methods to Repository model for fetching groups with parents
r1155 def just_name(self):
Added os.sep in models for better win support...
r1199 return self.repo_name.split(os.sep)[-1]
Added handy methods to Repository model for fetching groups with parents
r1155
@property
def groups_with_parents(self):
groups = []
if self.group is None:
return groups
cur_gr = self.group
groups.insert(0, cur_gr)
while 1:
gr = getattr(cur_gr, 'parent_group', None)
cur_gr = cur_gr.parent_group
if gr is None:
break
groups.insert(0, gr)
return groups
@property
added clone_uri,api_key into models. Fixed models for mysql compatibilty
r1113 def groups_and_repo(self):
Added handy methods to Repository model for fetching groups with parents
r1155 return self.groups_with_parents, self.just_name
added clone_uri,api_key into models. Fixed models for mysql compatibilty
r1113
fixes #200, rewrote the whole caching mechanism to get rid of such problems. Now cached instances are attached...
r1366 @LazyProperty
def repo_path(self):
"""
Returns base full path for that repository means where it actually
exists on a filesystem
"""
q = Session.query(RhodeCodeUi).filter(RhodeCodeUi.ui_key == '/').one()
return q.ui_value
@property
def repo_full_path(self):
p = [self.repo_path]
# we need to split the name by / since this is how we store the
# names in the database, but that eventually needs to be converted
# into a valid system path
p += self.repo_name.split('/')
return os.path.join(*p)
@property
def _ui(self):
"""
Creates an db based ui object for this repository
"""
from mercurial import ui
from mercurial import config
baseui = ui.ui()
#clean the baseui object
baseui._ocfg = config.config()
baseui._ucfg = config.config()
baseui._tcfg = config.config()
ret = Session.query(RhodeCodeUi)\
.options(FromCache("sql_cache_short",
"repository_repo_ui")).all()
hg_ui = ret
for ui_ in hg_ui:
if ui_.ui_active:
log.debug('settings ui from db[%s]%s:%s', ui_.ui_section,
ui_.ui_key, ui_.ui_value)
baseui.setconfig(ui_.ui_section, ui_.ui_key, ui_.ui_value)
return baseui
#==========================================================================
# SCM CACHE INSTANCE
#==========================================================================
@property
def invalidate(self):
"""
Returns Invalidation object if this repo should be invalidated
None otherwise. `cache_active = False` means that this cache
state is not valid and needs to be invalidated
"""
return Session.query(CacheInvalidation)\
.filter(CacheInvalidation.cache_key == self.repo_name)\
.filter(CacheInvalidation.cache_active == False)\
.scalar()
@property
def set_invalidate(self):
"""
set a cache for invalidation for this instance
"""
inv = Session.query(CacheInvalidation)\
.filter(CacheInvalidation.cache_key == self.repo_name)\
.scalar()
if inv is None:
inv = CacheInvalidation(self.repo_name)
inv.cache_active = True
Session.add(inv)
Session.commit()
@property
def scm_instance(self):
return self.__get_instance(self.repo_name)
@property
def scm_instance_cached(self):
@cache_region('long_term')
def _c(repo_name):
return self.__get_instance(repo_name)
inv = self.invalidate
if inv:
region_invalidate(_c, None, self.repo_name)
#update our cache
inv.cache_key.cache_active = True
Session.add(inv)
Session.commit()
return _c(self.repo_name)
def __get_instance(self, repo_name):
try:
alias = get_scm(self.repo_full_path)[0]
log.debug('Creating instance of %s repository', alias)
backend = get_backend(alias)
except VCSError:
log.error(traceback.format_exc())
log.error('Perhaps this repository is in db and not in '
'filesystem run rescan repositories with '
'"destroy old data " option from admin panel')
return
if alias == 'hg':
repo = backend(self.repo_full_path, create=False,
baseui=self._ui)
#skip hidden web repository
if repo._get_hidden():
return
else:
repo = backend(self.repo_full_path, create=False)
return repo
Moved BaseModel into base class for declarative base. Added some handy methods into...
r1065
class Group(Base):
Extended repo2db mapper with group creation via directory structures...
r878 __tablename__ = 'groups'
#47 added editing of groups, and moving them between. Added check constraint for groups...
r1349 __table_args__ = (UniqueConstraint('group_name', 'group_parent_id'),
Bumped sqlalchemy version to 0.7, replaced timerproxy with new event system for sqlalchemy....
r1360 CheckConstraint('group_id != group_parent_id'), {'extend_existing':True},)
#47 implemented basic gui for browsing repo groups
r1343 __mapper_args__ = {'order_by':'group_name'}
Extended repo2db mapper with group creation via directory structures...
r878
group_id = Column("group_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
added clone_uri,api_key into models. Fixed models for mysql compatibilty
r1113 group_name = Column("group_name", String(length=255, convert_unicode=False, assert_unicode=None), nullable=False, unique=True, default=None)
removed unicode from models string params
r880 group_parent_id = Column("group_parent_id", Integer(), ForeignKey('groups.group_id'), nullable=True, unique=None, default=None)
#47 implemented basic gui for browsing repo groups
r1343 group_description = Column("group_description", String(length=10000, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
Extended repo2db mapper with group creation via directory structures...
r878
#56 implemented users groups editing,...
r972 parent_group = relationship('Group', remote_side=group_id)
Extended repo2db mapper with group creation via directory structures...
r878
def __init__(self, group_name='', parent_group=None):
self.group_name = group_name
self.parent_group = parent_group
def __repr__(self):
return "<%s('%s:%s')>" % (self.__class__.__name__, self.group_id,
self.group_name)
Hacking for git support,and new faster repo scan
r631
#47 implemented deleting of empty groups. Fixed problem with full paths on nested groups
r1346 @classmethod
def url_sep(cls):
return '/'
Changes for repo groups
r1159 @property
def parents(self):
#47 added editing of groups, and moving them between. Added check constraint for groups...
r1349 parents_limit = 5
Changes for repo groups
r1159 groups = []
if self.parent_group is None:
return groups
cur_gr = self.parent_group
groups.insert(0, cur_gr)
#47 added editing of groups, and moving them between. Added check constraint for groups...
r1349 cnt = 0
Changes for repo groups
r1159 while 1:
#47 added editing of groups, and moving them between. Added check constraint for groups...
r1349 cnt += 1
Changes for repo groups
r1159 gr = getattr(cur_gr, 'parent_group', None)
cur_gr = cur_gr.parent_group
if gr is None:
break
#47 added editing of groups, and moving them between. Added check constraint for groups...
r1349 if cnt == parents_limit:
# this will prevent accidental infinit loops
log.error('group nested more than %s' %
parents_limit)
break
Changes for repo groups
r1159 groups.insert(0, gr)
return groups
fixed saving settings on repositories inside groups, also fixes #187...
r1323
@property
def full_path(self):
#47 implemented deleting of empty groups. Fixed problem with full paths on nested groups
r1346 return Group.url_sep().join([g.group_name for g in self.parents] +
fixed saving settings on repositories inside groups, also fixes #187...
r1323 [self.group_name])
Added repo group page showing what reposiories are inside a group
r1193 @property
def repositories(self):
#47 implemented basic gui for browsing repo groups
r1343 return Session.query(Repository).filter(Repository.group == self)
Added repo group page showing what reposiories are inside a group
r1193
Moved BaseModel into base class for declarative base. Added some handy methods into...
r1065 class Permission(Base):
renamed project to rhodecode
r547 __tablename__ = 'permissions'
Bumped sqlalchemy version to 0.7, replaced timerproxy with new event system for sqlalchemy....
r1360 __table_args__ = {'extend_existing':True}
fixed models for compatibility with database systems
r780 permission_id = Column("permission_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
added clone_uri,api_key into models. Fixed models for mysql compatibilty
r1113 permission_name = Column("permission_name", String(length=255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
permission_longname = Column("permission_longname", String(length=255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
Hacking for git support,and new faster repo scan
r631
renamed project to rhodecode
r547 def __repr__(self):
Extended repo2db mapper with group creation via directory structures...
r878 return "<%s('%s:%s')>" % (self.__class__.__name__,
removed unicode from models string params
r880 self.permission_id, self.permission_name)
renamed project to rhodecode
r547
Fixed #161 form saves the create repository permission....
r1266 @classmethod
def get_by_key(cls, key):
return Session.query(cls).filter(cls.permission_name == key).scalar()
Moved BaseModel into base class for declarative base. Added some handy methods into...
r1065 class RepoToPerm(Base):
renamed project to rhodecode
r547 __tablename__ = 'repo_to_perm'
Bumped sqlalchemy version to 0.7, replaced timerproxy with new event system for sqlalchemy....
r1360 __table_args__ = (UniqueConstraint('user_id', 'repository_id'), {'extend_existing':True})
fixed models for compatibility with database systems
r780 repo_to_perm_id = Column("repo_to_perm_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
removed unicode from models string params
r880 user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=False, unique=None, default=None)
permission_id = Column("permission_id", Integer(), ForeignKey('permissions.permission_id'), nullable=False, unique=None, default=None)
repository_id = Column("repository_id", Integer(), ForeignKey('repositories.repo_id'), nullable=False, unique=None, default=None)
Hacking for git support,and new faster repo scan
r631
#56 implemented users groups editing,...
r972 user = relationship('User')
permission = relationship('Permission')
repository = relationship('Repository')
renamed project to rhodecode
r547
Moved BaseModel into base class for declarative base. Added some handy methods into...
r1065 class UserToPerm(Base):
renamed project to rhodecode
r547 __tablename__ = 'user_to_perm'
Bumped sqlalchemy version to 0.7, replaced timerproxy with new event system for sqlalchemy....
r1360 __table_args__ = (UniqueConstraint('user_id', 'permission_id'), {'extend_existing':True})
fixed models for compatibility with database systems
r780 user_to_perm_id = Column("user_to_perm_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
removed unicode from models string params
r880 user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=False, unique=None, default=None)
permission_id = Column("permission_id", Integer(), ForeignKey('permissions.permission_id'), nullable=False, unique=None, default=None)
Hacking for git support,and new faster repo scan
r631
#56 implemented users groups editing,...
r972 user = relationship('User')
permission = relationship('Permission')
renamed project to rhodecode
r547
Fixed #161 form saves the create repository permission....
r1266 @classmethod
def has_perm(cls, user_id, perm):
if not isinstance(perm, Permission):
raise Exception('perm needs to be an instance of Permission class')
return Session.query(cls).filter(cls.user_id == user_id)\
.filter(cls.permission == perm).scalar() is not None
@classmethod
def grant_perm(cls, user_id, perm):
if not isinstance(perm, Permission):
raise Exception('perm needs to be an instance of Permission class')
new = cls()
new.user_id = user_id
new.permission = perm
try:
Session.add(new)
Session.commit()
except:
Session.rollback()
@classmethod
def revoke_perm(cls, user_id, perm):
if not isinstance(perm, Permission):
raise Exception('perm needs to be an instance of Permission class')
try:
Session.query(cls).filter(cls.user_id == user_id)\
.filter(cls.permission == perm).delete()
Session.commit()
except:
Session.rollback()
#56 added assignments of users groups into repository
r1014
Fixed permissions for users groups, group can have create repo permission now....
r1271 class UsersGroupRepoToPerm(Base):
__tablename__ = 'users_group_repo_to_perm'
Bumped sqlalchemy version to 0.7, replaced timerproxy with new event system for sqlalchemy....
r1360 __table_args__ = (UniqueConstraint('users_group_id', 'permission_id'), {'extend_existing':True})
added user group to perm table
r958 users_group_to_perm_id = Column("users_group_to_perm_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
#56 fixed found bugs, implemented adding of new group + forms+validators...
r959 users_group_id = Column("users_group_id", Integer(), ForeignKey('users_groups.users_group_id'), nullable=False, unique=None, default=None)
added user group to perm table
r958 permission_id = Column("permission_id", Integer(), ForeignKey('permissions.permission_id'), nullable=False, unique=None, default=None)
#56 added assignments of users groups into repository
r1014 repository_id = Column("repository_id", Integer(), ForeignKey('repositories.repo_id'), nullable=False, unique=None, default=None)
added user group to perm table
r958
#56 implemented users groups editing,...
r972 users_group = relationship('UsersGroup')
permission = relationship('Permission')
#56 added assignments of users groups into repository
r1014 repository = relationship('Repository')
added user group to perm table
r958
Fixed permissions for users groups, group can have create repo permission now....
r1271
class UsersGroupToPerm(Base):
__tablename__ = 'users_group_to_perm'
users_group_to_perm_id = Column("users_group_to_perm_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
users_group_id = Column("users_group_id", Integer(), ForeignKey('users_groups.users_group_id'), nullable=False, unique=None, default=None)
permission_id = Column("permission_id", Integer(), ForeignKey('permissions.permission_id'), nullable=False, unique=None, default=None)
users_group = relationship('UsersGroup')
permission = relationship('Permission')
@classmethod
def has_perm(cls, users_group_id, perm):
if not isinstance(perm, Permission):
raise Exception('perm needs to be an instance of Permission class')
return Session.query(cls).filter(cls.users_group_id ==
users_group_id)\
.filter(cls.permission == perm)\
.scalar() is not None
@classmethod
def grant_perm(cls, users_group_id, perm):
if not isinstance(perm, Permission):
raise Exception('perm needs to be an instance of Permission class')
new = cls()
new.users_group_id = users_group_id
new.permission = perm
try:
Session.add(new)
Session.commit()
except:
Session.rollback()
@classmethod
def revoke_perm(cls, users_group_id, perm):
if not isinstance(perm, Permission):
raise Exception('perm needs to be an instance of Permission class')
try:
Session.query(cls).filter(cls.users_group_id == users_group_id)\
.filter(cls.permission == perm).delete()
Session.commit()
except:
Session.rollback()
Moved BaseModel into base class for declarative base. Added some handy methods into...
r1065 class GroupToPerm(Base):
added group to perm mapping table
r879 __tablename__ = 'group_to_perm'
Bumped sqlalchemy version to 0.7, replaced timerproxy with new event system for sqlalchemy....
r1360 __table_args__ = (UniqueConstraint('group_id', 'permission_id'), {'extend_existing':True})
added group to perm mapping table
r879
group_to_perm_id = Column("group_to_perm_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
removed unicode from models string params
r880 user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=False, unique=None, default=None)
permission_id = Column("permission_id", Integer(), ForeignKey('permissions.permission_id'), nullable=False, unique=None, default=None)
group_id = Column("group_id", Integer(), ForeignKey('groups.group_id'), nullable=False, unique=None, default=None)
added group to perm mapping table
r879
#56 implemented users groups editing,...
r972 user = relationship('User')
permission = relationship('Permission')
group = relationship('Group')
added group to perm mapping table
r879
Moved BaseModel into base class for declarative base. Added some handy methods into...
r1065 class Statistics(Base):
renamed project to rhodecode
r547 __tablename__ = 'statistics'
Bumped sqlalchemy version to 0.7, replaced timerproxy with new event system for sqlalchemy....
r1360 __table_args__ = (UniqueConstraint('repository_id'), {'extend_existing':True})
fixed models for compatibility with database systems
r780 stat_id = Column("stat_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
removed unicode from models string params
r880 repository_id = Column("repository_id", Integer(), ForeignKey('repositories.repo_id'), nullable=False, unique=True, default=None)
fixed models for compatibility with database systems
r780 stat_on_revision = Column("stat_on_revision", Integer(), nullable=False)
added clone_uri,api_key into models. Fixed models for mysql compatibilty
r1113 commit_activity = Column("commit_activity", LargeBinary(1000000), nullable=False)#JSON data
fixed models for compatibility with database systems
r780 commit_activity_combined = Column("commit_activity_combined", LargeBinary(), nullable=False)#JSON data
added clone_uri,api_key into models. Fixed models for mysql compatibilty
r1113 languages = Column("languages", LargeBinary(1000000), nullable=False)#JSON data
Hacking for git support,and new faster repo scan
r631
#56 implemented users groups editing,...
r972 repository = relationship('Repository', single_parent=True)
renamed project to rhodecode
r547
Moved BaseModel into base class for declarative base. Added some handy methods into...
r1065 class UserFollowing(Base):
implemented user dashboards, and following system.
r734 __tablename__ = 'user_followings'
__table_args__ = (UniqueConstraint('user_id', 'follows_repository_id'),
UniqueConstraint('user_id', 'follows_user_id')
Bumped sqlalchemy version to 0.7, replaced timerproxy with new event system for sqlalchemy....
r1360 , {'extend_existing':True})
implemented user dashboards, and following system.
r734
fixed models for compatibility with database systems
r780 user_following_id = Column("user_following_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
removed unicode from models string params
r880 user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=False, unique=None, default=None)
follows_repo_id = Column("follows_repository_id", Integer(), ForeignKey('repositories.repo_id'), nullable=True, unique=None, default=None)
follows_user_id = Column("follows_user_id", Integer(), ForeignKey('users.user_id'), nullable=True, unique=None, default=None)
#179 Added followers page
r1279 follows_from = Column('follows_from', DateTime(timezone=False), nullable=True, unique=None, default=datetime.datetime.now)
implemented user dashboards, and following system.
r734
#56 implemented users groups editing,...
r972 user = relationship('User', primaryjoin='User.user_id==UserFollowing.user_id')
implemented user dashboards, and following system.
r734
#56 implemented users groups editing,...
r972 follows_user = relationship('User', primaryjoin='User.user_id==UserFollowing.follows_user_id')
Optimized queries on journal, and added quick stop following action button in journal
r1000 follows_repository = relationship('Repository', order_by='Repository.repo_name')
implemented user dashboards, and following system.
r734
#179 Added followers page
r1279
@classmethod
def get_repo_followers(cls, repo_id):
return Session.query(cls).filter(cls.follows_repo_id == repo_id)
Moved BaseModel into base class for declarative base. Added some handy methods into...
r1065 class CacheInvalidation(Base):
Adde table for cache invalidation
r670 __tablename__ = 'cache_invalidation'
Bumped sqlalchemy version to 0.7, replaced timerproxy with new event system for sqlalchemy....
r1360 __table_args__ = (UniqueConstraint('cache_key'), {'extend_existing':True})
fixed models for compatibility with database systems
r780 cache_id = Column("cache_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
added clone_uri,api_key into models. Fixed models for mysql compatibilty
r1113 cache_key = Column("cache_key", String(length=255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
cache_args = Column("cache_args", String(length=255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
fixed models for compatibility with database systems
r780 cache_active = Column("cache_active", Boolean(), nullable=True, unique=None, default=False)
Adde table for cache invalidation
r670
#50 on point cache invalidation changes....
r692 def __init__(self, cache_key, cache_args=''):
self.cache_key = cache_key
self.cache_args = cache_args
self.cache_active = False
def __repr__(self):
Extended repo2db mapper with group creation via directory structures...
r878 return "<%s('%s:%s')>" % (self.__class__.__name__,
self.cache_id, self.cache_key)
added current db version into rhodecode,...
r834
Moved BaseModel into base class for declarative base. Added some handy methods into...
r1065 class DbMigrateVersion(Base):
added current db version into rhodecode,...
r834 __tablename__ = 'db_migrate_version'
Bumped sqlalchemy version to 0.7, replaced timerproxy with new event system for sqlalchemy....
r1360 __table_args__ = {'extend_existing':True}
added current db version into rhodecode,...
r834 repository_id = Column('repository_id', String(250), primary_key=True)
repository_path = Column('repository_path', Text)
version = Column('version', Integer)