merge user_add and user_pwd into user_edit

This commit is contained in:
2023-06-28 20:44:19 +02:00
parent 812dde7ee6
commit 979cf67e5c
8 changed files with 146 additions and 159 deletions

View File

@@ -1,6 +1,6 @@
from wtforms import Form, StringField, TextAreaField, SelectField, DateTimeField from wtforms import Form, StringField, TextAreaField, SelectField, DateTimeField
from wtforms import IntegerField, PasswordField from wtforms import IntegerField, PasswordField
from wtforms.validators import InputRequired, Length, Email from wtforms.validators import InputRequired, Length, EqualTo
from wtforms.widgets import HiddenInput from wtforms.widgets import HiddenInput
strip_filter = lambda x: x.strip() if x else None strip_filter = lambda x: x.strip() if x else None
@@ -26,9 +26,11 @@ class BlogSearchForm(Form):
filters=[strip_filter]) filters=[strip_filter])
class UserCreateForm(Form): class UserCreateForm(Form):
username = StringField('Nom', validators=[InputRequired(), Length(min=1, max=255)], id = IntegerField(widget=HiddenInput())
name = StringField('Nom', validators=[InputRequired(), Length(min=1, max=255)],
filters=[strip_filter]) filters=[strip_filter])
password = PasswordField('Mot de passe', validators=[InputRequired(), Length(min=6)]) password = PasswordField('Mot de passe')
confirm = PasswordField('Confirmer', validators=[EqualTo('password', message='Les 2 Passwords doivent être identiques')])
class TopicForm(Form): class TopicForm(Form):
topic = StringField('Topic', validators=[InputRequired(), Length(min=1, max=25)], topic = StringField('Topic', validators=[InputRequired(), Length(min=1, max=25)],

View File

@@ -15,5 +15,4 @@ def includeme(config):
config.add_route('topic_edit', '/topic_edit/{topic}') config.add_route('topic_edit', '/topic_edit/{topic}')
config.add_route('topics', '/topics') config.add_route('topics', '/topics')
config.add_route('users', '/users') config.add_route('users', '/users')
config.add_route('user_add', '/user_add/{name}') config.add_route('user_edit', '/user_edit/{name}')
config.add_route('user_pwd', '/user_pwd/{name}')

View File

@@ -37,26 +37,30 @@
</div> </div>
<div class="collapse navbar-collapse" id="myNavbar"> <div class="collapse navbar-collapse" id="myNavbar">
<ul class="nav navbar-nav navbar-right"> <ul class="nav navbar-nav navbar-right">
<li><a href="{{ request.route_url('blog_search') }}" title="Recherche"><span class="glyphicon glyphicon-search"></span></a></li> <li><a href="{{ request.route_url('blog_search') }}" title="Recherche"><span class="glyphicon glyphicon-search"></span></a></li>
{% if request.authenticated_userid %} {% if request.authenticated_userid %}
<li class="dropdown"> <li class="dropdown">
<a class="dropdown-toggle" data-toggle="dropdown" href="#">{{request.authenticated_userid}} <a class="dropdown-toggle" data-toggle="dropdown" href="#">{{request.authenticated_userid}}
<span class="caret"></span> <span class="caret"></span>
</a> </a>
<ul class="dropdown-menu"> <ul class="dropdown-menu">
{% if request.authenticated_userid == 'admin' %} {% if request.authenticated_userid == 'admin' %}
<li><a href="{{request.route_url('users')}}"> <li><a href="{{request.route_url('users')}}">
<span class="glyphicon glyphicon-user"></span></span>&nbsp;&nbsp;Utilisateurs</a></li> <span class="glyphicon glyphicon-user"></span></span>&nbsp;&nbsp;Utilisateurs</a></li>
{% endif %} {% else %}
<li><a href="{{request.route_url('settings')}}" title="Paramères"> <li><a href="{{request.route_url('user_edit', name=request.authenticated_userid)}}">
<span class="glyphicon glyphicon-cog"></span></span>&nbsp;&nbsp;Paramètres</a></li> <span class="glyphicon glyphicon-user"></span>&nbsp;&nbsp;Modifier le mot de passe</a>
<li><a href="{{ request.route_url('logout') }}"><span class="glyphicon glyphicon-log-out"></span>&nbsp;&nbsp;Se déconnecter</a></li> </li>
</ul> {% endif %}
</li> <li><a href="{{request.route_url('settings')}}" title="Paramères">
{% else %} <span class="glyphicon glyphicon-cog"></span></span>&nbsp;&nbsp;Paramètres</a></li>
<!-- si anonyme, lien pour se connecter --> <li><a href="{{ request.route_url('logout') }}"><span class="glyphicon glyphicon-log-out"></span>&nbsp;&nbsp;Se déconnecter</a></li>
<li><a href="{{request.route_url('login')}}" title="Connexion"><span class="glyphicon glyphicon-log-in"></span></a></li> </ul>
{% endif %} </li>
{% else %}
<!-- si anonyme, lien pour se connecter -->
<li><a href="{{request.route_url('login')}}" title="Connexion"><span class="glyphicon glyphicon-log-in"></span></a></li>
{% endif %}
</ul> </ul>
</div> </div>

View File

@@ -1,34 +0,0 @@
{% extends "layout.jinja2" %}
{% block content %}
<form action="{{request.route_url('user_add', name=name)}}" method="post" class="form">
{% for error in form.username.errors %}
<div class="error">{{ error }}</div>
{% endfor %}
<div class="form-group">
<label class="required-field" for="username">{{form.username.label}}</label>
{{form.username(class_='form-control')}}
</div>
{% for error in form.password.errors %}
<div class="error">{{error}}</div>
{% endfor %}
<div class="form-group">
<label class="required-field" for="password">{{form.password.label}}</label>
{{form.password(class_='form-control')}}
</div>
<div class="form-group">
<a class="btn btn-default" href="{{ request.route_url('users') }}"><span class="glyphicon glyphicon-chevron-left"></span> Retour</a>
<button class="btn btn-primary" type="submit" name="form.submitted">
<span class="glyphicon glyphicon-ok"></span> Enregistrer</button>
</div>
</form>
{% endblock %}

View File

@@ -0,0 +1,55 @@
{% extends "layout.jinja2" %}
{% block content %}
{% if message %}
<div class="alert alert-danger">
{{ message }}
</div>
{% endif %}
<form action="{{ url }}" method="post" class="form">
{% for error in form.name.errors %}
<div class="label label-warning">{{ error }}</div>
{% endfor %}
<div class="form-group">
<label class="required-field" for="name">{{form.name.label}}</label>
{% if form.id.data %}
<input class="form-control" name="name" readonly type="text" value="{{form.name.data}}">
{% else %}
{{form.name(class_='form-control')}}
{% endif %}
</div>
<div class="form-group">
<label class="required-field" for="password">{{form.password.label}}</label>
{{form.password(class_='form-control')}}
</div>
{% for error in form.confirm.errors %}
<div class="label label-danger">{{error}}</div>
{% endfor %}
<div class="form-group">
<label class="required-field" for="confirm">{{form.confirm.label}}</label>
{{form.confirm(class_='form-control')}}
</div>
<br>
<div class="form-group">
<a class="btn btn-default" href="{{ url_retour }}"><span class="glyphicon glyphicon-chevron-left"></span> Retour</a>
<button class="btn btn-primary" type="submit" name="form.submitted">
<span class="glyphicon glyphicon-ok"></span> Enregistrer</button>
{% if form.id.data and request.authenticated_userid == 'admin' %}
<button class="btn btn-warning" type="submit" name="form.deleted">
<span class="glyphicon glyphicon-remove"></span> Supprimer</button>
{% endif %}
</div>
</form>
{% endblock %}

View File

@@ -1,56 +0,0 @@
{% extends "layout.jinja2" %}
{% block content %}
<form action="{{ request.route_url('user_pwd', name=entry.name) }}" method="post" class="form">
<div class="form-group">
<label for="password">Nouveau mot de passe</label>
<input type="password" name="new_password" class="form-control" placeholder="Optionel">
</div>
<div class="form-group">
<div class="form-control-static text-success">
<strong>Dernière connexion</strong> :
{{ entry.last_logged.strftime("%d-%m-%Y - %H:%M") }}
</div>
</div>
<div class="form-group">
<a class="btn btn-default" href="{{ request.route_url('users') }}"><span class="glyphicon glyphicon-chevron-left"></span> Retour</a>
<button class="btn btn-primary" type="submit" name="form.submitted">
<span class="glyphicon glyphicon-ok"></span> Enregistrer</button>
{% if name != 'new' %}
<button class="btn btn-danger" type="button" data-toggle="modal" data-target="#confirmDelete">
<span class="glyphicon glyphicon-remove"></span> Supprimer</button>
{% endif %}
</div>
</form>
<!-- Modal : Confirmation SUPRESSION -->
<div id="confirmDelete" class="modal" role="dialog">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal">&times;</button>
<h4 class="modal-title">Supprimer la fiche utilisateur</h4>
</div>
<div class="modal-body">
<!-- The form is placed inside the body of modal -->
<p>Etes-vous certain(e) de vouloir supprimer la fiche <b>{{ entry.name }}</b> ?</p>
</div>
<div class="modal-footer">
<div class="form-group">
<div class="text-center">
<form id="confirmForm" method="post">
<button type="submit" class="btn btn-danger" name="form.deleted">Supprimer</button>
</form>
</div>
</div>
</div>
</div>
</div>
</div>
{% endblock %}

View File

@@ -4,7 +4,7 @@
<p> <p>
<a href="{{ request.route_url('settings' ) }}" class="btn btn-default" role="button"> <a href="{{ request.route_url('settings' ) }}" class="btn btn-default" role="button">
<span class="glyphicon glyphicon-chevron-left"></span> Retour</a> <span class="glyphicon glyphicon-chevron-left"></span> Retour</a>
<a href="{{ request.route_url('user_add', name='new') }}" class="btn btn-success" role="button"> <a href="{{ request.route_url('user_edit', name='0') }}" class="btn btn-success" role="button">
<span class="glyphicon glyphicon-plus"></span> Nouvel utilisateur</a> <span class="glyphicon glyphicon-plus"></span> Nouvel utilisateur</a>
</p> </p>
@@ -20,7 +20,7 @@
<tr> <tr>
<td>{{ entry.id }}</td> <td>{{ entry.id }}</td>
<td> <td>
<a href="{{ request.route_url('user_pwd', name=entry.name) }}"> <a href="{{ request.route_url('user_edit', name=entry.name) }}">
{{ entry.name }} {{ entry.name }}
</a> </a>
</td> </td>

View File

@@ -187,58 +187,75 @@ def users(request):
} }
@view_config(route_name='user_add', @view_config(route_name='user_edit', renderer='cao_sunyata:templates/user_edit.jinja2', permission='view')
renderer='cao_sunyata:templates/user_add.jinja2', permission='manage') def user_edit(request):
def user_add(request): message = ''
name = request.matchdict['name'] name = request.matchdict['name']
url = request.route_url('user_edit', name=name)
if request.authenticated_userid == 'admin':
url_retour = request.route_url('users')
else:
url_retour = request.route_url('home')
if name == '0':
# nouvel utilisateur
user = User()
form = UserCreateForm(request.POST, user)
page_title = "Nouvel utilisateur"
else:
# lire la fiche du user
user = UserService.by_name(request, name)
if not user:
request.session.flash("Utilisateur non trouvé : %s" % name, 'danger')
return HTTPFound(location=url_retour)
form = UserCreateForm(request.POST, user)
page_title = "Modification utilisateur"
# nouveau
form = UserCreateForm(request.POST)
if 'form.submitted' in request.params and form.validate(): if 'form.submitted' in request.params and form.validate():
# créer nouveau # controle que le password a moins 6 car
new_user = User(name=form.username.data) if len(form.password.data) < 6 :
new_user.set_password(form.password.data.encode('utf8')) message = "Le mot de passe doit avoir au moins 6 caractères"
request.dbsession.add(new_user) else:
return HTTPFound(location=request.route_url('users')) if name == '0':
# création user
# controler que le nouvel user n'existe pas dans la BD
new_user = UserService.by_name(request, form.name.data)
if new_user:
message = "Utilisateur déjà créé : %s" % form.name.data
else:
form.populate_obj(user)
user.set_password(form.password.data.encode('utf8'))
# créer le nouveau
request.dbsession.add(user)
request.session.flash("La fiche a été créée avec succès.", 'success')
return HTTPFound(location=url_retour)
else:
# modification user
del form.name # SECURITY: prevent overwriting of primary key
form.populate_obj(user)
user.set_password(form.password.data.encode('utf8'))
request.session.flash("La fiche a été modifiée avec succès.", 'success')
return HTTPFound(location=url_retour)
if 'form.deleted' in request.params:
UserService.delete(request, user.id)
request.session.flash("La fiche a été supprimée avec succès.", 'success')
return HTTPFound(location=url_retour)
return { return {
'page_title': 'Nouvel utilisateur', 'page_title': page_title,
'message': message,
'form': form, 'form': form,
'url': url,
'url_retour': url_retour,
'name': name, 'name': name,
} }
@view_config(route_name='user_pwd', @view_config(route_name='topics', renderer='cao_sunyata:templates/topics.jinja2', permission='view')
renderer='cao_sunyata:templates/user_pwd.jinja2', permission='manage')
def user_pwd(request):
# reset password or delete user
name = request.matchdict['name']
# lire la fiche du membre
entry = UserService.by_name(request, name)
if not entry:
request.session.flash(u"Utilisateur non trouvé : %s" % name, 'warning')
return HTTPFound(location=request.route_url('users'))
if 'form.submitted' in request.params:
mdp = request.params["new_password"]
entry.set_password(mdp.encode('utf8'))
return HTTPFound(location=request.route_url('users'))
if 'form.deleted' in request.params:
UserService.delete(request, entry.id)
request.session.flash("La fiche a été supprimée avec succès.", 'success')
return HTTPFound(location=request.route_url('users'))
return {
'page_title': "Utilisateur : %s" %(entry.name),
'entry': entry,
}
@view_config(route_name='topics',
renderer='cao_sunyata:templates/topics.jinja2', permission='view')
def topics(request): def topics(request):
# get all topics # get all topics
topics = BlogRecordService.get_topics(request) topics = BlogRecordService.get_topics(request)