import io import easywebdav import json from odoo.http import Controller, route, request from webdav4.client import Client from webdav4.fsspec import WebdavFileSystem from typing import ( BinaryIO ) import logging import base64 _logger = logging.getLogger(__name__) class MyController(Controller): @route('/my/webdav/files', auth='user', type='json') def list_files(self,path): client = WebdavFileSystem("https://cloud.logumedia.de/remote.php/dav/files/OdooDav/", auth=("odooClient@logumedia.de", "lm2020#OdooDav")) files = client.ls(path, detail=True) #client.upload_file("Gorilla.jpg", "Photos/Gorilla.jpg") webdav = easywebdav.connect( _logger.info("webdav : "+str(files)) return files # return [{'name': f.name, 'size': f.size} for f in files] @route('/my/webdav/upload', auth='user', type='json', methods=['POST']) def upload_file(self, path, filename, filedata): client = Client("https://cloud.logumedia.de/remote.php/dav/files/OdooDav/", auth=("odooClient@logumedia.de", "lm2020#OdooDav")) filedata = filedata.split("base64,")[-1] _logger.info('Als Byte : '+str(bytes(filedata, encoding='utf-8'))) infile = open('/opt/odoo/addons/DigitalSignage/temp/temp_in.temp', 'wb') filedataStr=str(filedata) _logger.info('Als String : '+str(filedataStr)) decoded_data = base64.b64decode(bytes(filedata, encoding='utf-8')) try: decoded_data = base64.b64decode(filedataStr) except base64.binascii.Error as e: if 'Incorrect padding' in str(e): filedataStr += b'=' * (4 - len(filedataStr) % 4) decoded_data = base64.b64decode(filedataStr) infile.write(decoded_data) infile.close() _logger.info(str(f"{path}/{filename}") + str(base64.b64decode(decoded_data))) infile = open('/opt/odoo/addons/DigitalSignage/temp/temp_in.temp', 'rb') client.upload_fileobj(infile, f"{path}/{filename}") _logger.info(f"File {filename} uploaded to {path}") return True @route('/my/webdav/getfile', auth='user', type='json') def get_file(self,path,filename): client = Client("https://cloud.logumedia.de/remote.php/dav/files/OdooDav/", auth=("odooClient@logumedia.de", "lm2020#OdooDav")) #files = client.cp('dav://'+path+'/'+filename,'/opt/odoo/addons/DigitalSignage/temp/'+filename) infile = open('/opt/odoo/addons/DigitalSignage/temp/temp.temp', 'wb') files = client.download_fileobj(path+'/'+filename,infile) infile = open('/opt/odoo/addons/DigitalSignage/temp/temp.temp', 'rb') indata = infile.read() _logger.info("webdav : "+str(indata)) encoded_file = base64.b64encode(indata) #client.upload_file("Gorilla.jpg", "Photos/Gorilla.jpg") webdav = easywebdav.connect( _logger.info("webdav : "+str(encoded_file)) return encoded_file # return [{'name': f.name, 'size': f.size} for f in files] @route('/my/webdav/makefolder', auth='user', type='json', methods=['POST']) def make_folder(self, path, folder_name): client = Client("https://cloud.logumedia.de/remote.php/dav/files/OdooDav/", auth=("odooClient@logumedia.de", "lm2020#OdooDav")) folder_path = f"{path}/{folder_name}" try: client.mkdir(folder_path) _logger.info(f"Folder {folder_name} created at {path}") return {"success": True, "message": f"Folder {folder_name} created at {path}"} except Exception as e: _logger.error(f"Error creating folder {folder_name} at {path}: {str(e)}") return {"success": False, "message": f"Error creating folder: {str(e)}"} @route('/my/webdav/deletefile', auth='user', type='json') def delete_file(self,filename): client = Client("https://cloud.logumedia.de/remote.php/dav/files/OdooDav/", auth=("odooClient@logumedia.de", "lm2020#OdooDav")) #files = client.cp('dav://'+path+'/'+filename,'/opt/odoo/addons/DigitalSignage/temp/'+filename) infile = open('/opt/odoo/addons/DigitalSignage/temp/temp.temp', 'wb') files = client.remove(filename) return True # return [{'name': f.name, 'size': f.size} for f in files] @route('/dss/getscreendata', type='json', auth='user') def getscreendata(self, Domain): # Tu was mit den Daten screendef =[] return screendef @route('/dss/setbtnfile', type='json', auth='user') def setbtnfile(self, contract,filename): contract = request.env['dss.contracts'].search([('id', '=', contract)]) if len(contract.werbe_feld_selected) == 1: client = Client("https://cloud.logumedia.de/remote.php/dav/files/OdooDav/", auth=("odooClient@logumedia.de", "lm2020#OdooDav")) #files = client.cp('dav://'+path+'/'+filename,'/opt/odoo/addons/DigitalSignage/temp/'+filename) infile = open('/opt/odoo/addons/DigitalSignage/temp/temp_set.temp', 'wb') files = client.download_fileobj(filename,infile) infile = open('/opt/odoo/addons/DigitalSignage/temp/temp_set.temp', 'rb') indata = infile.read() encoded_file = base64.b64encode(indata) _logger.info('JS : SetBtn File'+str(contract)) for feld in contract.werbe_feld_selected: feld.btn_image = filename feld.btn_image_bin = encoded_file res = True else: res = "MULTI/" ids = "" for feld in contract.werbe_feld_selected: res += feld.feldname ids += str(feld.id) if feld != contract.werbe_feld_selected[-1]: ids += ':' res += ':' res += "/"+ids return res @route('/dss/setbtnfilefeld', type='json', auth='user') def setbtnfilefeld(self, contract,filename,feldid): feldids = feldid.split(':') client = Client("https://cloud.logumedia.de/remote.php/dav/files/OdooDav/", auth=("odooClient@logumedia.de", "lm2020#OdooDav")) #files = client.cp('dav://'+path+'/'+filename,'/opt/odoo/addons/DigitalSignage/temp/'+filename) infile = open('/opt/odoo/addons/DigitalSignage/temp/temp_set.temp', 'wb') files = client.download_fileobj(filename,infile) infile = open('/opt/odoo/addons/DigitalSignage/temp/temp_set.temp', 'rb') indata = infile.read() encoded_file = base64.b64encode(indata) for feld_id in feldids: feld = request.env['dss.advertisefields'].search([('id', '=', feld_id)]) feld.btn_image = filename feld.btn_image_bin = encoded_file return True