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

[UPD] get all functions in this module

parent 78a86c87
Aucune branche associée trouvée
Aucune étiquette associée trouvée
1 requête de fusion!1[UPD] get all import functions in this module
...@@ -7,19 +7,13 @@ ...@@ -7,19 +7,13 @@
"license": "AGPL-3", "license": "AGPL-3",
"depends": ["oacc"], "depends": ["oacc"],
"data": [ "data": [
"security/ir.model.access.csv",
# datas # datas
# views # views
# views menu # views menu
# wizard # wizard
"wizard/acc_operation_import_wizard_views.xml", "wizard/acc_operation_import_wizard_views.xml",
], ],
"assets": {
"web._assets_primary_variables": [],
"web._assets_frontend_helpers": [],
"web.assets_frontend": [],
"web.assets_tests": [],
"web.assets_qweb": [],
},
"installable": True, "installable": True,
"auto_install": False, "auto_install": False,
} }
...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html) # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html)
from datetime import datetime from datetime import datetime
from os.path import splitext from os.path import splitext
from dateutil.relativedelta import relativedelta from dateutil.relativedelta import relativedelta
from odoo import _, models from odoo import _, models
...@@ -40,28 +41,41 @@ class AccOperation(models.Model): ...@@ -40,28 +41,41 @@ class AccOperation(models.Model):
# ------------------------------------------------------ # ------------------------------------------------------
# Actions # Actions
# ------------------------------------------------------ # ------------------------------------------------------
def import_check_docs(self, files):
# ------------------------------------------------------
# Business methods
# ------------------------------------------------------
def _import_check_docs(self, model):
raise_error = False
error_msg = ""
mess = "" mess = ""
if not model:
raise ValidationError(_("Le type de courbes à importer n'est pas défini"))
self.ensure_one()
files = self.env["ir.attachment"].search(
[("res_model", "=", "acc.operation"), ("res_id", "=", self.id)]
)
if not files: if not files:
raise ValidationError( raise UserError(
_( _(
"Aucun fichier à intégrer. Pour joindre des fichiers, " "Aucun fichier à intégrer. Pour joindre des fichiers, "
"veuillez cliquer sur l’icône trombone se trouvant dans " "veuillez cliquer sur l’icône trombone se trouvant dans "
"le bloc Chatter à droite" "le bloc Chatter à droite (ou en-dessous en fonction de "
"la résolution de votre écran)."
) )
) )
else:
files.mapped("name")
for file in files: for file in files:
file_suffix = splitext(file.name)[1] file_suffix = splitext(file.name)[1]
file_name = splitext(file.name)[0] file_name = splitext(file.name)[0]
if file_suffix != ".csv": if file_suffix != ".csv":
raise ValidationError( raise_error = True
error_msg += (
_( _(
"Le fichier %s ne semble pas être au bon format. " "Le fichier %s ne semble pas être au bon format. "
"Format CSV attendu." "Format CSV attendu.\n"
) )
% file.name % file.name
) )
...@@ -69,21 +83,24 @@ class AccOperation(models.Model): ...@@ -69,21 +83,24 @@ class AccOperation(models.Model):
data_filename = file_name.split("_") data_filename = file_name.split("_")
if len(data_filename) != 5: if len(data_filename) != 5:
raise ValidationError( raise_error = True
error_msg += (
_( _(
"Le fichier %s ne semble pas correspondre " "Le fichier %s ne semble pas correspondre "
"au fichier attendu. Ex de nom de fichier correct: " "au fichier attendu. Ex de nom de fichier correct: "
"'23555861012080_09022023_08032023_Conso_CDC'." "'23555861012080_09022023_08032023_Conso_CDC'.\n"
) )
% file.name % file.name
) )
continue
date_begin_str = data_filename[1] date_begin_str = data_filename[1]
date_end_str = data_filename[2] date_end_str = data_filename[2]
# Contrôles sur le type de données CDC # Contrôles sur le type de données CDC
if data_filename[3] not in ["Prod", "Conso", "Autoconso", "Surplus"]: if data_filename[3] not in ["Prod", "Conso", "Autoconso", "Surplus"]:
raise UserError( raise_error = True
error_msg += (
_( _(
"Le fichier %s ne correspond à aucun type " "Le fichier %s ne correspond à aucun type "
"de courbes de charge. il doit contenir Prod, Conso, " "de courbes de charge. il doit contenir Prod, Conso, "
...@@ -93,33 +110,38 @@ class AccOperation(models.Model): ...@@ -93,33 +110,38 @@ class AccOperation(models.Model):
) )
computed_data_type = data_filename[3].lower() computed_data_type = data_filename[3].lower()
if computed_data_type == "conso":
computed_data_type = "cons"
elif computed_data_type == "autoconso":
computed_data_type = "autocons"
# Contrôle sur le type de données # Contrôle sur le type de données
file_suffix = data_filename[4] file_suffix = data_filename[4]
if file_suffix != "CDC": if file_suffix != "CDC":
raise UserError( raise_error = True
error_msg += (
_( _(
"Le fichier %s n'a pas le bon type de format, " "Le fichier %s n'a pas le bon type de format, "
"il doit se terminer par 'CDC'." "il doit se terminer par 'CDC'.\n"
) )
% file.name % file.name
) )
# Contrôle PRM # Contrôle PRM
id_prm = data_filename[0] id_prm = data_filename[0]
# Vérification existance PRM # Vérification existence PRM
counter_id = self.env["acc.counter"].search([("name", "=", id_prm)]) counter_id = self.env["acc.counter"].search([("name", "=", id_prm)])
if not counter_id: if not counter_id:
raise ValidationError( raise_error = True
_("Fichier %(file)s : L'ID PRM %(prm)s ne semble pas exister.") error_msg += _(
% {"file": file.name, "prm": id_prm} "Fichier %(file)s : L'ID PRM %(prm)s ne semble pas exister.\n"
) ) % {"file": file.name, "prm": id_prm}
date_format = "%d%m%Y" date_format = "%d%m%Y"
date_begin_obj = datetime.strptime(date_begin_str, date_format) date_begin_obj = datetime.strptime(date_begin_str, date_format)
date_end_obj = datetime.strptime( date_end_obj = datetime.strptime(date_end_str, date_format) + relativedelta(
date_end_str, date_format days=1
) + relativedelta(days=1) )
# Vérification si des données existent déjà # Vérification si des données existent déjà
# pour cet intervalle de date # pour cet intervalle de date
...@@ -133,7 +155,7 @@ class AccOperation(models.Model): ...@@ -133,7 +155,7 @@ class AccOperation(models.Model):
("comp_data_type", "=", computed_data_type), ("comp_data_type", "=", computed_data_type),
("acc_counter_id", "=", counter_id.id), ("acc_counter_id", "=", counter_id.id),
] ]
rec_ids = self.env["acc.enedis.cdc"].search(domain_all) rec_ids = self.env[model].search(domain_all)
if rec_ids: if rec_ids:
mess += ( mess += (
"<p>Fichier " "<p>Fichier "
...@@ -147,12 +169,24 @@ class AccOperation(models.Model): ...@@ -147,12 +169,24 @@ class AccOperation(models.Model):
) )
else: else:
mess += ( mess += (
"<p>Fichier " "<p>Fichier " + file.name + ": <strong>Prêt à importer</strong></p>"
+ file.name
+ ": <strong>Prêt à importer</strong></p>"
) )
return mess if raise_error:
raise ValidationError(error_msg)
# ------------------------------------------------------ if mess:
# Business methods wizard = self.env["acc.operation.import.wizard"].create(
# ------------------------------------------------------ {
"operation_id": self.id,
"attachment_ids": files,
"model": model,
"message": mess,
}
)
return {
"name": "Confirmation d'import",
"type": "ir.actions.act_window",
"view_mode": "form",
"res_model": "acc.operation.import.wizard",
"res_id": wizard.id,
"target": "new",
}
...@@ -7,7 +7,7 @@ from datetime import datetime, timedelta ...@@ -7,7 +7,7 @@ from datetime import datetime, timedelta
from dateutil.relativedelta import relativedelta from dateutil.relativedelta import relativedelta
from odoo import api, fields, models from odoo import fields, models
from odoo.addons.api_connector.tools.date_utils import local_to_utc from odoo.addons.api_connector.tools.date_utils import local_to_utc
...@@ -21,8 +21,9 @@ class AccOperationImportWizard(models.TransientModel): ...@@ -21,8 +21,9 @@ class AccOperationImportWizard(models.TransientModel):
# ------------------------------------------------------ # ------------------------------------------------------
operation_id = fields.Many2one("acc.operation", "Opération liée") operation_id = fields.Many2one("acc.operation", "Opération liée")
message = fields.Text( message = fields.Text(
string="Message Logs", string="Message Log",
) )
model = fields.Selection(selection=[], required=True)
attachment_ids = fields.Many2many( attachment_ids = fields.Many2many(
comodel_name="ir.attachment", string="Documents à importer" comodel_name="ir.attachment", string="Documents à importer"
) )
...@@ -34,12 +35,6 @@ class AccOperationImportWizard(models.TransientModel): ...@@ -34,12 +35,6 @@ class AccOperationImportWizard(models.TransientModel):
# ------------------------------------------------------ # ------------------------------------------------------
# Default methods # Default methods
# ------------------------------------------------------ # ------------------------------------------------------
@api.model
def default_get(self, fields_list):
# OVERRIDE
res = super().default_get(fields_list)
self._context.get("active_ids")
return res
# ------------------------------------------------------ # ------------------------------------------------------
# Computed fields / Search Fields # Computed fields / Search Fields
...@@ -60,27 +55,77 @@ class AccOperationImportWizard(models.TransientModel): ...@@ -60,27 +55,77 @@ class AccOperationImportWizard(models.TransientModel):
# ------------------------------------------------------ # ------------------------------------------------------
# Business methods # Business methods
# ------------------------------------------------------ # ------------------------------------------------------
def delete_existing_data(self, data_filename, counter_id, message): def delete_existing_data(self, data_filename, counter_id):
""" message = ""
deleting existing data depends of wich curves type you import # Suppression des données si déjà existantes
implemented in each modules date_begin_str = data_filename[1]
""" date_end_str = data_filename[2]
message += "Delete data not implemented" date_format = "%d%m%Y"
date_begin_obj = datetime.strptime(date_begin_str, date_format)
date_end_obj = datetime.strptime(date_end_str, date_format) + relativedelta(
days=1
)
# Vérification si des données existent déjà
# pour cet intervalle de date
start_datetime = local_to_utc(date_begin_obj, "Europe/Paris")
end_datetime = local_to_utc(date_end_obj, "Europe/Paris")
computed_data_type = data_filename[3].lower()
if computed_data_type == "conso":
computed_data_type = "cons"
elif computed_data_type == "autoconso":
computed_data_type = "autocons"
domain_all = [
("date_slot", ">=", start_datetime),
("date_slot", "<", end_datetime),
("acc_operation_id", "=", self.operation_id.id),
("comp_data_type", "=", computed_data_type),
("acc_counter_id", "=", counter_id.id),
]
rec_ids = self.env[self.model].search(domain_all)
if rec_ids:
message += "Suppression des enregistrements existants ... <br/>"
rec_ids.unlink()
message += "Suppression des enregistrements existants OK <br/>"
return message return message
def create_curve(self, curve_data): def create_curve(self, curve_data):
""" self.env[self.model].create(curve_data)
creating curve depends of wich curves type you import
implemented in each modules
"""
pass
def update_partner_id(self, data_filename, counter_id): def update_partner_id(self, data_filename, counter_id):
pass date_begin_str = data_filename[1]
date_end_str = data_filename[2]
date_format = "%d%m%Y"
date_begin_obj = datetime.strptime(date_begin_str, date_format)
date_end_obj = datetime.strptime(date_end_str, date_format) + relativedelta(
days=1
)
# Update partner_id for retrieved cdc
domain = [
("acc_operation_id", "=", self.operation_id.id),
("acc_counter_id", "=", counter_id.id or False),
(
"prm_type",
"=",
"delivery" if data_filename[3] in ("autocons", "cons") else "injection",
),
]
self.env["acc.counter.period"]._get_periods_from_interval(
domain, date_begin_obj, date_end_obj
)._update_cdc_partner_id(model=self.model)
def valid_import(self): def valid_import(self):
message = "" message = ""
message += "<h1>Début Import manuelle: " + str(fields.Datetime.now()) + "</h1>" message += (
"<h1>Début Import manuel: "
+ str(fields.Datetime.now())
+ " - "
+ self.model
+ "</h1>"
)
for file in self.attachment_ids: for file in self.attachment_ids:
message += ( message += (
"<p><strong>Fichier " "<p><strong>Fichier "
...@@ -96,8 +141,8 @@ class AccOperationImportWizard(models.TransientModel): ...@@ -96,8 +141,8 @@ class AccOperationImportWizard(models.TransientModel):
if data_filename[3] not in ["prod", "surplus"]: if data_filename[3] not in ["prod", "surplus"]:
data_filename[3] = data_filename[3][:-1] data_filename[3] = data_filename[3][:-1]
message = self.delete_existing_data( message += self.delete_existing_data(
data_filename=data_filename, counter_id=counter_id, message=message data_filename=data_filename, counter_id=counter_id
) )
file_decode = io.StringIO(base64.b64decode(file.datas).decode("UTF-8")) file_decode = io.StringIO(base64.b64decode(file.datas).decode("UTF-8"))
...@@ -144,17 +189,20 @@ class AccOperationImportWizard(models.TransientModel): ...@@ -144,17 +189,20 @@ class AccOperationImportWizard(models.TransientModel):
self.update_partner_id(data_filename, counter_id) self.update_partner_id(data_filename, counter_id)
message += "Fin de l'Import des données OK<br/>" message += "Fin de l'import des données OK<br/>"
# Suppression du fichier après création des enregistrements # Suppression du fichier après création des enregistrements
message += "Suppression du fichiers " + file.name + " ...<br/>" message += "Suppression du fichier " + file.name + " ...<br/>"
file.unlink() file.unlink()
message += "Suppression OK </p>" message += "Suppression OK </p>"
message += "<h1>Fin Import manuelle: " + str(fields.Datetime.now()) + "</h1>" message += "<h1>Fin import manuel: " + str(fields.Datetime.now()) + "</h1>"
# Logs information logs # Logs information logs
log_id = self.env["acc.logs"].create( log_id = self.env["acc.logs"].create(
{ {
"name": "Import du " + str(fields.Date.today()) + " manuelle", "name": "Import du "
+ str(fields.Date.today())
+ " manuel - "
+ self.model,
"date_launched": fields.Datetime.now(), "date_launched": fields.Datetime.now(),
"type_log": "manual", "type_log": "manual",
"message": message, "message": message,
......
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