# -*- coding: utf-8 -* import ast 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 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 dssSettings(models.Model): _name = "dss.settings" _description = "DigitalSignage Einstellungen" uuid = fields.Char(default=lambda self: self._default_uuid(), required=True, readonly=True, copy=False, string='UUID') def_project_cloudpath = fields.Char('Standard Projekt Pfad') def_project_cloudpath_sample = fields.Char('Projekt Beispiel :',store=True) def_contract_cloudpath = fields.Char('Standard Kunden Pfad') def_contract_cloudpath_sample = fields.Char('Projekt Beispiel :') def_ad_cloudpath = fields.Char('Standard Kampagnen Pfad') def_ad_cloudpath_sample = fields.Char('Kampagnen Beispiel :') tuya_access_id = fields.Char('Tuya Access ID') tuya_access_key = fields.Char('Tuya Access KEY') tuya_endpoint = fields.Char('Tuya Access Endpoint') 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("Default Cloudpath Setzen - MusterProjekt gefunden " + str(parts)) if parts: value = str(parts[0][fels]) else: value = '' _logger.info("Default Cloudpath Setzen - MusterProjekt gefunden " + 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()) class dsscontracts(models.Model): @api.model def _get_default_project(self): _logger.debug("Ermittelte Id aus Context : %s" % (self.env.context.get('active_id'))) ds = self.env['dss.projects'].search([('id','=',self.env.context.get('active_id'))],limit=1) return ds def _default_work_state(self): ds=self.env['dss.workstate'].search([('statusname','=','Neu')],limit=1).id _logger.debug(ds) return ds def _default_work_state_color(self): ds=self.env['dss.workstate'].search([('statusname','=','Neu')],limit=1).color _logger.info(ds) return ds def _default_todo_state(self): ds=self.env['dss.todostate'].search([('statusnr','=','0')],limit=1).id if not ds : ds = 1 _logger.debug(ds) # ds = return ds def _default_get_ads_last_ad(self): _logger.info('finding Standard ad '+self.id) ds = self.env['dss.ads'].search([('contract','=',self.id),('ad_is_lastpos','=',True)],limit=1) if not ds: ds = self.env['dss.ads'].search([('contract','=',self.id)],limit=1) return ds _name = "dss.contracts" _description = "DigitalSignage Vertraege" _rec_name = "contract_auto_name" _inherit = ['mail.thread','mail.activity.mixin'] uuid = fields.Char(default=lambda self: self._default_uuid(), required=True, readonly=True, copy=False, string='UUID') cruuid = fields.Char(related='uuid') contract_id = fields.Char("Kundennummer",store=True,tracking=True) contract_name = fields.Char('Kurzbezeichnung', required=True,tracking=True) contract_state = fields.Many2one('dss.contractstate',group_expand='_read_group_stage_ids',tracking=True) contract_state_order = fields.Integer(related='contract_state.order',store=True) contract_auto_id = fields.Char("Kundennummer",tracking=True,help="Wird berechnet aus Projektnummer + Kunden ID") contract_auto_name = fields.Char('Vertragskennug',tracking=True,help="Wird berechnet aus Kundennummer + Vertragskennung") contract_remark = fields.Html('Vertragshinweise',tracking=True) project = fields.Many2one('dss.projects' , string='Project', store=True,tracking=True) project_id = fields.Integer(related='project.projectid', string='Project ID') projectIid = fields.Integer('Project IID',tracking=True) project_ad_structure = fields.Many2one(related='project.grundsystem_default_adstructure', string='Aufbau') client = fields.Many2one('res.partner',domain="['&',('dsspartner','=',True),('dsspartner_werbung','=',True)]",tracking=True,help="Nur zu Benutzen wenn Kunden als Kontakt angelegt wurde") client_id = fields.Char("Kundenid",tracking=True,help="Nur der 2 stellige letzte Teil der Kundennummer") client_uuid = fields.Char(related="client.dss_uuid") parent_id = fields.Many2one('dss.contracts', string='Parent Task', index=True,tracking=True) client_short_company = fields.Char('Firmenname Kunde',tracking=True) client_short_vorname = fields.Char('Vorname Kunde',tracking=True) client_short_name = fields.Char('Name Kunde',tracking=True) client_short_strasse = fields.Char('Strasse Kunde',tracking=True) client_short_plz = fields.Char('PLZ Kunde',tracking=True) client_short_ort = fields.Char('Ort Kunde',tracking=True) client_short_land = fields.Many2one('res.country','Land Kunde',tracking=True) client_short_email = fields.Char('Email Kunde',tracking=True) client_short_telefon = fields.Char('Telefon Kunde',tracking=True) client_short_mobil = fields.Char('Mobilfunk Kunde',tracking=True) client_short_website = fields.Char('Webseite Kunde',tracking=True) client_other_projects = fields.Many2many('dss.projects',string='Weitere Projekte',tracking=True) werbe_feld_selected = fields.One2many('dss.advertisefields','contract',string='Werbefelder',tracking=True) # need_media = fields.Many2many('dss.mediarelations','mediarelations_contract_rel','contract_id','mediarelations_id',string='benötigte Medien') last_media = fields.One2many('dss.mediarelations','contract',string='Medien',domain="[('isreference','=',False)]") # last_media = fields.Many2many('dss.mediarelations','mediarelations_ad_relations','contract_id','mediarelations_id',string='Medien') need_media = fields.One2many('dss.mediarelations','contract',string='Medien',domain="[('isreference','=',True)]") # need_media_computed = fields.One2many('dss.mediarelations','field',compute='_get_media_list') # need_media_computed = fields.One2many('dss.mediarelations','uuid',domain="[('field','in',werbe_feld_selected)]") main_runtime = fields.Integer('Gesamtlaufzeit',tracking=True) split_runtime_count = fields.Integer('Laufzeit Teilungen',tracking=True) split_runtime_time = fields.Integer('Laufzeit Sekunden',tracking=True) contract_date = fields.Date('Vertragsdatum',tracking=True) start_date = fields.Date('Ausstrahlungsdatum',tracking=True) runtimesystem = fields.Selection([('M','Monatslaufzeit'),('T','Tagelaufzeit'), ('E','Eventlaufzeit'), ('S','Sonderlaufzeit')],tracking=True) runtime_m = fields.Integer('Laufzeit',tracking=True) runtime_t = fields.Integer('Laufzeit',tracking=True) runtime_events = fields.Many2many('dss.eventdays',tracking=True) runtime_divers = fields.Char('Laufzeit',tracking=True) runtime_finish = fields.Date('LaufzeitEnde',tracking=True) paymentsystems = fields.Many2one('dss.paysystems',tracking=True) intern_info_payment_off = fields.Boolean('Keine Zahl-Benachrichtigungen',tracking=True) base_ad = fields.Many2one('dss.ads',tracking=True) ads = fields.One2many('dss.ads','contract',tracking=True) ads_last_ad = fields.Many2one('dss.ads', help="letzte Werbekampagne",computed='_default_get_ads_last_ad',store=True) ads_last_state = fields.Many2one(related='ads_last_ad.ad_state', help="Status des letzten Werbekampagnen Eintrags") ads_last_state_color = fields.Char(related='ads_last_ad.ad_state_color') ads_last_state_text = fields.Char(related='ads_last_ad.ad_state_text') ads_last_work_state = fields.Many2one(related='ads_last_ad.work_state', help="Arbeitsstatus des letzten Werbekampagnen Eintrags") ads_last_work_state_color = fields.Char(related='ads_last_ad.work_state_color') ads_last_work_state_text = fields.Char(related='ads_last_ad.work_state_text') ads_last_todo_state = fields.Many2one(related='ads_last_ad.todo_state', help="Aufgabenstatus des letzten Werbekampagnen Eintrags") ads_last_todo_state_until = fields.Date(related='ads_last_ad.todo_state_until') ads_last_todo_state_color = fields.Char(related='ads_last_ad.todo_state_color') ads_last_todo_state_text = fields.Char(related='ads_last_ad.todo_state_text') vnnox_zugang_erstellt = fields.Boolean('Vnnox Zugang ?',tracking=True) vnnox_zugang_username = fields.Char('Vnnox Username',tracking=True) vnnox_zugang_password = fields.Char('Vnnox Passwort',tracking=True) vnnox_zugang_gesendet = fields.Boolean('Vnnox Zugang gesendet?',tracking=True) xibo_zugang_erstellt = fields.Boolean('Xibo Zugang ?',tracking=True) xibo_zugang_username = fields.Char('Xibo Username',tracking=True) xibo_zugang_password = fields.Char('Xibo Passwort',tracking=True) vnnox_zugang_gesendet = fields.Boolean('Xibo Zugang gesendet?',tracking=True) lmw_zugang_erstellt = fields.Boolean('LMW Zugang ?',tracking=True) lmw_zugang_username = fields.Char('LMW Username',tracking=True) lmw_zugang_password = fields.Char('LMW Passwort',tracking=True) lmw_zugang_gesendet = fields.Boolean('LMW Zugang gesendet?',tracking=True) wflow_korrekturabzug = fields.Boolean('Korekturabzug gesendet ?',tracking=True) wflow_ausstahlung = fields.Boolean('Eingespielt/Ausgestahlt ?',tracking=True) wflow_aenderung = fields.Boolean('Änderung durchgeführt ?',tracking=True) info_account_changes = fields.Boolean('Benachrichtigen bei Accountänderungen',tracking=True) info_spot_changes = fields.Boolean('Benachrichtigen bei Spotänderungen',tracking=True) info_contract_changes = fields.Boolean('Benachrichtigen bei Vertragsänderungen',tracking=True) info_partner_changes = fields.Boolean('Benachrichtigen bei Partneränderungen',tracking=True) info_partner = fields.Many2one('res.partner','Benachrichtigung an : ',tracking=True) # work_state = fields.Many2one('dss.workstate',default=_default_work_state,tracking=True) # work_state_color = fields.Char(related='work_state.color') # work_state_text = fields.Char(related='work_state.statusname') work_state_info = fields.Char('Zusatzinfo',tracking=True) # todo_state = fields.Many2one('dss.todostate',default=_default_todo_state,tracking=True) # todo_state_color = fields.Char(related='todo_state.color') # todo_state_text = fields.Char(related='todo_state.statusname') # todo_state_info = fields.Char('Zusatzinfo',tracking=True) # todo_state_until = fields.Date('Abarbeiten bis',tracking=True) cloudlink = fields.Char('Cloud Verzeichnis',help='Verzeichnis für den Kunde innerhalb des Projekt Ordners') @api.constrains('client_id') def _check_client_id(self) : for record in self : if len(record.client_id) != 2 : _logger.debug("Kundenid muss 2 Stellen haben %s" % (record.client_id)) raise ValidationError(_("KundenID muss 2 Stellen haben")) @api.onchange('client_id') def _onchange_client_id(self): for record in self : if record.contract_name == '' : cname = 'unbekannter Kunden' else: cname = record.contract_name resstr = "%s%s %s" % (record.project_id,record.client_id,cname) cidstr = "%s%s" % (record.project_id,record.client_id) if resstr is None : resstr = 'nicht ermittelbar' _logger.info('Contract_client_id_change : C_' + str(self.id) + ' - '+str(cidstr)+' vs. '+str(self.contract_auto_id)+'/'+str(resstr)+' vs '+str(self.contract_auto_name)); if not self.contract_auto_name: self.contract_auto_name = resstr if not self.contract_auto_id: self.contract_auto_id = cidstr if self.contract_auto_id == "": self.contract_auto_id = cidstr @api.onchange('project_id') def _onchange_project_id(self): for record in self : if record.contract_name == '' : cname = 'unbekannter Kunden' else: cname = record.contract_name resstr = "%s%s %s" % (record.project_id,record.client_id,cname) cidstr = "%s%s" % (record.project_id,record.client_id) if resstr is None : resstr = 'nicht ermittelbar' _logger.info('project_id_change : C_' + str(self.id) + ' - '+str(cidstr)+' vs. '+str(self.contract_auto_id)+'/'+str(resstr)+' vs '+str(self.contract_auto_name)); if not self.contract_auto_name: self.contract_auto_name = resstr if not self.contract_auto_id: self.contract_auto_id = cidstr if self.contract_auto_id == "": self.contract_auto_id = cidstr @api.onchange('contract_name') def _onchange_contract_name(self): for record in self : if record.contract_name == '' : cname = 'unbekannter Kunden' else: cname = record.contract_name resstr = "%s%s %s" % (record.project_id,record.client_id,cname) cidstr = "%s%s" % (record.project_id, record.client_id) if resstr is None : resstr = 'nicht ermittelbar' _logger.info('Contract_Name_Change : C_' + str(self.id) + ' - '+str(cidstr)+' vs. '+str(self.contract_auto_id)+'/'+str(resstr)+' vs '+str(self.contract_auto_name)); if not self.contract_auto_name: self.contract_auto_name = resstr if not self.contract_auto_id: self.contract_auto_id = cidstr if self.contract_auto_id == "": self.contract_auto_id = cidstr @api.onchange('contract_auto_id') def _onchange_contract_auto_id(self): for record in self : if record.contract_name == '' : cname = 'unbekannter Kunden' else: cname = record.contract_name resstr = "%s%s %s" % (record.project_id,record.client_id,cname) cidstr = "%s%s" % (record.project_id, record.client_id) if resstr is None: resstr = 'nicht ermittelbar' _logger.info('Contract_auto_id_change : C_' + str(self.id) + ' - '+str(cidstr)+' vs. '+str(self.contract_auto_id)+'/'+str(resstr)+' vs '+str(self.contract_auto_name)); if not self.contract_auto_name: self.contract_auto_name = resstr if not self.contract_auto_id: self.contract_auto_id = cidstr if self.contract_auto_id == "": self.contract_auto_id = cidstr # @api.model # def create(self,vals): # vals['projectid'] = self.env.context.get('active_id') # project = self.env('dss.projects').search(['id','=',vals['projectid']]) # vals['project'] = project('projektname'); # contract=super().create(vals) # return contract @api.model def _default_uuid(self): return str(uuid.uuid4()) @api.model def _getdefwscolor(self): return str('#ffffff') @api.model def _default_client_id(self): return str("00") @api.model def _read_group_stage_ids(self,stages,domain,order): contract_state_ids = self.env['dss.contractstate'].search([],order='order') return contract_state_ids @api.model def pyaction_dss_contract_make_partner(self): action = self.env['ir.actions.act_window'].with_context({'default_contractid': self.id})._for_xml_id('DigitalSignage.act_dss_project_view_contract') action['display_name'] = self.contract_name # action['domain'] = '[["projectid","=","4"]]' # context = action['context'].replace('', str(self.id)) # context = ast.literal_eval(context) # context.update({ # 'create': self.active, # 'active_test': self.active # }) # action['context'] = context return action def tokampagne(self): _logger.info('Click auf Werbekampagne : C_'+str(self.id)+' - prüfe Letzte Aktuelle Kampagne') # action = self.env['ir.actions.act_window'].with_context({'default_contractid': self.id})._for_xml_id('DigitalSignage.action_dss_ads_view') # context = action['context'] ds = self.env['dss.ads'].search([('contract','=',self.id),('ad_is_lastpos','=',True)],limit=1) if not ds: _logger.info('Click auf Werbekampagne : C_'+str(self.id)+' - keine letzte Kampagne') ds = self.env['dss.ads'].search([('contract','=',self.id)],limit=1) else: _logger.info('Click auf Werbekampagne : C_'+str(self.id)+'A_'+str(ds.id)+' - Kampagne gefunden ') self.ads_last_ad = ds # prüfen ob Contract_autoname resstr = '' if not self.contract_auto_name: _logger.info('Click auf Werbekampagne : C_'+str(self.id)+'A_'+str(ds.id)+' - Kein Contract_autoname ') if self.contract_name == '': cname = 'unbekannter Kunden' else: cname = self.contract_name resstr = "%s%s %s" % (self.project_id, self.client_id, cname) if not resstr: resstr = 'nicht ermittelbar' _logger.debug(resstr) self.contract_auto_name = resstr _logger.info('Click auf Werbekampagne : C_' + str(self.id) + 'A_' + str(ds.id) + ' - Contract_autoname gesetzt '+ str(resstr)+'/'+str(cidstr)) # prüfen ob LetzteKampagne medien hat _logger.info('Click auf Werbekampagne : C_'+str(self.id)+'A_'+str(ds.id)+' - Suche evtl Medien der Kampagne ') medias = self.env['dss.mediarelations'].search(['&',('contract','=',self.id),('ad','=',ds.id)]) if medias: _logger.info('Click auf Werbekampagne : C_'+str(self.id)+'A_'+str(ds.id)+' - Medien gefunden '+str(medias.ids)) self.write({'last_media': [(6,0,medias.ids)]}) else: _logger.info('Click auf Werbekampagne : C_'+str(self.id)+'A_'+str(ds.id)+' - Keine Medien gefunden ') # Medien erzeugen wenn nicht vorhanden _logger.info('Click auf Werbekampagne : C_'+str(self.id)+' Suche Kampagne allgemein ') kampagne=self.env['dss.ads'].search([('contract','=',self.id)],limit=1) if not kampagne: _logger.info('Click auf Werbekampagne : C_'+str(self.id)+' kein kampagne') defadstate = self.env['dss.adstate'].search([('func','=','STD')],limit=1) if not defadstate : _logger.info('Click auf Werbekampagne : C_'+str(self.id)+' kein defstate') defadstateid = 1 else: defadstateid = defadstate.id kampagne = self.env['dss.ads'].create({'contract': self.id, 'project': self.project.id, 'adname': 'WK '+self.contract_auto_name,'adtype':'MAIN','ad_state':defadstateid}) self.ads_last_ad = kampagne.id _logger.info('Click auf Werbekampagne : C_'+str(self.id)+' Kampagne erstellt A_'+str(kampagne.id)) kampagne.parent_ad = kampagne.id mediaids = [] if not self.werbe_feld_selected: _logger.info('Prüfe Medien : C_' + str(self.id) + 'A_' + str( kamp.id) + ' Keine Felder im Vertrag') raise ValidationError(_("Vertrag hat keine Felder ! Kampagnen benötigen Felder - auch virtuelle")) else: for feld in self.werbe_feld_selected: if not feld: _logger.info('Prüfe Medien : C_' + str(self.id) + 'A_' + str( kamp.id) + ' Keine Felder im Vertrag') raise ValidationError(_("Vertrag hat keine Felder ! Kampagnen benötigen Felder - auch virtuelle")) else: for media in feld.mediastructure.medias: if not media: _logger.info('Prüfe Medien : C_'+str(self.id)+'K_'+str(kampagne.id)+' Kein Medium in MedienStructur von F_'+str(feld.id)+'M_'+str(media.id)) else: newmedia=self.env['dss.mediarelations'].create({'field':feld.id,'contract':self.id,'project':self.project.id,'field_uuid':feld.uuid,'ad':kampagne.id, 'relname': media.medianame, 'mediatype': media.id}) _logger.info('Prüfe Medien : C_'+str(self.id)+'K_'+str(kampagne.id)+' setze Vertrag für Medium : '+str(newmedia.contract)+'/'+str(newmedia.ad)) mediaids.append(newmedia.id) kampagne.write({'need_media': [(6,0,mediaids)]}) _logger.info('Click auf Werbekampagne : C_'+str(self.id)+'/'+str(kampagne.id)+' setze Media '+str(kampagne.need_media)) else: _logger.info('Click auf Werbekampagne : C_'+str(self.id)+' mind. 1 Kampagne vorhanden A_'+str(kampagne.id)) kampagnen=self.env['dss.ads'].search([('contract','=',self.id)]) _logger.info('Prüfe Medien : C_'+str(self.id)+' alle Kamp : '+str(kampagnen)) for kamp in kampagnen: _logger.info('Prüfe Medien : C_'+str(self.id)+'A_'+str(kamp.id)) if kamp: mediaids = [] medias = self.env['dss.mediarelations'].search([('ad','=',kamp.id)]) if not medias: _logger.info('Prüfe Medien : C_'+str(self.id)+'A_'+str(kamp.id)+' keine Medien gefunden !') if not self.werbe_feld_selected: _logger.info('Prüfe Medien : C_' + str(self.id) + 'A_' + str( kamp.id) + ' Keine Felder im Vertrag') raise ValidationError( _("Vertrag hat keine Felder ! Kampagnen benötigen Felder - auch virtuelle")) else: for feld in self.werbe_feld_selected: if not feld: _logger.info('Prüfe Medien : C_' + str(self.id) + 'A_' + str( kamp.id) + ' Keine Felder im Vertrag') raise ValidationError(_("Vertrag hat keine Felder ! Kampagnen benötigen Felder - auch virtuelle")) else: for media in feld.mediastructure.medias: if not media: _logger.info('Prüfe Medien : C_'+str(self.id)+'A_'+str(kamp.id)+' Kein Medium in der Struktur F_'+str(feld.id)+'M_'+str(feld.mediastructure.id)) else: newmedi = self.env['dss.mediarelations'].create( { 'field': feld.id, 'contract': self.id, 'project': self.project.id, 'field_uuid': feld.uuid, 'ad': kamp.id, 'relname':media.medianame,'mediatype':media.id}) _logger.info('Prüfe Medien : C_'+str(self.id)+'A_'+str(kamp.id)+' Erstelle Medium : M_'+str(media.id)+' -> '+str(newmedi.id)) _logger.info('Prüfe Medien : C_'+str(self.id)+'A_'+str(kamp.id)+' Medien evtl erstellt ! ') medias = self.env['dss.mediarelations'].search([('ad','=',kamp.id)]) _logger.info('Click auf Werbekampagne : C_'+str(self.id)+'A_'+str(kamp.id)+' neue Media '+str(mediaids)) kamp.write({'need_media': [(6,0,medias.ids)]}) # self.write({'need_media': [(5,0,0)]}) # _logger.info('Click auf Werbekampagne : C_'+str(self.id)+'K_'+str(kamp.id)+' setze Media '+str(kamp.need_media)) else: _logger.info('Prüfe Medien : C_'+str(self.id)+'A_'+str(kamp.id)+' Medien gefunden !') if not self.werbe_feld_selected: _logger.info('Prüfe Medien : C_' + str(self.id) + 'A_' + str( kamp.id) + ' Keine Felder im Vertrag') raise ValidationError( _("Vertrag hat keine Felder ! Kampagnen benötigen Felder - auch virtuelle")) else: for feld in self.werbe_feld_selected: _logger.info('Prüfe Medien : C_' + str(self.id) + 'A_' + str(kamp.id)+'F_'+str(feld.id)) if not feld: _logger.info('Prüfe Medien : C_' + str(self.id) + 'A_' + str( kamp.id) + ' Keine Felder im Vertrag') raise ValidationError(_("Vertrag hat keine Felder ! Kampagnen benötigen Felder - auch virtuelle")) else: for media in feld.mediastructure.medias: if not media: _logger.info('Prüfe Medien : C_' + str(self.id) + 'A_' + str( kamp.id) + ' Kein Medium in der Struktur F_' + str(feld.id) + 'M_' + str( feld.mediastructure.id)) else: _logger.info('Prüfe Medien : C_' + str(self.id) + 'A_' + str(kamp.id) + 'F_' + str( feld.id) + 'M_' + str(media.id)) existmedia = self.env['dss.mediarelations'].search(['&',('ad','=',kamp.id),('mediatype','=',media.id),('field','=',feld.id)]) if not existmedia: newmedi = self.env['dss.mediarelations'].create( {'field': feld.id, 'contract': self.id, 'project': self.project.id, 'field_uuid': feld.uuid, 'ad': kamp.id, 'relname': media.medianame, 'mediatype': media.id}) _logger.info('Prüfe Medien : C_' + str(self.id) + 'A_' + str( kamp.id) + ' Erstelle Medium : M_' + str(media.id) + ' -> ' + str( newmedi.id)) # mediaids.append(medias.ids) _logger.info('Click auf Werbekampagne : C_'+str(self.id)+'A_'+str(kamp.id)+' gefundene Media '+str(mediaids)) kampagne=self.env['dss.ads'].browse(kamp.id) _logger.info('Click auf Werbekampagne : C_'+str(self.id)+'A_'+str(kamp.id)+' gefundene Media '+str(mediaids)+' Kampagne '+str(kampagne)) if kampagne.need_media != medias: _logger.info('Click auf Werbekampagne : C_'+str(self.id)+'A_'+str(kamp.id)+' Media unterschiede - setze Media '+str(mediaids)+'/'+str(kampagne.need_media)) else: _logger.info('Click auf Werbekampagne : C_'+str(self.id)+'A_'+str(kamp.id)+' Media gleich '+str(kampagne.need_media)) else: _logger.info('Prüfe Medien : C_'+str(self.id)+'A_'+str(kamp.id)+' Keine Kampagne gefunden !') # _logger.info('Click auf Werbekampagne : '+str(self.id)+' 4 '+str(kampagne.id)) return { 'type': 'ir.actions.act_window', 'view_type':'form', 'view_mode':'form,tree', 'res_model':'dss.ads', 'target':'current', 'context':'{"kampagne_id":'+str(kampagne.id)+',"show_project_update":True}', 'context':'', 'res_id':kampagne.id, 'display_name' : 'Änderung zur Werbekampagne '+kampagne.parent_ad.adname, 'domain':'[("id","=","context[kampagne_id]")]' } def setFirstKampagne(self): for record in self: if record.contract_auto_id: record.tokampagne() def setTreeStandardValues(self): for record in self: if record.contract_name == '': cname = 'unbekannter Kunden' else: cname = record.contract_name resstr = "%s%s %s" % (record.project_id, record.client_id, cname) cidstr = "%s%s" % (record.project_id, record.client_id) if resstr is None: resstr = 'nicht ermittelbar' _logger.info('Set Standard Values : C_' + str(record.id) + ' - ' + str(cidstr) + ' vs. ' + str( record.contract_auto_id) + '/' + str(resstr) + ' vs ' + str(record.contract_auto_name)); if not record.contract_auto_name: record.contract_auto_name = resstr if not record.contract_auto_id: record.contract_auto_id = cidstr if record.contract_auto_id == "": record.contract_auto_id = cidstr def setStandardValues(self): for record in self: if record.contract_name == '': cname = 'unbekannter Kunden' else: cname = record.contract_name resstr = "%s%s %s" % (record.project_id, record.client_id, cname) cidstr = "%s%s" % (record.project_id, record.client_id) if resstr is None: resstr = 'nicht ermittelbar' _logger.info('Set Standard Values : C_' + str(self.id) + ' - ' + str(cidstr) + ' vs. ' + str( self.contract_auto_id) + '/' + str(resstr) + ' vs ' + str(self.contract_auto_name)); if not self.contract_auto_name: self.contract_auto_name = resstr if not self.contract_auto_id: self.contract_auto_id = cidstr if self.contract_auto_id == "": self.contract_auto_id = cidstr def pyaction_view_contract(self): view = self.env.ref('DigitalSignage.dss_main_contracts_form') _logger.debug('Click auf Vertrag : '+str(self.id)) return { 'type': 'ir.actions.act_window', 'view_mode': 'form' , 'view_id': view.id, 'res_model': 'dss.contracts' , 'target': 'current' , 'display_name' : self.contract_name, 'views':[(view.id,'form')], 'res_id': self.id , } def pyaction_new_contract_kanban(self): action = self.env['ir.actions.act_window'].with_context({'default_contractid': self.id})._for_xml_id('DigitalSignage.action_dss_project_new_contract_kanban') action['display_name'] = self.contract_name # action['domain'] = '[["projectid","=","4"]]' # context = action['context'].replace('', str(self.id)) # context = ast.literal_eval(context) # context.update({ # 'create': self.active, # 'active_test': self.active # }) # action['context'] = context return action def pyaction_dss_project_make_contract(self): action = self.env['ir.actions.act_window'].with_context({'default_projectid': self.id})._for_xml_id('DigitalSignage.action_dss_project_view_contract') return action class dssprojects(models.Model): _name = "dss.projects" _description = "DigitalSignage Projekte" _rec_name = "projektname" _inherit = ['mail.thread','mail.activity.mixin'] 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) systemname = fields.Many2one('dss.systems',tracking=True) grundsystemname = fields.Many2one('dss.systemtypen',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') 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 Long des Projektes',tracking=True) standort_lati = fields.Char('Standort Lat des Projektes',tracking=True) standort_visible = fields.Boolean('Auf Projekt-Karte sichtbar',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) 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) errichtet_am = fields.Datetime('Errichtungstag',tracking=True) standort_inout = fields.Selection([('indoor','im Gebäude'), ('outdoor','Aussenbereich'), ('semiindoor','Überdachter Aussenbereich'),('Divers','Andere Art')],tracking=True); cloudlink = fields.Char('Cloud Verzeichnis',help='Verzeichnis für das Project innerhalb des Cloud Struktur') @api.model def _default_uuid(self): return str(uuid.uuid4()) 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', '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)+')]' } # context = ast.literal_eval(context) # context = "{ # 'create': self.active, # 'active_test': self.active # } # 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 = 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 class dssgeraetetypen(models.Model): _name = "dss.geraetetypen" _description = "DigitalSignage Geraetetypen" _inherit = ['mail.thread','mail.activity.mixin'] _rec_name = "geraetename" geraetename = fields.Char('Geraetename', required=True) uuid = fields.Char(default=lambda self: self._default_uuid(), required=True, readonly=True, copy=False, string='UUID') geraetetyp = fields.Selection([('SYS','Systemgerät'), ('STE','Steuergerät'), ('DIV','Anderes'), ('ANZ','Anzeigegerät'), ('PLY','Abspielgerät')],tracking=True) # grundsystem = fields.Many2one('dss.systemtypen', string="Gerät ist nutzbar für",tracking=True) grundsystem = fields.Many2many('dss.systemtypen', string="Gerät ist nutzbar für",tracking=True) grundsystem_kennung = fields.Char(string='Kennung', related='grundsystem.kennung',tracking=True) standort = fields.Char('Hauptstandort des Gerätes',tracking=True) farbe = fields.Char('Grundfarbe',tracking=True) has_heizung = fields.Boolean('Mit Heizsystem',tracking=True) has_klima = fields.Boolean('Mit Klimasystem',tracking=True) has_fan = fields.Boolean('Mit Ventiltorensystem',tracking=True) has_tuya = fields.Boolean('Mit Tuyasteuerung',tracking=True) stromzaehler = fields.Many2one('dss.geraetetypen',tracking=True) stromverbrauch_avg = fields.Integer('Stromverbrauch AVG in W',tracking=True) osvorhanden = fields.Boolean('Mit Betriebssystem',tracking=True) osname = fields.Char('Betriebssystem',tracking=True) ostyp = fields.Selection([('Win','Windows'), ('Lin','Linux'), ('And','Android'),('Ras','Raspberry PI'),('Non','Keines bekannt'),('Div','Anderes')],tracking=True); lcd_ausrichtung = fields.Selection([('quer','Horizontal/Querformat'), ('hoch','Vertikal/Hochformat'),('Divers','Andere Art')],'LCD Ausrichtung',tracking=True); lcd_touch = fields.Boolean('Touchsystem',tracking=True) lcd_montage = fields.Selection([('WAN','Wandmontage'), ('FUS','Standfuss rollbar'), ('FI1','Boden verankert 1 Fuss'),('FI2','Boden verankert 2 Füsse'),('FIX','Bodenverankert Blockfuss'),('XXX','Sonstige')],'Montage/Befestigung',tracking=True); lcd_montage_sonstige = fields.Char('Sonstige Montageart',tracking=True) lcd_size = fields.Selection([('42','42 Zoll'), ('55','55 Zoll'), ('65','65 Zoll'),('75','75 Zoll'),('10','10.x Zoll'),('00','Sonstige')],'LCD Größe',tracking=True); lcd_size_sonstige = fields.Char('LCD Sondergröße',tracking=True) led_geraetetyp = fields.Selection([('MOD','LED Modul'),('NET','Netzgerät'), ('REC','Receiving Karte'), ('STE','Steuerkarte'),('LFT','Lüftertyp')],tracking=True) led_module_pixelpitch = fields.Float('Modulpixelpitch',tracking=True) led_module_breite = fields.Integer('Modulbreite mm',tracking=True) led_module_hoehe = fields.Integer('Modulhoehe mm',tracking=True) led_module_pixel_breite = fields.Integer('Modulbreite px',tracking=True) led_module_pixel_hoehe = fields.Integer('Modulhoehe px',tracking=True) led_module_system = fields.Selection([('FIX1','Fix Verschraubt'), ('MAG1','Magnetisch haltend'), ('RIG1','Imbus Veriegelt (vorn)'),('SONS','Sonstige')],'Modul Montage/Befestigung',tracking=True); led_module_system_sonstige = fields.Char('Modulbefestigung Sonstige',tracking=True) led_module_kennung = fields.Char('Modulbezeichnung',tracking=True) led_module_serial = fields.Char('Modulseriennummer',tracking=True) led_module_vendor = fields.Many2one('res.partner','Modul Hersteller',tracking=True) led_receivingcard_vendor = fields.Many2one('res.partner','Receivingcard Hersteller') led_receivingcard_kennung = fields.Char('Receivingcardtyp') led_netzteil_typ = fields.Selection([('SNT','Schaltnetzteil'), ('STN','Steckernetzteil'), ('HNT','Hutschienennetzteil'),('INT','Internes Netzteil')],'Netzteil Bauart',tracking=True); led_netzteil_vendor = fields.Many2one('res.partner','Netzteil Hersteller',tracking=True) led_netzteil_kennung = fields.Char('Netzteilkennung',tracking=True) led_netzteil_spannung = fields.Char('Netzteil Spannung V',tracking=True) led_netzteil_leistung = fields.Char('Netzteil Leistung W',tracking=True) lcd_montage = fields.Selection([('WAN','Wandmontage'), ('FUS','Standfuss rollbar'), ('FI1','Boden verankert 1 Fuss'),('FI2','Boden verankert 2 Füsse'),('FIX','Bodenverankert Blockfuss'),('XXX','Sonstige')],'Montage/Befestigung',tracking=True); lcd_montage_sonstige = fields.Char('Sonstige Montageart',tracking=True) hw_anzeige = fields.Many2one('dss.geraetetypen',domain="[('geraetetyp','=','ANZ')]",tracking=True) hw_steuerung = fields.Many2one('dss.geraetetypen',domain="['&',('geraetetyp','=','STE'),('grundsystem_kennung','=','LED')]",tracking=True) hw_player = fields.Many2one('dss.geraetetypen',domain="[('geraetetyp','=','PLY')]",tracking=True) hw_umwelt = fields.Many2one('dss.geraetetypen',domain="['|',('geraetetyp','=','SYS'),('geraetetyp','=','DIV')]",tracking=True) zusatz_integrationen = fields.Many2one('dss.geraetetypen',tracking=True) zusatz_zubehoer = fields.Char('Sonstiges Zubehör',tracking=True) tuya_Geraete_uid = fields.Char('Tuya Geräte UID',tracking=True) tuya_Geraete_id = fields.Char('Tuya Geräte ID', tracking=True) tuya_can_switch = fields.Boolean('Tuya mit Schalter',tracking=True) tuya_has_powervalue = fields.Boolean('Tuya mit Stromzähler',tracking=True) tuya_last_totalpower = fields.Char('Stromzähler Gesamt',tracking=True,readonly=True) tuya_last_lastpower = fields.Char('Stromzähler Aktuell',tracking=True,readonly=True) tuya_last_switchstate = fields.Char('Schalter Aktuell ',tracking=True,readonly=True) @api.model def _default_uuid(self): return str(uuid.uuid4()) @api.depends('grundsystem') def _compute_grundsystem_kennung(self): for syst in self: if syst.grundsystem: syst.grundsystem_kennung = syst.grundsystem.kennung def get_value_from_tuyaresult(self,dataset,valuename): result='' _logger.info('Resultanfrage:' + str(dataset)+' Feld : '+str(valuename)) for singlepart in dataset: if singlepart: if (singlepart['code'] == valuename): result = singlepart['value'] break return result def pyaction_tuya_readout(self): _logger.info('Tuya Schaltanfrage : Endpoint - ' + str(dssSettings._get_settingvalue(self,'tuya_endpoint')) + ' AccessID ' + str(dssSettings._get_settingvalue(self,'tuya_access_id')) + ' AccessKEY ' + str(dssSettings._get_settingvalue(self,'tuya_access_key'))) openapi = TuyaOpenAPI(dssSettings._get_settingvalue(self,'tuya_endpoint'),dssSettings._get_settingvalue(self,'tuya_access_id'),dssSettings._get_settingvalue(self,'tuya_access_key')) openapi.connect() switchcode = eval('True') commands = {'commands':[{'code':'switch','value': switchcode}]} # result = openapi.post('/v1.0/iot-03/devices/{}/commands'.format(self.tuya_Geraete_id),commands) result = openapi.get('/v1.0/iot-03/devices/{}/status'.format(self.tuya_Geraete_id)) _logger.info('Erfolg ? :' + str(result['success'])) success = result['success'] if success: _logger.info('Erfolgreiche Anfrage :' + str(result['result'])) if self.tuya_has_powervalue: self.tuya_last_totalpower = self.get_value_from_tuyaresult(result['result'],'forward_energy_total') self.tuya_last_lastpower = self.get_value_from_tuyaresult(result['result'],'phase_a') if self.tuya_can_switch: self.tuya_last_switchstate = self.get_value_from_tuyaresult(result['result'],'switch') else: _logger.info('Fehlerhafte Anfrage :' + str(result['msg'])) def pyaction_tuya_switch(self): _logger.info('Tuya Schaltanfrage : Endpoint - ' + str( dssSettings._get_settingvalue(self, 'tuya_endpoint')) + ' AccessID ' + str( dssSettings._get_settingvalue(self, 'tuya_access_id')) + ' AccessKEY ' + str( dssSettings._get_settingvalue(self, 'tuya_access_key'))) openapi = TuyaOpenAPI(dssSettings._get_settingvalue(self, 'tuya_endpoint'), dssSettings._get_settingvalue(self, 'tuya_access_id'), dssSettings._get_settingvalue(self, 'tuya_access_key')) openapi.connect() commands = {'commands': [{'code': 'switch', 'value': not self.tuya_last_switchstate}]} # result = openapi.post('/v1.0/iot-03/devices/{}/commands'.format(self.tuya_Geraete_id),commands) result = openapi.post('/v1.0/iot-03/devices/{}/commands'.format(self.tuya_Geraete_id),commands) _logger.info('Erfolg ? :' + str(result['success'])) success = result['success'] if success: _logger.info('Erfolgreiche Anfrage :' + str(result['result'])) self.pyaction_tuya_readout() else: _logger.info('Fehlerhafte Anfrage :' + str(result['msg'])) class dsssystemtypen(models.Model): _name = "dss.systemtypen" _inherit = ['mail.thread'] _description = "DigitalSignage Systemtypen" _rec_name = "systemname" uuid = fields.Char(default=lambda self: self._default_uuid(), required=True, readonly=True, copy=False, string='UUID') systemname = fields.Char('Systemname', required=True) kennung = fields.Char('Kurzkennung', required=True) farbe = fields.Char('Grundfarbe') icon = fields.Image() icon_5050 = fields.Image("Icon 50",compute='_compute_icon_5050') default_adstructure = fields.Many2one('dss.adstructures',String='Standard-Werbeaufbau') default_cloud_path = fields.Char('Standard Cloud Path') @api.model def _default_uuid(self): return str(uuid.uuid4()) @api.depends('icon') def _compute_icon_5050(self): for rec in self: if rec.icon != False: _logger.info('compute 50x50 icon for '+rec.uuid) # rec.mediafile_preview = self._generate_preview_from_binary(base64.decodebytes(rec.mediafile)) # rec.icon_5050 = tools.image_resize_image(rec.icon,size=(50,50),avoid_if_small=True) rec.icon_5050 = rec.icon # 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.icon_5050 = rec.icon return class dsssoftware(models.Model): _name = "dss.software" _description = "Softwaresysteme" _inherit = ['mail.thread','mail.activity.mixin'] _rec_name = "softwarename" # _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) softwarename = fields.Char('Softwarename', required=True) version = fields.Char('Version') hersteller = fields.Char('Hersteller') @api.model def _default_uuid(self): return str(uuid.uuid4()) class dsssystems(models.Model): _name = "dss.systems" _description = "DigitalSignage Systemtypen" _inherit = ['mail.thread','mail.activity.mixin'] _rec_name = "systemname" # _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) systemname = fields.Char('Systemname', required=True) grundsystem = fields.Many2one('dss.systemtypen', string="Gerät ist nutzbar für") grundsystem_kennung = fields.Char(string='Kennung', related='grundsystem.kennung') standort = fields.Char('Hauptstandort des Systems',tracking=True) farbe = fields.Integer('Grundfarbe') has_heizung = fields.Boolean('Mit Heizsystem') has_klima = fields.Boolean('Mit Klimasystem') has_fan = fields.Boolean('Mit Ventiltorensystem') stromzaehler = fields.Many2one('dss.geraetetypen') stromverbrauch_avg = fields.Integer('Stromverbrauch AVG in W') osvorhanden = fields.Boolean('Mit Betriebssystem') osname = fields.Char('Betriebssystem') ostyp = fields.Selection([('Win','Windows'), ('Lin','Linux'), ('And','Android'),('Ras','Raspberry PI'),('Non','Keines bekannt'),('Div','Anderes')]); lcd_ausrichtung = fields.Selection([('quer','Horizontal/Querformat'), ('hoch','Vertikal/Hochformat'),('Divers','Andere Art')],'LCD Ausrichtung'); lcd_touch = fields.Boolean('Touchsystem') lcd_montage = fields.Selection([('WAN','Wandmontage'), ('FUS','Standfuss rollbar'), ('FI1','Boden verankert 1 Fuss'),('FI2','Boden verankert 2 Füsse'),('FIX','Bodenverankert Blockfuss'),('XXX','Sonstige')],'Montage/Befestigung'); lcd_montage_sonstige = fields.Char('Sonstige Montageart') lcd_panel = fields.Many2one('dss.geraetetypen',domain="['&',('grundsystem_kennung','=','LCD'),('led_geraetetyp','=','ANZ')]") lcd_mainboard = fields.Many2one('dss.geraetetypen',domain="['&',('grundsystem_kennung','=','LCD'),('led_geraetetyp','=','STE')]") lcd_touchcontroler = fields.Many2one('dss.geraetetypen',domain="['&',('grundsystem_kennung','=','LCD'),('led_geraetetyp','=','SYS')]") lcd_netzteil = fields.Many2one('dss.geraetetypen',domain="['&',('grundsystem_kennung','=','LCD'),('led_geraetetyp','=','NET')]") led_pixelpitch = fields.Char('Pixelabstand') led_breite = fields.Integer('LED Breite mm') led_hoehe = fields.Integer('LED Hoehe mm') led_pixel_breite = fields.Integer('LED Breite px') led_pixel_hoehe = fields.Integer('LED Hoehe px') led_receivingcard = fields.Many2one('dss.geraetetypen',domain="['&',('grundsystem_kennung','=','LED'),('led_geraetetyp','=','REC')]") led_netzteile = fields.Many2one('dss.geraetetypen',domain="['&',('grundsystem_kennung','=','LED'),('led_geraetetyp','=','NET')]") led_module = fields.Many2one('dss.geraetetypen',domain="['&',('grundsystem_kennung','=','LED'),('led_geraetetyp','=','MOD')]") led_montage = fields.Selection([('WAN','Wandmontage'), ('FUS','1 standFuss zentral'), ('FU2','2 Standfüsse Aussen'),('FU3','1 Standfuss dezentral'),('MO1','manuell Mobil bewegbar'),('MO2','Mobil bewegbar Container'),('XXX','Sonstige')],'Montage/Befestigung'); led_montage_sonstige = fields.Char('Sonstige Montageart') zusatz_integrationen = fields.Many2many('dss.geraetetypen') @api.model def _default_uuid(self): return str(uuid.uuid4()) 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 dsseventdays(models.Model): _name = "dss.eventdays" _description = "DigitalSignage EventSpieltage" _inherit = ['mail.thread','mail.activity.mixin'] _rec_name = "eventname" # _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) eventname = fields.Char('Eventname', required=True) description = fields.Text('EventBeschreibung') eventstartdate = fields.Datetime('EventDatum', required=True) eventenddate = fields.Datetime('EventDatum', required=True) color = fields.Char(string='Color Index') username = fields.Many2one('res.users',string="Kalendercontact") calendarevent = fields.Many2one('calendar.event') @api.model def _default_uuid(self): return str(uuid.uuid4()) @api.model def create(self,vals): result = super().create(vals) return result def pydocalendarEntry(self): event = { 'start': self.eventstartdate.strftime('%Y-%m-%d %H:%M:%S'), 'stop': self.eventenddate.strftime('%Y-%m-%d %H:%M:%S'), 'duration': 24, 'allday': False, 'partner_ids': (4,self.username.partner_id.id), 'name': self.eventname, 'description': self.description, 'user_id': self.username.id, } _logger.debug('linking new event ' + str(event) + ' ' + str(self.uuid)) self.calendarevent=self.env['calendar.event'].create(event) 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 dssadvertisefields(models.Model): @api.model def create(self,vals): result = super().create(vals) result.issaved = True return result _name = "dss.advertisefields" _description = "DigitalSignage Werbefelder" _inherit = ['mail.thread','mail.activity.mixin'] _rec_name = "auto_feldname" # _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') issaved = fields.Boolean('ist gespeichert') # uuid = fields.Char('UUID', required=True, translate=True) auto_feldname = fields.Char('Projekt_Feldname', required=True) display = fields.Char('Designname') feldname = fields.Char('Feldname', required=True) project = fields.Many2one('dss.projects' , string='Project', store=True) project_id = fields.Integer(related='project.projectid', string='Project ID') contract = fields.Many2one('dss.contracts' , string='Vertrag', store=True) contract_project_id = fields.Integer(related='contract.project_id', string='Project ID') color_used = fields.Char(string='Color Index') color_unused = fields.Char(string='Color Index') mediastructure = fields.Many2one('dss.adstructures',string='Feldaufbau',tracking=True) mediastructure_medias = fields.Many2many(related='mediastructure.medias',string='Inhalt') mediarelations = fields.One2many('dss.mediarelations','relname',tracking=True) def _default_create_date(self): return str(date.today()) def _default_create_user(self): self.issaved = True return str(self.env.user.name) @api.onchange('project') def _onchange_project(self): autoid = "" autoid = str(self.project_id)+"_"+str(self.feldname) self.auto_feldname =autoid @api.onchange('contract') def _onchange_contract(self): autoid = "" _logger.info('Contract Änderung prüfe Projekte !' + str(self.project_id) + ' / ' + str(self.contract_project_id)) if not self.project_id == self.contract_project_id: _logger.info('Contract Änderung unterschiedliche Projekte !'+str(self.project_id)+' / '+str(self.contract_project_id)) raise ValidationError(_("Gewähltes Projekt und Projekt des Vertrages sind unterschiedlich !")) else: autoid = str(self.project_id)+"_"+str(self.feldname) self.auto_feldname =autoid @api.onchange('mediastructure') def _onchange_mediastructure_id(self): restr = 'keine' for record in self : resstr = record.mediastructure.uuid mtyp = self.env['dss.adstructures'].search([("uuid","=",str(record.mediastructure.uuid))]) _logger.info(resstr) if mtyp: resstr = mtyp.structurename _logger.info(resstr + ' uuid : '+record.mediastructure.uuid) foundused = self.env['dss.mediarelations'].search_count(["&",('field_uuid','=',record.uuid),'|',('secured_ro','=',True),('used_ro','=',True)]) if foundused != 0 : _logger.info('change - Canceled !') raise ValidationError(_("Datensatz kann nicht gewechselt werden ! Es sind benutzt Medien in der Kampagne ! Bitte erst diese freigeben !")) self.date_lastedit = str(date.today()) self.mediastructure = mtyp @api.model def _default_uuid(self): return str(uuid.uuid4()) 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.Many2one(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 dsscontractads(models.Model): def _default_work_state(self): ds=self.env['dss.workstate'].search([('statusname','=','Neu')],limit=1).id _logger.debug(ds) return ds def _default_work_state_color(self): ds=self.env['dss.workstate'].search([('statusname','=','Neu')],limit=1).color _logger.info(ds) return ds def _default_todo_state(self): ds=self.env['dss.todostate'].search([('statusnr','=','0')],limit=1).id if not ds : ds = 1 _logger.debug(ds) # ds = return ds @api.model def create(self,vals): result = super().create(vals) resstr = result.uuid _logger.info(resstr) for n_record in result: resstr = n_record.uuid _logger.info(resstr) n_record.date_create = date.today() n_record.user_create = self.env.user.name allads = n_record.contract.ads _logger.info(allads) if allads != False: for ad in allads: ad.ad_is_lastpos = False n_record.ad_is_lastpos = True contract = n_record.contract contract.ads_last_ad = n_record return result # @api.depends('need_media') # def _getmedialist(self): # mlist = [] # mlist = self.env['dss.mediarelations'].search([('ad','=',self.id)]) # if mlist != False: # _logger.info('AD Need_Medias A_'+str(self)+' - Computed Medias '+str(mlist)) # self.need_media = mlist.ids # else: # self.need_media = False _name = "dss.ads" _description = "DigitalSignage Werbekampagnen Phasen" # _inherit = ['mail.thread','mail.activity.mixin'] _inherit = ['mail.activity.mixin'] #'mail.thread','mail.activity.mixin' _rec_name = "adname" # _inherit = ['mail.thread', 'mail.activity.mixin'] uuid = fields.Char(default=lambda self: self._default_uuid(), required=True, readonly=True, copy=False, string='UUID') aduuid = fields.Char(related='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') # uuid = fields.Char('UUID', required=True, translate=True) adname = fields.Char('Kampagnenname', required=True,track_visibility='onchange',tracking=True) adtype = fields.Selection([('MAIN','Ersteinrichtung'),('KCHN','Änderung durch Kunde'),('LCHN','Änderung durch Logumedia'),('SONS','Sonstige Änderung')],track_visibility='onchange',tracking=True) adpos = fields.Integer('Reihenfolge',default=lambda self: self._default_adpos(),track_visibility='onchange',tracking=True) ad_is_lastpos = fields.Boolean('Letzte Aktion') contract = fields.Many2one('dss.contracts',store=True,track_visibility='onchange',tracking=True) contract_id = fields.Char(related='contract.contract_id') contract_name = fields.Char(related='contract.contract_name') contract_need_media = fields.Many2many('contract.need_media',tracking=True) project = fields.Many2one('dss.projects' , string='Project', store=True,track_visibility='onchange',tracking=True) project_id = fields.Integer(related='project.projectid', string='Project ID') parent_ad = fields.Many2one('dss.ads' , string='UrsprungsWerbung', store=True) parent_ad_uuid = fields.Char(related='parent_ad.uuid') description = fields.Text('Beschreibung',track_visibility='onchange') amount = fields.Float('Extrakosten',track_visibility='onchange',tracking=True) order = fields.Integer('Reihenfolge',track_visibility='onchange',tracking=True) # need_media = fields.Many2many('dss.mediarelations','ad',string='Medien') need_media = fields.One2many('dss.mediarelations','ad',string='Medien') work_state = fields.Many2one('dss.workstate',default=_default_work_state,tracking=True) work_state_color = fields.Char(related='work_state.color') work_state_text = fields.Char(related='work_state.statusname') work_state_info = fields.Char('Zusatzinfo') ad_state = fields.Many2one('dss.adstate',tracking=True) ad_state_color = fields.Char(related='ad_state.color') ad_state_text = fields.Char(related='ad_state.statusname') ad_state_func = fields.Selection(related='ad_state.func') todo_state = fields.Many2one('dss.todostate',default=_default_todo_state,tracking=True) todo_state_color = fields.Char(related='todo_state.color') todo_state_text = fields.Char(related='todo_state.statusname') todo_state_info = fields.Char('Zusatzinfo') todo_state_until = fields.Date('Abarbeiten bis') cloud_add_directory = fields.Char('Cloud KundenKampagnen Ordner',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) def _default_adpos(self): pos = self.env['dss.ads'].search_count([('contract_id','=',self.contract.id)]) + 1 return str(pos) @api.onchange('ad_state') def _onchange_ad_state(self): for record in self : if record.ad_is_lastpos == True: contract = record.contract contract.ads_last_state = record.ad_state # mtyp = self.env['dss.adstructures'].search([("uuid","=",str(record.mediastructure.uuid))]) # buildmediarelations(self) self.date_lastedit = str(date.today()) # self.mediastructure = mtyp def pyaction_view_ad_details(self): action = self.env['ir.actions.act_window'].with_context({'default_adid': self.id})._for_xml_id('DigitalSignage.action_dss_ads_view') # action['display_name'] = self.ad_name # action['domain'] = '[["projectid","=","4"]]' # context = action['context'].replace('', str(self.id)) # context = ast.literal_eval(context) # context.update({ # 'create': self.active, # 'active_test': self.active # }) # action['context'] = context return { 'type': 'ir.actions.act_window', 'view_type':'form', 'view_mode':'form,tree', 'res_model':'dss.ads', 'target':'current', 'context':'', 'res_id':self.id, 'display_name' : ' '+self.adname, 'domain':'' } return action def pydoviewallads(self): action = self.env['ir.actions.act_window'].with_context({'default_adid': self.id})._for_xml_id('DigitalSignage.act_dss_ads_view_full') action['display_name'] = self.contract_name # action['domain'] = '[["projectid","=","4"]]' # context = action['context'].replace('', str(self.id)) # context = ast.literal_eval(context) # context.update({ # 'create': self.active, # 'active_test': self.active # }) # action['context'] = context # return { # 'type': 'ir.actions.act_window', # 'view_type':'form', # 'view_mode':'form,tree', # 'res_model':'dss.ads', # 'target':'current', # 'context':'', # 'res_id':kampagne.id, # 'display_name' : 'Werbekampagne '+kampagne.adname, # 'domain':'[("contract","=","context[active_id]")]' # } # return action return { 'type': 'ir.actions.act_window', 'view_type':'kanban', 'view_mode':'kanban', 'res_model':'dss.ads', 'target':'current', 'context':'{"group_by":["parent_ad"]}', # 'res_id':self.parent_ad, 'display_name' : 'Übersicht für '+self.adname, 'domain':[("contract","=",self.contract.id)] } def pydonewad(self): for n_record in self: resstr = n_record.uuid _logger.info(resstr) allads = n_record.contract.ads _logger.info(allads) abort = False if allads != False: for ad in allads: if ad.ad_state.func != 'FIN': abort = True if abort == False: defadstate = self.env['dss.adstate'].search([('func','=','STD')],limit=1).id if not defadstate : defadstate = 1 if self.ad_state.func == 'STD': parent_id = self.id else: parent_id = self.parent_ad.id newkampagne = self.env['dss.ads'].create({'contract': self.contract.id, 'project': self.project.id, 'adname': 'AD_'+self.contract.contract_auto_name+' '+str(date.today()),'parent_ad':parent_id, 'adtype':'KCHN','ad_state':defadstate }) _logger.info('C_'+str(self.id)+' Kampagne erzeugt : '+str(newkampagne)) _logger.info('Prüfe Medien : C_'+str(self.id)+'K_'+str(newkampagne.id)) mediaids = [] for feld in self.contract.werbe_feld_selected: for media in feld.mediastructure.medias: if not media: _logger.info('Prüfe Medien : C_' + str(self.contract.id) + 'K_' + str( newkampagne.id) + ' Kein Medium in MedienStructur von F_' + str(feld.id) + 'M_' + str( media.id)) else: newmedia = self.env['dss.mediarelations'].create( {'field': feld.id, 'contract': self.contract.id, 'project': self.project.id, 'field_uuid': feld.uuid, 'ad': newkampagne.id,'relname':media.medianame,'mediatype':media.id}) _logger.info('Prüfe Medien : C_' + str(self.contract.id) + 'K_' + str( newkampagne.id) + ' setze Vertrag für Medium : ' + str(newmedia.contract) + '/' + str( newmedia.ad)) mediaids.append(newmedia.id) newkampagne.write({'need_media': [(6, 0, mediaids)]}) _logger.info('Click auf Werbekampagne : C_' + str(self.contract.id) + 'A_' + str(newkampagne.id) + ' setze Media ') return { 'type': 'ir.actions.act_window', 'view_type':'form', 'view_mode':'form,tree', 'res_model':'dss.ads', 'target':'current', 'context':'', 'res_id':newkampagne.id, 'display_name' : 'Änderung zur Werbekampagne '+newkampagne.parent_ad.adname, 'domain':'[("id","=","context[newkampagne.id]")]' } else: raise ValidationError(_("Kann neue Aktualisierung erst anlegen wenn alle vorherigen Schritte beendet wurden !")) def setStandardText(self,tid): text = self.env['dss.texts'].search([('text_id','=',tid)], limit=1) if text: self.write({'description':text.description}) 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)