Mercurial > public > src > rhodecode
changeset 375:12bdf5496788 demo
Merge with 664a5b8c551a11115fcec79978f684f2253ad792
author | Marcin Kuzminski <marcin@python-works.com> |
---|---|
date | Wed, 14 Jul 2010 18:32:51 +0200 |
parents | 802ca7f9b362 (current diff) 664a5b8c551a (diff) |
children | a1e8912a89bc |
files | pylons_app/controllers/admin/users.py pylons_app/templates/login.html |
diffstat | 13 files changed, 172 insertions(+), 35 deletions(-) [+] |
line wrap: on
line diff
--- a/pylons_app/controllers/admin/admin.py Wed Jul 14 15:47:51 2010 +0200 +++ b/pylons_app/controllers/admin/admin.py Wed Jul 14 18:32:51 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')
--- a/pylons_app/controllers/admin/settings.py Wed Jul 14 15:47:51 2010 +0200 +++ b/pylons_app/controllers/admin/settings.py Wed Jul 14 18:32:51 2010 +0200 @@ -2,7 +2,7 @@ # encoding: utf-8 # settings controller for pylons # 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 @@ -23,18 +23,23 @@ @author: marcink """ from formencode import htmlfill -from pylons import request, session, tmpl_context as c, url +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.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__) @@ -56,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""" @@ -74,6 +87,59 @@ # h.form(url('admin_setting', id=ID), # method='put') # url('admin_setting', id=ID) + if id == 'mapping': + rm_obsolete = request.POST.get('destroy', False) + log.debug('Rescanning directories with destroy=%s', rm_obsolete) + + 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')) + + + + def delete(self, id): """DELETE /admin/settings/id: Delete an existing item"""
--- a/pylons_app/controllers/admin/users.py Wed Jul 14 15:47:51 2010 +0200 +++ b/pylons_app/controllers/admin/users.py Wed Jul 14 18:32:51 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'))
--- a/pylons_app/controllers/files.py Wed Jul 14 15:47:51 2010 +0200 +++ b/pylons_app/controllers/files.py Wed Jul 14 18:32:51 2010 +0200 @@ -182,6 +182,8 @@ else: #default option c.cur_diff = diff.as_html() + + if not c.cur_diff: c.no_changes = True return render('files/file_diff.html') def _get_history(self, repo, node, f_path):
--- a/pylons_app/lib/auth.py Wed Jul 14 15:47:51 2010 +0200 +++ b/pylons_app/lib/auth.py Wed Jul 14 18:32:51 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):
--- a/pylons_app/lib/db_manage.py Wed Jul 14 15:47:51 2010 +0200 +++ b/pylons_app/lib/db_manage.py Wed Jul 14 18:32:51 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):
--- a/pylons_app/lib/middleware/simplehg.py Wed Jul 14 15:47:51 2010 +0200 +++ b/pylons_app/lib/middleware/simplehg.py Wed Jul 14 18:32:51 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
--- a/pylons_app/lib/utils.py Wed Jul 14 15:47:51 2010 +0200 +++ b/pylons_app/lib/utils.py Wed Jul 14 18:32:51 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 @@ -177,14 +186,13 @@ return '0' * 12 -def repo2db_mapper(initial_repo_list): +def repo2db_mapper(initial_repo_list, remove_obsolete=False): """ maps all found repositories into db """ - from pylons_app.model.meta import Session from pylons_app.model.repo_model import RepoModel - sa = Session() + sa = meta.Session user = sa.query(User).filter(User.admin == True).first() rm = RepoModel() @@ -200,3 +208,14 @@ 'private':False } rm.create(form_data, user, just_db=True) + + + if remove_obsolete: + #remove from database those repositories that are not in the filesystem + for repo in sa.query(Repository).all(): + if repo.repo_name not in initial_repo_list.keys(): + sa.delete(repo) + sa.commit() + + + meta.Session.remove()
--- a/pylons_app/model/forms.py Wed Jul 14 15:47:51 2010 +0200 +++ b/pylons_app/model/forms.py Wed Jul 14 18:32:51 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 +
--- a/pylons_app/model/hg_model.py Wed Jul 14 15:47:51 2010 +0200 +++ b/pylons_app/model/hg_model.py Wed Jul 14 18:32:51 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):
--- a/pylons_app/templates/admin/settings/settings.html Wed Jul 14 15:47:51 2010 +0200 +++ b/pylons_app/templates/admin/settings/settings.html Wed Jul 14 18:32:51 2010 +0200 @@ -16,6 +16,38 @@ <%def name="main()"> <div> <h2>${_('Settings administration')}</h2> - + + ${h.form(url('admin_setting', id='mapping'),method='put')} + <table class="table_disp"> + <tr class="header"> + <td colspan="2">${_('Remap and rescan repositories')}</td> + </tr> + <tr align="right"> + <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.'))}"> + ${_('destroy old data')}</span> ${h.checkbox('destroy',True)}</td> + <td>${h.submit('rescan','rescan repositories')}</td> + </table> + ${h.end_form()} + <br/> + ${h.form(url('admin_setting', id='global'),method='put')} + <table class="table_disp"> + <tr class="header"> + <td colspan="3">${_('Global application settings')}</td> + </tr> + <tr> + <td>${_('Application name')}</td> + <td>${h.text('app_title',size=30)}${self.get_form_error('app_title')}</td> + </tr> + <tr> + <td>${_('Realm text')}</td> + <td>${h.text('app_auth_realm',size=30)}${self.get_form_error('app_auth_realm')}</td> + </tr> + <tr> + <td></td> + <td>${h.submit('save','save settings')}</td> + </tr> + </table> + ${h.end_form()} + </div> </%def>
--- a/pylons_app/templates/index.html Wed Jul 14 15:47:51 2010 +0200 +++ b/pylons_app/templates/index.html Wed Jul 14 18:32:51 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> <%def name="breadcrumbs()"> - ${c.repos_prefix} Mercurial Repositories + ${c.repos_prefix} </%def> <%def name="page_nav()"> ${self.menu('home')}
--- a/pylons_app/templates/login.html Wed Jul 14 15:47:51 2010 +0200 +++ b/pylons_app/templates/login.html Wed Jul 14 18:32:51 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> <%def name="breadcrumbs()"> - ${c.repos_prefix} Mercurial Repositories + ${c.repos_prefix} </%def> <%def name="page_nav()">