From 6aade582ef868d0ac5f9caa16a5eb35c8ff7a226 Mon Sep 17 00:00:00 2001 From: Julien Ortet <julien@le-filament.com> Date: Wed, 14 Aug 2024 16:51:36 +0200 Subject: [PATCH] [ADD] module creation --- __manifest__.py | 4 +- __pycache__/__init__.cpython-311.pyc | Bin 0 -> 238 bytes .../__pycache__/acc_operation.cpython-311.pyc | Bin 5621 -> 1776 bytes models/acc_operation.py | 117 +----------- views/acc_operation_views.xml | 8 +- wizard/__pycache__/__init__.cpython-311.pyc | Bin 239 -> 243 bytes ...cc_operation_import_wizard.cpython-311.pyc | Bin 7083 -> 2553 bytes wizard/acc_operation_import_wizard.py | 178 ++++-------------- wizard/acc_operation_import_wizard_views.xml | 36 ---- 9 files changed, 41 insertions(+), 302 deletions(-) create mode 100644 __pycache__/__init__.cpython-311.pyc delete mode 100644 wizard/acc_operation_import_wizard_views.xml diff --git a/__manifest__.py b/__manifest__.py index 702987e..9ef2c2a 100644 --- a/__manifest__.py +++ b/__manifest__.py @@ -5,7 +5,7 @@ "website": "https://le-filament.com", "version": "16.0.1.0.0", "license": "AGPL-3", - "depends": ["oacc"], + "depends": ["oacc", "oacc_raw_curves"], "data": [ "security/ir.model.access.csv", # datas @@ -13,7 +13,7 @@ "views/acc_operation_views.xml", # views menu # wizard - "wizard/acc_operation_import_wizard_views.xml", + ], "assets": { "web._assets_primary_variables": [], diff --git a/__pycache__/__init__.cpython-311.pyc b/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a0578289fbd34e9444e2ed356652cbe221d272e7 GIT binary patch literal 238 zcmZ3^%ge>Uz`(#B(~>I7z`*br#DQTZDC4sj0|Uc!h7^Vr#vF!R#wf;IrYI&xh7_h? z22JLdj0_A6noPIYa`RJCbBb@Vm1kBZ7Nz)UGT&k-VrF1qC}Lq?U|7lU8D!WmTm6ju z+*JM2;?yGjl+-f){FMBBLo@w?qRg_yl2rZt#N_1o%-n+fqLTQc#Pay$lw|$*_{_Y_ xlK6PNg34bUHo5sJr8%i~MVt%_3?Q3}l^GZqJ}@&fGTva2xqurLu`@6*008SAJTw3R literal 0 HcmV?d00001 diff --git a/models/__pycache__/acc_operation.cpython-311.pyc b/models/__pycache__/acc_operation.cpython-311.pyc index 8daa02b899d581bd55f6659720e1e7c1f2495e98..de2b421675aa1a7947b06e0637772e24a64350a6 100644 GIT binary patch delta 498 zcmeyW{ehQnIWI340|Ns?*RDNjl3W}47#SHQCJQi1Dh4xXvfScvOiuPMNG(b%$;{9D z#haL%td|etZtfP)W@NlId6%H9&@V>YA|3_?hFfe!sm1Y`DMbR4UkkR>-(ty2%uT(; zQc_uvdW*9xGqpTEH$Nq{h@XLhp-2#{z9g|IJ+(xW^%iq#UfC_S;?%^V<cwQPnJKpf zGjj{_i%Q~?Gg6bY<5TjJi*K<d7o{eaq-wI>Vku6|NxQ|8n_66aixcjoTdZlBIjP0B z*vd1j5{puJidh*L7!*L@m*?b29xdOZ#Pay$lw^I7D{_kU6O)tU;hOadDsS;Y?S!hU zl1BEw9;&4FWIo}$9G^jf=cma!`LnRTi5dd~!%BuCb&&T|K?FC9;ALQ7DAr(LU}%8D z8~kz&9v`eG=ZQ!#s!whgnWn4*QVrMqi^C>2KczG$)vm~hfq{V$WWwUf4x&YtW{g4~ W7%+(mW>aiFg2cao2s9O7M*#pa`<h7r literal 5621 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 diff --git a/models/acc_operation.py b/models/acc_operation.py index 690db88..3f5194c 100644 --- a/models/acc_operation.py +++ b/models/acc_operation.py @@ -40,122 +40,7 @@ class AccOperation(models.Model): # ------------------------------------------------------ # Actions # ------------------------------------------------------ - def import_check_docs(self, files): - mess = "" - - if not files: - raise ValidationError( - _( - "Aucun fichier à intégrer. Pour joindre des fichiers, " - "veuillez cliquer sur l’icône trombone se trouvant dans " - "le bloc Chatter à droite" - ) - ) - else: - files.mapped("name") - for file in files: - ext_file = file.name[-3:] - if ext_file != "csv": - raise ValidationError( - _( - "Le fichier %s ne semble pas être au bon format. " - "Format CSV attendu." - ) - % file.name - ) - - data_filename = file.name.split("_") - - if len(data_filename) != 5: - raise ValidationError( - _( - "Le fichier %s ne semble pas correspondre " - "au fichier attendu. Ex de nom de fichier correct: " - "'23555861012080_09022023_08032023_Conso_CDC'." - ) - % file.name - ) - - date_begin_str = data_filename[1] - date_end_str = data_filename[2] - computed_data_type = data_filename[3].lower() - - # Contrôle sur le type de données - ext_file = data_filename[4][:3] - if ext_file != "CDC": - raise UserError( - _( - "Le fichier %s n'a pas le bon type de format, " - "il doit se terminer par 'CDC'." - ) - % file.name - ) - - # Contrôles sur le type de données CDC - if computed_data_type != "prod" and computed_data_type != "surplus": - computed_data_type = data_filename[3].lower()[:-1] - if ( - computed_data_type != "cons" - and computed_data_type != "autocons" - ): - raise UserError( - _( - "Le fichier %s ne correspond à aucun type " - "de courbes de charge. il doit contenir Prod, Conso, " - "Autoconso ou Surplus." - ) - % file.name - ) - - # Contrôle PRM - id_prm = data_filename[0] - # Vérification existance PRM - counter_id = self.env["acc.counter"].search([("name", "=", id_prm)]) - if not counter_id: - raise ValidationError( - _("Fichier %(file)s : L'ID PRM %(prm)s ne semble pas exister.") - % {"file": file.name, "prm": id_prm} - ) - - 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") - - domain_all = [ - ("date_slot", ">=", start_datetime), - ("date_slot", "<", end_datetime), - ("acc_operation_id", "=", self.id), - ("comp_data_type", "=", computed_data_type), - ("acc_counter_id", "=", counter_id.id), - ] - rec_ids = self.env["acc.enedis.cdc"].search(domain_all) - if rec_ids: - mess += ( - "<p>Fichier " - + file.name - + ": des données existent déjà pour la période du " - + str(date_begin_obj) - + " au " - + str(date_end_obj) - + ". Etes-vous sûr de vouloir écraser " - "les données existantes?</p>" - ) - else: - mess += ( - "<p>Fichier " - + file.name - + ": <strong>Prêt à importer</strong></p>" - ) - return mess - - def import_cdc(self): + def import_raw_cdc(self): # vérification des documents à importer mess = "" for operation in self: diff --git a/views/acc_operation_views.xml b/views/acc_operation_views.xml index da46155..530f8c3 100644 --- a/views/acc_operation_views.xml +++ b/views/acc_operation_views.xml @@ -2,7 +2,6 @@ <!-- Copyright 2021- Le Filament (https://le-filament.com) License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). --> <odoo> - <record id="acc_operation_form_view" model="ir.ui.view"> <field name="name">acc.acc_operation.form.import</field> <field name="model">acc.operation</field> @@ -10,14 +9,13 @@ <field name="arch" type="xml"> <xpath expr="//header" position="inside"> <button - string="Intégration des données manuelle" + string="Intégration des brutes" type="object" class="btn-primary" - name="import_cdc" + name="import_raw_cdc" groups="oacc.group_operation_superadmin" /> </xpath> </field> </record> - -</odoo> +</odoo> \ No newline at end of file diff --git a/wizard/__pycache__/__init__.cpython-311.pyc b/wizard/__pycache__/__init__.cpython-311.pyc index 78e85b4a7ecf28a9e25c83574d3ed9ed4da0ec2c..9815323fce0665d5b956165d265571c04951453f 100644 GIT binary patch delta 32 ocmaFQ_?eMsIWI340|Ntt{+>N)6L~TiT_%=lF&8D4Pn;JB0Gj&>5C8xG delta 28 kcmey&_@0qxIWI340|Ns?>e^+g6L~Ti9VV7)O<WuR0C<oH(*OVf diff --git a/wizard/__pycache__/acc_operation_import_wizard.cpython-311.pyc b/wizard/__pycache__/acc_operation_import_wizard.cpython-311.pyc index 61da2008e6e0e0a55c9a938e249dd7dd232abe07..eba5592b410ff1867473e1c649d5d41846ba7f47 100644 GIT binary patch literal 2553 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 M`2|d3Dg=i*0I)Zwng9R* literal 7083 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 UGs>>Wn|uUIegTu13c=n304SC2C;$Ke diff --git a/wizard/acc_operation_import_wizard.py b/wizard/acc_operation_import_wizard.py index 8a06972..b47a369 100644 --- a/wizard/acc_operation_import_wizard.py +++ b/wizard/acc_operation_import_wizard.py @@ -1,8 +1,8 @@ # Copyright 2021- Le Filament (https://le-filament.com) # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html) -import base64 -import csv -import io + + +from odoo import api, fields, models from datetime import datetime, timedelta from dateutil.relativedelta import relativedelta @@ -11,21 +11,12 @@ from odoo import api, fields, models from odoo.addons.api_connector.tools.date_utils import local_to_utc - class AccOperationImportWizard(models.TransientModel): - _name = "acc.operation.import.wizard" - _description = "Wizard: Import des données brutes" + _inherit = "acc.operation.import.wizard" # ------------------------------------------------------ # Fields declaration # ------------------------------------------------------ - operation_id = fields.Many2one("acc.operation", "Opération liée") - message = fields.Text( - string="Message Logs", - ) - attachment_ids = fields.Many2many( - comodel_name="ir.attachment", string="Documents à importer" - ) # ------------------------------------------------------ # SQL Constraints @@ -34,12 +25,6 @@ class AccOperationImportWizard(models.TransientModel): # ------------------------------------------------------ # 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 @@ -60,129 +45,36 @@ class AccOperationImportWizard(models.TransientModel): # ------------------------------------------------------ # Business methods # ------------------------------------------------------ - def valid_import(self): - message = "" - message += "<h1>Début Import manuelle: " + str(fields.Datetime.now()) + "</h1>" - for file in self.attachment_ids: - message += ( - "<p><strong>Fichier " - + file.name - + "</strong><br/>Début Import ... <br/>" - ) - data_filename = file.name.split("_") - id_pdm = data_filename[0] - - counter_id = self.env["acc.counter"].search([("name", "=", id_pdm)]) - - computed_data_type = data_filename[3].lower() - if computed_data_type != "prod" and computed_data_type != "surplus": - computed_data_type = data_filename[3].lower()[:-1] - - # Suppression des données si déjà existantes - 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 - ) - - # 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") - - 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["acc.enedis.cdc"].search(domain_all) - if rec_ids: - message += "Suppression des enregistrements existants ... <br/>" - rec_ids.unlink() - message += "Suppression des enregistrements existants OK <br/>" - - file_decode = io.StringIO(base64.b64decode(file.datas).decode("UTF-8")) - file_decode.seek(0) - - file_reader = [] - csv_reader = csv.reader(file_decode, delimiter=";") - file_reader.extend(csv_reader) - - # Create Data for the CDC - message += "Lecture et import des données ... <br/>" - for row in file_reader: - # Create 1st slot 0-30min - slot_datetime_tz = datetime.strptime(row[0], "%d/%m/%Y %H:%M") - slot_datetime_utc = local_to_utc(slot_datetime_tz, "Europe/Paris") - self.env["acc.enedis.cdc"].create( - { - "name": file.name, - "acc_operation_id": self.operation_id.id, - "acc_counter_id": counter_id.id, - "comp_data_type": computed_data_type, - "power": row[1], - "date_slot": slot_datetime_utc, - } - ) - # Create 2nd slot 30-60min - self.env["acc.enedis.cdc"].create( - { - "name": file.name, - "acc_operation_id": self.operation_id.id, - "acc_counter_id": counter_id.id, - "comp_data_type": computed_data_type, - "power": row[2], - "date_slot": slot_datetime_utc + timedelta(minutes=30), - } - ) - - # 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 computed_data_type 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() - message += "Fin de l'Import des données OK<br/>" - # Suppression du fichier après création des enregistrements - message += "Suppression du fichiers " + file.name + " ...<br/>" - file.unlink() - message += "Suppression OK </p>" - - message += "<h1>Fin Import manuelle: " + str(fields.Datetime.now()) + "</h1>" - # Logs information logs - log_id = self.env["acc.logs"].create( - { - "name": "Import du " + str(fields.Date.today()) + " manuelle", - "date_launched": fields.Datetime.now(), - "type_log": "manual", - "message": message, - "acc_operation_id": self.operation_id.id, - } + def delete_existing_data(self, data_filename, counter_id, message): + + # Suppression des données si déjà existantes + 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 ) - view_id = self.env.ref("oacc.acc_logs_form").id - return { - "name": "LOGS", - "view_type": "form", - "view_mode": "form", - "views": [(view_id, "form")], - "res_model": "acc.logs", - "view_id": view_id, - "type": "ir.actions.act_window", - "res_id": log_id.id, - "target": "new", - "flags": {"initial_mode": "view"}, - } + # 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") + + domain_all = [ + ("date_slot", ">=", start_datetime), + ("date_slot", "<", end_datetime), + ("acc_operation_id", "=", self.operation_id.id), + ("comp_data_type", "=", data_filename[3]), + ("acc_counter_id", "=", counter_id.id), + ] + rec_ids = self.env["acc.enedis.raw.cdc"].search(domain_all) + if rec_ids: + message += "Suppression des enregistrements existants ... <br/>" + rec_ids.unlink() + message += "Suppression des enregistrements existants OK <br/>" + + return message + + def create_curve(self, curve_data): + self.env["acc.enedis.raw.cdc"].create(curve_data) diff --git a/wizard/acc_operation_import_wizard_views.xml b/wizard/acc_operation_import_wizard_views.xml deleted file mode 100644 index 53a9b3c..0000000 --- a/wizard/acc_operation_import_wizard_views.xml +++ /dev/null @@ -1,36 +0,0 @@ -<?xml version="1.0" encoding="utf-8" ?> -<!-- Copyright 2021- Le Filament (https://le-filament.com) - License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). --> -<odoo> - - <record id="acc_operation_import_wizard_form" model="ir.ui.view"> - <field name="name">acc.operation.import.wizard.form</field> - <field name="model">acc.operation.import.wizard</field> - <field name="arch" type="xml"> - <form string="Import des fichiers"> - <div> - <field - class="o_field_header" - name="message" - readonly="1" - widget="html" - /> - </div> - <group> - <field name="operation_id" invisible="1" /> - <field name="attachment_ids" invisible="1" /> - </group> - <footer> - <button - name="valid_import" - type="object" - string="Valider l'import" - class="oe_highlight" - /> - <button special="cancel" string="Annuler" /> - </footer> - </form> - </field> - </record> - -</odoo> -- GitLab