From 8830e7eb1c5df55f10c3c40f66a93a0473afddd4 Mon Sep 17 00:00:00 2001 From: Benjamin <35699580+benj-filament@users.noreply.github.com> Date: Wed, 16 Oct 2019 11:28:46 +0200 Subject: [PATCH] =?UTF-8?q?modification=20API=20avec=20cl=C3=A9=20=3D=20no?= =?UTF-8?q?deRef=20et=20impl=C3=A9mentation=20cr=C3=A9ation,=20suppression?= =?UTF-8?q?=20et=20mise=20=C3=A0=20jour=20dossier?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.rst | 8 ++++- __manifest__.py | 5 ++- models/alfresco_partner_files.py | 2 +- models/api_alfresco.py | 49 ++++++++++++++----------- models/res_partner.py | 61 ++++++++++++++++++++++++++++++-- views/assets.xml | 2 +- wizard/add_file_wizard.py | 31 +++++++++++++--- 7 files changed, 123 insertions(+), 35 deletions(-) diff --git a/README.rst b/README.rst index f345332..d17c3e7 100644 --- a/README.rst +++ b/README.rst @@ -12,7 +12,13 @@ Description Ce module permet de lire, créer, supprimer les documents depuis Alfresco. -Il utilise l'API Alfresco développée spécifiquement pour le projet de la CG Scop. +Il utilise l'API Alfresco développée spécifiquement pour le projet de la CG Scop qui impémente les fonctions suivantes : + +* Création d'un dossier : lors de la création d'un organisme +* Mise à jour d'un dossier : lors des la mise à jour d'un organisme sur les champs nom, SIRET et n° adhérent +* Liste des fichiers pour un organisme +* Ajout d'un fichier +* Suppression d'un dossier : lors de la suppression d'un organisme Usage diff --git a/__manifest__.py b/__manifest__.py index 1b64faf..ad23b2b 100644 --- a/__manifest__.py +++ b/__manifest__.py @@ -1,6 +1,6 @@ { "name": "CG SCOP - Connecteur Alfresco", - "summary": "CG SCOP - Connecteur Alfresco", + "summary": "Connecteur Alfresco", "version": "12.0.1.0.1", "development_status": "Beta", "author": "Le Filament", @@ -12,9 +12,8 @@ 'cgscop_partner' ], "data": [ - # "security/ir.model.access.csv", "datas/ir_config_parameter.xml", - # "views/assets.xml", # supprime le bouton ajouter un fichier en attendant validation de la CG + "views/assets.xml", "views/alfresco_partner_files.xml", "views/res_partner.xml", "wizard/add_file_wizard.xml", diff --git a/models/alfresco_partner_files.py b/models/alfresco_partner_files.py index abb2ea2..32749a0 100644 --- a/models/alfresco_partner_files.py +++ b/models/alfresco_partner_files.py @@ -6,7 +6,7 @@ from odoo import models, fields, api class AlfrescoPartnerFiles(models.TransientModel): _name = 'alfresco.partner.files' - _inherit = 'connector.alfresco' + _inherit = 'cgscop.alfresco' _description = "Requete fichiers par organisme" name = fields.Char('Nom du Fichier') diff --git a/models/api_alfresco.py b/models/api_alfresco.py index 3c419e9..790a52c 100644 --- a/models/api_alfresco.py +++ b/models/api_alfresco.py @@ -37,19 +37,16 @@ class CgscopAlfresco(models.AbstractModel): if call_type == 'get': response = requests.get( alfresco_url + url, - auth=basicAuthCredentials, - verify=False,) + auth=basicAuthCredentials,) elif call_type == 'post': response = requests.post( alfresco_url + url, auth=basicAuthCredentials, - verify=False, json=json) elif call_type == 'delete': response = requests.delete( alfresco_url + url, auth=basicAuthCredentials, - verify=False, json=json) except Exception as err: _logger.warning( @@ -57,24 +54,21 @@ class CgscopAlfresco(models.AbstractModel): err.__str__(), ) if response.status_code not in [200, 201]: - if 'Le dossier organisme est inexistant' in response.json().get('message'): - print(response.json().get('message')) - else: - raise exceptions.Warning( - "L'appel url '%s' a échoué\n" - "- Code erreur : %d\n" - "- Message : %s" % ( - response.url, - response.status_code, - response.json().get('message'))) + raise exceptions.Warning( + "L'appel url '%s' a échoué\n" + "- Code erreur : %d\n" + "- Message : %s" % ( + response.url, + response.status_code, + response.json().get('message'))) return response.json() # Get Methods - def alfresco_list_docs(self, name): + def alfresco_list_docs(self, node_id): """ Liste les documents pour un organisme (raison sociale) :param name: raison sociale de la structure """ - url = '/alfresco/s/erp/listedocuments?raisonSociale=' + name + url = '/alfresco/s/erp/listedocuments?nodeId=' + node_id return self.alfresco_get_by_url(url=url, call_type='get') def alfresco_list_type(self): @@ -121,6 +115,23 @@ class CgscopAlfresco(models.AbstractModel): return self.get_nodeRef( self.alfresco_get_by_url(url=url, call_type='post', json=json)) + def alfresco_update_organism(self, partner): + """ Mise à jour d'un dossier Organisme + + :param partner: objet Odoo créé + + @return: id Alfresco (nodeRef) du dossier + """ + url = '/alfresco/s/erp/updatedossierorganisme/' + partner.id_alfresco + json = { + 'raisonSociale': partner.name, + "id": partner.id, + "siret": partner.siret, + "numAdherent": partner.member_number + } + return self.get_nodeRef( + self.alfresco_get_by_url(url=url, call_type='post', json=json)) + def alfresco_upload(self, partner, type, periode, validite, filename, mimetype, doc): """ Upload d'un document sur Alfresco @@ -130,10 +141,7 @@ class CgscopAlfresco(models.AbstractModel): """ url = '/alfresco/s/erp/depotdocument' json = { - 'raisonSociale': partner.name, - 'id': partner.id, - 'siret': partner.siret, - 'numAdherent': partner.member_number, + 'folderNodeId': partner.id_alfresco, 'periode': periode, 'type': type, 'nomOrigine': filename, @@ -141,7 +149,6 @@ class CgscopAlfresco(models.AbstractModel): 'validite': validite, 'contentBase64': doc, } - print(json) return self.get_nodeRef( self.alfresco_get_by_url(url=url, call_type='post', json=json)) diff --git a/models/res_partner.py b/models/res_partner.py index 0d4b980..861e368 100644 --- a/models/res_partner.py +++ b/models/res_partner.py @@ -4,7 +4,9 @@ import dateutil.parser import pytz -from odoo import models, fields +from odoo import models, fields, api + +ALFRESCO_TRACKED_FIELDS = ['name', 'id', 'siret', 'member_number'] class AlfrescoPartner(models.Model): @@ -13,6 +15,55 @@ class AlfrescoPartner(models.Model): id_alfresco = fields.Char('ID Dossier Alfresco') + # ------------------------------------------------------ + # Fonctions héritées + # ------------------------------------------------------ + @api.model + def create(self, vals): + """ Crée automatiquement un répertoire Alfresco + lors de la création d'un organisme + """ + partner = super(AlfrescoPartner, self).create(vals) + if partner.is_cooperative and not partner.id_alfresco: + id_alfresco = self.alfresco_create_organism(partner) + partner.write({ + 'id_alfresco': id_alfresco, + }) + return partner + + @api.multi + def write(self, vals): + """ Surcharge la fonction write() pour mettre à jour + la raison sociale, le nom, le siret, l'id Odoo ou le + num adhérent + """ + tracked_fields = self.fields_get(ALFRESCO_TRACKED_FIELDS) + # Dict des valeurs initiales des champs présents dans TRACKED_FIELDS + initial_values = dict( + (record.id, dict( + (key, getattr(record, key)) for key in tracked_fields)) for record in self.filtered('is_cooperative')) + # Ecriture des nouvelles valeurs + result = super(AlfrescoPartner, self).write(vals) + # Dict des nouvelles valeurs + new_values = dict( + (record.id, dict( + (key, getattr(record, key)) for key in tracked_fields)) for record in self.filtered('is_cooperative')) + # Check des modifications sur les coopératives présentes dans RIGA + for record in self: + if record.is_cooperative and record.id_alfresco: + if new_values[record.id] != initial_values[record.id]: + self.alfresco_update_organism(record) + return result + + @api.multi + def unlink(self): + for partner in self: + if partner.id_alfresco: + partner.alfresco_remove(partner.id_alfresco) + + # ------------------------------------------------------ + # Fonction boutons + # ------------------------------------------------------ def get_partner_files(self): """ Liste l'ensemble des fichiers pour un organisme @@ -23,7 +74,11 @@ class AlfrescoPartner(models.Model): @return: ir.act.window """ - files = self.alfresco_list_docs(self.name).get('docs', '') + if self.id_alfresco: + files = self.alfresco_list_docs(self.id_alfresco).get('docs', '') + else: + self.id_alfresco = self.alfresco_create_organism(self) + files = self.alfresco_list_docs(self.id_alfresco).get('docs', '') uid = self.env.user.id alfresco_obj = self.env["alfresco.partner.files"] alfresco_obj.search([['user_id', '=', uid]]).unlink() @@ -45,6 +100,6 @@ class AlfrescoPartner(models.Model): "res_model": "alfresco.partner.files", "views": [[False, "tree"]], "search_view_id": self.env.ref( - "connector_alfresco.alfresco_partner_files_search").id, + "cgscop_alfresco.alfresco_partner_files_search").id, 'context': {'search_default_group_periode': True} } diff --git a/views/assets.xml b/views/assets.xml index 80fb9b2..44624aa 100644 --- a/views/assets.xml +++ b/views/assets.xml @@ -6,7 +6,7 @@ <template id="alfresco_assets_backend" name="account assets" inherit_id="web.assets_backend"> <xpath expr="." position="inside"> - <script type="text/javascript" src="/connector_alfresco/static/src/js/alfresco_add_file.js"></script> + <script type="text/javascript" src="/cgscop_alfresco/static/src/js/alfresco_add_file.js"></script> </xpath> </template> diff --git a/wizard/add_file_wizard.py b/wizard/add_file_wizard.py index 2dc48bf..f432c67 100644 --- a/wizard/add_file_wizard.py +++ b/wizard/add_file_wizard.py @@ -2,6 +2,8 @@ # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). import mimetypes +import dateutil.parser +import pytz from odoo import api, fields, models from odoo.tools.mimetypes import guess_mimetype @@ -58,12 +60,14 @@ class AddFileWizard(models.TransientModel): @return: fonction get_partner_files() de res.partner """ + # Get Mimetype content_type = mimetypes.guess_type(self.filename) if content_type[0]: content_type = content_type[0] else: content_type = guess_mimetype(self.file) - self.alfresco_upload( + # Upload File + uploaded_file = self.alfresco_upload( partner=self.partner_id, type=self.type, periode=self.periode, @@ -71,9 +75,26 @@ class AddFileWizard(models.TransientModel): filename=self.filename, mimetype=content_type, doc=self.file.decode('utf-8')) - + # Add new file in transient model for view + uid = self.env.user.id + alfresco_obj = self.env["alfresco.partner.files"] + alfresco_obj.create({ + 'name': self.type, + 'type': self.type, + 'file_id': uploaded_file, + 'user_id': uid, + 'periode': self.periode, + 'validite': self.validite, + 'last_modification': fields.Datetime.now(), + 'partner_id': self.partner_id.id, + }) + # Reload view return { - 'type': 'ir.actions.client', - 'tag': 'reload', + "type": "ir.actions.act_window", + "name": "Fichiers liés", + "res_model": "alfresco.partner.files", + "views": [[False, "tree"]], + "search_view_id": self.env.ref( + "cgscop_alfresco.alfresco_partner_files_search").id, + 'context': {'search_default_group_periode': True} } - -- GitLab