Admin - Edit User

Function for admin user to edit user info.
This commit is contained in:
kelepirci 2016-08-10 01:40:08 +03:00
parent 0b720b9cc0
commit 2e5bf79a8e
8 changed files with 183 additions and 26 deletions

View File

@ -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

View File

@ -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.')

View File

@ -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")

View 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 %}

View File

@ -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>

View 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 %}

View File

@ -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 %}

View File

@ -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>