##// END OF EJS Templates
codingstyle: trivial whitespace fixes...
codingstyle: trivial whitespace fixes Reported by flake8.

File last commit:

r6789:76912908 default
r6789:76912908 default
Show More
users.py
436 lines | 16.7 KiB | text/x-python | PythonLexer
Bradley M. Kuhn
Second step in two-part process to rename directories....
r4187 # -*- coding: utf-8 -*-
# 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, either version 3 of the License, or
# (at your option) any later version.
#
# 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, see <http://www.gnu.org/licenses/>.
"""
kallithea.controllers.admin.users
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Thomas De Schampheleire
Turbogears2 migration: remove some references to Pylons in comments...
r6178 Users crud controller
Bradley M. Kuhn
Second step in two-part process to rename directories....
r4187
Bradley M. Kuhn
RhodeCode GmbH is not the sole author of this work
r4211 This file was forked by the Kallithea project in July 2014.
Original author and date, and relevant copyright and licensing information is below:
Bradley M. Kuhn
Second step in two-part process to rename directories....
r4187 :created_on: Apr 4, 2010
:author: marcink
Bradley M. Kuhn
RhodeCode GmbH is not the sole author of this work
r4211 :copyright: (c) 2013 RhodeCode GmbH, and others.
Bradley M. Kuhn
Correct licensing information in individual files....
r4208 :license: GPLv3, see LICENSE.md for more details.
Bradley M. Kuhn
Second step in two-part process to rename directories....
r4187 """
import logging
import traceback
import formencode
from formencode import htmlfill
Alessandro Molina
backend: replace Pylons with TurboGears2...
r6522 from tg import request, tmpl_context as c, config, app_globals
Mads Kiilerich
tg: minimize future diff by some mocking and replacing some pylons imports with tg...
r6508 from tg.i18n import ugettext as _
Bradley M. Kuhn
Second step in two-part process to rename directories....
r4187 from sqlalchemy.sql.expression import func
Søren Løvborg
cleanup: replace redirect with WebOb exceptions...
r5543 from webob.exc import HTTPFound, HTTPNotFound
Bradley M. Kuhn
Second step in two-part process to rename directories....
r4187
import kallithea
Thomas De Schampheleire
Turbogears2 migration: replace pylons.url by kallithea.config.routing.url...
r6182 from kallithea.config.routing import url
Bradley M. Kuhn
Second step in two-part process to rename directories....
r4187 from kallithea.lib.exceptions import DefaultUserException, \
UserOwnsReposException, UserCreationError
from kallithea.lib import helpers as h
Søren Løvborg
auth: remove HasPermissionAll and variants...
r6026 from kallithea.lib.auth import LoginRequired, HasPermissionAnyDecorator, \
Andrew Shadura
auth: reduce code duplication by removing generate_api_key implemented in utils2
r5215 AuthUser
Bradley M. Kuhn
Second step in two-part process to rename directories....
r4187 from kallithea.lib import auth_modules
from kallithea.lib.base import BaseController, render
from kallithea.model.api_key import ApiKeyModel
from kallithea.model.db import User, UserEmailMap, UserIpMap, UserToPerm
from kallithea.model.forms import UserForm, CustomDefaultPermissionsForm
from kallithea.model.user import UserModel
from kallithea.model.meta import Session
from kallithea.lib.utils import action_logger
Andrew Shadura
auth: reduce code duplication by removing generate_api_key implemented in utils2
r5215 from kallithea.lib.utils2 import datetime_to_time, safe_int, generate_api_key
Bradley M. Kuhn
Second step in two-part process to rename directories....
r4187
log = logging.getLogger(__name__)
class UsersController(BaseController):
"""REST Controller styled on the Atom Publishing Protocol"""
@LoginRequired()
Søren Løvborg
auth: remove HasPermissionAll and variants...
r6026 @HasPermissionAnyDecorator('hg.admin')
Thomas De Schampheleire
controllers: rename __before__ to _before in preparation of TurboGears2...
r6513 def _before(self, *args, **kwargs):
super(UsersController, self)._before(*args, **kwargs)
Bradley M. Kuhn
Second step in two-part process to rename directories....
r4187 c.available_permissions = config['available_permissions']
def index(self, format='html'):
Mads Kiilerich
cleanup: consistent space before line continuation backslash
r5585 c.users_list = User.query().order_by(User.username) \
Søren Løvborg
cleanup: refer less to User.DEFAULT_USER...
r6476 .filter_by(is_default_user=False) \
Mads Kiilerich
cleanup: consistent space before line continuation backslash
r5585 .order_by(func.lower(User.username)) \
Bradley M. Kuhn
Second step in two-part process to rename directories....
r4187 .all()
users_data = []
total_records = len(c.users_list)
Alessandro Molina
backend: replace Pylons with TurboGears2...
r6522 _tmpl_lookup = app_globals.mako_lookup
Bradley M. Kuhn
Second step in two-part process to rename directories....
r4187 template = _tmpl_lookup.get_template('data_table/_dt_elements.html')
Sean Farley
users: use gravatar method from helpers instead of user_gravatar...
r4797 grav_tmpl = '<div class="gravatar">%s</div>'
Bradley M. Kuhn
Second step in two-part process to rename directories....
r4187
username = lambda user_id, username: (
template.get_def("user_name")
.render(user_id, username, _=_, h=h, c=c))
user_actions = lambda user_id, username: (
template.get_def("user_actions")
.render(user_id, username, _=_, h=h, c=c))
for user in c.users_list:
users_data.append({
Sean Farley
users: use gravatar method from helpers instead of user_gravatar...
r4797 "gravatar": grav_tmpl % h.gravatar(user.email, size=20),
Bradley M. Kuhn
Second step in two-part process to rename directories....
r4187 "raw_name": user.username,
"username": username(user.user_id, user.username),
Nick High
security: Fix HTML and JavaScript injection....
r5008 "firstname": h.escape(user.name),
"lastname": h.escape(user.lastname),
Bradley M. Kuhn
Second step in two-part process to rename directories....
r4187 "last_login": h.fmt_date(user.last_login),
"last_login_raw": datetime_to_time(user.last_login),
"active": h.boolicon(user.active),
"admin": h.boolicon(user.admin),
"extern_type": user.extern_type,
"extern_name": user.extern_name,
"action": user_actions(user.user_id, user.username),
})
Søren Løvborg
templates: properly escape inline JavaScript values...
r6492 c.data = {
Bradley M. Kuhn
Second step in two-part process to rename directories....
r4187 "totalRecords": total_records,
"startIndex": 0,
"sort": None,
"dir": "asc",
"records": users_data
Søren Løvborg
templates: properly escape inline JavaScript values...
r6492 }
Bradley M. Kuhn
Second step in two-part process to rename directories....
r4187
return render('admin/users/users.html')
def create(self):
Mads Kiilerich
auth: cleanup of EXTERN_TYPE_INTERNAL...
r6168 c.default_extern_type = User.DEFAULT_AUTH_TYPE
c.default_extern_name = ''
Bradley M. Kuhn
Second step in two-part process to rename directories....
r4187 user_model = UserModel()
user_form = UserForm()()
try:
form_result = user_form.to_python(dict(request.POST))
Mads Kiilerich
admin: show links to created users and groups
r4708 user = user_model.create(form_result)
Mads Kiilerich
controllers: avoid setting request state in controller instances - set it in the thread global request variable...
r6412 action_logger(request.authuser, 'admin_created_user:%s' % user.username,
Søren Løvborg
cleanup: remove SQLAlchemy session argument to action_logger...
r6480 None, request.ip_addr)
Mads Kiilerich
admin: don't redirect back to the list of users after creating a user...
r6118 h.flash(_('Created user %s') % user.username,
Bradley M. Kuhn
Second step in two-part process to rename directories....
r4187 category='success')
Session().commit()
Mads Kiilerich
cleanup: consistently use 'except ... as ...:'...
r5374 except formencode.Invalid as errors:
Bradley M. Kuhn
Second step in two-part process to rename directories....
r4187 return htmlfill.render(
render('admin/users/user_add.html'),
defaults=errors.value,
errors=errors.error_dict or {},
prefix_error=False,
Mads Kiilerich
controllers: consistently use formfill.render with force_defaults=False...
r4941 encoding="UTF-8",
force_defaults=False)
Mads Kiilerich
cleanup: consistently use 'except ... as ...:'...
r5374 except UserCreationError as e:
Bradley M. Kuhn
Second step in two-part process to rename directories....
r4187 h.flash(e, 'error')
except Exception:
log.error(traceback.format_exc())
Lars Kruse
codingstyle: trivial whitespace fixes...
r6789 h.flash(_('Error occurred during creation of user %s')
Bradley M. Kuhn
Second step in two-part process to rename directories....
r4187 % request.POST.get('username'), category='error')
Mads Kiilerich
admin: don't redirect back to the list of users after creating a user...
r6118 raise HTTPFound(location=url('edit_user', id=user.user_id))
Bradley M. Kuhn
Second step in two-part process to rename directories....
r4187
def new(self, format='html'):
Mads Kiilerich
auth: cleanup of EXTERN_TYPE_INTERNAL...
r6168 c.default_extern_type = User.DEFAULT_AUTH_TYPE
c.default_extern_name = ''
Bradley M. Kuhn
Second step in two-part process to rename directories....
r4187 return render('admin/users/user_add.html')
def update(self, id):
user_model = UserModel()
Søren Løvborg
users: fix missing c.readonly in UsersController.update error rendering...
r5430 user = user_model.get(id)
Bradley M. Kuhn
Second step in two-part process to rename directories....
r4187 _form = UserForm(edit=True, old_data={'user_id': id,
Søren Løvborg
users: fix missing c.readonly in UsersController.update error rendering...
r5430 'email': user.email})()
Bradley M. Kuhn
Second step in two-part process to rename directories....
r4187 form_result = {}
try:
form_result = _form.to_python(dict(request.POST))
Mads Kiilerich
auth: make the auth module decide which fields are editable by admin and user
r5343 skip_attrs = ['extern_type', 'extern_name',
Søren Løvborg
users: fix missing c.readonly in UsersController.update error rendering...
r5430 ] + auth_modules.get_managed_fields(user)
Bradley M. Kuhn
Second step in two-part process to rename directories....
r4187
user_model.update(id, form_result, skip_attrs=skip_attrs)
usr = form_result['username']
Mads Kiilerich
controllers: avoid setting request state in controller instances - set it in the thread global request variable...
r6412 action_logger(request.authuser, 'admin_updated_user:%s' % usr,
Søren Løvborg
cleanup: remove SQLAlchemy session argument to action_logger...
r6480 None, request.ip_addr)
Bradley M. Kuhn
Second step in two-part process to rename directories....
r4187 h.flash(_('User updated successfully'), category='success')
Session().commit()
Mads Kiilerich
cleanup: consistently use 'except ... as ...:'...
r5374 except formencode.Invalid as errors:
Bradley M. Kuhn
Second step in two-part process to rename directories....
r4187 defaults = errors.value
e = errors.error_dict or {}
defaults.update({
'create_repo_perm': user_model.has_perm(id,
'hg.create.repository'),
'fork_repo_perm': user_model.has_perm(id, 'hg.fork.repository'),
})
return htmlfill.render(
Søren Løvborg
users: fix missing c.readonly in UsersController.update error rendering...
r5430 self._render_edit_profile(user),
Bradley M. Kuhn
Second step in two-part process to rename directories....
r4187 defaults=defaults,
errors=e,
prefix_error=False,
Mads Kiilerich
controllers: consistently use formfill.render with force_defaults=False...
r4941 encoding="UTF-8",
force_defaults=False)
Bradley M. Kuhn
Second step in two-part process to rename directories....
r4187 except Exception:
log.error(traceback.format_exc())
Lars Kruse
codingstyle: trivial whitespace fixes...
r6789 h.flash(_('Error occurred during update of user %s')
Bradley M. Kuhn
Second step in two-part process to rename directories....
r4187 % form_result.get('username'), category='error')
Søren Løvborg
cleanup: replace redirect with WebOb exceptions...
r5543 raise HTTPFound(location=url('edit_user', id=id))
Bradley M. Kuhn
Second step in two-part process to rename directories....
r4187
def delete(self, id):
usr = User.get_or_404(id)
try:
UserModel().delete(usr)
Session().commit()
h.flash(_('Successfully deleted user'), category='success')
Mads Kiilerich
cleanup: consistently use 'except ... as ...:'...
r5374 except (UserOwnsReposException, DefaultUserException) as e:
Bradley M. Kuhn
Second step in two-part process to rename directories....
r4187 h.flash(e, category='warning')
except Exception:
log.error(traceback.format_exc())
h.flash(_('An error occurred during deletion of user'),
category='error')
Søren Løvborg
cleanup: replace redirect with WebOb exceptions...
r5543 raise HTTPFound(location=url('users'))
Bradley M. Kuhn
Second step in two-part process to rename directories....
r4187
Thomas De Schampheleire
admin: users: factorize check for default user...
r5167 def _get_user_or_raise_if_default(self, id):
try:
return User.get_or_404(id, allow_default=False)
except DefaultUserException:
h.flash(_("The default user cannot be edited"), category='warning')
raise HTTPNotFound
Søren Løvborg
users: fix missing c.readonly in UsersController.update error rendering...
r5430 def _render_edit_profile(self, user):
c.user = user
c.active = 'profile'
c.perm_user = AuthUser(dbuser=user)
managed_fields = auth_modules.get_managed_fields(user)
c.readonly = lambda n: 'readonly' if n in managed_fields else None
return render('admin/users/user_edit.html')
Bradley M. Kuhn
Second step in two-part process to rename directories....
r4187 def edit(self, id, format='html'):
Søren Løvborg
users: fix missing c.readonly in UsersController.update error rendering...
r5430 user = self._get_user_or_raise_if_default(id)
defaults = user.get_dict()
Bradley M. Kuhn
Second step in two-part process to rename directories....
r4187
return htmlfill.render(
Søren Løvborg
users: fix missing c.readonly in UsersController.update error rendering...
r5430 self._render_edit_profile(user),
Bradley M. Kuhn
Second step in two-part process to rename directories....
r4187 defaults=defaults,
encoding="UTF-8",
force_defaults=False)
def edit_advanced(self, id):
Thomas De Schampheleire
admin: users: factorize check for default user...
r5167 c.user = self._get_user_or_raise_if_default(id)
Bradley M. Kuhn
Second step in two-part process to rename directories....
r4187 c.active = 'advanced'
Søren Løvborg
cleanup: remove redundant database loads...
r6196 c.perm_user = AuthUser(dbuser=c.user)
Bradley M. Kuhn
Second step in two-part process to rename directories....
r4187
umodel = UserModel()
defaults = c.user.get_dict()
defaults.update({
'create_repo_perm': umodel.has_perm(c.user, 'hg.create.repository'),
'create_user_group_perm': umodel.has_perm(c.user,
'hg.usergroup.create.true'),
'fork_repo_perm': umodel.has_perm(c.user, 'hg.fork.repository'),
})
return htmlfill.render(
render('admin/users/user_edit.html'),
defaults=defaults,
encoding="UTF-8",
force_defaults=False)
def edit_api_keys(self, id):
Thomas De Schampheleire
admin: users: factorize check for default user...
r5167 c.user = self._get_user_or_raise_if_default(id)
Bradley M. Kuhn
Second step in two-part process to rename directories....
r4187 c.active = 'api_keys'
show_expired = True
c.lifetime_values = [
Mads Kiilerich
spelling: fix title casing on various translated strings...
r5127 (str(-1), _('Forever')),
Bradley M. Kuhn
Second step in two-part process to rename directories....
r4187 (str(5), _('5 minutes')),
(str(60), _('1 hour')),
(str(60 * 24), _('1 day')),
(str(60 * 24 * 30), _('1 month')),
]
c.lifetime_options = [(c.lifetime_values, _("Lifetime"))]
c.user_api_keys = ApiKeyModel().get_api_keys(c.user.user_id,
show_expired=show_expired)
defaults = c.user.get_dict()
return htmlfill.render(
render('admin/users/user_edit.html'),
defaults=defaults,
encoding="UTF-8",
force_defaults=False)
def add_api_key(self, id):
Thomas De Schampheleire
admin: users: factorize check for default user...
r5167 c.user = self._get_user_or_raise_if_default(id)
Bradley M. Kuhn
Second step in two-part process to rename directories....
r4187
lifetime = safe_int(request.POST.get('lifetime'), -1)
description = request.POST.get('description')
Mads Kiilerich
cleanup: remove unused variables, found with pyflakes
r4423 ApiKeyModel().create(c.user.user_id, description, lifetime)
Bradley M. Kuhn
Second step in two-part process to rename directories....
r4187 Session().commit()
Mads Kiilerich
spelling: more consistent casing of 'API key'
r5124 h.flash(_("API key successfully created"), category='success')
Søren Løvborg
cleanup: replace redirect with WebOb exceptions...
r5543 raise HTTPFound(location=url('edit_user_api_keys', id=c.user.user_id))
Bradley M. Kuhn
Second step in two-part process to rename directories....
r4187
def delete_api_key(self, id):
Thomas De Schampheleire
admin: users: factorize check for default user...
r5167 c.user = self._get_user_or_raise_if_default(id)
Bradley M. Kuhn
Second step in two-part process to rename directories....
r4187
api_key = request.POST.get('del_api_key')
if request.POST.get('del_api_key_builtin'):
Søren Løvborg
cleanup: remove redundant database loads...
r6196 c.user.api_key = generate_api_key()
Session().commit()
h.flash(_("API key successfully reset"), category='success')
Bradley M. Kuhn
Second step in two-part process to rename directories....
r4187 elif api_key:
ApiKeyModel().delete(api_key, c.user.user_id)
Session().commit()
Mads Kiilerich
spelling: more consistent casing of 'API key'
r5124 h.flash(_("API key successfully deleted"), category='success')
Bradley M. Kuhn
Second step in two-part process to rename directories....
r4187
Søren Løvborg
cleanup: replace redirect with WebOb exceptions...
r5543 raise HTTPFound(location=url('edit_user_api_keys', id=c.user.user_id))
Bradley M. Kuhn
Second step in two-part process to rename directories....
r4187
def update_account(self, id):
pass
def edit_perms(self, id):
Thomas De Schampheleire
admin: users: factorize check for default user...
r5167 c.user = self._get_user_or_raise_if_default(id)
Bradley M. Kuhn
Second step in two-part process to rename directories....
r4187 c.active = 'perms'
Søren Løvborg
cleanup: remove redundant database loads...
r6196 c.perm_user = AuthUser(dbuser=c.user)
Bradley M. Kuhn
Second step in two-part process to rename directories....
r4187
umodel = UserModel()
defaults = c.user.get_dict()
defaults.update({
'create_repo_perm': umodel.has_perm(c.user, 'hg.create.repository'),
'create_user_group_perm': umodel.has_perm(c.user,
'hg.usergroup.create.true'),
'fork_repo_perm': umodel.has_perm(c.user, 'hg.fork.repository'),
})
return htmlfill.render(
render('admin/users/user_edit.html'),
defaults=defaults,
encoding="UTF-8",
force_defaults=False)
def update_perms(self, id):
Thomas De Schampheleire
users: add extra checks on editing the default user...
r5168 user = self._get_user_or_raise_if_default(id)
Bradley M. Kuhn
Second step in two-part process to rename directories....
r4187
try:
form = CustomDefaultPermissionsForm()()
form_result = form.to_python(request.POST)
inherit_perms = form_result['inherit_default_permissions']
user.inherit_default_permissions = inherit_perms
user_model = UserModel()
Mads Kiilerich
cleanup: consistent space before line continuation backslash
r5585 defs = UserToPerm.query() \
.filter(UserToPerm.user == user) \
Bradley M. Kuhn
Second step in two-part process to rename directories....
r4187 .all()
for ug in defs:
Session().delete(ug)
if form_result['create_repo_perm']:
user_model.grant_perm(id, 'hg.create.repository')
else:
user_model.grant_perm(id, 'hg.create.none')
if form_result['create_user_group_perm']:
user_model.grant_perm(id, 'hg.usergroup.create.true')
else:
user_model.grant_perm(id, 'hg.usergroup.create.false')
if form_result['fork_repo_perm']:
user_model.grant_perm(id, 'hg.fork.repository')
else:
user_model.grant_perm(id, 'hg.fork.none')
h.flash(_("Updated permissions"), category='success')
Session().commit()
except Exception:
log.error(traceback.format_exc())
h.flash(_('An error occurred during permissions saving'),
category='error')
Søren Løvborg
cleanup: replace redirect with WebOb exceptions...
r5543 raise HTTPFound(location=url('edit_user_perms', id=id))
Bradley M. Kuhn
Second step in two-part process to rename directories....
r4187
def edit_emails(self, id):
Thomas De Schampheleire
admin: users: factorize check for default user...
r5167 c.user = self._get_user_or_raise_if_default(id)
Bradley M. Kuhn
Second step in two-part process to rename directories....
r4187 c.active = 'emails'
Mads Kiilerich
cleanup: consistent space before line continuation backslash
r5585 c.user_email_map = UserEmailMap.query() \
Bradley M. Kuhn
Second step in two-part process to rename directories....
r4187 .filter(UserEmailMap.user == c.user).all()
defaults = c.user.get_dict()
return htmlfill.render(
render('admin/users/user_edit.html'),
defaults=defaults,
encoding="UTF-8",
force_defaults=False)
def add_email(self, id):
Thomas De Schampheleire
users: add extra checks on editing the default user...
r5168 user = self._get_user_or_raise_if_default(id)
Bradley M. Kuhn
Second step in two-part process to rename directories....
r4187 email = request.POST.get('new_email')
user_model = UserModel()
try:
user_model.add_extra_email(id, email)
Session().commit()
h.flash(_("Added email %s to user") % email, category='success')
Mads Kiilerich
cleanup: consistently use 'except ... as ...:'...
r5374 except formencode.Invalid as error:
Bradley M. Kuhn
Second step in two-part process to rename directories....
r4187 msg = error.error_dict['email']
h.flash(msg, category='error')
except Exception:
log.error(traceback.format_exc())
h.flash(_('An error occurred during email saving'),
category='error')
Søren Løvborg
cleanup: replace redirect with WebOb exceptions...
r5543 raise HTTPFound(location=url('edit_user_emails', id=id))
Bradley M. Kuhn
Second step in two-part process to rename directories....
r4187
def delete_email(self, id):
Thomas De Schampheleire
users: add extra checks on editing the default user...
r5168 user = self._get_user_or_raise_if_default(id)
Bradley M. Kuhn
Second step in two-part process to rename directories....
r4187 email_id = request.POST.get('del_email_id')
user_model = UserModel()
user_model.delete_extra_email(id, email_id)
Session().commit()
h.flash(_("Removed email from user"), category='success')
Søren Løvborg
cleanup: replace redirect with WebOb exceptions...
r5543 raise HTTPFound(location=url('edit_user_emails', id=id))
Bradley M. Kuhn
Second step in two-part process to rename directories....
r4187
def edit_ips(self, id):
Thomas De Schampheleire
admin: users: factorize check for default user...
r5167 c.user = self._get_user_or_raise_if_default(id)
Bradley M. Kuhn
Second step in two-part process to rename directories....
r4187 c.active = 'ips'
Mads Kiilerich
cleanup: consistent space before line continuation backslash
r5585 c.user_ip_map = UserIpMap.query() \
Bradley M. Kuhn
Second step in two-part process to rename directories....
r4187 .filter(UserIpMap.user == c.user).all()
c.inherit_default_ips = c.user.inherit_default_permissions
Mads Kiilerich
cleanup: consistent space before line continuation backslash
r5585 c.default_user_ip_map = UserIpMap.query() \
Bradley M. Kuhn
Second step in two-part process to rename directories....
r4187 .filter(UserIpMap.user == User.get_default_user()).all()
defaults = c.user.get_dict()
return htmlfill.render(
render('admin/users/user_edit.html'),
defaults=defaults,
encoding="UTF-8",
force_defaults=False)
def add_ip(self, id):
ip = request.POST.get('new_ip')
user_model = UserModel()
try:
user_model.add_extra_ip(id, ip)
Session().commit()
Andrew Shadura
spelling: IP address, IPv4, IPv6
r5150 h.flash(_("Added IP address %s to user whitelist") % ip, category='success')
Mads Kiilerich
cleanup: consistently use 'except ... as ...:'...
r5374 except formencode.Invalid as error:
Bradley M. Kuhn
Second step in two-part process to rename directories....
r4187 msg = error.error_dict['ip']
h.flash(msg, category='error')
except Exception:
log.error(traceback.format_exc())
Andrew Shadura
i18n: translation fix-ups
r5371 h.flash(_('An error occurred while adding IP address'),
Bradley M. Kuhn
Second step in two-part process to rename directories....
r4187 category='error')
if 'default_user' in request.POST:
Søren Løvborg
cleanup: replace redirect with WebOb exceptions...
r5543 raise HTTPFound(location=url('admin_permissions_ips'))
raise HTTPFound(location=url('edit_user_ips', id=id))
Bradley M. Kuhn
Second step in two-part process to rename directories....
r4187
def delete_ip(self, id):
ip_id = request.POST.get('del_ip_id')
user_model = UserModel()
user_model.delete_extra_ip(id, ip_id)
Session().commit()
Mads Kiilerich
spelling: more consistent casing of 'IP'
r5125 h.flash(_("Removed IP address from user whitelist"), category='success')
Bradley M. Kuhn
Second step in two-part process to rename directories....
r4187
if 'default_user' in request.POST:
Søren Løvborg
cleanup: replace redirect with WebOb exceptions...
r5543 raise HTTPFound(location=url('admin_permissions_ips'))
raise HTTPFound(location=url('edit_user_ips', id=id))