Skip to content
Extraits de code Groupes Projets
Valider 5e8ad93d rédigé par Benjamin - Le Filament's avatar Benjamin - Le Filament
Parcourir les fichiers

[update] fusion connexion dans CMIS, ajout api connexion pour cmis

parent 8ffbd067
Aucune branche associée trouvée
Aucune étiquette associée trouvée
1 requête de fusion!112.0 alfodoo
...@@ -10,13 +10,17 @@ CG SCOP - Connecteur Alfresco ...@@ -10,13 +10,17 @@ CG SCOP - Connecteur Alfresco
Description Description
=========== ===========
Ce module permet utilise l'API Alfresco développée spécifiquement pour le projet de la CG Scop qui impémente les fonctions suivantes : 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.
* Création d'un dossier : lors de la création d'un organisme On crée un modèle abstrait rattachable au différents modèles et implémente les fonctions suivantes :
* 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 * Liste des fichiers pour un organisme
* Ajout d'un fichier * 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 Usage
......
# © 2019 Le Filament (<http://www.le-filament.com>) # © 2019 Le Filament (<http://www.le-filament.com>)
# 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 . import controllers
from . import models from . import models
...@@ -9,12 +9,11 @@ ...@@ -9,12 +9,11 @@
"depends": [ "depends": [
'base', 'base',
'web', 'web',
'cgscop_partner', 'cmis',
'web_ir_actions_close_wizard_refresh_view',
], ],
"data": [ "data": [
"security/ir.model.access.csv", "views/assets.xml",
"views/alfresco_connection.xml", "views/cmis_backend.xml",
], ],
'qweb': [ 'qweb': [
'static/src/xml/*.xml', 'static/src/xml/*.xml',
......
# © 2020 Le Filament (<http://www.le-filament.com>)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
from . import main
# © 2020 Le Filament (<http://www.le-filament.com>)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
from odoo import http
class AlfrescoController(http.Controller):
@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
...@@ -2,4 +2,4 @@ ...@@ -2,4 +2,4 @@
# 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 . import api_alfresco from . import api_alfresco
from . import alfresco_connection from . import cmis_backend
...@@ -3,6 +3,7 @@ ...@@ -3,6 +3,7 @@
import requests import requests
import logging import logging
import xml.etree.ElementTree as et
from odoo import models, exceptions, tools from odoo import models, exceptions, tools
...@@ -27,7 +28,7 @@ class CgscopAlfresco(models.AbstractModel): ...@@ -27,7 +28,7 @@ class CgscopAlfresco(models.AbstractModel):
@return response au format JSON @return response au format JSON
""" """
_logger.info("Calling %s" % url) _logger.info("Calling %s" % url)
param = self.env['alfresco.connection'].sudo().search([ param = self.env['cmis.backend'].sudo().search([
['active', '=', True]]) ['active', '=', True]])
if not param: if not param:
raise exceptions.Warning( raise exceptions.Warning(
...@@ -36,7 +37,7 @@ class CgscopAlfresco(models.AbstractModel): ...@@ -36,7 +37,7 @@ class CgscopAlfresco(models.AbstractModel):
alfresco_url = param.url alfresco_url = param.url
alfresco_ssl = param.ssl alfresco_ssl = param.ssl
basicAuthCredentials = ( basicAuthCredentials = (
param.login, param.username,
param.password) param.password)
try: try:
if call_type == 'get': if call_type == 'get':
...@@ -62,25 +63,26 @@ class CgscopAlfresco(models.AbstractModel): ...@@ -62,25 +63,26 @@ class CgscopAlfresco(models.AbstractModel):
err.__str__(), err.__str__(),
) )
response = False response = False
# if not response:
# raise exceptions.Warning(
# "Oops... il y a un problème de connexion avec l'espace documentaire")
# Gestion erreur API # Gestion erreur API
if response.status_code not in [200, 201]: if response.status_code not in [200, 201]:
try:
message = response.json().get('message')
except:
message = response.text
raise exceptions.Warning( raise exceptions.Warning(
"L'appel url '%s' a échoué\n" "L'appel url '%s' a échoué\n"
"- Code erreur : %d\n" "- Code erreur : %d\n"
"- Message : %s" % ( "- Message : %s" % (
response.url, response.url,
response.status_code, response.status_code,
response.json().get('message'))) message))
# Si dossier déjà créé # Si dossier déjà créé
elif (response.text.find("NUMADHERENT d") > 0 or elif (response.text.find("NUMADHERENT d") > 0 or
response.text.find("SIRET d") > 0 or response.text.find("SIRET d") > 0 or
response.text.find("RAISONSOCIALE d") > 0): response.text.find("RAISONSOCIALE d") > 0):
return response.json().get('dossiersExistants')[0] return response.json().get('dossiersExistants')[0]
return response
return response.json()
# Get Methods # Get Methods
def alfresco_list_docs(self, node_id): def alfresco_list_docs(self, node_id):
...@@ -88,7 +90,7 @@ class CgscopAlfresco(models.AbstractModel): ...@@ -88,7 +90,7 @@ class CgscopAlfresco(models.AbstractModel):
:param name: raison sociale de la structure :param name: raison sociale de la structure
""" """
url = '/alfresco/s/erp/listedocuments?nodeId=' + node_id 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): def alfresco_list_type(self):
""" Liste le valeurs du formulaire de dépôt d'un nouveau document """ Liste le valeurs du formulaire de dépôt d'un nouveau document
...@@ -96,14 +98,11 @@ class CgscopAlfresco(models.AbstractModel): ...@@ -96,14 +98,11 @@ class CgscopAlfresco(models.AbstractModel):
@return: dict des valeurs possibles pour période, validité, type @return: dict des valeurs possibles pour période, validité, type
""" """
url = '/alfresco/s/api/properties?nsp=crm&n=document' 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 { return {
'periode': self.get_allowed_values( 'periode': self.get_allowed_values(
list_type=list_type, list_type=list_type,
value='crm:periode'), value='crm:periode'),
'validite': self.get_allowed_values(
list_type=list_type,
value='crm:validite'),
'type': self.get_allowed_values( 'type': self.get_allowed_values(
list_type=list_type, list_type=list_type,
value='crm:type'), value='crm:type'),
...@@ -114,7 +113,17 @@ class CgscopAlfresco(models.AbstractModel): ...@@ -114,7 +113,17 @@ class CgscopAlfresco(models.AbstractModel):
:param nodeRef: id Alfresco :param nodeRef: id Alfresco
""" """
url = '/alfresco/s/document/' + nodeRef 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 # Post Methods
def alfresco_create_organism(self, partner): def alfresco_create_organism(self, partner):
...@@ -132,7 +141,7 @@ class CgscopAlfresco(models.AbstractModel): ...@@ -132,7 +141,7 @@ class CgscopAlfresco(models.AbstractModel):
"numAdherent": partner.member_number "numAdherent": partner.member_number
} }
return self.get_nodeRef( 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): def alfresco_update_organism(self, partner):
""" Mise à jour d'un dossier Organisme """ Mise à jour d'un dossier Organisme
...@@ -149,7 +158,7 @@ class CgscopAlfresco(models.AbstractModel): ...@@ -149,7 +158,7 @@ class CgscopAlfresco(models.AbstractModel):
"numAdherent": partner.member_number "numAdherent": partner.member_number
} }
return self.get_nodeRef( 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): def alfresco_upload(self, partner, type, periode, validite, filename, mimetype, doc):
""" Upload d'un document sur Alfresco """ Upload d'un document sur Alfresco
...@@ -165,11 +174,10 @@ class CgscopAlfresco(models.AbstractModel): ...@@ -165,11 +174,10 @@ class CgscopAlfresco(models.AbstractModel):
'type': type, 'type': type,
'nomOrigine': filename, 'nomOrigine': filename,
'mimeType': mimetype, 'mimeType': mimetype,
'validite': validite,
'contentBase64': doc, 'contentBase64': doc,
} }
return self.get_nodeRef( 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 # Delete Methods
def alfresco_remove(self, nodeRef): def alfresco_remove(self, nodeRef):
...@@ -177,7 +185,7 @@ class CgscopAlfresco(models.AbstractModel): ...@@ -177,7 +185,7 @@ class CgscopAlfresco(models.AbstractModel):
:param id_doc: id du document Alfresco :param id_doc: id du document Alfresco
""" """
url = '/alfresco/s/document/' + nodeRef 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 # Others
def get_allowed_values(self, list_type, value): def get_allowed_values(self, list_type, value):
......
...@@ -5,20 +5,8 @@ from odoo import models, fields ...@@ -5,20 +5,8 @@ from odoo import models, fields
class CgscopAlfrescoConnection(models.Model): class CgscopAlfrescoConnection(models.Model):
_name = 'alfresco.connection' _inherit = 'cmis.backend'
_description = 'Infos API de connexion pour Alfresco'
name = fields.Char(string='Nom')
login = fields.Char('Login')
password = fields.Char('Password')
url = fields.Char('URL') url = fields.Char('URL')
ssl = fields.Boolean('Connexion SSL', default=False) ssl = fields.Boolean('Connexion SSL', default=False)
active = fields.Boolean('Actif', 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
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink 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
/*---------------------------------------------------------------
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.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.setToken(result);
});
self.cmis_session_initialized.resolve();
self.cmis_session.setCharacterSet(document.characterSet);
});
},
});
});
<?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>
<?xml version="1.0"?>
<!-- Copyright 2020 Le Filament
License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). -->
<odoo>
<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/form_widgets.js"/>
</xpath>
</template>
</odoo>
<?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>
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