import ast import datetime import json import re from .dsslogger import OdooCustomLogger import logging import uuid import base64 import subprocess import tempfile import requests #from symbol import return_stmt import json from types import SimpleNamespace import easywebdav import os import os.path from odoo import api, fields, models, _ from odoo import tools from odoo.exceptions import ValidationError from . import dss_settings from datetime import date from datetime import datetime from dateutil.relativedelta import relativedelta from pyffmpeg import FFmpeg from tuya_iot import TuyaOpenAPI, TUYA_LOGGER from tuya_connector import TuyaOpenAPI, TUYA_LOGGER from webdav4.client import Client from webdav4.fsspec import WebdavFileSystem import sys TUYA_LOGGER.setLevel(logging.DEBUG) logging.setLoggerClass(OdooCustomLogger) _logger = logging.getLogger(__name__) class dssprojects(models.Model): _name = "dss.projects" _description = "DigitalSignage Projekte" _rec_name = "projektname" _inherit = ['mail.thread','mail.activity.mixin','dss.triggermodel'] projektname = fields.Char('Projektname', required=True) uuid = fields.Char(default=lambda self: self._default_uuid(), required=True, readonly=True, copy=False, string='UUID') projectid = fields.Integer('Projekt ID',tracking=True) color = fields.Char('Color Index',tracking=True) active = fields.Boolean('Active', default=True,tracking=True) invisible = fields.Boolean('Ausgeblendet', default=False,tracking=True) name = fields.Char('Interner Name', required=True,tracking=True) aktstatus = fields.Many2one('dss.projectstate',string='Aktueller Status:',tracking=True) aktstatus_typ = fields.Selection(related='aktstatus.typ') aktstatus_color = fields.Char(related='aktstatus.color') aktstatus_icon = fields.Image(related='aktstatus.icon') description = fields.Text('Beschreibung',tracking=True) remarks = fields.Html('Bemerkungen',tracking=True) hotremarks = fields.Html('Wichtige Bemerkungen',tracking=True) short_partner_description = fields.Char('Kurz-Beschreibung für Kunden',tracking=True) partner_description = fields.Text('Beschreibung für Kunden',tracking=True) systemname = fields.Many2one('dss.systems',tracking=True) grundsystemname = fields.Many2one('dss.systemtypen',group_expand='_read_group_system_ids',tracking=True) grundsystem_typ = fields.Char(related='grundsystemname.kennung',tracking=True) grundsystemnameuuid = fields.Char(related='grundsystemname.uuid',tracking=True) grundsystemicon = fields.Image(related='grundsystemname.icon',tracking=True) grundsystem_default_adstructure = fields.Many2one(related='grundsystemname.default_adstructure',tracking=True) grundsystemicon5050 = fields.Image(related='grundsystemname.icon_5050') grundsystem_ordner = fields.Char(related='grundsystemname.default_cloud_path') grundsystem_default_cloud_structure_project = fields.Char(related='grundsystemname.default_cloud_structure_project') grundsystem_default_cloud_structure_contract = fields.Char(related='grundsystemname.default_cloud_structure_contract') grundsystem_showonlinestate = fields.Boolean(related='grundsystemname.showonlinestate') grundsystem_showonlinestate_type = fields.Selection(related='grundsystemname.showonlinestate_type') grundsystemicon_different = fields.Boolean('Grundsystem Icon anders',default=False,tracking=True) grundsystemicon_different_image = fields.Binary('Anderes Icon',tracking=True) btntemplate = fields.Many2one('dss.display.templates',string='Buttonsvorlage',tracking=True) btntemplate_displaytemplate_fullsize_w = fields.Integer(related='btntemplate.fullsize_w',string="Auflösung Breite",tracking=True) btntemplate_displaytemplate_fullsize_h = fields.Integer(related='btntemplate.fullsize_h',string="Auflösung Höhe",tracking=True) standort = fields.Char('Beschreibung des Standortes') standort_strasse = fields.Char('Strasse des Projektes',tracking=True) standort_plz = fields.Char('PLZ des Projektes',tracking=True) standort_ort = fields.Char('Ort des Projektes',tracking=True) standort_bundesland = fields.Many2one('res.country.state',string='Bundesland des Projektes',tracking=True) standort_land = fields.Many2one('res.country',string='Land des Projektes',tracking=True) standort_long = fields.Char('Standort Longitude',tracking=True) standort_lati = fields.Char('Standort Latitude',tracking=True) standort_visible = fields.Boolean('Auf Projekt-Karte sichtbar',tracking=True) zahlungsvorlauf = fields.Integer('Wochen Zahlungsvorlauf', tracking=True) maps_name = fields.Char('Name in Google',tracking=True) maps_type = fields.Char('Type in Google',tracking=True) maps_marker = fields.Selection([('m1.png','Marker 1'),('m2.png','Marker 2'),('m3.png','Marker 3'),('m4.png','Marker 4'),('m5.png','Marker 5'),('pin.png','Marker Pin'),('pin2.png','3D Marker Pin'),('pin_display.png','Displpay Pin'),('pin_display_touch.png','TouchDisplpay Pin'),('pin_led.png','LEDWand Pin')],'Marker in Google',tracking=True) maps_image = fields.Binary('Google Bild',tracking=True) maps_image_2 = fields.Binary('Google Bild 2',tracking=True) maps_image_3 = fields.Binary('Google Bild 3',tracking=True) maps_text = fields.Html('Google Beschreibung',tracking=True) maps_typ_interactive = fields.Boolean('Ist Interactive ?', tracking=True) maps_visitors = fields.Integer('Besucher pro Tag', tracking=True) maps_displaytyp = fields.Char('Anzeigetyp in Google', tracking=True) maps_displaysize = fields.Char('Anzeigegroesse in Google',tracking=True) maps_werbeflaechen_a_free = fields.Boolean('Werbeflächen 1 Frei', tracking=True) maps_werbeflaechen_a = fields.Char('Werbeflächenbeschreibung 1',tracking=True) maps_werbeflaechen_b_free = fields.Boolean('Werbeflächen 2 Frei', tracking=True) maps_werbeflaechen_b = fields.Char('Werbeflächenbeschreibung 2',tracking=True) maps_werbemedien = fields.Char('Werbeflächen-Dateien',tracking=True) maps_freespaces_b_show = fields.Boolean('Freie Flächen zeigen ?', tracking=True) maps_freespaces_b = fields.Char('Freie Werbeflächen',tracking=True) vertragsschreiber = fields.Many2one('res.partner',domain="['&',('dsspartner','=',True),('dsspartner_vertrieb','=',True)]",tracking=True) standortpartner = fields.Many2one('res.partner',domain="['&',('dsspartner','=',True),('dsspartner_standort','=',True)]",tracking=True) vertriebspartner = fields.Many2many('res.partner',domain="['&',('dsspartner','=',True),('dsspartner_vertrieb','=',True)]",tracking=True) project_grafiker = fields.Many2one('res.partner',domain="['&',('dssinternpartner','=',True),('dssinternpartner_grafik','=',True)]",tracking=True) project_techniker = fields.Many2one('res.partner', domain="['&',('dssinternpartner','=',True),('dssinternpartner_technik','=',True)]", tracking=True, string="Techniker (Einspielung)",help="der Techniker der die Einspielung vornehmen kann") zeiten_on = fields.Datetime('veraltet',tracking=True) zeiten_off = fields.Datetime('veraltet',tracking=True) zeitenf_on = fields.Float('Einschaltzeit',tracking=True) zeitenf_off = fields.Float('Ausschaltzeit',tracking=True) zeiten_notiz = fields.Char('Schaltzeiten Notizen', tracking=True) errichtet_am = fields.Date('Errichtungstag',tracking=True) cancel_am_in = fields.Date('Kündigung Insti - Eingang Kündigung',tracking=True) cancel_am_to = fields.Date('Kündigung Insti - Kündigung zum',tracking=True) finish_am = fields.Date('Beendigungstag',tracking=True) standort_inout = fields.Selection([('indoor','im Gebäude'), ('outdoor','Aussenbereich'), ('semiindoor','Überdachter Aussenbereich'),('Divers','Andere Art')],tracking=True) date_start_compute = fields.Date('Kalender Start intern',compute='_compute_calendar_start') cloudlink = fields.Char('Cloud Verzeichnis',help='Verzeichnis für das Project innerhalb des Cloud Struktur') maintains = fields.Many2many('dss.maintaintask',string="Einsätze am Projekt") marker_list = fields.Many2many('dss.marker', string='vorhandene Marker', tracking=True) onlinestate_1 = fields.Char('OnlineColor_1') playername_1 = fields.Char('Name des Players_1', tracking=True) onlinestate_2 = fields.Char('OnlineColor_2') playername_2 = fields.Char('Name des Players_2', tracking=True) onlinestate_3 = fields.Char('OnlineColor_3') playername_3 = fields.Char('Name des Players_3', tracking=True) Rportid_1 = fields.Char('RPort ID 1', tracking=True) Rportid_2 = fields.Char('RPort ID 2', tracking=True) Rportid_3 = fields.Char('RPort ID 3', tracking=True) issim = fields.Boolean('Sim Karte genutzt ?', tracking=True) simid_1 = fields.Char('Simkarte Nr 1', tracking=True) simstart_1 = fields.Char('Simkarte 1 Vertr.start', tracking=True) simstart_DVEmpty_1 = fields.Boolean('Simkarte 1 DV leer', tracking=True) simstart_DVEmpty_1_lastdate = fields.Date('Simkarte 1 Leerdatum', tracking=True) simid_2 = fields.Char('Simkarte Nr 2', tracking=True) simstart_2 = fields.Char('Simkarte 2 Vertr.start', tracking=True) simstart_DVEmpty_2 = fields.Boolean('Simkarte 2 DV leer', tracking=True) simstart_DVEmpty_2_lastdate = fields.Date('Simkarte 2 Leerdatum', tracking=True) simid_3 = fields.Char('Simkarte Nr 3', tracking=True) simstart_3 = fields.Char('Simkarte 3 Vertr.start', tracking=True) simstart_DVEmpty_3 = fields.Boolean('Simkarte 3 DV leer', tracking=True) simstart_DVEmpty_3_lastdate = fields.Date('Simkarte 3 Leerdatum', tracking=True) playsetup_user = fields.Many2one('res.users',domain="[('user_type','=','1')]",string='Einspielung - Benutzer',tracking=True) @api.model def _read_group_system_ids(self, stages, domain, order): project_system_ids = self.env['dss.systemtypen'].search([('open_close_standard_state','=',False)], order='order') return project_system_ids def jumpcloud(self): urlbase=str(self.env['dss.settings'].search([], limit=1).def_cloud_url_base) _logger.info("Cloud Open Link Urlbase DB " + str(urlbase)) if not urlbase: urlbase = 'https://cloud.logumedia.de/index.php/apps/files/?dir='; _logger.info("Cloud Open Link Urlbase Used " + str(urlbase)) url=str(urlbase)+str(dss_settings.dssSettings._get_path_converted(self,self.cloudlink,self)) _logger.info("Cloud Open Link " + str(url)) return { 'type': 'ir.actions.act_url', 'url': str(url), 'target': 'new', } @api.model def _compute_calendar_start(self): for record in self: if record.errichtet_am: record.date_start_compute=record.errichtet_am else: record.date_start_compute=date.today() @api.model def _default_uuid(self): return str(uuid.uuid4()) def _track_template(self, changes): res = super()._track_template(changes) if self.run_trigger: self.trigger_track_template(changes, self) return res def pyaction_view_contracts(self): # action = self.env['ir.actions.act_window'].with_context({'default_project': self.id})._for_xml_id('DigitalSignage.action_dss_project_contracts') # action['display_name'] = self.projektname # context = action['context'].replace('active_id', str(self.id)) # domain = action['domain'].replace('active_id', str(self.id)) # _logger.info('Vertraege fuer : '+str(self.id)) # return { # 'type': 'ir.actions.act_window', # 'view_type':'kanban', # 'view_mode':'kanban,tree,screenview', # 'res_model':'dss.contracts', # 'target':'current', # 'context':'{"default_project":'+str(self.id)+',"show_project_update":True}', # 'res_id':self.id, # 'display_name' : self.name, # 'domain':'[("project","=",'+str(self.id)+')]' # } action = self.env["ir.actions.actions"]._for_xml_id("DigitalSignage.action_dss_project_contracts") return action # context = ast.literal_eval(context) # context = "{ # 'create': self.active, # 'active_test': self.active # }7 # action['context'] = context # action['domain'] = domain # return action @api.onchange('cloudlink') def _onchange_cloudlink(self): _logger.info("Project "+str(self.id)+" Cloudpath changed") if (self.cloudlink == ''): if (self._origin.cloudlink != ''): _logger.info("Project " + str(self.id) + " deleted - using standard path") self.cloudlink = dss_settings.dssSettings._get_path_converted(self,self.env['dss.settings'].search([],limit=1).def_project_cloudpath,self) def switch_invislbe(self): return { 'type': 'ir.actions.act_window', 'view_type':'kanban', 'view_mode':'kanban,tree', 'res_model':'dss.contracts', 'target':'current', 'context':'{"default_project":'+str(self.id)+',"show_project_update":True}', 'res_id':self.id, 'display_name' : self.projektname, 'domain':'[("project","=",'+str(self.id)+')]' } @api.model def _geo_localize(self, street='', zip='', city='', state='', country=''): geo_obj = self.env['base.geocoder'] search = geo_obj.geo_query_address(street=street, zip=zip, city=city, state=state, country=country) result = geo_obj.geo_find(search, force_country=country) if result is None: search = geo_obj.geo_query_address(city=city, state=state, country=country) result = geo_obj.geo_find(search, force_country=country) return result def dss_geo_localize(self): # We need country names in English below result = self._geo_localize(self.standort_strasse, self.standort_plz, self.standort_ort, self.standort_bundesland.name, self.standort_land.name) if result: self.write({ 'standort_lati': result[0], 'standort_long': result[1] }) else: partners_not_geo_localized |= partner return True def pyaction_dss_project_set_def_cloud(self): self.cloudlink = str(self.env['dss.settings'].search([], limit=1).def_project_cloudpath) return True @api.model def _compute_getonlinestate(self): colorval = "#a0a0a0" self.onlinestate = colorval @api.model def compute_getonlinestate2(self,project): projekte = self.env['dss.projects'].search([('grundsystem_showonlinestate','=',True)]) for pro in projekte: self.compute_getonlinestate_single(pro) @api.model def get_data(self,template): if not template: outlist = [{"error":"Kein Projekt übermittelt"}] else: project = self.env['dss.projects'].search([('id',"=",template)]) contracts = self.env['dss.contracts'].search([('project',"=",project.id),('contract_state','=',4)]) if not project.btntemplate: outlist=[{"error":"Kein Button-template definiert"}] else: #alldata = self.env['dss.advertisefields.templates'].search([('displaytemplate',"=",project.btntemplate.id)]) outlist = ([]) #self.env["confirmation.wizard"].with_context(hide_cancel=True).confirm_no_action_message(message="Debug : "+str(len(alldata))+"/"+str(alldata),title="Notification") for contract in contracts: for feld in contract.werbe_feld_selected: if feld.is_btn: if contract.client: name1 = contract.contact_company_name name2 = contract.contact_dsspartner_vorname+' '+contract.contact_dsspartner_name name3 = contract.contact_street2 name4 = contract.contact_zip+' '+contract.contact_city else: name1 = contract.client_short_company name2 = contract.client_short_vorname+' '+contract.client_short_name name3 = contract.client_short_strasse name4 = contract.client_short_plz+' '+contract.client_short_ort if feld.btn_image_bin: # Convert the binary image data to a Base64 string image_base64 = str(feld.btn_image_bin)[2:][:-1] else: image_base64 = '' _logger.info("Button Image : "+str(feld.btn_image_bin)) outlist.append({'uuid':contract.uuid,'pos_x':feld.btn_pos_x,'pos_y':feld.btn_pos_y,'pos_w':feld.btn_pos_w,'pos_h':feld.btn_pos_h,'feldname':feld.feldname,'kunde_1':name1,'kunde_2':name2,'kunde_3':name3,'kunde_4':name4,'btn_image':image_base64}) return outlist def compute_getonlinestate_single(self,project): #proj = self.env['dss.projects'].search([('id',"=",project.id)]) _logger.setLevel(1) proj = project colorOn = str(self.env['dss.settings'].search([], limit=1).systemonline_color) colorOff = str(self.env['dss.settings'].search([], limit=1).systemoffline_color) _logger.info("Projekt Online Settings Check "+str(proj.grundsystem_showonlinestate_type)+' '+str(self)+' '+str(project)) if (proj.grundsystem_showonlinestate_type == 'RPORT'): playername = proj["Rportid_1"] _logger.info("Projekt RPORT Settings "+str(playername) ) if playername!=False: rporturl = str(self.env['dss.settings'].search([], limit=1).rporturl)+'/api/v1/clients/' rportusername = str(self.env['dss.settings'].search([], limit=1).rportusername) rporttoken = str(self.env['dss.settings'].search([], limit=1).rporttoken) auth = (rportusername, rporttoken) for plnr in range(1,4): playername = proj["Rportid_"+str(plnr)] if playername: _logger.info("RPORT request :"+str(rporturl)+str(playername)) r = requests.get(str(rporturl)+str(playername), auth=auth, verify=False) _logger.info("RPORT answere :"+str(r.status_code)+' - '+str(r.content)) if (str(r.status_code) == "200"): content = str(r.json()) index = content.find("connection_state") content = content[index+20:] index = content.find("',") token = content[:index] if (self.env['dss.onlinestate'].search([("project","=",proj.id),("number","=",plnr)], order="date_create desc", limit=1) == False): self.env['dss.onlinestate'].create({'project':proj.id,'number':plnr,'online':False}) laststate = self.env['dss.onlinestate'].search([("project","=",proj.id),("number","=",plnr)], order="date_create desc", limit=1).online _logger.info("RPORT answere :"+str(token)+"/"+str(laststate)) if token == 'connected': colorval = colorOn if not laststate: self.env['dss.onlinestate'].create({'project':proj.id,'number':plnr,'online':True}) else: colorval = colorOff if laststate: self.env['dss.onlinestate'].create({'project':proj.id,'number':plnr,'online':False}) else: colorval = colorOff else: colorval = 0 proj['onlinestate_'+str(plnr)]=colorval else: colorval = 0 proj['onlinestate_1']=colorval elif (proj.grundsystem_showonlinestate_type == 'VNNOX'): vnurl = str(self.env['dss.settings'].search([], limit=1).vnnoxurl)+'/Rest/Logon' vnusername = str(self.env['dss.settings'].search([], limit=1).vnnoxusername) vnpassword = str(self.env['dss.settings'].search([], limit=1).vnnoxpassword) # _logger.info("Projekt VNNOX Settings " + str(vnurl)) r = requests.post(vnurl, json={"password": vnpassword,"username": vnusername}) if (str(r.status_code) == "200"): content = str(r.json()) index = content.find("token") content = content[index+9:] index = content.find("',") token = content[:index] for plnr in range(1,4): playername = proj["playername_"+str(plnr)] if playername!=False: # _logger.info("Projekt VNNOX Settings Token : /" + str(token)+"/") vnurl_getPlayer = str(self.env['dss.settings'].search([], limit=1).vnnoxurl)+'/Rest/Player?offset=0&limit=10&sort=name&sortType=asc&search='+str(playername) headers = {'token': token} r = requests.get(vnurl_getPlayer, headers=headers) if (str(r.status_code) == "200"): _logger.info("Projekt VNNOX Settings Data : /" + str(r.content)+"/") resj = json.loads(r.content) if resj["data"]["count"] == "1": if (self.env['dss.onlinestate'].search([("project","=",proj.id),("number","=",plnr)], order="date_create desc", limit=1) == False): self.env['dss.onlinestate'].create({'project':proj.id,'number':plnr,'online':False}) laststate = self.env['dss.onlinestate'].search([("project","=",proj.id),("number","=",plnr)], order="date_create desc", limit=1).online _logger.info("Projekt VNNOX Settings Data : /" + str(resj["data"]["playerInfo"][0]["online"])+"/"+str(laststate)) if resj["data"]["playerInfo"][0]["online"] == "1": colorval = colorOn if not laststate: self.env['dss.onlinestate'].create({'project':proj.id,'number':plnr,'online':True}) else: colorval = colorOff if laststate: self.env['dss.onlinestate'].create({'project':proj.id,'number':plnr,'online':False}) else: colorval = "#a0a0a0" else: colorval = "#a0a0a0" proj['onlinestate_'+str(plnr)]=colorval else: colorval = "0" proj['onlinestate_'+str(plnr)]=colorval else: colorval = "#a0a0a0" proj['onlinestate_1']=colorval else: colorval = "#a0a0a0" proj['onlinestate_1']=colorval @api.model def go_contract(self,uuid): _logger.info("UUID : "+str(uuid)) if uuid: contract = self.env['dss.contracts'].search([('uuid','=',uuid)]) if contract: action = self.env["ir.actions.actions"]._for_xml_id("DigitalSignage.action_dss_contracts") action['context'] = {'default_project': contract.project.id} action['domain'] = [('id', '=', contract.id)] action['res_id'] = contract.id return action else: _logger.info("UUID : "+str(uuid)+" not found") return False else: _logger.info("UUID : "+str(uuid)+" not found") return False def getScreenViewData(self,domain): ViewParams = {} ViewParams.screensize_x=1980 ViewParams.screensize_y=1024 return ViewParams def method(self): return ( self.env["confirmation.wizard"] .with_context(hide_cancel=True) .confirm_no_action_message( message="Message", title="Notification" ) ) @api.model def newwizzard(self): _logger.info("Create new Project") action = self.env["ir.actions.actions"]._for_xml_id("DigitalSignage.new_wizard_action") action['context'] = {'default_state': 'start'} return action class dssprojects_new_wizard(models.TransientModel): _name = "dss.projects.new.wizard" _description = "DigitalSignage Projekte - Wizard" #_inherit = ['mail.thread','mail.activity.mixin'] _inherit = ['multi.step.wizard.mixin'] _rec_name = "projectid" state = fields.Selection(selection='_selection_state', string='Status', default='start') allow_back = fields.Boolean('Allow Back', default=False) projectid = fields.Integer('Projekt ID', required=True) projektname = fields.Char('Projektname', required=True) name = fields.Char('Interner Name', required=True) aktstatus = fields.Many2one('dss.projectstate',string='Aktueller Status:') grundsystemname = fields.Many2one('dss.systemtypen', required=True) grundsystemnameuuid = fields.Char(related='grundsystemname.uuid') grundsystemicon = fields.Image(related='grundsystemname.icon') grundsystem_default_adstructure = fields.Many2one(related='grundsystemname.default_adstructure') grundsystem_ordner = fields.Char(related='grundsystemname.default_cloud_path') isdifferendcouldstructure = fields.Boolean('Andere Cloud Struktur ?') cloudgenerate = fields.Boolean('Cloud Struktur erzeugen ?') differendcouldstructurefolder = fields.Char('Cloud Struktur') kundenbeschreibung = fields.Char('Kundenbeschreibung') run_uni_trigger = fields.Boolean('Allgemeine Trigger aktiv',default=True) cloudlink = fields.Char('Cloud Verzeichnis',help='Verzeichnis für das Project innerhalb des Cloud Struktur') standort = fields.Char('Beschreibung des Standortes') standort_strasse = fields.Char('Strasse des Projektes') standort_plz = fields.Char('PLZ des Projektes') standort_ort = fields.Char('Ort des Projektes') standort_bundesland = fields.Many2one('res.country.state',string='Bundesland des Projektes') standort_land = fields.Many2one('res.country',string='Land des Projektes') vertragsschreiber = fields.Many2one('res.partner',domain="['&',('dsspartner','=',True),('dsspartner_vertrieb','=',True)]") standortpartner = fields.Many2one('res.partner',domain="['&',('dsspartner','=',True),('dsspartner_standort','=',True)]") vertriebspartner = fields.Many2many('res.partner',domain="['&',('dsspartner','=',True),('dsspartner_vertrieb','=',True)]") project_grafiker = fields.Many2one('res.partner',domain="['&',('dssinternpartner','=',True),('dssinternpartner_grafik','=',True)]") @api.model def _selection_state(self): return [ ('start', 'Start'), ('configure', 'Configure'), ('custom', 'Customize'), ('final', 'Final'), ] def open_next(self): _logger.info("Open Next") # if self.state == 'start': self.state = 'configure' # elif self.state == 'configure': self.state = 'custom' # elif self.state == 'custom': self.state = 'final' # elif self.state == 'final': self.action_create_project() self.action_create_project() def open_previous(self): _logger.info("Open Previous") if self.state == 'configure': self.state = 'start' elif self.state == 'custom': self.state = 'configure' elif self.state == 'final': self.state = 'custom' def state_exit_start(self): self.state = 'configure' def state_exit_configure(self): self.state = 'custom' def state_exit_custom(self): self.state = 'final' def _create_cloud_structure(self, newProjekt, isdifferendcouldstructure, differendcouldstructurefolder): _logger.info("Create Cloud Structure for Project "+str(newProjekt.id)+" - "+str(newProjekt.cloudlink)) if isdifferendcouldstructure: cloudpath = str(differendcouldstructurefolder) else: cloudpath = str(newProjekt.grundsystem_default_cloud_structure_project) client = Client("https://cloud.logumedia.de/remote.php/dav/files/OdooDav/", auth=("odooClient@logumedia.de", "lm2020#OdooDav")) new_folder = dss_settings.dssSettings.getprojectpath(self,newProjekt) _logger.info("Neuer Cloud Path : "+str(new_folder)) try: #client.mkdir(new_folder) #_logger.info("Make Cloud Path : "+str(new_folder)) if isdifferendcouldstructure: _logger.info("Create Differend Cloud Structure for Project "+str(newProjekt.id)+" - "+str(newProjekt.cloudlink)) client.copy(differendcouldstructurefolder+'/',new_folder) _logger.info("Make Differend Cloud Path : "+str(new_folder+'/'+str(differendcouldstructurefolder))) else: _logger.info("Create Standard Cloud Structure for Project "+str(newProjekt.id)+" - "+str(newProjekt.cloudlink)) client.copy(newProjekt.grundsystem_default_cloud_structure_project+'/',new_folder) _logger.info("Make Standard Cloud Path : "+str(new_folder+'/'+str(newProjekt.grundsystem_default_cloud_structure_project))) except Exception as e: _logger.info("Make Cloud Path error : "+str(e)) return True def action_create_project(self): _logger.info("Create Project") newProjekt = self.env['dss.projects'].create({'projektname':self.projektname,'name':self.name,'aktstatus':self.aktstatus.id,'projectid':self.projectid,'grundsystemname':self.grundsystemname.id,'grundsystemnameuuid':self.grundsystemnameuuid,'grundsystemicon':self.grundsystemicon,'grundsystem_ordner':self.grundsystem_ordner,'grundsystem_default_adstructure':self.grundsystem_default_adstructure,'standort':self.standort,'standort_ort':self.standort_ort,'standort_plz':self.standort_plz,'standort_land':self.standort_land.id,'standort_bundesland':self.standort_bundesland.id,'standort_strasse':self.standort_strasse,'vertragsschreiber':self.vertragsschreiber.id,'standortpartner':self.standortpartner.id,'vertriebspartner': self.vertriebspartner.ids,'project_grafiker': self.project_grafiker.id,'short_partner_description':self.kundenbeschreibung}) newProjekt.cloudlink = dss_settings.dssSettings.getprojectpath(self,newProjekt) if newProjekt: _logger.info("Project created with ID : "+str(newProjekt.id)) if self.cloudgenerate: _logger.info("Create Cloud Structure for Project "+str(newProjekt.id)+" - "+str(newProjekt.cloudlink)) self._create_cloud_structure(newProjekt,self.isdifferendcouldstructure, self.differendcouldstructurefolder) return True