Skip to content
Extraits de code Groupes Projets
Valider 5bed6d78 rédigé par Rémi - Le Filament's avatar Rémi - Le Filament
Parcourir les fichiers

[UPD] new function to retrieve curves from ORM

parent 36f3c125
Branches
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
...@@ -4,10 +4,9 @@ from datetime import datetime ...@@ -4,10 +4,9 @@ from datetime import datetime
from dateutil.relativedelta import relativedelta from dateutil.relativedelta import relativedelta
from odoo import _, api, fields, models from odoo import _, api, models
from odoo.exceptions import ValidationError from odoo.exceptions import ValidationError
from odoo.osv import expression from odoo.osv import expression
from odoo.tools import date_utils
from odoo.addons.api_connector.tools.date_utils import local_to_utc from odoo.addons.api_connector.tools.date_utils import local_to_utc
...@@ -49,6 +48,129 @@ class AccEnedisCdc(models.Model): ...@@ -49,6 +48,129 @@ class AccEnedisCdc(models.Model):
return display_hourly_curves, step, step_display_curve return display_hourly_curves, step, step_display_curve
@api.model
def _read_group_process_groupby(self, gb, query):
"""
Overrides models method to avoid getting wrong display format
And manage granluarity = "minute" for 30 minutes curves
"""
initial_gb = gb
if self._context.get("portal_acc_curves") and gb == "date_slot:minute":
gb = "date_slot:hour"
res = super()._read_group_process_groupby(gb, query)
if self._context.get("portal_acc_curves"):
if res["type"] == "datetime":
res["display_format"] = "dd/MM/YYYY HH:mm"
if initial_gb == "date_slot:minute":
res["groupby"] = res["groupby"].replace("hour", "minute")
res["interval"] = relativedelta(minutes=30)
res["granularity"] = res["granularity"].replace("hour", "minute")
res["qualified_field"] = res["qualified_field"].replace(
"hour", "minute"
)
return res
@api.model
def _get_curves(
self,
operation_id,
slot_type,
start_date,
end_date,
prm_id=None,
partner_id=None,
curve_types=None,
extra_curve_type=None,
):
"""
Fonction permettant de récupérer les courbes de charge pour graphique ou export
:param: int operation_id: opération concernée
char slot_type: type de slot pour la query ("minute", "hour", "month" ou
"year")
datetime start_date: date début
datetime end_date: date de fin
int prm_id : PRM de soutirage à récupérer
int partner_id: contact associé à la courbe
[char] curve_types: type de données
char extra_curve_type : extra curve to be retrieved (optional)
(allowed values : 'cons', 'autocons', 'prod', 'surplus')
@returns: liste de dictionnaires resultat de la requête :
- 1 entrée par date
- 1 champ par type de courbe
"""
start_date_tz = local_to_utc(start_date, "Europe/Paris")
end_date_tz = local_to_utc(end_date, "Europe/Paris")
domain = [
("acc_operation_id", "=", operation_id),
("date_slot", ">=", start_date_tz),
("date_slot", "<", end_date_tz),
]
if partner_id and isinstance(partner_id, int):
partner_domain = [("partner_id", "=", partner_id)]
if prm_id and isinstance(prm_id, int):
partner_domain = expression.AND(
[partner_domain, [("acc_counter_id", "=", prm_id)]]
)
if extra_curve_type and extra_curve_type in (
"cons",
"autocons",
"prod",
"surplus",
):
partner_domain = expression.OR(
[partner_domain, [("comp_data_type", "=", extra_curve_type)]]
)
else:
partner_domain = [("partner_id", "!=", False)]
domain = expression.AND([domain, partner_domain])
if curve_types:
domain = expression.AND([domain, [("comp_data_type", "in", curve_types)]])
res = (
self.env["acc.enedis.cdc"]
.with_context(fill_temporal=True, tz="Europe/Paris", portal_acc_curves=True)
.read_group(
domain,
["date_slot", "power:sum"],
["date_slot:" + slot_type, "comp_data_type"],
lazy=False,
)
)
final_res = []
prev_final_line = {}
for line in res:
if (
prev_final_line
and prev_final_line["date"] == line["date_slot:" + slot_type]
):
prev_final_line.update(
{
line["comp_data_type"]: line["power"] / 2 / 1000,
}
)
else:
new_line = {
"date": line["date_slot:" + slot_type],
line["comp_data_type"]: line["power"] / 2 / 1000,
}
final_res.append(new_line)
prev_final_line = new_line
# Add computed values
for final_line in final_res:
if not curve_types or all(
value in curve_types for value in ["autoprod", "prod", "surplus"]
):
final_line.update(
{"autoprod": final_line["prod"] - final_line["surplus"]}
)
if not curve_types or all(
value in curve_types for value in ["allocons", "cons", "autocons"]
):
final_line.update(
{"allocons": final_line["cons"] - final_line["autocons"]}
)
return final_res
@api.model @api.model
def _select_clause(self, date_slot, curve_types): def _select_clause(self, date_slot, curve_types):
""" """
...@@ -122,9 +244,8 @@ class AccEnedisCdc(models.Model): ...@@ -122,9 +244,8 @@ class AccEnedisCdc(models.Model):
date start_date : first date to be retrieved date start_date : first date to be retrieved
date end_date : last date to be retrieved date end_date : last date to be retrieved
int prm_id : id of PRM to be retrieved (optional) int prm_id : id of PRM to be retrieved (optional)
[char] extra_curve_type : extra curve to be retrieved (optional) char extra_curve_type : extra curve to be retrieved (optional)
(allowed values : 'cons', 'autocons', 'allocons', (allowed values : 'cons', 'autocons', 'prod', 'surplus')
'prod', 'surplus', 'autoprod')
int partner_id : id of partner to be retrieved (optional) int partner_id : id of partner to be retrieved (optional)
""" """
if ( if (
...@@ -151,10 +272,8 @@ class AccEnedisCdc(models.Model): ...@@ -151,10 +272,8 @@ class AccEnedisCdc(models.Model):
if extra_curve_type and extra_curve_type in ( if extra_curve_type and extra_curve_type in (
"cons", "cons",
"autocons", "autocons",
"allocons",
"prod", "prod",
"surplus", "surplus",
"autoprod",
): ):
result = f"{result} OR cdc.comp_data_type = '{extra_curve_type}' )" result = f"{result} OR cdc.comp_data_type = '{extra_curve_type}' )"
else: else:
......
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Veuillez vous inscrire ou vous pour commenter