Sélectionner une révision Git
scop_cotisation_cg.py
main.py 9,58 Kio
# Copyright 2021- Le Filament (https://le-filament.com)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html)
import werkzeug
from odoo import _, http
from odoo.exceptions import AccessError
from odoo.http import request
from odoo.addons.oacc_portal.controllers.main import CustomerPortal as CustomerPortal
class CustomerPortal(CustomerPortal):
def _get_data_date(self, is_data_cdc, operation=None, partner_id=None):
vals = {}
# Si des données existent, récupérer les dates min/max/début/fin
# de l'opération
if is_data_cdc:
vals["data_values"] = operation._get_values_init_graph(partner_id)
else:
vals["data_values"] = {
"date_day_start": False,
"date_day_end": False,
"date_week_start": False,
"date_week_end": False,
"date_month_start": False,
"date_month_end": False,
"date_year_start": False,
"date_year_end": False,
}
vals["data_values"].update(operation.get_date_min_max(partner_id))
return vals
@http.route(
['/operation/<model("acc.operation"):operation>/pmo'],
type="http",
auth="user",
website=True,
)
def pmo(self, operation, **kw):
render_values = {}
render_values.update(self._get_role(operation))
render_values.update(
self._get_data_date(render_values.get("isDataCdc"), operation)
)
render_values.update(
{
"page_name": "pmo-view",
"page_breadcrumbs": "Vue globale",
"scale": "month",
}
)
return request.render("oacc_portal_overview_cdc.operation_pmo", render_values)
@http.route(
['/operation/<model("acc.operation"):operation>/consumer'],
type="http",
auth="user",
website=True,
)
def consumer(self, operation, **kw):
render_values = {}
render_values.update(self._get_role(operation))
partner_ids = []
if (
render_values.get("isAdmin")
or render_values.get("isSuperAdmin")
or render_values.get("isPmo")
):
render_values.update(
self._get_data_date(render_values.get("isDataCdc"), operation)
)
partner_ids = operation.acc_delivery_period_ids.mapped("partner_id").sorted(
key=lambda p: p.name
)
elif render_values.get("isConsumer"):
render_values.update(
self._get_data_date(
render_values.get("isDataCdc"),
operation,
request.env.user.commercial_partner_id.id,
)
)
partner_ids = request.env.user.commercial_partner_id
render_values.update(
{
"partners": partner_ids,
"page_name": "conso",
"page_breadcrumbs": "Suivi consommation",
"scale": "month",
}
)
return request.render(
"oacc_portal_overview_cdc.operation_consumer", render_values
)
@http.route(
[
'/operation/<model("acc.operation"):operation>/productor',
],
type="http",
auth="user",
website=True,
)
def productor(self, operation, **kw):
render_values = {}
render_values.update(self._get_role(operation))
partner_ids = []
if (
render_values.get("isAdmin")
or render_values.get("isSuperAdmin")
or render_values.get("isPmo")
):
render_values.update(
self._get_data_date(render_values.get("isDataCdc"), operation)
)
partner_ids = operation.acc_injection_period_ids.mapped(
"partner_id"
).sorted(key=lambda p: p.name)
elif render_values.get("isProductor"):
render_values.update(
self._get_data_date(
render_values.get("isDataCdc"),
operation,
request.env.user.commercial_partner_id.id,
)
)
partner_ids = request.env.user.commercial_partner_id
render_values.update(
{
"partners": partner_ids,
"page_name": "prod",
"page_breadcrumbs": "Suivi production",
"scale": "month",
}
)
return request.render(
"oacc_portal_overview_cdc.operation_productor", render_values
)
@http.route(
["/chart/update_json"],
type="json",
auth="user",
methods=["POST"],
website=True,
csrf=False,
)
def chart_update_json(
self,
operation_id,
partner_id=None,
prm_id=None,
start_date=None,
end_date=None,
data_type=None,
graph_type="histo",
**kw,
):
"""
This route is called :
- When click on button period
- When click on a consumer, a productor or a PRM
- When click on date range
"""
operation = request.env["acc.operation"].browse(operation_id)
try:
roles = self._get_role(operation)
except AccessError as e:
raise werkzeug.exceptions.abort(
werkzeug.wrappers.Response(status=401)
) from e
# Si l'opération n'a pas de courbes on renvoie une erreur 401
# Si l'utilisateur n'est pas soit superAdmin, soit Admin, soit Pmo,
# 1. si prm_id est passé il doit aussi y avoir un partner_id
# 2. il faut vérifier qu'il est bien autorisé à accéder au partner_id
# si passé en paramètre
# sinon on renvoie une erreur 401
# (on ne vérifie pas qu'il ait bien accès au prm, aucune donnée ne sera renvoyée
# si les courbes du prm demandées n'appartiennent pas à ce partner)
if not roles.get("isDataCdc") or (
not roles.get("isSuperAdmin")
and not roles.get("isAdmin")
and not roles.get("isPmo")
and (prm_id or partner_id)
and (
(prm_id and not partner_id)
or (
partner_id
and partner_id != request.env.user.commercial_partner_id.id
)
)
):
raise werkzeug.exceptions.abort(werkzeug.wrappers.Response(status=401))
vals = operation.get_graph(
start_date, end_date, partner_id, prm_id, data_type, graph_type
)
return vals
@http.route(
["/chart/export_cdc"],
type="http",
auth="user",
methods=["GET"],
website=True,
csrf=False,
)
def chart_export_cdc(
self,
operation_id=None,
partner_id=None,
prm_id=None,
start_date=None,
end_date=None,
data_type=None,
**kw,
):
"""
This route is called :
- When click on button export
"""
operation = request.env["acc.operation"].sudo().browse(int(operation_id))
try:
if (
request.env.user.commercial_partner_id.id
not in operation.partner_role_ids.partner_id.ids
and not request.env.user.has_group("oacc.group_operation_superadmin")
):
raise AccessError(_("You are not allowed to access this operation"))
roles = self._get_role(operation)
except AccessError as e:
raise werkzeug.exceptions.abort(
werkzeug.wrappers.Response(status=401)
) from e
# Si l'opération n'a pas de courbes on renvoie une erreur 401
# Si l'utilisateur n'est pas soit superAdmin, soit Admin, soit Pmo,
# 1. le partner_id est obligatoire
# 2. il faut vérifier qu'il est bien autorisé à accéder au partner_id
# 3. il faut vérifier que le PRM correspond bien à une période de ce partner_id
# sur l'opération
# sinon on renvoie une erreur 401
# (on ne vérifie pas qu'il ait bien accès au prm, aucune donnée ne sera renvoyée
# si les courbes du prm demandées n'appartiennent pas à ce partner)
if not roles.get("isDataCdc") or (
not roles.get("isSuperAdmin")
and not roles.get("isAdmin")
and not roles.get("isPmo")
and (
not partner_id
or (
partner_id
and int(partner_id) != request.env.user.commercial_partner_id.id
)
or (
prm_id
and (
int(prm_id)
not in operation.acc_injection_period_ids.filtered(
lambda p: p.partner_id.id == int(partner_id)
).acc_counter_id.ids
and int(prm_id)
not in operation.acc_delivery_period_ids.filtered(
lambda p: p.partner_id.id == int(partner_id)
).acc_counter_id.ids
)
)
)
):
raise werkzeug.exceptions.abort(werkzeug.wrappers.Response(status=401))
file_values = operation._export_cdc(
start_date, end_date, partner_id, prm_id, data_type
)
return request.make_response(
file_values.get("data"), headers=file_values.get("headers")
)