##// END OF EJS Templates
moved db migration do db manage script, added my cycles for upgrades
moved db migration do db manage script, added my cycles for upgrades

File last commit:

r836:28a4bb11 beta
r839:ad66bd0e beta
Show More
db.py
257 lines | 13.4 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
~~~~~~~~~~~~~~~~~~
Models code cleanups
r759
added current db version into rhodecode,...
r834 Database Models for RhodeCode
Models code cleanups
r759 :created_on: Apr 08, 2010
:author: marcink
:copyright: (C) 2009-2010 Marcin Kuzminski <marcin@python-works.com>
:license: GPLv3, see COPYING for more details.
"""
# 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; version 2
# of the License or (at your opinion) any later version of the license.
#
# 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.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
# MA 02110-1301, USA.
import logging
import datetime
fixed imports
r658 from sqlalchemy import *
Models code cleanups
r759 from sqlalchemy.exc import DatabaseError
new improved models with helper functions for easier data fetching
r832 from sqlalchemy.orm import relation, backref, class_mapper
fixed imports
r658 from sqlalchemy.orm.session import Session
Models code cleanups
r759
from rhodecode.model.meta import Base
renamed project to rhodecode
r547 log = logging.getLogger(__name__)
new improved models with helper functions for easier data fetching
r832 class BaseModel(object):
@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])
class RhodeCodeSettings(Base, BaseModel):
renamed hg_app to rhodecode
r548 __tablename__ = 'rhodecode_settings'
renamed project to rhodecode
r547 __table_args__ = (UniqueConstraint('app_settings_name'), {'useexisting':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)
app_settings_name = Column("app_settings_name", String(length=None, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
app_settings_value = Column("app_settings_value", String(length=None, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
renamed project to rhodecode
r547
Added settings model, and Exceptions lib....
r704 def __init__(self, k, v):
self.app_settings_name = k
self.app_settings_value = v
def __repr__(self):
return "<RhodeCodeSetting('%s:%s')>" % (self.app_settings_name,
self.app_settings_value)
new improved models with helper functions for easier data fetching
r832 class RhodeCodeUi(Base, BaseModel):
renamed hg_app to rhodecode
r548 __tablename__ = 'rhodecode_ui'
renamed project to rhodecode
r547 __table_args__ = {'useexisting':True}
fixed models for compatibility with database systems
r780 ui_id = Column("ui_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
ui_section = Column("ui_section", String(length=None, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
ui_key = Column("ui_key", String(length=None, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
ui_value = Column("ui_value", String(length=None, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
ui_active = Column("ui_active", Boolean(), nullable=True, unique=None, default=True)
Hacking for git support,and new faster repo scan
r631
new improved models with helper functions for easier data fetching
r832 class User(Base, BaseModel):
renamed project to rhodecode
r547 __tablename__ = 'users'
__table_args__ = (UniqueConstraint('username'), UniqueConstraint('email'), {'useexisting':True})
fixed models for compatibility with database systems
r780 user_id = Column("user_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
username = Column("username", String(length=None, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
password = Column("password", String(length=None, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
active = Column("active", Boolean(), nullable=True, unique=None, default=None)
admin = Column("admin", Boolean(), nullable=True, unique=None, default=False)
name = Column("name", String(length=None, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
lastname = Column("lastname", String(length=None, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
email = Column("email", String(length=None, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
last_login = Column("last_login", DateTime(timezone=False), nullable=True, unique=None, default=None)
is_ldap = Column("is_ldap", Boolean(), nullable=False, unique=None, default=False)
Hacking for git support,and new faster repo scan
r631
Added settings model, and Exceptions lib....
r704 user_log = relation('UserLog', cascade='all')
user_perms = relation('UserToPerm', primaryjoin="User.user_id==UserToPerm.user_id", cascade='all')
Hacking for git support,and new faster repo scan
r631
fixed #72 show warning on removal when user still is owner of existing repositories...
r713 repositories = relation('Repository')
implemented user dashboards, and following system.
r734 user_followers = relation('UserFollowing', primaryjoin='UserFollowing.follows_user_id==User.user_id', cascade='all')
fixed #72 show warning on removal when user still is owner of existing repositories...
r713
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
renamed project to rhodecode
r547 def __repr__(self):
return "<User('id:%s:%s')>" % (self.user_id, self.username)
Hacking for git support,and new faster repo scan
r631
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()
new improved models with helper functions for easier data fetching
r832 class UserLog(Base, BaseModel):
renamed project to rhodecode
r547 __tablename__ = 'user_logs'
__table_args__ = {'useexisting':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)
user_id = Column("user_id", Integer(), ForeignKey(u'users.user_id'), nullable=False, unique=None, default=None)
repository_id = Column("repository_id", Integer(length=None, convert_unicode=False, assert_unicode=None), ForeignKey(u'repositories.repo_id'), nullable=False, unique=None, default=None)
repository_name = Column("repository_name", String(length=None, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
user_ip = Column("user_ip", String(length=None, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
action = Column("action", String(length=None, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
action_date = Column("action_date", DateTime(timezone=False), nullable=True, unique=None, default=None)
Hacking for git support,and new faster repo scan
r631
renamed project to rhodecode
r547 user = relation('User')
repository = relation('Repository')
Hacking for git support,and new faster repo scan
r631
new improved models with helper functions for easier data fetching
r832 class Repository(Base, BaseModel):
renamed project to rhodecode
r547 __tablename__ = 'repositories'
__table_args__ = (UniqueConstraint('repo_name'), {'useexisting':True},)
fixed models for compatibility with database systems
r780 repo_id = Column("repo_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
repo_name = Column("repo_name", String(length=None, convert_unicode=False, assert_unicode=None), nullable=False, unique=True, default=None)
dbmigrations:...
r836 repo_type = Column("repo_type", String(length=None, convert_unicode=False, assert_unicode=None), nullable=False, unique=False, default='hg')
fixed models for compatibility with database systems
r780 user_id = Column("user_id", Integer(), ForeignKey(u'users.user_id'), nullable=False, unique=False, default=None)
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)
fixed models for compatibility with database systems
r780 description = Column("description", String(length=None, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
fork_id = Column("fork_id", Integer(), ForeignKey(u'repositories.repo_id'), nullable=True, unique=False, default=None)
Hacking for git support,and new faster repo scan
r631
renamed project to rhodecode
r547 user = relation('User')
fork = relation('Repository', remote_side=repo_id)
repo_to_perm = relation('RepoToPerm', cascade='all')
added cache reset, stats reset, and delete into repository settings in admin....
r708 stats = relation('Statistics', cascade='all', uselist=False)
fixes #51 deleting a repo didn't delete it's dependent db entries....
r667
implemented user dashboards, and following system.
r734 repo_followers = relation('UserFollowing', primaryjoin='UserFollowing.follows_repo_id==Repository.repo_id', cascade='all')
renamed project to rhodecode
r547 def __repr__(self):
#50 on point cache invalidation changes....
r692 return "<Repository('%s:%s')>" % (self.repo_id, self.repo_name)
Hacking for git support,and new faster repo scan
r631
new improved models with helper functions for easier data fetching
r832 class Permission(Base, BaseModel):
renamed project to rhodecode
r547 __tablename__ = 'permissions'
__table_args__ = {'useexisting':True}
fixed models for compatibility with database systems
r780 permission_id = Column("permission_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
permission_name = Column("permission_name", String(length=None, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
permission_longname = Column("permission_longname", String(length=None, 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):
return "<Permission('%s:%s')>" % (self.permission_id, self.permission_name)
new improved models with helper functions for easier data fetching
r832 class RepoToPerm(Base, BaseModel):
renamed project to rhodecode
r547 __tablename__ = 'repo_to_perm'
__table_args__ = (UniqueConstraint('user_id', 'repository_id'), {'useexisting':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)
user_id = Column("user_id", Integer(), ForeignKey(u'users.user_id'), nullable=False, unique=None, default=None)
permission_id = Column("permission_id", Integer(), ForeignKey(u'permissions.permission_id'), nullable=False, unique=None, default=None)
repository_id = Column("repository_id", Integer(), ForeignKey(u'repositories.repo_id'), nullable=False, unique=None, default=None)
Hacking for git support,and new faster repo scan
r631
renamed project to rhodecode
r547 user = relation('User')
permission = relation('Permission')
repository = relation('Repository')
new improved models with helper functions for easier data fetching
r832 class UserToPerm(Base, BaseModel):
renamed project to rhodecode
r547 __tablename__ = 'user_to_perm'
__table_args__ = (UniqueConstraint('user_id', 'permission_id'), {'useexisting':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)
user_id = Column("user_id", Integer(), ForeignKey(u'users.user_id'), nullable=False, unique=None, default=None)
permission_id = Column("permission_id", Integer(), ForeignKey(u'permissions.permission_id'), nullable=False, unique=None, default=None)
Hacking for git support,and new faster repo scan
r631
renamed project to rhodecode
r547 user = relation('User')
permission = relation('Permission')
new improved models with helper functions for easier data fetching
r832 class Statistics(Base, BaseModel):
renamed project to rhodecode
r547 __tablename__ = 'statistics'
__table_args__ = (UniqueConstraint('repository_id'), {'useexisting':True})
fixed models for compatibility with database systems
r780 stat_id = Column("stat_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
repository_id = Column("repository_id", Integer(), ForeignKey(u'repositories.repo_id'), nullable=False, unique=True, default=None)
stat_on_revision = Column("stat_on_revision", Integer(), nullable=False)
commit_activity = Column("commit_activity", LargeBinary(), nullable=False)#JSON data
commit_activity_combined = Column("commit_activity_combined", LargeBinary(), nullable=False)#JSON data
languages = Column("languages", LargeBinary(), nullable=False)#JSON data
Hacking for git support,and new faster repo scan
r631
fixes #51 deleting a repo didn't delete it's dependent db entries....
r667 repository = relation('Repository', single_parent=True)
renamed project to rhodecode
r547
new improved models with helper functions for easier data fetching
r832 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')
, {'useexisting':True})
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)
user_id = Column("user_id", Integer(), ForeignKey(u'users.user_id'), nullable=False, unique=None, default=None)
follows_repo_id = Column("follows_repository_id", Integer(), ForeignKey(u'repositories.repo_id'), nullable=True, unique=None, default=None)
follows_user_id = Column("follows_user_id", Integer(), ForeignKey(u'users.user_id'), nullable=True, unique=None, default=None)
implemented user dashboards, and following system.
r734
user = relation('User', primaryjoin='User.user_id==UserFollowing.user_id')
follows_user = relation('User', primaryjoin='User.user_id==UserFollowing.follows_user_id')
follows_repository = relation('Repository')
new improved models with helper functions for easier data fetching
r832 class CacheInvalidation(Base, BaseModel):
Adde table for cache invalidation
r670 __tablename__ = 'cache_invalidation'
#50 on point cache invalidation changes....
r692 __table_args__ = (UniqueConstraint('cache_key'), {'useexisting':True})
fixed models for compatibility with database systems
r780 cache_id = Column("cache_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
cache_key = Column("cache_key", String(length=None, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
cache_args = Column("cache_args", String(length=None, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
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):
implemented user dashboards, and following system.
r734 return "<CacheInvalidation('%s:%s')>" % (self.cache_id, self.cache_key)
added current db version into rhodecode,...
r834
class DbMigrateVersion(Base, BaseModel):
__tablename__ = 'db_migrate_version'
__table_args__ = {'useexisting':True}
repository_id = Column('repository_id', String(250), primary_key=True)
repository_path = Column('repository_path', Text)
version = Column('version', Integer)