# -*- coding: utf-8 -* 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__) def _generate_preview_from_binary(self, videofile_file): cmd = ['ffmpeg', '-i','-','-ss','00:00:01','-vframes','1','-f','image2','-'] p = subprocess.Popen(cmd,stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) out,err = p.communicate(videofile_file) if p.returncode != 0: pass return base64.b64encode(out) def _generate_preview_from_binary_2(self, videofile_file): ff=FFmpeg() p = subprocess.Popen(cmd,stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) out,err = p.communicate(videofile_file) if p.returncode != 0: pass return base64.b64encode(out) class dssimport(models.Model): _name = "dss.import" _description = "DigitalSignage Import" uuid = fields.Char(default=lambda self: self._default_uuid(), required=True, readonly=True, copy=False, string='UUID') importfilename = fields.Binary('Import Dateiname') importtext = fields.Text('Import Verlauf') def _default_uuid(self): return str(uuid.uuid4()) def pyimport(self): return action class dsspprojektstatus(models.Model): _name = "dss.projectstate" _description = "DigitalSignage Projektstatus" _inherit = ['mail.thread','mail.activity.mixin'] _rec_name = "statusname" # _inherit = ['mail.thread', 'mail.activity.mixin'] uuid = fields.Char(default=lambda self: self._default_uuid(), required=True, readonly=True, copy=False, string='UUID') # uuid = fields.Char('UUID', required=True, translate=True) statusname = fields.Char('Statusname', required=True) color = fields.Char(string='Color Index') typ = fields.Selection([('NEU','In Bearbeitung'),('WORK','fertig/laufend'),('ERROR','Fehlerhaft/Defekt'),('ARCHIV','veraltet/archiviert')],'Systemzuordnung') icon = fields.Image() @api.model def _default_uuid(self): return str(uuid.uuid4()) class dsscontractstatus(models.Model): _name = "dss.contractstate" _description = "DigitalSignage Vertragsstatus" _inherit = ['mail.thread','mail.activity.mixin'] _rec_name = "statusname" # _inherit = ['mail.thread', 'mail.activity.mixin'] uuid = fields.Char(default=lambda self: self._default_uuid(), required=True, readonly=True, copy=False, string='UUID') # uuid = fields.Char('UUID', required=True, translate=True) statusname = fields.Char('Statusname', required=True) color = fields.Char(string='Color Index') icon = fields.Image() order = fields.Integer('Reihenfolge') @api.model def _default_uuid(self): return str(uuid.uuid4()) class dssadstatus(models.Model): _name = "dss.adstate" _description = "DigitalSignage Werbeaktions-Status" _inherit = ['mail.thread','mail.activity.mixin'] _rec_name = "statusname" # _inherit = ['mail.thread', 'mail.activity.mixin'] uuid = fields.Char(default=lambda self: self._default_uuid(), required=True, readonly=True, copy=False, string='UUID') # uuid = fields.Char('UUID', required=True, translate=True) statusname = fields.Char('Statusname', required=True) color = fields.Char(string='Color Index') func = fields.Selection([('STD','Standard'), ('FIN','Endzustand'), ('WOR','Arbeitszustand')]) icon = fields.Image() order = fields.Integer('Reihenfolge') @api.model def _default_uuid(self): return str(uuid.uuid4()) class dssworkstatus(models.Model): _name = "dss.workstate" _description = "DigitalSignage Bearbeitungsstatus" _inherit = ['mail.thread','mail.activity.mixin'] _rec_name = "statusname" # _inherit = ['mail.thread', 'mail.activity.mixin'] uuid = fields.Char(default=lambda self: self._default_uuid(), required=True, readonly=True, copy=False, string='UUID') # uuid = fields.Char('UUID', required=True, translate=True) statusname = fields.Char('Statusname', required=True) color = fields.Char(string='Color Index') icon = fields.Image() @api.model def _default_uuid(self): return str(uuid.uuid4()) class dsstodostatus(models.Model): _name = "dss.todostate" _description = "DigitalSignage Bearbeitungsschritte" _inherit = ['mail.thread','mail.activity.mixin'] _rec_name = "statusname" # _inherit = ['mail.thread', 'mail.activity.mixin'] uuid = fields.Char(default=lambda self: self._default_uuid(), required=True, readonly=True, copy=False, string='UUID') # uuid = fields.Char('UUID', required=True, translate=True) statusname = fields.Char('Statusname', required=True) statusnr = fields.Integer(default=lambda self: self._default_statusnr(),string='Listenpostion', required=True) color = fields.Char(string='Color Index') icon = fields.Image() @api.model def _default_uuid(self): return str(uuid.uuid4()) @api.model def _default_statusnr(self): return str(1) class dsstexts(models.Model): _name = "dss.texts" _description = "DigitalSignage Standard texte" _inherit = ['mail.thread','mail.activity.mixin'] _rec_name = "textname" # _inherit = ['mail.thread', 'mail.activity.mixin'] uuid = fields.Char(default=lambda self: self._default_uuid(), required=True, readonly=True, copy=False, string='UUID') # uuid = fields.Char('UUID', required=True, translate=True) text_id = fields.Char('Kennung', required=True) textname = fields.Char('Textname', required=True) description = fields.Text('Text') @api.model def _default_uuid(self): return str(uuid.uuid4()) class dsspaysystemfields(models.Model): _name = "dss.paysystem_fields" _description = "DigitalSignage Abrechnungsarten_felder" _inherit = ['mail.thread','mail.activity.mixin'] _rec_name = "feldname" # _inherit = ['mail.thread', 'mail.activity.mixin'] uuid = fields.Char(default=lambda self: self._default_uuid(), required=True, readonly=True, copy=False, string='UUID') # uuid = fields.Char('UUID', required=True, translate=True) feldname = fields.Char('Abrechnungs_Feldname', required=True) payonfieldset = fields.Selection([('VE','Vertragseingang'),('KA','Korrekturabzug'),('ES','Einspielung'),('CH','Jede Änderung'),('XH','X, Änderung')]) changecount = fields.Integer('Änderungsnummer') description = fields.Text('EventBeschreibung') amount = fields.Float('Kosten') @api.model def _default_uuid(self): return str(uuid.uuid4()) class dssmediatypes(models.Model): _name = "dss.mediatypes" _description = "DigitalSignage Datei-Medientypen" _inherit = ['mail.thread','mail.activity.mixin'] _rec_name = "medianame" # _inherit = ['mail.thread', 'mail.activity.mixin'] uuid = fields.Char(default=lambda self: self._default_uuid(), required=True, readonly=True, copy=False, string='UUID') # uuid = fields.Char('UUID', required=True, translate=True) medianame = fields.Char('Medien Name', required=True) mediatype = fields.Selection([('IMG_J','Bild'),('VID_4','MP4 Video'),('FIL_X','belieb. Datei')]) description = fields.Text('Medien Beschreibung') cloudlink = fields.Char('Cloud Verzeichnis',help='Verzeichnis für diese Datei innerhalb des Vertrags-Ordners') filepartname = fields.Char('Part.Dateiname',help='Teil des Dateinamens. Wird ergaenzt durch KampagnenID und MedienID. Beispiel : PNAME_34_544.jpg') maxsize_kb = fields.Integer('Maximale Größe KB') maxsize_w = fields.Integer('Maximale Pixel W') maxsize_h = fields.Integer('Maximale Pixel H') standard_image = fields.Image() @api.model def _default_uuid(self): return str(uuid.uuid4()) class dssmediarelations(models.Model): _name = "dss.mediarelations" _description = "DigitalSignage Kampagne-Medien-Zuordnung" _inherit = [] _rec_name = "relname" # _inherit = ['mail.thread', 'mail.activity.mixin'] uuid = fields.Char(default=lambda self: self._default_uuid(), required=True, readonly=True, copy=False, string='UUID') # uuid = fields.Char('UUID', required=True, translate=True) field = fields.Many2one('dss.advertisefields',string='Feld') contract = fields.Many2many(related='field.contract',string='Vertrag') ad = fields.Many2one('dss.ads',string='Werbekampagne') project = fields.Many2one('dss.projects',string='Werbeprojekt') mediatype = fields.Many2one('dss.mediatypes',string='Medientyp') mediatype_type = fields.Selection(related='mediatype.mediatype',string='Medientyp') mediatype_name = fields.Char(related='mediatype.medianame',string='Medienname') relname = fields.Char('Relationsname') field_uuid = fields.Char('Feld') mediatype_uuid = fields.Char('Medientyp') mediafile = fields.Binary('Datei',attachment=True) mediafile_attachment = fields.Many2one('ir.attachment',string='Datei') mediafile_file = fields.Char('Dateiname') secured_ro = fields.Boolean('Gesperrt ro') used_ro = fields.Boolean('Benutzt ro') isreference = fields.Boolean('Für Referenz') # @api.onchange('field') # def _onchange_field(self): # for record in self: # if record.field='': # record.contract='' # else: # record.contrect=record.field_contract def unlink(self): _logger.info('unlinking '+str(self)) for record in self: _logger.info('unlinking '+str(record)+' '+str(record.ad)) if record.ad != False: super(dssmediarelations,record).unlink() else: _logger.info('not unlinking '+str(record)+' '+str(record.ad)) @api.onchange('mediafile') def _onchange_mediafile(self): restr = 'keine' for record in self : resstr = record.uuid _logger.info(record.mediafile_file) if record.mediafile != False : _logger.info('Generating File '+resstr) if os.path.isfile(record.mediafile_file) : os.remove(record.mediafile_file) fileobj = open(record.mediafile_file,"xb") fileobj.write(base64.decodebytes(record.mediafile)) fileobj.close() _logger.info(resstr+' File generated') _logger.info(' Projekt : P_'+str(record.project)+'C_'+str(record.contract)+'A_'+str(record.ad)+' F : '+restr+' created ') _logger.info(' Keine Datei ') return def dload(self): for record in self : _logger.info('Download pressed : '+str(record)) return {} @api.model def _default_uuid(self): return str(uuid.uuid4()) # @api.depends('mediafile_file') # def _compute_media_preview(self): # for rec in self: # if rec.mediafile != False: # _logger.info('compute image for '+rec.uuid) # rec.mediafile_preview = self._generate_preview_from_binary(base64.decodebytes(rec.mediafile)) # rec.mediafile_preview = self._generate_preview_and_save_from_binary(base64.decodebytes(rec.mediafile),rec.mediafile_file+'_prv') # if rec.mediafile != False: # rec.mediafile_preview = self._generate_preview_from_binary(base64.decodebytes(rec.mediafile)) # rec.mediafile_preview = None # else: # _logger.info('alternative compute '+rec.uuid) # rec.mediafile_preview = rec.mediafile # return class dssadstructures(models.Model): _name = "dss.adstructures" _description = "DigitalSignage Werbestrukturen" _inherit = ['mail.thread','mail.activity.mixin'] _rec_name = "structurename" # _inherit = ['mail.thread', 'mail.activity.mixin'] uuid = fields.Char(default=lambda self: self._default_uuid(), required=True, readonly=True, copy=False, string='UUID') # uuid = fields.Char('UUID', required=True, translate=True) structurename = fields.Char('Struktur Name', required=True) kampagnen_uuid = fields.Char('Kampagne') description = fields.Text('Struktur Beschreibung') medias = fields.Many2many('dss.mediatypes',string='Enthaltene Dateien') @api.model def _default_uuid(self): return str(uuid.uuid4()) class dsspaysystems(models.Model): _name = "dss.paysystems" _description = "DigitalSignage Abrechnungsarten" _inherit = ['mail.thread','mail.activity.mixin'] _rec_name = "payname" # _inherit = ['mail.thread', 'mail.activity.mixin'] uuid = fields.Char(default=lambda self: self._default_uuid(), required=True, readonly=True, copy=False, string='UUID') # uuid = fields.Char('UUID', required=True, translate=True) payname = fields.Char('Abrechnungsname', required=True) payonset = fields.Many2many('dss.paysystem_fields') description = fields.Text('EventBeschreibung') send_info = fields.Boolean('Informationsemail senden ?') send_info_to = fields.Many2one('res.users') send_info_template = fields.Many2one('mail.template') amount = fields.Float('Kosten') icon = fields.Image() @api.model def _default_uuid(self): return str(uuid.uuid4()) class dssscreendesign(models.Model): _name = "dss.screendesign" _description = "DigitalSignage Screen Designer" _inherit = ['mail.thread','mail.activity.mixin'] _rec_name = "screenname" uuid = fields.Char(default=lambda self: self._default_uuid(), required=True, readonly=True, copy=False, string='UUID') date_create = fields.Date('Erstellungsdatum',default=lambda self: self._default_create_date()) date_lastedit = fields.Date('Änderungsdatum') user_create = fields.Char('Erstellungsuser',default=lambda self: self._default_create_user()) user_lastedit = fields.Char('Änderungsuser') screenname = fields.Char('Bildschirmname',track_visibility='onchange',tracking=True) fields = fields.One2many('dss.advertisefields','display',string='Werbefelder',tracking=True) @api.model def _default_uuid(self): return str(uuid.uuid4()) def _default_create_date(self): return str(date.today()) def _default_create_user(self): return str(self.env.user.name) @api.model def get_data(self): outlist = {'uuid' : 2222} return outlist class dsstriggertypes(models.Model): _name = "dss.triggertypes" _description = "DigitalSignage Trigger Typen" _inherit = ['mail.thread','mail.activity.mixin'] _rec_name = "triggername" uuid = fields.Char(default=lambda self: self._default_uuid(), required=True, readonly=True, copy=False, string='UUID') date_create = fields.Date('Erstellungsdatum',default=lambda self: self._default_create_date()) date_lastedit = fields.Date('Änderungsdatum') user_create = fields.Char('Erstellungsuser',default=lambda self: self._default_create_user()) user_lastedit = fields.Char('Änderungsuser') triggername = fields.Char('Triggername',track_visibility='onchange',tracking=True) triggertyp = fields.Selection([('FIELD_A','Feldänderung allgemein'),('FIELD_S','Feldänderung spezifisch'),('FIELD_K','Feldwert berechnet'),('MANUAL','Menuell ausgelösst')],'Triggertyp',track_visibility='onchange',tracking=True) trigger_table = fields.Many2one('ir.model','Nutzbar in',help='Für welche Daten ist dieser Tigger gültig ?',track_visibility='onchange',tracking=True) trigger_field = fields.Many2one('ir.model.fields', help='Feldname in der Tabelle',track_visibility='onchange',tracking=True) trigger_operator = fields.Selection([('NGLEICH','Feld gleich dem Wert'),('GGLEICH','Feld größer/gleich dem Wert'),('KGLEICH','Feld kleiner/gleich dem Wert'),('UGLEICH','Feld ungleich dem Wert'),('ENTHAELT','Feld enthällt dem Wert')],'Feldwertoperator',track_visibility='onchange',tracking=True) trigger_value = fields.Char('Feldwert für Trigger',track_visibility='onchange',tracking=True) trigger_Aktionen = fields.Many2many('dss.triggeractions',string='Aktionen bei auslösen des Triggers',track_visibility='onchange',tracking=True) @api.model def _default_uuid(self): return str(uuid.uuid4()) def _default_create_date(self): return str(date.today()) def _default_create_user(self): return str(self.env.user.name) class dsstriggertypes(models.Model): _name = "dss.triggeractions" _description = "DigitalSignage Trigger Aktionen" _inherit = ['mail.thread','mail.activity.mixin'] _rec_name = "triggeractionname" uuid = fields.Char(default=lambda self: self._default_uuid(), required=True, readonly=True, copy=False, string='UUID') date_create = fields.Date('Erstellungsdatum',default=lambda self: self._default_create_date()) date_lastedit = fields.Date('Änderungsdatum') user_create = fields.Char('Erstellungsuser',default=lambda self: self._default_create_user()) user_lastedit = fields.Char('Änderungsuser') triggeractionname = fields.Char('Triggeraktionname',track_visibility='onchange',tracking=True) triggeractiontyp = fields.Selection([('EMAIL','EMail senden'),('ACTIV','Aufgabe erzeugen'),('DSEDIT','Datensatz ändern'),('TUYA','Tuya Aktion auslössen')],'Aktionstyp',track_visibility='onchange',tracking=True) email_getfrom = fields.Selection([('FIX','Email fest hinterlegt'),('DATA','Email in Feld hinterlegt')],'Emailadresse von',track_visibility='onchange',tracking=True) email_fix_email_sender = fields.Many2one('res.partner','Absender',help='Email Sender Adresse der Aktion',track_visibility='onchange',tracking=True) email_fix_email = fields.Many2one('res.partner','Empfänger',help='Email Emüfänger Adresse für Benachrichtigung/Triggeraktion',track_visibility='onchange',tracking=True) email_data_table = fields.Many2one('ir.model','Nutzbar in',help='Für welche Daten ist diese Aktion gültig ?',track_visibility='onchange',tracking=True) email_data_field = fields.Many2one('ir.model.fields', help='Feldname in der Tabelle',track_visibility='onchange',tracking=True) email_template = fields.Many2one('mail.template','Emailvorlage',track_visibility='onchange',tracking=True) field = fields.Char('Feldname',help='Feldname in o.g. Tebelle.',track_visibility='onchange',tracking=True) type_s = fields.Char('Feldwertoperator',track_visibility='onchange',tracking=True) value_s = fields.Char('Feldwert für Trigger',track_visibility='onchange',tracking=True) @api.model def _default_uuid(self): return str(uuid.uuid4()) def _default_create_date(self): return str(date.today()) def _default_create_user(self): return str(self.env.user.name) class dsstriggertypes(models.Model): _name = "dss.triggergroups" _description = "DigitalSignage Trigger Gruppen" _inherit = ['mail.thread','mail.activity.mixin'] _rec_name = "triggergroupname" # _inherit = ['mail.thread', 'mail.activity.mixin'] uuid = fields.Char(default=lambda self: self._default_uuid(), required=True, readonly=True, copy=False, string='UUID') date_create = fields.Date('Erstellungsdatum',default=lambda self: self._default_create_date()) date_lastedit = fields.Date('Änderungsdatum') user_create = fields.Char('Erstellungsuser',default=lambda self: self._default_create_user()) user_lastedit = fields.Char('Änderungsuser') triggergroupname = fields.Char('Trigger Gruppenname',track_visibility='onchange',tracking=True) @api.model def _default_uuid(self): return str(uuid.uuid4()) def _default_create_date(self): return str(date.today()) def _default_create_user(self): return str(self.env.user.name)