diff --git a/rhodecode/model/repos_group.py b/rhodecode/model/repos_group.py new file mode 100644 --- /dev/null +++ b/rhodecode/model/repos_group.py @@ -0,0 +1,173 @@ +# -*- coding: utf-8 -*- +""" + rhodecode.model.user_group + ~~~~~~~~~~~~~~~~~~~~~~~~~~ + + users groups model for RhodeCode + + :created_on: Jan 25, 2011 + :author: marcink + :copyright: (C) 2009-2011 Marcin Kuzminski + :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, either version 3 of the License, or +# (at your option) any later version. +# +# 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, see . + +import os +import logging +import traceback +import shutil + +from pylons.i18n.translation import _ + +from vcs.utils.lazy import LazyProperty + +from rhodecode.model import BaseModel +from rhodecode.model.caching_query import FromCache +from rhodecode.model.db import Group, RhodeCodeUi + +log = logging.getLogger(__name__) + + +class ReposGroupModel(BaseModel): + + @LazyProperty + def repos_path(self): + """ + Get's the repositories root path from database + """ + + q = RhodeCodeUi.get_by_key('/').one() + return q.ui_value + + def __create_group(self, group_name, parent_id): + """ + makes repositories group on filesystem + + :param repo_name: + :param parent_id: + """ + + if parent_id: + paths = Group.get(parent_id).full_path.split(Group.url_sep()) + parent_path = os.sep.join(paths) + else: + parent_path = '' + + create_path = os.path.join(self.repos_path, parent_path, group_name) + log.debug('creating new group in %s', create_path) + + if os.path.isdir(create_path): + raise Exception('That directory already exists !') + + + os.makedirs(create_path) + + + def __rename_group(self, old, old_parent_id, new, new_parent_id): + """ + Renames a group on filesystem + + :param group_name: + """ + log.debug('renaming repos group from %s to %s', old, new) + + if new_parent_id: + paths = Group.get(new_parent_id).full_path.split(Group.url_sep()) + new_parent_path = os.sep.join(paths) + else: + new_parent_path = '' + + if old_parent_id: + paths = Group.get(old_parent_id).full_path.split(Group.url_sep()) + old_parent_path = os.sep.join(paths) + else: + old_parent_path = '' + + old_path = os.path.join(self.repos_path, old_parent_path, old) + new_path = os.path.join(self.repos_path, new_parent_path, new) + + log.debug('renaming repos paths from %s to %s', old_path, new_path) + + if os.path.isdir(new_path): + raise Exception('Was trying to rename to already ' + 'existing dir %s' % new_path) + shutil.move(old_path, new_path) + + def __delete_group(self, group): + """ + Deletes a group from a filesystem + + :param group: instance of group from database + """ + paths = group.full_path.split(Group.url_sep()) + paths = os.sep.join(paths) + + rm_path = os.path.join(self.repos_path, paths) + os.rmdir(rm_path) + + def create(self, form_data): + try: + new_repos_group = Group() + new_repos_group.group_name = form_data['group_name'] + new_repos_group.group_description = \ + form_data['group_description'] + new_repos_group.group_parent_id = form_data['group_parent_id'] + + self.sa.add(new_repos_group) + + self.__create_group(form_data['group_name'], + form_data['group_parent_id']) + + self.sa.commit() + except: + log.error(traceback.format_exc()) + self.sa.rollback() + raise + + def update(self, repos_group_id, form_data): + + try: + repos_group = Group.get(repos_group_id) + old_name = repos_group.group_name + old_parent_id = repos_group.group_parent_id + + repos_group.group_name = form_data['group_name'] + repos_group.group_description = \ + form_data['group_description'] + repos_group.group_parent_id = form_data['group_parent_id'] + + self.sa.add(repos_group) + + if old_name != form_data['group_name'] or (old_parent_id != + form_data['group_parent_id']): + self.__rename_group(old=old_name, old_parent_id=old_parent_id, + new=form_data['group_name'], + new_parent_id=form_data['group_parent_id']) + + self.sa.commit() + except: + log.error(traceback.format_exc()) + self.sa.rollback() + raise + + def delete(self, users_group_id): + try: + users_group = Group.get(users_group_id) + self.sa.delete(users_group) + self.__delete_group(users_group) + self.sa.commit() + except: + log.error(traceback.format_exc()) + self.sa.rollback() + raise