diff --git a/rhodecode/lib/utils.py b/rhodecode/lib/utils.py --- a/rhodecode/lib/utils.py +++ b/rhodecode/lib/utils.py @@ -44,7 +44,7 @@ from vcs.utils.lazy import LazyProperty from rhodecode.model import meta from rhodecode.model.caching_query import FromCache -from rhodecode.model.db import Repository, User, RhodeCodeUi, UserLog +from rhodecode.model.db import Repository, User, RhodeCodeUi, UserLog, Group from rhodecode.model.repo import RepoModel from rhodecode.model.user import UserModel @@ -296,8 +296,35 @@ class EmptyChangeset(BaseChangeset): def get_file_size(self, path): return 0 +def map_groups(groups): + """Checks for groups existence, and creates groups structures. + It returns last group in structure + + :param groups: list of groups structure + """ + sa = meta.Session() + + parent = None + group = None + for lvl, group_name in enumerate(groups[:-1]): + group = sa.query(Group).filter(Group.group_name == group_name).scalar() + + if group is None: + group = Group(group_name, parent) + sa.add(group) + sa.commit() + + parent = group + + return group + def repo2db_mapper(initial_repo_list, remove_obsolete=False): - """maps all found repositories into db + """maps all repos given in initial_repo_list, non existing repositories + are created, if remove_obsolete is True it also check for db entries + that are not in initial_repo_list and removes them. + + :param initial_repo_list: list of repositories found by scanning methods + :param remove_obsolete: check for obsolete entries in database """ sa = meta.Session() @@ -305,6 +332,7 @@ def repo2db_mapper(initial_repo_list, re user = sa.query(User).filter(User.admin == True).first() for name, repo in initial_repo_list.items(): + group = map_groups(name.split('/')) if not rm.get_by_repo_name(name, cache=False): log.info('repository %s not found creating default', name) @@ -314,7 +342,8 @@ def repo2db_mapper(initial_repo_list, re 'description':repo.description \ if repo.description != 'unknown' else \ '%s repository' % name, - 'private':False + 'private':False, + 'group_id':getattr(group, 'group_id', None) } rm.create(form_data, user, just_db=True) diff --git a/rhodecode/model/db.py b/rhodecode/model/db.py --- a/rhodecode/model/db.py +++ b/rhodecode/model/db.py @@ -80,8 +80,8 @@ class RhodeCodeSettings(Base, BaseModel) self.app_settings_value = v def __repr__(self): - return "" % (self.app_settings_name, - self.app_settings_value) + return "<%s('%s:%s')>" % (self.__class__.__name__, + self.app_settings_name, self.app_settings_value) class RhodeCodeUi(Base, BaseModel): __tablename__ = 'rhodecode_ui' @@ -118,7 +118,8 @@ class User(Base, BaseModel): return '%s %s <%s>' % (self.name, self.lastname, self.email) def __repr__(self): - return "" % (self.user_id, self.username) + return "<%s('id:%s:%s')>" % (self.__class__.__name__, + self.user_id, self.username) def update_lastlogin(self): """Update user lastlogin""" @@ -158,9 +159,11 @@ class Repository(Base, BaseModel): enable_statistics = Column("statistics", Boolean(), nullable=True, unique=None, default=True) 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) + group_id = Column("group_id", Integer(), ForeignKey(u'groups.group_id'), nullable=True, unique=False, default=None) user = relation('User') fork = relation('Repository', remote_side=repo_id) + group = relation('Group') repo_to_perm = relation('RepoToPerm', cascade='all') stats = relation('Statistics', cascade='all', uselist=False) @@ -168,7 +171,27 @@ class Repository(Base, BaseModel): def __repr__(self): - return "" % (self.repo_id, self.repo_name) + return "<%s('%s:%s')>" % (self.__class__.__name__, + self.repo_id, self.repo_name) + +class Group(Base, BaseModel): + __tablename__ = 'groups' + __table_args__ = (UniqueConstraint('group_name'), {'useexisting':True},) + + group_id = Column("group_id", Integer(), nullable=False, unique=True, default=None, primary_key=True) + group_name = Column("group_name", String(length=None, convert_unicode=False, assert_unicode=None), nullable=False, unique=True, default=None) + group_parent_id = Column("group_parent_id", Integer(), ForeignKey(u'groups.group_id'), nullable=True, unique=None, default=None) + + parent_group = relation('Group', remote_side=group_id) + + + 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) class Permission(Base, BaseModel): __tablename__ = 'permissions' @@ -178,7 +201,8 @@ class Permission(Base, BaseModel): permission_longname = Column("permission_longname", String(length=None, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None) def __repr__(self): - return "" % (self.permission_id, self.permission_name) + return "<%s('%s:%s')>" % (self.__class__.__name__, + self.permission_id, self.permission_name) class RepoToPerm(Base, BaseModel): __tablename__ = 'repo_to_perm' @@ -246,7 +270,8 @@ class CacheInvalidation(Base, BaseModel) self.cache_active = False def __repr__(self): - return "" % (self.cache_id, self.cache_key) + return "<%s('%s:%s')>" % (self.__class__.__name__, + self.cache_id, self.cache_key) class DbMigrateVersion(Base, BaseModel): __tablename__ = 'db_migrate_version' diff --git a/rhodecode/model/scm.py b/rhodecode/model/scm.py --- a/rhodecode/model/scm.py +++ b/rhodecode/model/scm.py @@ -135,7 +135,7 @@ class ScmModel(BaseModel): tip = h.get_changeset_safe(repo, 'tip') tmp_d = {} - tmp_d['name'] = repo.name + tmp_d['name'] = r.repo_name tmp_d['name_sort'] = tmp_d['name'].lower() tmp_d['description'] = repo.dbrepo.description tmp_d['description_sort'] = tmp_d['description']