milestone commit

This commit is contained in:
jopster 2024-05-17 13:55:26 +02:00
parent f6dde36a63
commit cbd55b3073
9 changed files with 514 additions and 255 deletions

View File

@ -13,16 +13,18 @@
'data': [ 'data': [
'security/groups.xml', 'security/groups.xml',
'security/ir.model.access.csv', 'security/ir.model.access.csv',
'views/menu.xml', 'views/dss_contracts.xml',
'views/dss_projectstate.xml', 'views/dss_projectstate.xml',
'views/dss_systemtypen.xml', 'views/dss_systemtypen.xml',
'views/dss_mediarelations.xml',
'views/dss_advertisementfields.xml',
'views/dss_projects.xml', 'views/dss_projects.xml',
'views/dss_ads.xml', 'views/dss_ads.xml',
'views/dss_contracts.xml',
'views/dss_mediafiles.xml', 'views/dss_mediafiles.xml',
'views/dss_addstructures.xml', 'views/dss_addstructures.xml',
'views/dss_texts.xml', 'views/dss_texts.xml',
'views/mainsystem_view.xml', 'views/mainsystem_view.xml',
'views/menu.xml',
'views/company_view.xml', 'views/company_view.xml',
], ],
'demo': [], 'demo': [],

View File

@ -1,4 +1,4 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*
import ast import ast
import json import json
@ -12,10 +12,12 @@ import easywebdav
import os import os
import os.path import os.path
from odoo import api, fields, models, _ from odoo import api, fields, models, _
from odoo import tools from odoo import tools
from odoo.exceptions import ValidationError from odoo.exceptions import ValidationError
from datetime import date from datetime import date
from pyffmpeg import FFmpeg
_logger = logging.getLogger(__name__) _logger = logging.getLogger(__name__)
@ -28,6 +30,15 @@ def _generate_preview_from_binary(self, videofile_file):
return base64.b64encode(out) 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): class dsscontracts(models.Model):
@api.model @api.model
@ -53,21 +64,33 @@ class dsscontracts(models.Model):
# ds = # ds =
return 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" _name = "dss.contracts"
_description = "DigitalSignage Vertraege" _description = "DigitalSignage Vertraege"
_rec_name = "contract_auto_name" _rec_name = "contract_auto_name"
_inherit = ['mail.thread','mail.activity.mixin'] _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(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_id = fields.Char("Kundennummer",store=True,tracking=True)
contract_name = fields.Char('Kurzbezeichnung', required=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 = fields.Many2one('dss.contractstate',group_expand='_read_group_stage_ids',tracking=True)
contract_state_order = fields.Integer(related='contract_state.order',store=True) contract_state_order = fields.Integer(related='contract_state.order',store=True)
contract_auto_id = fields.Char("Kundennummer",tracking=True) contract_auto_id = fields.Char("Kundennummer",tracking=True)
contract_auto_name = fields.Char('Vertragskennug',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 = fields.Many2one('dss.projects' , string='Project', store=True,tracking=True)
project_id = fields.Integer(related='project.projectid', string='Project ID') project_id = fields.Integer(related='project.projectid', string='Project ID')
projectIid = fields.Integer('Project IID',tracking=True) 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 = fields.Many2one('res.partner',domain="['&',('dsspartner','=',True),('dsspartner_werbung','=',True)]",tracking=True)
client_id = fields.Char("Kundenid",tracking=True) client_id = fields.Char("Kundenid",tracking=True)
client_uuid = fields.Char(related="client.dss_uuid") client_uuid = fields.Char(related="client.dss_uuid")
@ -87,7 +110,14 @@ class dsscontracts(models.Model):
client_other_projects = fields.Many2many('dss.projects',string='Weitere Projekte',tracking=True) client_other_projects = fields.Many2many('dss.projects',string='Weitere Projekte',tracking=True)
werbe_feld_selected = fields.Many2many('dss.advertisefields',string='Werbefelder',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) main_runtime = fields.Integer('Gesamtlaufzeit',tracking=True)
split_runtime_count = fields.Integer('Laufzeit Teilungen',tracking=True) split_runtime_count = fields.Integer('Laufzeit Teilungen',tracking=True)
@ -107,6 +137,17 @@ class dsscontracts(models.Model):
base_ad = fields.Many2one('dss.ads',tracking=True) base_ad = fields.Many2one('dss.ads',tracking=True)
ads = fields.One2many('dss.ads','contract',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_erstellt = fields.Boolean('Vnnox Zugang ?',tracking=True)
vnnox_zugang_username = fields.Char('Vnnox Username',tracking=True) vnnox_zugang_username = fields.Char('Vnnox Username',tracking=True)
@ -133,18 +174,35 @@ class dsscontracts(models.Model):
info_partner_changes = fields.Boolean('Benachrichtigen bei Partneränderungen',tracking=True) info_partner_changes = fields.Boolean('Benachrichtigen bei Partneränderungen',tracking=True)
info_partner = fields.Many2one('res.partner','Benachrichtigung an : ',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 = fields.Many2one('dss.workstate',default=_default_work_state,tracking=True)
work_state_color = fields.Char(related='work_state.color') # work_state_color = fields.Char(related='work_state.color')
work_state_text = fields.Char(related='work_state.statusname') # work_state_text = fields.Char(related='work_state.statusname')
work_state_info = fields.Char('Zusatzinfo',tracking=True) work_state_info = fields.Char('Zusatzinfo',tracking=True)
todo_state = fields.Many2one('dss.todostate',default=_default_todo_state,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_color = fields.Char(related='todo_state.color')
todo_state_text = fields.Char(related='todo_state.statusname') # todo_state_text = fields.Char(related='todo_state.statusname')
todo_state_info = fields.Char('Zusatzinfo',tracking=True) # todo_state_info = fields.Char('Zusatzinfo',tracking=True)
todo_state_until = fields.Date('Abarbeiten bis',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})
cloud_contract_directory = fields.Char('Cloud Kunden Ordner',tracking=True)
@api.constrains('client_id') @api.constrains('client_id')
def _check_client_id(self) : def _check_client_id(self) :
@ -196,7 +254,6 @@ class dsscontracts(models.Model):
_logger.debug(resstr) _logger.debug(resstr)
self.contract_auto_name = resstr self.contract_auto_name = resstr
# @api.model # @api.model
# def create(self,vals): # def create(self,vals):
# vals['projectid'] = self.env.context.get('active_id') # vals['projectid'] = self.env.context.get('active_id')
@ -205,10 +262,12 @@ class dsscontracts(models.Model):
# contract=super().create(vals) # contract=super().create(vals)
# return contract # return contract
@api.model @api.model
def _default_uuid(self): def _default_uuid(self):
return str(uuid.uuid4()) return str(uuid.uuid4())
@api.model
def _getdefwscolor(self): def _getdefwscolor(self):
return str('#ffffff') return str('#ffffff')
@ -236,41 +295,115 @@ class dsscontracts(models.Model):
return action return action
def tokampagne(self): def tokampagne(self):
action = self.env['ir.actions.act_window'].with_context({'default_contractid': self.id})._for_xml_id('DigitalSignage.action_dss_ads_view') _logger.info('Click auf Werbekampagne : C_'+str(self.id)+' - prüfe Letzte Aktuelle Kampagne')
context = action['context'] # 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) kampagne=self.env['dss.ads'].search([('contract','=',self.id)],limit=1)
if not kampagne : _logger.info('Click auf Werbekampagne : '+str(self.id)+' 3')
defadstate = self.env['dss.adstate'].search([('default','=',True)],limit=1).id 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 : if not defadstate :
defadstate == 1 _logger.info('Click auf Werbekampagne : '+str(self.id)+' kein defstate')
kampagne = self.env['dss.ads'].create({'contract': self.id, 'project': self.project.id, 'adname': 'WK '+self.contract_auto_name,'adtype':'MAIN','ad_state':defadstate}) 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 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 { return {
'type': 'ir.actions.act_window', 'type': 'ir.actions.act_window',
'view_type':'form', 'view_type':'form',
'view_mode':'form,tree', 'view_mode':'form,tree',
'res_model':'dss.ads', 'res_model':'dss.ads',
'target':'current', 'target':'current',
'context':'{"kampagne_id":'+str(kampagne.id)+',"show_project_update":True}',
'context':'', 'context':'',
'res_id':kampagne.id, 'res_id':kampagne.id,
'display_name' : 'Änderung zur Werbekampagne '+kampagne.parent_ad.adname, 'display_name' : 'Änderung zur Werbekampagne '+kampagne.parent_ad.adname,
'domain':'[("id","=","context[kampagne.id]")]' 'domain':'[("id","=","context[kampagne_id]")]'
} }
@api.model
def pyaction_view_contract(self): def pyaction_view_contract(self):
action = self.env['ir.actions.act_window'].with_context({'default_contractid': self.id})._for_xml_id('DigitalSignage.act_dss_project_view_contract') view = self.env.ref('DigitalSignage.dss_main_contracts_form')
action['display_name'] = self.contract_name _logger.debug('Click auf Vertrag : '+str(self.id))
# action['domain'] = '[["projectid","=","4"]]' return {
# context = action['context'].replace('', str(self.id)) 'type': 'ir.actions.act_window',
# context = ast.literal_eval(context) 'view_mode': 'form' ,
# context.update({ 'view_id': view.id,
# 'create': self.active, 'res_model': 'dss.contracts' ,
# 'active_test': self.active 'target': 'current' ,
# }) 'display_name' : self.contract_name,
# action['context'] = context 'views':[(view.id,'form')],
return action 'res_id': self.id ,
}
def pyaction_new_contract_kanban(self): 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 = self.env['ir.actions.act_window'].with_context({'default_contractid': self.id})._for_xml_id('DigitalSignage.action_dss_project_new_contract_kanban')
@ -311,6 +444,7 @@ class dssmain(models.Model):
systemname = fields.Many2one('dss.systems',tracking=True) systemname = fields.Many2one('dss.systems',tracking=True)
grundsystemname = fields.Many2one('dss.systemtypen',tracking=True) grundsystemname = fields.Many2one('dss.systemtypen',tracking=True)
grundsystemicon = fields.Image(related='grundsystemname.icon',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') grundsystemicon5050 = fields.Image(related='grundsystemname.icon_5050')
vertragsschreiber = fields.Many2one('res.partner',domain="['&',('dsspartner','=',True),('dsspartner_vertrieb','=',True)]",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) standortpartner = fields.Many2one('res.partner',domain="['&',('dsspartner','=',True),('dsspartner_standort','=',True)]",tracking=True)
@ -320,23 +454,37 @@ class dssmain(models.Model):
errichtet_am = fields.Datetime('Errichtungstag',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); standort_inout = fields.Selection([('indoor','im Gebäude'), ('outdoor','Aussenbereich'), ('semiindoor','Überdachter Aussenbereich'),('Divers','Andere Art')],tracking=True);
cloud_main_directory = fields.Char('Cloud Projekt Ordner',tracking=True) cloudlink = fields.Char('Cloud Verzeichnis',help='Verzeichnis für das Project innerhalb des Cloud Struktur')
@api.model @api.model
def _default_uuid(self): def _default_uuid(self):
return str(uuid.uuid4()) return str(uuid.uuid4())
def pyaction_view_contracts(self): 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 = 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 # action['display_name'] = self.projektname
context = action['context'].replace('active_id', str(self.id)) # 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 = ast.literal_eval(context)
# context = "{ # context = "{
# 'create': self.active, # 'create': self.active,
# 'active_test': self.active # 'active_test': self.active
# } # }
action['context'] = context # action['context'] = context
return action # action['domain'] = domain
# return action
@ -566,7 +714,7 @@ class dssadstatus(models.Model):
# uuid = fields.Char('UUID', required=True, translate=True) # uuid = fields.Char('UUID', required=True, translate=True)
statusname = fields.Char('Statusname', required=True) statusname = fields.Char('Statusname', required=True)
color = fields.Char(string='Color Index') color = fields.Char(string='Color Index')
default = fields.Boolean('Standardwert ?') func = fields.Selection([('STD','Standard'), ('FIN','Endzustand'), ('WOR','Arbeitszustand')])
icon = fields.Image() icon = fields.Image()
order = fields.Integer('Reihenfolge') order = fields.Integer('Reihenfolge')
@ -619,7 +767,7 @@ class dsstodostatus(models.Model):
uuid = fields.Char(default=lambda self: self._default_uuid(), required=True, readonly=True, copy=False, string='UUID') 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) # uuid = fields.Char('UUID', required=True, translate=True)
statusname = fields.Char('Statusname', required=True) statusname = fields.Char('Statusname', required=True)
statusnr = fields.Integer('Litenpostion', required=True) statusnr = fields.Integer(default=lambda self: self._default_statusnr(),string='Listenpostion', required=True)
color = fields.Char(string='Color Index') color = fields.Char(string='Color Index')
icon = fields.Image() icon = fields.Image()
@ -627,20 +775,74 @@ class dsstodostatus(models.Model):
def _default_uuid(self): def _default_uuid(self):
return str(uuid.uuid4()) return str(uuid.uuid4())
@api.model
def _default_statusnr(self):
return str(1)
class dssadvertisefields(models.Model): class dssadvertisefields(models.Model):
@api.model
def create(self,vals):
result = super().create(vals)
result.issaved = True
return result
_name = "dss.advertisefields" _name = "dss.advertisefields"
_description = "DigitalSignage Werbefelder" _description = "DigitalSignage Werbefelder"
_inherit = ['mail.thread','mail.activity.mixin'] _inherit = ['mail.thread','mail.activity.mixin']
_rec_name = "feldname" _rec_name = "feldname"
# _inherit = ['mail.thread', 'mail.activity.mixin'] # _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(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) # uuid = fields.Char('UUID', required=True, translate=True)
feldname = fields.Char('Feldname', required=True) feldname = fields.Char('Feldname', required=True)
project = fields.Many2one('dss.projects' , string='Project', store=True) project = fields.Many2one('dss.projects' , string='Project', store=True)
project_id = fields.Integer(related='project.projectid', string='Project ID') 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_used = fields.Char(string='Color Index')
color_unused = fields.Char(string='Color Index') color_unused = fields.Char(string='Color Index')
icon = fields.Image() 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 @api.model
def _default_uuid(self): def _default_uuid(self):
@ -692,10 +894,12 @@ class dssmediatypes(models.Model):
medianame = fields.Char('Medien Name', required=True) medianame = fields.Char('Medien Name', required=True)
mediatype = fields.Selection([('IMG_J','Bild'),('VID_4','MP4 Video'),('FIL_X','belieb. Datei')]) mediatype = fields.Selection([('IMG_J','Bild'),('VID_4','MP4 Video'),('FIL_X','belieb. Datei')])
description = fields.Text('Medien Beschreibung') description = fields.Text('Medien Beschreibung')
cloudlink = fields.Char('Cloud Urverzeichnis') 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_kb = fields.Integer('Maximale Größe KB')
maxsize_w = fields.Integer('Maximale Pixel W') maxsize_w = fields.Integer('Maximale Pixel W')
maxsize_h = fields.Integer('Maximale Pixel H') maxsize_h = fields.Integer('Maximale Pixel H')
standard_image = fields.Image()
@api.model @api.model
def _default_uuid(self): def _default_uuid(self):
@ -703,55 +907,52 @@ class dssmediatypes(models.Model):
class dssmediarelations(models.Model): class dssmediarelations(models.Model):
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_and_save_from_binary(self, videofile_file, videofile_file_name:str):
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:
_logger.info(videofile_file_name)
fileobj = open(videofile_file_name,"xb")
fileobj.write(out)
fileobj.close()
pass
return base64.b64encode(out)
_name = "dss.mediarelations" _name = "dss.mediarelations"
_description = "DigitalSignage Kampagne-Medien-Zuordnung" _description = "DigitalSignage Kampagne-Medien-Zuordnung"
_inherit = ['mail.thread','mail.activity.mixin'] _inherit = []
_rec_name = "relname" _rec_name = "relname"
# _inherit = ['mail.thread', 'mail.activity.mixin'] # _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(default=lambda self: self._default_uuid(), required=True, readonly=True, copy=False, string='UUID')
# uuid = fields.Char('UUID', required=True, translate=True) # uuid = fields.Char('UUID', required=True, translate=True)
kampagne = fields.Many2one('dss.ads',string='Kampagne') 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 = fields.Many2one('dss.mediatypes',string='Medientyp')
mediatype_type = fields.Selection(related='mediatype.mediatype',string='Medientyp') mediatype_type = fields.Selection(related='mediatype.mediatype',string='Medientyp')
mediatype_name = fields.Char(related='mediatype.medianame',string='Medienname')
relname = fields.Char('Relationsname') relname = fields.Char('Relationsname')
kampagnen_uuid = fields.Char('Kampagne') field_uuid = fields.Char('Feld')
mediatype_uuid = fields.Char('Medientyp') mediatype_uuid = fields.Char('Medientyp')
mediafile = fields.Binary('Datei',attachment=True) mediafile = fields.Binary('Datei',attachment=True)
mediafile_attachment = fields.Many2one('ir.attachment',string='Datei') mediafile_attachment = fields.Many2one('ir.attachment',string='Datei')
mediafile_file = fields.Char('Dateiname') mediafile_file = fields.Char('Dateiname')
mediafile_preview = fields.Binary('Datei Vorschau',compute='_compute_media_preview')
secured_ro = fields.Boolean('Gesperrt ro') secured_ro = fields.Boolean('Gesperrt ro')
used_ro = fields.Boolean('Benutzt 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') @api.onchange('mediafile')
def _onchange_mediafile(self): def _onchange_mediafile(self):
restr = 'keine' restr = 'keine'
for record in self : for record in self :
resstr = record.uuid resstr = record.uuid
_logger.info(record.mediafile) _logger.info(record.mediafile_file)
if record.mediafile != False : if record.mediafile != False :
_logger.info('Generating File '+resstr) _logger.info('Generating File '+resstr)
if os.path.isfile(record.mediafile_file) : if os.path.isfile(record.mediafile_file) :
@ -760,28 +961,34 @@ class dssmediarelations(models.Model):
fileobj.write(base64.decodebytes(record.mediafile)) fileobj.write(base64.decodebytes(record.mediafile))
fileobj.close() fileobj.close()
_logger.info(resstr+' File generated') _logger.info(resstr+' File generated')
_logger.info(' Projekt : '+record.kampagne.contract.project.uuid) _logger.info(' Projekt : P_'+str(record.project)+'C_'+str(record.contract)+'A_'+str(record.ad)+' F : '+restr+' created ')
_logger.info(' Keine Datei ') _logger.info(' Keine Datei ')
return return
def dload(self):
for record in self :
_logger.info('Download pressed : '+str(record))
return {}
@api.model @api.model
def _default_uuid(self): def _default_uuid(self):
return str(uuid.uuid4()) return str(uuid.uuid4())
@api.depends('mediafile_file') # @api.depends('mediafile_file')
def _compute_media_preview(self): # def _compute_media_preview(self):
for rec in self: # for rec in self:
if rec.mediafile != False: # if rec.mediafile != False:
_logger.info('compute image for '+rec.uuid) # _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_from_binary(base64.decodebytes(rec.mediafile))
rec.mediafile_preview = self._generate_preview_and_save_from_binary(base64.decodebytes(rec.mediafile),rec.mediafile_file+'_prv') # rec.mediafile_preview = self._generate_preview_and_save_from_binary(base64.decodebytes(rec.mediafile),rec.mediafile_file+'_prv')
# if rec.mediafile != False: # if rec.mediafile != False:
# rec.mediafile_preview = self._generate_preview_from_binary(base64.decodebytes(rec.mediafile)) # rec.mediafile_preview = self._generate_preview_from_binary(base64.decodebytes(rec.mediafile))
# rec.mediafile_preview = None # rec.mediafile_preview = None
else: # else:
_logger.info('alternative compute '+rec.uuid) # _logger.info('alternative compute '+rec.uuid)
rec.mediafile_preview = rec.mediafile # rec.mediafile_preview = rec.mediafile
return # return
class dssadstructures(models.Model): class dssadstructures(models.Model):
_name = "dss.adstructures" _name = "dss.adstructures"
@ -846,16 +1053,42 @@ class dsscontractads(models.Model):
@api.model @api.model
def create(self,vals): def create(self,vals):
result = super().create(vals) result = super().create(vals)
self['date_create'] = date.today() resstr = result.uuid
self['user_create'] = self.env.user.name _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 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" _name = "dss.ads"
_description = "DigitalSignage Werbekampagnen Phasen" _description = "DigitalSignage Werbekampagnen Phasen"
_inherit = ['mail.thread','mail.activity.mixin'] # _inherit = ['mail.thread','mail.activity.mixin']
_inherit = ['mail.activity.mixin']
#'mail.thread','mail.activity.mixin'
_rec_name = "adname" _rec_name = "adname"
# _inherit = ['mail.thread', 'mail.activity.mixin'] # _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(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_create = fields.Date('Erstellungsdatum',default=lambda self: self._default_create_date())
date_lastedit = fields.Date('Änderungsdatum') date_lastedit = fields.Date('Änderungsdatum')
@ -865,10 +1098,12 @@ class dsscontractads(models.Model):
adname = fields.Char('Kampagnenname', required=True,track_visibility='onchange',tracking=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) 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) 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 = fields.Many2one('dss.contracts',store=True,track_visibility='onchange',tracking=True)
contract_id = fields.Char(related='contract.contract_id') contract_id = fields.Char(related='contract.contract_id')
contract_name = fields.Char(related='contract.contract_name') 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 = fields.Many2one('dss.projects' , string='Project', store=True,track_visibility='onchange',tracking=True)
project_id = fields.Integer(related='project.projectid', string='Project ID') project_id = fields.Integer(related='project.projectid', string='Project ID')
@ -879,6 +1114,9 @@ class dsscontractads(models.Model):
amount = fields.Float('Extrakosten') amount = fields.Float('Extrakosten')
order = fields.Integer('Reihenfolge') 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 = fields.Many2one('dss.workstate',default=_default_work_state,tracking=True)
work_state_color = fields.Char(related='work_state.color') work_state_color = fields.Char(related='work_state.color')
work_state_text = fields.Char(related='work_state.statusname') work_state_text = fields.Char(related='work_state.statusname')
@ -886,6 +1124,8 @@ class dsscontractads(models.Model):
ad_state = fields.Many2one('dss.adstate',tracking=True) ad_state = fields.Many2one('dss.adstate',tracking=True)
ad_state_color = fields.Char(related='ad_state.color') 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 = fields.Many2one('dss.todostate',default=_default_todo_state,tracking=True)
todo_state_color = fields.Char(related='todo_state.color') todo_state_color = fields.Char(related='todo_state.color')
@ -893,16 +1133,14 @@ class dsscontractads(models.Model):
todo_state_info = fields.Char('Zusatzinfo') todo_state_info = fields.Char('Zusatzinfo')
todo_state_until = fields.Date('Abarbeiten bis') todo_state_until = fields.Date('Abarbeiten bis')
mediastructure = fields.Many2one('dss.adstructures',string='Systemaufbau',tracking=True)
mediarelations = fields.One2many('dss.mediarelations','kampagne',tracking=True)
cloud_add_directory = fields.Char('Cloud KundenKampagnen Ordner',tracking=True) cloud_add_directory = fields.Char('Cloud KundenKampagnen Ordner',tracking=True)
@api.model @api.model
def _default_uuid(self): def _default_uuid(self):
return str(uuid.uuid4()) return str(uuid.uuid4())
def _default_create_date(self): def _default_create_date(self):
return str(date.today()) return str(date.today())
@ -913,28 +1151,18 @@ class dsscontractads(models.Model):
pos = self.env['dss.ads'].search_count([('contract_id','=',self.contract.id)]) + 1 pos = self.env['dss.ads'].search_count([('contract_id','=',self.contract.id)]) + 1
return str(pos) return str(pos)
@api.onchange('mediastructure')
def _onchange_mediastructure_id(self): @api.onchange('ad_state')
restr = 'keine' def _onchange_ad_state(self):
for record in self : for record in self :
resstr = record.mediastructure.uuid if record.ad_is_lastpos == True:
_logger.info(resstr) contract = record.contract
mtyp = self.env['dss.adstructures'].search([("uuid","=",str(record.mediastructure.uuid))]) contract.ads_last_state = record.ad_state
resstr = mtyp.structurename # mtyp = self.env['dss.adstructures'].search([("uuid","=",str(record.mediastructure.uuid))])
_logger.info(resstr) # buildmediarelations(self)
_logger.info(record.mediastructure.uuid)
foundused = self.env['dss.mediarelations'].search_count(["&",('kampagnen_uuid','=',record.uuid),'|',('secured_ro','=',True),('used_ro','=',True)])
if foundused == 0 :
self.env['dss.mediarelations'].search([('kampagnen_uuid','=',record.uuid)]).unlink()
for media in mtyp.medias :
resstr = media.medianame
self.env['dss.mediarelations'].create({'kampagne': record.id,'relname':resstr,'mediatype':media.id,'kampagnen_uuid':record.uuid})
_logger.info(resstr)
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.date_lastedit = str(date.today())
self.mediastructure = mtyp # self.mediastructure = mtyp
def pyaction_view_ad_details(self): 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 = self.env['ir.actions.act_window'].with_context({'default_adid': self.id})._for_xml_id('DigitalSignage.action_dss_ads_view')
@ -997,20 +1225,48 @@ class dsscontractads(models.Model):
} }
def pydonewad(self): def pydonewad(self):
defadstate = self.env['dss.adstate'].search([('default','=',True)],limit=1).id 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 : if not defadstate :
defadstate == 1 defadstate = 1
newkampagne = self.env['dss.ads'].create({'contract': self.contract.id, 'project': self.project.id, 'adname': 'AD_'+self.adname,'parent_ad':self.id, 'adtype':'KCHN','ad_state':defadstate }) if self.ad_state.func == 'STD':
# action = self.env['ir.actions.act_window'].with_context({'default_contractid': newkampagne.id})._for_xml_id('DigitalSignage.act_dss_ads_view_contract') parent_id = self.id
# action['display_name'] = self.contract_name else:
# action['domain'] = '[["projectid","=","4"]]' parent_id = self.parent_ad.id
# context = action['context'].replace('', str(self.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 })
# context = ast.literal_eval(context) _logger.info('C_'+str(self.id)+' Kampagne erzeugt : '+str(newkampagne))
# context.update({ _logger.info('Prüfe Medien : C_'+str(self.id)+'K_'+str(newkampagne.id))
# 'create': self.active, mediaids = []
# 'active_test': self.active medias = self.env['dss.mediarelations'].search([('ad','=',newkampagne.id)])
# }) if not medias:
# action['context'] = context _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 { return {
'type': 'ir.actions.act_window', 'type': 'ir.actions.act_window',
'view_type':'form', 'view_type':'form',
@ -1022,8 +1278,9 @@ class dsscontractads(models.Model):
'display_name' : 'Änderung zur Werbekampagne '+newkampagne.parent_ad.adname, 'display_name' : 'Änderung zur Werbekampagne '+newkampagne.parent_ad.adname,
'domain':'[("id","=","context[newkampagne.id]")]' 'domain':'[("id","=","context[newkampagne.id]")]'
} }
else:
raise ValidationError(_("Kann neue Aktualisierung erst anlegen wenn alle vorherigen Schritte beendet wurden !"))
return action
def setStandardText(self,tid): def setStandardText(self,tid):
text = self.env['dss.texts'].search([('text_id','=',tid)], limit=1) text = self.env['dss.texts'].search([('text_id','=',tid)], limit=1)

View File

@ -9,7 +9,7 @@
<form> <form>
<header> <header>
<button name="pydoviewallads" string="Gesamter Verlauf" type="object" class="oe_hightlight"/> <button name="pydoviewallads" string="Gesamter Verlauf" type="object" class="oe_hightlight"/>
<button name="pydonewad" string="Neue Aktualisierung" type="object" class="oe_hightlight" enabled="0" attrs="{'invisible': [('adtype','!=','MAIN')]}"/> <button name="pydonewad" string="Neue Aktualisierung" type="object" class="oe_hightlight" enabled="0"/><!-- attrs="{'invisible': [('adtype','!=','MAIN')]}"/>-->
<!--- <field name="ad_state" widget="statusbar" statusbar_visible="in Arbeit,Fertig erstellt,Online/Gedruckt"/>--> <!--- <field name="ad_state" widget="statusbar" statusbar_visible="in Arbeit,Fertig erstellt,Online/Gedruckt"/>-->
</header> </header>
<sheet> <sheet>
@ -39,7 +39,6 @@
<div class="row"> <div class="row">
<div class="col-10"> <div class="col-10">
<group> <group>
<field name="mediastructure" string="System-Aufbau"/>
</group> </group>
</div> </div>
</div> </div>
@ -125,12 +124,12 @@
<hr></hr> <hr></hr>
<notebook> <notebook>
<page name="informations" string="Dateien"> <page name="informations" string="Dateien">
<field name="mediarelations" > -- <field name="need_media">
<tree string="Dateien" editable="False" create="False"> <tree string="Dateien" editable="False" create="False">
<field name="mediatype_type" invisible="1"/> <field name="field" string="von Feld"/>
<field name="mediatype" string=" Verwendung "/> <field name="mediatype_name" string=" Verwendung "/>
<field name="mediafile" string=" Datei " filename="mediafile_file"/> <field name="mediafile" string=" Datei " filename="mediafile_file"/>
<field name="mediafile_preview" string=" Inhalt " options="{'size':[150]}" widget="image"/> <field name="mediafile" string=" Inhalt " options="{'size':[150]}" widget="image"/>
<field name="mediafile_file"/> <field name="mediafile_file"/>
<field name="secured_ro" string=" Gesperrt " widget="boolean_toggle"/> <field name="secured_ro" string=" Gesperrt " widget="boolean_toggle"/>
<field name="used_ro" string=" Benutzt " widget="boolean_toggle"/> <field name="used_ro" string=" Benutzt " widget="boolean_toggle"/>
@ -142,8 +141,10 @@
<field name="contract" string="Vertrag" readonly="1"/> <field name="contract" string="Vertrag" readonly="1"/>
<field name="contract_id" string="Kunden/Vert.nummer" readonly="1"/> <field name="contract_id" string="Kunden/Vert.nummer" readonly="1"/>
<field name="id" string="Vertrags Interne Id" readonly="1"/> <field name="id" string="Vertrags Interne Id" readonly="1"/>
<field name="uuid" string="Datensatz UUID"/> <field name="uuid" string="Datensatz UUID" readonly="1"/>
<field name="adpos"/> <field name="adpos" string="Reihenfolge" readonly="1"/>
<field name="ad_is_lastpos" string="ist Letzte" readonly="1"/>
<field name="ad_state_func" string="Status" readonly="1"/>
</group> </group>
</page> </page>
<page name="createhistory" string="DSInformation"> <page name="createhistory" string="DSInformation">
@ -156,11 +157,11 @@
</page> </page>
</notebook> </notebook>
</sheet> </sheet>
<div class="oe_chatter"> <!-- <div class="oe_chatter">
<field name="message_follower_ids" options="{'post_refresh':True}" help="Follow this project to automatically track the events associated to tasks and issues of this project." groups="base.group_user"/> <field name="message_follower_ids" options="{'post_refresh':True}" help="Follow this project to automatically track the events associated to tasks and issues of this project." groups="base.group_user"/>
<field name="activity_ids"/>
<field name="message_ids"/> <field name="message_ids"/>
</div> <field name="activity_ids"/>
</div>-->
</form> </form>
</field> </field>
</record> </record>
@ -264,6 +265,7 @@
</div> </div>
<div class="col-1"> <div class="col-1">
<strong style="font-size:8px;text-align:right;"><field name="create_date"/></strong> <strong style="font-size:8px;text-align:right;"><field name="create_date"/></strong>
<strong style="font-size:8px;text-align:right;"><field name="ad_is_lastpos" widget="boolean_toggle" /></strong>
</div> </div>
</div> </div>
<div class="row" style="--gutter-x:10px;"> <div class="row" style="--gutter-x:10px;">

View File

@ -6,9 +6,9 @@
<field name="type">ir.actions.act_window</field> <field name="type">ir.actions.act_window</field>
<field name="res_model">dss.contracts</field> <field name="res_model">dss.contracts</field>
<field name="view_mode">kanban,tree,form</field> <field name="view_mode">kanban,tree,form</field>
<field name="domain">[('project', '=', active_id)]</field> <field name="domain">[('projectid', '=', active_id)]</field>
<field name="context">{ <field name="context">{
'default_project': active_id, 'default_projectid': active_id
'show_project_update': True 'show_project_update': True
} }
</field> </field>
@ -40,29 +40,6 @@
</record> </record>
<record id="action_dss_project_view_contract" model="ir.actions.act_window">
<field name="name">DigitalSignage Vertrag</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">dss.contracts</field>
<field name="view_mode">form</field>
</record>
<record id="act_dss_contracts" model="ir.actions.act_window">
<field name="name">DigitalSignage Alle Vertraege</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">dss.contracts</field>
<field name="view_mode">kanban,tree,form</field>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
No Contracts/Clients found. Let's create one!
</p>
<p>
Keep track of the progress of your contracts from creation to completion.<br/>
Collaborate efficiently by chatting in real-time or via email.
</p>
</field>
</record>
<record id="dss_project_new_contract_kanbanform" model="ir.ui.view"> <record id="dss_project_new_contract_kanbanform" model="ir.ui.view">
<field name="name">dss.contracts.view.kanbanform</field> <field name="name">dss.contracts.view.kanbanform</field>
<field name="model">dss.contracts</field> <field name="model">dss.contracts</field>
@ -107,11 +84,27 @@
<field name="context">{"default_allow_billable": 1}</field> <field name="context">{"default_allow_billable": 1}</field>
</record> </record>
<record id="action_dss_main_contracts" model="ir.actions.act_window">
<field name="name">DigitalSignage Alle Vertraege</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">dss.contracts</field>
<field name="view_mode">tree,form,kanban</field>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
No Contracts/Clients found. Let's create one!
</p>
<p>
Keep track of the progress of your contracts from creation to completion.<br/>
Collaborate efficiently by chatting in real-time or via email.
</p>
</field>
</record>
<record id="dss_main_contracts_tree" model="ir.ui.view"> <record id="dss_main_contracts_tree" model="ir.ui.view">
<field name="name">dss_contracts_tree</field> <field name="name">dss_contracts_tree</field>
<field name="model">dss.contracts</field> <field name="model">dss.contracts</field>
<field eval="1" name="priority"/>
<field name="arch" type="xml"> <field name="arch" type="xml">
<tree string="Vertragsuebersicht" editable="bottom" multi_edit="1" edit="1" default_order="contract_id"> <tree string="Vertragsuebersicht" editable="bottom" multi_edit="1" edit="1" default_order="contract_id">
<field name="contract_state"/> <field name="contract_state"/>
@ -123,7 +116,7 @@
</record> </record>
<record id="dss_main_contracts_form" model="ir.ui.view"> <record id="dss_main_contracts_form" model="ir.ui.view">
<field name="name">dss_contracts_form</field> <field name="name">dss_main_contracts_form</field>
<field name="model">dss.contracts</field> <field name="model">dss.contracts</field>
<field eval="2" name="priority"/> <field eval="2" name="priority"/>
<field name="arch" type="xml"> <field name="arch" type="xml">
@ -179,7 +172,7 @@
<div class="row"> <div class="row">
<div class="col-8"> <div class="col-8">
<group> <group>
<field name="werbe_feld_selected" string="Werbefeld" widget="many2many_tags"/> <field name="werbe_feld_selected" string="Werbefeld" widget="many2many_tags" option="{'not_delete': True}" domain="[('project','=',project),('contract','=',False)]"/>
</group> </group>
</div> </div>
</div> </div>
@ -204,23 +197,23 @@
</div> </div>
<div class="row"> <div class="row">
<group> <group>
<field name="work_state" string="Arbeitsstand"/> <field name="ads_last_work_state" string="Arbeitsstand"/>
</group> </group>
</div> </div>
<field name="work_state_text" invisible="1"/> <field name="ads_last_work_state_text" invisible="1"/>
<div class="row" attrs="{'invisible': [('work_state_text','!=','Sonstiges')]}" > <div class="row" attrs="{'invisible': [('ads_last_work_state_text','!=','Sonstiges')]}" >
<group> <group>
<field name="work_state_info"/> <field name="work_state_info"/>
</group> </group>
</div> </div>
<div class="row"> <div class="row">
<group> <group>
<field name="todo_state" string="nächste Aufgabe"/> <field name="ads_last_todo_state" string="nächste Aufgabe"/>
</group> </group>
</div> </div>
<div class="row"> <div class="row">
<group> <group>
<field name="todo_state_until" string="Aufgabe bis"/> <field name="ads_last_todo_state_until" string="Aufgabe bis"/>
</group> </group>
</div> </div>
</div> </div>
@ -371,28 +364,61 @@
</div> </div>
</div> </div>
</page> </page>
<page name="contractsettings" string="Werbedaten/Verlauf"> <page name="contractsettings" string="Kampagnen/Verlauf">
-- <group> <group>
<field name="ads" string="Werbekampagnen"> <field name="ads" string="" readonly="1">
<tree string="kampagnen" editable="False" create="False"> <tree string="kampagnen" editable="none" create="none">
<field name="adname" invisible="1"/> <field name="adname" string="Kampagne"/>
<field name="create_date" string=" Verwendung "/> <field name="adtype" string="Kamapgnen-Art"/>
<field name="description" string=" Datei " filename="mediafile_file"/> <field name="create_date" string="Erstellt am"/>
<field name="description" string="Bemerkung"/>
<field name="ad_state_color" string="Status" widget="color"/>
</tree> </tree>
</field> </field>
</group> </group>
</page> </page>
<page name="querprojects" string="Weitere Projekte"> <page name="contractmedia" string="letzte Medien">
<group>
<field name="last_media" string="" readonly="1">
<tree string="kampagnen" editable="none" create="none" >
<field name="field" string="vom Feld"/>
<field name="ad" string="vom Kampagne"/>
<field name="mediatype_name" string="Nutzung"/>
<button name="dload" string="" type="object" icon="fa-download"/>
<field name="mediafile" string="Vorschau" options="{'size':[50]}" widget="image"/>
<field name="secured_ro" string="Gesperrt" widget="boolean_toggle"/>
<field name="used_ro" string="Genutzt" widget="boolean_toggle"/>
</tree>
</field>
</group>
</page>
<page name="contractmedia" string="Erforderliche Medien">
<group>
<field name="need_media" string="" readonly="1">
<tree string="kampagnen" editable="none" create="none" >
<field name="field" string="vom Feld"/>
<field name="mediatype_name" string="Nutzung"/>
<field name="mediatype_type" string="Art"/>
<!-- <field name="secured_ro" string="Gesperrt" widget="boolean_toggle"/>
<field name="used_ro" string="Genutzt" widget="boolean_toggle"/>-->
</tree>
</field>
</group>
</page>
<!-- <page name="querprojects" string="Weitere Projekte">
<group> <group>
<field name="client_other_projects" string="Weitere Projekte"/> <field name="client_other_projects" string="Weitere Projekte"/>
</group> </group>
</page> </page>-->
<page name="informations" string="Informationen"> <page name="informations" string="Informationen">
<group> <group>
<field name="contract_id" string="Kunden/Vert.nummer" readonly="1"/> <field name="contract_id" string="Kunden/Vert.nummer" readonly="1"/>
<field name="id" string="Vertrags Interne Id" readonly="1"/> <field name="id" string="Vertrags Interne Id" readonly="1"/>
<field name="ads_last_state" string="letzter Vorgang" readonly="1"/>
<field name="projectIid" string="Project IId" readonly="1"/> <field name="projectIid" string="Project IId" readonly="1"/>
<field name="uuid" string="Datensatz UUID"/> <field name="uuid" string="Datensatz UUID"/>
<field name="project_ad_structure" string="Project Aufbau" readonly="1"/>
<field name="cloudlink"/>
</group> </group>
</page> </page>
</notebook> </notebook>
@ -406,6 +432,7 @@
</field> </field>
</record> </record>
<record id="dss_main_contracts_kanban" model="ir.ui.view"> <record id="dss_main_contracts_kanban" model="ir.ui.view">
<field name="name">dss_contracts_kanban</field> <field name="name">dss_contracts_kanban</field>
<field name="model">dss.contracts</field> <field name="model">dss.contracts</field>
@ -422,28 +449,42 @@
quick_create_view="dss_contracts_view_form_simplified_footer" quick_create_view="dss_contracts_view_form_simplified_footer"
on_create="pyaction_new_contract_kanban" on_create="pyaction_new_contract_kanban"
> --> > -->
<kanban class="o_kanban_mobile" on_click="pyaction_view_contract" on_create="quick_create" quick_create_view="DigitalSignage.dss_project_new_contract_kanbanform" type="object" default_group_by="contract_state"> <kanban class="o_kanban_mobile oe_background_gray o_emphasize_colors" on_create="quick_create" quick_create_view="DigitalSignage.dss_project_new_contract_kanbanform" action="pyaction_view_contract" type="object" default_group_by="contract_state">-->
<field name="contract_name"/> <field name="contract_name"/>
<field name="contract_state"/> <field name="contract_state"/>
<field name="contract_state_order"/> <field name="contract_state_order"/>
<field name="work_state_color"/> <field name="ads_last_work_state_color"/>
<field name="todo_state_color"/> <field name="ads_last_todo_state_color"/>
<field name="ads_last_state_color"/>
<templates> <templates>
<t t-name="kanban-box"> <t t-name="kanban-box">
<div class="oe_kanban_global_click o_has_icon oe_kanban_content oe_kanban_card"> <div class="oe_kanban_global_click o_has_icon oe_kanban_content oe_kanban_card">
<div class="oe_kanban_content oe_kanban_global_click o_kanban_get_form"> <div class="oe_kanban_content oe_kanban_global_click o_kanban_get_form">
<div class="row" style="--gutter-x:10px;"> <div class="row" style="--gutter-x:10px;">
<div class="col-2" t-attf-style="background-color:{{record.work_state_color.value}};padding-left: 1px;height:10px;border-style:solid;border-width:0.2px;"> <div class="col-3" t-attf-style="background-color:{{record.ads_last_state_color.value}};padding-left: 1px;height:10px;border-style:solid;border-width:0.2px;">
</div>
<div class="col-3" t-attf-style="background-color:{{record.ads_last_work_state_color.value}};padding-left: 1px;height:10px;border-style:solid;border-width:0.2px;">
</div> </div>
<!-- <t t-esc="record.work_state_color"/> <!-- <t t-esc="record.work_state_color"/>
<t t-esc="record.work_state_color.value"/>--> <t t-esc="record.work_state_color.value"/>-->
<div class="col-2" t-attf-style="background-color:{{record.todo_state_color.value}};padding-left: 1px;height:10px;border-style:solid;border-width:0.2px;"> <div class="col-3" t-attf-style="background-color:{{record.ads_last_todo_state_color.value}};padding-left: 1px;height:10px;border-style:solid;border-width:0.2px;">
<!-- <div class="col-2" t-attf-style="background-color:{{record.work_state_color.value}};padding-left: 1px;height:10px;border-style:solid;border-width:0.2px;">--> <!-- <div class="col-2" t-attf-style="background-color:{{record.work_state_color.value}};padding-left: 1px;height:10px;border-style:solid;border-width:0.2px;">-->
</div> </div>
</div> </div>
<div class="row" style="--gutter-x:10px;">
<div class="col-3" t-attf-style="background-color:#ffffff;padding-left: 1px;height:13px;border-style:solid;border-width:0.2px;">
<p style="font-size:7px"><field name="ads_last_state_text"/></p>
</div>
<div class="col-3" t-attf-style="background-color:#ffffff;padding-left: 1px;height:13px;border-style:solid;border-width:0.2px;">
<p style="font-size:7px"><field name="ads_last_work_state_text"/></p>
</div>
<div class="col-3" t-attf-style="background-color:#ffffff;padding-left: 1px;height:13px;border-style:solid;border-width:0.2px;">
<p style="font-size:7px"><field name="ads_last_todo_state_text"/></p>
</div>
</div>
<div class="row" style="--gutter-x:10px;"> <div class="row" style="--gutter-x:10px;">
<div class="col-4" style="padding-left: 1px;height:5px"> <div class="col-4" style="padding-left: 1px;height:5px">
<strong><field name="work_state_color" invisible="1"/></strong> <strong><field name="ads_last_work_state_color" invisible="1"/></strong>
</div> </div>
</div> </div>
<div class="row" style="--gutter-x:10px;"> <div class="row" style="--gutter-x:10px;">
@ -457,7 +498,7 @@
</div> </div>
<div class="row" style="--gutter-x:10px;"> <div class="row" style="--gutter-x:10px;">
<div class="col-10" style="padding-left: 1px"> <div class="col-10" style="padding-left: 1px">
<span style="font-size:9px">Status : <field name="work_state_text"/></span> <span style="font-size:9px">Status : <field name="ads_last_work_state_text"/></span>
</div> </div>
</div> </div>
<div class="row" style="--gutter-x:10px;"> <div class="row" style="--gutter-x:10px;">
@ -467,7 +508,7 @@
</div> </div>
<div class="row" style="--gutter-x:10px;"> <div class="row" style="--gutter-x:10px;">
<div class="col-10" style="padding-left: 1px"> <div class="col-10" style="padding-left: 1px">
<span style="font-size:9px">Aktion : <field name="todo_state_text"/></span> <span style="font-size:9px">Aktion : <field name="ads_last_todo_state_text"/></span>
</div> </div>
</div> </div>
</div> </div>

View File

@ -18,12 +18,13 @@
<field name="maxsize_h"/> <field name="maxsize_h"/>
<field name="maxsize_w"/> <field name="maxsize_w"/>
<field name="cloudlink"/> <field name="cloudlink"/>
<field name="filepartname"/>
</group> </group>
<notebook> <notebook>
<page name="informations" string="Informationen"> <page name="informations" string="Informationen">
<tree string="Dateien"> <group>
<field name="standard_image" string="Standard Bild" options="{'size':[200]}" widget="image"/>
</tree> </group>
</page> </page>
<page name="informations" string="Informationen"> <page name="informations" string="Informationen">
<group> <group>

View File

@ -17,6 +17,7 @@
<field name="grundsystemname" string="Kategorie"/> <field name="grundsystemname" string="Kategorie"/>
<field name="errichtet_am"/> <field name="errichtet_am"/>
<field name="aktstatus_color" widget="color"/> <field name="aktstatus_color" widget="color"/>
<field name="cloudlink"/>
</group> </group>
<notebook> <notebook>
<page name="partnersettings" string="Partner/Adressen"> <page name="partnersettings" string="Partner/Adressen">
@ -71,7 +72,7 @@
<div class="row" style="--gutter-x:10px;"> <div class="row" style="--gutter-x:10px;">
<div class="col-2" style="padding-left: 1px"> <div class="col-2" style="padding-left: 1px">
<field name="grundsystemicon" widget="image" string="intern" class="system_icon_small oe_avatar"/> <field name="grundsystemicon" widget="image" string="intern" class="system_icon_small oe_avatar"/>
<!-- <img t-attf-src="/DigitalSignage/static/images/{{grundsystemname.icon}}.jpg"></img>--> <!-- <img t-attf-src="/DigitalSignage/static/images/{{grundsystemnameicon5050}}.jpg"></img>-->
</div> </div>
<div class="col-10"> <div class="col-10">
<div class="row"> <div class="row">

View File

@ -281,7 +281,7 @@
<tree string="Werbeaktions-Status"> <tree string="Werbeaktions-Status">
<field name="color" widget="color"/> <field name="color" widget="color"/>
<field name="statusname"/> <field name="statusname"/>
<field name="default" string="Standardwert"/> <field name="func" string="Funktion"/>
<field name="icon"/> <field name="icon"/>
<field name="order"/> <field name="order"/>
</tree> </tree>
@ -297,7 +297,7 @@
<group> <group>
<group name="basethings"> <group name="basethings">
<field name="statusname" string="Statusname"/> <field name="statusname" string="Statusname"/>
<field name="default" string="Standardwert"/> <field name="func" string="Funktion"/>
<field name="color" string="Farbindex" widget="color"/> <field name="color" string="Farbindex" widget="color"/>
<field name="icon" string="Icon"/> <field name="icon" string="Icon"/>
<field name="order"/> <field name="order"/>
@ -390,45 +390,6 @@
</record> </record>
<record id="dss_advertisefields_view_tree" model="ir.ui.view">
<field name="name">dss_advertisefields_tree</field>
<field name="model">dss.advertisefields</field>
<field name="priority" eval="16"/>
<field name="arch" type="xml">
<tree string="Werbefelder">
<field name="feldname"/>
<field name="project"/>
<field name="color_used" widget="color"/>
<field name="color_unused" widget="color"/>
<field name="icon"/>
</tree>
</field>
</record>
<record id="dss_advertisefields_view_form" model="ir.ui.view">
<field name="name">dss_advertisefields_form</field>
<field name="model">dss.advertisefields</field>
<field name="arch" type="xml">
<form>
<sheet>
<group>
<group name="basethings">
<field name="feldname" string="Feldname"/>
<field name="project" string="Projekt"/>
<field name="color_used" widget="color"/>
<field name="color_unused" widget="color"/>
<field name="icon" string="Icon"/>
</group>
</group>
</sheet>
<div class="oe_chatter">
<field name="message_follower_ids" options="{'post_refresh':True}" help="Follow this project to automatically track the events associated to tasks and issues of this project." groups="base.group_user"/>
<field name="activity_ids"/>
<field name="message_ids"/>
</div>
</form>
</field>
</record>
<record id="dss_eventdays_view_tree" model="ir.ui.view"> <record id="dss_eventdays_view_tree" model="ir.ui.view">
<field name="name">dss_eventdays_tree</field> <field name="name">dss_eventdays_tree</field>
@ -644,19 +605,6 @@
</field> </field>
</record> </record>
<record id="action_dss_advertisefields_view" model="ir.actions.act_window">
<field name="name">DigitalSignage Werbefelder</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">dss.advertisefields</field>
<field name="view_mode">tree,form</field>
<field name="context">{}</field>
<field name="help" type="html">
<p class="'o_view_nocontent_smiling_face">
Neues Werbefeld erstellen
</p>
</field>
</record>
<record id="action_dss_eventdays_view" model="ir.actions.act_window"> <record id="action_dss_eventdays_view" model="ir.actions.act_window">
<field name="name">DigitalSignage EventSpieltage</field> <field name="name">DigitalSignage EventSpieltage</field>
<field name="type">ir.actions.act_window</field> <field name="type">ir.actions.act_window</field>

View File

@ -60,7 +60,7 @@
id="menu_dss_contracts_details" id="menu_dss_contracts_details"
name="Vertraege managen" name="Vertraege managen"
parent="menu_dss_main_view" parent="menu_dss_main_view"
action="act_dss_contracts" action="action_dss_main_contracts"
sequence="4"/> sequence="4"/>
<menuitem <menuitem
@ -77,6 +77,13 @@
action="action_dss_systems_view" action="action_dss_systems_view"
sequence="30"/> sequence="30"/>
<menuitem
id="menu_dss_mediarelations_systems"
name="MediaRelationen"
parent="menu_dss_internsetup"
action="action_dss_mediarelations_view"
sequence="60"/>
<menuitem <menuitem
id="menu_dss_configurationen" id="menu_dss_configurationen"
name="Werte" name="Werte"