diff rhodecode/lib/db_manage.py @ 547:1e757ac98988

renamed project to rhodecode
author Marcin Kuzminski <marcin@python-works.com>
date Wed, 06 Oct 2010 03:18:16 +0200
parents pylons_app/lib/db_manage.py@53aa1ee1af86
children f99075170eb4
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rhodecode/lib/db_manage.py	Wed Oct 06 03:18:16 2010 +0200
@@ -0,0 +1,265 @@
+#!/usr/bin/env python
+# encoding: utf-8
+# database managment for hg app
+# Copyright (C) 2009-2010 Marcin Kuzminski <marcin@python-works.com>
+#
+# 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.
+
+"""
+Created on April 10, 2010
+database managment and creation for hg app
+@author: marcink
+"""
+
+from os.path import dirname as dn, join as jn
+import os
+import sys
+import uuid
+ROOT = dn(dn(dn(os.path.realpath(__file__))))
+sys.path.append(ROOT)
+
+from rhodecode.lib.auth import get_crypt_password
+from rhodecode.lib.utils import ask_ok
+from rhodecode.model import init_model
+from rhodecode.model.db import User, Permission, HgAppUi, HgAppSettings, \
+    UserToPerm
+from rhodecode.model import meta
+from sqlalchemy.engine import create_engine
+import logging
+
+log = logging.getLogger(__name__)
+
+class DbManage(object):
+    def __init__(self, log_sql, dbname, tests=False):
+        self.dbname = dbname
+        self.tests = tests
+        dburi = 'sqlite:////%s' % jn(ROOT, self.dbname)
+        engine = create_engine(dburi, echo=log_sql) 
+        init_model(engine)
+        self.sa = meta.Session
+        self.db_exists = False
+    
+    def check_for_db(self, override):
+        log.info('checking for exisiting db')
+        if os.path.isfile(jn(ROOT, self.dbname)):
+            self.db_exists = True
+            log.info('database exisist')
+            if not override:
+                raise Exception('database already exists')
+
+    def create_tables(self, override=False):
+        """
+        Create a auth database
+        """
+        self.check_for_db(override)
+        if override:
+            log.info("database exisist and it's going to be destroyed")
+            if self.tests:
+                destroy = True
+            else:
+                destroy = ask_ok('Are you sure to destroy old database ? [y/n]')
+            if not destroy:
+                sys.exit()
+            if self.db_exists and destroy:
+                os.remove(jn(ROOT, self.dbname))
+        checkfirst = not override
+        meta.Base.metadata.create_all(checkfirst=checkfirst)
+        log.info('Created tables for %s', self.dbname)
+    
+    def admin_prompt(self):
+        if not self.tests:
+            import getpass
+            username = raw_input('Specify admin username:')
+            password = getpass.getpass('Specify admin password:')
+            email = raw_input('Specify admin email:')
+            self.create_user(username, password, email, True)
+        else:
+            log.info('creating admin and regular test users')
+            self.create_user('test_admin', 'test12', 'test_admin@mail.com', True)
+            self.create_user('test_regular', 'test12', 'test_regular@mail.com', False)
+            self.create_user('test_regular2', 'test12', 'test_regular2@mail.com', False)
+            
+        
+    
+    def config_prompt(self, test_repo_path=''):
+        log.info('Setting up repositories config')
+        
+        if not self.tests and not test_repo_path:
+            path = raw_input('Specify valid full path to your repositories'
+                        ' you can change this later in application settings:')
+        else:
+            path = test_repo_path
+            
+        if not os.path.isdir(path):
+            log.error('You entered wrong path: %s', path)
+            sys.exit()
+        
+        hooks1 = HgAppUi()
+        hooks1.ui_section = 'hooks'
+        hooks1.ui_key = 'changegroup.update'
+        hooks1.ui_value = 'hg update >&2'
+        
+        hooks2 = HgAppUi()
+        hooks2.ui_section = 'hooks'
+        hooks2.ui_key = 'changegroup.repo_size'
+        hooks2.ui_value = 'python:rhodecode.lib.hooks.repo_size' 
+                
+        web1 = HgAppUi()
+        web1.ui_section = 'web'
+        web1.ui_key = 'push_ssl'
+        web1.ui_value = 'false'
+                
+        web2 = HgAppUi()
+        web2.ui_section = 'web'
+        web2.ui_key = 'allow_archive'
+        web2.ui_value = 'gz zip bz2'
+                
+        web3 = HgAppUi()
+        web3.ui_section = 'web'
+        web3.ui_key = 'allow_push'
+        web3.ui_value = '*'
+        
+        web4 = HgAppUi()
+        web4.ui_section = 'web'
+        web4.ui_key = 'baseurl'
+        web4.ui_value = '/'                        
+        
+        paths = HgAppUi()
+        paths.ui_section = 'paths'
+        paths.ui_key = '/'
+        paths.ui_value = os.path.join(path, '*')
+        
+        
+        hgsettings1 = HgAppSettings()
+        
+        hgsettings1.app_settings_name = 'realm'
+        hgsettings1.app_settings_value = 'hg-app authentication'
+        
+        hgsettings2 = HgAppSettings()
+        hgsettings2.app_settings_name = 'title'
+        hgsettings2.app_settings_value = 'hg-app'      
+        
+        try:
+            self.sa.add(hooks1)
+            self.sa.add(hooks2)
+            self.sa.add(web1)
+            self.sa.add(web2)
+            self.sa.add(web3)
+            self.sa.add(web4)
+            self.sa.add(paths)
+            self.sa.add(hgsettings1)
+            self.sa.add(hgsettings2)
+            self.sa.commit()
+        except:
+            self.sa.rollback()
+            raise        
+        log.info('created ui config')
+                    
+    def create_user(self, username, password, email='', admin=False):
+        log.info('creating administrator user %s', username)
+        new_user = User()
+        new_user.username = username
+        new_user.password = get_crypt_password(password)
+        new_user.name = 'Hg'
+        new_user.lastname = 'Admin'
+        new_user.email = email
+        new_user.admin = admin
+        new_user.active = True
+        
+        try:
+            self.sa.add(new_user)
+            self.sa.commit()
+        except:
+            self.sa.rollback()
+            raise
+
+    def create_default_user(self):
+        log.info('creating default user')
+        #create default user for handling default permissions.
+        def_user = User()
+        def_user.username = 'default'
+        def_user.password = get_crypt_password(str(uuid.uuid1())[:8])
+        def_user.name = 'default'
+        def_user.lastname = 'default'
+        def_user.email = 'default@default.com'
+        def_user.admin = False
+        def_user.active = False
+        try:
+            self.sa.add(def_user)
+            self.sa.commit()
+        except:
+            self.sa.rollback()
+            raise
+    
+    def create_permissions(self):
+        #module.(access|create|change|delete)_[name]
+        #module.(read|write|owner)
+        perms = [('repository.none', 'Repository no access'),
+                 ('repository.read', 'Repository read access'),
+                 ('repository.write', 'Repository write access'),
+                 ('repository.admin', 'Repository admin access'),
+                 ('hg.admin', 'Hg Administrator'),
+                 ('hg.create.repository', 'Repository create'),
+                 ('hg.create.none', 'Repository creation disabled'),
+                 ('hg.register.none', 'Register disabled'),
+                 ('hg.register.manual_activate', 'Register new user with hg-app without manual activation'),
+                 ('hg.register.auto_activate', 'Register new user with hg-app without auto activation'),
+                ]
+        
+        for p in perms:
+            new_perm = Permission()
+            new_perm.permission_name = p[0]
+            new_perm.permission_longname = p[1]
+            try:
+                self.sa.add(new_perm)
+                self.sa.commit()
+            except:
+                self.sa.rollback()
+                raise
+
+    def populate_default_permissions(self):
+        log.info('creating default user permissions')
+        
+        default_user = self.sa.query(User)\
+        .filter(User.username == 'default').scalar()
+        
+        reg_perm = UserToPerm()
+        reg_perm.user = default_user
+        reg_perm.permission = self.sa.query(Permission)\
+        .filter(Permission.permission_name == 'hg.register.manual_activate')\
+        .scalar() 
+        
+        create_repo_perm = UserToPerm()
+        create_repo_perm.user = default_user
+        create_repo_perm.permission = self.sa.query(Permission)\
+        .filter(Permission.permission_name == 'hg.create.repository')\
+        .scalar() 
+        
+        default_repo_perm = UserToPerm()
+        default_repo_perm.user = default_user
+        default_repo_perm.permission = self.sa.query(Permission)\
+        .filter(Permission.permission_name == 'repository.read')\
+        .scalar() 
+                
+        try:
+            self.sa.add(reg_perm)
+            self.sa.add(create_repo_perm)
+            self.sa.add(default_repo_perm)
+            self.sa.commit()
+        except:
+            self.sa.rollback()
+            raise        
+