# -*- 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 _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 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) contract_auto_name = fields.Char('Vertragskennug',tracking=True) 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) client_id = fields.Char("Kundenid",tracking=True) 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') # last_media = fields.Many2many('dss.mediarelations','mediarelations_ad_relations','contract_id','mediarelations_id',string='Medien') # need_media = fields.Many2many('dss.mediarelations','contract',string='Medien') # 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) 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 das Project innerhalb des Projekt Ordners') @api.onchange('werbe_feld_selected') def _onchange_werbe_feld_selected(self) : for record in self : # self.write({'need_media': [(5,0,0)]}) medias_ids = [] for feld in record.werbe_feld_selected: _logger.info("Feld : %s %s" % (record._origin.id,feld._origin.id)) medias = self.env['dss.mediarelations'].search([('field','=',feld._origin.id)]) for med in medias: med.contract=record._origin.id medias_ids.append(med.id) self.write({'need_media': [(6,0,medias_ids)]}) _logger.info("Media : "+str(record.need_media)) # mrelobj.write({'field': feldid }) # mrelobj.write({'project': record.project.id}) @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.debug(resstr) self.contract_auto_name = resstr 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.debug(resstr) self.contract_auto_name = resstr 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) if resstr is None : resstr = 'nicht ermittelbar' _logger.debug(resstr) self.contract_auto_name = resstr # @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 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 kampagne=self.env['dss.ads'].search([('contract','=',self.id)],limit=1) _logger.info('Click auf Werbekampagne : '+str(self.id)+' 3') if not kampagne: _logger.info('Click auf Werbekampagne : '+str(self.id)+' kein kampagne') defadstate = self.env['dss.adstate'].search([('func','=','STD')],limit=1) if not defadstate : _logger.info('Click auf Werbekampagne : '+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 : '+str(self.id)+' Kampagne erstellt '+str(kampagne.id)) kampagne.parent_ad = kampagne.id mediaids = [] for singlemedi in self.need_media: if not singlemedi: _logger.info('Prüfe Medien : C_'+str(self.id)+'K_'+str(kampagne.id)+' Kein Medium in NEED_MEDIA') else: newmedi=singlemedi.copy({'contract':self.id,'ad':kampagne.id}) _logger.info('Prüfe Medien : C_'+str(self.id)+'K_'+str(kampagne.id)+' setze Vertrag für Medium : '+str(newmedi.contract)+'/'+str(newmedi.ad)) mediaids.append(newmedi.id) kampagne.write({'need_media': [(6,0,mediaids)]}) _logger.info('Click auf Werbekampagne : '+str(self.id)+'/'+str(kampagne.id)+' setze Media '+str(kampagne.need_media)) else: _logger.info('Click auf Werbekampagne : '+str(self.id)+' mind. 1 Kampagne vorhanden '+str(kampagne.id)) _logger.info('Prüfe Medien : C_'+str(self.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)+'K_'+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)+'K_'+str(kamp.id)+' keine Medien gefunden !') for singlemedi in self.need_media: if not singlemedi: _logger.info('Prüfe Medien : C_'+str(self.id)+'K_'+str(kamp.id)+' Kein Medium in NEED_MEDIA') else: newmedi=singlemedi.copy({'ad':kamp.id}) _logger.info('Prüfe Medien : C_'+str(self.id)+'K_'+str(kamp.id)+' Kopiere Medium : '+str(singlemedi)+' -> '+str(newmedi)) _logger.info('Prüfe Medien : C_'+str(self.id)+'K_'+str(kamp.id)+' Medien evtl erstellt !') medias = self.env['dss.mediarelations'].search([('ad','=',kamp.id)]) _logger.info('Click auf Werbekampagne : C_'+str(self.id)+'K_'+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)+'K_'+str(kamp.id)+' Medien gefunden !') medias = self.env['dss.mediarelations'].search([('ad','=',kamp.id)]) # mediaids.append(medias.ids) _logger.info('Click auf Werbekampagne : C_'+str(self.id)+'K_'+str(kamp.id)+' gefundene Media '+str(mediaids)) kampagne=self.env['dss.ads'].browse(kamp.id) _logger.info('Click auf Werbekampagne : C_'+str(self.id)+'K_'+str(kamp.id)+' gefundene Media '+str(mediaids)+' Kampagne '+str(kampagne)) if kampagne.need_media != medias: _logger.info('Click auf Werbekampagne : C_'+str(self.id)+'K_'+str(kamp.id)+' Media unterschiede - setze Media '+str(mediaids)+'/'+str(kampagne.need_media)) else: _logger.info('Click auf Werbekampagne : C_'+str(self.id)+'K_'+str(kamp.id)+' Media gleich '+str(kampagne.need_media)) else: _logger.info('Prüfe Medien : C_'+str(self.id)+'K_'+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 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 dssmain(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) 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') 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('Einschaltzeit',tracking=True) zeiten_off = fields.Datetime('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 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_kennung = fields.Char(string='Kennung', related='grundsystem.kennung',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) 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) @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 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') @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') 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') eventdate = fields.Date('EventDatum', required=True) color = fields.Char(string='Color Index') @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 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 = "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) 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) 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('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 : self.env['dss.mediarelations'].search([('field_uuid','=',record.uuid)]).unlink() for media in mtyp.medias : resstr = media.medianame _logger.info('Erstellung : '+str(self._origin.id)+'/'+str(record.id)+'('+str(record._origin.id)+')/'+str(media.id)+'/'+str(record.project.id)+' '+str(restr)) mrelobj = self.env['dss.mediarelations'].create({'field':record.id,'relname':resstr,'mediatype': media.id,'field_uuid':record.uuid,'project':record.project.id}) feldid = self._origin.id mrelobj.write({'field': feldid }) mrelobj.write({'project': record.project.id}) _logger.info('Erzeugt : '+str(mrelobj)+' - '+str(mrelobj.project)+' - '+str(mrelobj.field)) else : _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') # @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') order = fields.Integer('Reihenfolge') # need_media = fields.Many2many('dss.mediarelations','ad',string='Medien') need_media = fields.Many2many('dss.mediarelations','mediarelations_ad_relations','ad_id','mediarelations_id',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 = [] medias = self.env['dss.mediarelations'].search([('ad','=',newkampagne.id)]) if not medias: _logger.info('Prüfe Medien : C_'+str(self.id)+'K_'+str(newkampagne.id)+' keine Medien gefunden !') medias = self.env['dss.mediarelations'].search(['&',('contract','=',self.contract.id),('ad','=',False)]) if not medias: _logger.info('Prüfe Medien : C_'+str(self.id)+'K_'+str(newkampagne.id)+' keine Medien im vertrag gefunden !') else: for singlemedi in medias: if not singlemedi: _logger.info('Prüfe Medien : C_'+str(self.id)+'K_'+str(newkampagne.id)+' Kein Medium') else: newmedi=singlemedi.copy({'ad':newkampagne.id}) mediaids.append(newmedi.id) _logger.info('Prüfe Medien : C_'+str(self.id)+'K_'+str(newkampagne.id)+' Kopiere Medium : '+str(singlemedi)+' -> '+str(newmedi)) medias = self.env['dss.mediarelations'].search([('ad','=',newkampagne.id)]) _logger.info('Click auf Werbekampagne : C_'+str(self.id)+'K_'+str(newkampagne.id)+' neue Media '+str(mediaids)) newkampagne.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)) # _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':'', '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})