added allocation_list.pt and edit.pt

This commit is contained in:
2017-07-26 10:08:09 +02:00
parent c24efa00d9
commit ae819f49fa
11 changed files with 239 additions and 123 deletions

View File

@@ -17,7 +17,7 @@ from .default import (
def get_actifs(request, no_id):
if no_id == '0':
query = "SELECT * FROM actifs ORDER BY categorie, symbole"
query = "SELECT actifs.*, classes.* FROM actifs INNER JOIN classes ON actifs.categorie = classes.classe ORDER BY ordre, libelle"
results = request.dbsession.execute(query).fetchall()
else:
# lire le actif par son identifiant
@@ -59,3 +59,53 @@ def update_portefeuille(request):
def delete_actif(request, no_id):
query = "DELETE FROM actifs WHERE no_id = :no_id ;"
execute_query(request, query, {'no_id': no_id})
def get_categories(request, no_cat):
if no_cat == '0':
query = """
SELECT categories.*, classes.* FROM categories INNER JOIN classes ON categories.categorie = classes.classe
ORDER BY ordre"""
results = request.dbsession.execute(query).fetchall()
else:
# lire le actif par son identifiant
query = """SELECT * FROM categories WHERE no_cat=:no_cat;"""
results = request.dbsession.execute(query, {'no_cat': no_cat}).first()
return results
def get_categories_bytype(request, type):
# lire le actif par son identifiant
query = """SELECT categories.*, classes.* FROM categories INNER JOIN classes ON categories.categorie = classes.classe
WHERE type=:type ORDER by ordre;"""
results = request.dbsession.execute(query, {'type': type}).fetchall()
return results
def update_categorie(request, no_cat, new_values):
# formater les champs
s = ''
for param in new_values.keys():
if s:
s += ",%s=:%s" % (param, param)
else:
s = "%s=:%s" % (param, param)
if no_cat == '0':
query = "INSERT INTO categories SET %s" % s
else:
new_values['no_cat'] = no_cat
query = "UPDATE categories SET %s WHERE no_cat = :no_cat;" % s
execute_query(request, query, new_values)
def delete_categorie(request, no_cat):
query = "DELETE FROM categories WHERE no_cat = :no_cat ;"
execute_query(request, query, {'no_cat': no_cat})
def get_classes(request, classe):
if classe == '0':
query = """SELECT * FROM classes ORDER BY ordre"""
results = request.dbsession.execute(query).fetchall()
else:
# lire la classe par son identifiant
query = """SELECT * FROM classes WHERE classe=:classe;"""
results = request.dbsession.execute(query, {'classe': classe}).first()
return results

View File

@@ -44,38 +44,3 @@ def delete_doc(request, doc_id):
query = "delete from docs where doc_id = :doc_id;"
results = request.dbsession.execute(query, {'doc_id': doc_id})
def get_categories(request, no_cat):
if no_cat == '0':
query = "SELECT * FROM categories ORDER BY categorie"
results = request.dbsession.execute(query).fetchall()
else:
# lire le actif par son identifiant
query = """SELECT * FROM categories WHERE no_cat=:no_cat;"""
results = request.dbsession.execute(query, {'no_cat': no_cat}).first()
return results
def get_categories_bytype(request, type):
# lire le actif par son identifiant
query = """SELECT * FROM categories WHERE type=:type;"""
results = request.dbsession.execute(query, {'type': type}).fetchall()
return results
def update_categorie(request, no_cat, new_values):
# formater les champs
s = ''
for param in new_values.keys():
if s:
s += ",%s=:%s" % (param, param)
else:
s = "%s=:%s" % (param, param)
if no_cat == '0':
query = "INSERT INTO categories SET %s" % s
else:
new_values['no_cat'] = no_cat
query = "UPDATE categories SET %s WHERE no_cat = :no_cat;" % s
execute_query(request, query, new_values)
def delete_categorie(request, no_cat):
query = "DELETE FROM categories WHERE no_cat = :no_cat ;"
execute_query(request, query, {'no_cat': no_cat})

View File

@@ -4,11 +4,12 @@ def includeme(config):
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('categorie_edit', '/categorie_edit/{no_cat}')
# actifs
config.add_route('actifs_list', '/actifs_list')
config.add_route('actif_edit', '/actif_edit/{no_id}')
config.add_route('actif2_edit', '/actif2_edit/{no_id}')
config.add_route('allocation_list', '/allocation_list')
config.add_route('allocation_edit', '/allocation_edit/{no_cat}')
# members
config.add_route('changer_mdp', '/changer_mdp')
config.add_route('envoyer_mdp', '/envoyer_mdp')

View File

@@ -21,7 +21,7 @@
</div>
</div>
<div class="form-group">
<label class="col-xs-2 control-label">Symbole</label>
<label class="col-xs-2 control-label">Symbole Yahoo</label>
<div class="col-xs-3">
<input class="form-control" type="text" name="symbole"
value="${actif.symbole}" placeholder="15 caractères maximum"
@@ -32,16 +32,6 @@
data-fv-stringlength-message="15 caractères maximum" />
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-2" for="categorie">Catégorie</label>
<div class="col-xs-3">
<select class="form-control" id="categorie" name="categorie">
<div tal:repeat="item categories_list">
<option value="${item.categorie}" tal:attributes="selected actif.categorie==item.categorie and 'selected' or None">${item.categorie}</option>
</div>
</select>
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-2" for="nombre">Nombre</label>
<div class="col-xs-2">

View File

@@ -7,7 +7,7 @@
<div class="form-group">
<div class="form-group">
<button class="btn btn-primary" type="submit" name="form.submitted">
<span class="glyphicon glyphicon-refresh"></span> MAJ du portefueille</button>
<span class="glyphicon glyphicon-refresh"></span> MAJ du portefeuille</button>
<a href="#" class="btn btn-success" role="button"
data-toggle="modal" data-target="#choixTypeActif"><span class="glyphicon glyphicon-plus"></span> Nouvel actif</a>
</div>
@@ -31,7 +31,7 @@
</thead>
<tbody>
<tr tal:repeat="ligne items">
<td class="${ligne.bg}">${ligne.categorie}</td>
<td class="${ligne.bg_color}">${ligne.categorie}</td>
<td>${ligne.symbole}</td>
<td tal:condition="ligne.type=='ACTION'"><a href="actif_edit/${ligne.no_id}">${ligne.libelle}</a></td>
<td tal:condition="ligne.type<>'ACTION'"><a href="actif2_edit/${ligne.no_id}">${ligne.libelle}</a></td>

View File

@@ -0,0 +1,62 @@
<metal:block use-macro="main_template">
<div metal:fill-slot="content">
<div tal:condition="message" tal:content="message" class="alert alert-danger" />
<br />
<div class="row">
<form id="categorie_edit-form" class="form-horizontal" action="${url}" method="post" tal:condition="categorie"
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="col-xs-2 control-label">Classe</label>
<div class="col-xs-2">
<select class="form-control" id="categorie" name="categorie">
<div tal:repeat="item classes_list">
<option value="${item.classe}" tal:attributes="selected categorie.categorie==item.classe and 'selected' or None">${item.classe}</option>
</div>
</select>
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-2" for="pc_cible">Pourcentage cible</label>
<div class="col-xs-2">
<input class="form-control" type="text" id="pc_cible" name="pc_cible" value="${categorie.pc_cible}"
data-fv-digits="true"
data-fv-digits-message="Le nombre doit être composé que de chiffres" />
</div>
</div>
<br />
<div class="form-group">
<div class="col-xs-offset-2 col-xs-10">
<div class="form-group">
<a class="btn btn-default" href="${request.application_url}/categories_list">
<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>
<button class="btn btn-warning" type="submit" name="form.deleted"
tal:condition="categorie.no_cat <> 0">
<span class="glyphicon glyphicon-remove"></span> Supprimer</button>
</div>
</div>
</div>
</form>
<br />
<br />
</div> <!-- row -->
<script>
$(document).ready(function() {
$('#categorie_edit-form').formValidation();
$('form input').on('keypress', function(e) {
return e.which !== 13;
});
});
</script>
</div>
</metal:block>

View File

@@ -0,0 +1,38 @@
<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-md-6">
<p>
<a href="allocation_edit/0" class="btn btn-success" role="button">
<span class="glyphicon glyphicon-plus"></span> Nouvelle catégorie</a>
</p>
<table id="categories_list" class="table table-condensed table-bordered">
<thead>
<tr>
<th>Classe</th>
<th class="text-right">% cible</th>
<th class="text-center">Type</th>
</tr>
</thead>
<tbody>
<tr tal:repeat="item items">
<td class="${item.bg_color}"><a href="allocation_edit/${item.no_cat}">${item.categorie}</a></td>
<td class="text-right">${item.pc_cible} %</td>
<td class="text-center">${item.type}</td>
</tr>
<tr>
<td class="text-right"><b>Total</b></td>
<td class="text-right"><b>${total} %</b></td>
<td></td>
</tr>
</tbody>
</table>
</div>
</div>
</div><!-- content -->
</metal:block>

View File

@@ -18,25 +18,22 @@
</thead>
<tbody>
<tr tal:repeat="item items">
<td class="${item.bg}"><a href="categorie_edit/${item.no_cat}">${item.categorie}</a></td>
<td class="${item.bg_color}">${item.categorie}</td>
<td class="text-right">${item.pc_cible} %</td>
<td class="text-right">${layout.to_percent(item.pc_atteint)}</td>
<td class="text-right">${layout.to_percent(item.pc_atteint - item.pc_cible)}</td>
<td tal:condition="(item.pc_atteint - item.pc_cible)>=0" class="text-right" style="color: green;">${layout.to_percent(item.pc_atteint - item.pc_cible)}</td>
<td tal:condition="(item.pc_atteint - item.pc_cible) <0" class="text-right" style="color: red;">${layout.to_percent(item.pc_atteint - item.pc_cible)}</td>
<td class="text-right">${layout.to_euro(item.valeur)}</td>
</tr>
</tbody>
</table>
</div>
<p>
<a href="categorie_edit/0" class="btn btn-success" role="button">
<span class="glyphicon glyphicon-plus"></span> Nouvelle catégorie</a>
</p>
</div>
<div class="row">
<h3>+ diversification + bas coût</h3>
<h3>+ Diversification à coût minimal</h3>
<p>"<i>Diversification is not determined by the number of securities held.</i>"
<a hhref="http://www.etf.com/sections/index-investor-corner">Larry Swedroe</a></p>
<a href="http://www.etf.com/sections/index-investor-corner" target="_blank">Larry Swedroe</a></p>
<div class="col-md-8">
<table id="actifs_list" class="table table-condensed table-bordered">
<thead>
@@ -51,7 +48,7 @@
</thead>
<tbody>
<tr tal:repeat="ligne actifs">
<td class="${ligne.bg}">${ligne.categorie}</td>
<td class="${ligne.bg_color}">${ligne.categorie}</td>
<td>${ligne.libelle}</td>
<td class="text-right">${layout.to_euro(ligne.valeur)}</td>
<td tal:condition="ligne.plus_value>=0" class="text-right" style="color: green;">${layout.to_euro(ligne.plus_value)}</td>

View File

@@ -54,8 +54,8 @@
</div>
<div class="collapse navbar-collapse" id="myNavbar" tal:condition="not layout.isAnonymous()">
<ul class="nav navbar-nav navbar-right">
<li><a href="${request.application_url}/">ALLOCATION</a></li>
<li><a href="${request.application_url}/actifs_list">ACTIFS</a></li>
<li><a href="${request.application_url}/allocation_list">ALLOCATION</a></li>
<li><a href="${request.application_url}/doc_list">DOCS</a></li>
${panel('dropdown_menu_panel')}
</ul>

View File

@@ -124,8 +124,6 @@ def actif_edit(request):
new_values['cours'] = sym.get_price()
new_values['devise'] = sym.get_currency()
# ajouter son type
new_values['type'] = 'ACTION'
update_actif(request, no_id, new_values)
request.session.flash(u"La fiche a été mise à jour avec succès.", 'success')
return HTTPFound(location=request.route_url('actifs_list'))
@@ -179,8 +177,6 @@ def actif2_edit(request):
if new_values:
new_values['nombre'] = 1000
new_values['devise'] = 'EUR'
# ajouter son type
new_values['type'] = 'AUTRE'
update_actif(request, no_id, new_values)
request.session.flash(u"La fiche a été mise à jour avec succès.", 'success')
return HTTPFound(location=request.route_url('actifs_list'))
@@ -197,3 +193,73 @@ def actif2_edit(request):
'categories_list': categories_list,
'message': message,
}
@view_config(route_name='allocation_list', renderer='../templates/actifs/allocation_list.pt', permission='view')
def allocation_list(request):
message = ''
# lire les categories
items = get_categories(request, '0')
# calculer % total
total = 0
for item in items:
total += item.pc_cible
if total <> 100:
message = u'Attention, le total de votre répartition cible ne fait pas 100%.'
return {
'page_title': u"Allocation d'actifs",
'message': message,
'items': items,
'total': total,
}
@view_config(route_name='allocation_edit', renderer='../templates/actifs/allocation_edit.pt', permission='view')
def allocation_edit(request):
no_cat = request.matchdict['no_cat']
url = request.route_url('allocation_edit', no_cat=no_cat)
message = ''
# lire les classes
classes_list = get_classes(request, '0')
if no_cat == '0':
# nouveau
categorie = {}
categorie['no_cat'] = '0'
categorie['categorie'] = ''
categorie['type'] = 'ACTION'
categorie['pc_cible'] = '0'
page_title= u'Nouvelle catégorie'
else:
# lire la fiche de la categorie
categorie = get_categories(request, no_cat)
if not categorie:
request.session.flash(u"Catégorie non trouvé : %s" % no_cat, 'warning')
return HTTPFound(location=request.route_url('allocation_list'))
page_title= u"Catégorie : %s" % (categorie.categorie)
if 'form.submitted' in request.params:
new_values = {}
for param, db_value in categorie.items():
if param in request.params and request.params[param] != db_value:
new_values[param] = request.params[param]
if new_values:
update_categorie(request, no_cat, new_values)
request.session.flash(u"La fiche a été mise à jour avec succès.", 'success')
return HTTPFound(location=request.route_url('allocation_list'))
if 'form.deleted' in request.params:
delete_categorie(request, no_cat)
request.session.flash(u"La fiche a été supprimée avec succès.", 'success')
return HTTPFound(location=request.route_url('allocation_list'))
return {
'page_title': page_title,
'url': url,
'categorie': categorie,
'classes_list': classes_list,
'message': message,
}

View File

@@ -28,6 +28,7 @@ from ..security import groupfinder
from ..models.default import *
from ..models.actifs import (
get_actifs,
get_categories,
)
from ..models.members import (
get_member_by_email,
@@ -72,13 +73,6 @@ def home(request):
# lire les categories
items = get_categories(request, '0')
# calculer % total
total = 0
for item in items:
total += item.pc_cible
if total <> 100:
message = u'Attention, le total de votre répartition cible ne fait pas 100%.'
# lire les actifs
actifs = get_actifs(request, '0')
@@ -117,12 +111,12 @@ def doc_edit(request):
message = u""
if doc_id == '0':
titre = "Nouvelle doc"
titre = "Nouveau doc"
intitule = u""
texte = u""
theme = u""
else:
titre = "Modifier la doc : %s" % str(doc_id)
titre = "Modifier : %s" % str(doc_id)
doc = get_docs(request, doc_id)
intitule = doc.intitule
texte = doc.texte
@@ -153,7 +147,7 @@ def doc_edit(request):
'intitule': intitule,
'texte': texte,
'theme': theme,
'themes': ["CONDUITE","EXAMEN","RESULTAT","INTERNE"],
'themes': ["MAISON","FINANCE","VOITURE"],
}
@view_config(route_name='doc_view', renderer='../templates/doc_view.pt', permission='view')
@@ -194,50 +188,3 @@ gestion.entreprise-dumas.com
mailer.send_immediately(message)
@view_config(route_name='categorie_edit', renderer='../templates/categorie_edit.pt', permission='view')
def categorie_edit(request):
no_cat = request.matchdict['no_cat']
url = request.route_url('categorie_edit', no_cat=no_cat)
message = ''
types_list = ['ACTION', 'AUTRE']
if no_cat == '0':
# nouveau
categorie = {}
categorie['no_cat'] = '0'
categorie['categorie'] = ''
categorie['type'] = 'ACTION'
categorie['pc_cible'] = '0'
page_title= u'Nouvelle catégorie'
else:
# lire la fiche de la categorie
categorie = get_categories(request, no_cat)
if not categorie:
request.session.flash(u"Catégorie non trouvé : %s" % no_cat, 'warning')
return HTTPFound(location=request.route_url('home'))
page_title= u"Catégorie : %s" % (categorie.categorie)
if 'form.submitted' in request.params:
new_values = {}
for param, db_value in categorie.items():
if param in request.params and request.params[param] != db_value:
new_values[param] = request.params[param]
if new_values:
update_categorie(request, no_cat, new_values)
request.session.flash(u"La fiche a été mise à jour avec succès.", 'success')
return HTTPFound(location=request.route_url('home'))
if 'form.deleted' in request.params:
delete_categorie(request, no_cat)
request.session.flash(u"La fiche a été supprimée avec succès.", 'success')
return HTTPFound(location=request.route_url('home'))
return {
'page_title': page_title,
'url': url,
'categorie': categorie,
'types_list': types_list,
'message': message,
}