Skip to content

Commit

Permalink
+
Browse files Browse the repository at this point in the history
  • Loading branch information
joelclems committed Mar 22, 2022
1 parent 6a8c74f commit 83187f5
Show file tree
Hide file tree
Showing 34 changed files with 2,091 additions and 143 deletions.
19 changes: 15 additions & 4 deletions app/modules/oeasc/chasse/api.py
Expand Up @@ -14,7 +14,8 @@
from utils_flask_sqla.generic import GenericQuery, GenericTable
from .repositories import (
get_chasse_bilan,
chasse_process_args
chasse_process_args,
chasse_get_infos
)
from sqlalchemy import column, select, func, table, distinct, over
import json
Expand Down Expand Up @@ -106,9 +107,9 @@ def api_result_ice():

req = func.oeasc_chasse.fct_calcul_ice_mc(
params['id_espece'],
params['ids_zone_indicative'],
params['ids_zone_cynegetique'],
params['ids_secteur']
params['id_zone_indicative'],
params['id_zone_cynegetique'],
params['id_secteur']
)
res = DB.engine.execute(req).first()[0]
return res
Expand All @@ -120,6 +121,13 @@ def api_result_ice():
# columns = GenericTable('v_pre_bilan_pretty', 'oeasc_chasse', DB.engine).tableDef.columns


@bp.route('results/infos', methods=['GET'])
@json_resp
def api_chasse_result_info():
'''
'''
return chasse_get_infos()

@bp.route('results/custom/', methods=['GET'])
@json_resp
def api_result_custom():
Expand All @@ -140,6 +148,9 @@ def api_result_custom():

args['filters']={}




req = func.oeasc_chasse.fct_custom_results_j(json.dumps(args))
res = DB.engine.execute(req).first()[0]
return res
Expand Down
117 changes: 91 additions & 26 deletions app/modules/oeasc/chasse/repositories.py
@@ -1,7 +1,10 @@
from posixpath import normpath
from utils_flask_sqla.generic import GenericTable
from flask import request, current_app
from ..generic.repository import getlist
from sqlalchemy import column, select, func, table, distinct, over
from ..commons.models import TEspeces, TSecteurs
from .models import TSaisons, TZoneCynegetiques, TZoneIndicatives

config = current_app.config
DB = config['DB']
Expand All @@ -13,54 +16,116 @@ def chasse_process_args():
bilan, ice, restitution etc..
'''
id_espece = request.args.get('id_espece')
id_saison = request.args.get('id_saison')

ids_secteur = getlist(request.args, 'ids_secteur')
ids_zone_cynegetique = getlist(request.args, 'ids_zone_cynegetique')
ids_zone_indicative = getlist(request.args, 'ids_zone_indicative')
id_secteur = getlist(request.args, 'id_secteur')
id_zone_cynegetique = getlist(request.args, 'id_zone_cynegetique')
id_zone_indicative = getlist(request.args, 'id_zone_indicative')

ids_secteur = list(map(lambda x: int(x), ids_secteur))
ids_zone_cynegetique = list(map(lambda x: int(x), ids_zone_cynegetique))
ids_zone_indicative = list(map(lambda x: int(x), ids_zone_indicative))
id_secteur = list(map(lambda x: int(x), id_secteur))
id_zone_cynegetique = list(map(lambda x: int(x), id_zone_cynegetique))
id_zone_indicative = list(map(lambda x: int(x), id_zone_indicative))

# priorisation ZI > ZC > Secteur
if len(ids_zone_indicative) > 0:
ids_secteur = ids_zone_cynegetique = []
if len(id_zone_indicative) > 0:
id_secteur = id_zone_cynegetique = []

if len(id_zone_cynegetique) > 0:
id_secteur = []


if len(ids_zone_cynegetique) > 0:
ids_secteur = []

return {
'id_saison': id_saison,
'id_espece': id_espece,
'ids_secteur': ids_secteur,
'ids_zone_cynegetique': ids_zone_cynegetique,
'ids_zone_indicative': ids_zone_indicative,
'id_secteur': id_secteur,
'id_zone_cynegetique': id_zone_cynegetique,
'id_zone_indicative': id_zone_indicative,
}

def chasse_get_infos():
args = chasse_process_args()
nom_espece = DB.session.query(TEspeces.nom_espece).filter(TEspeces.id_espece == args['id_espece']).one()[0]

zone_echelle = ''

query_zones_echelle = (
DB.session.query(TZoneIndicatives.nom_zone_indicative)
.filter(TZoneIndicatives.id_zone_indicative.in_(args['id_zone_indicative']))
if args['id_zone_indicative']
else DB.session.query(TZoneCynegetiques.nom_zone_cynegetique)
.filter(TZoneCynegetiques.id_zone_cynegetique.in_(args['id_zone_cynegetique']))
if args['id_zone_cynegetique']
else DB.session.query(TSecteurs.nom_secteur)
.filter(TSecteurs.id_secteur.in_(args['id_secteur']))
if args['id_secteur']
else None
)

nom_zones_echelle = (
', '.join(
map(
lambda x: x[0],
query_zones_echelle.all()
)
)
if query_zones_echelle
else ''
)

echelle = (
f'Zone(s) indicative(s) : {nom_zones_echelle}' if args['id_zone_indicative']
else f'Zone(s) Cynegetique(s) : {nom_zones_echelle}' if args['id_zone_indicative']
else f'Secteur(s): {nom_zones_echelle}' if args['id_secteur']
else 'Cœur'
)

taux_realisation = get_chasse_bilan(args)['taux_realisation'][-1][1]

nom_saison = DB.session.query(TSaisons.nom_saison).filter(TSaisons.id_saison == args['id_saison']).one()[0]
last_5_id_saisons = list(map(
lambda x: x[0],
DB.session.query(TSaisons.id_saison)
.filter(TSaisons.nom_saison <= nom_saison)
.order_by(TSaisons.nom_saison.desc())
.limit(5)
.all()
))

return {
'nom_saison': nom_saison,
'nom_espece': nom_espece,
'echelle': echelle,
'taux_realisation': round(taux_realisation, 2)*100,
'last_5_id_saison': last_5_id_saisons,
'nom_saison': nom_saison
}

def get_chasse_bilan(params):

columns = GenericTable('v_pre_bilan_pretty', 'oeasc_chasse', DB.engine).tableDef.columns
localisation = (
'zone_indicative' if params['ids_zone_indicative']
else 'zone_cynegetique' if params['ids_zone_cynegetique']
else 'secteur' if params['ids_secteur']
'zone_indicative' if params['id_zone_indicative']
else 'zone_cynegetique' if params['id_zone_cynegetique']
else 'secteur' if params['id_secteur']
else ""
)

localisation_id_key = 'id_{}'.format(localisation)
localisation_name_key = 'nom_{}'.format(localisation or 'espece')

localisation_keys = (
params['ids_zone_indicative']
or params['ids_zone_cynegetique']
or params['ids_secteur']
params['id_zone_indicative']
or params['id_zone_cynegetique']
or params['id_secteur']
or []
)


suffix = (
'_zi' if params['ids_zone_indicative']
else '_zc' if params['ids_zone_cynegetique']
else '_secteur' if params['ids_secteur']
'_zi' if params['id_zone_indicative']
else '_zc' if params['id_zone_cynegetique']
else '_secteur' if params['id_secteur']
else '_espece'
)

Expand Down Expand Up @@ -150,12 +215,12 @@ def get_chasse_bilan(params):
except ValueError:
pass

if params['ids_zone_indicative']:
if params['id_zone_indicative']:
out['nom_zone_indicative'] = res[0][-1]
elif params['ids_zone_cynegetique']:
elif params['id_zone_cynegetique']:
out['nom_zone_cynegetique'] = res[0][-1]
elif params['ids_secteur']:
elif params['id_secteur']:
out['nom_secteur'] = res[0][-1]

return out

return out
12 changes: 9 additions & 3 deletions app/modules/oeasc/generic/repository.py
Expand Up @@ -177,9 +177,15 @@ def get_objects_type(module_name, object_type, args={}):
if value_filter and value_filter[0] == '=':
value_filter_effectif = value_filter[1:]
# filtre =
query = query.filter(
cast(model_attribute, DB.String ) == value_filter_effectif
)

if len(value_filter_effectif.split(',')) > 1:
query = query.filter(
cast(model_attribute, DB.String ).in_(value_filter_effectif.split(','))
)
else:
query = query.filter(
cast(model_attribute, DB.String ) == value_filter_effectif
)

# print sort by
sort_by = getlist(args, 'sortBy')
Expand Down
21 changes: 15 additions & 6 deletions app/modules/oeasc/resultat/api.py
Expand Up @@ -10,6 +10,7 @@
from utils_flask_sqla.generic import GenericQuery
from ..user.utils import check_auth_redirect_login

from .repository import result_custom
from ..generic.repository import getlist

config = current_app.config
Expand Down Expand Up @@ -86,14 +87,18 @@ def api_result_custom():
args['field_name'] = request.args.get('fieldName')
args['field_name_2'] = request.args.get('fieldName2')
args['data_type'] = request.args.get('dataType')
args['sort'] = request.args.get('sort')

# filtres
args['filters'] = request.args.get('filters', {})
args['filters'] = args['filters'] and json.loads(args['filters'])
# on retire les filtres qui sont à []
# sinon cela pose problème dans la fonction sql
args['filters'] = {
k:v
k: (
v if isinstance(v, list)
else [v]
)
for (k,v) in args['filters'].items()
if v
}
Expand All @@ -105,8 +110,12 @@ def api_result_custom():

# exectution de la function oeasc_chasse.fct_custom_results_j
# qui renvoie un objet de type dictionnaire
req = func.oeasc_chasse.fct_custom_results_j(json.dumps(args))
res = DB.engine.execute(req).first()[0]

res = result_custom(args)


# req = func.oeasc_chasse.fct_custom_results_j(json.dumps(args))
# res = DB.engine.execute(req).first()[0]

# ici res est un tableau :
# [ ...
Expand All @@ -119,6 +128,8 @@ def api_result_custom():
if not args['field_name_2'] or args['field_name'] == args['field_name_2']:
return res



# si field_name_2 est défini on calcule les sous-données

# pour garder en mémoire args['field_name']
Expand All @@ -131,8 +142,6 @@ def api_result_custom():
for r in res:
# on défini un filtre pour le champs <field_name_save> à [ r['text'] ]
args['filters'][field_name_save] = [r['text']]
req = func.oeasc_chasse.fct_custom_results_j(json.dumps(args))
# on place le résultat dans r['data']
r['data'] = DB.engine.execute(req).first()[0]

r['data'] = result_custom(args)
return res
42 changes: 41 additions & 1 deletion app/modules/oeasc/resultat/repository.py
@@ -1,6 +1,9 @@
from sqlalchemy import text
from sqlalchemy import text, func
from flask import current_app
from ..nomenclature import nomenclature_oeasc
from utils_flask_sqla.generic import GenericTable

cache_generic_table = {}

config = current_app.config
DB = config['DB']
Expand Down Expand Up @@ -177,3 +180,40 @@ def req_timeline():
}

return out


def result_custom(params):

print('custom')
schema_name = params['view'].split('.')[0]
table_name = params['view'].split('.')[1]
if not cache_generic_table.get(params['view']):
print('get view')
cache_generic_table[params['view']] = GenericTable(table_name, schema_name, DB.engine)

view = cache_generic_table.get(params['view'])

query = DB.session.query(getattr(view.tableDef.columns, params['field_name']), func.count('*'))

# filter
for filter_key, filter_value in params.get('filters', {}).items():
query = query.filter(getattr(view.tableDef.columns, filter_key).in_(filter_value))


group_bys = [ params['field_name'] ]
order_by = 'COUNT(*) DESC'

if params['sort']:
field_sort = params['sort'].replace('+', '')
if field_sort != params['field_name']:
group_bys.append(field_sort)

order_by = field_sort

if '+' == params['sort'][-1]:
order_by += " DESC"

query = query.group_by(text(', '.join(group_bys)))
query = query.order_by(text(order_by))
res = query.all()
return [ {'text': r[0], 'count': r[1] } for r in res ]
24 changes: 17 additions & 7 deletions data/chasse/result_custom.sql
Expand Up @@ -20,11 +20,20 @@
tns.label_fr AS label_sexe,
tnca.label_fr AS label_classe_age,
te.nom_espece,
te.id_espece,
tzc.id_zone_cynegetique,
tzc.nom_zone_cynegetique,
tzi.id_zone_indicative,
tzi.nom_zone_indicative,
ts.nom_saison
ts.nom_saison,
ts.id_saison,
tsec.nom_secteur,
tsec.id_secteur,
to_char(tr.date_exacte, 'MM')::text AS mois_txt,
CASE
WHEN date_part('month', tr.date_exacte) < 6 THEN date_part('month', tr.date_exacte) + 12
ELSE date_part('month', tr.date_exacte)
END AS mois_txt_sort
FROM oeasc_chasse.t_realisations tr
LEFT JOIN ref_nomenclatures.t_nomenclatures tnmc ON tnmc.id_nomenclature = id_nomenclature_mode_chasse
LEFT JOIN ref_nomenclatures.t_nomenclatures tns ON tns.id_nomenclature = id_nomenclature_sexe
Expand All @@ -35,6 +44,7 @@
JOIN oeasc_commons.t_especes te ON te.id_espece = ttb.id_espece
JOIN oeasc_chasse.t_zone_cynegetiques tzc ON tzc.id_zone_cynegetique = id_zone_cynegetique_realisee
JOIN oeasc_chasse.t_zone_indicatives tzi ON tzi.id_zone_indicative = id_zone_indicative_realisee
JOIN oeasc_commons.t_secteurs tsec ON tsec.id_secteur = tzc.id_secteur
;

--
Expand Down Expand Up @@ -113,9 +123,9 @@
--
-- test de la function oeasc_chasse.fct_custom_results_j
--
SELECT * FROM oeasc_chasse.fct_custom_results_j(
'{
"view": "oeasc_chasse.v_custom_results",
"field_name": "nom_espece",
"filters": {"id_zone_cynegetique": ["1", "2","3"]}
}'::JSONB);
-- SELECT * FROM oeasc_chasse.fct_custom_results_j(
-- '{
-- "view": "oeasc_chasse.v_custom_results",
-- "field_name": "nom_espece",
-- "filters": {"id_zone_cynegetique": ["1", "2","3"]}
-- }'::JSONB);

0 comments on commit 83187f5

Please sign in to comment.