changeset 878:859bc9e7a15d beta

Extended repo2db mapper with group creation via directory structures Added Groups model to db models fixed group name with filesystem name rather than MercurialRepository Instance
author Marcin Kuzminski <marcin@python-works.com>
date Mon, 27 Dec 2010 00:09:12 +0100
parents bc9a73adc216
children b19341623d48
files rhodecode/lib/utils.py rhodecode/model/db.py rhodecode/model/scm.py
diffstat 3 files changed, 64 insertions(+), 10 deletions(-) [+]
line wrap: on
line diff
--- a/rhodecode/lib/utils.py	Wed Dec 22 03:39:32 2010 +0100
+++ b/rhodecode/lib/utils.py	Mon Dec 27 00:09:12 2010 +0100
@@ -44,7 +44,7 @@
 
 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 @@
     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 @@
     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 @@
                          '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)
 
--- a/rhodecode/model/db.py	Wed Dec 22 03:39:32 2010 +0100
+++ b/rhodecode/model/db.py	Mon Dec 27 00:09:12 2010 +0100
@@ -80,8 +80,8 @@
         self.app_settings_value = v
 
     def __repr__(self):
-        return "<RhodeCodeSetting('%s:%s')>" % (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 @@
         return '%s %s <%s>' % (self.name, self.lastname, self.email)
 
     def __repr__(self):
-        return "<User('id:%s:%s')>" % (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 @@
     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 @@
 
 
     def __repr__(self):
-        return "<Repository('%s:%s')>" % (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 @@
     permission_longname = Column("permission_longname", String(length=None, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
 
     def __repr__(self):
-        return "<Permission('%s:%s')>" % (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 @@
         self.cache_active = False
 
     def __repr__(self):
-        return "<CacheInvalidation('%s:%s')>" % (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'
--- a/rhodecode/model/scm.py	Wed Dec 22 03:39:32 2010 +0100
+++ b/rhodecode/model/scm.py	Mon Dec 27 00:09:12 2010 +0100
@@ -135,7 +135,7 @@
                 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']