# HG changeset patch # User Marcin Kuzminski # Date 1277910887 -7200 # Node ID 8026872a10ee6f218890d64219d8f26e27dce415 # Parent 46b7d108ea7a8c809534a0344dd436736bbf37e8 Moved admin controllers to separate module diff -r 46b7d108ea7a -r 8026872a10ee pylons_app/config/routing.py --- a/pylons_app/config/routing.py Wed Jun 30 17:05:20 2010 +0200 +++ b/pylons_app/config/routing.py Wed Jun 30 17:14:47 2010 +0200 @@ -32,7 +32,7 @@ return not cr(repo_name, config['base_path']) #REST routes - with map.submapper(path_prefix='/_admin', controller='repos') as m: + with map.submapper(path_prefix='/_admin', controller='pylons_app.controllers.admin.repos:ReposController') as m: m.connect("repos", "/repos", action="create", conditions=dict(method=["POST"])) m.connect("repos", "/repos", @@ -67,11 +67,11 @@ action="delete_perm_user", conditions=dict(method=["DELETE"], function=check_repo)) - map.resource('user', 'users', path_prefix='/_admin') - map.resource('permission', 'permissions', path_prefix='/_admin') + map.resource('user', 'users', controller='pylons_app.controllers.admin.users:UsersController', path_prefix='/_admin') + map.resource('permission', 'permissions', controller='pylons_app.controllers.admin.permissions:PermissionsController', path_prefix='/_admin') #ADMIN - with map.submapper(path_prefix='/_admin', controller='admin') as m: + with map.submapper(path_prefix='/_admin', controller='pylons_app.controllers.admin.admin:AdminController') as m: m.connect('admin_home', '', action='index')#main page m.connect('admin_add_repo', '/add_repo/{new_repo:[a-z0-9\. _-]*}', action='add_repo') @@ -84,9 +84,11 @@ controller='feed', action='atom', conditions=dict(function=check_repo)) + #LOGIN/LOGOUT map.connect('login_home', '/login', controller='login') map.connect('logout_home', '/logout', controller='login', action='logout') + #OTHERS map.connect('changeset_home', '/{repo_name:.*}/changeset/{revision}', controller='changeset', revision='tip', conditions=dict(function=check_repo)) diff -r 46b7d108ea7a -r 8026872a10ee pylons_app/controllers/admin.py --- a/pylons_app/controllers/admin.py Wed Jun 30 17:05:20 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,52 +0,0 @@ -#!/usr/bin/env python -# encoding: utf-8 -# admin 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 -# of the License or (at your opinion) any later version of the license. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -# MA 02110-1301, USA. -""" -Created on April 7, 2010 -admin controller for pylons -@author: marcink -""" -import logging -from pylons import request, response, session, tmpl_context as c -from pylons_app.lib.base import BaseController, render -from pylons_app.model import meta -from pylons_app.model.db import UserLog -from webhelpers.paginate import Page -from pylons_app.lib.auth import LoginRequired, HasPermissionAllDecorator - -log = logging.getLogger(__name__) - -class AdminController(BaseController): - - @LoginRequired() - def __before__(self): - super(AdminController, self).__before__() - - @HasPermissionAllDecorator('hg.admin') - def index(self): - sa = meta.Session - - users_log = 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') - if request.params.get('partial'): - return c.log_data - return render('admin/admin.html') - diff -r 46b7d108ea7a -r 8026872a10ee pylons_app/controllers/admin/__init__.py diff -r 46b7d108ea7a -r 8026872a10ee pylons_app/controllers/admin/admin.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pylons_app/controllers/admin/admin.py Wed Jun 30 17:14:47 2010 +0200 @@ -0,0 +1,52 @@ +#!/usr/bin/env python +# encoding: utf-8 +# admin 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 +# of the License or (at your opinion) any later version of the license. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, +# MA 02110-1301, USA. +""" +Created on April 7, 2010 +admin controller for pylons +@author: marcink +""" +import logging +from pylons import request, response, session, tmpl_context as c +from pylons_app.lib.base import BaseController, render +from pylons_app.model import meta +from pylons_app.model.db import UserLog +from webhelpers.paginate import Page +from pylons_app.lib.auth import LoginRequired, HasPermissionAllDecorator + +log = logging.getLogger(__name__) + +class AdminController(BaseController): + + @LoginRequired() + def __before__(self): + super(AdminController, self).__before__() + + @HasPermissionAllDecorator('hg.admin') + def index(self): + sa = meta.Session + + users_log = 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') + if request.params.get('partial'): + return c.log_data + return render('admin/admin.html') + diff -r 46b7d108ea7a -r 8026872a10ee pylons_app/controllers/admin/permissions.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pylons_app/controllers/admin/permissions.py Wed Jun 30 17:14:47 2010 +0200 @@ -0,0 +1,90 @@ +#!/usr/bin/env python +# encoding: utf-8 +# permissions 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 +# of the License or (at your opinion) any later version of the license. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, +# MA 02110-1301, USA. +""" +Created on April 27, 2010 +permissions controller for pylons +@author: marcink +""" +from formencode import htmlfill +from pylons import request, session, tmpl_context as c, url +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.model.user_model import UserModel +import formencode +import logging + +log = logging.getLogger(__name__) + +class PermissionsController(BaseController): + """REST Controller styled on the Atom Publishing Protocol""" + # To properly map this controller, ensure your config/routing.py + # file has a resource setup: + # map.resource('permission', 'permissions') + + @LoginRequired() + #@HasPermissionAllDecorator('hg.admin') + def __before__(self): + c.admin_user = session.get('admin_user') + c.admin_username = session.get('admin_username') + super(PermissionsController, self).__before__() + + def index(self, format='html'): + """GET /permissions: All items in the collection""" + # url('permissions') + return render('admin/permissions/permissions.html') + + def create(self): + """POST /permissions: Create a new item""" + # url('permissions') + + def new(self, format='html'): + """GET /permissions/new: Form to create a new item""" + # url('new_permission') + + def update(self, id): + """PUT /permissions/id: Update an existing item""" + # Forms posted to this method should contain a hidden field: + # + # Or using helpers: + # h.form(url('permission', id=ID), + # method='put') + # url('permission', id=ID) + + def delete(self, id): + """DELETE /permissions/id: Delete an existing item""" + # Forms posted to this method should contain a hidden field: + # + # Or using helpers: + # h.form(url('permission', id=ID), + # method='delete') + # url('permission', id=ID) + + def show(self, id, format='html'): + """GET /permissions/id: Show a specific item""" + # url('permission', id=ID) + + def edit(self, id, format='html'): + """GET /permissions/id/edit: Form to edit an existing item""" + # url('edit_permission', id=ID) diff -r 46b7d108ea7a -r 8026872a10ee pylons_app/controllers/admin/repos.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pylons_app/controllers/admin/repos.py Wed Jun 30 17:14:47 2010 +0200 @@ -0,0 +1,197 @@ +#!/usr/bin/env python +# encoding: utf-8 +# repos 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 +# of the License or (at your opinion) any later version of the license. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, +# MA 02110-1301, USA. +""" +Created on April 7, 2010 +admin controller for pylons +@author: marcink +""" +from formencode import htmlfill +from operator import itemgetter +from pylons import request, response, session, tmpl_context as c, url +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 invalidate_cache +from pylons_app.model.forms import RepoForm +from pylons_app.model.hg_model import HgModel +from pylons_app.model.repo_model import RepoModel +import formencode +import logging +log = logging.getLogger(__name__) + +class ReposController(BaseController): + """REST Controller styled on the Atom Publishing Protocol""" + # To properly map this controller, ensure your config/routing.py + # file has a resource setup: + # map.resource('repo', 'repos') + + @LoginRequired() + @HasPermissionAllDecorator('hg.admin') + def __before__(self): + c.admin_user = session.get('admin_user') + c.admin_username = session.get('admin_username') + super(ReposController, self).__before__() + + def index(self, format='html'): + """GET /repos: All items in the collection""" + # url('repos') + cached_repo_list = HgModel().get_repos() + c.repos_list = sorted(cached_repo_list, key=itemgetter('name_sort')) + return render('admin/repos/repos.html') + + def create(self): + """POST /repos: Create a new item""" + # url('repos') + repo_model = RepoModel() + _form = RepoForm()() + try: + form_result = _form.to_python(dict(request.POST)) + repo_model.create(form_result, c.hg_app_user) + invalidate_cache('cached_repo_list') + h.flash(_('created repository %s') % form_result['repo_name'], + category='success') + + except formencode.Invalid as errors: + c.form_errors = errors.error_dict + c.new_repo = errors.value['repo_name'] + return htmlfill.render( + render('admin/repos/repo_add.html'), + defaults=errors.value, + encoding="UTF-8") + + except Exception: + h.flash(_('error occured during creation of repository %s') \ + % form_result['repo_name'], category='error') + + return redirect('repos') + + def new(self, format='html'): + """GET /repos/new: Form to create a new item""" + new_repo = request.GET.get('repo', '') + c.new_repo = h.repo_name_slug(new_repo) + + return render('admin/repos/repo_add.html') + + def update(self, repo_name): + """PUT /repos/repo_name: Update an existing item""" + # Forms posted to this method should contain a hidden field: + # + # Or using helpers: + # h.form(url('repo', repo_name=ID), + # method='put') + # url('repo', repo_name=ID) + repo_model = RepoModel() + _form = RepoForm(edit=True)() + try: + form_result = _form.to_python(dict(request.POST)) + repo_model.update(repo_name, form_result) + invalidate_cache('cached_repo_list') + h.flash(_('Repository %s updated succesfully' % repo_name), + category='success') + + except formencode.Invalid as errors: + c.repo_info = repo_model.get(repo_name) + c.users_array = repo_model.get_users_js() + errors.value.update({'user':c.repo_info.user.username}) + c.form_errors = errors.error_dict + return htmlfill.render( + render('admin/repos/repo_edit.html'), + defaults=errors.value, + encoding="UTF-8") + except Exception: + h.flash(_('error occured during update of repository %s') \ + % form_result['repo_name'], category='error') + return redirect(url('repos')) + + def delete(self, repo_name): + """DELETE /repos/repo_name: Delete an existing item""" + # Forms posted to this method should contain a hidden field: + # + # Or using helpers: + # h.form(url('repo', repo_name=ID), + # method='delete') + # url('repo', repo_name=ID) + + repo_model = RepoModel() + repo = repo_model.get(repo_name) + if not repo: + h.flash(_('%s repository is not mapped to db perhaps' + ' it was moved or renamed from the filesystem' + ' please run the application again' + ' in order to rescan repositories') % repo_name, + category='error') + + return redirect(url('repos')) + try: + repo_model.delete(repo) + invalidate_cache('cached_repo_list') + h.flash(_('deleted repository %s') % repo_name, category='success') + except Exception: + h.flash(_('An error occured during deletion of %s') % repo_name, + category='error') + + return redirect(url('repos')) + + def delete_perm_user(self, repo_name): + """ + DELETE an existing repository permission user + @param repo_name: + """ + + try: + repo_model = RepoModel() + repo_model.delete_perm_user(request.POST, repo_name) + except Exception as e: + h.flash(_('An error occured during deletion of repository user'), + category='error') + + + def show(self, repo_name, format='html'): + """GET /repos/repo_name: Show a specific item""" + # url('repo', repo_name=ID) + + def edit(self, repo_name, format='html'): + """GET /repos/repo_name/edit: Form to edit an existing item""" + # url('edit_repo', repo_name=ID) + repo_model = RepoModel() + c.repo_info = repo = repo_model.get(repo_name) + if not repo: + h.flash(_('%s repository is not mapped to db perhaps' + ' it was created or renamed from the filesystem' + ' please run the application again' + ' in order to rescan repositories') % repo_name, + category='error') + + return redirect(url('repos')) + defaults = c.repo_info.__dict__ + defaults.update({'user':c.repo_info.user.username}) + c.users_array = repo_model.get_users_js() + + for p in c.repo_info.repo2perm: + defaults.update({'perm_%s' % p.user.username: + p.permission.permission_name}) + + return htmlfill.render( + render('admin/repos/repo_edit.html'), + defaults=defaults, + encoding="UTF-8", + force_defaults=False + ) diff -r 46b7d108ea7a -r 8026872a10ee pylons_app/controllers/admin/users.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pylons_app/controllers/admin/users.py Wed Jun 30 17:14:47 2010 +0200 @@ -0,0 +1,155 @@ +#!/usr/bin/env python +# encoding: utf-8 +# users 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 +# of the License or (at your opinion) any later version of the license. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, +# MA 02110-1301, USA. +""" +Created on April 4, 2010 +users controller for pylons +@author: marcink +""" +from formencode import htmlfill +from pylons import request, session, tmpl_context as c, url +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.model.user_model import UserModel, DefaultUserException +import formencode +import logging + +log = logging.getLogger(__name__) + +class UsersController(BaseController): + """REST Controller styled on the Atom Publishing Protocol""" + # To properly map this controller, ensure your config/routing.py + # file has a resource setup: + # map.resource('user', 'users') + + @LoginRequired() + @HasPermissionAllDecorator('hg.admin') + def __before__(self): + c.admin_user = session.get('admin_user') + c.admin_username = session.get('admin_username') + super(UsersController, self).__before__() + + + def index(self, format='html'): + """GET /users: All items in the collection""" + # url('users') + + c.users_list = self.sa.query(User).all() + return render('admin/users/users.html') + + def create(self): + """POST /users: Create a new item""" + # url('users') + + user_model = UserModel() + login_form = UserForm()() + try: + form_result = login_form.to_python(dict(request.POST)) + user_model.create(form_result) + h.flash(_('created user %s') % form_result['username'], + category='success') + except formencode.Invalid as errors: + c.form_errors = errors.error_dict + return htmlfill.render( + render('admin/users/user_add.html'), + defaults=errors.value, + encoding="UTF-8") + except Exception: + h.flash(_('error occured during creation of user %s') \ + % form_result['username'], category='error') + return redirect(url('users')) + + def new(self, format='html'): + """GET /users/new: Form to create a new item""" + # url('new_user') + return render('admin/users/user_add.html') + + def update(self, id): + """PUT /users/id: Update an existing item""" + # Forms posted to this method should contain a hidden field: + # + # Or using helpers: + # h.form(url('user', id=ID), + # method='put') + # url('user', id=ID) + user_model = UserModel() + _form = UserForm(edit=True)() + try: + form_result = _form.to_python(dict(request.POST)) + user_model.update(id, form_result) + h.flash(_('User updated succesfully'), category='success') + + except formencode.Invalid as errors: + c.user = user_model.get_user(id) + c.form_errors = errors.error_dict + return htmlfill.render( + render('admin/users/user_edit.html'), + defaults=errors.value, + encoding="UTF-8") + except Exception: + h.flash(_('error occured during update of user %s') \ + % form_result['username'], category='error') + + return redirect(url('users')) + + def delete(self, id): + """DELETE /users/id: Delete an existing item""" + # Forms posted to this method should contain a hidden field: + # + # Or using helpers: + # h.form(url('user', id=ID), + # method='delete') + # url('user', id=ID) + user_model = UserModel() + try: + user_model.delete(id) + h.flash(_('sucessfully deleted user'), category='success') + except DefaultUserException as e: + h.flash(str(e), category='warning') + except Exception: + h.flash(_('An error occured during deletion of user'), + category='error') + return redirect(url('users')) + + def show(self, id, format='html'): + """GET /users/id: Show a specific item""" + # url('user', id=ID) + + + def edit(self, id, format='html'): + """GET /users/id/edit: Form to edit an existing item""" + # url('edit_user', id=ID) + c.user = self.sa.query(User).get(id) + if c.user.username == 'default': + h.flash(_("You can't edit this user since it's" + " crucial for entire application"), category='warning') + return redirect(url('users')) + + defaults = c.user.__dict__ + return htmlfill.render( + render('admin/users/user_edit.html'), + defaults=defaults, + encoding="UTF-8", + force_defaults=False + ) diff -r 46b7d108ea7a -r 8026872a10ee pylons_app/controllers/permissions.py --- a/pylons_app/controllers/permissions.py Wed Jun 30 17:05:20 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,90 +0,0 @@ -#!/usr/bin/env python -# encoding: utf-8 -# permissions 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 -# of the License or (at your opinion) any later version of the license. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -# MA 02110-1301, USA. -""" -Created on April 27, 2010 -permissions controller for pylons -@author: marcink -""" -from formencode import htmlfill -from pylons import request, session, tmpl_context as c, url -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.model.user_model import UserModel -import formencode -import logging - -log = logging.getLogger(__name__) - -class PermissionsController(BaseController): - """REST Controller styled on the Atom Publishing Protocol""" - # To properly map this controller, ensure your config/routing.py - # file has a resource setup: - # map.resource('permission', 'permissions') - - @LoginRequired() - #@HasPermissionAllDecorator('hg.admin') - def __before__(self): - c.admin_user = session.get('admin_user') - c.admin_username = session.get('admin_username') - super(PermissionsController, self).__before__() - - def index(self, format='html'): - """GET /permissions: All items in the collection""" - # url('permissions') - return render('admin/permissions/permissions.html') - - def create(self): - """POST /permissions: Create a new item""" - # url('permissions') - - def new(self, format='html'): - """GET /permissions/new: Form to create a new item""" - # url('new_permission') - - def update(self, id): - """PUT /permissions/id: Update an existing item""" - # Forms posted to this method should contain a hidden field: - # - # Or using helpers: - # h.form(url('permission', id=ID), - # method='put') - # url('permission', id=ID) - - def delete(self, id): - """DELETE /permissions/id: Delete an existing item""" - # Forms posted to this method should contain a hidden field: - # - # Or using helpers: - # h.form(url('permission', id=ID), - # method='delete') - # url('permission', id=ID) - - def show(self, id, format='html'): - """GET /permissions/id: Show a specific item""" - # url('permission', id=ID) - - def edit(self, id, format='html'): - """GET /permissions/id/edit: Form to edit an existing item""" - # url('edit_permission', id=ID) diff -r 46b7d108ea7a -r 8026872a10ee pylons_app/controllers/repos.py --- a/pylons_app/controllers/repos.py Wed Jun 30 17:05:20 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,197 +0,0 @@ -#!/usr/bin/env python -# encoding: utf-8 -# repos 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 -# of the License or (at your opinion) any later version of the license. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -# MA 02110-1301, USA. -""" -Created on April 7, 2010 -admin controller for pylons -@author: marcink -""" -from formencode import htmlfill -from operator import itemgetter -from pylons import request, response, session, tmpl_context as c, url -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 invalidate_cache -from pylons_app.model.forms import RepoForm -from pylons_app.model.hg_model import HgModel -from pylons_app.model.repo_model import RepoModel -import formencode -import logging -log = logging.getLogger(__name__) - -class ReposController(BaseController): - """REST Controller styled on the Atom Publishing Protocol""" - # To properly map this controller, ensure your config/routing.py - # file has a resource setup: - # map.resource('repo', 'repos') - - @LoginRequired() - @HasPermissionAllDecorator('hg.admin') - def __before__(self): - c.admin_user = session.get('admin_user') - c.admin_username = session.get('admin_username') - super(ReposController, self).__before__() - - def index(self, format='html'): - """GET /repos: All items in the collection""" - # url('repos') - cached_repo_list = HgModel().get_repos() - c.repos_list = sorted(cached_repo_list, key=itemgetter('name_sort')) - return render('admin/repos/repos.html') - - def create(self): - """POST /repos: Create a new item""" - # url('repos') - repo_model = RepoModel() - _form = RepoForm()() - try: - form_result = _form.to_python(dict(request.POST)) - repo_model.create(form_result, c.hg_app_user) - invalidate_cache('cached_repo_list') - h.flash(_('created repository %s') % form_result['repo_name'], - category='success') - - except formencode.Invalid as errors: - c.form_errors = errors.error_dict - c.new_repo = errors.value['repo_name'] - return htmlfill.render( - render('admin/repos/repo_add.html'), - defaults=errors.value, - encoding="UTF-8") - - except Exception: - h.flash(_('error occured during creation of repository %s') \ - % form_result['repo_name'], category='error') - - return redirect('repos') - - def new(self, format='html'): - """GET /repos/new: Form to create a new item""" - new_repo = request.GET.get('repo', '') - c.new_repo = h.repo_name_slug(new_repo) - - return render('admin/repos/repo_add.html') - - def update(self, repo_name): - """PUT /repos/repo_name: Update an existing item""" - # Forms posted to this method should contain a hidden field: - # - # Or using helpers: - # h.form(url('repo', repo_name=ID), - # method='put') - # url('repo', repo_name=ID) - repo_model = RepoModel() - _form = RepoForm(edit=True)() - try: - form_result = _form.to_python(dict(request.POST)) - repo_model.update(repo_name, form_result) - invalidate_cache('cached_repo_list') - h.flash(_('Repository %s updated succesfully' % repo_name), - category='success') - - except formencode.Invalid as errors: - c.repo_info = repo_model.get(repo_name) - c.users_array = repo_model.get_users_js() - errors.value.update({'user':c.repo_info.user.username}) - c.form_errors = errors.error_dict - return htmlfill.render( - render('admin/repos/repo_edit.html'), - defaults=errors.value, - encoding="UTF-8") - except Exception: - h.flash(_('error occured during update of repository %s') \ - % form_result['repo_name'], category='error') - return redirect(url('repos')) - - def delete(self, repo_name): - """DELETE /repos/repo_name: Delete an existing item""" - # Forms posted to this method should contain a hidden field: - # - # Or using helpers: - # h.form(url('repo', repo_name=ID), - # method='delete') - # url('repo', repo_name=ID) - - repo_model = RepoModel() - repo = repo_model.get(repo_name) - if not repo: - h.flash(_('%s repository is not mapped to db perhaps' - ' it was moved or renamed from the filesystem' - ' please run the application again' - ' in order to rescan repositories') % repo_name, - category='error') - - return redirect(url('repos')) - try: - repo_model.delete(repo) - invalidate_cache('cached_repo_list') - h.flash(_('deleted repository %s') % repo_name, category='success') - except Exception: - h.flash(_('An error occured during deletion of %s') % repo_name, - category='error') - - return redirect(url('repos')) - - def delete_perm_user(self, repo_name): - """ - DELETE an existing repository permission user - @param repo_name: - """ - - try: - repo_model = RepoModel() - repo_model.delete_perm_user(request.POST, repo_name) - except Exception as e: - h.flash(_('An error occured during deletion of repository user'), - category='error') - - - def show(self, repo_name, format='html'): - """GET /repos/repo_name: Show a specific item""" - # url('repo', repo_name=ID) - - def edit(self, repo_name, format='html'): - """GET /repos/repo_name/edit: Form to edit an existing item""" - # url('edit_repo', repo_name=ID) - repo_model = RepoModel() - c.repo_info = repo = repo_model.get(repo_name) - if not repo: - h.flash(_('%s repository is not mapped to db perhaps' - ' it was created or renamed from the filesystem' - ' please run the application again' - ' in order to rescan repositories') % repo_name, - category='error') - - return redirect(url('repos')) - defaults = c.repo_info.__dict__ - defaults.update({'user':c.repo_info.user.username}) - c.users_array = repo_model.get_users_js() - - for p in c.repo_info.repo2perm: - defaults.update({'perm_%s' % p.user.username: - p.permission.permission_name}) - - return htmlfill.render( - render('admin/repos/repo_edit.html'), - defaults=defaults, - encoding="UTF-8", - force_defaults=False - ) diff -r 46b7d108ea7a -r 8026872a10ee pylons_app/controllers/users.py --- a/pylons_app/controllers/users.py Wed Jun 30 17:05:20 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,155 +0,0 @@ -#!/usr/bin/env python -# encoding: utf-8 -# users 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 -# of the License or (at your opinion) any later version of the license. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -# MA 02110-1301, USA. -""" -Created on April 4, 2010 -users controller for pylons -@author: marcink -""" -from formencode import htmlfill -from pylons import request, session, tmpl_context as c, url -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.model.user_model import UserModel, DefaultUserException -import formencode -import logging - -log = logging.getLogger(__name__) - -class UsersController(BaseController): - """REST Controller styled on the Atom Publishing Protocol""" - # To properly map this controller, ensure your config/routing.py - # file has a resource setup: - # map.resource('user', 'users') - - @LoginRequired() - @HasPermissionAllDecorator('hg.admin') - def __before__(self): - c.admin_user = session.get('admin_user') - c.admin_username = session.get('admin_username') - super(UsersController, self).__before__() - - - def index(self, format='html'): - """GET /users: All items in the collection""" - # url('users') - - c.users_list = self.sa.query(User).all() - return render('admin/users/users.html') - - def create(self): - """POST /users: Create a new item""" - # url('users') - - user_model = UserModel() - login_form = UserForm()() - try: - form_result = login_form.to_python(dict(request.POST)) - user_model.create(form_result) - h.flash(_('created user %s') % form_result['username'], - category='success') - except formencode.Invalid as errors: - c.form_errors = errors.error_dict - return htmlfill.render( - render('admin/users/user_add.html'), - defaults=errors.value, - encoding="UTF-8") - except Exception: - h.flash(_('error occured during creation of user %s') \ - % form_result['username'], category='error') - return redirect(url('users')) - - def new(self, format='html'): - """GET /users/new: Form to create a new item""" - # url('new_user') - return render('admin/users/user_add.html') - - def update(self, id): - """PUT /users/id: Update an existing item""" - # Forms posted to this method should contain a hidden field: - # - # Or using helpers: - # h.form(url('user', id=ID), - # method='put') - # url('user', id=ID) - user_model = UserModel() - _form = UserForm(edit=True)() - try: - form_result = _form.to_python(dict(request.POST)) - user_model.update(id, form_result) - h.flash(_('User updated succesfully'), category='success') - - except formencode.Invalid as errors: - c.user = user_model.get_user(id) - c.form_errors = errors.error_dict - return htmlfill.render( - render('admin/users/user_edit.html'), - defaults=errors.value, - encoding="UTF-8") - except Exception: - h.flash(_('error occured during update of user %s') \ - % form_result['username'], category='error') - - return redirect(url('users')) - - def delete(self, id): - """DELETE /users/id: Delete an existing item""" - # Forms posted to this method should contain a hidden field: - # - # Or using helpers: - # h.form(url('user', id=ID), - # method='delete') - # url('user', id=ID) - user_model = UserModel() - try: - user_model.delete(id) - h.flash(_('sucessfully deleted user'), category='success') - except DefaultUserException as e: - h.flash(str(e), category='warning') - except Exception: - h.flash(_('An error occured during deletion of user'), - category='error') - return redirect(url('users')) - - def show(self, id, format='html'): - """GET /users/id: Show a specific item""" - # url('user', id=ID) - - - def edit(self, id, format='html'): - """GET /users/id/edit: Form to edit an existing item""" - # url('edit_user', id=ID) - c.user = self.sa.query(User).get(id) - if c.user.username == 'default': - h.flash(_("You can't edit this user since it's" - " crucial for entire application"), category='warning') - return redirect(url('users')) - - defaults = c.user.__dict__ - return htmlfill.render( - render('admin/users/user_edit.html'), - defaults=defaults, - encoding="UTF-8", - force_defaults=False - )