comparison 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
comparison
equal deleted inserted replaced
546:7c2f5e4d7bbf 547:1e757ac98988
1 #!/usr/bin/env python
2 # encoding: utf-8
3 # database managment for hg app
4 # Copyright (C) 2009-2010 Marcin Kuzminski <marcin@python-works.com>
5 #
6 # This program is free software; you can redistribute it and/or
7 # modify it under the terms of the GNU General Public License
8 # as published by the Free Software Foundation; version 2
9 # of the License or (at your opinion) any later version of the license.
10 #
11 # This program is distributed in the hope that it will be useful,
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 # GNU General Public License for more details.
15 #
16 # You should have received a copy of the GNU General Public License
17 # along with this program; if not, write to the Free Software
18 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
19 # MA 02110-1301, USA.
20
21 """
22 Created on April 10, 2010
23 database managment and creation for hg app
24 @author: marcink
25 """
26
27 from os.path import dirname as dn, join as jn
28 import os
29 import sys
30 import uuid
31 ROOT = dn(dn(dn(os.path.realpath(__file__))))
32 sys.path.append(ROOT)
33
34 from rhodecode.lib.auth import get_crypt_password
35 from rhodecode.lib.utils import ask_ok
36 from rhodecode.model import init_model
37 from rhodecode.model.db import User, Permission, HgAppUi, HgAppSettings, \
38 UserToPerm
39 from rhodecode.model import meta
40 from sqlalchemy.engine import create_engine
41 import logging
42
43 log = logging.getLogger(__name__)
44
45 class DbManage(object):
46 def __init__(self, log_sql, dbname, tests=False):
47 self.dbname = dbname
48 self.tests = tests
49 dburi = 'sqlite:////%s' % jn(ROOT, self.dbname)
50 engine = create_engine(dburi, echo=log_sql)
51 init_model(engine)
52 self.sa = meta.Session
53 self.db_exists = False
54
55 def check_for_db(self, override):
56 log.info('checking for exisiting db')
57 if os.path.isfile(jn(ROOT, self.dbname)):
58 self.db_exists = True
59 log.info('database exisist')
60 if not override:
61 raise Exception('database already exists')
62
63 def create_tables(self, override=False):
64 """
65 Create a auth database
66 """
67 self.check_for_db(override)
68 if override:
69 log.info("database exisist and it's going to be destroyed")
70 if self.tests:
71 destroy = True
72 else:
73 destroy = ask_ok('Are you sure to destroy old database ? [y/n]')
74 if not destroy:
75 sys.exit()
76 if self.db_exists and destroy:
77 os.remove(jn(ROOT, self.dbname))
78 checkfirst = not override
79 meta.Base.metadata.create_all(checkfirst=checkfirst)
80 log.info('Created tables for %s', self.dbname)
81
82 def admin_prompt(self):
83 if not self.tests:
84 import getpass
85 username = raw_input('Specify admin username:')
86 password = getpass.getpass('Specify admin password:')
87 email = raw_input('Specify admin email:')
88 self.create_user(username, password, email, True)
89 else:
90 log.info('creating admin and regular test users')
91 self.create_user('test_admin', 'test12', 'test_admin@mail.com', True)
92 self.create_user('test_regular', 'test12', 'test_regular@mail.com', False)
93 self.create_user('test_regular2', 'test12', 'test_regular2@mail.com', False)
94
95
96
97 def config_prompt(self, test_repo_path=''):
98 log.info('Setting up repositories config')
99
100 if not self.tests and not test_repo_path:
101 path = raw_input('Specify valid full path to your repositories'
102 ' you can change this later in application settings:')
103 else:
104 path = test_repo_path
105
106 if not os.path.isdir(path):
107 log.error('You entered wrong path: %s', path)
108 sys.exit()
109
110 hooks1 = HgAppUi()
111 hooks1.ui_section = 'hooks'
112 hooks1.ui_key = 'changegroup.update'
113 hooks1.ui_value = 'hg update >&2'
114
115 hooks2 = HgAppUi()
116 hooks2.ui_section = 'hooks'
117 hooks2.ui_key = 'changegroup.repo_size'
118 hooks2.ui_value = 'python:rhodecode.lib.hooks.repo_size'
119
120 web1 = HgAppUi()
121 web1.ui_section = 'web'
122 web1.ui_key = 'push_ssl'
123 web1.ui_value = 'false'
124
125 web2 = HgAppUi()
126 web2.ui_section = 'web'
127 web2.ui_key = 'allow_archive'
128 web2.ui_value = 'gz zip bz2'
129
130 web3 = HgAppUi()
131 web3.ui_section = 'web'
132 web3.ui_key = 'allow_push'
133 web3.ui_value = '*'
134
135 web4 = HgAppUi()
136 web4.ui_section = 'web'
137 web4.ui_key = 'baseurl'
138 web4.ui_value = '/'
139
140 paths = HgAppUi()
141 paths.ui_section = 'paths'
142 paths.ui_key = '/'
143 paths.ui_value = os.path.join(path, '*')
144
145
146 hgsettings1 = HgAppSettings()
147
148 hgsettings1.app_settings_name = 'realm'
149 hgsettings1.app_settings_value = 'hg-app authentication'
150
151 hgsettings2 = HgAppSettings()
152 hgsettings2.app_settings_name = 'title'
153 hgsettings2.app_settings_value = 'hg-app'
154
155 try:
156 self.sa.add(hooks1)
157 self.sa.add(hooks2)
158 self.sa.add(web1)
159 self.sa.add(web2)
160 self.sa.add(web3)
161 self.sa.add(web4)
162 self.sa.add(paths)
163 self.sa.add(hgsettings1)
164 self.sa.add(hgsettings2)
165 self.sa.commit()
166 except:
167 self.sa.rollback()
168 raise
169 log.info('created ui config')
170
171 def create_user(self, username, password, email='', admin=False):
172 log.info('creating administrator user %s', username)
173 new_user = User()
174 new_user.username = username
175 new_user.password = get_crypt_password(password)
176 new_user.name = 'Hg'
177 new_user.lastname = 'Admin'
178 new_user.email = email
179 new_user.admin = admin
180 new_user.active = True
181
182 try:
183 self.sa.add(new_user)
184 self.sa.commit()
185 except:
186 self.sa.rollback()
187 raise
188
189 def create_default_user(self):
190 log.info('creating default user')
191 #create default user for handling default permissions.
192 def_user = User()
193 def_user.username = 'default'
194 def_user.password = get_crypt_password(str(uuid.uuid1())[:8])
195 def_user.name = 'default'
196 def_user.lastname = 'default'
197 def_user.email = 'default@default.com'
198 def_user.admin = False
199 def_user.active = False
200 try:
201 self.sa.add(def_user)
202 self.sa.commit()
203 except:
204 self.sa.rollback()
205 raise
206
207 def create_permissions(self):
208 #module.(access|create|change|delete)_[name]
209 #module.(read|write|owner)
210 perms = [('repository.none', 'Repository no access'),
211 ('repository.read', 'Repository read access'),
212 ('repository.write', 'Repository write access'),
213 ('repository.admin', 'Repository admin access'),
214 ('hg.admin', 'Hg Administrator'),
215 ('hg.create.repository', 'Repository create'),
216 ('hg.create.none', 'Repository creation disabled'),
217 ('hg.register.none', 'Register disabled'),
218 ('hg.register.manual_activate', 'Register new user with hg-app without manual activation'),
219 ('hg.register.auto_activate', 'Register new user with hg-app without auto activation'),
220 ]
221
222 for p in perms:
223 new_perm = Permission()
224 new_perm.permission_name = p[0]
225 new_perm.permission_longname = p[1]
226 try:
227 self.sa.add(new_perm)
228 self.sa.commit()
229 except:
230 self.sa.rollback()
231 raise
232
233 def populate_default_permissions(self):
234 log.info('creating default user permissions')
235
236 default_user = self.sa.query(User)\
237 .filter(User.username == 'default').scalar()
238
239 reg_perm = UserToPerm()
240 reg_perm.user = default_user
241 reg_perm.permission = self.sa.query(Permission)\
242 .filter(Permission.permission_name == 'hg.register.manual_activate')\
243 .scalar()
244
245 create_repo_perm = UserToPerm()
246 create_repo_perm.user = default_user
247 create_repo_perm.permission = self.sa.query(Permission)\
248 .filter(Permission.permission_name == 'hg.create.repository')\
249 .scalar()
250
251 default_repo_perm = UserToPerm()
252 default_repo_perm.user = default_user
253 default_repo_perm.permission = self.sa.query(Permission)\
254 .filter(Permission.permission_name == 'repository.read')\
255 .scalar()
256
257 try:
258 self.sa.add(reg_perm)
259 self.sa.add(create_repo_perm)
260 self.sa.add(default_repo_perm)
261 self.sa.commit()
262 except:
263 self.sa.rollback()
264 raise
265