# HG changeset patch # User Marcin Kuzminski # Date 1279125066 -7200 # Node ID 664a5b8c551a11115fcec79978f684f2253ad792 # Parent 031152a540c55fa9b7ab2293f34cc26526c81972 Added application settings, are now customizable from database fixed all instances of sqlachemy to be removed() after execution. diff -r 031152a540c5 -r 664a5b8c551a pylons_app/controllers/admin/admin.py --- a/pylons_app/controllers/admin/admin.py Wed Jul 14 18:15:37 2010 +0200 +++ b/pylons_app/controllers/admin/admin.py Wed Jul 14 18:31:06 2010 +0200 @@ -40,9 +40,8 @@ @HasPermissionAllDecorator('hg.admin') def index(self): - sa = meta.Session - - users_log = sa.query(UserLog).order_by(UserLog.action_date.desc()) + + users_log = self.sa.query(UserLog).order_by(UserLog.action_date.desc()) p = int(request.params.get('page', 1)) c.users_log = Page(users_log, page=p, items_per_page=10) c.log_data = render('admin/admin_log.html') diff -r 031152a540c5 -r 664a5b8c551a pylons_app/controllers/admin/settings.py --- a/pylons_app/controllers/admin/settings.py Wed Jul 14 18:15:37 2010 +0200 +++ b/pylons_app/controllers/admin/settings.py Wed Jul 14 18:31:06 2010 +0200 @@ -2,7 +2,7 @@ # encoding: utf-8 # settings controller for pylons # Copyright (C) 2009-2010 Marcin Kuzminski - + # 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 @@ -23,20 +23,23 @@ @author: marcink """ from formencode import htmlfill -from pylons import request, session, tmpl_context as c, url, app_globals as g +from pylons import request, session, tmpl_context as c, url, app_globals as g, \ + config from pylons.controllers.util import abort, redirect from pylons.i18n.translation import _ from pylons_app.lib import helpers as h from pylons_app.lib.auth import LoginRequired, HasPermissionAllDecorator from pylons_app.lib.base import BaseController, render -from pylons_app.lib.utils import repo2db_mapper, invalidate_cache -from pylons_app.model.db import User, UserLog -from pylons_app.model.forms import UserForm +from pylons_app.lib.utils import repo2db_mapper, invalidate_cache, \ + set_hg_app_config +from pylons_app.model.db import User, UserLog, HgAppSettings +from pylons_app.model.forms import UserForm, ApplicationSettingsForm from pylons_app.model.hg_model import HgModel from pylons_app.model.user_model import UserModel import formencode import logging - +import traceback + log = logging.getLogger(__name__) @@ -58,7 +61,15 @@ def index(self, format='html'): """GET /admin/settings: All items in the collection""" # url('admin_settings') - return render('admin/settings/settings.html') + + hgsettings = self.sa.query(HgAppSettings).scalar() + defaults = hgsettings.__dict__ if hgsettings else {} + return htmlfill.render( + render('admin/settings/settings.html'), + defaults=defaults, + encoding="UTF-8", + force_defaults=False + ) def create(self): """POST /admin/settings: Create a new item""" @@ -83,7 +94,46 @@ initial = HgModel.repo_scan(g.paths[0][0], g.paths[0][1], g.baseui) repo2db_mapper(initial, rm_obsolete) invalidate_cache('cached_repo_list') + + if id == 'global': + application_form = ApplicationSettingsForm()() + try: + form_result = application_form.to_python(dict(request.POST)) + title = form_result['app_title'] + realm = form_result['app_auth_realm'] + + try: + hgsettings = self.sa.query(HgAppSettings).get(1) + hgsettings.app_auth_realm = realm + hgsettings.app_title = title + + self.sa.add(hgsettings) + self.sa.commit() + set_hg_app_config(config) + h.flash(_('Updated application settings'), + category='success') + + except: + log.error(traceback.format_exc()) + h.flash(_('error occured during chaning application settings'), + category='error') + + self.sa.rollback() + + + except formencode.Invalid as errors: + c.form_errors = errors.error_dict + return htmlfill.render( + render('admin/settings/settings.html'), + defaults=errors.value, + encoding="UTF-8") + + + + + + return redirect(url('admin_settings')) diff -r 031152a540c5 -r 664a5b8c551a pylons_app/controllers/admin/users.py --- a/pylons_app/controllers/admin/users.py Wed Jul 14 18:15:37 2010 +0200 +++ b/pylons_app/controllers/admin/users.py Wed Jul 14 18:31:06 2010 +0200 @@ -76,7 +76,6 @@ defaults=errors.value, encoding="UTF-8") except Exception: - h.flash(_('error occured during creation of user') \ % request.POST.get('username'), category='error') return redirect(url('users')) diff -r 031152a540c5 -r 664a5b8c551a pylons_app/lib/auth.py --- a/pylons_app/lib/auth.py Wed Jul 14 18:15:37 2010 +0200 +++ b/pylons_app/lib/auth.py Wed Jul 14 18:31:06 2010 +0200 @@ -47,7 +47,10 @@ @cache_region('super_short_term', 'cached_user') def get_user_cached(username): sa = meta.Session - user = sa.query(User).filter(User.username == username).one() + try: + user = sa.query(User).filter(User.username == username).one() + finally: + meta.Session.remove() return user def authfunc(environ, username, password): @@ -89,8 +92,12 @@ @param config: """ log.info('getting information about all available permissions') - sa = meta.Session - all_perms = sa.query(Permission).all() + try: + sa = meta.Session + all_perms = sa.query(Permission).all() + finally: + meta.Session.remove() + config['available_permissions'] = [x.permission_name for x in all_perms] def set_base_path(config): @@ -140,7 +147,8 @@ p = 'repository.write' else: p = perm.Permission.permission_name - user.permissions['repositories'][perm.Repo2Perm.repository] = p + user.permissions['repositories'][perm.Repo2Perm.repository] = p + meta.Session.remove() return user def get_user(session): diff -r 031152a540c5 -r 664a5b8c551a pylons_app/lib/db_manage.py --- a/pylons_app/lib/db_manage.py Wed Jul 14 18:15:37 2010 +0200 +++ b/pylons_app/lib/db_manage.py Wed Jul 14 18:31:06 2010 +0200 @@ -34,7 +34,7 @@ from pylons_app.lib.auth import get_crypt_password from pylons_app.model import init_model from pylons_app.model.db import User, Permission, HgAppUi, HgAppSettings -from pylons_app.model.meta import Session, Base +from pylons_app.model import meta from sqlalchemy.engine import create_engine import logging @@ -51,7 +51,7 @@ dburi = 'sqlite:////%s' % jn(ROOT, self.dbname) engine = create_engine(dburi, echo=log_sql) init_model(engine) - self.sa = Session() + self.sa = meta.Session self.db_exists = False def check_for_db(self, override): @@ -71,7 +71,7 @@ log.info("database exisist and it's going to be destroyed") if self.db_exists: os.remove(jn(ROOT, self.dbname)) - Base.metadata.create_all(checkfirst=override) + meta.Base.metadata.create_all(checkfirst=override) log.info('Created tables for %s', self.dbname) def admin_prompt(self): diff -r 031152a540c5 -r 664a5b8c551a pylons_app/lib/middleware/simplehg.py --- a/pylons_app/lib/middleware/simplehg.py Wed Jul 14 18:15:37 2010 +0200 +++ b/pylons_app/lib/middleware/simplehg.py Wed Jul 14 18:31:06 2010 +0200 @@ -52,8 +52,7 @@ self.application = application self.config = config #authenticate this mercurial request using - realm = self.config['hg_app_auth_realm'] - self.authenticate = AuthBasicAuthenticator(realm, authfunc) + self.authenticate = AuthBasicAuthenticator('', authfunc) def __call__(self, environ, start_response): if not is_mercurial(environ): @@ -64,6 +63,7 @@ #=================================================================== username = REMOTE_USER(environ) if not username: + self.authenticate.realm = self.config['hg_app_auth_realm'] result = self.authenticate(environ) if isinstance(result, str): AUTH_TYPE.update(environ, 'basic') @@ -208,7 +208,9 @@ except Exception as e: sa.rollback() log.error('could not log user action:%s', str(e)) - + finally: + meta.Session.remove() + def __invalidate_cache(self, repo_name): """we know that some change was made to repositories and we should invalidate the cache to see the changes right away but only for diff -r 031152a540c5 -r 664a5b8c551a pylons_app/lib/utils.py --- a/pylons_app/lib/utils.py Wed Jul 14 18:15:37 2010 +0200 +++ b/pylons_app/lib/utils.py Wed Jul 14 18:31:06 2010 +0200 @@ -29,7 +29,7 @@ from mercurial import ui, config, hg from mercurial.error import RepoError from pylons_app.model.db import Repository, User, HgAppUi, HgAppSettings -from pylons_app.model.meta import Session +from pylons_app.model import meta log = logging.getLogger(__name__) @@ -80,12 +80,21 @@ @cache_region('super_short_term', 'cached_hg_ui') def get_hg_ui_cached(): - sa = Session() - return sa.query(HgAppUi).all() + try: + sa = meta.Session + ret = sa.query(HgAppUi).all() + finally: + meta.Session.remove() + return ret + def get_hg_settings(): - sa = Session() - ret = sa.query(HgAppSettings).scalar() + try: + sa = meta.Session + ret = sa.query(HgAppSettings).scalar() + finally: + meta.Session.remove() + if not ret: raise Exception('Could not get application settings !') return ret @@ -183,7 +192,7 @@ """ from pylons_app.model.repo_model import RepoModel - sa = Session() + sa = meta.Session user = sa.query(User).filter(User.admin == True).first() rm = RepoModel() @@ -208,3 +217,5 @@ sa.delete(repo) sa.commit() + + meta.Session.remove() diff -r 031152a540c5 -r 664a5b8c551a pylons_app/model/forms.py --- a/pylons_app/model/forms.py Wed Jul 14 18:15:37 2010 +0200 +++ b/pylons_app/model/forms.py Wed Jul 14 18:31:06 2010 +0200 @@ -267,5 +267,14 @@ return _RepoForm +def ApplicationSettingsForm(): + class _ApplicationSettingsForm(formencode.Schema): + allow_extra_fields = True + filter_extra_fields = False + app_title = UnicodeString(strip=True, min=3, not_empty=True) + app_auth_realm = UnicodeString(strip=True, min=3, not_empty=True) + + return _ApplicationSettingsForm + diff -r 031152a540c5 -r 664a5b8c551a pylons_app/model/hg_model.py --- a/pylons_app/model/hg_model.py Wed Jul 14 18:15:37 2010 +0200 +++ b/pylons_app/model/hg_model.py Wed Jul 14 18:31:06 2010 +0200 @@ -28,7 +28,7 @@ from mercurial import ui from mercurial.hgweb.hgwebdir_mod import findrepos from vcs.exceptions import RepositoryError, VCSError -from pylons_app.model.meta import Session +from pylons_app.model import meta from pylons_app.model.db import Repository from sqlalchemy.orm import joinedload import logging @@ -81,7 +81,7 @@ :param repos_path: path to directory it could take syntax with * or ** for deep recursive displaying repositories """ - sa = Session() + sa = meta.Session() def check_repo_dir(path): """ Checks the repository @@ -122,6 +122,7 @@ repos_list[name].contact = dbrepo.user.full_contact except OSError: continue + meta.Session.remove() return repos_list def get_repos(self): diff -r 031152a540c5 -r 664a5b8c551a pylons_app/templates/admin/settings/settings.html --- a/pylons_app/templates/admin/settings/settings.html Wed Jul 14 18:15:37 2010 +0200 +++ b/pylons_app/templates/admin/settings/settings.html Wed Jul 14 18:31:06 2010 +0200 @@ -20,7 +20,7 @@ ${h.form(url('admin_setting', id='mapping'),method='put')} - + - + - + diff -r 031152a540c5 -r 664a5b8c551a pylons_app/templates/index.html --- a/pylons_app/templates/index.html Wed Jul 14 18:15:37 2010 +0200 +++ b/pylons_app/templates/index.html Wed Jul 14 18:31:06 2010 +0200 @@ -1,10 +1,10 @@ ## -*- coding: utf-8 -*- <%inherit file="base/base.html"/> <%def name="title()"> - ${c.repos_prefix} Mercurial Repositories + ${c.repos_prefix} <%def name="breadcrumbs()"> - ${c.repos_prefix} Mercurial Repositories + ${c.repos_prefix} <%def name="page_nav()"> ${self.menu('home')} diff -r 031152a540c5 -r 664a5b8c551a pylons_app/templates/login.html --- a/pylons_app/templates/login.html Wed Jul 14 18:15:37 2010 +0200 +++ b/pylons_app/templates/login.html Wed Jul 14 18:31:06 2010 +0200 @@ -1,10 +1,10 @@ ## -*- coding: utf-8 -*- <%inherit file="base/base.html"/> <%def name="title()"> - ${c.repos_prefix} Mercurial Repositories + ${c.repos_prefix} <%def name="breadcrumbs()"> - ${c.repos_prefix} Mercurial Repositories + ${c.repos_prefix} <%def name="page_nav()">  
${_('Remap andv rescan repositories')}${_('Remap and rescan repositories')}
@@ -36,11 +36,11 @@
${_('Application name')}${h.text('app_title')}${h.text('app_title',size=30)}${self.get_form_error('app_title')}
${_('Realm text')}${h.text('app_auth_realm')}${h.text('app_auth_realm',size=30)}${self.get_form_error('app_auth_realm')}