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

add api handler

parent 8efae261
Aucune branche associée trouvée
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
......@@ -5,7 +5,7 @@
"website": "https://le-filament.com",
"version": "16.0.1.0.0",
"license": "AGPL-3",
"depends": ["oacc"],
"depends": ["oacc", "api_enedis_acc"],
"data": [
"security/ir.model.access.csv",
# datas
......
from . import acc_operation
from . import acc_repartition_keys
from . import api_enedis_acc
# Copyright 2021- Le Filament (https://le-filament.com)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html)
from odoo import _, api, models
class ApiEnedisAcc(models.AbstractModel):
_inherit = "api.enedis.acc"
# ------------------------------------------------------
# Actions
# ------------------------------------------------------
# ------------------------------------------------------
# Business methods
# ------------------------------------------------------
@api.model
def send_repartition_key(self, key, operation_name):
""" """
uri = f"{self.name}{key.get('route')}"
return self._get_enedis(uri=uri, params=key.get("body"))
# ------------------------------------------------------
# Functions to manage route
# ------------------------------------------------------
......@@ -25,7 +25,11 @@ class RepartitionKeyEntryFile:
◦ Erreur envoyée “Ligne X : la somme dépasse 100%”
"""
check_methods = [self._check_counter, self._check_same_month, self._check_max_value]
check_methods = [
self._check_counter,
self._check_same_month,
self._check_max_value,
]
result = {"check": True, "message": ""}
for check in check_methods:
check_result = check()
......@@ -48,6 +52,7 @@ class RepartitionKeyEntryFile:
if line_count == 0:
line_count += 1
continue
# line[0] is horodatage
json[line[0]] = []
line_count += 1
counter_count = 1
......@@ -58,8 +63,9 @@ class RepartitionKeyEntryFile:
counter_count += 1
return json
def data_to_send(self, agreement_id, send_empty_key=False):
def data_to_send(self, agreement_id, send_empty_key=True):
"""
build route and body for api sending
return dict {"route", "body} to enedis
"""
call_list = []
......@@ -67,13 +73,14 @@ class RepartitionKeyEntryFile:
date = datetime.strptime(horo, "%d-%m-%Y %H:%M")
route = f"/agreements/{agreement_id}/repartition_keys/{date.strftime('%Y%m%dT%H%MZ')}"
body = []
# specification enedis si la somme des clefs est nulle on envoi un body vide
if self._get_key_sum(self.json.get(horo)) > 0:
for keys in self.json.get(horo):
if send_empty_key:
body.append(keys)
else:
if float(keys.get("key")) > 0:
body.append(keys)
if body:
call_list.append({"route": route, "body": body})
return call_list
......@@ -108,19 +115,10 @@ class RepartitionKeyEntryFile:
def _check_max_value(self):
"""
check if all value are in the same month
check if sum of all key is not > 100
"""
for hour in self.json:
max = 0
for key in self.json[hour]:
if key["key"] == "0.00000000":
key["key"] = 0.0
try:
max = max + float(key["key"])
except ValueError:
pass
if max > 100:
if self._get_key_sum(self.json.get(hour)) > 100:
return {
"check": False,
"message": f"Ligne {hour} la somme dépasse 100.",
......@@ -147,3 +145,20 @@ class RepartitionKeyEntryFile:
"message": "Les dates doivent être celles d’un seul mois complet.",
}
return {"check": True, "message": ""}
def _get_key_sum(self, horo):
"""
return the sum of key for a horodatage
[{ "id":id, "key":key}, ...]
"""
keys_sum = 0
for key in horo:
if key["key"] == "0.00000000":
key["key"] = 0.0
try:
keys_sum = keys_sum + float(key["key"])
except ValueError:
pass
return keys_sum
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data>
<record id="acc_keys_repatition_action" model="ir.actions.act_window">
<field name="name">Keys</field>
<field name="res_model">acc.repartition.keys</field>
<field name="view_mode">tree,form</field>
</record>
</data>
</odoo>
\ No newline at end of file
......@@ -9,17 +9,15 @@
<field name="arch" type="xml">
<xpath expr="//notebook" position="inside">
<page string="Clefs de répartition" name="keys">
<header>
<tree>
<field name="keys_repartition_ids" />
</tree>
<button
string="Importer un fichier"
type="action"
name="%(oacc_repartition_keys.acc_repartition_keys_wizard_action)d"
class="btn-primary"
/>
</header>
<tree>
<field name="keys_repartition_ids" />
</tree>
</page>
</xpath>
</field>
......
......@@ -10,7 +10,7 @@
<field name="name">acc.repartition.keys.tree</field>
<field name="model">acc.repartition.keys</field>
<field name="arch" type="xml">
<tree string="Keys" editable="bottom">
<tree string="Keys" create="false">
<field name="date_send"/>
<field name="csv_file"/>
<field name="operation_id"/>
......
# Copyright 2021- Le Filament (https://le-filament.com)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html)
import base64
from odoo import fields, models
import datetime
from odoo import api, fields, models
from odoo.exceptions import UserError
from ..tools.key_file import RepartitionKeyEntryFile
......@@ -41,7 +43,8 @@ class AccRepartitionKeysWizard(models.TransientModel):
# ------------------------------------------------------
# CRUD methods (ORM overrides)
# ------------------------------------------------------
def ignore(self):
return {'type': 'ir.actions.act_window_close'}
# ------------------------------------------------------
# Actions
# ------------------------------------------------------
......@@ -51,12 +54,15 @@ class AccRepartitionKeysWizard(models.TransientModel):
:return:
"""
if self.csv_file:
try:
file = (
base64.b64decode(self.csv_file)
.decode("utf-8")
.replace("\r", "")
.split("\n")
)
except UnicodeDecodeError:
raise UserError("Fichier de répartitions au mauvais format")
counter_list_from_operation = [
counter.name
......@@ -64,18 +70,36 @@ class AccRepartitionKeysWizard(models.TransientModel):
[("acc_operation_id.id", "=", self.operation_id.id)]
)
]
try:
entry_file_handler = RepartitionKeyEntryFile(
data=file, operation_counter_list=counter_list_from_operation
)
file_check_result = entry_file_handler.check()
except (ValueError, IndexError):
raise UserError("Fichier de répartitions au mauvais format")
if not file_check_result.get("check"):
raise UserError(file_check_result.get("message"))
data_to_send = entry_file_handler.data_to_send(agreement_id=self.operation_id.name)
data_to_send = entry_file_handler.data_to_send(
agreement_id=self.operation_id.name
)
for key in data_to_send:
response = self.env["api.enedis.acc"].send_repartition_key(
key=key, operation_name=self.operation_id.name
)
print(response)
self.env["acc.repartition.keys"].create(
{
"csv_file": self.csv_file,
"date_send": datetime.datetime.today(),
"operation_id": self.operation_id.id,
}
)
else:
raise UserError("Fichier de répartition non chargé")
# ------------------------------------------------------
# Business methods
......
......@@ -5,17 +5,21 @@
<field name="model">acc.repartition.keys.wizard</field>
<field name="arch" type="xml">
<form string="Création clefs de repartition">
<header>
<field name="csv_file"/>
<footer>
<button
class="btn btn-primary"
name="send_imported_file"
type="object"
string="Envoyer a enedis"
/>
</header>
<group name="keys" string="Clefs de repartition" col="2">
<field name="csv_file"/>
</group>
<button
class="btn btn-primary"
name="ignore"
type="object"
string="Ignorer"
/>
</footer>
</form>
</field>
</record>
......
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