Sélectionner une révision Git
acc_operation.py 6,12 Kio
# Copyright 2021 Le Filament (<http://www.le-filament.com>)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
import json
import base64
import pandas as pd
from io import StringIO
from odoo import fields, models, api
from datetime import datetime, timedelta, date
from odoo.exceptions import UserError
from odoo.tools import date_utils
from dateutil.relativedelta import relativedelta
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()