Sélectionner une révision Git
scop_period_wizard.py
Bifurcation depuis
Le Filament / Confédération Générale des SCOP / cgscop_partner
Le projet source a une visibilité limitée.
acc_operation.py 6,34 Kio
# Copyright 2021 Le Filament (<http://www.le-filament.com>)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
import base64
from datetime import datetime, timedelta
from io import StringIO
import pandas as pd
from odoo import _, api, fields, models
from odoo.exceptions import UserError
class AccOperation(models.Model):
_name = "acc.operation"
_inherit = ["mail.thread", "image.mixin"]
_description = "Opération"
# ------------------------------------------------------
# Fields declaration
# ------------------------------------------------------
active = fields.Boolean(default=True)
name = fields.Char("ID Convention Enedis", required=True)
description = fields.Char("Description")
pmo_id = fields.Many2one(
comodel_name="res.partner",
string="PMO",
domain="[('is_pmo', '=', True)]",
required=True,
)
acc_injection_ids = fields.One2many(
comodel_name="acc.counter",
inverse_name="acc_operation_id",
domain=[("is_injection", "=", True)],
string="Points d'injection",
)
acc_delivery_ids = fields.One2many(
comodel_name="acc.counter",
inverse_name="acc_operation_id",
domain=[("is_delivery", "=", True)],
string="Points de soutirage",
)
acc_enedis_import_logs_ids = fields.One2many(
comodel_name="acc.enedis.import.logs",
inverse_name="acc_operation_id",
string="Table des logs",
)
acc_enedis_cdc_ids = fields.One2many(
comodel_name="acc.enedis.cdc",
inverse_name="acc_operation_id",
string="Table des courbes",
)
distribution_key = fields.Selection(
[
("statique", "Statique"),
("dynamique", "Dynamique par défaut"),
("dynamique_perso", "Dynamique personnalisée"),
],
string="Clés de répartition",
)
date_start_contract = fields.Date(
string="Date de début", default=fields.Date.context_today
)
date_end_contract = fields.Date(
string="Date de fin", default=fields.Date.context_today
)
birthday_date = fields.Integer(
string="Date d'anniversaire calculée",
compute="_compute_birthday_date",
store=True,
)
# ------------------------------------------------------
# SQL Constraints
# ------------------------------------------------------
# ------------------------------------------------------
# Default methods
# ------------------------------------------------------
# ------------------------------------------------------
# Computed fields / Search Fields
# ------------------------------------------------------
@api.depends("date_start_contract")
def _compute_birthday_date(self):
for operation in self:
if operation.date_start_contract:
operation.birthday_date = operation.date_start_contract.day
# ------------------------------------------------------
# Onchange / Constraints
# ------------------------------------------------------
# ------------------------------------------------------
# CRUD methods (ORM overrides)
# ------------------------------------------------------
# ------------------------------------------------------
# Actions
# ------------------------------------------------------
def import_enedis_data(self):
for operation in self:
files = self.env["ir.attachment"].search(
[("res_model", "=", "acc.operation"), ("res_id", "=", operation.id)]
)
if not files:
raise UserError(_("Pas de fichiers à intégrer"))
else:
for file in files:
data_filename = file.name.split("_")
id_pdm = data_filename[0]
counter_id = self.env["acc.counter"]
if id_pdm != self.name:
# Get the counter ID from file name
counter_id = self.env["acc.counter"].search(
[("name", "=", id_pdm)]
)
computed_data_type = data_filename[3]
file_decode = StringIO(base64.b64decode(file.datas).decode("UTF-8"))
file_decode.seek(0)
# reader = pd.read_csv(file_decode, header=None, delimiter=';')
reader = pd.read_csv(file_decode, header=None, delimiter=";")
if data_filename[4] == "CDC.csv":
# Create Data for the CDC
for row in reader.values:
# Create 1st slot 0-30min
date_slot = datetime.strptime(row[0], "%d/%m/%Y %H:%M")
# date_slot = row[0]
self.env["acc.enedis.cdc"].create(
{
"name": file.name,
"acc_operation_id": self.id,
"acc_counter_id": counter_id.id or False,
"comp_data_type": computed_data_type,
"power": row[1],
"date_slot": date_slot,
}
)
# Create 2nd slot 30-60min
date_slot_30 = date_slot + timedelta(minutes=30)
self.env["acc.enedis.cdc"].create(
{
"name": file.name,
"acc_operation_id": self.id,
"acc_counter_id": counter_id.id or False,
"comp_data_type": computed_data_type,
"power": row[2],
"date_slot": date_slot_30,
}
)
# Logs information logs
self.env["acc.enedis.import.logs"].create(
{
"name": file.name,
"acc_operation_id": self.id,
}
)
# Delete file after creation
file.unlink()