DigitalSignage/models/dss.py

380 lines
15 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
from . import dss_contract
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()
order = fields.Integer('Reihenfolge')
@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')
systemtypdefault = fields.Boolean(string='Default Typ',tracking=True)
systemtyp = fields.Many2one('dss.systemtypen',tracking=True)
systemtypuuid = fields.Char(related='systemtyp.uuid',tracking=True)
kanban_display_minimal = fields.Boolean(string='Kanban minimalisiert')
@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()
order = fields.Integer('Reihenfolge')
@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()
order = fields.Integer('Reihenfolge')
@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 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')
archiv_cloudlink = fields.Char('Archivcloud 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()
default_filename = fields.Char('Default Dateiname', help='Standard-Dateiname für diesen Mediatyp. Wird automatisch aus dem Dateinamen der hochgeladenen Datei abgerufen')
@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 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',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
def myscreenrebuild(self):
_logger.info('inside Screenrebuild')
return {
'type': 'ir.actions.client',
'name': 'reload',
'context' : {'screenlayout': 1},
'tag': 'dss_screenDesigner_js_action'
}
class NewBinaryWizard(models.TransientModel):
_name = 'dss.binaries.wizard.new'
_description = 'New Binary Wizard'
field_ids = fields.Many2one('dss.mediatypes' , string='Partners')
def pyopen_dss_contract_add_binary_form_view_from_wizzard(self):
context = dict(self.env.context or {})
default_contract_id = context.get('active_id', False)
_logger.info('Open Add Binary Form '+str(context)+' - '+str(default_contract_id)+' / '+str(self.field_ids))
contract= self.env['dss.contracts'].browse(default_contract_id)
dss_contract.dsscontracts.pyopen_dss_contract_add_binary_form_view_from_wizzard(contract,self.field_ids)
return context
class View(models.Model):
"""
Extends the base 'ir.ui.view' model to include a new type of view
called 'grid'.
"""
_inherit = 'ir.ui.view'
type = fields.Selection(selection_add=[('screenview', "ScreenView")])
type = fields.Selection(selection_add=[('trigger_condition_view', "Trigger_Condition_View")])
class IrActionsActWindowView(models.Model):
"""
Extends the base 'ir.actions.act_window.view' model to include
a new view mode called 'grid'.
"""
_inherit = 'ir.actions.act_window.view'
view_mode = fields.Selection(selection_add=[('screenview', "ScreenView")],ondelete={'screenview': 'cascade'})
view_mode = fields.Selection(selection_add=[('trigger_condition_view', "Trigger_Condition_View")],ondelete={'trigger_condition_view': 'cascade'})