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_sqlalchemy import SQLAlchemy
|
||||||
from flask_login import LoginManager
|
from flask_login import LoginManager
|
||||||
from flask_debugtoolbar import DebugToolbarExtension
|
from flask_debugtoolbar import DebugToolbarExtension
|
||||||
from flask.ext.principal import Principal
|
from flask_principal import Principal
|
||||||
|
|
||||||
from config import config
|
from config import config
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,31 @@
|
||||||
from flask_wtf import Form
|
from flask_wtf import Form
|
||||||
from flask import flash
|
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 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 admin
|
||||||
from .. import db
|
from .. import db
|
||||||
from ..models import User
|
from ..models import User, Role
|
||||||
from ..email import send_email
|
from ..email import send_email
|
||||||
from ..decorators import requires_roles
|
from ..decorators import requires_roles
|
||||||
|
from .forms import EditProfileAdminForm
|
||||||
|
|
||||||
@admin.route('/')
|
@admin.route('/')
|
||||||
@login_required
|
@login_required
|
||||||
|
@ -23,4 +24,25 @@ def index():
|
||||||
@requires_roles("admin")
|
@requires_roles("admin")
|
||||||
def list_users():
|
def list_users():
|
||||||
users = User.query.all()
|
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")
|
|
@ -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>
|
||||||
<h1>
|
{{ title }}
|
||||||
Admin Dashboard
|
<small>{{ block_description }}</small>
|
||||||
<small>Dashboard for Administrators</small>
|
</h1>
|
||||||
</h1>
|
<ol class="breadcrumb">
|
||||||
</section>
|
<li><a href="{{ url_for('admin.index') }}"><i class="fa fa-dashboard"></i>Admin Home</a></li>
|
||||||
|
<li>{{ title }}</li>
|
||||||
|
</ol>
|
|
@ -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/layout.html" as layout with context %}
|
||||||
{% import "adminlte/widgets.html" as widgets with context %}
|
{% import "adminlte/widgets.html" as widgets with context %}
|
||||||
|
|
||||||
|
{% block title %}Admin - {{ title }}{% endblock %}
|
||||||
|
{% block description %}{{ block_description }}{% endblock %}
|
||||||
|
|
||||||
{% block navbar %}
|
{% block navbar %}
|
||||||
|
|
||||||
{% include "navbar.html" %}
|
{% include "navbar.html" %}
|
||||||
|
@ -24,13 +27,9 @@
|
||||||
|
|
||||||
{% block content -%}
|
{% block content -%}
|
||||||
<!-- Main content -->
|
<!-- Main content -->
|
||||||
<section class="content">
|
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-xs-12">
|
<div class="col-xs-12">
|
||||||
<div class="box">
|
<div class="box">
|
||||||
<div class="box-header">
|
|
||||||
<h3 class="box-title">User List</h3>
|
|
||||||
</div>
|
|
||||||
<!-- /.box-header -->
|
<!-- /.box-header -->
|
||||||
<div class="box-body">
|
<div class="box-body">
|
||||||
<table id="example2" class="table table-bordered table-hover">
|
<table id="example2" class="table table-bordered table-hover">
|
||||||
|
@ -52,7 +51,9 @@
|
||||||
<td>{{ user.email }}</td>
|
<td>{{ user.email }}</td>
|
||||||
<td>{{ user.created_at }}</td>
|
<td>{{ user.created_at }}</td>
|
||||||
<td>{{ user.role.name }}</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>
|
</tr>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</tbody>
|
</tbody>
|
||||||
|
@ -75,7 +76,5 @@
|
||||||
<!-- /.col -->
|
<!-- /.col -->
|
||||||
</div>
|
</div>
|
||||||
<!-- /.row -->
|
<!-- /.row -->
|
||||||
</section>
|
|
||||||
<!-- /.content -->
|
|
||||||
|
|
||||||
{%- endblock content %}
|
{%- endblock content %}
|
|
@ -1,8 +1,8 @@
|
||||||
<h1>
|
<h1>
|
||||||
Dashboard
|
Dashboard
|
||||||
<small>Preview page</small>
|
<small>Preview page</small>
|
||||||
</h1>
|
</h1>
|
||||||
<ol class="breadcrumb">
|
<ol class="breadcrumb">
|
||||||
<li><a href="#"><i class="fa fa-dashboard"></i> Home</a></li>
|
<li><a href="#"><i class="fa fa-dashboard"></i> Home</a></li>
|
||||||
<li>Dashboard</li>
|
<li>Dashboard</li>
|
||||||
</ol>
|
</ol>
|
Loading…
Reference in New Issue