Ajout graphiques CA par groupes
This commit is contained in:
3
.vscode/settings.json
vendored
3
.vscode/settings.json
vendored
@@ -1,2 +1,3 @@
|
||||
{
|
||||
{
|
||||
"html.validate.scripts": false
|
||||
}
|
||||
@@ -1,60 +1,60 @@
|
||||
Metadata-Version: 2.1
|
||||
Name: mondumas
|
||||
Version: 1.0
|
||||
Summary: mondumas
|
||||
Home-page: UNKNOWN
|
||||
Author:
|
||||
Author-email:
|
||||
License: UNKNOWN
|
||||
Keywords: web wsgi bfg pylons pyramid
|
||||
Platform: UNKNOWN
|
||||
Classifier: Programming Language :: Python
|
||||
Classifier: Framework :: Pyramid
|
||||
Classifier: Topic :: Internet :: WWW/HTTP
|
||||
Classifier: Topic :: Internet :: WWW/HTTP :: WSGI :: Application
|
||||
Provides-Extra: testing
|
||||
|
||||
# README #
|
||||
|
||||
Cette application web permet aux collaborateurs de l'entreprise Dumas :
|
||||
|
||||
- de consulter et de gérer les dossiers des clients depuis leur tablette
|
||||
- de créer un rapport de fuite et le faire signer par le client
|
||||
|
||||
Elle est développée avec les composants open source suivants :
|
||||
|
||||
## Backend
|
||||
|
||||
- [Python](https://www.python.org/downloads/) 3.7
|
||||
- [Pyramid web framework](https://trypyramid.com/) 1.10
|
||||
- [MySQL server](https://mysql.com/) 5.7 sur Windows Server 2008 R2 Standard
|
||||
- [Apache web server](https://apache.org/) 2.4 sur Debian GNU/Linux 9 (stretch)
|
||||
|
||||
## Frontend
|
||||
|
||||
- [Bootstrap framework](https://getbootstrap.com/) for CSS 3.3.7
|
||||
- [Jquery](https://jquery.com/download/) for JavaScript 3.2.1
|
||||
- Chameleon templates
|
||||
- [FormValidation](https://formvalidation.io/) form validator 0.7.0
|
||||
|
||||
## Jquery Plugins
|
||||
|
||||
- [DataTables](https://datatables.net/) 1.10.20
|
||||
- [Fullcalendar](https://fullcalendar.io/) 3.9.0
|
||||
- [fullcalendar Scheduler](https://fullcalendar.io/) 1.9.4
|
||||
- [Jquery-ui et jquery-ui-themes](https://jqueryui.com/) 1.12.1
|
||||
- [jSignature](https://willowsystems.github.io/jSignature)
|
||||
- [less.js](http://lesscss.org/) 3.11.1
|
||||
- [moment.js](https://momentjs.com/) with-locales.min.js
|
||||
|
||||
|
||||
[Learn Markdown](https://bitbucket.org/tutorials/markdowndemo)
|
||||
|
||||
|
||||
|
||||
0.0
|
||||
---
|
||||
|
||||
- Initial version
|
||||
|
||||
|
||||
Metadata-Version: 2.1
|
||||
Name: mondumas
|
||||
Version: 1.0
|
||||
Summary: mondumas
|
||||
Home-page: UNKNOWN
|
||||
Author:
|
||||
Author-email:
|
||||
License: UNKNOWN
|
||||
Keywords: web wsgi bfg pylons pyramid
|
||||
Platform: UNKNOWN
|
||||
Classifier: Programming Language :: Python
|
||||
Classifier: Framework :: Pyramid
|
||||
Classifier: Topic :: Internet :: WWW/HTTP
|
||||
Classifier: Topic :: Internet :: WWW/HTTP :: WSGI :: Application
|
||||
Provides-Extra: testing
|
||||
|
||||
# README #
|
||||
|
||||
Cette application web permet aux collaborateurs de l'entreprise Dumas :
|
||||
|
||||
- de consulter et de gérer les dossiers des clients depuis leur tablette
|
||||
- de créer un rapport de fuite et le faire signer par le client
|
||||
|
||||
Elle est développée avec les composants open source suivants :
|
||||
|
||||
## Backend
|
||||
|
||||
- [Python](https://www.python.org/downloads/) 3.7
|
||||
- [Pyramid web framework](https://trypyramid.com/) 1.10
|
||||
- [MySQL server](https://mysql.com/) 5.7 sur Windows Server 2008 R2 Standard
|
||||
- [Apache web server](https://apache.org/) 2.4 sur Debian GNU/Linux 9 (stretch)
|
||||
|
||||
## Frontend
|
||||
|
||||
- [Bootstrap framework](https://getbootstrap.com/) for CSS 3.3.7
|
||||
- [Jquery](https://jquery.com/download/) for JavaScript 3.2.1
|
||||
- Chameleon templates
|
||||
- [FormValidation](https://formvalidation.io/) form validator 0.7.0
|
||||
|
||||
## Jquery Plugins
|
||||
|
||||
- [DataTables](https://datatables.net/) 1.10.20
|
||||
- [Fullcalendar](https://fullcalendar.io/) 3.9.0
|
||||
- [fullcalendar Scheduler](https://fullcalendar.io/) 1.9.4
|
||||
- [Jquery-ui et jquery-ui-themes](https://jqueryui.com/) 1.12.1
|
||||
- [jSignature](https://willowsystems.github.io/jSignature)
|
||||
- [less.js](http://lesscss.org/) 3.11.1
|
||||
- [moment.js](https://momentjs.com/) with-locales.min.js
|
||||
|
||||
|
||||
[Learn Markdown](https://bitbucket.org/tutorials/markdowndemo)
|
||||
|
||||
|
||||
|
||||
0.0
|
||||
---
|
||||
|
||||
- Initial version
|
||||
|
||||
|
||||
|
||||
@@ -25,6 +25,7 @@ mondumas/models/default.py
|
||||
mondumas/models/devis.py
|
||||
mondumas/models/dossier.py
|
||||
mondumas/models/parametres.py
|
||||
mondumas/models/stats.py
|
||||
mondumas/models/utils.py
|
||||
mondumas/scripts/__init__.py
|
||||
mondumas/views/__init__.py
|
||||
@@ -34,4 +35,5 @@ mondumas/views/devis.py
|
||||
mondumas/views/dossier.py
|
||||
mondumas/views/notfound.py
|
||||
mondumas/views/parametres.py
|
||||
mondumas/views/stats.py
|
||||
mondumas/views/utils.py
|
||||
@@ -1,61 +1,78 @@
|
||||
# -*- coding: utf8 -*-
|
||||
from sqlalchemy import text
|
||||
from sqlalchemy.ext.declarative import declarative_base
|
||||
from sqlalchemy.orm import (
|
||||
scoped_session,
|
||||
sessionmaker,
|
||||
)
|
||||
from zope.sqlalchemy import (
|
||||
ZopeTransactionExtension,
|
||||
mark_changed
|
||||
)
|
||||
|
||||
from datetime import *
|
||||
import dateutil.relativedelta
|
||||
import transaction
|
||||
|
||||
def execute_query(request, query, params):
|
||||
"""Execute query and mark session as changed"""
|
||||
request.dbsession.execute(query, params)
|
||||
mark_changed(request.dbsession)
|
||||
transaction.commit()
|
||||
|
||||
def get_stats_dd(request, societe):
|
||||
|
||||
query = """SELECT societe, year(date) as Annee, COUNT(*) as Total,
|
||||
SUM(IF(status = '', 1, 0)) AS A_traiter,
|
||||
SUM(IF(status = 'Devis', 1, 0)) AS Devis,
|
||||
SUM(IF(status = 'Commandé', 1, 0)) AS Commande,
|
||||
SUM(IF(status = 'Facturé', 1, 0)) AS Facture,
|
||||
SUM(IF(status = 'Régl part.', 1, 0)) AS ReglePart,
|
||||
SUM(IF(status = 'Réglée', 1, 0)) AS Regle
|
||||
FROM dem_devis where societe=:societe group by societe, year(date) order by year(date) desc;"""
|
||||
results = request.dbsession.execute(query, {'societe': societe}).fetchall()
|
||||
return results
|
||||
|
||||
def get_stats_delais(request, societe, datedeb, datefin, groupe, id_chart):
|
||||
# lire les examens sur 12 mois glissants par moniteur
|
||||
query = """SELECT * FROM stats_delais
|
||||
WHERE societe=:societe AND id=:id_chart AND group1 >= :datedeb AND group1 <= :datefin AND group2=:groupe order by group1;"""
|
||||
results = request.dbsession.execute(query, {'societe': societe, 'id_chart': id_chart, 'datedeb': datedeb.strftime("%Y%m"),
|
||||
'datefin': datefin.strftime("%Y%m"), 'groupe': groupe})
|
||||
return results.fetchall()
|
||||
|
||||
def get_stats_delai_groupe(request, societe, datedeb, datefin):
|
||||
query = """SELECT group2, group2_lib FROM stats_delais
|
||||
WHERE societe=:societe AND group1 >= :datedeb AND group1 <= :datefin GROUP BY group2 ORDER BY group2_lib;"""
|
||||
results = request.dbsession.execute(query, {'societe': societe, 'datedeb': datedeb.strftime("%Y%m"), 'datefin': datefin.strftime("%Y%m")})
|
||||
return results.fetchall()
|
||||
|
||||
def get_ca_groupe_12m(request, societe):
|
||||
|
||||
query = """SELECT DATE_FORMAT(date, "%Y%m") as yymm,
|
||||
DATE_FORMAT(date, "%M") as mois,
|
||||
SUM(IF(groupe = 'AXA', totalht, 0)) AS AXA_ca,
|
||||
sum(IF(groupe = 'AXA', 1, 0)) AS AXA_nb,
|
||||
SUM(IF(groupe = 'MAIF', totalht, 0)) AS MAIF
|
||||
FROM bddevfac.facture
|
||||
WHERE societe='PE' and date >= "2020/07/01" and date <= "2021/06/30" GROUP BY yymm;"""
|
||||
results = request.dbsession.execute(query, {'societe': societe}).fetchall()
|
||||
return results
|
||||
|
||||
# -*- coding: utf8 -*-
|
||||
from sqlalchemy import text
|
||||
from sqlalchemy.ext.declarative import declarative_base
|
||||
from sqlalchemy.orm import (
|
||||
scoped_session,
|
||||
sessionmaker,
|
||||
)
|
||||
from zope.sqlalchemy import (
|
||||
ZopeTransactionExtension,
|
||||
mark_changed
|
||||
)
|
||||
|
||||
from datetime import *
|
||||
from dateutil.relativedelta import *
|
||||
import dateutil.relativedelta
|
||||
import transaction
|
||||
|
||||
def execute_query(request, query, params):
|
||||
"""Execute query and mark session as changed"""
|
||||
request.dbsession.execute(query, params)
|
||||
mark_changed(request.dbsession)
|
||||
transaction.commit()
|
||||
|
||||
def get_stats_dd(request, societe):
|
||||
|
||||
query = """SELECT societe, year(date) as Annee, COUNT(*) as Total,
|
||||
SUM(IF(status = '', 1, 0)) AS A_traiter,
|
||||
SUM(IF(status = 'Devis', 1, 0)) AS Devis,
|
||||
SUM(IF(status = 'Commandé', 1, 0)) AS Commande,
|
||||
SUM(IF(status = 'Facturé', 1, 0)) AS Facture,
|
||||
SUM(IF(status = 'Régl part.', 1, 0)) AS ReglePart,
|
||||
SUM(IF(status = 'Réglée', 1, 0)) AS Regle
|
||||
FROM dem_devis where societe=:societe group by societe, year(date) order by year(date) desc;"""
|
||||
results = request.dbsession.execute(query, {'societe': societe}).fetchall()
|
||||
return results
|
||||
|
||||
def get_stats_delais(request, societe, datedeb, datefin, groupe, id_chart):
|
||||
# lire les examens sur 12 mois glissants par moniteur
|
||||
query = """SELECT * FROM stats_delais
|
||||
WHERE societe=:societe AND id=:id_chart AND group1 >= :datedeb AND group1 <= :datefin AND group2=:groupe order by group1;"""
|
||||
results = request.dbsession.execute(query, {'societe': societe, 'id_chart': id_chart, 'datedeb': datedeb.strftime("%Y%m"),
|
||||
'datefin': datefin.strftime("%Y%m"), 'groupe': groupe})
|
||||
return results.fetchall()
|
||||
|
||||
def get_stats_delai_groupe(request, societe, datedeb, datefin):
|
||||
query = """SELECT group2, group2_lib FROM stats_delais
|
||||
WHERE societe=:societe AND group1 >= :datedeb AND group1 <= :datefin GROUP BY group2 ORDER BY group2_lib;"""
|
||||
results = request.dbsession.execute(query, {'societe': societe, 'datedeb': datedeb.strftime("%Y%m"), 'datefin': datefin.strftime("%Y%m")})
|
||||
return results.fetchall()
|
||||
|
||||
def get_ca_groupe_12m(request, societe, datedeb, datefin):
|
||||
|
||||
query = """SELECT DATE_FORMAT(date, "%Y%m") as yymm,
|
||||
DATE_FORMAT(date, "%M") as mois,
|
||||
DATE_FORMAT(date, "%M %Y") as date,
|
||||
SUM(IF(groupe = 'AXA', totalht, 0)) AS AXA_ca,
|
||||
SUM(IF(groupe = 'AXA', 1, 0)) AS AXA_nb,
|
||||
SUM(IF(groupe = 'MAIF', totalht, 0)) AS MAIF_ca,
|
||||
SUM(IF(groupe = 'MAIF', 1, 0)) AS MAIF_nb
|
||||
FROM bddevfac.facture
|
||||
WHERE societe=:societe and date >= :datedeb and date <= :datefin GROUP BY yymm;"""
|
||||
results = request.dbsession.execute(query, {'societe': societe, 'datedeb': datedeb.strftime("%Y%m"), 'datefin': datefin.strftime("%Y%m")})
|
||||
return results.fetchall()
|
||||
|
||||
def get_ca_groupe_3y(request, societe, datedeb):
|
||||
|
||||
date2 = datedeb + relativedelta(years=-1)
|
||||
date3 = datedeb + relativedelta(years=-2)
|
||||
|
||||
query = """SELECT groupe,
|
||||
SUM(IF (date_format(date, '%Y') = :date_n-2, TOTALHT, 0)) as Annee1,
|
||||
SUM(IF (date_format(date, '%Y') = :date_n-1, TOTALHT, 0)) as Annee2,
|
||||
SUM(IF (date_format(date, '%Y') = :date_n, TOTALHT, 0)) as Annee3
|
||||
FROM bddevfac.facture
|
||||
WHERE societe=:societe GROUP BY groupe;"""
|
||||
results = request.dbsession.execute(query, {'societe': societe, 'date_n': date3.strftime("%Y"), 'date_n-1': date2.strftime("%Y"), 'date_n': datedeb.strftime("%Y")})
|
||||
return results.fetchall()
|
||||
|
||||
|
||||
@@ -1,96 +1,89 @@
|
||||
<metal:block use-macro="main_template">
|
||||
<div metal:fill-slot="content">
|
||||
|
||||
<br />
|
||||
<div class="row">
|
||||
<form method="POST" id="frm" class="form-horizontal">
|
||||
<div class="form-group">
|
||||
<label class="control-label col-sm-2">Societe</label>
|
||||
<div class="col-sm-4">
|
||||
<select class="form-control" id="societe" name="societe" onChange="$('#frm').submit()">
|
||||
<tal:block tal:repeat="item societes">
|
||||
<option value="${item}" tal:attributes="selected societe==item and 'selected' or None"> ${item}</option>
|
||||
</tal:block>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<!-- graphique 1ER CONTACT -->
|
||||
<div id="barChart_annee1" style="width: 100%; height: 500px;"></div>
|
||||
</div>
|
||||
|
||||
|
||||
<script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script>
|
||||
<script type="text/javascript">
|
||||
google.charts.load("current", {packages:["corechart", 'bar']});
|
||||
google.charts.setOnLoadCallback(drawChart);
|
||||
var dataSet_annee1 = ${barChart_annee1};
|
||||
var dataSet_annee2 = ${barChart_annee2};
|
||||
var dataSet_annee3 = ${barChart_annee3};
|
||||
var dataSet_annee4 = ${barChart_annee4};
|
||||
|
||||
function drawChart() {
|
||||
var data_annee1 = google.visualization.arrayToDataTable(dataSet_annee1);
|
||||
var data_annee2 = google.visualization.arrayToDataTable(dataSet_annee2);
|
||||
var data_annee3 = google.visualization.arrayToDataTable(dataSet_annee3);
|
||||
var data_annee4 = google.visualization.arrayToDataTable(dataSet_annee4);
|
||||
|
||||
var options_annee1 = {
|
||||
title: '${title1}',
|
||||
seriesType: 'bars',
|
||||
series: {1: {type: 'line'}},
|
||||
vAxis: {
|
||||
viewWindow: {
|
||||
min:0
|
||||
}
|
||||
}
|
||||
};
|
||||
var options_annee2 = {
|
||||
title: '${title2}',
|
||||
seriesType: 'bars',
|
||||
series: {1: {type: 'line'}},
|
||||
vAxis: {
|
||||
viewWindow: {
|
||||
min:0
|
||||
}
|
||||
}
|
||||
};
|
||||
var options_annee3 = {
|
||||
title: '${title3}',
|
||||
seriesType: 'bars',
|
||||
series: {1: {type: 'line'}},
|
||||
vAxis: {
|
||||
viewWindow: {
|
||||
min:0
|
||||
}
|
||||
}
|
||||
};
|
||||
var options_annee4 = {
|
||||
title: '${title4}',
|
||||
seriesType: 'bars',
|
||||
series: {1: {type: 'line'}},
|
||||
vAxis: {
|
||||
viewWindow: {
|
||||
min:0
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
var chart_annee1 = new google.visualization.ComboChart(document.getElementById('barChart_annee1'));
|
||||
chart_annee1.draw(data_annee1, options_annee1);
|
||||
var chart_annee2 = new google.visualization.ComboChart(document.getElementById('barChart_annee2'));
|
||||
chart_annee2.draw(data_annee2, options_annee2);
|
||||
var chart_annee3 = new google.visualization.ComboChart(document.getElementById('barChart_annee3'));
|
||||
chart_annee3.draw(data_annee3, options_annee3);
|
||||
var chart_annee4 = new google.visualization.ComboChart(document.getElementById('barChart_annee4'));
|
||||
chart_annee4.draw(data_annee4, options_annee4);
|
||||
}
|
||||
</script>
|
||||
|
||||
</div><!-- content -->
|
||||
</metal:block>
|
||||
|
||||
|
||||
<metal:block use-macro="main_template">
|
||||
<div metal:fill-slot="content">
|
||||
|
||||
<br />
|
||||
<div class="row">
|
||||
<form method="POST" id="frm" class="form-horizontal">
|
||||
<div class="form-group">
|
||||
<label class="control-label col-sm-2">Societe</label>
|
||||
<div class="col-sm-4">
|
||||
<select class="form-control" id="societe" name="societe" onChange="$('#frm').submit()">
|
||||
<tal:block tal:repeat="item societes">
|
||||
<option value="${item}" tal:attributes="selected societe==item and 'selected' or None"> ${item}</option>
|
||||
</tal:block>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<!-- Histogramme CA sur 12 mois par groupe -->
|
||||
<div id="chart_ca_12m" style="width: 100%; height: 500px;"></div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<!-- camembert 1 -->
|
||||
<div class="col-sm-4">
|
||||
<div id="chart_ca_3y_1" style="width: 100%; height: 500px;"></div>
|
||||
</div>
|
||||
<div class="col-sm-4">
|
||||
<div id="chart_ca_3y_2" style="width: 100%; height: 500px;"></div>
|
||||
</div>
|
||||
<div class="col-sm-4">
|
||||
<div id="chart_ca_3y_3" style="width: 100%; height: 500px;"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script>
|
||||
<script type="text/javascript">
|
||||
google.charts.load("current", {packages:["corechart"]});
|
||||
google.charts.setOnLoadCallback(drawChart);
|
||||
var dataSet_ca_12m = ${chart_ca_12m};
|
||||
|
||||
var dataSet_ca_3y_1 = ${chart_ca_3y_1};
|
||||
var dataSet_ca_3y_2 = ${chart_ca_3y_2};
|
||||
var dataSet_ca_3y_3 = ${chart_ca_3y_3};
|
||||
|
||||
function drawChart() {
|
||||
var data_ca_12m = google.visualization.arrayToDataTable(dataSet_ca_12m);
|
||||
|
||||
var data_ca_3y_1 = google.visualization.arrayToDataTable(dataSet_ca_3y_1);
|
||||
var data_ca_3y_2 = google.visualization.arrayToDataTable(dataSet_ca_3y_2);
|
||||
var data_ca_3y_3 = google.visualization.arrayToDataTable(dataSet_ca_3y_3);
|
||||
|
||||
var options_ca_12m = {
|
||||
title: '${title}',
|
||||
vAxis: {title: "Chiffre d'Affaires en €"},
|
||||
isStacked: true
|
||||
};
|
||||
|
||||
var options_ca_3y_1 = {
|
||||
title: '${title1}',
|
||||
};
|
||||
|
||||
var options_ca_3y_2 = {
|
||||
title: '${title2}',
|
||||
};
|
||||
|
||||
var options_ca_3y_3 = {
|
||||
title: '${title3}',
|
||||
};
|
||||
|
||||
var chart_ca_12m = new google.visualization.SteppedAreaChart(document.getElementById('chart_ca_12m'));
|
||||
chart_ca_12m.draw(data_ca_12m, options_ca_12m);
|
||||
|
||||
var chart_ca_3y_1 = new google.visualization.PieChart(document.getElementById('chart_ca_3y_1'));
|
||||
chart_ca_3y_1.draw(data_ca_3y_1, options_ca_3y_1);
|
||||
var chart_ca_3y_2 = new google.visualization.PieChart(document.getElementById('chart_ca_3y_2'));
|
||||
chart_ca_3y_2.draw(data_ca_3y_2, options_ca_3y_2);
|
||||
var chart_ca_3y_3 = new google.visualization.PieChart(document.getElementById('chart_ca_3y_3'));
|
||||
chart_ca_3y_3.draw(data_ca_3y_3, options_ca_3y_3);
|
||||
}
|
||||
</script>
|
||||
|
||||
</div><!-- content -->
|
||||
</metal:block>
|
||||
|
||||
|
||||
|
||||
@@ -1,207 +1,229 @@
|
||||
# -*- coding: utf8 -*-
|
||||
from pyramid.response import Response
|
||||
from pyramid.renderers import render, get_renderer
|
||||
from pyramid.view import (
|
||||
view_config,
|
||||
forbidden_view_config,
|
||||
)
|
||||
from pyramid.httpexceptions import (
|
||||
HTTPFound,
|
||||
HTTPNotFound,
|
||||
HTTPForbidden,
|
||||
)
|
||||
|
||||
from datetime import *
|
||||
from dateutil.relativedelta import *
|
||||
import json
|
||||
|
||||
from ..models.default import *
|
||||
from ..models.agenda import *
|
||||
from ..models.stats import *
|
||||
|
||||
@view_config(route_name='stats', renderer='../templates/stats/stats.pt', permission='view')
|
||||
def stats(request):
|
||||
logged_in = request.authenticated_userid.upper()
|
||||
# lire la fiche de l'utilisateur
|
||||
member = get_member_by_id(request, logged_in)
|
||||
access = member.access
|
||||
|
||||
return {
|
||||
'page_title': "Statistiques",
|
||||
'logged_in': logged_in,
|
||||
'access': access,
|
||||
}
|
||||
|
||||
@view_config(route_name='stats_dossiers', renderer='../templates/stats/stats_dossiers.pt', permission='view')
|
||||
def stats_dossiers(request):
|
||||
|
||||
societe = request.matchdict['societe']
|
||||
url = request.route_url('stats_dossiers', societe=societe)
|
||||
message = ''
|
||||
societes = ['PE','ME','PL','PO','CD']
|
||||
|
||||
# prendre en compte les paramètres de saisie
|
||||
if 'societe' in request.params:
|
||||
societe = request.params["societe"]
|
||||
url = request.route_url('stats_dossiers', societe=societe)
|
||||
|
||||
# lire les stats globales des demandes de devis
|
||||
stats_dossiers = get_stats_dd(request, societe)
|
||||
|
||||
liste=[]
|
||||
# construire la liste
|
||||
for item in stats_dossiers:
|
||||
total_facture = item.Facture + item.ReglePart + item.Regle
|
||||
total_devis = item.Devis + item.Commande + total_facture
|
||||
d = (str(item.Annee), str(item.Total), str(item.A_traiter), str(total_devis), str(item.Devis), str(total_facture), str(item.ReglePart), str(item.Regle))
|
||||
liste.append(d)
|
||||
|
||||
return {
|
||||
'page_title': "Stats : Dossiers par année",
|
||||
'url': url,
|
||||
'message': message,
|
||||
'dt_data': json.dumps(liste),
|
||||
'societes': societes,
|
||||
'societe': societe,
|
||||
}
|
||||
|
||||
@view_config(route_name='stats_delais', renderer='../templates/stats/stats_delais.pt', permission='view')
|
||||
def stats_delais(request):
|
||||
|
||||
societe = request.matchdict['societe']
|
||||
url = request.route_url('stats_delais', societe = societe)
|
||||
|
||||
datefin = date.today()
|
||||
# debut = aujourd'hui - 11 mois
|
||||
datedeb = datefin + relativedelta(months=-11)
|
||||
|
||||
societes = ['PE','ME','PL']
|
||||
# si societe a été changé par le user
|
||||
if 'societe' in request.params:
|
||||
societe = request.params["societe"]
|
||||
|
||||
# lire les groupes
|
||||
groupes = get_stats_delai_groupe(request, societe, datedeb, datefin)
|
||||
|
||||
# mémoriser le 1er de la liste
|
||||
groupe = groupes[0].group2
|
||||
|
||||
# si groupe a été changé par le user
|
||||
if 'groupe' in request.params:
|
||||
groupe = request.params["groupe"]
|
||||
|
||||
# lire les délais CONTACT du groupe
|
||||
items = get_stats_delais(request, societe, datedeb, datefin, groupe, 'delai_contact')
|
||||
barChart_annee1 = []
|
||||
barChart_annee1.append(('Mois', 'Moy. ' + groupe, {'role': 'annotation'}, { 'type':'string','role': 'tooltip'} , 'Moy. Dumas'))
|
||||
title1 = '1er CONTACT'
|
||||
for item in items:
|
||||
# construire la liste pour donut cible
|
||||
tooltip = item.group1_lib + '\nMoyennne: -'+str(round(item.moyenne))+' j\nDossiers: '+str(round(item.population))
|
||||
# ('+str(item.population)+')/n'
|
||||
d = (item.group1_lib[:3], round(item.moyenne), str(round(item.moyenne))+'j', tooltip, round(item.moy_ref))
|
||||
barChart_annee1.append(d)
|
||||
|
||||
# lire les délais RENDEZ-VOUS du groupe
|
||||
items = get_stats_delais(request, societe, datedeb, datefin, groupe, 'delai_rdv')
|
||||
barChart_annee2=[]
|
||||
barChart_annee2.append(('Mois', 'Moy. ' + groupe, {'role': 'annotation'}, { 'type':'string','role': 'tooltip'} , 'Moy. Dumas'))
|
||||
title2 = '1er RENDEZ-VOUS'
|
||||
for item in items:
|
||||
# construire la liste pour donut cible
|
||||
tooltip = item.group1_lib + '\nMoyennne: -'+str(round(item.moyenne))+' j\nDossiers: '+str(round(item.population))
|
||||
# ('+str(item.population)+')/n'
|
||||
d = (item.group1_lib[:3], round(item.moyenne), str(round(item.moyenne))+'j', tooltip, round(item.moy_ref))
|
||||
barChart_annee2.append(d)
|
||||
|
||||
# lire les délais DEVIS du groupe
|
||||
items = get_stats_delais(request, societe, datedeb, datefin, groupe, 'delai_devis')
|
||||
barChart_annee3=[]
|
||||
barChart_annee3.append(('Mois', 'Moy. ' + groupe, {'role': 'annotation'}, { 'type':'string','role': 'tooltip'} , 'Moy. Dumas'))
|
||||
title3 = '1er DEVIS'
|
||||
for item in items:
|
||||
# construire la liste pour donut cible
|
||||
tooltip = item.group1_lib + '\nMoyennne: -'+str(round(item.moyenne))+' j\nDossiers: '+str(round(item.population))
|
||||
# ('+str(item.population)+')/n'
|
||||
d = (item.group1_lib[:3], round(item.moyenne), str(round(item.moyenne))+'j', tooltip, round(item.moy_ref))
|
||||
barChart_annee3.append(d)
|
||||
|
||||
# lire les délais FACTURE du groupe
|
||||
items = get_stats_delais(request, societe, datedeb, datefin, groupe, 'delai_facture')
|
||||
barChart_annee4 = []
|
||||
barChart_annee4.append(('Mois', 'Moy. ' + groupe, {'role': 'annotation'}, { 'type':'string','role': 'tooltip'} , 'Moy. Dumas'))
|
||||
title4 = '1ère FACTURE'
|
||||
for item in items:
|
||||
# construire la liste pour donut cible
|
||||
tooltip = item.group1_lib + '\nMoyennne: -'+str(round(item.moyenne))+' j\nDossiers: '+str(round(item.population))
|
||||
# ('+str(item.population)+')/n'
|
||||
d = (item.group1_lib[:3], round(item.moyenne), str(round(item.moyenne))+'j', tooltip, round(item.moy_ref))
|
||||
barChart_annee4.append(d)
|
||||
|
||||
return {
|
||||
'page_title': "Délais / mois",
|
||||
'url': url,
|
||||
'barChart_annee1': json.dumps(barChart_annee1),
|
||||
'barChart_annee2': json.dumps(barChart_annee2),
|
||||
'barChart_annee3': json.dumps(barChart_annee3),
|
||||
'barChart_annee4': json.dumps(barChart_annee4),
|
||||
'title1': title1,
|
||||
'title2': title2,
|
||||
'title3': title3,
|
||||
'title4': title4,
|
||||
'societes': societes,
|
||||
'societe': societe,
|
||||
'groupes': groupes,
|
||||
'groupe': groupe,
|
||||
}
|
||||
|
||||
@view_config(route_name='ca_groupes_12m', renderer='../templates/stats/ca_groupes_12m.pt', permission='view')
|
||||
def ca_groupes_12m(request):
|
||||
|
||||
societe = request.matchdict['societe']
|
||||
url = request.route_url('stats_delais', societe = societe)
|
||||
|
||||
datefin = date.today()
|
||||
# debut = aujourd'hui - 11 mois
|
||||
datedeb = datefin + relativedelta(months=-11)
|
||||
|
||||
societes = ['PE','ME','PL']
|
||||
# si societe a été changé par le user
|
||||
if 'societe' in request.params:
|
||||
societe = request.params["societe"]
|
||||
|
||||
# lire les groupes
|
||||
groupes = get_stats_delai_groupe(request, societe, datedeb, datefin)
|
||||
|
||||
# mémoriser le 1er de la liste
|
||||
groupe = groupes[0].group2
|
||||
|
||||
# si groupe a été changé par le user
|
||||
if 'groupe' in request.params:
|
||||
groupe = request.params["groupe"]
|
||||
|
||||
# lire les délais CONTACT du groupe
|
||||
items = get_ca_groupe_12m(request, societe, datedeb, datefin, groupe, 'delai_contact')
|
||||
barChart_annee1 = []
|
||||
# titre des colonnes
|
||||
barChart_annee1.append(('Mois', 'AXA', {'role': 'annotation'}, { 'type':'string','role': 'tooltip'} , 'Moy. Dumas'))
|
||||
title1 = '1er CONTACT'
|
||||
for item in items:
|
||||
# construire la liste pour donut cible
|
||||
tooltip = item.group1_lib + '\nMoyennne: -'+str(round(item.moyenne))+' j\nDossiers: '+str(round(item.population))
|
||||
# ('+str(item.population)+')/n'
|
||||
d = (item.mois, round(item.moyenne), str(round(item.moyenne))+'j', tooltip, round(item.moy_ref))
|
||||
barChart_annee1.append(d)
|
||||
|
||||
|
||||
return {
|
||||
'page_title': "Délais / mois",
|
||||
'url': url,
|
||||
'barChart_annee1': json.dumps(barChart_annee1),
|
||||
'title1': title1,
|
||||
'societes': societes,
|
||||
'societe': societe,
|
||||
'groupes': groupes,
|
||||
'groupe': groupe,
|
||||
}
|
||||
|
||||
# -*- coding: utf8 -*-
|
||||
from pyramid.response import Response
|
||||
from pyramid.renderers import render, get_renderer
|
||||
from pyramid.view import (
|
||||
view_config,
|
||||
forbidden_view_config,
|
||||
)
|
||||
from pyramid.httpexceptions import (
|
||||
HTTPFound,
|
||||
HTTPNotFound,
|
||||
HTTPForbidden,
|
||||
)
|
||||
|
||||
from datetime import *
|
||||
from dateutil.relativedelta import *
|
||||
import json
|
||||
|
||||
from ..models.default import *
|
||||
from ..models.agenda import *
|
||||
from ..models.stats import *
|
||||
|
||||
@view_config(route_name='stats', renderer='../templates/stats/stats.pt', permission='view')
|
||||
def stats(request):
|
||||
logged_in = request.authenticated_userid.upper()
|
||||
# lire la fiche de l'utilisateur
|
||||
member = get_member_by_id(request, logged_in)
|
||||
access = member.access
|
||||
|
||||
return {
|
||||
'page_title': "Statistiques",
|
||||
'logged_in': logged_in,
|
||||
'access': access,
|
||||
}
|
||||
|
||||
@view_config(route_name='stats_dossiers', renderer='../templates/stats/stats_dossiers.pt', permission='view')
|
||||
def stats_dossiers(request):
|
||||
|
||||
societe = request.matchdict['societe']
|
||||
url = request.route_url('stats_dossiers', societe=societe)
|
||||
message = ''
|
||||
societes = ['PE','ME','PL','PO','CD']
|
||||
|
||||
# prendre en compte les paramètres de saisie
|
||||
if 'societe' in request.params:
|
||||
societe = request.params["societe"]
|
||||
url = request.route_url('stats_dossiers', societe=societe)
|
||||
|
||||
# lire les stats globales des demandes de devis
|
||||
stats_dossiers = get_stats_dd(request, societe)
|
||||
|
||||
liste=[]
|
||||
# construire la liste
|
||||
for item in stats_dossiers:
|
||||
total_facture = item.Facture + item.ReglePart + item.Regle
|
||||
total_devis = item.Devis + item.Commande + total_facture
|
||||
d = (str(item.Annee), str(item.Total), str(item.A_traiter), str(total_devis), str(item.Devis), str(total_facture), str(item.ReglePart), str(item.Regle))
|
||||
liste.append(d)
|
||||
|
||||
return {
|
||||
'page_title': "Stats : Dossiers par année",
|
||||
'url': url,
|
||||
'message': message,
|
||||
'dt_data': json.dumps(liste),
|
||||
'societes': societes,
|
||||
'societe': societe,
|
||||
}
|
||||
|
||||
@view_config(route_name='stats_delais', renderer='../templates/stats/stats_delais.pt', permission='view')
|
||||
def stats_delais(request):
|
||||
|
||||
societe = request.matchdict['societe']
|
||||
url = request.route_url('stats_delais', societe = societe)
|
||||
|
||||
datefin = date.today()
|
||||
# debut = aujourd'hui - 11 mois
|
||||
datedeb = datefin + relativedelta(months=-11)
|
||||
|
||||
societes = ['PE','ME','PL']
|
||||
# si societe a été changé par le user
|
||||
if 'societe' in request.params:
|
||||
societe = request.params["societe"]
|
||||
|
||||
# lire les groupes
|
||||
groupes = get_stats_delai_groupe(request, societe, datedeb, datefin)
|
||||
|
||||
# mémoriser le 1er de la liste
|
||||
groupe = groupes[0].group2
|
||||
|
||||
# si groupe a été changé par le user
|
||||
if 'groupe' in request.params:
|
||||
groupe = request.params["groupe"]
|
||||
|
||||
# lire les délais CONTACT du groupe
|
||||
items = get_stats_delais(request, societe, datedeb, datefin, groupe, 'delai_contact')
|
||||
barChart_annee1 = []
|
||||
barChart_annee1.append(('Mois', 'Moy. ' + groupe, {'role': 'annotation'}, { 'type':'string','role': 'tooltip'} , 'Moy. Dumas'))
|
||||
title1 = '1er CONTACT'
|
||||
for item in items:
|
||||
# construire la liste pour donut cible
|
||||
tooltip = item.group1_lib + '\nMoyennne: -'+str(round(item.moyenne))+' j\nDossiers: '+str(round(item.population))
|
||||
# ('+str(item.population)+')/n'
|
||||
d = (item.group1_lib[:3], round(item.moyenne), str(round(item.moyenne))+'j', tooltip, round(item.moy_ref))
|
||||
barChart_annee1.append(d)
|
||||
|
||||
# lire les délais RENDEZ-VOUS du groupe
|
||||
items = get_stats_delais(request, societe, datedeb, datefin, groupe, 'delai_rdv')
|
||||
barChart_annee2=[]
|
||||
barChart_annee2.append(('Mois', 'Moy. ' + groupe, {'role': 'annotation'}, { 'type':'string','role': 'tooltip'} , 'Moy. Dumas'))
|
||||
title2 = '1er RENDEZ-VOUS'
|
||||
for item in items:
|
||||
# construire la liste pour donut cible
|
||||
tooltip = item.group1_lib + '\nMoyennne: -'+str(round(item.moyenne))+' j\nDossiers: '+str(round(item.population))
|
||||
# ('+str(item.population)+')/n'
|
||||
d = (item.group1_lib[:3], round(item.moyenne), str(round(item.moyenne))+'j', tooltip, round(item.moy_ref))
|
||||
barChart_annee2.append(d)
|
||||
|
||||
# lire les délais DEVIS du groupe
|
||||
items = get_stats_delais(request, societe, datedeb, datefin, groupe, 'delai_devis')
|
||||
barChart_annee3=[]
|
||||
barChart_annee3.append(('Mois', 'Moy. ' + groupe, {'role': 'annotation'}, { 'type':'string','role': 'tooltip'} , 'Moy. Dumas'))
|
||||
title3 = '1er DEVIS'
|
||||
for item in items:
|
||||
# construire la liste pour donut cible
|
||||
tooltip = item.group1_lib + '\nMoyennne: -'+str(round(item.moyenne))+' j\nDossiers: '+str(round(item.population))
|
||||
# ('+str(item.population)+')/n'
|
||||
d = (item.group1_lib[:3], round(item.moyenne), str(round(item.moyenne))+'j', tooltip, round(item.moy_ref))
|
||||
barChart_annee3.append(d)
|
||||
|
||||
# lire les délais FACTURE du groupe
|
||||
items = get_stats_delais(request, societe, datedeb, datefin, groupe, 'delai_facture')
|
||||
barChart_annee4 = []
|
||||
barChart_annee4.append(('Mois', 'Moy. ' + groupe, {'role': 'annotation'}, { 'type':'string','role': 'tooltip'} , 'Moy. Dumas'))
|
||||
title4 = '1ère FACTURE'
|
||||
for item in items:
|
||||
# construire la liste pour donut cible
|
||||
tooltip = item.group1_lib + '\nMoyennne: -'+str(round(item.moyenne))+' j\nDossiers: '+str(round(item.population))
|
||||
# ('+str(item.population)+')/n'
|
||||
d = (item.group1_lib[:3], round(item.moyenne), str(round(item.moyenne))+'j', tooltip, round(item.moy_ref))
|
||||
barChart_annee4.append(d)
|
||||
|
||||
return {
|
||||
'page_title': "Délais / mois",
|
||||
'url': url,
|
||||
'barChart_annee1': json.dumps(barChart_annee1),
|
||||
'barChart_annee2': json.dumps(barChart_annee2),
|
||||
'barChart_annee3': json.dumps(barChart_annee3),
|
||||
'barChart_annee4': json.dumps(barChart_annee4),
|
||||
'title1': title1,
|
||||
'title2': title2,
|
||||
'title3': title3,
|
||||
'title4': title4,
|
||||
'societes': societes,
|
||||
'societe': societe,
|
||||
'groupes': groupes,
|
||||
'groupe': groupe,
|
||||
}
|
||||
|
||||
@view_config(route_name='ca_groupes_12m', renderer='../templates/stats/ca_groupes_12m.pt', permission='view')
|
||||
def ca_groupes_12m(request):
|
||||
|
||||
societe = request.matchdict['societe']
|
||||
url = request.route_url('stats_delais', societe = societe)
|
||||
|
||||
datefin = date.today()
|
||||
# debut = aujourd'hui - 11 mois
|
||||
datedeb = datefin + relativedelta(months=-11)
|
||||
|
||||
societes = ['PE','ME','PL']
|
||||
# si societe a été changé par le user
|
||||
if 'societe' in request.params:
|
||||
societe = request.params["societe"]
|
||||
|
||||
# lire les CA par mois
|
||||
items = get_ca_groupe_12m(request, societe, datedeb, datefin)
|
||||
chart_ca_12m = []
|
||||
# titre des colonnes
|
||||
chart_ca_12m.append(('Mois', 'AXA', { 'type':'string','role': 'tooltip'}, 'MAIF', { 'type':'string','role': 'tooltip'}))
|
||||
title = 'CA / MOIS'
|
||||
for item in items:
|
||||
# construire la liste pour donut cible
|
||||
tooltipMAIF = item.date + ' \nCA: '+str(item.MAIF_ca) + ' €\nDossiers: '+str(round(item.MAIF_nb))
|
||||
tooltipAXA = item.date + ' \nCA: '+str(item.AXA_ca) + ' €\nDossiers: '+str(round(item.AXA_nb))
|
||||
# ('+str(item.population)+')/n'
|
||||
d = (item.mois, float(item.AXA_ca), tooltipAXA, float(item.MAIF_ca), tooltipMAIF)
|
||||
chart_ca_12m.append(d)
|
||||
|
||||
# debut = aujourd'hui - 11 mois
|
||||
datedeb = date.today()
|
||||
datedeb.replace(month=1,day=1)
|
||||
|
||||
# lire les CA par mois
|
||||
items = get_ca_groupe_3y(request, societe, datedeb)
|
||||
chart_ca_3y_1 = []
|
||||
chart_ca_3y_2 = []
|
||||
chart_ca_3y_3 = []
|
||||
# titre des colonnes
|
||||
chart_ca_3y_1.append(('Groupe', 'CA'))
|
||||
chart_ca_3y_2.append(('Groupe', 'CA'))
|
||||
chart_ca_3y_3.append(('Groupe', 'CA'))
|
||||
title1 = 'CA ' + (datedeb + relativedelta(years=-2)).strftime("%Y")
|
||||
title2 = 'CA ' + (datedeb + relativedelta(years=-1)).strftime("%Y")
|
||||
title3 = 'CA ' + datedeb.strftime("%Y")
|
||||
for item in items:
|
||||
# construire la liste pour donut cible
|
||||
#tooltipMAIF = item.date + ' \nCA: '+str(item.MAIF_ca) + ' €\nDossiers: '+str(round(item.MAIF_nb))
|
||||
#tooltipAXA = item.date + ' \nCA: '+str(item.AXA_ca) + ' €\nDossiers: '+str(round(item.AXA_nb))
|
||||
# ('+str(item.population)+')/n'
|
||||
d1 = (item.groupe, float(item.Annee1))
|
||||
chart_ca_3y_1.append(d1)
|
||||
d2 = (item.groupe, float(item.Annee2))
|
||||
chart_ca_3y_2.append(d2)
|
||||
d3 = (item.groupe, float(item.Annee3))
|
||||
chart_ca_3y_3.append(d3)
|
||||
|
||||
return {
|
||||
'page_title': "CA par groupe",
|
||||
'url': url,
|
||||
'chart_ca_12m': json.dumps(chart_ca_12m),
|
||||
'chart_ca_3y_1': json.dumps(chart_ca_3y_1),
|
||||
'chart_ca_3y_2': json.dumps(chart_ca_3y_2),
|
||||
'chart_ca_3y_3': json.dumps(chart_ca_3y_3),
|
||||
'title': title,
|
||||
'title1': title1,
|
||||
'title2': title2,
|
||||
'title3': title3,
|
||||
'societes': societes,
|
||||
'societe': societe,
|
||||
}
|
||||
|
||||
|
||||
128
setup.py
128
setup.py
@@ -1,64 +1,64 @@
|
||||
import os
|
||||
|
||||
from setuptools import setup, find_packages
|
||||
|
||||
here = os.path.abspath(os.path.dirname(__file__))
|
||||
with open(os.path.join(here, 'README.md')) as f:
|
||||
README = f.read()
|
||||
with open(os.path.join(here, 'CHANGES.txt')) as f:
|
||||
CHANGES = f.read()
|
||||
|
||||
requires = [
|
||||
'pyramid',
|
||||
'pyramid_chameleon',
|
||||
'pyramid_debugtoolbar',
|
||||
'pyramid_layout',
|
||||
'pyramid_mailer',
|
||||
'pyramid_tm',
|
||||
'SQLAlchemy',
|
||||
'transaction',
|
||||
'zope.sqlalchemy == 1.1',
|
||||
'waitress',
|
||||
'mysqlclient',
|
||||
'docutils',
|
||||
'pdfkit',
|
||||
'python-dateutil',
|
||||
'user-agents',
|
||||
'xlrd',
|
||||
'image',
|
||||
'pdfminer3'
|
||||
]
|
||||
|
||||
tests_require = [
|
||||
'WebTest >= 1.3.1', # py3 compat
|
||||
'pytest', # includes virtualenv
|
||||
'pytest-cov',
|
||||
]
|
||||
|
||||
setup(name='mondumas',
|
||||
version='1.0',
|
||||
description='mondumas',
|
||||
long_description=README + '\n\n' + CHANGES,
|
||||
classifiers=[
|
||||
"Programming Language :: Python",
|
||||
"Framework :: Pyramid",
|
||||
"Topic :: Internet :: WWW/HTTP",
|
||||
"Topic :: Internet :: WWW/HTTP :: WSGI :: Application",
|
||||
],
|
||||
author='',
|
||||
author_email='',
|
||||
url='',
|
||||
keywords='web wsgi bfg pylons pyramid',
|
||||
packages=find_packages(),
|
||||
include_package_data=True,
|
||||
zip_safe=False,
|
||||
extras_require={
|
||||
'testing': tests_require,
|
||||
},
|
||||
install_requires=requires,
|
||||
entry_points="""\
|
||||
[paste.app_factory]
|
||||
main = mondumas:main
|
||||
[console_scripts]
|
||||
""",
|
||||
)
|
||||
import os
|
||||
|
||||
from setuptools import setup, find_packages
|
||||
|
||||
here = os.path.abspath(os.path.dirname(__file__))
|
||||
with open(os.path.join(here, 'README.md')) as f:
|
||||
README = f.read()
|
||||
with open(os.path.join(here, 'CHANGES.txt')) as f:
|
||||
CHANGES = f.read()
|
||||
|
||||
requires = [
|
||||
'pyramid',
|
||||
'pyramid_chameleon',
|
||||
'pyramid_debugtoolbar',
|
||||
'pyramid_layout',
|
||||
'pyramid_mailer',
|
||||
'pyramid_tm',
|
||||
'SQLAlchemy',
|
||||
'transaction',
|
||||
'zope.sqlalchemy == 1.1',
|
||||
'waitress',
|
||||
'mysqlclient',
|
||||
'docutils',
|
||||
'pdfkit',
|
||||
'python-dateutil',
|
||||
'user-agents',
|
||||
'xlrd',
|
||||
'image',
|
||||
'pdfminer3'
|
||||
]
|
||||
|
||||
tests_require = [
|
||||
'WebTest >= 1.3.1', # py3 compat
|
||||
'pytest', # includes virtualenv
|
||||
'pytest-cov',
|
||||
]
|
||||
|
||||
setup(name='mondumas',
|
||||
version='1.0',
|
||||
description='mondumas',
|
||||
long_description=README + '\n\n' + CHANGES,
|
||||
classifiers=[
|
||||
"Programming Language :: Python",
|
||||
"Framework :: Pyramid",
|
||||
"Topic :: Internet :: WWW/HTTP",
|
||||
"Topic :: Internet :: WWW/HTTP :: WSGI :: Application",
|
||||
],
|
||||
author='',
|
||||
author_email='',
|
||||
url='',
|
||||
keywords='web wsgi bfg pylons pyramid',
|
||||
packages=find_packages(),
|
||||
include_package_data=True,
|
||||
zip_safe=False,
|
||||
extras_require={
|
||||
'testing': tests_require,
|
||||
},
|
||||
install_requires=requires,
|
||||
entry_points="""\
|
||||
[paste.app_factory]
|
||||
main = mondumas:main
|
||||
[console_scripts]
|
||||
""",
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user