import ast import datetime import json import re import uuid import logging import base64 import subprocess import tempfile import easywebdav import os import os.path from odoo import api, fields, models, _ from odoo import tools from odoo.exceptions import ValidationError 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 import sys TUYA_LOGGER.setLevel(logging.DEBUG) _logger = logging.getLogger(__name__) class dssSettings(models.Model): _name = "dss.settings" _description = "DigitalSignage Einstellungen" _inherit = ['mail.thread','mail.activity.mixin'] uuid = fields.Char(default=lambda self: self._default_uuid(), required=True, readonly=True, copy=False, string='UUID') def_cloud_url_base = fields.Char('Cloud URL Basis',help='https://xyxxxxxx.de/cccccccc/ bis zum vorkommen des des Grundsystem URL Teils',tracking=True) def_project_cloudpath = fields.Char('Standard Projekt Pfad',tracking=True) def_project_cloudpath_sample = fields.Char('Projekt Beispiel :',store=True,tracking=True) def_contract_cloudpath = fields.Char('Standard Kunden Pfad',tracking=True) def_contract_cloudpath_sample = fields.Char('Vertrags Beispiel :',tracking=True) def_contract_cloudpath_V2 = fields.Char('Standard Kunden Pfad V2',tracking=True) def_contract_cloudpath_sample_V2 = fields.Char('Projekt Beispiel V2 :',tracking=True) def_ad_cloudpath = fields.Char('Standard Kampagnen Pfad',tracking=True) def_ad_cloudpath_sample = fields.Char('Kampagnen Beispiel :',tracking=True) tuya_access_id = fields.Char('Tuya Access ID',tracking=True) tuya_access_key = fields.Char('Tuya Access KEY',tracking=True) tuya_endpoint = fields.Char('Tuya Access Endpoint',tracking=True) google_maps_key = fields.Char('Google API Key (Maps)',tracking=True) os_webimg_path = fields.Char('Verzeichnis für Bilder im Odooweb',tracking=True) contact_runtime_user = fields.Many2one('res.users',string="Kalenderkontact",help="Kalenderkontakt für Ablauf von Verträgen") runtime_auto_calandar_entry = fields.Boolean('Autom. Vertragsende Kalendereintrag ?',help='Jeden berechneten Vertrag-Ablaufzeitpunkt automatisch in Kalender eintragen ?',tracking=True) show_expand_contract_group_ad_state = fields.Boolean('Jeden Kampagnen-Status anzeigen ?',help='im Groupierungsmodus der Verträge nach Kampagnenstatus alle (auch unbenutzte) Statusspalten anzeigen ?',tracking=True) show_expand_contract_group_ad_work_state = fields.Boolean('Jeden Kampagnen-Arbeitsstatus anzeigen ?',help='im Groupierungsmodus der Verträge nach Kampagnen-Arbeitsstatus alle (auch unbenutzte) Statusspalten anzeigen ?',tracking=True) show_expand_contract_group_ad_todo_state = fields.Boolean('Jeden Kampagnen-Aufgabenschritt anzeigen ?',help='im Groupierungsmodus der Verträge nach Kampagnen-Aufgabenschritt alle (auch unbenutzte) Aufgabenspalten anzeigen ?',tracking=True) freigabe_auto_time = fields.Integer('Auto Freigabetage',help='Automatische Freigabe nach x Tagen',tracking=True) tv_vertragsankuendigung_actionID = fields.Integer('TV Vertragsankündigung ActionID',help="Aktion die ausgeführt wird, wenn im Web-Vertragseingang der Button Vertragsankündigung geklickt wird.",tracking=True) systemonline_color = fields.Char('Farbe Online',tracking=True) systemoffline_color = fields.Char('Farbe Offline',tracking=True) vnnoxurl = fields.Char('VNNox URL',tracking=True) vnnoxusername = fields.Char('VNNox Username',tracking=True) vnnoxpassword = fields.Char('VNNox Password',tracking=True) rporturl = fields.Char('RPort URL',tracking=True) rportusername = fields.Char('RPort Username',tracking=True) rporttoken = fields.Char('RPort API Token',tracking=True) showdebug = fields.Boolean('Debug',help='Debug Informationen aktivieren ',tracking=True) m2mcron = fields.Many2one('ir.cron',string='M2M Cron',tracking=True) def _get_settingvalue(self,valuename): settings = (self.env['dss.settings'].search([],limit=1)) wert = settings._origin.read([valuename])[0][valuename] return wert def _get_path_converted(self,path,record): alls = '' _logger.info("GetPath with " + str(path)+ " and Record : "+str(record.id)) if path: for parts in path.split(','): if parts[0] == '$': fels = parts[1:] parts = record._origin.read([fels]) _logger.info("Get Path - Anfrage-Teil gefunden : " + str(parts)) if parts: value = str(parts[0][fels]) else: value = '' _logger.info("Get Path - Anfrage-Teil gefunden - setze : " + str(value)) alls = alls + value else: alls = alls + str(parts) return alls @api.onchange('def_project_cloudpath') def _onchange_def_project_cloudpath(self): _logger.info("Default Project Cloudpath Setzen") project_1 = self.env['dss.projects'].search([('uuid','=ilike','%')],limit=1) if not project_1: _logger.info("Default Cloudpath Setzen - kein MusterProjekt gefunden") else: _logger.info("Default Cloudpath Setzen - MusterProjekt gefunden "+str(project_1.id)) alls = self._get_path_converted(self.def_project_cloudpath,project_1) self.def_project_cloudpath_sample = alls @api.onchange('def_contract_cloudpath') def _onchange_def_contract_cloudpath(self): _logger.info("Default Contract Cloudpath Setzen") contract_1 = self.env['dss.contracts'].search([('uuid','=ilike','%')],limit=1) if not contract_1: _logger.info("Default Cloudpath Setzen - kein MusterProjekt gefunden") else: _logger.info("Default Cloudpath Setzen - MusterProjekt gefunden "+str(contract_1.id)) alls = self._get_path_converted(self.def_contract_cloudpath,contract_1) self.def_contract_cloudpath_sample = alls @api.onchange('def_ad_cloudpath') def _onchange_def_ad_cloudpath(self): _logger.info("Default ad Cloudpath Setzen") ad_1 = self.env['dss.ads'].search([('uuid','=ilike','%')],limit=1) if not ad_1: _logger.info("Default Cloudpath Setzen - kein MusterProjekt gefunden") else: _logger.info("Default Cloudpath Setzen - MusterProjekt gefunden "+str(ad_1.id)) alls = self._get_path_converted(self.def_ad_cloudpath,ad_1) self.def_ad_cloudpath_sample = alls def _default_uuid(self): return str(uuid.uuid4()) @api.model def saveConfig(self,tableInfo): _logger.info("Config speichern "+str(tableInfo)) activefields = tableInfo[3] for field in activefields: _logger.info("Config speichern : "+str(field)+" / "+str(tableInfo[0])+" -> "+str(tableInfo[1])+" "+str(tableInfo[2])) myview = self.env['dss.viewsettings'].search(['&',("user","=",self.env.user.name),("model_view","=",tableInfo[1]),("model_datensatz","=",tableInfo[0]),("viewtype","=",tableInfo[2]),("column","=",field[0])]) if not myview: _logger.info("Config speichern : noch keine gespeicherten Daten") else: myview.unlink() self.env['dss.viewsettings'].create({ 'model_view':tableInfo[1], 'model_datensatz':tableInfo[0], 'viewtype':tableInfo[2], 'user':self.env.user.name, 'user_id':self.env.user.id, 'column':field[0], 'column_size':field[1], 'state_visible':field[2], 'state_collapse':field[3] }) return 0 @api.model def resetConfig(self,tableInfo): _logger.info("Config reset "+str(tableInfo)) myview = self.env['dss.viewsettings'].search(['&',("user","=",self.env.user.name),("model_view","=",tableInfo[1]),("model_datensatz","=",tableInfo[0]),("viewtype","=",tableInfo[2])]) if not myview: _logger.info("Config Reset : noch keine gespeicherten Daten") else: myview.unlink() return 0 class dssSettingsSave(models.Model): _name = "dss.viewsettings" _description = "DigitalSignage Ansicht Einstellungen" _inherit = [] uuid = fields.Char(default=lambda self: self._default_uuid(), required=True, readonly=True, copy=False, string='UUID') user = fields.Char('User') user_id = fields.Many2one('res.users',string='User_id') model_view = fields.Char('Model') model_datensatz = fields.Char('Datensatz') viewtype = fields.Char('Ansichtstyp') column = fields.Char('Spalte') column_size = fields.Char('Spalten Grösse') state_visible = fields.Char('Status sichtbar') state_collapse = fields.Char('Status zusammengeklappt') @api.model def _default_uuid(self): return str(uuid.uuid4()) def _default_create_user(self): return str(self.env.user.name) def _default_create_user_id(self): return self.env.user.id