refonte de doc_list et doc_view
This commit is contained in:
@@ -47,6 +47,11 @@ def update_membre_mdp(request, login, password):
|
|||||||
query = "UPDATE members SET mdp = SHA1(:password), mdp_oublie=NULL, mdp_oublie_date=NULL WHERE email=:login;"
|
query = "UPDATE members SET mdp = SHA1(:password), mdp_oublie=NULL, mdp_oublie_date=NULL WHERE email=:login;"
|
||||||
execute_query(request, query, {'login': login, 'password': password})
|
execute_query(request, query, {'login': login, 'password': password})
|
||||||
|
|
||||||
|
def update_membre_photo(request, login, photo_instagram):
|
||||||
|
"""Update photo_instagram for member login"""
|
||||||
|
query = "UPDATE members SET photo_instagram = :photo_instagram WHERE email=:login;"
|
||||||
|
execute_query(request, query, {'login': login, 'photo_instagram': photo_instagram})
|
||||||
|
|
||||||
def update_last_connection(request, login):
|
def update_last_connection(request, login):
|
||||||
"""Update last connection for login """
|
"""Update last connection for login """
|
||||||
query = "UPDATE members SET dern_cnx_le=NOW() WHERE email=:login;"
|
query = "UPDATE members SET dern_cnx_le=NOW() WHERE email=:login;"
|
||||||
|
|||||||
@@ -1,9 +1,10 @@
|
|||||||
def includeme(config):
|
def includeme(config):
|
||||||
config.add_static_view('static', 'static', cache_max_age=3600)
|
config.add_static_view('static', 'static', cache_max_age=3600)
|
||||||
config.add_route('home', '/')
|
config.add_route('home', '/')
|
||||||
|
config.add_route('archives', '/archives/{theme}')
|
||||||
config.add_route('doc_edit', '/doc_edit/{doc_id}')
|
config.add_route('doc_edit', '/doc_edit/{doc_id}')
|
||||||
config.add_route('doc_list', '/doc_list')
|
|
||||||
config.add_route('doc_view', '/doc_view/{doc_id}')
|
config.add_route('doc_view', '/doc_view/{doc_id}')
|
||||||
|
config.add_route('memo_view', '/memo_view/{doc_id}')
|
||||||
# actifs
|
# actifs
|
||||||
config.add_route('actif_edit', '/actif_edit/{no_id}')
|
config.add_route('actif_edit', '/actif_edit/{no_id}')
|
||||||
config.add_route('actif2_edit', '/actif2_edit/{no_id}')
|
config.add_route('actif2_edit', '/actif2_edit/{no_id}')
|
||||||
@@ -12,7 +13,7 @@ def includeme(config):
|
|||||||
config.add_route('histo_edit', '/histo_edit/{no_id}')
|
config.add_route('histo_edit', '/histo_edit/{no_id}')
|
||||||
config.add_route('portfolio', '/portfolio')
|
config.add_route('portfolio', '/portfolio')
|
||||||
# members
|
# members
|
||||||
config.add_route('changer_mdp', '/changer_mdp')
|
config.add_route('preferences', '/preferences')
|
||||||
config.add_route('envoyer_mdp', '/envoyer_mdp')
|
config.add_route('envoyer_mdp', '/envoyer_mdp')
|
||||||
config.add_route('login', '/login')
|
config.add_route('login', '/login')
|
||||||
config.add_route('logout', '/logout')
|
config.add_route('logout', '/logout')
|
||||||
|
|||||||
@@ -2,15 +2,15 @@
|
|||||||
@error: #b94a48;
|
@error: #b94a48;
|
||||||
|
|
||||||
.navbar {
|
.navbar {
|
||||||
margin-bottom: 0;
|
|
||||||
color: #000000 !important;
|
color: #000000 !important;
|
||||||
background-color: #ffffff !important;
|
background-color: #ffffff !important;
|
||||||
border: 0;
|
border-bottom: 1px solid black;
|
||||||
border-radius: 0;
|
border-radius: 0;
|
||||||
|
min-height: 70px;
|
||||||
font-size: 20px !important;
|
font-size: 20px !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
.navbar li a, .navbar .navbar-brand {
|
.navbar li a, .navbar {
|
||||||
color: #000000 !important;
|
color: #000000 !important;
|
||||||
font-size: 14px !important;
|
font-size: 14px !important;
|
||||||
}
|
}
|
||||||
|
|||||||
20
caotek_mesavoirs/templates/archives.pt
Normal file
20
caotek_mesavoirs/templates/archives.pt
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
<metal:block use-macro="main_template">
|
||||||
|
<div metal:fill-slot="content">
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<table class="table">
|
||||||
|
<tr tal:repeat="ligne docs">
|
||||||
|
<td><a href="/doc_view/${ligne.doc_id}"><b>${ligne.intitule}</b></a></td>
|
||||||
|
<td>${ligne.tag1}</td>
|
||||||
|
<td>${ligne.cree_le.strftime("%d-%m-%Y")}</td>
|
||||||
|
<td>${ligne.modif_le.strftime("%d-%m-%Y")}</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<br />
|
||||||
|
<br />
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</metal:block>
|
||||||
|
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
<metal:block use-macro="main_template">
|
|
||||||
<div metal:fill-slot="content">
|
|
||||||
|
|
||||||
<div class="row">
|
|
||||||
<p>
|
|
||||||
<a href="doc_edit/0" class="btn btn-success" role="button">
|
|
||||||
<span class="glyphicon glyphicon-plus"></span>
|
|
||||||
Créér une nouvelle doc</a>
|
|
||||||
</p>
|
|
||||||
<div class="col-md-6">
|
|
||||||
<table class="table table-condensed table-striped table-bordered">
|
|
||||||
<tr>
|
|
||||||
<th>MEMOS</th>
|
|
||||||
</tr>
|
|
||||||
|
|
||||||
<tr tal:repeat="ligne memos">
|
|
||||||
<td><a href="doc_view/${ligne.doc_id}">${ligne.intitule}</a></td>
|
|
||||||
</tr>
|
|
||||||
</table>
|
|
||||||
</div>
|
|
||||||
<div class="col-md-6">
|
|
||||||
<table class="table table-condensed table-striped table-bordered">
|
|
||||||
<tr>
|
|
||||||
<th>DOCUMENTS</th>
|
|
||||||
</tr>
|
|
||||||
|
|
||||||
<tr tal:repeat="ligne docs">
|
|
||||||
<td><a href="doc_view/${ligne.doc_id}">${ligne.intitule}</a></td>
|
|
||||||
</tr>
|
|
||||||
</table>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<br />
|
|
||||||
<br />
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</metal:block>
|
|
||||||
|
|
||||||
@@ -1,19 +1,14 @@
|
|||||||
<metal:block use-macro="main_template">
|
<metal:block use-macro="main_template">
|
||||||
<div metal:fill-slot="content">
|
<div metal:fill-slot="content">
|
||||||
|
|
||||||
<br />
|
<a href="${url_retour}">[ Fermer ]</a>
|
||||||
<a href="${request.application_url}/doc_list" class="btn btn-default" role="button">
|
<a href="${request.application_url}/doc_edit/${doc_id}" tal:condition="not layout.isAnonymous">[ Modifier ]</a>
|
||||||
<span class="glyphicon glyphicon-chevron-left"></span> Fermer</a>
|
<br />
|
||||||
<a href="${request.application_url}/doc_edit/${doc_id}" class="btn btn-primary" role="button">
|
<hr>
|
||||||
<span class="glyphicon glyphicon-pencil"></span> Modifier</a>
|
<div tal:replace="structure texte">
|
||||||
<br />
|
Page text goes here.
|
||||||
<hr>
|
</div>
|
||||||
<div tal:replace="structure texte">
|
<hr>
|
||||||
Page text goes here.
|
|
||||||
</div>
|
|
||||||
<hr>
|
|
||||||
<br />
|
|
||||||
<br />
|
|
||||||
<br />
|
<br />
|
||||||
<br />
|
<br />
|
||||||
|
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
@@ -64,7 +64,7 @@
|
|||||||
<br />
|
<br />
|
||||||
<br />
|
<br />
|
||||||
<br />
|
<br />
|
||||||
<hr>
|
<br />
|
||||||
<div class="container">
|
<div class="container">
|
||||||
<h1 tal:condition="request.path != '/'">${page_title}</h1>
|
<h1 tal:condition="request.path != '/'">${page_title}</h1>
|
||||||
<div id="messages" tal:attributes="class request.is_xhr and 'ajax-replace' or None">
|
<div id="messages" tal:attributes="class request.is_xhr and 'ajax-replace' or None">
|
||||||
@@ -81,9 +81,11 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div metal:define-slot="content" />
|
<div metal:define-slot="content" />
|
||||||
<br />
|
<br />
|
||||||
<br />
|
<br />
|
||||||
</div>
|
</div>
|
||||||
|
<br />
|
||||||
|
<br />
|
||||||
|
|
||||||
<footer class="container-fluid bg-footer">
|
<footer class="container-fluid bg-footer">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
|
|||||||
@@ -1,57 +0,0 @@
|
|||||||
<metal:block use-macro="main_template">
|
|
||||||
<div metal:fill-slot="content">
|
|
||||||
|
|
||||||
<div tal:condition="message" tal:content="message" class="alert alert-danger" />
|
|
||||||
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-xs-3">
|
|
||||||
<form id="change-password-form" action="${url}" method="post" tal:condition="member"
|
|
||||||
data-fv-framework="bootstrap"
|
|
||||||
data-fv-icon-valid="glyphicon glyphicon-ok"
|
|
||||||
data-fv-icon-invalid="glyphicon glyphicon-remove"
|
|
||||||
data-fv-icon-validating="glyphicon glyphicon-refresh">
|
|
||||||
|
|
||||||
<div class="form-group">
|
|
||||||
<label class="control-label" for="old_password">Mot de passe actuel</label>
|
|
||||||
<input class="form-control" type="password" size="10" name="old_password"
|
|
||||||
data-fv-notempty="true"
|
|
||||||
data-fv-notempty-message="Le mot de passe est obligatoire" />
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="form-group">
|
|
||||||
<label class="control-label" for="new_password1">Nouveau mot de passe</label>
|
|
||||||
<input class="form-control" type="password" size="10" name="new_password1"
|
|
||||||
data-fv-notempty="true"
|
|
||||||
data-fv-notempty-message="Le mot de passe est obligatoire"
|
|
||||||
|
|
||||||
data-fv-stringlength="true"
|
|
||||||
data-fv-stringlength-min="6"
|
|
||||||
data-fv-stringlength-message="Le mot de passe doit avoir au moins 6 charactères" />
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="form-group">
|
|
||||||
<label class="control-label" for="new_password2">Confirmer le mot de passe</label>
|
|
||||||
<input class="form-control" type="password" size="10" name="new_password2"
|
|
||||||
data-fv-identical="true"
|
|
||||||
data-fv-identical-field="new_password1"
|
|
||||||
data-fv-identical-message="Le mot de passe et sa confirmation ne sont pas identiques" />
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="form-group">
|
|
||||||
<button class="btn btn-primary" type="submit" name="form.submitted">Changer le mot de passe</button>
|
|
||||||
</div>
|
|
||||||
</form>
|
|
||||||
</div>
|
|
||||||
</div> <!-- row -->
|
|
||||||
|
|
||||||
<script>
|
|
||||||
$(document).ready(function() {
|
|
||||||
$('#change-password-form').formValidation();
|
|
||||||
$('form input').on('keypress', function(e) {
|
|
||||||
return e.which !== 13;
|
|
||||||
});
|
|
||||||
});
|
|
||||||
</script>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
</metal:block>
|
|
||||||
70
caotek_mesavoirs/templates/members/preferences.pt
Normal file
70
caotek_mesavoirs/templates/members/preferences.pt
Normal file
@@ -0,0 +1,70 @@
|
|||||||
|
<metal:block use-macro="main_template">
|
||||||
|
<div metal:fill-slot="content">
|
||||||
|
|
||||||
|
<div tal:condition="message" tal:content="message" class="alert alert-danger" />
|
||||||
|
|
||||||
|
<form id="change-password-form" action="${url}" method="post" tal:condition="member"
|
||||||
|
data-fv-framework="bootstrap"
|
||||||
|
data-fv-icon-valid="glyphicon glyphicon-ok"
|
||||||
|
data-fv-icon-invalid="glyphicon glyphicon-remove"
|
||||||
|
data-fv-icon-validating="glyphicon glyphicon-refresh">
|
||||||
|
<div class="col-md-6">
|
||||||
|
<h3>Changer le mot de passe</h3>
|
||||||
|
<div class="form-group">
|
||||||
|
<label class="control-label" for="old_password">Mot de passe actuel</label>
|
||||||
|
<input class="form-control" type="password" name="old_password"
|
||||||
|
data-fv-notempty="true"
|
||||||
|
data-fv-notempty-message="Le mot de passe est obligatoire" />
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-group">
|
||||||
|
<label class="control-label" for="new_password1">Nouveau mot de passe</label>
|
||||||
|
<input class="form-control" type="password" name="new_password1"
|
||||||
|
data-fv-notempty="true"
|
||||||
|
data-fv-notempty-message="Le mot de passe est obligatoire"
|
||||||
|
|
||||||
|
data-fv-stringlength="true"
|
||||||
|
data-fv-stringlength-min="6"
|
||||||
|
data-fv-stringlength-message="Le mot de passe doit avoir au moins 6 charactères" />
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-group">
|
||||||
|
<label class="control-label" for="new_password2">Confirmer le mot de passe</label>
|
||||||
|
<input class="form-control" type="password" name="new_password2"
|
||||||
|
data-fv-identical="true"
|
||||||
|
data-fv-identical-field="new_password1"
|
||||||
|
data-fv-identical-message="Le mot de passe et sa confirmation ne sont pas identiques" />
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-group">
|
||||||
|
<button class="btn btn-primary" type="submit" name="form.submitted">Changer le mot de passe</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-md-1">
|
||||||
|
</div>
|
||||||
|
<div class="col-md-5">
|
||||||
|
<h3>Changer la photo Instagram</h3>
|
||||||
|
<div class="form-group">
|
||||||
|
<label class="control-label" for="photo_instagram">Id Instagram</label>
|
||||||
|
<input class="form-control" type="text" name="photo_instagram" value="${member.photo_instagram}"
|
||||||
|
data-fv-notempty="true"
|
||||||
|
data-fv-notempty-message="L'Id est obligatoire" />
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-group">
|
||||||
|
<button class="btn btn-primary" type="submit" name="form.photo">Changer la photo</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
$(document).ready(function() {
|
||||||
|
$('#change-password-form').formValidation();
|
||||||
|
$('form input').on('keypress', function(e) {
|
||||||
|
return e.which !== 13;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</metal:block>
|
||||||
@@ -8,7 +8,7 @@
|
|||||||
</li>
|
</li>
|
||||||
|
|
||||||
<li class="divider"></li>
|
<li class="divider"></li>
|
||||||
<li><a href="${request.application_url}/changer_mdp">Changer mon mot de passe</a></li>
|
<li><a href="${request.application_url}/preferences">Mes préférences</a></li>
|
||||||
<li tal:condition="layout.isAdmin()"><a href="${request.application_url}/users_list">Gestion des membres</a></li>
|
<li tal:condition="layout.isAdmin()"><a href="${request.application_url}/users_list">Gestion des membres</a></li>
|
||||||
|
|
||||||
<li class="divider"></li>
|
<li class="divider"></li>
|
||||||
|
|||||||
@@ -18,6 +18,9 @@ from sqlalchemy.exc import DBAPIError
|
|||||||
from ..security import groupfinder
|
from ..security import groupfinder
|
||||||
|
|
||||||
from ..models.default import *
|
from ..models.default import *
|
||||||
|
from ..models.members import (
|
||||||
|
get_member_by_email
|
||||||
|
)
|
||||||
|
|
||||||
# import datetime
|
# import datetime
|
||||||
import time
|
import time
|
||||||
@@ -69,24 +72,27 @@ def to_percent(x, d):
|
|||||||
@view_config(route_name='home', renderer='../templates/home.pt')
|
@view_config(route_name='home', renderer='../templates/home.pt')
|
||||||
def home(request):
|
def home(request):
|
||||||
|
|
||||||
|
member = get_member_by_email(request, 'ctphuoc@gmail.com')
|
||||||
|
id_photo = member.photo_instagram
|
||||||
|
|
||||||
# lire toutes les docs
|
# lire toutes les docs
|
||||||
items = get_docs_bytheme(request, 'BLOG')
|
items = get_docs_bytheme(request, 'BLOG')
|
||||||
|
|
||||||
return {
|
return {
|
||||||
'page_title': "Home",
|
'page_title': "Blog d'un ancien geek",
|
||||||
'items': items,
|
'items': items,
|
||||||
|
'id_photo': id_photo,
|
||||||
}
|
}
|
||||||
|
|
||||||
@view_config(route_name='doc_list', renderer='../templates/doc_list.pt', permission='view')
|
@view_config(route_name='archives', renderer='../templates/archives.pt')
|
||||||
def doc_list(request):
|
def archives(request):
|
||||||
|
theme = request.matchdict['theme']
|
||||||
|
|
||||||
# lire toutes les docs
|
# lire toutes les docs du theme
|
||||||
memos = get_docs_bytheme(request, 'memo')
|
docs = get_docs_bytheme(request, theme)
|
||||||
docs = get_docs_bytheme(request, 'doc')
|
|
||||||
|
|
||||||
return {
|
return {
|
||||||
'page_title': "Documents",
|
'page_title': "Archives de %s" % theme,
|
||||||
'memos': memos,
|
|
||||||
'docs': docs,
|
'docs': docs,
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -141,13 +147,15 @@ def doc_edit(request):
|
|||||||
'themes': themes,
|
'themes': themes,
|
||||||
}
|
}
|
||||||
|
|
||||||
@view_config(route_name='doc_view', renderer='../templates/doc_view.pt', permission='view')
|
@view_config(route_name='doc_view', renderer='../templates/doc_view.pt')
|
||||||
|
@view_config(route_name='memo_view', renderer='../templates/doc_view.pt', permission='view')
|
||||||
def doc_view(request):
|
def doc_view(request):
|
||||||
doc_id = request.matchdict['doc_id']
|
doc_id = request.matchdict['doc_id']
|
||||||
current_route_path = request.current_route_path()
|
|
||||||
|
|
||||||
doc = get_docs(request, doc_id)
|
doc = get_docs(request, doc_id)
|
||||||
intitule = doc.intitule
|
intitule = doc.intitule
|
||||||
|
url_retour = request.route_url('archives',theme=doc.theme)
|
||||||
|
|
||||||
# insèrer le path de static/img
|
# insèrer le path de static/img
|
||||||
img_path = 'image:: %s/static/img/' % request.application_url
|
img_path = 'image:: %s/static/img/' % request.application_url
|
||||||
|
|
||||||
@@ -158,6 +166,7 @@ def doc_view(request):
|
|||||||
'page_title': intitule,
|
'page_title': intitule,
|
||||||
'texte': texte,
|
'texte': texte,
|
||||||
'doc_id': doc_id,
|
'doc_id': doc_id,
|
||||||
|
'url_retour':url_retour
|
||||||
}
|
}
|
||||||
|
|
||||||
def envoyerMail(request, destinataire, objet, corps):
|
def envoyerMail(request, destinataire, objet, corps):
|
||||||
|
|||||||
@@ -65,9 +65,9 @@ Le lien suivant vous dirigera vers une page où vous pourrez ré-initialiser vot
|
|||||||
'message': message,
|
'message': message,
|
||||||
}
|
}
|
||||||
|
|
||||||
@view_config(route_name='changer_mdp', renderer='../templates/members/changer_mdp.pt', permission='view')
|
@view_config(route_name='preferences', renderer='../templates/members/preferences.pt', permission='view')
|
||||||
def changer_mdp(request):
|
def preferences(request):
|
||||||
url = request.route_url('changer_mdp')
|
url = request.route_url('preferences')
|
||||||
|
|
||||||
logged_in = request.authenticated_userid
|
logged_in = request.authenticated_userid
|
||||||
message = ''
|
message = ''
|
||||||
@@ -84,8 +84,14 @@ def changer_mdp(request):
|
|||||||
else:
|
else:
|
||||||
message = "Le mot de passe actuel n'est pas correct."
|
message = "Le mot de passe actuel n'est pas correct."
|
||||||
|
|
||||||
|
if 'form.photo' in request.params:
|
||||||
|
photo_instagram = request.params['photo_instagram']
|
||||||
|
update_membre_photo(request, logged_in, photo_instagram)
|
||||||
|
request.session.flash(u"L'id de la photo a été mis à jour avec succès.")
|
||||||
|
return HTTPFound(location=request.route_url('home'))
|
||||||
|
|
||||||
return {
|
return {
|
||||||
'page_title': "Changer mon mot de passe",
|
'page_title': "Mes préférences",
|
||||||
'url': url,
|
'url': url,
|
||||||
'member': member,
|
'member': member,
|
||||||
'message': message,
|
'message': message,
|
||||||
|
|||||||
Reference in New Issue
Block a user