##// END OF EJS Templates
updated contributors and setup accordingly to stable branch
updated contributors and setup accordingly to stable branch

File last commit:

r1564:752b0a7b merge default
r1565:62c4027b beta
Show More
db.py
1051 lines | 39.7 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 #265 ldap save fails sometimes on converting attributes to booleans, added getter and setter...
r1546 from sqlalchemy.ext.hybrid import hybrid_property
added validation of params on settings table
r1561 from sqlalchemy.orm import relationship, backref, joinedload, class_mapper, \
validates
fixed Session problems in model class functions...
r1081 from sqlalchemy.orm.interfaces import MapperExtension
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
Extended API...
r1500 from vcs.exceptions import VCSError
fixes #200, rewrote the whole caching mechanism to get rid of such problems. Now cached instances are attached...
r1366 from vcs.utils.lazy import LazyProperty
fixed issues with python2.5...
r1514 from rhodecode.lib import str2bool, safe_str, get_changeset_safe, \
fixes #265 ldap save fails sometimes on converting attributes to booleans, added getter and setter...
r1546 generate_api_key, safe_unicode
removed users_group controller in replace for model methods,...
r1436 from rhodecode.lib.exceptions import UsersGroupsAssignedException
fixed issues with python2.5...
r1514 from rhodecode.lib.compat import json
Extended API...
r1500
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
fixes #265 ldap save fails sometimes on converting attributes to booleans, added getter and setter...
r1546
renamed project to rhodecode
r547 log = logging.getLogger(__name__)
fixed Session problems in model class functions...
r1081 #==============================================================================
Added basic JsonSerialization into models....
r1388 # BASE CLASSES
fixed Session problems in model class functions...
r1081 #==============================================================================
Added basic JsonSerialization into models....
r1388 class ModelSerializer(json.JSONEncoder):
"""
Simple Serializer for JSON,
usage::
to make object customized for serialization implement a __json__
method that will return a dict for serialization into json
example::
class Task(object):
def __init__(self, name, value):
self.name = name
self.value = value
def __json__(self):
return dict(name=self.name,
value=self.value)
"""
def default(self, obj):
if hasattr(obj, '__json__'):
return obj.__json__()
else:
return json.JSONEncoder.default(self, obj)
class BaseModel(object):
"""Base Model for all classess
"""
@classmethod
def _get_keys(cls):
"""return column names for this model """
return class_mapper(cls).c.keys()
def get_dict(self):
"""return dict with keys and values corresponding
to this model data """
d = {}
for k in self._get_keys():
d[k] = getattr(self, k)
return d
def get_appstruct(self):
"""return list with keys and values tupples corresponding
to this model data """
l = []
for k in self._get_keys():
l.append((k, getattr(self, k),))
return l
def populate_obj(self, populate_dict):
"""populate model with data from given populate_dict"""
for k in self._get_keys():
if k in populate_dict:
setattr(self, k, populate_dict[k])
@classmethod
def query(cls):
return Session.query(cls)
@classmethod
def get(cls, id_):
implements #226 repo groups available by path...
r1538 if id_:
return Session.query(cls).get(id_)
Code cleanup...
r1466
Added more advanced hook management into rhodecode admin settings
r1460 @classmethod
def delete(cls, id_):
obj = Session.query(cls).get(id_)
Session.delete(obj)
Session.commit()
Code cleanup...
r1466
fixed Session problems in model class functions...
r1081
Added basic JsonSerialization into models....
r1388 class RhodeCodeSettings(Base, BaseModel):
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)
fixes #265 ldap save fails sometimes on converting attributes to booleans, added getter and setter...
r1546 _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
fixes #265 ldap save fails sometimes on converting attributes to booleans, added getter and setter...
r1546
added validation of params on settings table
r1561 @validates('_app_settings_value')
def validate_settings_value(self, key, val):
assert type(val) == unicode
return val
fixes #265 ldap save fails sometimes on converting attributes to booleans, added getter and setter...
r1546 @hybrid_property
def app_settings_value(self):
v = self._app_settings_value
if v == 'ldap_active':
v = str2bool(v)
return v
@app_settings_value.setter
def app_settings_value(self,val):
"""
Setter that will always make sure we use unicode in app_settings_value
:param val:
"""
self._app_settings_value = safe_unicode(val)
Added settings model, and Exceptions lib....
r704 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)\
fixes #265 ldap save fails sometimes on converting attributes to booleans, added getter and setter...
r1546 .filter(cls.app_settings_name.startswith('ldap_')).all()
Fixed #161 form saves the create repository permission....
r1266 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})
fixes #204, ldap active checkbox, credits goes to Matt Little.
r1381
Fixed #161 form saves the create repository permission....
r1266 return fd
Added basic JsonSerialization into models....
r1388 class RhodeCodeUi(Base, BaseModel):
renamed hg_app to rhodecode
r548 __tablename__ = 'rhodecode_ui'
Added more advanced hook management into rhodecode admin settings
r1460 __table_args__ = (UniqueConstraint('ui_key'), {'extend_existing':True})
HOOK_UPDATE = 'changegroup.update'
HOOK_REPO_SIZE = 'changegroup.repo_size'
HOOK_PUSH = 'pretxnchangegroup.push_logger'
HOOK_PULL = 'preoutgoing.pull_logger'
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)
Added more advanced hook management into rhodecode admin settings
r1460 @classmethod
def get_builtin_hooks(cls):
q = cls.query()
q = q.filter(cls.ui_key.in_([cls.HOOK_UPDATE,
cls.HOOK_REPO_SIZE,
cls.HOOK_PUSH, cls.HOOK_PULL]))
return q.all()
@classmethod
def get_custom_hooks(cls):
q = cls.query()
q = q.filter(~cls.ui_key.in_([cls.HOOK_UPDATE,
cls.HOOK_REPO_SIZE,
cls.HOOK_PUSH, cls.HOOK_PULL]))
q = q.filter(cls.ui_section == 'hooks')
return q.all()
@classmethod
def create_or_update_hook(cls, key, val):
new_ui = cls.get_by_key(key).scalar() or cls()
new_ui.ui_section = 'hooks'
new_ui.ui_active = True
new_ui.ui_key = key
new_ui.ui_value = val
Session.add(new_ui)
Session.commit()
Added basic JsonSerialization into models....
r1388 class User(Base, BaseModel):
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):
Simplified last_login call on user, and changed login to use User model directly
r1400 try:
return "<%s('id:%s:%s')>" % (self.__class__.__name__,
self.user_id, self.username)
except:
return self.__class__.__name__
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
Refactoring of model get functions
r1530 def get_by_username(cls, username, case_insensitive=False):
Simplified last_login call on user, and changed login to use User model directly
r1400 if case_insensitive:
fixes #260 Put repo in group, then move group to another group -> repo becomes unavailable
r1539 return Session.query(cls).filter(cls.username.ilike(username)).scalar()
Simplified last_login call on user, and changed login to use User model directly
r1400 else:
Refactoring of model get functions
r1530 return Session.query(cls).filter(cls.username == username).scalar()
Moved BaseModel into base class for declarative base. Added some handy methods into...
r1065
fixes #223 improve password reset form
r1417 @classmethod
def get_by_api_key(cls, api_key):
return Session.query(cls).filter(cls.api_key == api_key).one()
renamed project to rhodecode
r547 def update_lastlogin(self):
"""Update user lastlogin"""
Hacking for git support,and new faster repo scan
r631
Simplified last_login call on user, and changed login to use User model directly
r1400 self.last_login = datetime.datetime.now()
Session.add(self)
Session.commit()
log.debug('updated user %s lastlogin', self.username)
Hacking for git support,and new faster repo scan
r631
Extended API...
r1500 @classmethod
def create(cls, form_data):
from rhodecode.lib.auth import get_crypt_password
fixed issues with python2.5...
r1514
Extended API...
r1500 try:
new_user = cls()
for k, v in form_data.items():
if k == 'password':
v = get_crypt_password(v)
setattr(new_user, k, v)
new_user.api_key = generate_api_key(form_data['username'])
Session.add(new_user)
Session.commit()
return new_user
except:
log.error(traceback.format_exc())
Session.rollback()
raise
Hacking for git support,and new faster repo scan
r631
Added basic JsonSerialization into models....
r1388 class UserLog(Base, BaseModel):
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
Added basic JsonSerialization into models....
r1388 class UsersGroup(Base, BaseModel):
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
fixes #228 - added detection of assigned groups to prevent errors on sqlite
r1435 def __repr__(self):
return '<userGroup(%s)>' % (self.users_group_name)
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()
removed users_group controller in replace for model methods,...
r1436
@classmethod
def get(cls, users_group_id, cache=False):
users_group = Session.query(cls)
if cache:
users_group = users_group.options(FromCache("sql_cache_short",
"get_users_group_%s" % users_group_id))
return users_group.get(users_group_id)
@classmethod
def create(cls, form_data):
try:
new_users_group = cls()
for k, v in form_data.items():
setattr(new_users_group, k, v)
Session.add(new_users_group)
Session.commit()
Extended API...
r1500 return new_users_group
removed users_group controller in replace for model methods,...
r1436 except:
log.error(traceback.format_exc())
Session.rollback()
raise
@classmethod
def update(cls, users_group_id, form_data):
try:
users_group = cls.get(users_group_id, cache=False)
for k, v in form_data.items():
if k == 'users_group_members':
users_group.members = []
Session.flush()
members_list = []
if v:
for u_id in set(v):
members_list.append(UsersGroupMember(
users_group_id,
u_id))
setattr(users_group, 'members', members_list)
setattr(users_group, k, v)
Session.add(users_group)
Session.commit()
except:
log.error(traceback.format_exc())
Session.rollback()
raise
@classmethod
def delete(cls, users_group_id):
try:
# check if this group is not assigned to repo
assigned_groups = UsersGroupRepoToPerm.query()\
.filter(UsersGroupRepoToPerm.users_group_id ==
users_group_id).all()
if assigned_groups:
raise UsersGroupsAssignedException('Group assigned to %s' %
assigned_groups)
users_group = cls.get(users_group_id, cache=False)
Session.delete(users_group)
Session.commit()
except:
log.error(traceback.format_exc())
Session.rollback()
raise
Added basic JsonSerialization into models....
r1388 class UsersGroupMember(Base, BaseModel):
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
Added basic JsonSerialization into models....
r1388 class Repository(Base, BaseModel):
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
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
fixes #245 Rescan of the repositories on Windows
r1554 def url_sep(cls):
return '/'
@classmethod
Refactoring of model get functions
r1530 def get_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))\
fixes issue #248 cannot edit repos inside a group on windows
r1556 .options(joinedload(Repository.user))\
.options(joinedload(Repository.group))\
fixes #200, rewrote the whole caching mechanism to get rid of such problems. Now cached instances are attached...
r1366
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)
API added checks for a valid repository on pull command...
r1508 @classmethod
def base_path(cls):
"""
Returns base path when all repos are stored
:param cls:
"""
fixes #245 Rescan of the repositories on Windows
r1554 q = Session.query(RhodeCodeUi).filter(RhodeCodeUi.ui_key ==
cls.url_sep())
API added checks for a valid repository on pull command...
r1508 q.options(FromCache("sql_cache_short", "repository_repo_path"))
return q.one().ui_value
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):
fixes issue #248 cannot edit repos inside a group on windows
r1556 return self.repo_name.split(Repository.url_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
"""
fixes #245 Rescan of the repositories on Windows
r1554 q = Session.query(RhodeCodeUi).filter(RhodeCodeUi.ui_key ==
Repository.url_sep())
adde short cache for repo_path
r1368 q.options(FromCache("sql_cache_short", "repository_repo_path"))
return q.one().ui_value
fixes #200, rewrote the whole caching mechanism to get rid of such problems. Now cached instances are attached...
r1366
@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
fixes #245 Rescan of the repositories on Windows
r1554 p += self.repo_name.split(Repository.url_sep())
fixes #200, rewrote the whole caching mechanism to get rid of such problems. Now cached instances are attached...
r1366 return os.path.join(*p)
fixes #260 Put repo in group, then move group to another group -> repo becomes unavailable
r1539 def get_new_name(self, repo_name):
"""
returns new full repository name based on assigned group and new new
:param group_name:
"""
path_prefix = self.group.full_path_splitted if self.group else []
fixes #245 Rescan of the repositories on Windows
r1554 return Repository.url_sep().join(path_prefix + [repo_name])
fixes #260 Put repo in group, then move group to another group -> repo becomes unavailable
r1539
fixes #200, rewrote the whole caching mechanism to get rid of such problems. Now cached instances are attached...
r1366 @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)\
Code cleanup...
r1466 .options(FromCache("sql_cache_short", "repository_repo_ui")).all()
fixes #200, rewrote the whole caching mechanism to get rid of such problems. Now cached instances are attached...
r1366
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
API added checks for a valid repository on pull command...
r1508 @classmethod
def is_valid(cls, repo_name):
"""
returns True if given repo name is a valid filesystem repository
@param cls:
@param repo_name:
"""
from rhodecode.lib.utils import is_valid_repo
return is_valid_repo(repo_name, cls.base_path())
fixes #200, rewrote the whole caching mechanism to get rid of such problems. Now cached instances are attached...
r1366 #==========================================================================
Code cleanup...
r1466 # SCM PROPERTIES
#==========================================================================
def get_changeset(self, rev):
return get_changeset_safe(self.scm_instance, rev)
@property
def tip(self):
return self.get_changeset('tip')
@property
def author(self):
return self.tip.author
@property
def last_change(self):
return self.scm_instance.last_change
#==========================================================================
fixes #200, rewrote the whole caching mechanism to get rid of such problems. Now cached instances are attached...
r1366 # 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()
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()
Code cleanup...
r1466 @LazyProperty
fixes #200, rewrote the whole caching mechanism to get rid of such problems. Now cached instances are attached...
r1366 def scm_instance(self):
Simplified last_login call on user, and changed login to use User model directly
r1400 return self.__get_instance()
fixes #200, rewrote the whole caching mechanism to get rid of such problems. Now cached instances are attached...
r1366
@property
def scm_instance_cached(self):
@cache_region('long_term')
def _c(repo_name):
Simplified last_login call on user, and changed login to use User model directly
r1400 return self.__get_instance()
fixes #200, rewrote the whole caching mechanism to get rid of such problems. Now cached instances are attached...
r1366
fixed some issues with cache invalidation, and simplified invalidation codes
r1428 # TODO: remove this trick when beaker 1.6 is released
# and have fixed this issue with not supporting unicode keys
rn = safe_str(self.repo_name)
fixes #200, rewrote the whole caching mechanism to get rid of such problems. Now cached instances are attached...
r1366 inv = self.invalidate
fixed a bug in cache invalidation
r1427 if inv is not None:
fixed some issues with cache invalidation, and simplified invalidation codes
r1428 region_invalidate(_c, None, rn)
# update our cache
fixed a bug in cache invalidation
r1427 inv.cache_active = True
fixes #200, rewrote the whole caching mechanism to get rid of such problems. Now cached instances are attached...
r1366 Session.add(inv)
Session.commit()
Unicode fixes, added safe_str method for global str() operations +better test sandboxing
r1401 return _c(rn)
fixes #200, rewrote the whole caching mechanism to get rid of such problems. Now cached instances are attached...
r1366
Simplified last_login call on user, and changed login to use User model directly
r1400 def __get_instance(self):
adde short cache for repo_path
r1368
repo_full_path = self.repo_full_path
fixes #200, rewrote the whole caching mechanism to get rid of such problems. Now cached instances are attached...
r1366 try:
adde short cache for repo_path
r1368 alias = get_scm(repo_full_path)[0]
fixes #200, rewrote the whole caching mechanism to get rid of such problems. Now cached instances are attached...
r1366 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':
Unicode fixes, added safe_str method for global str() operations +better test sandboxing
r1401
repo = backend(safe_str(repo_full_path), create=False,
fixes #200, rewrote the whole caching mechanism to get rid of such problems. Now cached instances are attached...
r1366 baseui=self._ui)
#skip hidden web repository
if repo._get_hidden():
return
else:
adde short cache for repo_path
r1368 repo = backend(repo_full_path, create=False)
fixes #200, rewrote the whole caching mechanism to get rid of such problems. Now cached instances are attached...
r1366
return repo
Moved BaseModel into base class for declarative base. Added some handy methods into...
r1065
Added basic JsonSerialization into models....
r1388 class Group(Base, BaseModel):
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
unified generation of repo groups choices...
r1547 def groups_choices(cls):
from webhelpers.html import literal as _literal
repo_groups = [('', '')]
sep = ' &raquo; '
_name = lambda k: _literal(sep.join(k))
repo_groups.extend([(x.group_id, _name(x.full_path_splitted))
for x in cls.query().all()])
repo_groups = sorted(repo_groups,key=lambda t: t[1].split(sep)[0])
return repo_groups
@classmethod
#47 implemented deleting of empty groups. Fixed problem with full paths on nested groups
r1346 def url_sep(cls):
return '/'
implements #226 repo groups available by path...
r1538 @classmethod
def get_by_group_name(cls, group_name):
return cls.query().filter(cls.group_name == group_name).scalar()
Changes for repo groups
r1159 @property
def parents(self):
#209 Added recursive count on repositories to calculate all repos within all nested groups
r1385 parents_recursion_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
#209 Added recursive count on repositories to calculate all repos within all nested groups
r1385 if cnt == parents_recursion_limit:
#47 added editing of groups, and moving them between. Added check constraint for groups...
r1349 # this will prevent accidental infinit loops
log.error('group nested more than %s' %
#209 Added recursive count on repositories to calculate all repos within all nested groups
r1385 parents_recursion_limit)
#47 added editing of groups, and moving them between. Added check constraint for groups...
r1349 break
Changes for repo groups
r1159 groups.insert(0, gr)
return groups
#209 Added recursive count on repositories to calculate all repos within all nested groups
r1385 @property
def children(self):
return Session.query(Group).filter(Group.parent_group == self)
fixed saving settings on repositories inside groups, also fixes #187...
r1323
@property
implements #226 repo groups available by path...
r1538 def name(self):
return self.group_name.split(Group.url_sep())[-1]
@property
fixed saving settings on repositories inside groups, also fixes #187...
r1323 def full_path(self):
implements #226 repo groups available by path...
r1538 return self.group_name
@property
def full_path_splitted(self):
return self.group_name.split(Group.url_sep())
fixed saving settings on repositories inside groups, also fixes #187...
r1323
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
#209 Added recursive count on repositories to calculate all repos within all nested groups
r1385 @property
def repositories_recursive_count(self):
cnt = self.repositories.count()
def children_count(group):
cnt = 0
for child in group.children:
cnt += child.repositories.count()
cnt += children_count(child)
return cnt
return cnt + children_count(self)
implements #226 repo groups available by path...
r1538
def get_new_name(self, group_name):
"""
returns new full group name based on parent and new name
:param group_name:
"""
path_prefix = self.parent_group.full_path_splitted if self.parent_group else []
return Group.url_sep().join(path_prefix + [group_name])
Added basic JsonSerialization into models....
r1388 class Permission(Base, BaseModel):
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()
Added basic JsonSerialization into models....
r1388 class RepoToPerm(Base, BaseModel):
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
Added basic JsonSerialization into models....
r1388 class UserToPerm(Base, BaseModel):
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
Added basic JsonSerialization into models....
r1388 class UsersGroupRepoToPerm(Base, BaseModel):
Fixed permissions for users groups, group can have create repo permission now....
r1271 __tablename__ = 'users_group_repo_to_perm'
fixes issues #202, bad db constraint made impossible to attach same group more than one time....
r1376 __table_args__ = (UniqueConstraint('repository_id', '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
fixes #228 - added detection of assigned groups to prevent errors on sqlite
r1435 def __repr__(self):
return '<userGroup:%s => %s >' % (self.users_group, self.repository)
Fixed permissions for users groups, group can have create repo permission now....
r1271
Added basic JsonSerialization into models....
r1388 class UsersGroupToPerm(Base, BaseModel):
Fixed permissions for users groups, group can have create repo permission now....
r1271 __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()
Added basic JsonSerialization into models....
r1388 class GroupToPerm(Base, BaseModel):
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
Added basic JsonSerialization into models....
r1388 class Statistics(Base, BaseModel):
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
Added basic JsonSerialization into models....
r1388 class UserFollowing(Base, BaseModel):
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)
Added basic JsonSerialization into models....
r1388 class CacheInvalidation(Base, BaseModel):
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
Added basic JsonSerialization into models....
r1388 class DbMigrateVersion(Base, BaseModel):
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)