Skip to content
Extraits de code Groupes Projets
Valider 6aade582 rédigé par Julien - Le Filament's avatar Julien - Le Filament
Parcourir les fichiers

[ADD] module creation

parent 9a9f0c7c
Branches
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
"website": "https://le-filament.com", "website": "https://le-filament.com",
"version": "16.0.1.0.0", "version": "16.0.1.0.0",
"license": "AGPL-3", "license": "AGPL-3",
"depends": ["oacc"], "depends": ["oacc", "oacc_raw_curves"],
"data": [ "data": [
"security/ir.model.access.csv", "security/ir.model.access.csv",
# datas # datas
...@@ -13,7 +13,7 @@ ...@@ -13,7 +13,7 @@
"views/acc_operation_views.xml", "views/acc_operation_views.xml",
# views menu # views menu
# wizard # wizard
"wizard/acc_operation_import_wizard_views.xml",
], ],
"assets": { "assets": {
"web._assets_primary_variables": [], "web._assets_primary_variables": [],
......
Fichier ajouté
Aucun aperçu pour ce type de fichier
...@@ -40,122 +40,7 @@ class AccOperation(models.Model): ...@@ -40,122 +40,7 @@ class AccOperation(models.Model):
# ------------------------------------------------------ # ------------------------------------------------------
# Actions # Actions
# ------------------------------------------------------ # ------------------------------------------------------
def import_check_docs(self, files): def import_raw_cdc(self):
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):
# vérification des documents à importer # vérification des documents à importer
mess = "" mess = ""
for operation in self: for operation in self:
......
...@@ -2,7 +2,6 @@ ...@@ -2,7 +2,6 @@
<!-- Copyright 2021- Le Filament (https://le-filament.com) <!-- Copyright 2021- Le Filament (https://le-filament.com)
License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). --> License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). -->
<odoo> <odoo>
<record id="acc_operation_form_view" model="ir.ui.view"> <record id="acc_operation_form_view" model="ir.ui.view">
<field name="name">acc.acc_operation.form.import</field> <field name="name">acc.acc_operation.form.import</field>
<field name="model">acc.operation</field> <field name="model">acc.operation</field>
...@@ -10,14 +9,13 @@ ...@@ -10,14 +9,13 @@
<field name="arch" type="xml"> <field name="arch" type="xml">
<xpath expr="//header" position="inside"> <xpath expr="//header" position="inside">
<button <button
string="Intégration des données manuelle" string="Intégration des brutes"
type="object" type="object"
class="btn-primary" class="btn-primary"
name="import_cdc" name="import_raw_cdc"
groups="oacc.group_operation_superadmin" groups="oacc.group_operation_superadmin"
/> />
</xpath> </xpath>
</field> </field>
</record> </record>
</odoo> </odoo>
\ No newline at end of file
Aucun aperçu pour ce type de fichier
Aucun aperçu pour ce type de fichier
# Copyright 2021- Le Filament (https://le-filament.com) # Copyright 2021- Le Filament (https://le-filament.com)
# 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)
import base64
import csv
import io from odoo import api, fields, models
from datetime import datetime, timedelta from datetime import datetime, timedelta
from dateutil.relativedelta import relativedelta from dateutil.relativedelta import relativedelta
...@@ -11,21 +11,12 @@ from odoo import api, fields, models ...@@ -11,21 +11,12 @@ from odoo import api, 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
class AccOperationImportWizard(models.TransientModel): class AccOperationImportWizard(models.TransientModel):
_name = "acc.operation.import.wizard" _inherit = "acc.operation.import.wizard"
_description = "Wizard: Import des données brutes"
# ------------------------------------------------------ # ------------------------------------------------------
# Fields declaration # 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 # SQL Constraints
...@@ -34,12 +25,6 @@ class AccOperationImportWizard(models.TransientModel): ...@@ -34,12 +25,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,23 +45,7 @@ class AccOperationImportWizard(models.TransientModel): ...@@ -60,23 +45,7 @@ class AccOperationImportWizard(models.TransientModel):
# ------------------------------------------------------ # ------------------------------------------------------
# Business methods # Business methods
# ------------------------------------------------------ # ------------------------------------------------------
def valid_import(self): def delete_existing_data(self, data_filename, counter_id, message):
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 # Suppression des données si déjà existantes
date_begin_str = data_filename[1] date_begin_str = data_filename[1]
...@@ -96,93 +65,16 @@ class AccOperationImportWizard(models.TransientModel): ...@@ -96,93 +65,16 @@ class AccOperationImportWizard(models.TransientModel):
("date_slot", ">=", start_datetime), ("date_slot", ">=", start_datetime),
("date_slot", "<", end_datetime), ("date_slot", "<", end_datetime),
("acc_operation_id", "=", self.operation_id.id), ("acc_operation_id", "=", self.operation_id.id),
("comp_data_type", "=", computed_data_type), ("comp_data_type", "=", data_filename[3]),
("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["acc.enedis.raw.cdc"].search(domain_all)
if rec_ids: if rec_ids:
message += "Suppression des enregistrements existants ... <br/>" message += "Suppression des enregistrements existants ... <br/>"
rec_ids.unlink() rec_ids.unlink()
message += "Suppression des enregistrements existants OK <br/>" message += "Suppression des enregistrements existants OK <br/>"
file_decode = io.StringIO(base64.b64decode(file.datas).decode("UTF-8")) return message
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,
}
)
view_id = self.env.ref("oacc.acc_logs_form").id def create_curve(self, curve_data):
return { self.env["acc.enedis.raw.cdc"].create(curve_data)
"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"},
}
<?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>
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