##// END OF EJS Templates
Added application settings, are now customizable from database...
marcink -
r350:664a5b8c default
parent child Browse files
Show More
@@ -40,9 +40,8 b' class AdminController(BaseController):'
40 40
41 41 @HasPermissionAllDecorator('hg.admin')
42 42 def index(self):
43 sa = meta.Session
44
45 users_log = sa.query(UserLog).order_by(UserLog.action_date.desc())
43
44 users_log = self.sa.query(UserLog).order_by(UserLog.action_date.desc())
46 45 p = int(request.params.get('page', 1))
47 46 c.users_log = Page(users_log, page=p, items_per_page=10)
48 47 c.log_data = render('admin/admin_log.html')
@@ -2,7 +2,7 b''
2 2 # encoding: utf-8
3 3 # settings controller for pylons
4 4 # Copyright (C) 2009-2010 Marcin Kuzminski <marcin@python-works.com>
5
5
6 6 # This program is free software; you can redistribute it and/or
7 7 # modify it under the terms of the GNU General Public License
8 8 # as published by the Free Software Foundation; version 2
@@ -23,20 +23,23 b' settings controller for pylons'
23 23 @author: marcink
24 24 """
25 25 from formencode import htmlfill
26 from pylons import request, session, tmpl_context as c, url, app_globals as g
26 from pylons import request, session, tmpl_context as c, url, app_globals as g, \
27 config
27 28 from pylons.controllers.util import abort, redirect
28 29 from pylons.i18n.translation import _
29 30 from pylons_app.lib import helpers as h
30 31 from pylons_app.lib.auth import LoginRequired, HasPermissionAllDecorator
31 32 from pylons_app.lib.base import BaseController, render
32 from pylons_app.lib.utils import repo2db_mapper, invalidate_cache
33 from pylons_app.model.db import User, UserLog
34 from pylons_app.model.forms import UserForm
33 from pylons_app.lib.utils import repo2db_mapper, invalidate_cache, \
34 set_hg_app_config
35 from pylons_app.model.db import User, UserLog, HgAppSettings
36 from pylons_app.model.forms import UserForm, ApplicationSettingsForm
35 37 from pylons_app.model.hg_model import HgModel
36 38 from pylons_app.model.user_model import UserModel
37 39 import formencode
38 40 import logging
39
41 import traceback
42
40 43 log = logging.getLogger(__name__)
41 44
42 45
@@ -58,7 +61,15 b' class SettingsController(BaseController)'
58 61 def index(self, format='html'):
59 62 """GET /admin/settings: All items in the collection"""
60 63 # url('admin_settings')
61 return render('admin/settings/settings.html')
64
65 hgsettings = self.sa.query(HgAppSettings).scalar()
66 defaults = hgsettings.__dict__ if hgsettings else {}
67 return htmlfill.render(
68 render('admin/settings/settings.html'),
69 defaults=defaults,
70 encoding="UTF-8",
71 force_defaults=False
72 )
62 73
63 74 def create(self):
64 75 """POST /admin/settings: Create a new item"""
@@ -83,7 +94,46 b' class SettingsController(BaseController)'
83 94 initial = HgModel.repo_scan(g.paths[0][0], g.paths[0][1], g.baseui)
84 95 repo2db_mapper(initial, rm_obsolete)
85 96 invalidate_cache('cached_repo_list')
97
98 if id == 'global':
86 99
100 application_form = ApplicationSettingsForm()()
101 try:
102 form_result = application_form.to_python(dict(request.POST))
103 title = form_result['app_title']
104 realm = form_result['app_auth_realm']
105
106 try:
107 hgsettings = self.sa.query(HgAppSettings).get(1)
108 hgsettings.app_auth_realm = realm
109 hgsettings.app_title = title
110
111 self.sa.add(hgsettings)
112 self.sa.commit()
113 set_hg_app_config(config)
114 h.flash(_('Updated application settings'),
115 category='success')
116
117 except:
118 log.error(traceback.format_exc())
119 h.flash(_('error occured during chaning application settings'),
120 category='error')
121
122 self.sa.rollback()
123
124
125 except formencode.Invalid as errors:
126 c.form_errors = errors.error_dict
127 return htmlfill.render(
128 render('admin/settings/settings.html'),
129 defaults=errors.value,
130 encoding="UTF-8")
131
132
133
134
135
136
87 137
88 138 return redirect(url('admin_settings'))
89 139
@@ -76,7 +76,6 b' class UsersController(BaseController):'
76 76 defaults=errors.value,
77 77 encoding="UTF-8")
78 78 except Exception:
79
80 79 h.flash(_('error occured during creation of user') \
81 80 % request.POST.get('username'), category='error')
82 81 return redirect(url('users'))
@@ -47,7 +47,10 b' def get_crypt_password(password):'
47 47 @cache_region('super_short_term', 'cached_user')
48 48 def get_user_cached(username):
49 49 sa = meta.Session
50 user = sa.query(User).filter(User.username == username).one()
50 try:
51 user = sa.query(User).filter(User.username == username).one()
52 finally:
53 meta.Session.remove()
51 54 return user
52 55
53 56 def authfunc(environ, username, password):
@@ -89,8 +92,12 b' def set_available_permissions(config):'
89 92 @param config:
90 93 """
91 94 log.info('getting information about all available permissions')
92 sa = meta.Session
93 all_perms = sa.query(Permission).all()
95 try:
96 sa = meta.Session
97 all_perms = sa.query(Permission).all()
98 finally:
99 meta.Session.remove()
100
94 101 config['available_permissions'] = [x.permission_name for x in all_perms]
95 102
96 103 def set_base_path(config):
@@ -140,7 +147,8 b' def fill_perms(user):'
140 147 p = 'repository.write'
141 148 else:
142 149 p = perm.Permission.permission_name
143 user.permissions['repositories'][perm.Repo2Perm.repository] = p
150 user.permissions['repositories'][perm.Repo2Perm.repository] = p
151 meta.Session.remove()
144 152 return user
145 153
146 154 def get_user(session):
@@ -34,7 +34,7 b' sys.path.append(ROOT)'
34 34 from pylons_app.lib.auth import get_crypt_password
35 35 from pylons_app.model import init_model
36 36 from pylons_app.model.db import User, Permission, HgAppUi, HgAppSettings
37 from pylons_app.model.meta import Session, Base
37 from pylons_app.model import meta
38 38 from sqlalchemy.engine import create_engine
39 39 import logging
40 40
@@ -51,7 +51,7 b' class DbManage(object):'
51 51 dburi = 'sqlite:////%s' % jn(ROOT, self.dbname)
52 52 engine = create_engine(dburi, echo=log_sql)
53 53 init_model(engine)
54 self.sa = Session()
54 self.sa = meta.Session
55 55 self.db_exists = False
56 56
57 57 def check_for_db(self, override):
@@ -71,7 +71,7 b' class DbManage(object):'
71 71 log.info("database exisist and it's going to be destroyed")
72 72 if self.db_exists:
73 73 os.remove(jn(ROOT, self.dbname))
74 Base.metadata.create_all(checkfirst=override)
74 meta.Base.metadata.create_all(checkfirst=override)
75 75 log.info('Created tables for %s', self.dbname)
76 76
77 77 def admin_prompt(self):
@@ -52,8 +52,7 b' class SimpleHg(object):'
52 52 self.application = application
53 53 self.config = config
54 54 #authenticate this mercurial request using
55 realm = self.config['hg_app_auth_realm']
56 self.authenticate = AuthBasicAuthenticator(realm, authfunc)
55 self.authenticate = AuthBasicAuthenticator('', authfunc)
57 56
58 57 def __call__(self, environ, start_response):
59 58 if not is_mercurial(environ):
@@ -64,6 +63,7 b' class SimpleHg(object):'
64 63 #===================================================================
65 64 username = REMOTE_USER(environ)
66 65 if not username:
66 self.authenticate.realm = self.config['hg_app_auth_realm']
67 67 result = self.authenticate(environ)
68 68 if isinstance(result, str):
69 69 AUTH_TYPE.update(environ, 'basic')
@@ -208,7 +208,9 b' class SimpleHg(object):'
208 208 except Exception as e:
209 209 sa.rollback()
210 210 log.error('could not log user action:%s', str(e))
211
211 finally:
212 meta.Session.remove()
213
212 214 def __invalidate_cache(self, repo_name):
213 215 """we know that some change was made to repositories and we should
214 216 invalidate the cache to see the changes right away but only for
@@ -29,7 +29,7 b' import logging'
29 29 from mercurial import ui, config, hg
30 30 from mercurial.error import RepoError
31 31 from pylons_app.model.db import Repository, User, HgAppUi, HgAppSettings
32 from pylons_app.model.meta import Session
32 from pylons_app.model import meta
33 33 log = logging.getLogger(__name__)
34 34
35 35
@@ -80,12 +80,21 b' def check_repo(repo_name, base_path, ver'
80 80
81 81 @cache_region('super_short_term', 'cached_hg_ui')
82 82 def get_hg_ui_cached():
83 sa = Session()
84 return sa.query(HgAppUi).all()
83 try:
84 sa = meta.Session
85 ret = sa.query(HgAppUi).all()
86 finally:
87 meta.Session.remove()
88 return ret
89
85 90
86 91 def get_hg_settings():
87 sa = Session()
88 ret = sa.query(HgAppSettings).scalar()
92 try:
93 sa = meta.Session
94 ret = sa.query(HgAppSettings).scalar()
95 finally:
96 meta.Session.remove()
97
89 98 if not ret:
90 99 raise Exception('Could not get application settings !')
91 100 return ret
@@ -183,7 +192,7 b' def repo2db_mapper(initial_repo_list, re'
183 192 """
184 193 from pylons_app.model.repo_model import RepoModel
185 194
186 sa = Session()
195 sa = meta.Session
187 196 user = sa.query(User).filter(User.admin == True).first()
188 197
189 198 rm = RepoModel()
@@ -208,3 +217,5 b' def repo2db_mapper(initial_repo_list, re'
208 217 sa.delete(repo)
209 218 sa.commit()
210 219
220
221 meta.Session.remove()
@@ -267,5 +267,14 b' def RepoSettingsForm(edit=False):'
267 267 return _RepoForm
268 268
269 269
270 def ApplicationSettingsForm():
271 class _ApplicationSettingsForm(formencode.Schema):
272 allow_extra_fields = True
273 filter_extra_fields = False
274 app_title = UnicodeString(strip=True, min=3, not_empty=True)
275 app_auth_realm = UnicodeString(strip=True, min=3, not_empty=True)
276
277 return _ApplicationSettingsForm
278
270 279
271 280
@@ -28,7 +28,7 b' from beaker.cache import cache_region'
28 28 from mercurial import ui
29 29 from mercurial.hgweb.hgwebdir_mod import findrepos
30 30 from vcs.exceptions import RepositoryError, VCSError
31 from pylons_app.model.meta import Session
31 from pylons_app.model import meta
32 32 from pylons_app.model.db import Repository
33 33 from sqlalchemy.orm import joinedload
34 34 import logging
@@ -81,7 +81,7 b' class HgModel(object):'
81 81 :param repos_path: path to directory it could take syntax with
82 82 * or ** for deep recursive displaying repositories
83 83 """
84 sa = Session()
84 sa = meta.Session()
85 85 def check_repo_dir(path):
86 86 """
87 87 Checks the repository
@@ -122,6 +122,7 b' class HgModel(object):'
122 122 repos_list[name].contact = dbrepo.user.full_contact
123 123 except OSError:
124 124 continue
125 meta.Session.remove()
125 126 return repos_list
126 127
127 128 def get_repos(self):
@@ -20,7 +20,7 b''
20 20 ${h.form(url('admin_setting', id='mapping'),method='put')}
21 21 <table class="table_disp">
22 22 <tr class="header">
23 <td colspan="2">${_('Remap andv rescan repositories')}</td>
23 <td colspan="2">${_('Remap and rescan repositories')}</td>
24 24 </tr>
25 25 <tr align="right">
26 26 <td><span class="tooltip" tooltip_title="${h.tooltip(_('In case a repository was deleted from filesystem and there are leftovers in the database check this option to scan obsolete data in database and remove it.'))}">
@@ -36,11 +36,11 b''
36 36 </tr>
37 37 <tr>
38 38 <td>${_('Application name')}</td>
39 <td>${h.text('app_title')}</td>
39 <td>${h.text('app_title',size=30)}${self.get_form_error('app_title')}</td>
40 40 </tr>
41 41 <tr>
42 42 <td>${_('Realm text')}</td>
43 <td>${h.text('app_auth_realm')}</td>
43 <td>${h.text('app_auth_realm',size=30)}${self.get_form_error('app_auth_realm')}</td>
44 44 </tr>
45 45 <tr>
46 46 <td></td>
@@ -1,10 +1,10 b''
1 1 ## -*- coding: utf-8 -*-
2 2 <%inherit file="base/base.html"/>
3 3 <%def name="title()">
4 ${c.repos_prefix} Mercurial Repositories
4 ${c.repos_prefix}
5 5 </%def>
6 6 <%def name="breadcrumbs()">
7 ${c.repos_prefix} Mercurial Repositories
7 ${c.repos_prefix}
8 8 </%def>
9 9 <%def name="page_nav()">
10 10 ${self.menu('home')}
@@ -1,10 +1,10 b''
1 1 ## -*- coding: utf-8 -*-
2 2 <%inherit file="base/base.html"/>
3 3 <%def name="title()">
4 ${c.repos_prefix} Mercurial Repositories
4 ${c.repos_prefix}
5 5 </%def>
6 6 <%def name="breadcrumbs()">
7 ${c.repos_prefix} Mercurial Repositories
7 ${c.repos_prefix}
8 8 </%def>
9 9 <%def name="page_nav()">
10 10 &nbsp;
General Comments 0
You need to be logged in to leave comments. Login now