454 lines
20 KiB
Python
Executable File
454 lines
20 KiB
Python
Executable File
# -*- 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)
|