diff --git a/README.rst b/README.rst index b340c050cae10458074aceced1a994dd86651dce..0d5472934cc7370d12d7cd1f90cc20ba7fb72fd9 100644 --- a/README.rst +++ b/README.rst @@ -10,15 +10,17 @@ CG SCOP - Connecteur Alfresco Description =========== -Ce module permet de lire, créer, supprimer les documents depuis Alfresco. +Ce module hérite des modules **cmis** et **cmis_web** pour permettre d'ajouter des champs et les fonctions mises à disposition par l'API Alfresco 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 : +On crée un modèle abstrait rattachable au différents modèles et implé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 +* Création d'un dossier +* Mise à jour d'un dossier * Liste des fichiers pour un organisme * Ajout d'un fichier -* Suppression d'un dossier : lors de la suppression d'un organisme +* Suppression d'un dossier + +Il implémente également la fonction de connexion à Alfresco pour le module CMIS en utilisant le webservice mis à disposition. Usage @@ -37,7 +39,7 @@ Credits ======= Funders ------------- +------- The development of this module has been financially supported by: diff --git a/__init__.py b/__init__.py index 907658493b2b2108e37a890254bba9d0b9da9951..b9f967ea92a89276401151d71f466ffe3e0a4f33 100644 --- a/__init__.py +++ b/__init__.py @@ -3,4 +3,3 @@ from . import controllers from . import models -from . import wizard diff --git a/__manifest__.py b/__manifest__.py index f090217990ebd072fe9b25bc59e179d23ad1ba77..254cb43d457a601586fde207b8a57d64037c76ea 100644 --- a/__manifest__.py +++ b/__manifest__.py @@ -9,17 +9,11 @@ "depends": [ 'base', 'web', - 'cgscop_partner', - 'web_ir_actions_close_wizard_refresh_view', + 'cmis', ], "data": [ - "security/ir.model.access.csv", "views/assets.xml", - "views/alfresco_connection.xml", - "views/alfresco_partner_files.xml", - "views/res_partner.xml", - "wizard/add_file_wizard.xml", - "datas/cron_init_alfresco.xml", + "views/cmis_backend.xml", ], 'qweb': [ 'static/src/xml/*.xml', diff --git a/controllers/__init__.py b/controllers/__init__.py index 4a51cde9123b17a6c4dd5311c7f5a8e0f51ad296..a676f817085c409e6659d0aef11f06ae9c2ff2f5 100644 --- a/controllers/__init__.py +++ b/controllers/__init__.py @@ -1,4 +1,4 @@ -# © 2019 Le Filament (<http://www.le-filament.com>) +# © 2020 Le Filament (<http://www.le-filament.com>) # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). -from . import main \ No newline at end of file +from . import main diff --git a/controllers/main.py b/controllers/main.py index ea71fc1dc95b74c272252d177959fd05e46978c6..74c9bd908ced0851d4cf67596116c68ee68f29a9 100644 --- a/controllers/main.py +++ b/controllers/main.py @@ -1,29 +1,12 @@ -# © 2019 Le Filament (<http://www.le-filament.com>) +# © 2020 Le Filament (<http://www.le-filament.com>) # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). -import base64 - from odoo import http -from odoo.http import request -from odoo.addons.web.controllers.main import serialize_exception, content_disposition -class AlfrescoBinary(http.Controller): - @http.route('/web/binary/download_alfresco', type='http', auth="user") - @serialize_exception - def download_alfresco_document(self, id_alfresco, **kwargs): - """ Téléchargement des fichiers depuis alfresco. +class AlfrescoController(http.Controller): - :param str id_alfresco: id de la ressource - @return: :class:`werkzeug.wrappers.Response` - """ - doc = request.env['alfresco.partner.files'].search( - [['file_id', '=', id_alfresco]]).alfresco_get_doc(id_alfresco) - filecontent = base64.b64decode( - doc['base64NodeContent']) - if not filecontent: - return request.not_found() - else: - return request.make_response(filecontent, [ - ('Content-Type', 'application/octet-stream'), - ('Content-Disposition', content_disposition(doc['name']))]) + @http.route(['/web/alfresco/session'], type="json", auth="user", method=['POST']) + def get_alf_ticket(self, username): + data = http.request.env['cgscop.alfresco'].alfresco_get_ticket(username) + return data diff --git a/datas/cron_init_alfresco.xml b/datas/cron_init_alfresco.xml deleted file mode 100644 index a77092f190461a60960621bcae4b7966c3f89aa5..0000000000000000000000000000000000000000 --- a/datas/cron_init_alfresco.xml +++ /dev/null @@ -1,13 +0,0 @@ -<odoo> - <data noupdate="1"> - <record id="ir_cron_init_alfresco" model="ir.cron"> - <field name="name">CG Scop - Alfresco - Initialisation dossiers</field> - <field name="active" eval="False" /> - <field name="user_id" ref="base.user_root" /> - <field name="model_id" ref="model_res_partner" /> - <field name="code">model._init_alfresco_folder()</field> - <field name="state">code</field> - <field name="priority" eval="5" /> - </record> - </data> -</odoo> \ No newline at end of file diff --git a/models/__init__.py b/models/__init__.py index 8320fce99f390d4608025ab4742779998ff38ff3..9962060e4fc58898803c5ce02190d423ca10c475 100644 --- a/models/__init__.py +++ b/models/__init__.py @@ -2,6 +2,4 @@ # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). from . import api_alfresco -from . import alfresco_connection -from . import alfresco_partner_files -from . import res_partner +from . import cmis_backend diff --git a/models/alfresco_connection.py b/models/alfresco_connection.py deleted file mode 100644 index 818f03a47c767fb18e93a7a7132efeb6485d8995..0000000000000000000000000000000000000000 --- a/models/alfresco_connection.py +++ /dev/null @@ -1,24 +0,0 @@ -# © 2019 Le Filament (<http://www.le-filament.com>) -# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). - -from odoo import models, fields - - -class CgscopAlfrescoConnection(models.Model): - _name = 'alfresco.connection' - _description = 'Infos API de connexion pour Alfresco' - - name = fields.Char(string='Nom') - login = fields.Char('Login') - password = fields.Char('Password') - url = fields.Char('URL') - ssl = fields.Boolean('Connexion SSL', default=False) - active = fields.Boolean('Actif', default=False) - - def toogle_active_config(self): - """ Active la connexion sélectionnée et désactive - toutes les autres connexions - """ - for item in self.env['alfresco.connection'].search([]): - item.active = False - self.active = True diff --git a/models/alfresco_partner_files.py b/models/alfresco_partner_files.py deleted file mode 100644 index 5aa1df98b76222e95e97d2cf8b922540b62ea814..0000000000000000000000000000000000000000 --- a/models/alfresco_partner_files.py +++ /dev/null @@ -1,33 +0,0 @@ -# © 2019 Le Filament (<http://www.le-filament.com>) -# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). - -from odoo import models, fields, api - - -class AlfrescoPartnerFiles(models.TransientModel): - _name = 'alfresco.partner.files' - _inherit = 'cgscop.alfresco' - _description = "Requete fichiers par organisme" - - name = fields.Char('Nom du Fichier') - type = fields.Char('Type') - periode = fields.Char('Période') - validite = fields.Char('Validité') - file_id = fields.Char('ID Fichier') - last_modification = fields.Datetime('Dernière Modification') - user_id = fields.Many2one( - comodel_name='res.users', - string='User') - partner_id = fields.Many2one( - comodel_name='res.partner', - string='Organisme') - - @api.multi - def download_file(self): - for doc in self: - return { - 'type': 'ir.actions.act_url', - 'url': '/web/binary/download_alfresco?id_alfresco=%s' % ( - doc.file_id, ), - 'target': 'self', - } diff --git a/models/api_alfresco.py b/models/api_alfresco.py index a149df3939d42ac414084d7ed5703a7496ec0b95..1d077d8a25110601719c5d9fe9ec6dee96a23239 100644 --- a/models/api_alfresco.py +++ b/models/api_alfresco.py @@ -3,6 +3,7 @@ import requests import logging +import xml.etree.ElementTree as et from odoo import models, exceptions, tools @@ -27,7 +28,7 @@ class CgscopAlfresco(models.AbstractModel): @return response au format JSON """ _logger.info("Calling %s" % url) - param = self.env['alfresco.connection'].sudo().search([ + param = self.env['cmis.backend'].sudo().search([ ['active', '=', True]]) if not param: raise exceptions.Warning( @@ -36,7 +37,7 @@ class CgscopAlfresco(models.AbstractModel): alfresco_url = param.url alfresco_ssl = param.ssl basicAuthCredentials = ( - param.login, + param.username, param.password) try: if call_type == 'get': @@ -62,25 +63,26 @@ class CgscopAlfresco(models.AbstractModel): err.__str__(), ) response = False - # if not response: - # raise exceptions.Warning( - # "Oops... il y a un problème de connexion avec l'espace documentaire") + # Gestion erreur API if response.status_code not in [200, 201]: + try: + message = response.json().get('message') + except: + message = response.text 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'))) + message)) # Si dossier déjà créé elif (response.text.find("NUMADHERENT d") > 0 or response.text.find("SIRET d") > 0 or response.text.find("RAISONSOCIALE d") > 0): return response.json().get('dossiersExistants')[0] - - return response.json() + return response # Get Methods def alfresco_list_docs(self, node_id): @@ -88,7 +90,7 @@ class CgscopAlfresco(models.AbstractModel): :param name: raison sociale de la structure """ url = '/alfresco/s/erp/listedocuments?nodeId=' + node_id - return self.alfresco_get_by_url(url=url, call_type='get') + return self.alfresco_get_by_url(url=url, call_type='get').json() def alfresco_list_type(self): """ Liste le valeurs du formulaire de dépôt d'un nouveau document @@ -96,14 +98,11 @@ class CgscopAlfresco(models.AbstractModel): @return: dict des valeurs possibles pour période, validité, type """ url = '/alfresco/s/api/properties?nsp=crm&n=document' - list_type = self.alfresco_get_by_url(url=url, call_type='get') + list_type = self.alfresco_get_by_url(url=url, call_type='get').json() return { 'periode': self.get_allowed_values( list_type=list_type, value='crm:periode'), - 'validite': self.get_allowed_values( - list_type=list_type, - value='crm:validite'), 'type': self.get_allowed_values( list_type=list_type, value='crm:type'), @@ -114,7 +113,17 @@ class CgscopAlfresco(models.AbstractModel): :param nodeRef: id Alfresco """ url = '/alfresco/s/document/' + nodeRef - return self.alfresco_get_by_url(url=url, call_type='get') + return self.alfresco_get_by_url(url=url, call_type='get').json() + + def alfresco_get_ticket(self, username): + """ Liste les documents pour un organisme (raison sociale) + :param username: username de l'utilisateur + """ + url = '/alfresco/s/authentifier-entantque?compte=' + username + result = self.alfresco_get_by_url(url=url, call_type='get') + tree = et.ElementTree(et.fromstring(result.content)) + root = tree.getroot() + return root[0].text # Post Methods def alfresco_create_organism(self, partner): @@ -129,10 +138,11 @@ class CgscopAlfresco(models.AbstractModel): 'raisonSociale': partner.name, "id": partner.id, "siret": partner.siret, - "numAdherent": partner.member_number + "numAdherent": partner.member_number, + "ur": partner.ur_id } return self.get_nodeRef( - self.alfresco_get_by_url(url=url, call_type='post', json=json)) + self.alfresco_get_by_url(url=url, call_type='post', json=json).json()) def alfresco_update_organism(self, partner): """ Mise à jour d'un dossier Organisme @@ -146,10 +156,11 @@ class CgscopAlfresco(models.AbstractModel): 'raisonSociale': partner.name, "id": partner.id, "siret": partner.siret, - "numAdherent": partner.member_number + "numAdherent": partner.member_number, + "ur": partner.ur_id } return self.get_nodeRef( - self.alfresco_get_by_url(url=url, call_type='post', json=json)) + self.alfresco_get_by_url(url=url, call_type='post', json=json).json()) def alfresco_upload(self, partner, type, periode, validite, filename, mimetype, doc): """ Upload d'un document sur Alfresco @@ -165,11 +176,10 @@ class CgscopAlfresco(models.AbstractModel): 'type': type, 'nomOrigine': filename, 'mimeType': mimetype, - 'validite': validite, 'contentBase64': doc, } return self.get_nodeRef( - self.alfresco_get_by_url(url=url, call_type='post', json=json)) + self.alfresco_get_by_url(url=url, call_type='post', json=json).json()) # Delete Methods def alfresco_remove(self, nodeRef): @@ -177,7 +187,7 @@ class CgscopAlfresco(models.AbstractModel): :param id_doc: id du document Alfresco """ url = '/alfresco/s/document/' + nodeRef - return self.alfresco_get_by_url(url=url, call_type='delete') + return self.alfresco_get_by_url(url=url, call_type='delete').json() # Others def get_allowed_values(self, list_type, value): diff --git a/models/cmis_backend.py b/models/cmis_backend.py new file mode 100644 index 0000000000000000000000000000000000000000..1e67b5d246711be0cafa9ea1d09266819c088ac3 --- /dev/null +++ b/models/cmis_backend.py @@ -0,0 +1,12 @@ +# © 2019 Le Filament (<http://www.le-filament.com>) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from odoo import models, fields + + +class CgscopAlfrescoConnection(models.Model): + _inherit = 'cmis.backend' + + url = fields.Char('URL') + ssl = fields.Boolean('Connexion SSL', default=False) + active = fields.Boolean('Actif', default=False) diff --git a/models/res_partner.py b/models/res_partner.py deleted file mode 100644 index 5a0a6a0a25010f0ee0b06fb37582e3d41e51c72d..0000000000000000000000000000000000000000 --- a/models/res_partner.py +++ /dev/null @@ -1,114 +0,0 @@ -# © 2019 Le Filament (<http://www.le-filament.com>) -# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). - -import dateutil.parser -import pytz - -from odoo import models, fields, api - -ALFRESCO_TRACKED_FIELDS = ['name', 'id', 'siret', 'member_number'] - - -class AlfrescoPartner(models.Model): - _name = 'res.partner' - _inherit = ['res.partner', 'cgscop.alfresco'] - - id_alfresco = fields.Char('ID Dossier Alfresco') - - # ------------------------------------------------------ - # Fonctions héritées - # ------------------------------------------------------ - - @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) - return super(AlfrescoPartner, self).unlink() - - # ------------------------------------------------------ - # Fonction boutons - # ------------------------------------------------------ - def get_partner_files(self): - """ Liste l'ensemble des fichiers pour un organisme - - La fonction fait appel à l'API Alfresco et enregistre le résultat - dans un modèle Transient. - L'ID user est ajouté à la table pour définir les requêtes propres à - chaque user - - @return: ir.act.window - """ - if self.id_alfresco: - files = self.alfresco_list_docs(self.id_alfresco).get('docs', '') - else: - self.id_alfresco = self.alfresco_create_organism(self) - print(self.name) - print(self.id_alfresco) - 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() - for doc in files: - alfresco_obj.create({ - 'name': doc['name'], - 'type': doc['type'], - 'file_id': doc['nodeRef'].replace('workspace://SpacesStore/', ''), - 'user_id': uid, - 'periode': doc['periode'], - 'validite': doc['validite'], - 'last_modification': dateutil.parser.parse( - doc['modifiedOn']).astimezone(pytz.utc), - 'partner_id': self.id, - }) - return { - "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} - } - - # ------------------------------------------------------ - # CRON - # ------------------------------------------------------ - def _init_alfresco_folder(self): - """ Fonction pour le cron permettant de créer un dossier - dans Alfresco pour l'ensemble des organismes qui n'ont pas - de nodeRef - """ - partners = self.env['res.partner'].search([ - ['is_cooperative', '=', True], - ['id_alfresco', '=', False], - ['membership_status', '=', "member"]]) - for partner in partners: - id_alfresco = partner.alfresco_create_organism(partner) - partner.write({ - 'id_alfresco': id_alfresco, - }) diff --git a/security/ir.model.access.csv b/security/ir.model.access.csv index c3e7f01ed6761412a38008a3462d0b17b02c66a8..58262d4440d02ecccad693faa23505f01ced8a9f 100644 --- a/security/ir.model.access.csv +++ b/security/ir.model.access.csv @@ -1,2 +1 @@ -id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink -access_alfresco_connection,access_alfresco_connection,model_alfresco_connection,cgscop_partner.group_cg_administrator,1,1,1,1 \ No newline at end of file +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink \ No newline at end of file diff --git a/static/src/js/alfresco_add_file.js b/static/src/js/alfresco_add_file.js deleted file mode 100644 index 65d36723542daf5365db2ad74b7cc34dcd019993..0000000000000000000000000000000000000000 --- a/static/src/js/alfresco_add_file.js +++ /dev/null @@ -1,31 +0,0 @@ -odoo.define('connector_alfresco.alfresco_add_file', function (require){ -"use strict"; - -var core = require('web.core'); -var ListController = require('web.ListController'); -var QWeb = core.qweb; -var session = require('web.session'); - -ListController.include({ - - renderButtons: function() { - this._super.apply(this, arguments); - var self = this; - this.$buttons.on('click', '.add_file', function() { - var active_id = self.getParent().getParent()._current_state.active_id; - self.do_action({ - type: "ir.actions.act_window", - name: "Ajouter un fichier", - res_model: "add.file.wizard", - views: [[false,'form']], - target: 'new', - view_type : 'form', - view_mode : 'form', - context: { 'active_id': Number(active_id) } - }); - }); - }, - -}); - -}); \ No newline at end of file diff --git a/static/src/js/form_widgets.js b/static/src/js/form_widgets.js new file mode 100644 index 0000000000000000000000000000000000000000..204a18e690ecde2cef33333c7df83cbdf2186124 --- /dev/null +++ b/static/src/js/form_widgets.js @@ -0,0 +1,100 @@ +/*--------------------------------------------------------------- +Copyright 2020 Le Filament +License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +------------------------------------------------------------------*/ + +odoo.define('cgscop_alfresco.form_widgets', function(require) { + "use strict"; + + var core = require('web.core'); + var form_widgets = require('cmis_web.form_widgets'); + var session = require('web.session'); + + form_widgets.CmisObjectWrapper.include({ + /* + * Surcharge les fonction parse_object (téléchargement) + * et get_content_url (preview) pour passer le ticket + * l'url appelée + */ + parse_object: function (cmis_object) { + this._super.apply(this, arguments); + if (this.cmis_session.alf_ticket) { + this.url = this.cmis_session.getContentStreamURL(this.objectId, 'attachment', {'alf_ticket': this.cmis_session.alf_ticket}); + } + }, + get_content_url: function () { + var options = {} + if (this.cmis_session.alf_ticket) { + options = {'alf_ticket': this.cmis_session.alf_ticket}; + } + return this.cmis_session.getContentStreamURL(this.objectId, 'inline', options); + }, + }), + + form_widgets.FieldCmisFolder.include({ + /** + * Surcharge la fonction d'initialisation de la session CMIS pour + * passer le token de l'utilisateur + */ + init_cmis_session: function () { + var self = this; + $.when(this.cmis_config_loaded).done(function () { + self.cmis_session = cmis.createSession(self.cmis_location); + self.cmis_session.setGlobalHandlers(self.on_cmis_error, self.on_cmis_error); + + // CGSCOP : appel vers la fonction custom + self._rpc({route:'/web/alfresco/session', params:{ + 'username': session.username + }}).done(function (result) { + self.cmis_session['alf_ticket'] = result; + self.cmis_session.setCredentials('ROLE_TICKET', result); + }); + self.cmis_session_initialized.resolve(); + self.cmis_session.setCharacterSet(document.characterSet); + }); + }, + + load_cmis_repositories: function () { + /** + * Surcharge la fonction de chargement des repositories après initialisation + * du dossier initial pour recharger correctement la page + */ + var dfd = $.Deferred(); + var self = this; + if (this.cmis_session.repositories) { + return dfd.resolve(); + } else { + if (self.cmis_session.alf_ticket) { + self.cmis_session + .loadRepositories() + .ok(function (data) { + dfd.resolve(); + }) + .notOk(function (error) { + self.on_cmis_error(error); + dfd.reject(error); + }); + } else { + // CGSCOP : appel vers la fonction custom + self._rpc({route:'/web/alfresco/session', params:{ + 'username': session.username + }}).done(function (result) { + self.cmis_session['alf_ticket'] = result; + self.cmis_session.setCredentials('ROLE_TICKET', result); + self.cmis_session + .loadRepositories() + .ok(function (data) { + dfd.resolve(); + }) + .notOk(function (error) { + self.on_cmis_error(error); + dfd.reject(error); + }); + }); + } + } + return dfd.promise(); + }, + + }); +}); \ No newline at end of file diff --git a/static/src/xml/widget_listview.xml b/static/src/xml/widget_listview.xml deleted file mode 100644 index 5dfe2606a07dc6c0d523fc92d9f8d186f106b020..0000000000000000000000000000000000000000 --- a/static/src/xml/widget_listview.xml +++ /dev/null @@ -1,13 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright 2017 Le Filament (<https://www.le-filament.com>) - License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). --> - -<templates xml:space="preserve"> - <t t-extend="ListView.buttons"> - <t t-jquery="div.o_list_buttons" t-operation="append"> - <t t-if="widget.modelName == 'alfresco.partner.files'" > - <button class="btn btn-secondary add_file" type="button" >Ajouter un fichier</button> - </t> - </t> - </t> -</templates> \ No newline at end of file diff --git a/views/alfresco_connection.xml b/views/alfresco_connection.xml deleted file mode 100644 index 5fa567413e82c344da9e9daf707b138c997b39dd..0000000000000000000000000000000000000000 --- a/views/alfresco_connection.xml +++ /dev/null @@ -1,80 +0,0 @@ -<?xml version="1.0"?> -<!-- Copyright 2019 Le Filament - License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). --> - -<odoo> - <data> - - <record id="view_alfresco_connection_tree" model="ir.ui.view"> - <field name="name">alfresco.connection.tree</field> - <field name="model">alfresco.connection</field> - <field name="arch" type="xml"> - <tree string="Synchronisation Odoo"> - <field name="name"/> - <field name="login"/> - <field name="url"/> - <field name="active"/> - </tree> - </field> - </record> - - <record id="view_alfresco_connection_form" model="ir.ui.view"> - <field name="name">alfresco.connection.form</field> - <field name="model">alfresco.connection</field> - <field name="arch" type="xml"> - <form> - <header> - <button name="toogle_active_config" type="object" string="Activer" /> - </header> - <sheet> - <group> - <group> - <field name="name" /> - <field name="url"/> - <field name="ssl"/> - </group> - <group> - <field name="active" readonly="1" /> - <field name="login"/> - <field name="password" password="True" /> - </group> - </group> - </sheet> - </form> - </field> - </record> - - <record id="view_alfresco_connection_search" model="ir.ui.view"> - <field name="name">alfresco.connection.search</field> - <field name="model">alfresco.connection</field> - <field name="arch" type="xml"> - <search string="Synchronisation Odoo"> - <!-- Champs de recherche --> - <field name="name"/> - <!-- Filtres --> - <filter name="active_filter" string="Actifs" domain="[('active','=',True)]"/> - <filter name="inctive_filter" string="Inactifs" domain="[('active','=',False)]" /> - <filter name="all_filter" string="Tous" domain="['|', ('active','=',True), ('active','=',False)]" /> - </search> - </field> - </record> - - <record id="action_view_alfresco_connection" model="ir.actions.act_window"> - <field name="name">Configuration Connexion Alfresco</field> - <field name="res_model">alfresco.connection</field> - <field name="view_mode">tree,form</field> - <field name="search_view_id" ref="view_alfresco_connection_search"/> - </record> - - <menuitem id="menu_cgscop_alfresco" - parent="cgscop_partner.menu_cgscop_api_config" - sequence="10" - name="Alfresco"/> - - <menuitem id="menu_cgscop_alfresco_connection" - parent="menu_cgscop_alfresco" - action="action_view_alfresco_connection" - name="Configuration connexion" - sequence="90"/> - </data> -</odoo> diff --git a/views/alfresco_partner_files.xml b/views/alfresco_partner_files.xml deleted file mode 100644 index 0d514067bd4b9a04eb6f7c2c38de92aa20c86b08..0000000000000000000000000000000000000000 --- a/views/alfresco_partner_files.xml +++ /dev/null @@ -1,47 +0,0 @@ -<?xml version="1.0"?> -<!-- Copyright 2019 Le Filament - License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). --> - -<odoo> - <data> - - <record id="alfresco_partner_files_search" model="ir.ui.view"> - <field name="name">alfresco.partner.files.search</field> - <field name="model">alfresco.partner.files</field> - <field name="arch" type="xml"> - <search> - <!-- Champs de recherche --> - <field name="name" /> - <field name="periode"/> - <field name="type"/> - <field name="validite"/> - <!-- Groupes --> - <group expand="0" name="group_by" string="Group By"> - <filter string="Période" name="group_periode" context="{'group_by': 'periode'}"/> - <filter string="Types" name="group_type" context="{'group_by': 'type'}"/> - <filter string="Validité" name="group_validite" context="{'group_by': 'validite'}"/> - <filter string="Dernière Modification" name="group_last_modification" context="{'group_by': 'last_modification'}"/> - </group> - - </search> - </field> - </record> - - <record id="alfresco_partner_files_tree" model="ir.ui.view"> - <field name="name">alfresco.partner.files.tree</field> - <field name="model">alfresco.partner.files</field> - <field eval="8" name="priority"/> - <field name="arch" type="xml"> - <tree string="Fichiers" create="false" edit="false" delete="false" > - <field name="name" /> - <field name="type"/> - <field name="periode"/> - <field name="validite"/> - <field name="last_modification"/> - <button name="download_file" string="Télécharger" type="object" /> - </tree> - </field> - </record> - - </data> -</odoo> diff --git a/views/assets.xml b/views/assets.xml index 44624aa462452cbd15f09ad9cd9295f2ee09fd93..dd5c433db3bd1f5c3d7c654ece1a57db667dfb27 100644 --- a/views/assets.xml +++ b/views/assets.xml @@ -1,13 +1,11 @@ <?xml version="1.0"?> -<!-- Copyright 2019 Le Filament +<!-- Copyright 2020 Le Filament License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). --> <odoo> - - <template id="alfresco_assets_backend" name="account assets" inherit_id="web.assets_backend"> + <template id="assets_backend" name="cgscop_alfodoo_assets" inherit_id="cmis_web.assets_backend"> <xpath expr="." position="inside"> - <script type="text/javascript" src="/cgscop_alfresco/static/src/js/alfresco_add_file.js"></script> - </xpath> + <script type="text/javascript" src="/cgscop_alfresco/static/src/js/form_widgets.js"/> + </xpath> </template> - -</odoo> \ No newline at end of file +</odoo> diff --git a/views/cmis_backend.xml b/views/cmis_backend.xml new file mode 100644 index 0000000000000000000000000000000000000000..89f7da529a579fa62af3a08ff8c47309b14671ed --- /dev/null +++ b/views/cmis_backend.xml @@ -0,0 +1,24 @@ +<?xml version="1.0"?> +<!-- Copyright 2019 Le Filament + License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). --> + +<odoo> + <data> + + <record id="view_cmis_backend_cgscop_form_inherited" model="ir.ui.view"> + <field name="name">cmis.backend.cgscop.form</field> + <field name="model">cmis.backend</field> + <field name="inherit_id" ref="cmis.cmis_backend_form_view"/> + <field name="arch" type="xml"> + <sheet position="inside"> + <group name="cgscop" string="API Alfresco CG Scop"> + <field name="url"/> + <field name="ssl"/> + <field name="active"/> + </group> + </sheet> + </field> + </record> + + </data> +</odoo> diff --git a/views/res_partner.xml b/views/res_partner.xml deleted file mode 100644 index 26117506d01d283bb50cb8b561688877d1338f41..0000000000000000000000000000000000000000 --- a/views/res_partner.xml +++ /dev/null @@ -1,20 +0,0 @@ -<?xml version="1.0"?> -<!-- Copyright 2019 Le Filament - License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). --> - -<odoo> - <data> - - <record id="view_partner_cooperative_form_inherited" model="ir.ui.view"> - <field name="name">cooperative.alfresco.form</field> - <field name="model">res.partner</field> - <field name="inherit_id" ref="cgscop_partner.scop_contact_view_form"/> - <field name="arch" type="xml"> - <header position="inside"> - <button string="Documents" type="object" name="get_partner_files" /> - </header> - </field> - </record> - - </data> -</odoo> diff --git a/wizard/__init__.py b/wizard/__init__.py deleted file mode 100644 index 0f342bee3af4bc001f4d7f4615711ed9ad3c87e9..0000000000000000000000000000000000000000 --- a/wizard/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -# © 2019 Le Filament (<http://www.le-filament.com>) -# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). - -from . import add_file_wizard \ No newline at end of file diff --git a/wizard/add_file_wizard.py b/wizard/add_file_wizard.py deleted file mode 100644 index 5c3f60cb0064d58d64f0e8f8fbb8fc8d5e931d0e..0000000000000000000000000000000000000000 --- a/wizard/add_file_wizard.py +++ /dev/null @@ -1,97 +0,0 @@ -# © 2019 Le Filament (<http://www.le-filament.com>) -# 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 - - -class AddFileWizard(models.TransientModel): - """ Wizard d'ajout de fichier dans la GED - - Récupère automatiquement depuis Alfresco les valeurs de periode, - type et validité ainsi que l'organisme associé - """ - _name = 'add.file.wizard' - _inherit = 'cgscop.alfresco' - _description = "Ajout de fichier dans Alfresco" - - # Default functions - def _get_selection(self, value): - try: - file_type = self.alfresco_list_type()[value] - select_type = [] - for type in file_type: - select_type.append( - (type, type)) - return select_type - except: - return False - - @api.model - def _get_type(self): - return self._get_selection('type') - - @api.model - def _get_periode(self): - return self._get_selection('periode') - - @api.model - def _get_validite(self): - return self._get_selection('validite') - - @api.model - def _default_partner_id(self): - return self.env.context.get('active_id') - - type = fields.Selection(selection=_get_type, string='Type') - periode = fields.Selection(selection=_get_periode, string='Période') - validite = fields.Selection(selection=_get_validite, string='Validité') - file = fields.Binary('Fichier') - filename = fields.Char('Nom') - partner_id = fields.Many2one( - comodel_name='res.partner', - string='Organisme', - default=_default_partner_id,) - - @api.multi - def add_file(self): - """ Ajoute un fichier sur la GED Alfresco - - @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) - # Upload File - uploaded_file = self.alfresco_upload( - partner=self.partner_id, - type=self.type, - periode=self.periode, - validite=self.validite, - 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.periode if self.periode != 'Autre' else self.filename, - '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.close_wizard_refresh_view' - } diff --git a/wizard/add_file_wizard.xml b/wizard/add_file_wizard.xml deleted file mode 100644 index 6ceae9e64fd3834f45aa92c36e706fa4f4068f4a..0000000000000000000000000000000000000000 --- a/wizard/add_file_wizard.xml +++ /dev/null @@ -1,36 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<odoo> - <!-- WIZARD FORM --> - <record id="add_file_wizard_view_form" model="ir.ui.view"> - <field name="name">add.file.wizard.form</field> - <field name="model">add.file.wizard</field> - <field name="arch" type="xml"> - <form string="Ajouter un Fichier"> - <group name="infos" string="Informations"> - <field name="partner_id" readonly="1" /> - <field name="periode" required="1" /> - <field name="type" required="1" /> - <field name="validite" required="1" /> - </group> - <group> - <field name="filename" invisible="1"/> - <field name="file" filename="filename" required="1"/> - </group> - <footer> - <button class="btn btn-sm btn-primary" name="add_file" string="Ajouter" type="object" confirm="Êtes-vous sûr(e) de vouloir ajouter ce fichier ?"/> - <button class="btn btn-sm btn-default" special="cancel" string="Fermer"/> - </footer> - </form> - </field> - </record> - - <record id="add_file_wizard_create_action" model="ir.actions.act_window"> - <field name="name">Ajouter un fichier</field> - <field name="type">ir.actions.act_window</field> - <field name="res_model">add.file.wizard</field> - <field name="view_mode">form</field> - <field name="view_id" ref="add_file_wizard_view_form"/> - <field name="target">new</field> - </record> - -</odoo>