Admin - Edit User
Function for admin user to edit user info.
This commit is contained in:
parent
0b720b9cc0
commit
2e5bf79a8e
@ -6,7 +6,7 @@ from flask_moment import Moment
|
||||
from flask_sqlalchemy import SQLAlchemy
|
||||
from flask_login import LoginManager
|
||||
from flask_debugtoolbar import DebugToolbarExtension
|
||||
from flask.ext.principal import Principal
|
||||
from flask_principal import Principal
|
||||
|
||||
from config import config
|
||||
|
||||
|
@ -1,5 +1,31 @@
|
||||
from flask_wtf import Form
|
||||
from flask import flash
|
||||
from wtforms import StringField, PasswordField, BooleanField, SubmitField, ValidationError
|
||||
from wtforms import StringField, PasswordField, BooleanField, SubmitField, \
|
||||
ValidationError, SelectField
|
||||
from wtforms.validators import Required, Length, Email, Regexp, EqualTo
|
||||
from ..models import User
|
||||
from ..models import User, Role
|
||||
|
||||
class EditProfileAdminForm(Form):
|
||||
email = StringField('Email', validators=[Required(), Length(1, 128),
|
||||
Email()])
|
||||
username = StringField('Username', validators=[
|
||||
Required(), Length(1, 64), Regexp('^[A-Za-z][A-Za-z0-9_.]*$', 0,
|
||||
'Usernames must have only letters, '
|
||||
'numbers, dots or underscores')])
|
||||
full_name = StringField('Full name', validators=[Required(), Length(1, 255)])
|
||||
role_id = SelectField('Role', coerce=int)
|
||||
confirmed = BooleanField('Confirmed')
|
||||
|
||||
def __init__(self, user, *args, **kwargs):
|
||||
super(EditProfileAdminForm, self).__init__(*args, **kwargs)
|
||||
self.role_id.choices = [(role.id, role.name)
|
||||
for role in Role.query.order_by(Role.name).all()]
|
||||
self.user = user
|
||||
|
||||
def validate_email(self, field):
|
||||
if User.query.filter_by(email=field.data).first():
|
||||
raise ValidationError('Email already registered.')
|
||||
|
||||
def validate_username(self, field):
|
||||
if User.query.filter_by(username=field.data).first():
|
||||
raise ValidationError('Username already in use.')
|
@ -8,9 +8,10 @@ from flask_principal import Identity, AnonymousIdentity, \
|
||||
|
||||
from . import admin
|
||||
from .. import db
|
||||
from ..models import User
|
||||
from ..models import User, Role
|
||||
from ..email import send_email
|
||||
from ..decorators import requires_roles
|
||||
from .forms import EditProfileAdminForm
|
||||
|
||||
@admin.route('/')
|
||||
@login_required
|
||||
@ -23,4 +24,25 @@ def index():
|
||||
@requires_roles("admin")
|
||||
def list_users():
|
||||
users = User.query.all()
|
||||
return render_template('admin/list_users.html', users=users)
|
||||
return render_template('admin/list_users.html', users=users,
|
||||
title="List Users",
|
||||
block_description = "list, edit and delete users")
|
||||
|
||||
@admin.route('/edit-user/<int:id>', methods=['GET', 'POST'])
|
||||
@login_required
|
||||
@requires_roles("admin")
|
||||
def edit_user_admin(id):
|
||||
user = User.query.get_or_404(id)
|
||||
form = EditProfileAdminForm(user=user)
|
||||
if form.validate_on_submit():
|
||||
user.email = form.email.data
|
||||
user.username = form.username.data
|
||||
user.full_name = form.full_name.data
|
||||
user.role_id = Role.query.get(form.role.data)
|
||||
user.confirmed = form.confirmed.data
|
||||
db.session.add(user)
|
||||
flash('The profile has been updated.')
|
||||
return redirect(url_for('.user', username=user.username))
|
||||
return render_template('admin/edit_user.html', user=user, form=form,
|
||||
title="Edit User",
|
||||
block_description = "edit and update user info")
|
12
dash/templates/_formhelpers.html
Normal file
12
dash/templates/_formhelpers.html
Normal file
@ -0,0 +1,12 @@
|
||||
{% macro render_field(field) %}
|
||||
<dt>{{ field.label }}
|
||||
<dd>{{ field(**kwargs)|safe }}
|
||||
{% if field.errors %}
|
||||
<ul class=errors>
|
||||
{% for error in field.errors %}
|
||||
<li>{{ error }}</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
{% endif %}
|
||||
</dd>
|
||||
{% endmacro %}
|
@ -1,6 +1,8 @@
|
||||
<section class="content-header">
|
||||
<h1>
|
||||
Admin Dashboard
|
||||
<small>Dashboard for Administrators</small>
|
||||
</h1>
|
||||
</section>
|
||||
<h1>
|
||||
{{ title }}
|
||||
<small>{{ block_description }}</small>
|
||||
</h1>
|
||||
<ol class="breadcrumb">
|
||||
<li><a href="{{ url_for('admin.index') }}"><i class="fa fa-dashboard"></i>Admin Home</a></li>
|
||||
<li>{{ title }}</li>
|
||||
</ol>
|
96
dash/templates/admin/edit_user.html
Normal file
96
dash/templates/admin/edit_user.html
Normal file
@ -0,0 +1,96 @@
|
||||
{% extends "adminlte/base.html" %}
|
||||
{% import "adminlte/layout.html" as layout with context %}
|
||||
{% import "adminlte/widgets.html" as widgets with context %}
|
||||
{% from "_formhelpers.html" import render_field %}
|
||||
|
||||
{% block title %}Admin - {{ title }}{% endblock %}
|
||||
{% block description %}{{ block_description }}{% endblock %}
|
||||
|
||||
{% block navbar %}
|
||||
|
||||
{% include "navbar.html" %}
|
||||
|
||||
{%- endblock navbar %}
|
||||
|
||||
|
||||
{% block sidebar -%}
|
||||
|
||||
{% include 'sidebar.html' %}
|
||||
|
||||
{% include 'admin/sidebar_menu.html' %}
|
||||
|
||||
{%- endblock sidebar %}
|
||||
|
||||
|
||||
{% block content_header -%}
|
||||
{% include 'admin/content_header.html' %}
|
||||
{%- endblock content_header %}
|
||||
|
||||
{% block content -%}
|
||||
<!-- Main content -->
|
||||
<div class="row">
|
||||
<div class="col-xs-12">
|
||||
<div class="box">
|
||||
<!-- /.box-header -->
|
||||
<div class="register-box-body">
|
||||
<form class="form-horizontal" action="" method="post">
|
||||
{{ form.hidden_tag() }}
|
||||
<div class="form-group has-feedback">
|
||||
<input type="email" name="email" class="form-control" placeholder="Email" value="{{ request.form['email'] }}">
|
||||
<span class="glyphicon glyphicon-envelope form-control-feedback"></span>
|
||||
{% if form.email.errors %}
|
||||
<span class="text-red">{% for error in form.email.errors %} {{ error }} {% endfor %}</span>
|
||||
{% endif %}
|
||||
</div>
|
||||
<div class="form-group has-feedback">
|
||||
<input type="text" name="username" class="form-control" placeholder="User name" value="{{ request.form['username'] }}">
|
||||
<span class="glyphicon glyphicon-user form-control-feedback"></span>
|
||||
{% if form.username.errors %}
|
||||
<span class="text-red">{% for error in form.username.errors %} {{ error }} {% endfor %}</span>
|
||||
{% endif %}
|
||||
</div>
|
||||
<div class="form-group has-feedback">
|
||||
<input type="text" name="full_name" class="form-control" placeholder="Full name" value="{{ request.form['full_name'] }}">
|
||||
<span class="glyphicon glyphicon-user form-control-feedback"></span>
|
||||
</div>
|
||||
<div class="form-group has-feedback">
|
||||
<label>User Role</label>
|
||||
<select class="form-control">
|
||||
<option value="1">Admin</option>
|
||||
<option value="2">Reseller</option>
|
||||
<option value="3" selected>User</option>
|
||||
</select>
|
||||
<span class="glyphicon glyphicon-signal form-control-feedback"></span>
|
||||
{% if form.role_id.errors %}
|
||||
<span class="text-red">{% for error in form.role_id.errors %} {{ error }} {% endfor %}</span>
|
||||
{% endif %}
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-xs-8 col-xs-offset-0">
|
||||
<div class="checkbox">
|
||||
<label>
|
||||
<input type="checkbox" name="confirmed"> Confirmed?
|
||||
</label>
|
||||
{% if form.confirmed.errors %}
|
||||
<br />
|
||||
<span class="text-red">{% for error in form.confirmed.errors %} {{ error }} {% endfor %}</span>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
<!-- /.col -->
|
||||
<div class="col-xs-4">
|
||||
<button type="submit" name="submit" class="btn btn-primary btn-block btn-flat" value="Update">Update</button>
|
||||
</div>
|
||||
<!-- /.col -->
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
<!-- /.box-body -->
|
||||
</div>
|
||||
<!-- /.box -->
|
||||
</div>
|
||||
<!-- /.col -->
|
||||
</div>
|
||||
<!-- /.row -->
|
||||
|
||||
{%- endblock content %}
|
@ -2,6 +2,9 @@
|
||||
{% import "adminlte/layout.html" as layout with context %}
|
||||
{% import "adminlte/widgets.html" as widgets with context %}
|
||||
|
||||
{% block title %}Admin - {{ title }}{% endblock %}
|
||||
{% block description %}{{ block_description }}{% endblock %}
|
||||
|
||||
{% block navbar %}
|
||||
|
||||
{% include "navbar.html" %}
|
||||
@ -24,13 +27,9 @@
|
||||
|
||||
{% block content -%}
|
||||
<!-- Main content -->
|
||||
<section class="content">
|
||||
<div class="row">
|
||||
<div class="col-xs-12">
|
||||
<div class="box">
|
||||
<div class="box-header">
|
||||
<h3 class="box-title">User List</h3>
|
||||
</div>
|
||||
<!-- /.box-header -->
|
||||
<div class="box-body">
|
||||
<table id="example2" class="table table-bordered table-hover">
|
||||
@ -52,7 +51,9 @@
|
||||
<td>{{ user.email }}</td>
|
||||
<td>{{ user.created_at }}</td>
|
||||
<td>{{ user.role.name }}</td>
|
||||
<td>Edit</td>
|
||||
<td>
|
||||
<a href="{{ url_for('admin.edit_user_admin', id=user.id) }}">Edit</a>
|
||||
</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
@ -75,7 +76,5 @@
|
||||
<!-- /.col -->
|
||||
</div>
|
||||
<!-- /.row -->
|
||||
</section>
|
||||
<!-- /.content -->
|
||||
|
||||
{%- endblock content %}
|
@ -1,8 +1,8 @@
|
||||
<h1>
|
||||
Dashboard
|
||||
<small>Preview page</small>
|
||||
</h1>
|
||||
<ol class="breadcrumb">
|
||||
<li><a href="#"><i class="fa fa-dashboard"></i> Home</a></li>
|
||||
<li>Dashboard</li>
|
||||
</ol>
|
||||
<h1>
|
||||
Dashboard
|
||||
<small>Preview page</small>
|
||||
</h1>
|
||||
<ol class="breadcrumb">
|
||||
<li><a href="#"><i class="fa fa-dashboard"></i> Home</a></li>
|
||||
<li>Dashboard</li>
|
||||
</ol>
|
Loading…
x
Reference in New Issue
Block a user