Mercurial > kallithea
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 |