diff --git a/controllers/__pycache__/__init__.cpython-311.pyc b/controllers/__pycache__/__init__.cpython-311.pyc index 832b7ad..b67ee90 100755 Binary files a/controllers/__pycache__/__init__.cpython-311.pyc and b/controllers/__pycache__/__init__.cpython-311.pyc differ diff --git a/controllers/__pycache__/dss_screendesigner_controller.cpython-311.pyc b/controllers/__pycache__/dss_screendesigner_controller.cpython-311.pyc index 93828c7..2008401 100755 Binary files a/controllers/__pycache__/dss_screendesigner_controller.cpython-311.pyc and b/controllers/__pycache__/dss_screendesigner_controller.cpython-311.pyc differ diff --git a/controllers/__pycache__/main.cpython-311.pyc b/controllers/__pycache__/main.cpython-311.pyc index b6f15cf..2b29ea3 100755 Binary files a/controllers/__pycache__/main.cpython-311.pyc and b/controllers/__pycache__/main.cpython-311.pyc differ diff --git a/models/__pycache__/__init__.cpython-311.pyc b/models/__pycache__/__init__.cpython-311.pyc old mode 100644 new mode 100755 index d0c9eea..7aec4e9 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 index 3ce6542..73520dc 100755 Binary files a/models/__pycache__/dss.cpython-311.pyc and b/models/__pycache__/dss.cpython-311.pyc differ diff --git a/models/__pycache__/dss_activity_mixin.cpython-311.pyc b/models/__pycache__/dss_activity_mixin.cpython-311.pyc index 34cddd7..f70b6af 100755 Binary files a/models/__pycache__/dss_activity_mixin.cpython-311.pyc and b/models/__pycache__/dss_activity_mixin.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 98f3598..6b3ecf7 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_advertisefields.cpython-311.pyc b/models/__pycache__/dss_advertisefields.cpython-311.pyc index 0656776..401b291 100755 Binary files a/models/__pycache__/dss_advertisefields.cpython-311.pyc and b/models/__pycache__/dss_advertisefields.cpython-311.pyc differ diff --git a/models/__pycache__/dss_advertisefields_templates.cpython-311.pyc b/models/__pycache__/dss_advertisefields_templates.cpython-311.pyc index c73b6ba..05edd48 100755 Binary files a/models/__pycache__/dss_advertisefields_templates.cpython-311.pyc and b/models/__pycache__/dss_advertisefields_templates.cpython-311.pyc differ diff --git a/models/__pycache__/dss_contract.cpython-311.pyc b/models/__pycache__/dss_contract.cpython-311.pyc index 3ec6144..8755b38 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_display_templates.cpython-311.pyc b/models/__pycache__/dss_display_templates.cpython-311.pyc index 136eaf0..46588a8 100755 Binary files a/models/__pycache__/dss_display_templates.cpython-311.pyc and b/models/__pycache__/dss_display_templates.cpython-311.pyc differ diff --git a/models/__pycache__/dss_importinvoicelist.cpython-311.pyc b/models/__pycache__/dss_importinvoicelist.cpython-311.pyc index b9a56de..2990f54 100755 Binary files a/models/__pycache__/dss_importinvoicelist.cpython-311.pyc and b/models/__pycache__/dss_importinvoicelist.cpython-311.pyc differ diff --git a/models/__pycache__/dss_invoices.cpython-311.pyc b/models/__pycache__/dss_invoices.cpython-311.pyc index b5ec8c1..5165db0 100755 Binary files a/models/__pycache__/dss_invoices.cpython-311.pyc and b/models/__pycache__/dss_invoices.cpython-311.pyc differ diff --git a/models/__pycache__/dss_m2mmail.cpython-311.pyc b/models/__pycache__/dss_m2mmail.cpython-311.pyc old mode 100644 new mode 100755 index 7094b7f..10a677f Binary files a/models/__pycache__/dss_m2mmail.cpython-311.pyc and b/models/__pycache__/dss_m2mmail.cpython-311.pyc differ diff --git a/models/__pycache__/dss_marker.cpython-311.pyc b/models/__pycache__/dss_marker.cpython-311.pyc index 331aedb..ef9eb1e 100755 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 index 7a81c9c..8bfdc61 100755 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 4658dc1..bc6b7e0 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_provision.cpython-311.pyc b/models/__pycache__/dss_provision.cpython-311.pyc index 6990432..16fb79e 100755 Binary files a/models/__pycache__/dss_provision.cpython-311.pyc and b/models/__pycache__/dss_provision.cpython-311.pyc differ diff --git a/models/__pycache__/dss_provisionstypen.cpython-311.pyc b/models/__pycache__/dss_provisionstypen.cpython-311.pyc index 0cb1313..687234c 100755 Binary files a/models/__pycache__/dss_provisionstypen.cpython-311.pyc and b/models/__pycache__/dss_provisionstypen.cpython-311.pyc differ diff --git a/models/__pycache__/dss_settings.cpython-311.pyc b/models/__pycache__/dss_settings.cpython-311.pyc old mode 100644 new mode 100755 index 8eb6872..5c6b14b 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 old mode 100644 new mode 100755 index 5ad6824..4e40a3e Binary files a/models/__pycache__/dss_trigger.cpython-311.pyc and b/models/__pycache__/dss_trigger.cpython-311.pyc differ diff --git a/models/__pycache__/dss_triggerexecute.cpython-311.pyc b/models/__pycache__/dss_triggerexecute.cpython-311.pyc index 064aa0a..5be6850 100755 Binary files a/models/__pycache__/dss_triggerexecute.cpython-311.pyc and b/models/__pycache__/dss_triggerexecute.cpython-311.pyc differ diff --git a/models/__pycache__/dss_triggervalues.cpython-311.pyc b/models/__pycache__/dss_triggervalues.cpython-311.pyc index dc1d543..c811f81 100755 Binary files a/models/__pycache__/dss_triggervalues.cpython-311.pyc and b/models/__pycache__/dss_triggervalues.cpython-311.pyc differ diff --git a/models/__pycache__/dss_web_contracts.cpython-311.pyc b/models/__pycache__/dss_web_contracts.cpython-311.pyc old mode 100755 new mode 100644 index 1e4b48c..7fe69c9 Binary files a/models/__pycache__/dss_web_contracts.cpython-311.pyc and b/models/__pycache__/dss_web_contracts.cpython-311.pyc differ diff --git a/models/__pycache__/dss_zahlungen.cpython-311.pyc b/models/__pycache__/dss_zahlungen.cpython-311.pyc index 428e252..14fba31 100755 Binary files a/models/__pycache__/dss_zahlungen.cpython-311.pyc and b/models/__pycache__/dss_zahlungen.cpython-311.pyc differ diff --git a/models/__pycache__/dsslogger.cpython-311.pyc b/models/__pycache__/dsslogger.cpython-311.pyc old mode 100644 new mode 100755 index 4e892c7..f66faff Binary files a/models/__pycache__/dsslogger.cpython-311.pyc and b/models/__pycache__/dsslogger.cpython-311.pyc differ diff --git a/models/dss_ads.py b/models/dss_ads.py index e00e2a9..840ce29 100755 --- a/models/dss_ads.py +++ b/models/dss_ads.py @@ -164,6 +164,8 @@ class dsscontractads(models.Model): date_remove_planed = fields.Date(string='geplantes Enddatum', tracking=True) date_remove_real = fields.Date(string='wirkliches Enddatum', tracking=True) + special_reason = fields.Char('Sonderinformation',tracking=True) + @api.depends('date_korrekturfreigabe_ablauf') def _date_korrekturfreigabe_ablauf_compute(self): self.date_korrekturfreigabe_ablauf_compute = '' diff --git a/models/dss_contract.py b/models/dss_contract.py index b478fbe..c5da4b2 100755 --- a/models/dss_contract.py +++ b/models/dss_contract.py @@ -275,12 +275,23 @@ class dsscontracts(models.Model): cloudlink = fields.Char('Cloud Verzeichnis',help='Verzeichnis für den Kunde innerhalb des Projekt Ordners') + + web_contract = fields.Many2one('dss.web_contracts' , string='Web_Vertrag', store=True,tracking=True) tv_reach_PLZ = fields.Char(string='Reichweite PLZ',tracking=True) ads_radius_PLZ = fields.Integer('Umkreis PLZ in Km',tracking=True) ads_count_perYear = fields.Selection([('30000','30.000'),('60000','60.000'),('120000','120.000'),('1000000','1.000.000')],'Einblendungen',tracking=True) ads_topics = fields.Many2many('dss.contracts_ads_topics', string='Themenliste', tracking=True) + ads_topics_text = fields.Char('Themenliste gesamt',compute='_compute_themenliste') + + @api.depends('ads_topics') + def _compute_themenliste(self): + _logger.info('Contract Themenliste Berechnung : C_' + str(self.id)) + for record in self: + if record.ads_topics: + record.ads_topics_text = ', '.join(record.ads_topics.mapped('thema')) + else: + record.ads_topics_text = '' - @api.depends('vertragssumme') def _compute_prov(self): diff --git a/models/dss_projects.py b/models/dss_projects.py index 25facb7..db41dde 100755 --- a/models/dss_projects.py +++ b/models/dss_projects.py @@ -190,7 +190,7 @@ class dssprojects(models.Model): return { 'type': 'ir.actions.act_window', 'view_type':'kanban', - 'view_mode':'kanban,tree', + 'view_mode':'kanban,tree,screenview', 'res_model':'dss.contracts', 'target':'current', 'context':'{"default_project":'+str(self.id)+',"show_project_update":True}', diff --git a/models/dss_web_contracts.py b/models/dss_web_contracts.py index cd7490a..55f8e55 100755 --- a/models/dss_web_contracts.py +++ b/models/dss_web_contracts.py @@ -189,6 +189,7 @@ class dsscontracts(models.Model): 'tv_reach_PLZ': self.tv_reach_PLZ, 'ads_radius_PLZ': self.ads_radius_PLZ, 'ads_topics': self.ads_topics, + 'web_contract':self.id, 'contract_auto_extend': self.contract_auto_extend, 'contract_date': self.contract_date, 'work_state_info': self.remark, diff --git a/models/dsslogger.py b/models/dsslogger.py old mode 100644 new mode 100755 diff --git a/static/src/img/img_113_b.jpg b/static/src/img/img_113_b.jpg old mode 100755 new mode 100644 diff --git a/static/src/img/img_113_b_2.jpg b/static/src/img/img_113_b_2.jpg old mode 100755 new mode 100644 diff --git a/static/src/img/img_113_b_3.jpg b/static/src/img/img_113_b_3.jpg old mode 100755 new mode 100644 diff --git a/static/src/img/img_115_b.jpg b/static/src/img/img_115_b.jpg old mode 100755 new mode 100644 diff --git a/static/src/img/img_117_b.jpg b/static/src/img/img_117_b.jpg old mode 100755 new mode 100644 diff --git a/static/src/img/img_119_b.jpg b/static/src/img/img_119_b.jpg old mode 100755 new mode 100644 diff --git a/static/src/img/img_119_b_2.jpg b/static/src/img/img_119_b_2.jpg old mode 100755 new mode 100644 diff --git a/static/src/img/img_119_b_3.jpg b/static/src/img/img_119_b_3.jpg old mode 100755 new mode 100644 diff --git a/static/src/img/img_121_b.jpg b/static/src/img/img_121_b.jpg old mode 100755 new mode 100644 diff --git a/static/src/img/img_134_b.jpg b/static/src/img/img_134_b.jpg old mode 100755 new mode 100644 diff --git a/static/src/img/img_134_b_2.jpg b/static/src/img/img_134_b_2.jpg old mode 100755 new mode 100644 diff --git a/static/src/img/img_134_b_3.jpg b/static/src/img/img_134_b_3.jpg old mode 100755 new mode 100644 diff --git a/static/src/img/img_135_b.jpg b/static/src/img/img_135_b.jpg old mode 100755 new mode 100644 diff --git a/static/src/img/img_137_b.jpg b/static/src/img/img_137_b.jpg old mode 100755 new mode 100644 diff --git a/static/src/img/img_137_b_2.jpg b/static/src/img/img_137_b_2.jpg old mode 100755 new mode 100644 diff --git a/static/src/img/img_137_b_3.jpg b/static/src/img/img_137_b_3.jpg old mode 100755 new mode 100644 diff --git a/static/src/img/img_138_b.jpg b/static/src/img/img_138_b.jpg old mode 100755 new mode 100644 diff --git a/static/src/img/img_138_b_2.jpg b/static/src/img/img_138_b_2.jpg old mode 100755 new mode 100644 diff --git a/static/src/img/img_138_b_3.jpg b/static/src/img/img_138_b_3.jpg old mode 100755 new mode 100644 diff --git a/static/src/img/img_146_b.jpg b/static/src/img/img_146_b.jpg old mode 100755 new mode 100644 diff --git a/static/src/img/img_146_b_2.jpg b/static/src/img/img_146_b_2.jpg old mode 100755 new mode 100644 diff --git a/static/src/img/img_146_b_3.jpg b/static/src/img/img_146_b_3.jpg old mode 100755 new mode 100644 diff --git a/static/src/img/img_14_b.jpg b/static/src/img/img_14_b.jpg old mode 100755 new mode 100644 diff --git a/static/src/img/img_14_b_2.jpg b/static/src/img/img_14_b_2.jpg old mode 100755 new mode 100644 diff --git a/static/src/img/img_14_b_3.jpg b/static/src/img/img_14_b_3.jpg old mode 100755 new mode 100644 diff --git a/static/src/img/img_150_b.jpg b/static/src/img/img_150_b.jpg old mode 100755 new mode 100644 diff --git a/static/src/img/img_150_b_2.jpg b/static/src/img/img_150_b_2.jpg old mode 100755 new mode 100644 diff --git a/static/src/img/img_150_b_3.jpg b/static/src/img/img_150_b_3.jpg old mode 100755 new mode 100644 diff --git a/static/src/img/img_151_b.jpg b/static/src/img/img_151_b.jpg old mode 100755 new mode 100644 diff --git a/static/src/img/img_151_b_2.jpg b/static/src/img/img_151_b_2.jpg old mode 100755 new mode 100644 diff --git a/static/src/img/img_151_b_3.jpg b/static/src/img/img_151_b_3.jpg old mode 100755 new mode 100644 diff --git a/static/src/img/img_17_b.jpg b/static/src/img/img_17_b.jpg old mode 100755 new mode 100644 diff --git a/static/src/img/img_18_b.jpg b/static/src/img/img_18_b.jpg old mode 100755 new mode 100644 diff --git a/static/src/img/img_21_b.jpg b/static/src/img/img_21_b.jpg old mode 100755 new mode 100644 diff --git a/static/src/img/img_21_b_2.jpg b/static/src/img/img_21_b_2.jpg old mode 100755 new mode 100644 diff --git a/static/src/img/img_21_b_3.jpg b/static/src/img/img_21_b_3.jpg old mode 100755 new mode 100644 diff --git a/static/src/img/img_4_b.jpg b/static/src/img/img_4_b.jpg old mode 100755 new mode 100644 diff --git a/static/src/img/img_4_b_2.jpg b/static/src/img/img_4_b_2.jpg old mode 100755 new mode 100644 diff --git a/static/src/img/img_5_b.jpg b/static/src/img/img_5_b.jpg old mode 100755 new mode 100644 diff --git a/static/src/img/img_62_b.jpg b/static/src/img/img_62_b.jpg old mode 100755 new mode 100644 diff --git a/static/src/img/img_62_b_2.jpg b/static/src/img/img_62_b_2.jpg old mode 100755 new mode 100644 diff --git a/static/src/img/img_62_b_3.jpg b/static/src/img/img_62_b_3.jpg old mode 100755 new mode 100644 diff --git a/static/src/img/img_63_b.jpg b/static/src/img/img_63_b.jpg old mode 100755 new mode 100644 diff --git a/static/src/img/img_63_b_2.jpg b/static/src/img/img_63_b_2.jpg old mode 100755 new mode 100644 diff --git a/static/src/img/img_63_b_3.jpg b/static/src/img/img_63_b_3.jpg old mode 100755 new mode 100644 diff --git a/static/src/img/img_65_b.jpg b/static/src/img/img_65_b.jpg old mode 100755 new mode 100644 diff --git a/static/src/img/img_65_b_2.jpg b/static/src/img/img_65_b_2.jpg old mode 100755 new mode 100644 diff --git a/static/src/img/img_65_b_3.jpg b/static/src/img/img_65_b_3.jpg old mode 100755 new mode 100644 diff --git a/static/src/img/img_66_b.jpg b/static/src/img/img_66_b.jpg old mode 100755 new mode 100644 diff --git a/static/src/img/img_66_b_2.jpg b/static/src/img/img_66_b_2.jpg old mode 100755 new mode 100644 diff --git a/static/src/img/img_66_b_3.jpg b/static/src/img/img_66_b_3.jpg old mode 100755 new mode 100644 diff --git a/static/src/img/img_67_b.jpg b/static/src/img/img_67_b.jpg old mode 100755 new mode 100644 diff --git a/static/src/img/img_68_b.jpg b/static/src/img/img_68_b.jpg old mode 100755 new mode 100644 diff --git a/static/src/img/img_69_b.jpg b/static/src/img/img_69_b.jpg old mode 100755 new mode 100644 diff --git a/static/src/img/img_70_b.jpg b/static/src/img/img_70_b.jpg old mode 100755 new mode 100644 diff --git a/static/src/img/img_70_b_2.jpg b/static/src/img/img_70_b_2.jpg old mode 100755 new mode 100644 diff --git a/static/src/img/img_71_b.jpg b/static/src/img/img_71_b.jpg old mode 100755 new mode 100644 diff --git a/static/src/img/img_72_b.jpg b/static/src/img/img_72_b.jpg old mode 100755 new mode 100644 diff --git a/static/src/img/img_72_b_2.jpg b/static/src/img/img_72_b_2.jpg old mode 100755 new mode 100644 diff --git a/static/src/img/img_72_b_3.jpg b/static/src/img/img_72_b_3.jpg old mode 100755 new mode 100644 diff --git a/static/src/img/img_73_b.jpg b/static/src/img/img_73_b.jpg old mode 100755 new mode 100644 diff --git a/static/src/img/img_74_b.jpg b/static/src/img/img_74_b.jpg old mode 100755 new mode 100644 diff --git a/static/src/img/img_74_b_2.jpg b/static/src/img/img_74_b_2.jpg old mode 100755 new mode 100644 diff --git a/static/src/img/img_74_b_3.jpg b/static/src/img/img_74_b_3.jpg old mode 100755 new mode 100644 diff --git a/static/src/img/img_76_b.jpg b/static/src/img/img_76_b.jpg old mode 100755 new mode 100644 diff --git a/static/src/img/img_77_b.jpg b/static/src/img/img_77_b.jpg old mode 100755 new mode 100644 diff --git a/static/src/img/img_78_b.jpg b/static/src/img/img_78_b.jpg old mode 100755 new mode 100644 diff --git a/static/src/img/img_79_b.jpg b/static/src/img/img_79_b.jpg old mode 100755 new mode 100644 diff --git a/static/src/img/img_79_b_2.jpg b/static/src/img/img_79_b_2.jpg old mode 100755 new mode 100644 diff --git a/static/src/img/img_79_b_3.jpg b/static/src/img/img_79_b_3.jpg old mode 100755 new mode 100644 diff --git a/static/src/img/img_81_b.jpg b/static/src/img/img_81_b.jpg old mode 100755 new mode 100644 diff --git a/static/src/img/img_81_b_2.jpg b/static/src/img/img_81_b_2.jpg old mode 100755 new mode 100644 diff --git a/static/src/img/img_81_b_3.jpg b/static/src/img/img_81_b_3.jpg old mode 100755 new mode 100644 diff --git a/static/src/img/img_83_b.jpg b/static/src/img/img_83_b.jpg old mode 100755 new mode 100644 diff --git a/static/src/img/img_84_b.jpg b/static/src/img/img_84_b.jpg old mode 100755 new mode 100644 diff --git a/static/src/img/img_85_b.jpg b/static/src/img/img_85_b.jpg old mode 100755 new mode 100644 diff --git a/static/src/img/img_86_b.jpg b/static/src/img/img_86_b.jpg old mode 100755 new mode 100644 diff --git a/static/src/img/img_87_b.jpg b/static/src/img/img_87_b.jpg old mode 100755 new mode 100644 diff --git a/static/src/img/img_88_b.jpg b/static/src/img/img_88_b.jpg old mode 100755 new mode 100644 diff --git a/static/src/img/img_90_b.jpg b/static/src/img/img_90_b.jpg old mode 100755 new mode 100644 diff --git a/static/src/img/img_90_b_2.jpg b/static/src/img/img_90_b_2.jpg old mode 100755 new mode 100644 diff --git a/static/src/img/img_90_b_3.jpg b/static/src/img/img_90_b_3.jpg old mode 100755 new mode 100644 diff --git a/static/src/img/img_91_b.jpg b/static/src/img/img_91_b.jpg old mode 100755 new mode 100644 diff --git a/static/src/img/img_92_b.jpg b/static/src/img/img_92_b.jpg old mode 100755 new mode 100644 diff --git a/static/src/img/img_92_b_3.jpg b/static/src/img/img_92_b_3.jpg old mode 100755 new mode 100644 diff --git a/static/src/img/img_93_b.jpg b/static/src/img/img_93_b.jpg old mode 100755 new mode 100644 diff --git a/static/src/img/img_94_b.jpg b/static/src/img/img_94_b.jpg old mode 100755 new mode 100644 diff --git a/static/src/img/img_94_b_2.jpg b/static/src/img/img_94_b_2.jpg old mode 100755 new mode 100644 diff --git a/static/src/img/img_94_b_3.jpg b/static/src/img/img_94_b_3.jpg old mode 100755 new mode 100644 diff --git a/static/src/img/img_96_b.jpg b/static/src/img/img_96_b.jpg old mode 100755 new mode 100644 diff --git a/static/src/img/img_97_b.jpg b/static/src/img/img_97_b.jpg old mode 100755 new mode 100644 diff --git a/static/src/img/img_98_b.jpg b/static/src/img/img_98_b.jpg old mode 100755 new mode 100644 diff --git a/static/src/img/img_98_b_2.jpg b/static/src/img/img_98_b_2.jpg old mode 100755 new mode 100644 diff --git a/static/src/img/img_99_b.jpg b/static/src/img/img_99_b.jpg old mode 100755 new mode 100644 diff --git a/static/src/js/dss_screenview_archparser.js b/static/src/js/dss_screenview_archparser.js index 041301c..f4e8b57 100755 --- a/static/src/js/dss_screenview_archparser.js +++ b/static/src/js/dss_screenview_archparser.js @@ -1,55 +1,115 @@ /** @odoo-module */ - +import { addFieldDependencies, archParseBoolean, getActiveActions } from "@web/views/utils"; +import { Field } from "@web/views/fields/field"; import { XMLParser } from "@web/core/utils/xml"; +import { Widget } from "@web/views/widgets/widget"; export class ScreenViewArchParser extends XMLParser { - parse(arch, fields = {}) { - const archInfo = { fields, fieldAttrs: {}, groupBy: [] }; - this.visitXML(arch, (node) => { - switch (node.tagName) { - case "field": { - alert('Field') - const fieldName = node.getAttribute("name"); // exists (rng validation) - if (fieldName === "id") { - break; - } - const string = node.getAttribute("string"); - if (string) { - if (!archInfo.fieldAttrs[fieldName]) { - archInfo.fieldAttrs[fieldName] = {}; - } - archInfo.fieldAttrs[fieldName].string = string; - } - const modifiers = JSON.parse(node.getAttribute("modifiers") || "{}"); - if (modifiers.invisible === true) { - if (!archInfo.fieldAttrs[fieldName]) { - archInfo.fieldAttrs[fieldName] = {}; - } - archInfo.fieldAttrs[fieldName].isInvisible = true; - break; - } - const isMeasure = node.getAttribute("type") === "measure"; - if (isMeasure) { - // the last field with type="measure" (if any) will be used as measure else __count - archInfo.measure = fieldName; - } else { - const { type } = archInfo.fields[fieldName]; // exists (rng validation) - if (GROUPABLE_TYPES.includes(type)) { - let groupBy = fieldName; - const interval = node.getAttribute("interval"); - if (interval) { - groupBy += `:${interval}`; - } - archInfo.groupBy.push(groupBy); - } - } - break; + parse(arch, models, modelName) { + const xmlDoc = this.parseXML(arch); + const jsClass = xmlDoc.getAttribute("js_class"); + const disableAutofocus = archParseBoolean(xmlDoc.getAttribute("disable_autofocus") || ""); + const activeActions = getActiveActions(xmlDoc); + const fieldNodes = {}; + const fieldNextIds = {}; + let autofocusFieldId = null; + const activeFields = {}; + alert("begin") + this.visitXML(xmlDoc, (node) => { + if (node.tagName === "field") { + alert('field') + const fieldInfo = Field.parseFieldNode(node, models, modelName, "form", jsClass); + let fieldId = fieldInfo.name; + if (fieldInfo.name in fieldNextIds) { + fieldId = `${fieldInfo.name}_${fieldNextIds[fieldInfo.name]++}`; + } else { + fieldNextIds[fieldInfo.name] = 1; } + fieldNodes[fieldId] = fieldInfo; + node.setAttribute("field_id", fieldId); + if (archParseBoolean(node.getAttribute("default_focus") || "")) { + autofocusFieldId = fieldId; + } + addFieldDependencies( + activeFields, + models[modelName], + fieldInfo.FieldComponent.fieldDependencies + ); + return false; + } else if (node.tagName === "div" && node.classList.contains("oe_chatter")) { + // remove this when chatter fields are declared as attributes on the root node + return false; + } else if (node.tagName === "widget") { + const { WidgetComponent } = Widget.parseWidgetNode(node); + addFieldDependencies( + activeFields, + models[modelName], + WidgetComponent.fieldDependencies + ); } }); - return archInfo; + // TODO: generate activeFields for the model based on fieldNodes (merge duplicated fields) + for (const fieldNode of Object.values(fieldNodes)) { + const fieldName = fieldNode.name; + if (activeFields[fieldName]) { + const { alwaysInvisible } = fieldNode; + activeFields[fieldName] = { + ...fieldNode, + // a field can only be considered to be always invisible + // if all its nodes are always invisible + alwaysInvisible: activeFields[fieldName].alwaysInvisible && alwaysInvisible, + }; + } else { + activeFields[fieldName] = fieldNode; + } + // const { onChange, modifiers } = fieldNode; + // let readonly = modifiers.readonly || []; + // let required = modifiers.required || []; + // if (activeFields[fieldNode.name]) { + // activeFields[fieldNode.name].readonly = Domain.combine([activeFields[fieldNode.name].readonly, readonly], "|"); + // activeFields[fieldNode.name].required = Domain.combine([activeFields[fieldNode.name].required, required], "|"); + // activeFields[fieldNode.name].onChange = activeFields[fieldNode.name].onChange || onChange; + // } else { + // activeFields[fieldNode.name] = { readonly, required, onChange }; + // } + } + return { + arch, + activeActions, + activeFields, + autofocusFieldId, + disableAutofocus, + fieldNodes, + xmlDoc, + __rawArch: arch, + }; } } +// parse(arch, fields = {}) { +// const archInfo = { fields, fieldAttrs: {}, groupBy: [] }; +// this.visitXML(arch, (node) => { +// switch (node.tagName) { +// case "field": { +// alert('Field') +// const fieldName = node.getAttribute("name"); // exists (rng validation) +// fieldNames.add(fieldName); +// if (fieldName === "id") { +// break; +// } +// const string = node.getAttribute("string"); +// if (string) { +// if (!archInfo.fieldAttrs[fieldName]) { +// archInfo.fieldAttrs[fieldName] = {}; +// } +// archInfo.fieldAttrs[fieldName].string = string; +// } +// break; +// } +// } +// }); +// return archInfo; +// } +//} // parse(arch) { // const xmlDoc = this.parseXML(arch); // const fieldFromTheArch = xmlDoc.getAttribute("fieldFromTheArch"); diff --git a/static/src/js/dss_screenview_controller.js b/static/src/js/dss_screenview_controller.js index 7eec9d0..df55263 100755 --- a/static/src/js/dss_screenview_controller.js +++ b/static/src/js/dss_screenview_controller.js @@ -1,27 +1,87 @@ /** @odoo-module **/ import { Layout } from "@web/search/layout"; -import {useService } from "@web/core/utils/hooks"; +import { useBus, useService } from "@web/core/utils/hooks"; +import { useModel } from "@web/views/model"; import { Component, onWillStart, useState} from "@odoo/owl"; + +const { onRendered } = owl; + export class ScreenViewController extends Component { setup() { - this.orm = useService("orm"); + alert('setup') +/* this.orm = useService("orm"); + this.dialogService = useService("dialog"); + this.router = useService("router"); + this.user = useService("user"); + this.viewService = useService("view"); + this.ui = useService("ui"); + this.state = useState({ + isDisabled: false, + fieldIsDirty: false, + }); + useBus(this.ui.bus, "resize", this.render); - // The controller create the model and make it reactive so whenever this.model is - // accessed and edited then it'll cause a rerendering - this.model = useState( - new this.props.Model( - this.orm, - this.props.resModel, - this.props.fields, - this.props.archInfo, - this.props.domain - ) + this.archInfo = this.props.archInfo; + const activeFields = this.archInfo.activeFields; + + this.beforeLoadResolver = null; + const beforeLoadProm = new Promise((r) => { + this.beforeLoadResolver = r; + }); + + const { create, edit } = this.archInfo.activeActions; + this.canCreate = create && !this.props.preventCreate; + this.canEdit = edit && !this.props.preventEdit; + + let mode = this.props.mode || "edit"; + if (!this.canEdit) { + mode = "readonly"; + } + + this.model = useModel( + this.props.Model, + { + resModel: this.props.resModel, + resId: this.props.resId || false, + resIds: this.props.resIds, + fields: this.props.fields, + activeFields, + viewMode: "form", + rootType: "record", + mode, + beforeLoadProm, + component: this, + }, + { + ignoreUseSampleModel: true, + } ); + */ + // The controller create the model and make it reactive so whenever this.model is + // accessed and edited then it'll cause a rerendering +// this.model = useState( +// new this.props.Model( +// this.orm, +// this.props.resModel, +// this.props.fields, +// this.props.archInfo, +// this.props.domain +// ) +// ); onWillStart(async () => { await this.model.load(); }); + + onRendered(() => { + this.env.config.setDisplayName(this.displayName()); + }); } + + displayName() { + return this.model.root.data.display_name || this.env._t("New"); + } + }; ScreenViewController.template = "dss.screenview"; diff --git a/static/src/js/dss_screenview_model.js b/static/src/js/dss_screenview_model.js index 6bc89a9..8975369 100755 --- a/static/src/js/dss_screenview_model.js +++ b/static/src/js/dss_screenview_model.js @@ -1,24 +1,27 @@ /** @odoo-module **/ import { KeepLast } from "@web/core/utils/concurrency"; +import { Model } from "@web/views/model"; -export class ScreenViewModel { - constructor(orm, resModel, fields, archInfo, domain) { - this.orm = orm; - this.resModel = resModel; - // We can access arch information parsed by the beautiful arch parser - const { fieldFromTheArch } = archInfo; - this.fieldFromTheArch = fieldFromTheArch; - this.fields = fields; - this.domain = domain; +export class ScreenViewModel extends Model { + setup(params) { + // concurrency management this.keepLast = new KeepLast(); + this.searchParams = { + context: {}, + domain: [], + domains: [], + groupBy: [], + }; + this.domain = [] } async load() { //The keeplast protect against concurrency call - const { length, records } = await this.keepLast.add( - this.orm.webSearchRead(this.resModel, this.domain, [this.fieldFromTheArch], {}) - ); - this.records = records; - this.recordsLength = length; + alert('load') +// const { length, records } = await this.keepLast.add( +// this.orm.webSearchRead(this.resModel, this.domain, [this.fieldFromTheArch], {}) +// ); +// this.records = records; +// this.recordsLength = length; } } \ No newline at end of file diff --git a/static/src/js/dss_screenview_register.js b/static/src/js/dss_screenview_register.js index afc9d99..e2e4a54 100755 --- a/static/src/js/dss_screenview_register.js +++ b/static/src/js/dss_screenview_register.js @@ -1,40 +1,75 @@ /** @odoo-module **/ -import { _lt } from "@web/core/l10n/translation"; -import { registry } from "@web/core/registry"; -import {ScreenViewRenderer} from "./dss_screenview_renderer"; -import {ScreenViewController} from "./dss_screenview_controller"; -import {ScreenViewArchParser} from "./dss_screenview_archparser"; -import {ScreenViewModel} from "./dss_screenview_model"; -//import {GridRelationalModel} from "./grid_relational_model"; -export const ScreenView = { - type: "screenview", - display_name: _lt("ScreenView"), - icon: "fa fa-th", - multiRecord: true, - Controller: ScreenViewController, - Renderer: ScreenViewRenderer, - ArchParser: ScreenViewArchParser, - Model: ScreenViewModel, - /** - * Function that returns the props for the grid view. - * @param {object} genericProps - Generic properties of the view. - * @param {object} view - The view object. - * @returns {object} Props for the grid view. - */ - props: (genericProps, view) => { - const {ArchParser,Model,Renderer} = view; - //const {arch,relatedModels,resModel} = genericProps; - const {arch, fields, resModel } = genericProps; - //const archInfo = new ArchParser().parse(arch, relatedModels, resModel); - const archInfo = parser.parse(arch, fields); - return { - ...genericProps, - archInfo, - Model: view.Model, - Renderer, - }; +import AbstractView from "web.AbstractView"; +import BasicView from "web.BasicView"; +import view_registry from 'web.view_registry'; +import { ScreenViewModel } from "./dss_screenview_model"; +import { ScreenViewController } from "./dss_screenview_controller"; +import { ScreenViewRenderer } from "./dss_screenview_renderer"; +import RendererWrapper from 'web.RendererWrapper'; + + +export const HelloWorldView = BasicView.extend({ + viewType: 'screenview', + config: _.extend({}, BasicView.prototype.config, { + Renderer: ScreenViewRenderer + }), + + getRenderer(parent, state) { + state = Object.assign({}, state, this.rendererParams); + return new RendererWrapper(null, this.config.Renderer, state); + }, +}); + +view_registry.add('screenview', HelloWorldView) + +return HelloWorldView; +ScreenViewModel + +// /* +// /** @odoo-module **/ +// import { _lt } from "@web/core/l10n/translation"; +// import { registry } from "@web/core/registry"; +// import { RelationalModel } from "@web/model/relational_model/relational_model"; +// import { ScreenViewRenderer } from "./dss_screenview_renderer"; +// import { ScreenViewController } from "./dss_screenview_controller"; +// import { ScreenViewArchParser } from "./dss_screenview_archparser"; +// import { ScreenViewModel } from "./dss_screenview_model"; +// //import {GridRelationalModel} from "./grid_relational_model"; +// export const ScreenView = { +// type: "screenview", +// display_name: _lt("ScreenView"), +// icon: "fa fa-th", +// multiRecord: true, +// Controller: ScreenViewController, +// Renderer: ScreenViewRenderer, +// ArchParser: ScreenViewArchParser, +// //Model: RelationalModel, +// Model: ScreenViewModel, +// /** +// * Function that returns the props for the grid view. +// * @param {object} genericProps - Generic properties of the view. +// * @param {object} view - The view object. +// * @returns {object} Props for the grid view. +// */ +// props: (genericProps, view) => { +// const { ArchParser, Model, Renderer } = view; +// const { arch, relatedModels, resModel } = genericProps; +// // const {arch, fields, resModel } = genericProps; +// //const archInfo = new ArchParser().parse(arch, relatedModels, resModel); +// //const archInfo = new ArchParser().parse(arch, Model, fields); +// const archInfo = new ArchParser().parse(arch, relatedModels, resModel); + +// return { +// ...genericProps, +// archInfo, +// Model: view.Model, +// Renderer, +// }; + +// } +// }; +// // Register the grid view configuration +// registry.category("views").add("screenview", ScreenView); + +// return ScreenView; - } -}; -// Register the grid view configuration -registry.category("views").add("screenview", ScreenView); \ No newline at end of file diff --git a/static/src/js/dss_screenview_renderer.js b/static/src/js/dss_screenview_renderer.js index 3db1fed..e994cd0 100755 --- a/static/src/js/dss_screenview_renderer.js +++ b/static/src/js/dss_screenview_renderer.js @@ -1,8 +1,83 @@ /** @odoo-module **/ -import { Component } from "@odoo/owl"; +import { useService } from "@web/core/utils/hooks"; +import { Component, markup, onWillStart, useRef, xml } from "@odoo/owl"; + export class ScreenViewRenderer extends Component { + aktcontext = ""; + async setup() { + alert('render '+JSON.stringify(this.props)) + this.rpc = useService("rpc"); + onWillStart(async () => { + this.willStart() + }); } + async willStart() { + var self = this; + await this.render_Screen() + } + + onMouseEnter(ev) { + //var index = [...ev.currentTarget.parentNode.children].indexOf(ev.currentTarget); + //if (ev.currentTarget.tagName === "TH") { + alert('MouseEnter') + } + + async render_Screen() { + var self = this; + alert('render_Screen '+this) + var meins = ""; + var templates = [] + var templates = ['MainSection']; + + if (this.props.domain =[]) { + var def0 =this.rpc({ + model: 'dss.display.templates', + method: "get_data", + args: [], + }).then(function (result) { + + var $dropdown = document.querySelector('.ddown') + + if (result.length>0) { + result.forEach(element => { + $dropdown.append(new Option(element.displayname, element.nr)); + }) + } + }) + } +// document.addEventListener("click",_onclickevent) +// document.addEventListener("change",_onchangeevent) + + if (this.props.domain != []) { + var def1 =this.rpc({ + model: 'dss.advertisefields.templates', + method: "get_data", + args: [[props.context.screenlayout]], + }).then(function (result) { + var displaycss = 'background-color:#38AFA0;float:left;border-style: solid;border-width: 0.1px;' + const element = document.querySelector('.meincanvas') + const rect = element.getBoundingClientRect(); + const topPosition = rect.top + window.scrollY; + var topstart = topPosition + 60 + var width = window.innerWidth-40; + var scale_faktor = (width / 3860) + var height = Math.round(2200 * scale_faktor) + meins = '
' + if (result.length>0) { + result.forEach(element => { + var ele_pos_x=element.pos_x*scale_faktor+20 + var ele_pos_y=element.pos_y*scale_faktor+topstart + var ele_pos_h=element.pos_h*scale_faktor + var ele_pos_w=element.pos_w*scale_faktor + meins = meins + '
'+element.feldname+'
' + }); + } + }) + } + + } } + ScreenViewRenderer.template = "dss.screenviewrenderer"; diff --git a/static/src/xml/dss_screenview_renderer.xml b/static/src/xml/dss_screenview_renderer.xml index 5642bb2..e2e9934 100755 --- a/static/src/xml/dss_screenview_renderer.xml +++ b/static/src/xml/dss_screenview_renderer.xml @@ -2,10 +2,11 @@ - - - // Show records - + + + +

Hello

\ No newline at end of file diff --git a/views/dss_ads.xml b/views/dss_ads.xml index 5c2c481..bc74864 100755 --- a/views/dss_ads.xml +++ b/views/dss_ads.xml @@ -49,6 +49,7 @@ +
diff --git a/views/dss_contracts.xml b/views/dss_contracts.xml index 512c73b..dd5db7d 100755 --- a/views/dss_contracts.xml +++ b/views/dss_contracts.xml @@ -20,6 +20,7 @@ + DigitalSignage Status Änderung ir.actions.act_window @@ -111,6 +112,16 @@ + + DigitalSignage Screen + dss.contracts + + + + + + + dss_project_contracts_tree dss.contracts @@ -260,6 +271,15 @@ --> + + dss_main_contracts_screenview + dss.contracts + + + + + + dss_main_contracts_form @@ -659,6 +679,10 @@ --> + + + + @@ -901,7 +925,8 @@ - + +
diff --git a/views/dss_projects.xml b/views/dss_projects.xml index 0a794c1..3958d1e 100755 --- a/views/dss_projects.xml +++ b/views/dss_projects.xml @@ -387,7 +387,7 @@ - + DigitalSignage Projekte ir.actions.act_window diff --git a/views/dss_screendesign.xml b/views/dss_screendesign.xml index 34daa42..9d4e2e2 100755 --- a/views/dss_screendesign.xml +++ b/views/dss_screendesign.xml @@ -14,7 +14,7 @@ My Grid View dss.screendesign - +