milestone commit
This commit is contained in:
parent
f6dde36a63
commit
cbd55b3073
|
|
@ -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': [],
|
||||||
|
|
|
||||||
Binary file not shown.
511
models/dss.py
511
models/dss.py
|
|
@ -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)
|
||||||
|
|
||||||
cloud_contract_directory = fields.Char('Cloud Kunden Ordner',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')
|
@api.constrains('client_id')
|
||||||
def _check_client_id(self) :
|
def _check_client_id(self) :
|
||||||
|
|
@ -195,7 +253,6 @@ class dsscontracts(models.Model):
|
||||||
resstr = 'nicht ermittelbar'
|
resstr = 'nicht ermittelbar'
|
||||||
_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):
|
||||||
|
|
@ -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:
|
||||||
if not defadstate :
|
_logger.info('Click auf Werbekampagne : '+str(self.id)+' kein kampagne')
|
||||||
defadstate == 1
|
defadstate = self.env['dss.adstate'].search([('func','=','STD')],limit=1)
|
||||||
kampagne = self.env['dss.ads'].create({'contract': self.id, 'project': self.project.id, 'adname': 'WK '+self.contract_auto_name,'adtype':'MAIN','ad_state':defadstate})
|
if not defadstate :
|
||||||
kampagne.parent_ad = kampagne.id
|
_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 {
|
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):
|
view = self.env.ref('DigitalSignage.dss_main_contracts_form')
|
||||||
action = self.env['ir.actions.act_window'].with_context({'default_contractid': self.id})._for_xml_id('DigitalSignage.act_dss_project_view_contract')
|
_logger.debug('Click auf Vertrag : '+str(self.id))
|
||||||
action['display_name'] = self.contract_name
|
return {
|
||||||
# action['domain'] = '[["projectid","=","4"]]'
|
'type': 'ir.actions.act_window',
|
||||||
# context = action['context'].replace('', str(self.id))
|
'view_mode': 'form' ,
|
||||||
# context = ast.literal_eval(context)
|
'view_id': view.id,
|
||||||
# context.update({
|
'res_model': 'dss.contracts' ,
|
||||||
# 'create': self.active,
|
'target': 'current' ,
|
||||||
# 'active_test': self.active
|
'display_name' : self.contract_name,
|
||||||
# })
|
'views':[(view.id,'form')],
|
||||||
# action['context'] = context
|
'res_id': self.id ,
|
||||||
return action
|
}
|
||||||
|
|
||||||
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,21 +1225,49 @@ 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:
|
||||||
if not defadstate :
|
resstr = n_record.uuid
|
||||||
defadstate == 1
|
_logger.info(resstr)
|
||||||
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 })
|
allads = n_record.contract.ads
|
||||||
# action = self.env['ir.actions.act_window'].with_context({'default_contractid': newkampagne.id})._for_xml_id('DigitalSignage.act_dss_ads_view_contract')
|
_logger.info(allads)
|
||||||
# action['display_name'] = self.contract_name
|
abort = False
|
||||||
# action['domain'] = '[["projectid","=","4"]]'
|
if allads != False:
|
||||||
# context = action['context'].replace('', str(self.id))
|
for ad in allads:
|
||||||
# context = ast.literal_eval(context)
|
if ad.ad_state.func != 'FIN':
|
||||||
# context.update({
|
abort = True
|
||||||
# 'create': self.active,
|
if abort == False:
|
||||||
# 'active_test': self.active
|
defadstate = self.env['dss.adstate'].search([('func','=','STD')],limit=1).id
|
||||||
# })
|
if not defadstate :
|
||||||
# action['context'] = context
|
defadstate = 1
|
||||||
return {
|
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',
|
'type': 'ir.actions.act_window',
|
||||||
'view_type':'form',
|
'view_type':'form',
|
||||||
'view_mode':'form,tree',
|
'view_mode':'form,tree',
|
||||||
|
|
@ -1021,9 +1277,10 @@ class dsscontractads(models.Model):
|
||||||
'res_id':newkampagne.id,
|
'res_id':newkampagne.id,
|
||||||
'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:
|
||||||
return action
|
raise ValidationError(_("Kann neue Aktualisierung erst anlegen wenn alle vorherigen Schritte beendet wurden !"))
|
||||||
|
|
||||||
|
|
||||||
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)
|
||||||
|
|
|
||||||
|
|
@ -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;">
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
|
|
@ -258,9 +251,9 @@
|
||||||
<group>
|
<group>
|
||||||
<field name="client_short_strasse"/>
|
<field name="client_short_strasse"/>
|
||||||
</group>
|
</group>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-3">
|
<div class="col-3">
|
||||||
<group>
|
<group>
|
||||||
<field name="client_short_land"/>
|
<field name="client_short_land"/>
|
||||||
|
|
@ -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>
|
<group>
|
||||||
<field name="client_other_projects" string="Weitere Projekte"/>
|
<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>
|
</group>
|
||||||
</page>
|
</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>
|
||||||
|
<field name="client_other_projects" string="Weitere Projekte"/>
|
||||||
|
</group>
|
||||||
|
</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="projectIid" string="Project IId" readonly="1"/>
|
<field name="ads_last_state" string="letzter Vorgang" readonly="1"/>
|
||||||
<field name="uuid" string="Datensatz UUID"/>
|
<field name="projectIid" string="Project IId" readonly="1"/>
|
||||||
|
<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>
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
|
|
|
||||||
|
|
@ -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">
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
|
|
|
||||||
|
|
@ -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"
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue