diff --git a/__manifest__.py b/__manifest__.py index fc89863..752ca5c 100755 --- a/__manifest__.py +++ b/__manifest__.py @@ -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/**/*', diff --git a/models/__init__.py b/models/__init__.py index dcd8048..28b2b15 100755 --- a/models/__init__.py +++ b/models/__init__.py @@ -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 \ No newline at end of file diff --git a/models/__pycache__/__init__.cpython-311.pyc b/models/__pycache__/__init__.cpython-311.pyc old mode 100755 new mode 100644 index 7aec4e9..a41095b Binary files a/models/__pycache__/__init__.cpython-311.pyc and b/models/__pycache__/__init__.cpython-311.pyc differ diff --git a/models/__pycache__/dss.cpython-311.pyc b/models/__pycache__/dss.cpython-311.pyc old mode 100755 new mode 100644 index 73520dc..7328b0b Binary files a/models/__pycache__/dss.cpython-311.pyc and b/models/__pycache__/dss.cpython-311.pyc differ diff --git a/models/__pycache__/dss_ads.cpython-311.pyc b/models/__pycache__/dss_ads.cpython-311.pyc old mode 100755 new mode 100644 index d8cc6a8..4a57736 Binary files a/models/__pycache__/dss_ads.cpython-311.pyc and b/models/__pycache__/dss_ads.cpython-311.pyc differ diff --git a/models/__pycache__/dss_contract.cpython-311.pyc b/models/__pycache__/dss_contract.cpython-311.pyc index f5529f0..7a2de2f 100644 Binary files a/models/__pycache__/dss_contract.cpython-311.pyc and b/models/__pycache__/dss_contract.cpython-311.pyc differ diff --git a/models/__pycache__/dss_marker.cpython-311.pyc b/models/__pycache__/dss_marker.cpython-311.pyc old mode 100755 new mode 100644 index ef9eb1e..ff8703e Binary files a/models/__pycache__/dss_marker.cpython-311.pyc and b/models/__pycache__/dss_marker.cpython-311.pyc differ diff --git a/models/__pycache__/dss_onlinestate.cpython-311.pyc b/models/__pycache__/dss_onlinestate.cpython-311.pyc old mode 100755 new mode 100644 index 8bfdc61..d723946 Binary files a/models/__pycache__/dss_onlinestate.cpython-311.pyc and b/models/__pycache__/dss_onlinestate.cpython-311.pyc differ diff --git a/models/__pycache__/dss_projects.cpython-311.pyc b/models/__pycache__/dss_projects.cpython-311.pyc index e7f7cfa..f6e2744 100644 Binary files a/models/__pycache__/dss_projects.cpython-311.pyc and b/models/__pycache__/dss_projects.cpython-311.pyc differ diff --git a/models/__pycache__/dss_settings.cpython-311.pyc b/models/__pycache__/dss_settings.cpython-311.pyc index b88e3de..0c67b50 100644 Binary files a/models/__pycache__/dss_settings.cpython-311.pyc and b/models/__pycache__/dss_settings.cpython-311.pyc differ diff --git a/models/__pycache__/dss_trigger.cpython-311.pyc b/models/__pycache__/dss_trigger.cpython-311.pyc index 81c230d..7620446 100644 Binary files a/models/__pycache__/dss_trigger.cpython-311.pyc and b/models/__pycache__/dss_trigger.cpython-311.pyc differ diff --git a/models/dss.py b/models/dss.py index 8c2f09e..88cd2fd 100755 --- a/models/dss.py +++ b/models/dss.py @@ -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'}) \ No newline at end of file + 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'}) + diff --git a/models/dss_ads.py b/models/dss_ads.py index 8be9ed2..fd47de2 100755 --- a/models/dss_ads.py +++ b/models/dss_ads.py @@ -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) diff --git a/models/dss_contract.py b/models/dss_contract.py index aebe85f..97df1ef 100755 --- a/models/dss_contract.py +++ b/models/dss_contract.py @@ -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 + diff --git a/models/dss_marker.py b/models/dss_marker.py index cf83448..d2e56aa 100755 --- a/models/dss_marker.py +++ b/models/dss_marker.py @@ -37,4 +37,8 @@ class dssmarker(models.Model): @api.model def _default_uuid(self): - return str(uuid.uuid4()) \ No newline at end of file + return str(uuid.uuid4()) + + @api.model + def readmarker(self): + return self.env['dss.marker'].browse() \ No newline at end of file diff --git a/models/dss_projects.py b/models/dss_projects.py index 4128b97..b891795 100755 --- a/models/dss_projects.py +++ b/models/dss_projects.py @@ -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) diff --git a/models/dss_settings.py b/models/dss_settings.py index b19034a..46d40f2 100755 --- a/models/dss_settings.py +++ b/models/dss_settings.py @@ -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): diff --git a/models/dss_trigger.py b/models/dss_trigger.py index 4108950..1caeef2 100755 --- a/models/dss_trigger.py +++ b/models/dss_trigger.py @@ -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)) diff --git a/security/ir.model.access.csv b/security/ir.model.access.csv index 4fa90b3..2eddb08 100755 --- a/security/ir.model.access.csv +++ b/security/ir.model.access.csv @@ -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 \ No newline at end of file +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 \ No newline at end of file diff --git a/static/src/js/dss_screenview_model.js b/static/src/js/dss_screenview_model.js index f6cb989..5bca432 100755 --- a/static/src/js/dss_screenview_model.js +++ b/static/src/js/dss_screenview_model.js @@ -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 diff --git a/static/src/scss/style.scss b/static/src/scss/style.scss index 1f0be57..3eb50b4 100755 --- a/static/src/scss/style.scss +++ b/static/src/scss/style.scss @@ -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; + } + diff --git a/static/src/xml/dss_screenview_controller.xml b/static/src/xml/dss_screenview_controller.xml index 48a4053..e053e75 100755 --- a/static/src/xml/dss_screenview_controller.xml +++ b/static/src/xml/dss_screenview_controller.xml @@ -3,7 +3,7 @@ - +

Scrollraum

diff --git a/temp/temp.temp b/temp/temp.temp index e69de29..2b7b2b0 100755 Binary files a/temp/temp.temp and b/temp/temp.temp differ diff --git a/views/dss_ads.xml b/views/dss_ads.xml index e9f9ad9..b240eae 100755 --- a/views/dss_ads.xml +++ b/views/dss_ads.xml @@ -218,9 +218,9 @@ - - - + + + diff --git a/views/dss_contracts.xml b/views/dss_contracts.xml index f7a93f1..188f3f5 100755 --- a/views/dss_contracts.xml +++ b/views/dss_contracts.xml @@ -364,6 +364,7 @@
+
@@ -371,11 +372,14 @@
- + - + + + +
@@ -549,8 +553,9 @@
- - + + + @@ -750,6 +755,11 @@ + + + + + @@ -759,11 +769,6 @@ - - - - -
@@ -837,21 +842,26 @@ - + - - - - - -
-
+
-
-
-
-
-
+
-
+
-
-
-
-
-
+
-
+

Arbeitsstand letzte Kampagne

+
+

1. Start :

+
@@ -1214,6 +1268,14 @@ code action = records.buildallText() + + Cloudstruktur anlegen + + + form + code + action = records.pyaction_create_cloud_structure_client() + Zum Cloud-Ordner springen diff --git a/views/dss_mediafiles.xml b/views/dss_mediafiles.xml index df25c52..6131529 100755 --- a/views/dss_mediafiles.xml +++ b/views/dss_mediafiles.xml @@ -14,11 +14,12 @@ - - - - - + + + + + + diff --git a/views/dss_mediarelations.xml b/views/dss_mediarelations.xml index 06631b7..561785b 100755 --- a/views/dss_mediarelations.xml +++ b/views/dss_mediarelations.xml @@ -27,24 +27,62 @@
- +
- - - - - - - - - - - + + + + + + + + + + +
+ + dss_media_add_form + dss.mediarelations + +
+ + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+
+
+
+
+
+ + DigitalSignage mediarelations ir.actions.act_window diff --git a/views/dss_projects.xml b/views/dss_projects.xml index 23775dc..cf2c452 100755 --- a/views/dss_projects.xml +++ b/views/dss_projects.xml @@ -71,6 +71,7 @@ + diff --git a/views/dss_settings.xml b/views/dss_settings.xml index 0430047..04c3b9e 100755 --- a/views/dss_settings.xml +++ b/views/dss_settings.xml @@ -137,7 +137,45 @@
- + +
+
+ + + + + + +
+
+ + + + + + + + + + + +
+
+ + + + + + + + + + + +
+
+
+
diff --git a/views/dss_trigger_action_groups.xml b/views/dss_trigger_action_groups.xml index 2a2a304..1b7a62a 100755 --- a/views/dss_trigger_action_groups.xml +++ b/views/dss_trigger_action_groups.xml @@ -12,7 +12,14 @@ - + + + + + + + + diff --git a/views/dss_trigger_actions.xml b/views/dss_trigger_actions.xml index 29406b8..fc39061 100755 --- a/views/dss_trigger_actions.xml +++ b/views/dss_trigger_actions.xml @@ -34,6 +34,8 @@ + + diff --git a/views/dss_trigger_conditions.xml b/views/dss_trigger_conditions.xml index 57728d4..19f1d02 100755 --- a/views/dss_trigger_conditions.xml +++ b/views/dss_trigger_conditions.xml @@ -51,22 +51,22 @@ - + DigitalSignage TriggerBedingungen ir.actions.act_window dss.triggerconditions - tree,form,trigger_condition_view + tree,form {}

diff --git a/views/dss_trigger_groups.xml b/views/dss_trigger_groups.xml index 475ee2a..e469b7d 100755 --- a/views/dss_trigger_groups.xml +++ b/views/dss_trigger_groups.xml @@ -53,6 +53,7 @@ + DigitalSignage Trigger Gruppen ir.actions.act_window diff --git a/views/dss_triggertypes.xml b/views/dss_triggertypes.xml index 25a2c59..a226af7 100755 --- a/views/dss_triggertypes.xml +++ b/views/dss_triggertypes.xml @@ -90,11 +90,21 @@ + + dss_trigger_trigger_condition_view + dss.triggertypes + + + + + + + DigitalSignage Trigger ir.actions.act_window dss.triggertypes - tree,form + trigger_condition_view,tree,form {}

diff --git a/views/menu.xml b/views/menu.xml index 33c1061..4041d32 100755 --- a/views/menu.xml +++ b/views/menu.xml @@ -207,6 +207,14 @@ action="action_dss_mediarelations_view" sequence="60"/> + + + - - - - + + +