Blockly integration

This commit is contained in:
jopster 2025-09-22 09:23:28 +02:00
parent 4e32d9ba82
commit d416043bf7
35 changed files with 884 additions and 109 deletions

View File

@ -30,8 +30,7 @@
'views/dss_geraetetypen.xml',
'views/dss_onlinestate.xml',
'views/dss_texts.xml',
'views/dss_systems.xml',
'views/dss_screendesign.xml',
'views/dss_systems.xml',
'views/dss_eventdays.xml',
'views/dss_trigger_actions.xml',
'views/dss_trigger_action_groups.xml',
@ -46,6 +45,9 @@
'views/dss_web_contracts.xml',
'views/dss_invoices.xml',
'views/dss_m2mmail_views.xml',
'views/dss_linkmail_views.xml',
'views/dss_binaries_wizard.xml',
'views/dss_binaries.xml',
'views/mainsystem_view.xml',
'views/dss_importinvoicelist.xml',
'views/menu.xml',
@ -53,6 +55,7 @@
'views/google_map.xml',
'views/dss_report_invoice.xml',
'data/ir_model_data.xml',
#'views/dss_screendesign.xml',
],
'demo': [],
'installable': True,
@ -70,6 +73,15 @@
'DigitalSignage/static/src/js/dss_screenview_renderer.js',
'DigitalSignage/static/src/js/dss_screenview_register.js',
'DigitalSignage/static/src/js/dss_screenview_model.js',
'DigitalSignage/static/src/xml/dss_trigger_condition_view_controller.xml',
'DigitalSignage/static/src/xml/dss_trigger_condition_view_renderer.xml',
'DigitalSignage/static/src/js/dss_trigger_condition_view_archparser.js',
'DigitalSignage/static/src/js/dss_trigger_condition_view_helper.js',
'DigitalSignage/static/src/js/dss_trigger_condition_view_blocks.js',
'DigitalSignage/static/src/js/dss_trigger_condition_view_controller.js',
'DigitalSignage/static/src/js/dss_trigger_condition_view_renderer.js',
'DigitalSignage/static/src/js/dss_trigger_condition_view_register.js',
'DigitalSignage/static/src/js/dss_trigger_condition_view_model.js',
'DigitalSignage/static/src/scss/dss_nextcloudwidget.scss',
'DigitalSignage/static/src/xml/dss_nextcloudwidget.xml',
'DigitalSignage/static/src/js/dss_nextcloudwidget.js',
@ -83,6 +95,7 @@
'DigitalSignage/static/src/js/screenDesignerViewReload.js',
'DigitalSignage/static/src/xml/form_button.xml',
'DigitalSignage/static/src/xml/form_label.xml',
'DigitalSignage/static/src/js/test.php',
],
'web.assets_common': [
'DigitalSignage/static/images/**/*',

View File

@ -28,3 +28,5 @@ from . import dss_importinvoicelist
from . import dss_web_contracts
from . import dss_m2mmail
from . import dsslogger
from . import dss_binaries
from . import dss_linkmail

BIN
models/__pycache__/__init__.cpython-311.pyc Executable file → Normal file

Binary file not shown.

BIN
models/__pycache__/dss.cpython-311.pyc Executable file → Normal file

Binary file not shown.

BIN
models/__pycache__/dss_ads.cpython-311.pyc Executable file → Normal file

Binary file not shown.

BIN
models/__pycache__/dss_marker.cpython-311.pyc Executable file → Normal file

Binary file not shown.

BIN
models/__pycache__/dss_onlinestate.cpython-311.pyc Executable file → Normal file

Binary file not shown.

View File

@ -24,8 +24,10 @@ from dateutil.relativedelta import relativedelta
from pyffmpeg import FFmpeg
from tuya_iot import TuyaOpenAPI, TUYA_LOGGER
from tuya_connector import TuyaOpenAPI, TUYA_LOGGER
from . import dss_contract
import sys
TUYA_LOGGER.setLevel(logging.DEBUG)
_logger = logging.getLogger(__name__)
@ -189,11 +191,13 @@ class dssmediatypes(models.Model):
mediatype = fields.Selection([('IMG_J','Bild'),('VID_4','MP4 Video'),('FIL_X','belieb. Datei')])
description = fields.Text('Medien Beschreibung')
cloudlink = fields.Char('Cloud Verzeichnis',help='Verzeichnis für diese Datei innerhalb des Vertrags-Ordners')
archiv_cloudlink = fields.Char('Archivcloud Verzeichnis',help='Verzeichnis für diese Datei innerhalb des Vertrags-Ordners')
filepartname = fields.Char('Part.Dateiname',help='Teil des Dateinamens. Wird ergaenzt durch KampagnenID und MedienID. Beispiel : PNAME_34_544.jpg')
maxsize_kb = fields.Integer('Maximale Größe KB')
maxsize_w = fields.Integer('Maximale Pixel W')
maxsize_h = fields.Integer('Maximale Pixel H')
standard_image = fields.Image()
default_filename = fields.Char('Default Dateiname', help='Standard-Dateiname für diesen Mediatyp. Wird automatisch aus dem Dateinamen der hochgeladenen Datei abgerufen')
@api.model
def _default_uuid(self):
@ -205,7 +209,7 @@ class dssmediarelations(models.Model):
_description = "DigitalSignage Kampagne-Medien-Zuordnung"
_inherit = []
_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('UUID', required=True, translate=True)
field = fields.Many2one('dss.advertisefields',string='Feld')
@ -340,7 +344,20 @@ class dssscreendesign(models.Model):
'context' : {'screenlayout': 1},
'tag': 'dss_screenDesigner_js_action'
}
class NewBinaryWizard(models.TransientModel):
_name = 'dss.binaries.wizard.new'
_description = 'New Binary Wizard'
field_ids = fields.Many2one('dss.mediatypes' , string='Partners')
def pyopen_dss_contract_add_binary_form_view_from_wizzard(self):
context = dict(self.env.context or {})
default_contract_id = context.get('active_id', False)
_logger.info('Open Add Binary Form '+str(context)+' - '+str(default_contract_id)+' / '+str(self.field_ids))
contract= self.env['dss.contracts'].browse(default_contract_id)
dss_contract.dsscontracts.pyopen_dss_contract_add_binary_form_view_from_wizzard(contract,self.field_ids)
return context
class View(models.Model):
"""
@ -349,6 +366,7 @@ class View(models.Model):
"""
_inherit = 'ir.ui.view'
type = fields.Selection(selection_add=[('screenview', "ScreenView")])
type = fields.Selection(selection_add=[('trigger_condition_view', "Trigger_Condition_View")])
class IrActionsActWindowView(models.Model):
"""
@ -356,5 +374,6 @@ class IrActionsActWindowView(models.Model):
a new view mode called 'grid'.
"""
_inherit = 'ir.actions.act_window.view'
view_mode = fields.Selection(selection_add=[('screenview', "ScreenView")],
ondelete={'screenview': 'cascade'})
view_mode = fields.Selection(selection_add=[('screenview', "ScreenView")],ondelete={'screenview': 'cascade'})
view_mode = fields.Selection(selection_add=[('trigger_condition_view', "Trigger_Condition_View")],ondelete={'trigger_condition_view': 'cascade'})

View File

@ -99,7 +99,7 @@ class dsscontractads(models.Model):
# uuid = fields.Char('UUID', required=True, translate=True)
adname = fields.Char('Kampagnenname', required=True, tracking=True)
adtype = fields.Selection(
[('MAIN', 'Ersteinrichtung'), ('KCHN', 'Änderung durch Kunde'), ('LCHN', 'Änderung durch Logumedia'),
[('MAIN', 'Ersteinrichtung'), ('KCHN', 'Änderung durch Kunde'), ('LCHN', 'Änderung durch Logumedia'),('VERL', 'Verlängerung des Vertrages'),
('SONS', 'Sonstige Änderung'),('PREA', 'Vorausplanung')], tracking=True)
adpos = fields.Integer('Reihenfolge', default=lambda self: self._default_adpos(),
tracking=True)

View File

@ -114,6 +114,7 @@ class dsscontracts(models.Model):
provisionspayedpercent = fields.Float('Ausgezahlte Provision % :',compute='_compute_provisionspayedpercent')
grafiker = fields.Many2one('res.partner', domain="['&',('dssinternpartner','=',True),('dssinternpartner_grafik','=',True)]", tracking=True, string="abw. Grafiker",help="Grafiker nur wenn abweichend vom Projektgrafiker")
real_grafiker = fields.Char('Grafiker tatsächlich', tracking=True)
techniker = fields.Many2one('res.partner', domain="['&',('dssinternpartner','=',True),('dssinternpartner_technik','=',True)]", tracking=True, string="abw. Techniker (Einspielung)",help="der Techniker der die Einspielung vornehmen kann")
contract_remark = fields.Html('Vertragshinweise',tracking=True)
@ -171,7 +172,7 @@ class dsscontracts(models.Model):
shortwerbe_feld_selected = fields.Char(related='werbe_feld_selected.feldname',string='Werbefelder',tracking=True)
cutshortwerbe_feld_selected = fields.Char(string='gekürzte Felder',compute='_compute_cutshort')
werbe_feld_selected_btn_img = fields.Binary(related="werbe_feld_selected.btn_image_bin",string='Buttonbild',tracking=True)
werbe_feld_selected_btn_img = fields.Binary(related="werbe_feld_selected.btn_image_bin",string='Buttonbild')
werbe_feld_selected_btn_img_base64 = fields.Char(related="werbe_feld_selected.btn_image_bin_base64")
werbe_feld_selected_btn_pos_x = fields.Integer(related="werbe_feld_selected.btn_pos_x", tracking=True)
werbe_feld_selected_btn_pos_y = fields.Integer(related="werbe_feld_selected.btn_pos_y", tracking=True)
@ -275,10 +276,28 @@ class dsscontracts(models.Model):
info_partner_changes = fields.Boolean('Benachrichtigen bei Partneränderungen',tracking=True)
info_partner = fields.Many2one('res.partner','Benachrichtigung an : ',tracking=True)
work_marker_1 = fields.Boolean('Markierung 1 aktiv',tracking=True)
work_marker_1 = fields.Boolean('Markierung 1 aktiv (StartEmail versendet)',tracking=True)
get_marker_1_color_false = fields.Char('Markierung 1 Farbe',compute='_get_marker_1_color_false')
get_marker_1_color_true = fields.Char('Markierung 1 Farbe true',compute='_get_marker_1_color_false')
get_marker_1_color = fields.Char('Markierung 1 Farbe get',compute='_get_marker_1_color_false')
work_marker_2 = fields.Boolean('Markierung 2 aktiv',tracking=True)
get_marker_2_color = fields.Char('Markierung 1 Farbe get',compute='_get_marker_2_color_false')
work_marker_3 = fields.Boolean('Markierung 3 aktiv',tracking=True)
work_marker_3_full = fields.Boolean('Markierung 3 vollmarker',tracking=True)
work_marker_3_value = fields.Char('Markierung 3 Wert',tracking=True)
get_marker_3_color = fields.Char('Markierung 1 Farbe get',compute='_get_marker_3_color_false')
work_marker_3_1 = fields.Boolean('Teil-Markierung 3.1 aktiv',tracking=True)
work_marker_3_1_value = fields.Char('Teil-Markierung 3.1 Wert',tracking=True)
work_marker_3_2 = fields.Boolean('Teil-Markierung 3.2 aktiv',tracking=True)
work_marker_3_2_value = fields.Char('Teil-Markierung 3.2 Wert',tracking=True)
work_marker_4 = fields.Boolean('Markierung 4 aktiv',tracking=True)
work_marker_4_full = fields.Boolean('Markierung 4 vollmarker',tracking=True)
work_marker_4_value = fields.Char('Markierung 4 Wert',tracking=True)
get_marker_4_color = fields.Char('Markierung 1 Farbe get',compute='_get_marker_4_color_false')
work_marker_4_1 = fields.Boolean('Teil-Markierung 4.1 aktiv',tracking=True)
work_marker_4_1_value = fields.Char('Teil-Markierung 4.1 Wert',tracking=True)
work_marker_4_2 = fields.Boolean('Teil-Markierung 4.2 aktiv',tracking=True)
work_marker_4_2_value = fields.Char('Teil-Markierung 4.2 Wert',tracking=True)
marker_list = fields.Many2many('dss.marker', string='vorhandene Marker', tracking=True)
@ -287,6 +306,8 @@ class dsscontracts(models.Model):
# work_state_text = fields.Char(related='work_state.statusname')
work_state_info = fields.Char('Zusatzinfo',tracking=True)
contract_binaries = fields.Many2many('dss.binaries', string='Vertragsdateien', tracking=True)
# todo_state = fields.Many2one('dss.todostate',default=_default_todo_state,tracking=True)
# todo_state_color = fields.Char(related='todo_state.color')
# todo_state_text = fields.Char(related='todo_state.statusname')
@ -304,6 +325,58 @@ class dsscontracts(models.Model):
ads_topics = fields.Many2many('dss.contracts_ads_topics', string='Themenliste', tracking=True)
ads_topics_text = fields.Char('Themenliste gesamt',compute='_compute_themenliste')
@api.depends('work_marker_1')
@api.onchange('work_marker_1')
def _get_marker_1_color_false(self):
_logger.info('Contract get Marker 1 Color false')
for record in self:
if not record.work_marker_1:
record.get_marker_1_color = dss_settings.dssSettings._get_settingvalue(self,'marker_1_color_unused')
else:
record.get_marker_1_color = dss_settings.dssSettings._get_settingvalue(self,'marker_1_color_used')
@api.depends('work_marker_2')
@api.onchange('work_marker_2')
def _get_marker_2_color_false(self):
_logger.info('Contract get Marker 2 Color false')
for record in self:
if not record.work_marker_2:
record.get_marker_2_color = dss_settings.dssSettings._get_settingvalue(self,'marker_2_color_unused')
else:
record.get_marker_2_color = dss_settings.dssSettings._get_settingvalue(self,'marker_2_color_used')
@api.depends('work_marker_3')
@api.onchange('work_marker_3')
def _get_marker_3_color_false(self):
_logger.info('Contract get Marker 3 Color false')
for record in self:
if dss_settings.dssSettings._get_settingvalue(self,'marker_3_color_value'):
if record.work_marker_3:
record.get_marker_3_color = record.work_marker_3_value
else:
record.get_marker_3_color = dss_settings.dssSettings._get_settingvalue(self,'marker_3_color_unused')
else:
if not record.work_marker_3:
record.get_marker_3_color = dss_settings.dssSettings._get_settingvalue(self,'marker_3_color_unused')
else:
record.get_marker_3_color = dss_settings.dssSettings._get_settingvalue(self,'marker_3_color_used')
def _get_marker_4_color_false(self):
_logger.info('Contract get Marker 4 Color false')
for record in self:
if dss_settings.dssSettings._get_settingvalue(self,'marker_4_color_value'):
if record.work_marker_4:
record.get_marker_4_color = record.work_marker_4_value
else:
record.get_marker_4_color = dss_settings.dssSettings._get_settingvalue(self,'marker_4_color_unused')
else:
if not record.work_marker_4:
record.get_marker_4_color = dss_settings.dssSettings._get_settingvalue(self,'marker_4_color_unused')
else:
record.get_marker_4_color = dss_settings.dssSettings._get_settingvalue(self,'marker_4_color_used')
@api.depends('ads_topics')
def _compute_themenliste(self):
# _logger.info('Contract Themenliste Berechnung : C_' + str(self.id))
@ -1042,6 +1115,22 @@ class dsscontracts(models.Model):
return True
def pyaction_create_cloud_structure_client(self):
projectcloudpath = self.project.cloudlink
if not projectcloudpath:
newpath = str(dss_settings.dssSettings.getprojectpath(self,self.project))+str(dss_settings.dssSettings.getClientpath(self,self))
else:
if projectcloudpath[0] != '$':
newpath = str(projectcloudpath)+str(dss_settings.dssSettings.getClientpath(self,self))
else:
newpath = str(dss_settings.dssSettings.getprojectpath(self,self.project))+str(dss_settings.dssSettings.getClientpath(self,self))
action = (self.env["confirmation.wizard"].confirm_message(_("Sind Sie sicher den Cloudordner auf Standard zurück zu setzen und anzulegen ? : Aktuell : "+self.cloudlink+" danach : "+str(newpath)),title="Bitte bestätigen",method="createcontract",records=self,callback_params={"template":self.id})
)
if action:
self.cloudlink=newpath
self.create_cloud_structure_client(self)
def createcontract(self,template):
newid = template
newClient = self.env['dss.contracts'].search([('id','=',newid)])
@ -1251,12 +1340,73 @@ class dsscontracts(models.Model):
#raise ValidationError((all_contract_text))
return contracts
def pyopen_dss_contract_add_media_form_view(self):
_logger.info('Open Add Media Form')
view = self.env.ref("DigitalSignage.dss_media_add_form")
self._compute_prov()
media = self.env['dss.mediarelations'].create({'contract':self.id,'project':self.project.id,'field_uuid':self.werbe_feld_selected[0].uuid,'ad':self.ads_last_ad.id})
_logger.info('Open Add Media Form '+str(view)+' M_'+str(media))
return {
'type': 'ir.actions.act_window',
'view_mode': 'form' ,
'view_type': 'form' ,
'view_id': view.id,
'res_model': 'dss.mediarelations' ,
'target': 'new' ,
'display_name' : 'Neu Media einfügen',
'views':[(view.id,'form')],
'res_id':media.id,
}
def pyopen_dss_contract_add_binary_form_view(self):
_logger.info('Open Add Binary Form')
view = self.env.ref("DigitalSignage.dss_binaries_view_form_wizard")
_logger.info('Open Wizzard Binary Form '+str(view))
return {
'type': 'ir.actions.act_window',
'view_mode': 'form' ,
'view_type': 'form' ,
'view_id': view.id,
'res_model': 'dss.binaries.wizard.new' ,
'target': 'new' ,
'views':[(view.id,'form')],
'context': {'default_binary_contract':self.id},
}
def pyopen_dss_contract_add_binary_form_view_from_wizzard(self,media):
_logger.info('Open Add Binary Form')
view = self.env.ref("DigitalSignage.dss_binaries_view_form")
self._compute_prov()
binary = self.env['dss.binaries'].create({'binary_contract':self.id,'binary_name':self.contract_name,'binary_mediatype':media.id,'binary_id':str(media.filepartname+'_'+self.contract_auto_id),'binary_binary':media.standard_image})
self.contract_binaries = [(4, binary.id)]
_logger.info('Open Add Binary Form '+str(view)+' B_'+str(binary))
return {
'type': 'ir.actions.act_window',
'view_mode': 'form' ,
'view_type': 'form' ,
'view_id': view.id,
'res_model': 'dss.binaries' ,
'target': 'new' ,
'views':[(view.id,'form')],
'res_id':binary.id,
}
@api.model
def newwizzard(self,id):
project = self.env['dss.projects'].search([('id', '=', id)], limit=1)
_logger.info("Create new Contract Wizard - Project : "+str(project))
action = self.env["ir.actions.actions"]._for_xml_id("DigitalSignage.action_open_create_contract")
action['context'] = {'default_project': project.id}
return action
def get_attachments_by_mediatype(self, mediatype):
_logger.info('Get Attachments for Contract : C_'+str(self.id)+' - Mediatype : '+str(mediatype))
attachment = self.env['dss.binaries'].search([('binary_contract', '=', self.id), ('binary_mediatype', '=', mediatype.id)])
if not attachment:
_logger.info('No Attachments found for Contract : C_'+str(self.id)+' - Mediatype : '+str(mediatype))
return ""
else:
return attachment

View File

@ -37,4 +37,8 @@ class dssmarker(models.Model):
@api.model
def _default_uuid(self):
return str(uuid.uuid4())
return str(uuid.uuid4())
@api.model
def readmarker(self):
return self.env['dss.marker'].browse()

View File

@ -115,6 +115,7 @@ class dssprojects(models.Model):
standortpartner = fields.Many2one('res.partner',domain="['&',('dsspartner','=',True),('dsspartner_standort','=',True)]",tracking=True)
vertriebspartner = fields.Many2many('res.partner',domain="['&',('dsspartner','=',True),('dsspartner_vertrieb','=',True)]",tracking=True)
project_grafiker = fields.Many2one('res.partner',domain="['&',('dssinternpartner','=',True),('dssinternpartner_grafik','=',True)]",tracking=True)
project_techniker = fields.Many2one('res.partner', domain="['&',('dssinternpartner','=',True),('dssinternpartner_technik','=',True)]", tracking=True, string="Techniker (Einspielung)",help="der Techniker der die Einspielung vornehmen kann")
zeiten_on = fields.Datetime('veraltet',tracking=True)
zeiten_off = fields.Datetime('veraltet',tracking=True)
zeitenf_on = fields.Float('Einschaltzeit',tracking=True)
@ -285,8 +286,8 @@ class dssprojects(models.Model):
@api.model
def compute_getonlinestate2(self,project):
projekte = self.env['dss.projects'].search([('grundsystem_showonlinestate','=',True)])
for pro in projekte:
projekte = self.env['dss.projects'].search([('grundsystem_showonlinestate','=',True)])
for pro in projekte:
self.compute_getonlinestate_single(pro)
@api.model
@ -327,6 +328,7 @@ class dssprojects(models.Model):
def compute_getonlinestate_single(self,project):
#proj = self.env['dss.projects'].search([('id',"=",project.id)])
_logger.setLevel(1)
proj = project
colorOn = str(self.env['dss.settings'].search([], limit=1).systemonline_color)
colorOff = str(self.env['dss.settings'].search([], limit=1).systemoffline_color)

View File

@ -38,9 +38,32 @@ class dssSettings(models.Model):
def_contract_cloudpath = fields.Char('Standard Kunden Pfad',tracking=True)
def_contract_cloudpath_sample = fields.Char('Vertrags Beispiel :',tracking=True)
def_contract_cloudpath_V2 = fields.Char('Standard Kunden Pfad V2',tracking=True)
def_contract_cloudpath_sample_V2 = fields.Char('Projekt Beispiel V2 :',tracking=True)
def_contract_cloudpath_sample_V2 = fields.Char('Projekt Beispiel V2 :',tracking=True)
def_ad_cloudpath = fields.Char('Standard Kampagnen Pfad',tracking=True)
def_ad_cloudpath_sample = fields.Char('Kampagnen Beispiel :',tracking=True)
marker_1_color_used = fields.Char('Marker Farbe (benutzt)',default='#00FF00',tracking=True)
marker_1_color_unused = fields.Char('Marker Farbe (unbenutzt)',default='#FF0000',tracking=True)
marker_2_color_used = fields.Char('Marker 2 Farbe (benutzt)',default='#00FF00',tracking=True)
marker_2_color_unused = fields.Char('Marker 2 Farbe (unbenutzt)',default='#FF0000',tracking=True)
marker_3_color_used = fields.Char('Marker 3 Farbe (benutzt)',default='#00FF00',tracking=True)
marker_3_color_unused = fields.Char('Marker 3 Farbe (unbenutzt)',default='#FF0000',tracking=True)
marker_3_color_value = fields.Boolean('Marker 3 Farbe aus wert ?',tracking=True)
marker_3_1_color_used = fields.Char('Marker 3.1 Farbe (benutzt)',default='#00FF00',tracking=True)
marker_3_1_color_unused = fields.Char('Marker 3.1 Farbe (unbenutzt)',default='#FF0000',tracking=True)
marker_3_1_color_value = fields.Boolean('Marker 3.1 Farbe aus wert ?',tracking=True)
marker_3_2_color_used = fields.Char('Marker 3.2 Farbe (benutzt)',default='#00FF00',tracking=True)
marker_3_2_color_unused = fields.Char('Marker 3.2 Farbe (unbenutzt)',default='#FF0000',tracking=True)
marker_3_2_color_value = fields.Boolean('Marker 3.2 Farbe aus wert ?',tracking=True)
marker_4_color_used = fields.Char('Marker 4 Farbe (benutzt)',default='#00FF00',tracking=True)
marker_4_color_unused = fields.Char ('Marker 4 Farbe (unbenutzt)',default='#FF0000',tracking=True)
marker_4_color_value = fields.Boolean('Marker 4 Farbe aus wert ?',tracking=True)
marker_4_1_color_used = fields.Char('Marker 4.1 Farbe (benutzt)',default='#00FF00',tracking=True)
marker_4_1_color_unused = fields.Char('Marker 4.1 Farbe (unbenutzt)',default='#FF0000',tracking=True)
marker_4_1_color_value = fields.Boolean('Marker 4.1 Farbe aus wert ?',tracking=True)
marker_4_2_color_used = fields.Char('Marker 4.2 Farbe (benutzt)',default='#00FF00',tracking=True)
marker_4_2_color_unused = fields.Char('Marker 4.2 Farbe (unbenutzt)',default='#FF0000',tracking=True)
marker_4_2_color_value = fields.Boolean('Marker 4.2 Farbe aus wert ?',tracking=True)
tuya_access_id = fields.Char('Tuya Access ID',tracking=True)
tuya_access_key = fields.Char('Tuya Access KEY',tracking=True)
tuya_endpoint = fields.Char('Tuya Access Endpoint',tracking=True)
@ -77,15 +100,16 @@ class dssSettings(models.Model):
if parts[0] == '$':
fels = parts[1:]
if fels == 'shortwerbe_feld_selected':
if not record.werbe_feld_selected.Field_notinCloud:
parts = ''
else:
parts = record._origin.read([fels])
part= ''
for wf in record.werbe_feld_selected:
if wf.Field_notinCloud: # AChtung NOtinCloud = True ist Name anzeigen
part += wf.feldname + '_'
part = part if parts else ''
else:
parts = record._origin.read([fels])
_logger.info("Get Path - Anfrage-Teil gefunden : " + str(parts))
part = record._origin.read([fels])[0][fels]
_logger.info("Get Path - Anfrage-Teil gefunden : " + str(part))
if parts:
value = str(parts[0][fels])
value = str(part)
else:
value = ''
_logger.info("Get Path - Anfrage-Teil gefunden - setze : " + str(value))
@ -188,6 +212,22 @@ class dssSettings(models.Model):
_logger.info("Get Client Path - kein Client gefunden")
return ''
@api.model
def readFields(self,tablename):
_logger.info("Project read Fields : "+str(tablename))
model = self.env['ir.model'].search([('model', '=', tablename)])
fields = self.env['ir.model.fields'].search([('model_id', '=', model.id)],order = 'field_description')
_logger.info("Project read Fields - Suche nach Feldern abgeschlossen - "+str(model)+" - "+str(fields))
records = []
for field in fields:
fieldrecord=[]
fieldrecord.append(field.id)
fieldrecord.append(field.field_description)
fieldrecord.append(field.name)
fieldrecord.append(str(field.field_description+' ('+field.name+')'))
records.append(fieldrecord)
return records
class dssSettingsSave(models.Model):

View File

@ -1,6 +1,8 @@
import uuid
import logging
import datetime
from .dsslogger import OdooCustomLogger
from odoo import api, fields, models, _
from odoo import tools
@ -8,10 +10,35 @@ from datetime import datetime
from datetime import date
from odoo.exceptions import ValidationError
from dateutil.relativedelta import relativedelta
from tuya_iot import TuyaOpenAPI, TUYA_LOGGER
from tuya_connector import TuyaOpenAPI, TUYA_LOGGER
import sys
TUYA_LOGGER.setLevel(logging.DEBUG)
logging.setLoggerClass(OdooCustomLogger)
_logger = logging.getLogger(__name__)
##_logger = logging.getLogger(__name__)
class trigger(models.Model):
dataset = None
@api.model
def GetValue(self,Table,FieldName):
sampletable = self.env['ir.config_parameter'].sudo().get_param('dss.global.trigger_sample_table')
sampleid = self.env['ir.config_parameter'].sudo().get_param('dss.global.trigger_sample_id')
Dataset = self.env[sampletable].search([('id','=',sampleid)])
_logger.info("GetValue called for "+str(Table)+" Fieldname "+str(FieldName)+' -> '+str(self)+' / '+str(Dataset))
Field=self.env['ir.model.fields'].search([('id','=',FieldName)])
_logger.info("GetValue called for "+str(Table)+" Fieldname "+str(Field))
_logger.info("GetValue called for "+str(Table)+" Fieldname "+str(Field)+' -> '+str(Dataset[Field.name]))
return Dataset[Field.name]
class dsstriggerconditions(models.Model):
_name = "dss.triggerconditions"
_description = "DigitalSignage Trigger Bedingungen"
@ -34,6 +61,8 @@ class dsstriggerconditions(models.Model):
trigger_marker_check = fields.Many2one('dss.marker','Marker',help='Welcher Marker soll eingefügt werden ?',tracking=True)
trigger_value = fields.Char('Fix Wert',tracking=True)
@api.model
def _default_uuid(self):
return str(uuid.uuid4())
@ -105,6 +134,19 @@ class dsstriggerconditions(models.Model):
dotrigger = Compare
return dotrigger
@api.model
def getconditionbyid(self,conditionid):
_logger.info("Trigger get condition by conditionid !"+str(conditionid))
element = self.env['dss.triggerconditions'].search([('id','=',conditionid)])
_logger.info("Trigger get condition by conditionid !"+str(conditionid)+' - '+str(element))
blocksyntax = {}
if element:
blocksyntax = element.read()[0] if element else {}
else:
blocksyntax = {}
return blocksyntax
return element
class dsstriggergroups(models.Model):
_name = "dss.triggergroups"
@ -352,7 +394,7 @@ class dsstriggertypes(models.Model):
triggertyp = fields.Selection([('FIELD_A','Feldänderung allgemein'),('FIELD_S','Feldänderung spezifisch'),('FIELD_B','Feldänderung BOOL'),('FIELD_K','Feldwert berechnet'),('COND','Bedingungen prüfen'),('MANUAL','Manuell ausgelösst'),('FILTER','Manuell gefiltert')],'Triggertyp',tracking=True)
trigger_table = fields.Many2one('ir.model','Nutzbar in',help='Für welche Daten ist dieser Tigger gültig ?',tracking=True)
trigger_field = fields.Many2one('ir.model.fields', string="Auslöser Feld",help='Triggerfeldname in der Tabelle - Änderungen an dem Feld lösen den Trigger aus',tracking=True)
trigger_operator = fields.Selection([('NGLEICH','Feld gleich dem Wert'),('GGLEICH','Feld größer/gleich dem Wert'),('KGLEICH','Feld kleiner/gleich dem Wert'),('UGLEICH','Feld ungleich dem Wert'),('ENTHAELT','Feld enthällt dem Wert')],'Feldwertoperator',tracking=True)
trigger_operator = fields.Selection([('NGLEICH','Feld gleich dem Wert'),('GGLEICH','Feld größer/gleich dem Wert'),('KGLEICH','Feld kleiner/gleich dem Wert'),('GROESSER','Feld grösser dem Wert'),('KLEINER','Feld kleiner dem Wert'),('UGLEICH','Feld ungleich dem Wert'),('ENTHAELT','Feld enthällt dem Wert')],'Feldwertoperator',tracking=True)
trigger_time_opperator = fields.Selection([('TAG','Aktueller Tag'),('TIME','Aktuelle Zeit'),('JAHR','Aktuelles Jahr'),('FIX','Feste Zeit')],'Vergleichswert',tracking=True)
trigger_init_trigger = fields.Boolean('Ausl. bei 1. Änderung ?',help='Soll der Trigger bereits beim setzen des 1. Wertes auslösen?',tracking=True)
trigger_onlyinit_trigger = fields.Boolean('Ausl. nur bei 1. Änderung ?',help='Soll der Trigger nur beim setzen des 1. Wertes auslösen?',tracking=True)
@ -364,6 +406,11 @@ class dsstriggertypes(models.Model):
trigger_aktionen = fields.Many2many('dss.triggeractions',string='Aktionen bei auslösen des Triggers',tracking=True)
trigger_aktionen_groups = fields.Many2many('dss.triggeractions.groups',string='Aktionsgruppen bei auslösen des Triggers',tracking=True)
trigger_raw_condition = fields.Char('Datensatz Auswahl',tracking=True)
trigger_is_block_config = fields.Boolean('Blockly Trigger Design',tracking=True)
trigger_block_config = fields.Char('Blockly Design',tracking=True)
trigger_block_raw_config = fields.Char('Blockly command Design',tracking=True)
trigger_block_command_uptodate = fields.Boolean('Blockly command aktuell',tracking=True)
trigger_block_command = fields.Char('Blockly command',tracking=True)
@api.model
def _default_uuid(self):
@ -383,6 +430,104 @@ class dsstriggertypes(models.Model):
def _check_trigger(self,DataRecord):
return ""
@api.model
def gettriggerbyname(self,triggername):
_logger.info("Trigger get Triggerbyname !"+str(triggername))
return self.env['dss.triggertypes'].search([('triggername','=',triggername)])
@api.model
def gettriggerblocksyntaxbyname(self,triggername):
_logger.info("Trigger get Trigger Block Syntax by Name !"+str(triggername))
foundtrigger = self.env['dss.triggertypes'].search([('triggername','=',triggername)])
blocksyntax = {}
if foundtrigger:
blocksyntax = foundtrigger.read()[0] if foundtrigger else {}
else:
blocksyntax = {}
return blocksyntax
@api.model
def gettablebyid(self,tableid):
_logger.info("Trigger get tablename by Tableid !"+str(tableid))
return str(self.env['ir.model'].search([('id','=',tableid)]).model)
@api.model
def getfieldbyid(self,fieldid):
_logger.info("Trigger get fieldname-mix by fieldid !"+str(fieldid))
feld = self.env['ir.model.fields'].search([('id','=',fieldid)])
return str(str(feld.field_description+' ('+feld.name+')'))
@api.model
def getbyid(self,modelid,searchfield,searchid):
_logger.info("Trigger get modelid by searchid !"+str(searchid))
foundtrigger = self.env[modelid].search([(searchfield,'=',searchid)])
blocksyntax = {}
if foundtrigger:
blocksyntax = foundtrigger.read()[0] if foundtrigger else {}
else:
blocksyntax = {}
return blocksyntax
@api.model
def getall(self,modelid):
_logger.info("Trigger get all !"+str(modelid))
foundtrigger = self.env[modelid].search([])
_logger.info("Trigger get all !"+str(foundtrigger))
blocksyntax = []
if foundtrigger:
blocksyntax = [record.read()[0] for record in foundtrigger] if foundtrigger else []
else:
blocksyntax = []
_logger.info("Trigger get all !"+str(blocksyntax))
return blocksyntax
def execute_trigger(self):
if self.trigger_block_raw_config:
a=1
else:
a=2
def handleNewClick(self):
return True
def handleSaveClick(self):
return True
def handleGenerateClick(self):
return True
def handleRedrawClick(self):
return True
@api.model
def NewBlockTrigger(self,triggername,triggeraktiv):
_logger.info("Trigger New Block Trigger !"+str(triggername))
newtrigger = self.env['dss.triggertypes'].create({'triggername':triggername,'trigger_is_block_config':True,'trigger_active':triggeraktiv})
return newtrigger
@api.model
def UpdateBlockTrigger(self,triggername,blockcode,triggeraktiv ):
_logger.info("Trigger Update Block Trigger !"+str(triggername))
foundtrigger = self.env['dss.triggertypes'].search([('triggername','=',triggername)])
if foundtrigger:
foundtrigger.write({'trigger_block_raw_config':blockcode,'trigger_active':triggeraktiv,'trigger_block_command_uptodate':False})
return foundtrigger
@api.model
def execTriggerTest(self,sourcecode,sampletable,sampleid):
_logger.info("Trigger Exec Trigger Test !"+str(sourcecode)+' / '+str(sampletable)+' / '+str(sampleid))
try:
Dataset = self.env[sampletable].search([('id','=',sampleid)])
_logger.info("Trigger Exec Trigger Test Dataset !"+str(Dataset))
self.env['ir.config_parameter'].sudo().set_param('dss.global.trigger_sample_table', sampletable)
self.env['ir.config_parameter'].sudo().set_param('dss.global.trigger_sample_id', sampleid)
exec(sourcecode)
return "OK"
except Exception as e:
_logger.error("Trigger Exec Trigger Test Error !"+str(e))
return "Error :"+str(e)
class dsstriggeractions(models.Model):
_name = "dss.triggeractions"
@ -414,6 +559,8 @@ class dsstriggeractions(models.Model):
email_data_table = fields.Many2one('ir.model','EmailDaten in',help='Für welche Daten ist diese Aktion gültig ?',tracking=True)
email_data_field = fields.Many2one('ir.model.fields','Empfänger Feld', help='Feldname in der Tabelle',tracking=True)
email_template = fields.Many2one('mail.template','Emailvorlage',tracking=True)
email_has_attachments = fields.Boolean('Email mit Anhang',tracking=True,help='Soll die Email mit Anhang versendet werden ?')
email_contract_attachment_types = fields.Many2many('dss.mediatypes',tracking=True,help='Welche Dateitypen aus dem Vertrag sollen als Anhang versendet werden ?')
activity_user = fields.Many2one('res.users','Empfänger der Aufgabe',tracking=True)
activity_type = fields.Many2one('mail.activity.type','Art der Aufgabe',tracking=True)
@ -503,6 +650,23 @@ class dsstriggeractions(models.Model):
_logger.info('Trigger Aktion TRA_' + str(self)+' Sending Email - Template : '+str(self.email_template)+" Empfänger :"+str(mailto)+'/'+str(ccmailto)+' -> '+str(Dataset))
self.email_template.email_to = mailto
self.email_template.email_cc = ccmailto
if self.email_has_attachments:
_logger.info('Trigger Aktion TRA_' + str(self)+' Sending Email - Anhang : '+str(self.email_contract_attachment_types))
attachments = []
for mediatype in self.email_contract_attachment_types:
_logger.info('Trigger Aktion TRA_' + str(self)+' Sending Email - Anhang : '+str(mediatype))
single_attachment = Dataset.get_attachments_by_mediatype(mediatype)
if single_attachment:
_logger.info('Trigger Aktion TRA_' + str(self)+' Sending Email - Anhang erzeugen : '+str(single_attachment))
if single_attachment.binary_filename:
fname = single_attachment.binary_filename
else:
fname = single_attachment.binary_name
att_id = self.env['ir.attachment'].create({'name': fname,
'datas': single_attachment.binary_binary})
_logger.info('Trigger Aktion TRA_' + str(self)+' Sending Email - Anhang wurde erzeugen : '+str(att_id))
self.email_template.attachment_ids = [(4, att_id.id)]
_logger.info('Trigger Aktion TRA_' + str(self)+' Sending Email - Anhang neu : '+str(self.email_template.attachment_ids))
if not self.email_send_confirm:
self.email_template.send_mail(Dataset.id,force_send=True)
else:
@ -511,6 +675,7 @@ class dsstriggeractions(models.Model):
title="Bestätigen",method="Email senden ",callback_params={"Email": mailto}))
if action:
self.email_template.send_mail(Dataset.id,force_send=True)
self.email_template.attachment_ids = [(5,0,0)] # Clear attachments after sending
self.email_template.email_cc = ccmailto_org
elif (self.triggeractiontyp == 'DSEDIT'):
_logger.info('Trigger Aktion TRA_' + str(self)+' Setze Wert für DS_'+str(Dataset)+' FLD_'+str(self.action_field.name)+' - Typ : '+str(self.action_value_type)+' -> '+str(self.action_value_bool))

View File

@ -49,4 +49,7 @@ DigitalSignage_dss_onlinestate,access.dss.onlinestate,model_dss_onlinestate,base
DigitalSignage_dss_m2mmail,access.dss.m2mmail,model_dss_m2mmail,base.group_user,1,1,1,1
digitalsignage_dss_display_templates_group_user,access.dss.display.templates,model_dss_display_templates,base.group_user,1,1,1,1
digitalsignage_dss_triggeractions_groups_group_user,access.dss.triggeractions.groups,model_dss_triggeractions_groups,base.group_user,1,1,1,1
digitalsignage_dss_screendesign_group_user,access.dss.screendesign,model_dss_screendesign,base.group_user,1,1,1,1
digitalsignage_dss_screendesign_group_user,access.dss.screendesign,model_dss_screendesign,base.group_user,1,1,1,1
digitalsignage_dss_binaries_group_user,access.dss.binaries,model_dss_binaries,base.group_user,1,1,1,1
digitalsignage_dss_binaries_wizard_new_group_user,access.dss.binaries.wizard.new,model_dss_binaries_wizard_new,base.group_user,1,1,1,1
digitalsignage_dss_linkmail_group_user,access.dss.linkmail,model_dss_linkmail,base.group_user,1,1,1,1
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
49 DigitalSignage_dss_m2mmail access.dss.m2mmail model_dss_m2mmail base.group_user 1 1 1 1
50 digitalsignage_dss_display_templates_group_user access.dss.display.templates model_dss_display_templates base.group_user 1 1 1 1
51 digitalsignage_dss_triggeractions_groups_group_user access.dss.triggeractions.groups model_dss_triggeractions_groups base.group_user 1 1 1 1
52 digitalsignage_dss_screendesign_group_user access.dss.screendesign model_dss_screendesign base.group_user 1 1 1 1
53 digitalsignage_dss_binaries_group_user access.dss.binaries model_dss_binaries base.group_user 1 1 1 1
54 digitalsignage_dss_binaries_wizard_new_group_user access.dss.binaries.wizard.new model_dss_binaries_wizard_new base.group_user 1 1 1 1
55 digitalsignage_dss_linkmail_group_user access.dss.linkmail model_dss_linkmail base.group_user 1 1 1 1

View File

@ -35,9 +35,6 @@ export class ScreenViewModel {
//The keeplast protect against concurrency call
console.log(this);
await this.keepLast.add(this.loaddata(this)); //this.loaddata(records));
console.log(this);
var element=document.querySelector('.o_dark_panel')
element.remove();;
}
/**
* @protected

View File

@ -129,3 +129,221 @@
.hidden {
display: none;
}
.trigger_condition_view_main {
background-color:#FFFFFF;
padding:0px;
float:left;
}
.trigger_condition_view_Header_1 {
background-color: #FFFFFF;
color: #202020;
font-weight: bold;
padding: 10px;
margin:2px;
text-align: center;
border-color: #fff;
border-width: 0px;
border-style: solid;
//height:100px;
}
.trigger_condition_view_main_1 {
background-color: #FFFFFF;
color: #202020;
font-weight: bold;
padding: 10px;
margin:2px;
text-align: center;
border-color: #fff;
border-width: 0px;
border-style: solid;
//height:100px;
}
.trigger_condition_view_main_1_blockly {
background-color: #FFFFFF;
color: #202020;
font-weight: bold;
margin:2px;
text-align: center;
border-color: #fff;
border-width: 0px;
border-style: solid;
overflow-y: visible;
height:1000px;
}
.trigger_condition_view_main_1_blockly_code {
background-color: #AFAFAF;
color: #202020;
font-weight: bold;
margin:2px;
text-align: center;
border-color: #fff;
border-width: 0px;
border-style: solid;
overflow-y: visible;
height:750px;
}
.trigger_condition_view_main_1_blockly_code_Result {
background-color: #AFAFAF;
color: #202020;
font-weight: bold;
margin:2px;
text-align: center;
border-color: #fff;
border-width: 0px;
border-style: solid;
overflow-y: visible;
height:150px;
margin-top: 5px;
margin-bottom: 5px;
}
.trigger_condition_view_main_1_blockly_code_cmd {
background-color: #AFAFAF;
color: #202020;
font-weight: bold;
margin:2px;
text-align: center;
border-color: #fff;
border-width: 0px;
border-style: solid;
overflow-y: visible;
height:90px;
}
.trigger_condition_view_content {
background-color: #FFFFFF;
color: #202020;
}
.trigger_condition_item {
background-color: #A0A0D0;
color: #000;
font-weight: normal;
padding: 10px;
margin:2px;
text-align: left;
border-color: #fff;
border-width: 1px;
border-style: solid;
height: 100px;
width: 100px;
}
.section-header {
background-color: #FFFFFF;
color: #202020;
font-weight: bold;
padding: 10px;
margin:2px;
text-align: center;
}
.section-text {
background-color: #FFFFFF;
color: #202020;
font-weight: normal;
padding: 0px;
margin:0px;
text-align: left;
}
.codetextarea {
width: 100%;
height: 100%;
font-family: monospace;
font-size: 10px;
line-height: 1.4;
color: #333;
background-color: #f9f9f9;
border: 1px solid #ccc;
border-radius: 4px;
padding: 10px;
box-sizing: border-box;
resize: vertical;
white-space: nowrap;
overflow: auto;
}
.codeResultArea {
width: 100%;
height: 100%;
font-family: monospace;
font-size: 10px;
line-height: 1.4;
color: #333;
background-color: #f9f9f9;
border: 1px solid #ccc;
border-radius: 4px;
padding: 5px;
margin-top: 5px;
margin-bottom: 5px;
box-sizing: border-box;
resize: vertical;
white-space: nowrap;
overflow: auto;
}
.myBlocklyRow_1 {
background-color: #BFBFBF;
color: #000000;
}
.myBlocklyRow_2 {
background-color: #BFBF3F;
color: #000000;
}
.myBlocklyRow_3 {
background-color: #3FBFBF;
color: #000000;
}
.myBlocklyRow_4 {
background-color: #3F3FBF;
color: #000000;
}
.myBlocklyRow_5 {
background-color: #CF7FBF;
color: #000000;
}
.trigger_condition_view_Header_2 {
background-color: #FFFFFF;
color: #202020;
font-weight: bold;
padding: 10px;
margin:2px;
text-align: center;
border-color: #fff;
border-width: 0px;
border-style: solid;
//height:100px;
text-align: right;
}
.trigger_condition_view_save_button {
margin-right: 10px;
}
.trigger_condition_view_gen_button {
margin-right: 10px;
}
.trigger_condition_vieW_draw_button {
margin-right: 10px;
}
.trigger_condition_view_test_button {
margin-right: 10px;
}
.trigger_condition_view_copy_button {
margin-right: 10px;
}

View File

@ -3,7 +3,7 @@
<t t-name="dss.screenview" owl="1">
<Layout display="props.display" className="'h-100 overflow-auto'">
<t t-component="props.Renderer" records="model.records" propsYouWant="'Hello world'"/>
<t t-component="props.Renderer" records="model.records" propsYouWant="Selection"/>
</Layout>
<div class="" t-attf-style="height:100px;width:100%">
<p>Scrollraum</p>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 0 B

After

Width:  |  Height:  |  Size: 298 KiB

View File

@ -218,9 +218,9 @@
</page>
<page name="informations" string="Interne Informationen">
<group>
<field name="contract" string="Vertrag" readonly="1"/>
<field name="contract_id" string="Kunden/Vert.nummer" readonly="1"/>
<field name="id" string="Vertrags Interne Id" readonly="1"/>
<field name="contract" string="Vertrag"/>
<field name="contract_id" string="Kunden/Vert.nummer"/>
<field name="id" string="Vertrags Interne Id"/>
<field name="uuid" string="Datensatz UUID" readonly="1"/>
<field name="adpos" string="Reihenfolge" readonly="1"/>
<field name="ad_is_lastpos" string="ist Letzte" readonly="1"/>

View File

@ -364,6 +364,7 @@
<field name="contract_name" string="Vertragskennung"/>
</group>
</div>
<div class="row">
<div class="col-8">
<group>
@ -371,11 +372,14 @@
</group>
<hr></hr>
<group>
<field name="ads_last_work_state_info" string="Aktuelle Hinweise Kampagne" widget="text"/>
<field name="ads_last_work_state_info" string="Hinweise Kampagne" widget="text"/>
</group>
<group>
<field name="work_state_info" string="Aktuelle Hinweise Vertrag" widget="text"/>
<field name="work_state_info" string="Hinweise Vertrag" widget="text"/>
</group>
<group>
<field name="remark" string="Hinweise Allgemein" widget="text"/>
</group>
</div>
</div>
</div>
@ -549,8 +553,9 @@
<page name="grundsettings" string="Grundeinstellungen">
<div class="row">
<group string="Partnerinformationen">
<field name="contract_writer" string="Vertrags-Schreiber"/>
<field name="contract_writer_mailcc" widget="boolean_toggle"/>
<field name="contract_writer" string="Vertrags-Schreiber"/>
<field name="contract_writer_mailcc" widget="boolean_toggle"/>
<field name="techniker"/>
<field name="grafiker" string="abw. Mitarbeiter Kunden-Grafik :"/>
<field name="project_grafiker" attrs="{'invisible':[('grafiker','=','project_grafiker')]}"/>
<!-- <field name="real_grafiker" string="Tatsächlicher Grafiker: "/> -->
@ -750,6 +755,11 @@
</page>
</notebook>
</page>
<page name="remarks" string="Anmerkungen/Bemerkungen">
<group>
<field name="remark"/>
</group>
</page>
<page name="tvmarketing" string="TV Marketing">
<group>
<field name="tv_reach_PLZ"/>
@ -759,11 +769,6 @@
<field name="ads_topics"/>
</group>
</page>
<page name="remarks" string="Anmerkungen/Bemerkungen">
<group>
<field name="remark"/>
</group>
</page>
<page name="contractaccess" string="Zugangsdaten" attrs="{'project.':[('client','!=',False)]}">
<div class="row" >
<div class="col-4">
@ -837,21 +842,26 @@
</field>
</group>
</page>
<page name="contractmedia" string="letzte Medien">
<page name="contractmedia" string="Fertige Dateien">
<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="" title="download_1" 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>
<field name="contract_binaries" string="">
<tree string="Dateien zum Kunde" create="False" delete="True" editable="1" class="my_binary_class">
<field name="binary_name" string="Bezeichnung"/>
<field name="binary_mediatype_name" string="Vorlage"/>
<field name="binary_binary" string="Vorschau" widget="image" readonly="False"/>
<field name="binary_description" string="Beschreibung"/>
<field name="binary_filename" string="Dateiname" readonly="1"/>
<field name="binary_issaved" string="in Cloud Gespeichert" widget="boolean_toggle"/>
<field name="binary_secured_ro" string="Gesperrt" widget="boolean_toggle"/>
<field name="binary_used_ro" string="Genutzt" widget="boolean_toggle"/>
<button name="dedit" string="" title="edit" type="object" icon="fa-edit"/>
<button name="dload" string="" title="download_1" type="object" icon="fa-download"/>
</tree>
</field>
</group>
<button string="Datei hinzufügen" name="pyopen_dss_contract_add_binary_form_view" type="object" class="btn-primary o_open_tasks" data-hotkey="m"/>
</page>
<!-- <page name="querprojects" string="Weitere Projekte">
<group>
<field name="client_other_projects" string="Weitere Projekte"/>
@ -886,10 +896,36 @@
</page>
<page name="grundsettings_mark" string="Markierungen">
<group string="Spezifische Datensatz-Marker">
<field name="work_marker_1" string="Start Email versendet ?" widget="boolean_toggle"/>
<field name="work_marker_2" string="Marker 2" widget="boolean_toggle"/>
<field name="work_marker_3" string="Marker 3" widget="boolean_toggle"/>
<field name="work_marker_4" string="Marker 4" widget="boolean_toggle"/>
<group string="Marker 1 - Startemail versendet">
<field name="work_marker_1" widget="boolean_toggle"/>
</group>
<group string="Marker 2 - Frei">
<field name="work_marker_2" widget="boolean_toggle"/>
</group>
<group string="Marker 3 - Details">
<field name="work_marker_3_full" widget="boolean_toggle"/>
<field name="work_marker_3" widget="boolean_toggle" attrs="{'invisible': [('work_marker_3_full','=',False)]}"/>
<field name="work_marker_3_value" attrs="{'invisible': [('work_marker_3_full','=',False)]}"/>
<field name="work_marker_3_value" attrs="{'invisible': [('work_marker_3_full','=',False)]}" widget="color"/>
<field name="work_marker_3_1" widget="boolean_toggle" attrs="{'invisible': [('work_marker_3_full','!=',False)]}"/>
<field name="work_marker_3_1_value" attrs="{'invisible': [('work_marker_3_full','!=',False)]}"/>
<field name="work_marker_3_1_value" attrs="{'invisible': [('work_marker_3_full','!=',False)]}" widget="color"/>
<field name="work_marker_3_2" widget="boolean_toggle" attrs="{'invisible': [('work_marker_3_full','!=',False)]}"/>
<field name="work_marker_3_2_value" attrs="{'invisible': [('work_marker_3_full','!=',False)]}"/>
<field name="work_marker_3_2_value" attrs="{'invisible': [('work_marker_3_full','!=',False)]}" widget="color"/>
</group>
<group string="Marker 4 - Details - MailAutomatiken (TV)">
<field name="work_marker_4_full" widget="boolean_toggle"/>
<field name="work_marker_4" widget="boolean_toggle" attrs="{'invisible': [('work_marker_4_full','=',False)]}"/>
<field name="work_marker_4_value" attrs="{'invisible': [('work_marker_4_full','=',False)]}"/>
<field name="work_marker_4_value" attrs="{'invisible': [('work_marker_4_full','=',False)]}" widget="color"/>
<field name="work_marker_4_1" widget="boolean_toggle" attrs="{'invisible': [('work_marker_4_full','!=',False)]}"/>
<field name="work_marker_4_1_value" attrs="{'invisible': [('work_marker_4_full','!=',False)]}"/>
<field name="work_marker_4_1_value" attrs="{'invisible': [('work_marker_4_full','!=',False)]}" widget="color"/>
<field name="work_marker_4_2" widget="boolean_toggle" attrs="{'invisible': [('work_marker_4_full','!=',False)]}"/>
<field name="work_marker_4_2_value" attrs="{'invisible': [('work_marker_4_full','!=',False)]}"/>
<field name="work_marker_4_2_value" attrs="{'invisible': [('work_marker_4_full','!=',False)]}" widget="color"/>
</group>
</group>
<group string="allgemeine Datensatz-Marker">
<field name="marker_list" string="">
@ -900,6 +936,22 @@
</field>
</group>
</page>
<page name="contractmedia" string="zugehörige Dateien">
<group>
<field name="last_media" string="" readonly="1">
<tree string="kampagnen" editable="none" create="1" delete="1" class="my_media_class">
<field name="field" string="vom Feld"/>
<field name="ad" string="vom Kampagne"/>
<field name="mediatype_name" string="Nutzung"/>
<button name="dload" string="" title="download_1" 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>
<button string="Datei hinzufügen" name="pyopen_dss_contract_add_media_form_view" type="object" class="btn-primary o_open_tasks" data-hotkey="m"/>
</page>
<page name="grundsettings_kd" string="Kundendaten original">
<div class="row" string="Kundendaten Schnellanlage" name="client_short_edit" attrs="{'invisible':[('client','=',False)]}">
<hr></hr>
@ -976,7 +1028,9 @@
</notebook>
</page>
</notebook>
<field name="scan_vertrag" string='Vertrag PDF Ansicht' widget="pdf_viewer"/>
<group string="Vertrag Schnellansicht">
<field name="scan_vertrag" string='Vertrag PDF Ansicht' widget="pdf_viewer"/>
</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"/>
@ -1004,7 +1058,7 @@
quick_create_view="dss_contracts_view_form_simplified_footer"
on_create="pyaction_new_contract_kanban"
> -->
<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" default_order="client_id desc">
<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" default_order="contract_auto_id desc">
<!-- <kanban class="o_kanban_mobile oe_background_gray o_emphasize_colors" action="pyaction_view_contract" type="object" default_group_by="contract_state" default_order="client_id">-->
<field name="contract_name"/>
<field name="contract_state"/>
@ -1017,10 +1071,15 @@
<field name="contract_state_minimal_kanban"/>
<field name="ads_last_date_korrekturfreigabe_ablauf_erfolgt"/>
<field name="korrectur_color"/>
<field name="start_date"/>
<field name="work_marker_1"/>
<field name="get_marker_1_color"/>
<field name="work_marker_2"/>
<field name="get_marker_2_color"/>
<field name="work_marker_3"/>
<field name="get_marker_3_color"/>
<field name="work_marker_4"/>
<field name="get_marker_4_color"/>
<field name="ads_last_date_korrekturfreigabe_ablauf_auto_cancel"/>
<templates>
<t t-name="kanban-box">
@ -1060,30 +1119,25 @@
<p style="font-size:14px;margin-bottom:0px"><strong><field name="contract_auto_id" string="Kundennummer"/></strong></p>
</div>
<div class="col-1" t-attf-style="background-color:#bbbbbb;height:21px;padding-left:0px !important;width:12px;border-style:none">
<div t-attf-style="background-color:#bbbbbb;height:10px;width:11px;border-style:none;border-width:0.1px;" title="Willkommensemail / Startdatum-EMail wurde versendet (Marker 1)" attrs="{'invisible': [('work_marker_1','=',True)]}">
<div t-attf-style="background-color:{{record.get_marker_1_color.value}};height:10px;width:11px;border-style:none;border-width:0.1px;" title="Willkommensemail / Startdatum-EMail wurde versendet (Marker 1)">
</div>
<div t-attf-style="background-color:#bb0b0b;height:10px;width:11px;border-style:none;border-width:0.1px;" title="Willkommensemail wurde versendet (Marker 1)" attrs="{'invisible': [('work_marker_1','!=',True)]}">
</div>
<div t-attf-style="background-color:#bbbbbb;height:10px;width:11px;border-style:none;border-width:0.1px;" title="Erinnerungen wurde(n) versendet (Marker 2)" attrs="{'invisible': [('work_marker_2','=',True)]}">
</div>
<div t-attf-style="background-color:#bb0b0b;height:10px;width:11px;border-style:none;border-width:0.1px;" title="Erinnerungen wurde(n) versendet (Marker 2)" attrs="{'invisible': [('work_marker_2','!=',True)]}">
<div t-attf-style="background-color:{{record.get_marker_2_color.value}};height:10px;width:11px;border-style:none;border-width:0.1px;" title="Erinnerungen wurde(n) versendet (Marker 2)">
</div>
</div>
<div class="col-1" t-attf-style="background-color:#bbbbbb;height:21px;padding-left:0px !important;width:12px;border-style:none">
<div t-attf-style="background-color:#bbbbbb;height:10px;width:11px;border-style:none;border-width:0.1px;" title="Korrekturabzug(üge) wurde(n) versendet (Marker 3)" attrs="{'invisible': [('work_marker_3','=',True)]}">
<div t-attf-style="background-color:{{record.get_marker_3_color.value}};height:10px;width:11px;border-style:none;border-width:0.1px;" title="Korrekturabzug(üge) wurde(n) versendet (Marker 3)">
</div>
<div t-attf-style="background-color:#bb0b0b;height:10px;width:11px;border-style:none;border-width:0.1px;" title="Korrekturabzug(üge) wurde(n) versendet (Marker 3)" attrs="{'invisible': [('work_marker_3','!=',True)]}">
</div>
<div t-attf-style="background-color:#bbbbbb;height:10px;width:11px;border-style:none;border-width:0.1px;" title="Auslieferung/Aufstellung wurde(n) versendet (Marker 4)" attrs="{'invisible': [('work_marker_4','=',True)]}">
</div>
<div t-attf-style="background-color:#bb0b0b;height:10px;width:11px;border-style:none;border-width:0.1px;" title="Auslieferung/Aufstellung wurde(n) versendet (Marker 4)" attrs="{'invisible': [('work_marker_4','!=',True)]}">
<div t-attf-style="background-color:{{record.get_marker_4_color.value}};height:10px;width:11px;border-style:none;border-width:0.1px;" title="Mailversendet Automatik Ablauf">
</div>
</div>
</div>
<div class="row" style="--gutter-x:10px;margin-bottom:0px" attrs="{'invisible': [('contract_state_minimal_kanban','=',True)]}">
<div class="col-12" t-attf-style="background-color:#BfBfBf;padding-left: 1px;height:13px;border-style:solid;border-width:0px;">
<div class="col-6" t-attf-style="background-color:#BfBfBf;padding-left: 1px;height:13px;border-style:solid;border-width:0px;">
<p style="font-size:10px;margin-bottom:0px">Arbeitsstand letzte Kampagne</p>
</div>
<div class="col-6" t-attf-style="background-color:#BfBfBf;padding-left: 1px;height:13px;border-style:solid;border-width:0px;">
<p style="font-size:10px;margin-bottom:0px;color:#000000;text-align:right;">1. Start : <field name="start_date"/></p>
</div>
</div>
<div class="row" style="--gutter-x:10px;">
<div class="col-4" t-attf-style="background-color:#BfBfBf;padding-left: 1px;height:13px;border-style:solid;border-width:0.2px;">
@ -1214,6 +1268,14 @@
<field name="state">code</field>
<field name="code">action = records.buildallText()</field>
</record>
<record id="action_create_cloud" model="ir.actions.server">
<field name="name">Cloudstruktur anlegen</field>
<field name="model_id" ref="model_dss_contracts"/>
<field name="binding_model_id" ref="model_dss_contracts"/>
<field name="binding_view_types">form</field>
<field name="state">code</field>
<field name="code">action = records.pyaction_create_cloud_structure_client()</field>
</record>
<record id="action_set_SaveViewState" model="ir.actions.server">
<field name="name">Zum Cloud-Ordner springen</field>

View File

@ -14,11 +14,12 @@
<field name="description"/>
</group>
<group>
<field name="maxsize_kb"/>
<field name="maxsize_h"/>
<field name="maxsize_w"/>
<field name="cloudlink"/>
<field name="filepartname"/>
<field name="maxsize_kb"/>
<field name="maxsize_h"/>
<field name="maxsize_w"/>
<field name="cloudlink"/>
<field name="archiv_cloudlink"/>
<field name="filepartname"/>
</group>
<notebook>
<page name="informations" string="Informationen">

View File

@ -27,24 +27,62 @@
<field name="arch" type="xml">
<form>
<sheet>
<group>
<div class="col-md-12">
<group name="basethings">
<field name="relname" string="Relationsname"/>
<field name="project" string="Projekt"/>
<field name="contract" string="Vertrag"/>
<field name="ad" string="Kampagnen-Zuordnung"/>
<field name="field" string="Feld-Zuordnung"/>
<field name="mediatype" string="Medium"/>
<field name="secured_ro" widget="boolean_toggle"/>
<field name="used_ro" widget="boolean_toggle"/>
<field name="mediafile" string="Medium-Inhalt" widget="image"/>
</group>
</group>
<field name="relname" string="Relationsname"/>
<field name="project" string="Projekt"/>
<field name="contract" string="Vertrag"/>
<field name="ad" string="Kampagnen-Zuordnung"/>
<field name="field" string="Feld-Zuordnung"/>
<field name="mediatype" string="Medium"/>
<field name="secured_ro" widget="boolean_toggle"/>
<field name="used_ro" widget="boolean_toggle"/>
<field name="mediafile" string="Medium-Inhalt" widget="image"/>
</group>
</div>
</sheet>
</form>
</field>
</record>
<record id="dss_media_add_form" model="ir.ui.view">
<field name="name">dss_media_add_form</field>
<field name="model">dss.mediarelations</field>
<field name="arch" type="xml">
<form>
<sheet>
<group name="basethings">
<field name="project" string="Projekt"/>
<field name="contract" string="Vertrag"/>
<field name="ad" string="Kampagnen-Zuordnung"/>
<field name="mediatype" string="Medium"/>
<field name="field" string="Feld-Zuordnung"/>
<field name="secured_ro" widget="boolean_toggle"/>
<field name="used_ro" widget="boolean_toggle"/>
<field name="mediafile" string="Medium-Inhalt" widget="image"/>
</group>
<notebook>
<page name="informations" string="Interne Informationen">
<group>
<field name="relname" string="Relationsname"/>
<field name="id" string="Interne Id" readonly="1"/>
<field name="uuid" string="Datensatz UUID" readonly="1"/>
</group>
</page>
<page name="chatter" string="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="activity_ids"/>
<field name="message_ids"/>
</div>
</page>
</notebook>
</sheet>
</form>
</field>
</record>
<record id="action_dss_mediarelations_view" model="ir.actions.act_window">
<field name="name">DigitalSignage mediarelations</field>
<field name="type">ir.actions.act_window</field>

View File

@ -71,6 +71,7 @@
<field name="standortpartner"/>
<field name="vertriebspartner"/>
<field name="project_grafiker"/>
<field name="project_techniker"/>
</group>
</page>
<page name="projektsettings" string="Projekteinstellungen">

View File

@ -137,7 +137,45 @@
</group>
</div>
</page>
<page name="webvertragseing" string="Web-Vertragseingänge Abläufe">
<page name="Markersettings" string="Markierungsfarben">
<div class="row">
<div class="col-8">
<group string="Markierungsfarben 1-2">
<field name="marker_1_color_used" widget="color"/>
<field name="marker_1_color_unused" widget="color"/>
<field name="marker_2_color_used" widget="color"/>
<field name="marker_2_color_unused" widget="color"/>
</group>
</div>
<div class="col-8">
<group string="Markierungsfarben 3">
<field name="marker_3_color_used" widget="color"/>
<field name="marker_3_color_unused" widget="color"/>
<field name="marker_3_color_value" widget="boolean_toggle"/>
<field name="marker_3_1_color_used" widget="color"/>
<field name="marker_3_1_color_unused" widget="color"/>
<field name="marker_3_1_color_value" widget="boolean_toggle"/>
<field name="marker_3_2_color_used" widget="color"/>
<field name="marker_3_2_color_unused" widget="color"/>
<field name="marker_3_2_color_value" widget="boolean_toggle"/>
</group>
</div>
<div class="col-8">
<group string="Markierungsfarben 4">
<field name="marker_4_color_used" widget="color"/>
<field name="marker_4_color_unused" widget="color"/>
<field name="marker_4_color_value" widget="boolean_toggle"/>
<field name="marker_4_1_color_used" widget="color"/>
<field name="marker_4_1_color_unused" widget="color"/>
<field name="marker_4_1_color_value" widget="boolean_toggle"/>
<field name="marker_4_2_color_used" widget="color"/>
<field name="marker_4_2_color_unused" widget="color"/>
<field name="marker_4_2_color_value" widget="boolean_toggle"/>
</group>
</div>
</div>
</page>
<page name="webvertragseing" string="Web-Vertragseingänge Abläufe">
<div class="col-6">
<group>
<field name="tv_vertragsankuendigung_actionID"></field>

View File

@ -12,7 +12,14 @@
<field name="triggeractiongroupname"/>
<field name="trigger_table"/>
<field name="trigger_list" />
<field name="trigger_list">
<tree string="Trigger">
<field name="triggeractionname"/>
<field name="triggeractiontyp"/>
<field name="triggeractionprio"/>
<field name="trigger_aktionen_active" widget="boolean_toogle"/>
</tree>
</field>
</group>
<notebook>
<page name="informations" string="Informationen">

View File

@ -34,6 +34,8 @@
<field name='email_fix_email' attrs="{'invisible': [('email_getfrom','!=','FIX')]}" />
<field name='email_data_table' attrs="{'invisible': [('email_getfrom','!=','DATA')]}" />
<field name='email_data_field' attrs="{'invisible': [('email_getfrom','!=','DATA')]}" />
<field name='email_has_attachments' widget="boolean_toggle" string="Email mit Anhang"/>
<field name='email_contract_attachment_types' widget="many2many_tags" options="{'no_create': True}" string="Dateitypen aus Vertrag" attrs="{'invisible': [('email_has_attachments','!=',True)]}"/>
</group>
</page>
<page name="InfoAusgaben" string="Info Ausgaben/Channel Posten ">

View File

@ -51,22 +51,22 @@
</field>
</record>
<record id="dss_triggerconditions_trigger_condition_view" model="ir.ui.view">
<!-- <record id="dss_triggerconditions_trigger_condition_view" model="ir.ui.view">
<field name="name">dss_triggerconditions_tree</field>
<field name="model">dss.triggerconditions</field>
<field name="priority" eval="16"/>
<field name="arch" type="xml">
<trigger_condition_view string="Trigger Aktionen">
<field name="triggerconditionname"/>
</tree>
</trigger_condition_view>
</field>
</record>
-->
<record id="action_dss_triggerconditions_view" model="ir.actions.act_window">
<field name="name">DigitalSignage TriggerBedingungen</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">dss.triggerconditions</field>
<field name="view_mode">tree,form,trigger_condition_view</field>
<field name="view_mode">tree,form</field>
<field name="context">{}</field>
<field name="help" type="html">
<p class="'o_view_nocontent_smiling_face">

View File

@ -53,6 +53,7 @@
</field>
</record>
<record id="action_dss_trigger_groups_view" model="ir.actions.act_window">
<field name="name">DigitalSignage Trigger Gruppen</field>
<field name="type">ir.actions.act_window</field>

View File

@ -90,11 +90,21 @@
</field>
</record>
<record id="dss_trigger_trigger_condition_view" model="ir.ui.view">
<field name="name">dss_trigger_trigger_condition_view</field>
<field name="model">dss.triggertypes</field>
<field name="priority" eval="16"/>
<field name="arch" type="xml">
<trigger_condition_view string="Trigger Aktionen">
</trigger_condition_view>
</field>
</record>
<record id="action_dss_trigger_view" model="ir.actions.act_window">
<field name="name">DigitalSignage Trigger</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">dss.triggertypes</field>
<field name="view_mode">tree,form</field>
<field name="view_mode">trigger_condition_view,tree,form</field>
<field name="context">{}</field>
<field name="help" type="html">
<p class="'o_view_nocontent_smiling_face">

View File

@ -207,6 +207,14 @@
action="action_dss_mediarelations_view"
sequence="60"/>
<menuitem
id="menu_dss_binaries_systems"
name="Vertrag Binaries "
parent="menu_dss_div_internsetup"
action="action_dss_binaries_view"
sequence="61"/>
<menuitem
id="menu_dss_hardware_configurationen"
name="Hard.-/Software"
@ -413,20 +421,7 @@
action="action_dss_import_view"
sequence="10"/>
<menuitem
id="menu_dss_screendesign"
name="Screendesigner Tool"
parent="menu_dss_interntools"
action="dss_screenDesigner_action_dss_screenDesigner"
sequence="20"/>
<menuitem
id="menu_dss_screendesign_view"
name="Screendesigner View"
parent="menu_dss_interntools"
action="action_dss_screenDesigner_view"
sequence="30"/>
<menuitem
id="menu_dss_Nachrichten"
name="Mail Nachrichten"
@ -454,6 +449,13 @@
action="action_dss_main_m2mmail"
sequence="50"/>
<menuitem
id="menu_dss_linkmaillist"
name="TVLink Emailnachrichten"
parent="menu_dss_interntools"
action="action_dss_main_linkmail"
sequence="60"/>
<menuitem
id="menu_dss_contracts_ads_topics"
name="Werbethemen TV verwalten"