|
@@ -0,0 +1,210 @@
|
|
|
+# -*- coding: utf-8 -*-
|
|
|
+##############################################################################
|
|
|
+#
|
|
|
+# Odoo, Open Source Management Solution
|
|
|
+# Copyright (C) 2016 Prime Consulting SA, Cape Verde (<http://prime.cv>).
|
|
|
+#
|
|
|
+##############################################################################
|
|
|
+
|
|
|
+from odoo import models, api, fields
|
|
|
+from odoo.exceptions import ValidationError, UserError
|
|
|
+from odoo.tools.translate import _
|
|
|
+
|
|
|
+import logging
|
|
|
+_logger = logging.getLogger(__name__)
|
|
|
+
|
|
|
+import base64
|
|
|
+from nuxeo.nuxeo import Nuxeo as nx
|
|
|
+from nuxeo.blob import BufferBlob
|
|
|
+
|
|
|
+class Users(models.Model):
|
|
|
+ _inherit = "res.users"
|
|
|
+
|
|
|
+ @api.model
|
|
|
+ def create(self, vals):
|
|
|
+ """Create Nuxeo User on creating new Odoo User
|
|
|
+ """
|
|
|
+ user = super(Users, self).create(vals)
|
|
|
+ #conn = user.get_nuxeo_connection()
|
|
|
+ #user.nuxeo_user_create(conn)
|
|
|
+ return user
|
|
|
+
|
|
|
+ @api.multi
|
|
|
+ def write(self, vals):
|
|
|
+ for user in self:
|
|
|
+ user_login = user.login
|
|
|
+
|
|
|
+ res = super(Users, self).write(vals)
|
|
|
+
|
|
|
+ newlogin = vals.get('login', False)
|
|
|
+ password = vals.get('password', False)
|
|
|
+ #if newlogin or password:
|
|
|
+ # conn = user.get_nuxeo_connection()
|
|
|
+ # user.nuxeo_user_update(conn, user_login, newlogin, password)
|
|
|
+ return res
|
|
|
+
|
|
|
+
|
|
|
+ @api.multi
|
|
|
+ def unlink(self):
|
|
|
+ #for user in self:
|
|
|
+ #conn = user.get_nuxeo_connection()
|
|
|
+ #user.nuxeo_user_delete(conn)
|
|
|
+ return super(Users, self).unlink()
|
|
|
+
|
|
|
+#####################################
|
|
|
+# Nuxeo API Calls #
|
|
|
+#####################################
|
|
|
+
|
|
|
+ @api.multi
|
|
|
+ def get_nuxeo_connection(self):
|
|
|
+ """ Nuxeo Server Connection
|
|
|
+ """
|
|
|
+ nuxeo_settings = self.env['nuxeo.settings'].search([('id', '>', 0)], order="create_date asc", limit=1)
|
|
|
+ for nx_setting in nuxeo_settings:
|
|
|
+ url = nx_setting.url
|
|
|
+ login = nx_setting.login
|
|
|
+ password = nx_setting.password
|
|
|
+ conn = nx_setting.nuxeo_connection(url, login, password)[2]
|
|
|
+ return conn
|
|
|
+
|
|
|
+ @api.multi
|
|
|
+ def nuxeo_user_create(self, conn=False):
|
|
|
+ """Odoo User - Nuxeo User link
|
|
|
+ :param user: Odoo User
|
|
|
+ :var username: login(Odoo) <=> username(Nuxeo)
|
|
|
+
|
|
|
+ """
|
|
|
+ if conn:
|
|
|
+ for user in self:
|
|
|
+ login = user.login
|
|
|
+ try:
|
|
|
+ nx_user = conn.users().fetch(login)
|
|
|
+ except Exception: #Odoo User don't exist in Nuxeo : Create Nuxeo User
|
|
|
+ username = user.name.split(' ')
|
|
|
+ args = {
|
|
|
+ 'lastName': username[-1],
|
|
|
+ 'firstName': username[0],
|
|
|
+ 'username': login,
|
|
|
+ 'company': user.company_id.name,
|
|
|
+ 'password': user.password
|
|
|
+ }
|
|
|
+ nx_user = conn.users().create(args)
|
|
|
+ _logger.info("User created on Nuxeo Server. Username: %s"%(' '.join([args['firstName'], args['lastName']])))
|
|
|
+ return True
|
|
|
+
|
|
|
+ @api.multi
|
|
|
+ def nuxeo_user_update(self, conn=False, login=False, newlogin=False, password=False):
|
|
|
+ """On updating Odoo User's login/password, update login/password for related Nuxeo user
|
|
|
+ """
|
|
|
+ if conn:
|
|
|
+ for user in self:
|
|
|
+ try:
|
|
|
+ nx_user = conn.users().fetch(login)
|
|
|
+ if nx_user:
|
|
|
+ if newlogin:
|
|
|
+ nx_user.properties['username'] = newlogin
|
|
|
+ nx_user.save()
|
|
|
+ if password:
|
|
|
+ nx_user.properties['password'] = password
|
|
|
+ nx_user.save()
|
|
|
+ _logger.info("User information updated on Nuxeo Server.")
|
|
|
+ except Exception, e:
|
|
|
+ raise ValidationError('Connection to Nuxeo Server Failed! \nError Details:\n%s'%(e))
|
|
|
+ return True
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ @api.multi
|
|
|
+ def nuxeo_user_delete(self, conn=False):
|
|
|
+ """On Deleteing Odoo User, update related Nuxeo User first name
|
|
|
+ """
|
|
|
+ if conn:
|
|
|
+ for user in self:
|
|
|
+ login = user.login
|
|
|
+ try:
|
|
|
+ nx_user = conn.users().fetch(login)
|
|
|
+ nx_user.properties['firstName'] = str(nx_user.properties['firstName']) + ' (deleted)'
|
|
|
+ nx_user.save()
|
|
|
+ nx_user.properties['username'] = False
|
|
|
+ nx_user.save()
|
|
|
+ except Exception:
|
|
|
+ pass
|
|
|
+ return True
|
|
|
+
|
|
|
+ @api.multi
|
|
|
+ def nuxeo_filestore_directory_check(self, conn=False):
|
|
|
+ _logger.info("Checking Filestore directory exists or not.")
|
|
|
+ dbname = str(self.env.cr.dbname)
|
|
|
+ upload_dir = 'Filestore_%s'%(dbname)
|
|
|
+ odooDir = {
|
|
|
+ 'entity-type': 'document',
|
|
|
+ 'name': 'Odoo',
|
|
|
+ 'type':'Folder',
|
|
|
+ 'properties': {'dc:title': 'Odoo'}
|
|
|
+ }
|
|
|
+ filestoreDir = {
|
|
|
+ 'entity-type': 'document',
|
|
|
+ 'name': upload_dir,
|
|
|
+ 'type':'Folder',
|
|
|
+ 'properties': {'dc:title': upload_dir}
|
|
|
+ }
|
|
|
+ if conn:
|
|
|
+ try:
|
|
|
+ conn.repository().fetch('/default-domain/workspaces/Odoo')
|
|
|
+ _logger.info('"Odoo" directory already exists in Workspaces.')
|
|
|
+ except Exception:#create directory "Odoo"
|
|
|
+ repo = conn.repository(schemas=['dublincore'])
|
|
|
+ repo.create('/default-domain/workspaces/', odooDir)
|
|
|
+ _logger.info('New Directory "Odoo" created in Workspaces.')
|
|
|
+
|
|
|
+ try:
|
|
|
+ conn.repository().fetch('/default-domain/workspaces/Odoo/' + upload_dir)
|
|
|
+ _logger.info('"%s" directory already exists in Workspaces.'%(upload_dir))
|
|
|
+ except Exception:#create directory "Filestore_dbname"
|
|
|
+ repo = conn.repository(schemas=['dublincore'])
|
|
|
+ repo.create('/default-domain/workspaces/Odoo/', filestoreDir)
|
|
|
+ _logger.info('New Directory "%s" created in Workspaces.'%(upload_dir))
|
|
|
+ return True
|
|
|
+
|
|
|
+
|
|
|
+ @api.multi
|
|
|
+ def nuxeo_upload_document(self, conn=False, attachment=False):
|
|
|
+ newDoc = {
|
|
|
+ 'name': 'Document',
|
|
|
+ 'type': 'File',
|
|
|
+ 'properties': {'dc:title': attachment.name}
|
|
|
+ }
|
|
|
+
|
|
|
+ filename = attachment.datas_fname
|
|
|
+ if not filename:
|
|
|
+ filename = str(attachment._name) + '.' + str(attachment.id)
|
|
|
+
|
|
|
+ filestoreDir = 'Filestore_' + str(self.env.cr.dbname)
|
|
|
+ try:
|
|
|
+ conn.repository().fetch('/default-domain/workspaces/Odoo/' + filestoreDir)
|
|
|
+ except Exception, e:
|
|
|
+ self.nuxeo_filestore_directory_check(conn)
|
|
|
+
|
|
|
+ try:
|
|
|
+ repo = conn.repository(schemas=['dublincore'])
|
|
|
+ doc = repo.create('/default-domain/workspaces/Odoo/' + filestoreDir, newDoc)
|
|
|
+ file_content = base64.b64decode(attachment.datas)
|
|
|
+ blob = BufferBlob(file_content, filename, attachment.mimetype)
|
|
|
+ blob = conn.batch_upload().upload(blob)
|
|
|
+ doc.properties["file:content"] = blob
|
|
|
+ doc.save()
|
|
|
+ document_id = doc.get_id()
|
|
|
+ _logger.info("Document Successfully Uploaded to Nuxeo Server. File: %s Document id: %s"%(filename, document_id))
|
|
|
+ attachment.write({'nuxeo_document_id': document_id, 'type': 'nuxeo'})
|
|
|
+ except Exception, e:
|
|
|
+ _logger.warn("Document Upload to Nuxeo server Failed!!!\nError : %s"%(e))
|
|
|
+ return True
|
|
|
+
|
|
|
+
|
|
|
+ @api.multi
|
|
|
+ def nuxeo_fetch_document(self, conn=False, document_id=False):
|
|
|
+ if conn and document_id:
|
|
|
+ doc = conn.repository().fetch(document_id)
|
|
|
+ if doc:
|
|
|
+ return base64.b64encode(doc.fetch_blob())
|
|
|
+ return False
|