Skip to content
GitLab
Explorer
Connexion
Navigation principale
Rechercher ou aller à…
Projet
O
oacc_import_curves
Gestion
Activité
Membres
Labels
Programmation
Tickets
Tableaux des tickets
Jalons
Code
Requêtes de fusion
Dépôt
Branches
Validations
Étiquettes
Graphe du dépôt
Comparer les révisions
Analyse
Données d'analyse des chaînes de valeur
Analyse des contributeurs
Données d'analyse du dépôt
Aide
Aide
Support
Documentation de GitLab
Comparer les forfaits GitLab
Forum de la communauté GitLab
Contribuer à GitLab
Donner votre avis
Raccourcis clavier
?
Extraits de code
Groupes
Projets
Afficher davantage de fils d'Ariane
Le Filament
Opération Auto-Consommation Collective
oacc_import_curves
Validations
45713dc3
Valider
45713dc3
rédigé
Il y a 9 mois
par
Rémi - Le Filament
Parcourir les fichiers
Options
Téléchargements
Correctifs
Plain Diff
[UPD] get all functions in this module
parent
78a86c87
Aucune branche associée trouvée
Aucune étiquette associée trouvée
1 requête de fusion
!1
[UPD] get all import functions in this module
Modifications
3
Afficher les modifications d'espaces
En ligne
Côte à côte
Affichage de
3 fichiers modifiés
__manifest__.py
+1
-7
1 ajout, 7 suppressions
__manifest__.py
models/acc_operation.py
+132
-98
132 ajouts, 98 suppressions
models/acc_operation.py
wizard/acc_operation_import_wizard.py
+75
-27
75 ajouts, 27 suppressions
wizard/acc_operation_import_wizard.py
avec
208 ajouts
et
132 suppressions
__manifest__.py
+
1
−
7
Voir le fichier @
45713dc3
...
@@ -7,19 +7,13 @@
...
@@ -7,19 +7,13 @@
"
license
"
:
"
AGPL-3
"
,
"
license
"
:
"
AGPL-3
"
,
"
depends
"
:
[
"
oacc
"
],
"
depends
"
:
[
"
oacc
"
],
"
data
"
:
[
"
data
"
:
[
"
security/ir.model.access.csv
"
,
# datas
# datas
# views
# views
# views menu
# views menu
# wizard
# wizard
"
wizard/acc_operation_import_wizard_views.xml
"
,
"
wizard/acc_operation_import_wizard_views.xml
"
,
],
],
"
assets
"
:
{
"
web._assets_primary_variables
"
:
[],
"
web._assets_frontend_helpers
"
:
[],
"
web.assets_frontend
"
:
[],
"
web.assets_tests
"
:
[],
"
web.assets_qweb
"
:
[],
},
"
installable
"
:
True
,
"
installable
"
:
True
,
"
auto_install
"
:
False
,
"
auto_install
"
:
False
,
}
}
Ce diff est replié.
Cliquez pour l'agrandir.
models/acc_operation.py
+
132
−
98
Voir le fichier @
45713dc3
...
@@ -2,6 +2,7 @@
...
@@ -2,6 +2,7 @@
# 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)
from
datetime
import
datetime
from
datetime
import
datetime
from
os.path
import
splitext
from
os.path
import
splitext
from
dateutil.relativedelta
import
relativedelta
from
dateutil.relativedelta
import
relativedelta
from
odoo
import
_
,
models
from
odoo
import
_
,
models
...
@@ -40,28 +41,41 @@ class AccOperation(models.Model):
...
@@ -40,28 +41,41 @@ class AccOperation(models.Model):
# ------------------------------------------------------
# ------------------------------------------------------
# Actions
# Actions
# ------------------------------------------------------
# ------------------------------------------------------
def
import_check_docs
(
self
,
files
):
# ------------------------------------------------------
# Business methods
# ------------------------------------------------------
def
_import_check_docs
(
self
,
model
):
raise_error
=
False
error_msg
=
""
mess
=
""
mess
=
""
if
not
model
:
raise
ValidationError
(
_
(
"
Le type de courbes à importer n
'
est pas défini
"
))
self
.
ensure_one
()
files
=
self
.
env
[
"
ir.attachment
"
].
search
(
[(
"
res_model
"
,
"
=
"
,
"
acc.operation
"
),
(
"
res_id
"
,
"
=
"
,
self
.
id
)]
)
if
not
files
:
if
not
files
:
raise
Validation
Error
(
raise
User
Error
(
_
(
_
(
"
Aucun fichier à intégrer. Pour joindre des fichiers,
"
"
Aucun fichier à intégrer. Pour joindre des fichiers,
"
"
veuillez cliquer sur l’icône trombone se trouvant dans
"
"
veuillez cliquer sur l’icône trombone se trouvant dans
"
"
le bloc Chatter à droite
"
"
le bloc Chatter à droite (ou en-dessous en fonction de
"
"
la résolution de votre écran).
"
)
)
)
)
else
:
files
.
mapped
(
"
name
"
)
for
file
in
files
:
for
file
in
files
:
file_suffix
=
splitext
(
file
.
name
)[
1
]
file_suffix
=
splitext
(
file
.
name
)[
1
]
file_name
=
splitext
(
file
.
name
)[
0
]
file_name
=
splitext
(
file
.
name
)[
0
]
if
file_suffix
!=
"
.csv
"
:
if
file_suffix
!=
"
.csv
"
:
raise
ValidationError
(
raise_error
=
True
error_msg
+=
(
_
(
_
(
"
Le fichier %s ne semble pas être au bon format.
"
"
Le fichier %s ne semble pas être au bon format.
"
"
Format CSV attendu.
"
"
Format CSV attendu.
\n
"
)
)
%
file
.
name
%
file
.
name
)
)
...
@@ -69,21 +83,24 @@ class AccOperation(models.Model):
...
@@ -69,21 +83,24 @@ class AccOperation(models.Model):
data_filename
=
file_name
.
split
(
"
_
"
)
data_filename
=
file_name
.
split
(
"
_
"
)
if
len
(
data_filename
)
!=
5
:
if
len
(
data_filename
)
!=
5
:
raise
ValidationError
(
raise_error
=
True
error_msg
+=
(
_
(
_
(
"
Le fichier %s ne semble pas correspondre
"
"
Le fichier %s ne semble pas correspondre
"
"
au fichier attendu. Ex de nom de fichier correct:
"
"
au fichier attendu. Ex de nom de fichier correct:
"
"'
23555861012080_09022023_08032023_Conso_CDC
'
.
"
"'
23555861012080_09022023_08032023_Conso_CDC
'
.
\n
"
)
)
%
file
.
name
%
file
.
name
)
)
continue
date_begin_str
=
data_filename
[
1
]
date_begin_str
=
data_filename
[
1
]
date_end_str
=
data_filename
[
2
]
date_end_str
=
data_filename
[
2
]
# Contrôles sur le type de données CDC
# Contrôles sur le type de données CDC
if
data_filename
[
3
]
not
in
[
"
Prod
"
,
"
Conso
"
,
"
Autoconso
"
,
"
Surplus
"
]:
if
data_filename
[
3
]
not
in
[
"
Prod
"
,
"
Conso
"
,
"
Autoconso
"
,
"
Surplus
"
]:
raise
UserError
(
raise_error
=
True
error_msg
+=
(
_
(
_
(
"
Le fichier %s ne correspond à aucun type
"
"
Le fichier %s ne correspond à aucun type
"
"
de courbes de charge. il doit contenir Prod, Conso,
"
"
de courbes de charge. il doit contenir Prod, Conso,
"
...
@@ -93,33 +110,38 @@ class AccOperation(models.Model):
...
@@ -93,33 +110,38 @@ class AccOperation(models.Model):
)
)
computed_data_type
=
data_filename
[
3
].
lower
()
computed_data_type
=
data_filename
[
3
].
lower
()
if
computed_data_type
==
"
conso
"
:
computed_data_type
=
"
cons
"
elif
computed_data_type
==
"
autoconso
"
:
computed_data_type
=
"
autocons
"
# Contrôle sur le type de données
# Contrôle sur le type de données
file_suffix
=
data_filename
[
4
]
file_suffix
=
data_filename
[
4
]
if
file_suffix
!=
"
CDC
"
:
if
file_suffix
!=
"
CDC
"
:
raise
UserError
(
raise_error
=
True
error_msg
+=
(
_
(
_
(
"
Le fichier %s n
'
a pas le bon type de format,
"
"
Le fichier %s n
'
a pas le bon type de format,
"
"
il doit se terminer par
'
CDC
'
.
"
"
il doit se terminer par
'
CDC
'
.
\n
"
)
)
%
file
.
name
%
file
.
name
)
)
# Contrôle PRM
# Contrôle PRM
id_prm
=
data_filename
[
0
]
id_prm
=
data_filename
[
0
]
# Vérification exist
a
nce PRM
# Vérification exist
e
nce PRM
counter_id
=
self
.
env
[
"
acc.counter
"
].
search
([(
"
name
"
,
"
=
"
,
id_prm
)])
counter_id
=
self
.
env
[
"
acc.counter
"
].
search
([(
"
name
"
,
"
=
"
,
id_prm
)])
if
not
counter_id
:
if
not
counter_id
:
raise
ValidationError
(
raise
_error
=
True
_
(
"
Fichier %(file)s : L
'
ID PRM %(prm)s ne semble pas exister.
"
)
error_msg
+=
_
(
%
{
"
file
"
:
file
.
name
,
"
prm
"
:
id_prm
}
"
Fichier %(file)s : L
'
ID PRM %(prm)s ne semble pas exister.
\n
"
)
)
%
{
"
file
"
:
file
.
name
,
"
prm
"
:
id_prm
}
date_format
=
"
%d%m%Y
"
date_format
=
"
%d%m%Y
"
date_begin_obj
=
datetime
.
strptime
(
date_begin_str
,
date_format
)
date_begin_obj
=
datetime
.
strptime
(
date_begin_str
,
date_format
)
date_end_obj
=
datetime
.
strptime
(
date_end_obj
=
datetime
.
strptime
(
date_end_str
,
date_format
)
+
relativedelta
(
date_end_str
,
date_format
days
=
1
)
+
relativedelta
(
days
=
1
)
)
# Vérification si des données existent déjà
# Vérification si des données existent déjà
# pour cet intervalle de date
# pour cet intervalle de date
...
@@ -133,7 +155,7 @@ class AccOperation(models.Model):
...
@@ -133,7 +155,7 @@ class AccOperation(models.Model):
(
"
comp_data_type
"
,
"
=
"
,
computed_data_type
),
(
"
comp_data_type
"
,
"
=
"
,
computed_data_type
),
(
"
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
[
model
].
search
(
domain_all
)
if
rec_ids
:
if
rec_ids
:
mess
+=
(
mess
+=
(
"
<p>Fichier
"
"
<p>Fichier
"
...
@@ -147,12 +169,24 @@ class AccOperation(models.Model):
...
@@ -147,12 +169,24 @@ class AccOperation(models.Model):
)
)
else
:
else
:
mess
+=
(
mess
+=
(
"
<p>Fichier
"
"
<p>Fichier
"
+
file
.
name
+
"
: <strong>Prêt à importer</strong></p>
"
+
file
.
name
+
"
: <strong>Prêt à importer</strong></p>
"
)
)
return
mess
if
raise_error
:
raise
ValidationError
(
error_msg
)
# ------------------------------------------------------
if
mess
:
# Business methods
wizard
=
self
.
env
[
"
acc.operation.import.wizard
"
].
create
(
# ------------------------------------------------------
{
"
operation_id
"
:
self
.
id
,
"
attachment_ids
"
:
files
,
"
model
"
:
model
,
"
message
"
:
mess
,
}
)
return
{
"
name
"
:
"
Confirmation d
'
import
"
,
"
type
"
:
"
ir.actions.act_window
"
,
"
view_mode
"
:
"
form
"
,
"
res_model
"
:
"
acc.operation.import.wizard
"
,
"
res_id
"
:
wizard
.
id
,
"
target
"
:
"
new
"
,
}
Ce diff est replié.
Cliquez pour l'agrandir.
wizard/acc_operation_import_wizard.py
+
75
−
27
Voir le fichier @
45713dc3
...
@@ -7,7 +7,7 @@ from datetime import datetime, timedelta
...
@@ -7,7 +7,7 @@ from datetime import datetime, timedelta
from
dateutil.relativedelta
import
relativedelta
from
dateutil.relativedelta
import
relativedelta
from
odoo
import
api
,
fields
,
models
from
odoo
import
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
...
@@ -21,8 +21,9 @@ class AccOperationImportWizard(models.TransientModel):
...
@@ -21,8 +21,9 @@ class AccOperationImportWizard(models.TransientModel):
# ------------------------------------------------------
# ------------------------------------------------------
operation_id
=
fields
.
Many2one
(
"
acc.operation
"
,
"
Opération liée
"
)
operation_id
=
fields
.
Many2one
(
"
acc.operation
"
,
"
Opération liée
"
)
message
=
fields
.
Text
(
message
=
fields
.
Text
(
string
=
"
Message Log
s
"
,
string
=
"
Message Log
"
,
)
)
model
=
fields
.
Selection
(
selection
=
[],
required
=
True
)
attachment_ids
=
fields
.
Many2many
(
attachment_ids
=
fields
.
Many2many
(
comodel_name
=
"
ir.attachment
"
,
string
=
"
Documents à importer
"
comodel_name
=
"
ir.attachment
"
,
string
=
"
Documents à importer
"
)
)
...
@@ -34,12 +35,6 @@ class AccOperationImportWizard(models.TransientModel):
...
@@ -34,12 +35,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,27 +55,77 @@ class AccOperationImportWizard(models.TransientModel):
...
@@ -60,27 +55,77 @@ class AccOperationImportWizard(models.TransientModel):
# ------------------------------------------------------
# ------------------------------------------------------
# Business methods
# Business methods
# ------------------------------------------------------
# ------------------------------------------------------
def
delete_existing_data
(
self
,
data_filename
,
counter_id
,
message
):
def
delete_existing_data
(
self
,
data_filename
,
counter_id
):
"""
message
=
""
deleting existing data depends of wich curves type you import
# Suppression des données si déjà existantes
implemented in each modules
date_begin_str
=
data_filename
[
1
]
"""
date_end_str
=
data_filename
[
2
]
message
+=
"
Delete data not implemented
"
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
"
)
computed_data_type
=
data_filename
[
3
].
lower
()
if
computed_data_type
==
"
conso
"
:
computed_data_type
=
"
cons
"
elif
computed_data_type
==
"
autoconso
"
:
computed_data_type
=
"
autocons
"
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
[
self
.
model
].
search
(
domain_all
)
if
rec_ids
:
message
+=
"
Suppression des enregistrements existants ... <br/>
"
rec_ids
.
unlink
()
message
+=
"
Suppression des enregistrements existants OK <br/>
"
return
message
return
message
def
create_curve
(
self
,
curve_data
):
def
create_curve
(
self
,
curve_data
):
"""
self
.
env
[
self
.
model
].
create
(
curve_data
)
creating curve depends of wich curves type you import
implemented in each modules
"""
pass
def
update_partner_id
(
self
,
data_filename
,
counter_id
):
def
update_partner_id
(
self
,
data_filename
,
counter_id
):
pass
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
)
# 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
data_filename
[
3
]
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
(
model
=
self
.
model
)
def
valid_import
(
self
):
def
valid_import
(
self
):
message
=
""
message
=
""
message
+=
"
<h1>Début Import manuelle:
"
+
str
(
fields
.
Datetime
.
now
())
+
"
</h1>
"
message
+=
(
"
<h1>Début Import manuel:
"
+
str
(
fields
.
Datetime
.
now
())
+
"
-
"
+
self
.
model
+
"
</h1>
"
)
for
file
in
self
.
attachment_ids
:
for
file
in
self
.
attachment_ids
:
message
+=
(
message
+=
(
"
<p><strong>Fichier
"
"
<p><strong>Fichier
"
...
@@ -96,8 +141,8 @@ class AccOperationImportWizard(models.TransientModel):
...
@@ -96,8 +141,8 @@ class AccOperationImportWizard(models.TransientModel):
if
data_filename
[
3
]
not
in
[
"
prod
"
,
"
surplus
"
]:
if
data_filename
[
3
]
not
in
[
"
prod
"
,
"
surplus
"
]:
data_filename
[
3
]
=
data_filename
[
3
][:
-
1
]
data_filename
[
3
]
=
data_filename
[
3
][:
-
1
]
message
=
self
.
delete_existing_data
(
message
+
=
self
.
delete_existing_data
(
data_filename
=
data_filename
,
counter_id
=
counter_id
,
message
=
message
data_filename
=
data_filename
,
counter_id
=
counter_id
)
)
file_decode
=
io
.
StringIO
(
base64
.
b64decode
(
file
.
datas
).
decode
(
"
UTF-8
"
))
file_decode
=
io
.
StringIO
(
base64
.
b64decode
(
file
.
datas
).
decode
(
"
UTF-8
"
))
...
@@ -144,17 +189,20 @@ class AccOperationImportWizard(models.TransientModel):
...
@@ -144,17 +189,20 @@ class AccOperationImportWizard(models.TransientModel):
self
.
update_partner_id
(
data_filename
,
counter_id
)
self
.
update_partner_id
(
data_filename
,
counter_id
)
message
+=
"
Fin de l
'
I
mport des données OK<br/>
"
message
+=
"
Fin de l
'
i
mport des données OK<br/>
"
# Suppression du fichier après création des enregistrements
# Suppression du fichier après création des enregistrements
message
+=
"
Suppression du fichier
s
"
+
file
.
name
+
"
...<br/>
"
message
+=
"
Suppression du fichier
"
+
file
.
name
+
"
...<br/>
"
file
.
unlink
()
file
.
unlink
()
message
+=
"
Suppression OK </p>
"
message
+=
"
Suppression OK </p>
"
message
+=
"
<h1>Fin
I
mport manuel
le
:
"
+
str
(
fields
.
Datetime
.
now
())
+
"
</h1>
"
message
+=
"
<h1>Fin
i
mport manuel:
"
+
str
(
fields
.
Datetime
.
now
())
+
"
</h1>
"
# Logs information logs
# Logs information logs
log_id
=
self
.
env
[
"
acc.logs
"
].
create
(
log_id
=
self
.
env
[
"
acc.logs
"
].
create
(
{
{
"
name
"
:
"
Import du
"
+
str
(
fields
.
Date
.
today
())
+
"
manuelle
"
,
"
name
"
:
"
Import du
"
+
str
(
fields
.
Date
.
today
())
+
"
manuel -
"
+
self
.
model
,
"
date_launched
"
:
fields
.
Datetime
.
now
(),
"
date_launched
"
:
fields
.
Datetime
.
now
(),
"
type_log
"
:
"
manual
"
,
"
type_log
"
:
"
manual
"
,
"
message
"
:
message
,
"
message
"
:
message
,
...
...
Ce diff est replié.
Cliquez pour l'agrandir.
Aperçu
0%
Chargement en cours
Veuillez réessayer
ou
joindre un nouveau fichier
.
Annuler
You are about to add
0
people
to the discussion. Proceed with caution.
Terminez d'abord l'édition de ce message.
Enregistrer le commentaire
Annuler
Veuillez vous
inscrire
ou vous
se connecter
pour commenter