diff --git a/__manifest__.py b/__manifest__.py index ef5782c..47a4836 100755 --- a/__manifest__.py +++ b/__manifest__.py @@ -13,11 +13,13 @@ 'data': [ 'security/groups.xml', 'security/ir.model.access.csv', - 'views/dss_contracts.xml', + 'views/dss_contracts.xml', 'views/dss_marker.xml', 'views/dss_projectstate.xml', 'views/dss_systemtypen.xml', 'views/dss_mediarelations.xml', + 'views/dss_display_templates.xml', + 'views/dss_advertisementfields_templates.xml', 'views/dss_advertisementfields.xml', 'views/dss_projects.xml', 'views/dss_import.xml', @@ -26,6 +28,7 @@ 'views/dss_mediafiles.xml', 'views/dss_addstructures.xml', 'views/dss_geraetetypen.xml', + 'views/dss_onlinestate.xml', 'views/dss_texts.xml', 'views/dss_systems.xml', 'views/dss_screendesign.xml', diff --git a/models/__init__.py b/models/__init__.py index e67a7ec..ddf2f1c 100755 --- a/models/__init__.py +++ b/models/__init__.py @@ -1,5 +1,6 @@ from . import dss_activity_mixin from . import dss_marker +from . import dss_onlinestate from . import dss_settings from . import dss_trigger from . import dss_ads @@ -10,6 +11,8 @@ from . import dss_systemtypen from . import dss_software from . import dss_systems from . import dss_eventdays +from . import dss_display_templates +from . import dss_advertisefields_templates from . import dss_advertisefields from . import dss_trigger from . import dss_triggerexecute @@ -24,4 +27,3 @@ from . import dss_invoices from . import dss_importinvoicelist from . import dss_web_contracts - diff --git a/models/__pycache__/__init__.cpython-311.pyc b/models/__pycache__/__init__.cpython-311.pyc index 2734bbf..8edd246 100644 Binary files a/models/__pycache__/__init__.cpython-311.pyc and b/models/__pycache__/__init__.cpython-311.pyc differ diff --git a/models/__pycache__/dss_advertisefields.cpython-311.pyc b/models/__pycache__/dss_advertisefields.cpython-311.pyc index fbdce7d..401b291 100644 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 new file mode 100644 index 0000000..d3beac0 Binary files /dev/null and b/models/__pycache__/dss_advertisefields_templates.cpython-311.pyc differ diff --git a/models/__pycache__/dss_display_templates.cpython-311.pyc b/models/__pycache__/dss_display_templates.cpython-311.pyc new file mode 100644 index 0000000..6f645d5 Binary files /dev/null and b/models/__pycache__/dss_display_templates.cpython-311.pyc differ diff --git a/models/__pycache__/dss_onlinestate.cpython-311.pyc b/models/__pycache__/dss_onlinestate.cpython-311.pyc new file mode 100644 index 0000000..2d9e89f Binary files /dev/null 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 7051196..d91a593 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 f472b2f..37f2f17 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 4e93b90..71a87bf 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/__pycache__/dss_web_contracts.cpython-311.pyc b/models/__pycache__/dss_web_contracts.cpython-311.pyc index c006500..1ededb2 100644 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/dss_advertisefields.py b/models/dss_advertisefields.py index fe6a9c9..1e0eac0 100755 --- a/models/dss_advertisefields.py +++ b/models/dss_advertisefields.py @@ -50,18 +50,74 @@ class dssadvertisefields(models.Model): # uuid = fields.Char('UUID', required=True, translate=True) auto_feldname = fields.Char('Projekt_Feldname', default=lambda self: self._default_projektfeld(), required=True) - display = fields.Char('Designname') - feldname = fields.Char('Feldname', required=True) - project = fields.Many2one('dss.projects' , string='Project', store=True) - project_id = fields.Integer(related='project.projectid', string='Project ID') - contract = fields.Many2many('dss.contracts' , string='Vertrag', store=True) - contract_save = fields.Many2one('dss.contracts' , string='Vertrag', store=True) - contract_project_id = fields.Integer(related='contract.project_id', string='Project ID') - color_used = fields.Char(string='Color Index') - color_unused = fields.Char(string='Color Index') + display = fields.Char('Designname',tracking=True) + feldname = fields.Char('Feldname', required=True,tracking=True) + project = fields.Many2one('dss.projects' , string='Project', store=True,tracking=True) + project_id = fields.Integer(related='project.projectid', string='Project ID',tracking=True) + contract = fields.Many2many('dss.contracts' , string='Vertrag', store=True,tracking=True) + contract_save = fields.Many2one('dss.contracts' , string='Vertrag', store=True,tracking=True) + contract_project_id = fields.Integer(related='contract.project_id', string='Project ID',tracking=True) + color_used = fields.Char(string='Color Index',tracking=True) + color_unused = fields.Char(string='Color Index',tracking=True) mediastructure = fields.Many2one('dss.adstructures',string='Feldaufbau',tracking=True) mediastructure_medias = fields.Many2many(related='mediastructure.medias',string='Inhalt') mediarelations = fields.One2many('dss.mediarelations','relname',tracking=True) + is_btn = fields.Boolean('Feld ist Button',help="Feld hat einen Button auf eineen TSS System ?",tracking=True, default=True) + + + btn_fromtemplate = fields.Many2one('dss.advertisefields.templates',tracking=True) + btn_pos_x = fields.Integer('Position im Display X (px)', tracking=True) + btn_pos_y = fields.Integer('Position im Display Y (px)', tracking=True) + btn_pos_w = fields.Integer('Breite des Feldes (px)', tracking=True) + btn_pos_h = fields.Integer('Höhe des Feldes (px)', tracking=True) + btn_name = fields.Char('Button name',tracking=True) + btn_fieldname = fields.Char('Feldname',tracking=True) + btn_visible = fields.Boolean('Feld wird angezeigt',tracking=True, default=True) + btn_active = fields.Boolean('Feld ist bedienbar/aktiv',tracking=True, default=True) + btn_action_inactive = fields.Integer('Inaktiv Klickaktion',help='Aktion die ausgeführt wird bei click auf inaktiven Button - >0 und nicht activ = Baustellenbild bringen', tracking=True) + btn_action_active = fields.Selection([('9','Spezialfenster'),('16','Internetfenster'),('3','Storry ausführen'),('2','Gallerie anzeigen'),('5','normales Verhalten'),('12','im Specialfenster das Fenster schliessen'),('14','im Specialfenster ein Bild anzeigen')],string='Aktive Klickaktion',help='Aktion die ausgeführt wird bei click auf Aktiven Button', tracking=True) + btn_playlist_filename = fields.Char('Playlistendatei',help='Bei Aktion-Story = Storrydatei', tracking=True) + btn_playlist_zuordnung = fields.Selection([('1','Standard Zuordnung - Pfad+SchemaID+File'),('20','Kunden Zuordnung - Pfad+KundenID+File'),('50','Gallerie Zuordnung - Pfad+GallerieID+File')], tracking=True) + btn_gallery_filename = fields.Char('Galleriedatei',help="Gallerie Datei - Ohne Pfad, und Ohne .GAL",tracking=True) + btn_gallery_id = fields.Char('Gallerie ID', tracking=True) + btn_gallery_rows = fields.Integer('Zeilen der Gallery', tracking=True) + btn_gallery_cols = fields.Integer('Spalten der Gallery', tracking=True) + btn_gallery_prv_w = fields.Integer('Gallery Bildpreview Breite', tracking=True) + btn_gallery_pev_h = fields.Integer('Gallery Bildpreview Höhe', tracking=True) + btn_has_timer = fields.Boolean('Button Timeout',tracking=True, default=True) + btn_has_timer_time = fields.Integer('Button Timer-Zeit', tracking=True) + btn_editable = fields.Boolean('Button Editierbar',tracking=True, default=True) + btn_special_actionimage = fields.Char('Anzeigebild Spezialform ', tracking=True) + btn_special_actionimage_x = fields.Integer('X-Position Anzeigebild', tracking=True) + btn_special_actionimage_y = fields.Integer('Y-Position Anzeigebild', tracking=True) + btn_special_actionimage_w = fields.Integer('Breite Anzeigebild', tracking=True) + btn_special_actionimage_h = fields.Integer('Hoehe Anzeigebild', tracking=True) + btn_special_actionimage_time = fields.Integer('Anzeigezeit Anzeigebild', tracking=True) + btn_center_video_1 = fields.Char('Zentralvideo 1', tracking=True) + btn_center_video_2 = fields.Char('Zentralvideo 1', tracking=True) + btn_center_video_3 = fields.Char('Zentralvideo 1', tracking=True) + btn_center_video_4 = fields.Char('Zentralvideo 1', tracking=True) + btn_text_1 = fields.Char('Textzeile 1', tracking=True) + btn_text_2 = fields.Char('Textzeile 2', tracking=True) + btn_text_3 = fields.Char('Textzeile 3', tracking=True) + btn_text_4 = fields.Char('Textzeile 4', tracking=True) + btn_text_1_visible = fields.Boolean('Textzeile 1 anzeigen',tracking=True, default=False) + btn_text_2_visible = fields.Boolean('Textzeile 1 anzeigen',tracking=True, default=False) + btn_text_3_visible = fields.Boolean('Textzeile 1 anzeigen',tracking=True, default=False) + btn_text_4_visible = fields.Boolean('Textzeile 1 anzeigen',tracking=True, default=False) + btn_text_1_pos_x = fields.Integer('Textzeile 1 X-Pos',help="xxxx direkter Zahlenwert , +/-xxxx relativ zu Button",tracking=True) + btn_text_1_pos_y = fields.Integer('Textzeile 1 Y-Pos',help="xxxx direkter Zahlenwert , +/-xxxx relativ zu Button",tracking=True) + btn_text_2_pos_x = fields.Integer('Textzeile 2 X-Pos',help="xxxx direkter Zahlenwert , +/-xxxx relativ zu Button",tracking=True) + btn_text_2_pos_y = fields.Integer('Textzeile 2 Y-Pos',help="xxxx direkter Zahlenwert , +/-xxxx relativ zu Button",tracking=True) + btn_text_3_pos_x = fields.Integer('Textzeile 3 X-Pos',help="xxxx direkter Zahlenwert , +/-xxxx relativ zu Button",tracking=True) + btn_text_3_pos_y = fields.Integer('Textzeile 3 Y-Pos',help="xxxx direkter Zahlenwert , +/-xxxx relativ zu Button",tracking=True) + btn_text_4_pos_x = fields.Integer('Textzeile 4 X-Pos',help="xxxx direkter Zahlenwert , +/-xxxx relativ zu Button",tracking=True) + btn_text_4_pos_y = fields.Integer('Textzeile 4 Y-Pos',help="xxxx direkter Zahlenwert , +/-xxxx relativ zu Button",tracking=True) + btn_text_1_font = fields.Char('Textzeile 1 Schriftart', tracking=True) + btn_text_2_font = fields.Char('Textzeile 2 Schriftart', tracking=True) + btn_text_3_font = fields.Char('Textzeile 3 Schriftart', tracking=True) + btn_text_4_font = fields.Char('Textzeile 4 Schriftart', tracking=True) + def _default_projektfeld(self): return "000_unbekannt" @@ -78,7 +134,7 @@ class dssadvertisefields(models.Model): def _onchange_project(self): autoid = "" autoid = str(self.project_id)+"_"+str(self.feldname) - self.auto_feldname =autoid + self.auto_feldname = autoid @api.onchange('contract') def _onchange_contract(self): @@ -116,3 +172,51 @@ class dssadvertisefields(models.Model): for record in self: if not record.contract: record.contract = record.contract_save + + def pyactiontaketemplate(self): + action = (self.env["confirmation.wizard"].confirm_message(_("Das Template wirklich übernehmen ?"),title="Bitte bestätigen",method="taketemplate",records=self,callback_params={"template":self.id}) + ) + if action: + return action + + def taketemplate(self,template): + self.btn_pos_x = self.btn_fromtemplate.btn_pos_x + self.btn_pos_y = self.btn_fromtemplate.btn_pos_y + self.btn_pos_w = self.btn_fromtemplate.btn_pos_w + self.btn_pos_h = self.btn_fromtemplate.btn_pos_h + self.btn_name = self.btn_fromtemplate.btn_name + self.btn_fieldname = self.btn_fromtemplate.btn_fieldname + self.btn_visible = self.btn_fromtemplate.btn_visible + self.btn_active = self.btn_fromtemplate.btn_active + self.btn_action_inactive = self.btn_fromtemplate.btn_action_inactive + self.btn_action_active = self.btn_fromtemplate.btn_action_active + self.btn_playlist_zuordnung = self.btn_fromtemplate.btn_playlist_zuordnung + self.btn_gallery_rows = self.btn_fromtemplate.btn_gallery_rows + self.btn_gallery_cols = self.btn_fromtemplate.btn_gallery_cols + self.btn_gallery_prv_w = self.btn_fromtemplate.btn_gallery_pev_w + self.btn_gallery_pev_h = self.btn_fromtemplate.btn_gallery_pev_h + self.btn_has_timer = self.btn_fromtemplate.btn_has_timer + self.btn_has_timer_time = self.btn_fromtemplate.btn_has_timer_time + self.btn_editable = self.btn_fromtemplate.btn_editable + self.btn_special_actionimage = self.btn_fromtemplate.btn_special_actionimage + self.btn_special_actionimage_x = self.btn_fromtemplate.btn_special_actionimage_x + self.btn_special_actionimage_y = self.btn_fromtemplate.btn_special_actionimage_y + self.btn_special_actionimage_w = self.btn_fromtemplate.btn_special_actionimage_w + self.btn_special_actionimage_h = self.btn_fromtemplate.btn_special_actionimage_h + self.btn_special_actionimage_time = self.btn_fromtemplate.btn_special_actionimage_time + self.btn_text_1_visible = self.btn_fromtemplate.btn_text_1_visible + self.btn_text_2_visible = self.btn_fromtemplate.btn_text_2_visible + self.btn_text_3_visible = self.btn_fromtemplate.btn_text_3_visible + self.btn_text_4_visible = self.btn_fromtemplate.btn_text_4_visible + self.btn_text_1_pos_x = self.btn_fromtemplate.self.btn_text_1_pos_x + self.btn_text_1_pos_y = self.btn_fromtemplate.self.btn_text_1_pos_y + self.btn_text_2_pos_x = self.btn_fromtemplate.self.btn_text_2_pos_x + self.btn_text_2_pos_y = self.btn_fromtemplate.self.btn_text_2_pos_y + self.btn_text_3_pos_x = self.btn_fromtemplate.self.btn_text_3_pos_x + self.btn_text_3_pos_y = self.btn_fromtemplate.self.btn_text_3_pos_y + self.btn_text_4_pos_x = self.btn_fromtemplate.self.btn_text_4_pos_x + self.btn_text_4_pos_y = self.btn_fromtemplate.self.btn_text_4_pos_y + self.btn_text_1_font = self.btn_fromtemplate.btn_text_1_font + self.btn_text_2_font = self.btn_fromtemplate.btn_text_2_font + self.btn_text_3_font = self.btn_fromtemplate.btn_text_3_font + self.btn_text_4_font = self.btn_fromtemplate.btn_text_4_font diff --git a/models/dss_advertisefields_templates.py b/models/dss_advertisefields_templates.py new file mode 100755 index 0000000..0a3bcd1 --- /dev/null +++ b/models/dss_advertisefields_templates.py @@ -0,0 +1,108 @@ +import ast +import datetime +import json +import re +import uuid +import logging +import base64 +import subprocess +import tempfile +import easywebdav +import os +import os.path + + +from odoo import api, fields, models, _ +from odoo import tools +from odoo.exceptions import ValidationError +from datetime import date +from datetime import datetime +from dateutil.relativedelta import relativedelta +from pyffmpeg import FFmpeg +from tuya_iot import TuyaOpenAPI, TUYA_LOGGER +from tuya_connector import TuyaOpenAPI, TUYA_LOGGER +import sys + +TUYA_LOGGER.setLevel(logging.DEBUG) +_logger = logging.getLogger(__name__) + + +class dssadvertisefields(models.Model): + + @api.model + def create(self,vals): + result = super().create(vals) + return result + + _name = "dss.advertisefields.templates" + _description = "DigitalSignage Werbefeldvorlage" + _inherit = ['mail.thread','mail.activity.mixin'] + _rec_name = "templatefeldname" +# _inherit = ['mail.thread', 'mail.activity.mixin'] + uuid = fields.Char(default=lambda self: self._default_uuid(), required=True, readonly=True, copy=False, string='UUID') + date_create = fields.Date('Erstellungsdatum',default=lambda self: self._default_create_date()) + date_lastedit = fields.Date('Änderungsdatum') + user_create = fields.Char('Erstellungsuser',default=lambda self: self._default_create_user()) + user_lastedit = fields.Char('Änderungsuser') + +# uuid = fields.Char('UUID', required=True, translate=True) + templatefeldname = fields.Char('Template Feldname', required=True,tracking=True) + display = fields.Char('Ziel Feldname',tracking=True) + displaytemplate = fields.Many2one('dss.display.templates',String="Display Vorlage",tracking=True) + feldname = fields.Char('Ziel Feldname', required=True,tracking=True) + color_used = fields.Char(string='Color Index',tracking=True) + color_unused = fields.Char(string='Color Index',tracking=True) + mediastructure = fields.Many2one('dss.adstructures',string='Feldaufbau',tracking=True) + + + btn_pos_x = fields.Integer('Position im Display X (px)', tracking=True) + btn_pos_y = fields.Integer('Position im Display Y (px)', tracking=True) + btn_pos_w = fields.Integer('Breite des Feldes (px)', tracking=True) + btn_pos_h = fields.Integer('Höhe des Feldes (px)', tracking=True) + btn_name = fields.Char('Button name',tracking=True) + btn_fieldname = fields.Char('Feldname am Display',tracking=True) + btn_visible = fields.Boolean('Feld wird angezeigt',tracking=True, default=True) + btn_active = fields.Boolean('Feld ist bedienbar/aktiv',tracking=True, default=True) + btn_action_inactive = fields.Integer('Inaktiv Klickaktion',help='Aktion die ausgeführt wird bei click auf inaktiven Button - >0 und nicht activ = Baustellenbild bringen', tracking=True) + btn_action_active = fields.Selection([('9','Spezialfenster'),('16','Internetfenster'),('3','Storry ausführen'),('2','Gallerie anzeigen'),('5','normales Verhalten'),('12','im Specialfenster das Fenster schliessen'),('14','im Specialfenster ein Bild anzeigen')],string='Aktive Klickaktion',help='Aktion die ausgeführt wird bei click auf Aktiven Button', tracking=True) + btn_playlist_zuordnung = fields.Selection([('','Standard Zuordnung - Pfad+SchemaID+File'),('20','Kunden Zuordnung - Pfad+KundenID+File'),('50','Gallerie Zuordnung - Pfad+GallerieID+File')], tracking=True) + btn_gallery_rows = fields.Integer('Zeilen der Gallery', tracking=True) + btn_gallery_cols = fields.Integer('Spalten der Gallery', tracking=True) + btn_gallery_prv_w = fields.Integer('Gallery Bildpreview Breite', tracking=True) + btn_gallery_pev_h = fields.Integer('Gallery Bildpreview Höhe', tracking=True) + btn_has_timer = fields.Boolean('Button Timeout',tracking=True, default=False) + btn_has_timer_time = fields.Integer('Button Timer-Zeit', tracking=True) + btn_editable = fields.Boolean('Button Editierbar',tracking=True, default=True) + btn_special_actionimage = fields.Char('Anzeigebild Spezialform ', tracking=True) + btn_special_actionimage_x = fields.Integer('X-Position Anzeigebild', tracking=True) + btn_special_actionimage_y = fields.Integer('Y-Position Anzeigebild', tracking=True) + btn_special_actionimage_w = fields.Integer('Breite Anzeigebild', tracking=True) + btn_special_actionimage_h = fields.Integer('Hoehe Anzeigebild', tracking=True) + btn_special_actionimage_time = fields.Integer('Anzeigezeit Anzeigebild', tracking=True) + btn_text_1_visible = fields.Boolean('Textzeile 1 anzeigen',tracking=True, default=False) + btn_text_2_visible = fields.Boolean('Textzeile 1 anzeigen',tracking=True, default=False) + btn_text_3_visible = fields.Boolean('Textzeile 1 anzeigen',tracking=True, default=False) + btn_text_4_visible = fields.Boolean('Textzeile 1 anzeigen',tracking=True, default=False) + btn_text_1_pos_x = fields.Integer('Textzeile 1 X-Pos',help="xxxx direkter Zahlenwert , +/-xxxx relativ zu Button",tracking=True) + btn_text_1_pos_y = fields.Integer('Textzeile 1 Y-Pos',help="xxxx direkter Zahlenwert , +/-xxxx relativ zu Button", tracking=True) + btn_text_2_pos_x = fields.Integer('Textzeile 2 X-Pos',help="xxxx direkter Zahlenwert , +/-xxxx relativ zu Button", tracking=True) + btn_text_2_pos_y = fields.Integer('Textzeile 2 Y-Pos',help="xxxx direkter Zahlenwert , +/-xxxx relativ zu Button", tracking=True) + btn_text_3_pos_x = fields.Integer('Textzeile 3 X-Pos',help="xxxx direkter Zahlenwert , +/-xxxx relativ zu Button", tracking=True) + btn_text_3_pos_y = fields.Integer('Textzeile 3 Y-Pos',help="xxxx direkter Zahlenwert , +/-xxxx relativ zu Button", tracking=True) + btn_text_4_pos_x = fields.Integer('Textzeile 4 X-Pos',help="xxxx direkter Zahlenwert , +/-xxxx relativ zu Button", tracking=True) + btn_text_4_pos_y = fields.Integer('Textzeile 4 Y-Pos',help="xxxx direkter Zahlenwert , +/-xxxx relativ zu Button", tracking=True) + btn_text_1_font = fields.Char('Textzeile 1 Schriftart', tracking=True) + btn_text_2_font = fields.Char('Textzeile 2 Schriftart', tracking=True) + btn_text_3_font = fields.Char('Textzeile 3 Schriftart', tracking=True) + btn_text_4_font = fields.Char('Textzeile 4 Schriftart', tracking=True) + + + def _default_create_date(self): + return str(date.today()) + + def _default_create_user(self): + return str(self.env.user.name) + + @api.model + def _default_uuid(self): + return str(uuid.uuid4()) diff --git a/models/dss_display_templates.py b/models/dss_display_templates.py new file mode 100755 index 0000000..a79e29e --- /dev/null +++ b/models/dss_display_templates.py @@ -0,0 +1,61 @@ +import ast +import datetime +import json +import re +import uuid +import logging +import base64 +import subprocess +import tempfile +import easywebdav +import os +import os.path + + +from odoo import api, fields, models, _ +from odoo import tools +from odoo.exceptions import ValidationError +from datetime import date +from datetime import datetime +from dateutil.relativedelta import relativedelta +from pyffmpeg import FFmpeg +from tuya_iot import TuyaOpenAPI, TUYA_LOGGER +from tuya_connector import TuyaOpenAPI, TUYA_LOGGER +import sys + +TUYA_LOGGER.setLevel(logging.DEBUG) +_logger = logging.getLogger(__name__) + + +class dssadvertisefields(models.Model): + + @api.model + def create(self,vals): + result = super().create(vals) + return result + + _name = "dss.display.templates" + _description = "DigitalSignage Displayvorlage" + _inherit = ['mail.thread','mail.activity.mixin'] + _rec_name = "displayname" +# _inherit = ['mail.thread', 'mail.activity.mixin'] + uuid = fields.Char(default=lambda self: self._default_uuid(), required=True, readonly=True, copy=False, string='UUID') + date_create = fields.Date('Erstellungsdatum',default=lambda self: self._default_create_date()) + date_lastedit = fields.Date('Änderungsdatum') + user_create = fields.Char('Erstellungsuser',default=lambda self: self._default_create_user()) + user_lastedit = fields.Char('Änderungsuser') + +# uuid = fields.Char('UUID', required=True, translate=True) + displayname = fields.Char('Template Feldname', required=True,tracking=True) + feldtemplates = fields.Many2many('dss.advertisefields.templates' , string='Vertrag', store=True,tracking=True) + + + def _default_create_date(self): + return str(date.today()) + + def _default_create_user(self): + return str(self.env.user.name) + + @api.model + def _default_uuid(self): + return str(uuid.uuid4()) diff --git a/models/dss_onlinestate.py b/models/dss_onlinestate.py new file mode 100644 index 0000000..995372d --- /dev/null +++ b/models/dss_onlinestate.py @@ -0,0 +1,38 @@ +import uuid +import logging +import datetime + +from odoo import api, fields, models, _ +from odoo import tools +from odoo.exceptions import ValidationError +from dateutil.relativedelta import relativedelta +import sys + +_logger = logging.getLogger(__name__) + +class dssonlinestate(models.Model): + _name = "dss.onlinestate" + _description = "DigitalSignage Onlinestati" + _inherit = ['mail.thread','mail.activity.mixin'] + _rec_name = "uuid" + uuid = fields.Char(default=lambda self: self._default_uuid(), required=True, readonly=True, copy=False, string='UUID') + date_create = fields.Datetime('Erstellungsdatum',default=lambda self: self._default_create_date()) + date_lastedit = fields.Datetime('Änderungsdatum') + user_create = fields.Char('Erstellungsuser',default=lambda self: self._default_create_user()) + user_lastedit = fields.Char('Änderungsuser') + project = fields.Many2one('dss.projects',string='Projekt des Systems',tracking=True) + number = fields.Integer('Player/System Nr',tracking=True) + online = fields.Boolean('Online',tracking=True) + datavolume = fields.Boolean('Leeres Datenvolumen',tracking=True) + + @api.model + def _default_uuid(self): + return str(uuid.uuid4()) + + def _default_create_date(self): + return datetime.datetime.now() + + def _default_create_user(self): + return str(self.env.user.name) + + diff --git a/models/dss_projects.py b/models/dss_projects.py index 43a2cb8..690a198 100755 --- a/models/dss_projects.py +++ b/models/dss_projects.py @@ -12,6 +12,7 @@ import requests import json from types import SimpleNamespace + import easywebdav import os import os.path @@ -112,8 +113,31 @@ class dssprojects(models.Model): marker_list = fields.Many2many('dss.marker', string='vorhandene Marker', tracking=True) - onlinestate = fields.Char('OnlineColor',compute='_compute_getonlinestate') - playername = fields.Char('Name des Players', tracking=True) + onlinestate_1 = fields.Char('OnlineColor_1') + playername_1 = fields.Char('Name des Players_1', tracking=True) + onlinestate_2 = fields.Char('OnlineColor_2') + playername_2 = fields.Char('Name des Players_2', tracking=True) + onlinestate_3 = fields.Char('OnlineColor_3') + playername_3 = fields.Char('Name des Players_3', tracking=True) + + Rportid_1 = fields.Char('RPort ID 1', tracking=True) + Rportid_2 = fields.Char('RPort ID 2', tracking=True) + Rportid_3 = fields.Char('RPort ID 3', tracking=True) + + issim = fields.Boolean('Sim Karte genutzt ?', tracking=True) + + simid_1 = fields.Char('Simkarte Nr 1', tracking=True) + simstart_1 = fields.Char('Simkarte 1 Vertr.start', tracking=True) + simstart_DVEmpty_1 = fields.Boolean('Simkarte 1 DV leer', tracking=True) + simstart_DVEmpty_1_lastdate = fields.Date('Simkarte 1 Leerdatum', tracking=True) + simid_2 = fields.Char('Simkarte Nr 2', tracking=True) + simstart_2 = fields.Char('Simkarte 2 Vertr.start', tracking=True) + simstart_DVEmpty_2 = fields.Boolean('Simkarte 2 DV leer', tracking=True) + simstart_DVEmpty_2_lastdate = fields.Date('Simkarte 2 Leerdatum', tracking=True) + simid_3 = fields.Char('Simkarte Nr 3', tracking=True) + simstart_3 = fields.Char('Simkarte 3 Vertr.start', tracking=True) + simstart_DVEmpty_3 = fields.Boolean('Simkarte 3 DV leer', tracking=True) + simstart_DVEmpty_3_lastdate = fields.Date('Simkarte 3 Leerdatum', tracking=True) @api.model def _read_group_system_ids(self, stages, domain, order): @@ -236,38 +260,114 @@ class dssprojects(models.Model): @api.model def compute_getonlinestate2(self,project): - proj = self.env['dss.projects'].search([('id',"=",project)]) + projekte = self.env['dss.projects'].search([('grundsystem_showonlinestate','=',True)]) + for pro in projekte: + self.compute_getonlinestate_single(pro) + + def compute_getonlinestate_single(self,project): + #proj = self.env['dss.projects'].search([('id',"=",project.id)]) + proj = project colorOn = str(self.env['dss.settings'].search([], limit=1).systemonline_color) colorOff = str(self.env['dss.settings'].search([], limit=1).systemoffline_color) _logger.info("Projekt Online Settings Check "+str(proj.grundsystem_showonlinestate_type)+' '+str(self)+' '+str(project)) if (proj.grundsystem_showonlinestate_type == 'RPORT'): - _logger.info("Projekt RPORT Settings ") - colorval = colorOff + playername = proj["Rportid_1"] + _logger.info("Projekt RPORT Settings "+str(playername) ) + if playername!=False: + rporturl = str(self.env['dss.settings'].search([], limit=1).rporturl)+'/api/v1/clients/' + rportusername = str(self.env['dss.settings'].search([], limit=1).rportusername) + rporttoken = str(self.env['dss.settings'].search([], limit=1).rporttoken) + auth = (rportusername, rporttoken) + for plnr in range(1,4): + playername = proj["Rportid_"+str(plnr)] + if playername: + _logger.info("RPORT request :"+str(rporturl)+str(playername)) + r = requests.get(str(rporturl)+str(playername), auth=auth, verify=False) + _logger.info("RPORT answere :"+str(r.status_code)+' - '+str(r.content)) + if (str(r.status_code) == "200"): + content = str(r.json()) + index = content.find("connection_state") + content = content[index+20:] + index = content.find("',") + token = content[:index] + if (self.env['dss.onlinestate'].search([("project","=",proj.id),("number","=",plnr)], order="date_create desc", limit=1) == False): + self.env['dss.onlinestate'].create({'project':proj.id,'number':plnr,'online':False}) + laststate = self.env['dss.onlinestate'].search([("project","=",proj.id),("number","=",plnr)], order="date_create desc", limit=1).online + _logger.info("RPORT answere :"+str(token)+"/"+str(laststate)) + if token == 'connected': + colorval = colorOn + if not laststate: + self.env['dss.onlinestate'].create({'project':proj.id,'number':plnr,'online':True}) + else: + colorval = colorOff + if laststate: + self.env['dss.onlinestate'].create({'project':proj.id,'number':plnr,'online':False}) + else: + colorval = colorOff + else: + colorval = 0 + proj['onlinestate_'+str(plnr)]=colorval + else: + colorval = 0 + proj['onlinestate_1']=colorval elif (proj.grundsystem_showonlinestate_type == 'VNNOX'): vnurl = str(self.env['dss.settings'].search([], limit=1).vnnoxurl)+'/Rest/Logon' vnusername = str(self.env['dss.settings'].search([], limit=1).vnnoxusername) vnpassword = str(self.env['dss.settings'].search([], limit=1).vnnoxpassword) - _logger.info("Projekt VNNOX Settings " + str(vnurl)) +# _logger.info("Projekt VNNOX Settings " + str(vnurl)) r = requests.post(vnurl, json={"password": vnpassword,"username": vnusername}) - _logger.info("Projekt VNNOX Settings Result " + str(r.status_code)) if (str(r.status_code) == "200"): content = str(r.json()) index = content.find("token") content = content[index+9:] index = content.find("',") token = content[:index] - _logger.info("Projekt VNNOX Settings Token : /" + str(token)+"/") - vnurl_getPlayer = str(self.env['dss.settings'].search([], limit=1).vnnoxurl)+'/Rest/Player?offset=0&limit=10&sort=name&sortType=asc&search='+str(proj.playername) - headers = {'token': token} - r = requests.get(vnurl_getPlayer, headers=headers) - if (str(r.status_code) == "200"): - content = str(r.json()) - _logger.info("Projekt VNNOX Settings Data : /" + str(content)+"/") - else: - colorval = "#a0a0a0" - colorval = colorOff + for plnr in range(1,4): + playername = proj["playername_"+str(plnr)] + if playername!=False: +# _logger.info("Projekt VNNOX Settings Token : /" + str(token)+"/") + vnurl_getPlayer = str(self.env['dss.settings'].search([], limit=1).vnnoxurl)+'/Rest/Player?offset=0&limit=10&sort=name&sortType=asc&search='+str(playername) + headers = {'token': token} + r = requests.get(vnurl_getPlayer, headers=headers) + if (str(r.status_code) == "200"): + _logger.info("Projekt VNNOX Settings Data : /" + str(r.content)+"/") + resj = json.loads(r.content) + if resj["data"]["count"] == "1": + if (self.env['dss.onlinestate'].search([("project","=",proj.id),("number","=",plnr)], order="date_create desc", limit=1) == False): + self.env['dss.onlinestate'].create({'project':proj.id,'number':plnr,'online':False}) + laststate = self.env['dss.onlinestate'].search([("project","=",proj.id),("number","=",plnr)], order="date_create desc", limit=1).online + _logger.info("Projekt VNNOX Settings Data : /" + str(resj["data"]["playerInfo"][0]["online"])+"/"+str(laststate)) + if resj["data"]["playerInfo"][0]["online"] == "1": + colorval = colorOn + if not laststate: + self.env['dss.onlinestate'].create({'project':proj.id,'number':plnr,'online':True}) + else: + colorval = colorOff + if laststate: + self.env['dss.onlinestate'].create({'project':proj.id,'number':plnr,'online':False}) + else: + colorval = "#a0a0a0" + else: + colorval = "#a0a0a0" + proj['onlinestate_'+str(plnr)]=colorval + else: + colorval = "0" + proj['onlinestate_'+str(plnr)]=colorval else: colorval = "#a0a0a0" + proj['onlinestate_1']=colorval else: colorval = "#a0a0a0" - proj.onlinestate = colorval + proj['onlinestate_1']=colorval + + + +def method(self): + return ( + self.env["confirmation.wizard"] + .with_context(hide_cancel=True) + .confirm_no_action_message( + message="Message", + title="Notification" + ) + ) \ No newline at end of file diff --git a/models/dss_settings.py b/models/dss_settings.py index 0f7a276..5374c42 100755 --- a/models/dss_settings.py +++ b/models/dss_settings.py @@ -60,7 +60,7 @@ class dssSettings(models.Model): vnnoxpassword = fields.Char('VNNox Password',tracking=True) rporturl = fields.Char('RPort URL',tracking=True) rportusername = fields.Char('RPort Username',tracking=True) - rportpassword = fields.Char('RPort Password',tracking=True) + rporttoken = fields.Char('RPort API Token',tracking=True) def _get_settingvalue(self,valuename): diff --git a/models/dss_trigger.py b/models/dss_trigger.py index 349ff49..4f30522 100644 --- a/models/dss_trigger.py +++ b/models/dss_trigger.py @@ -407,6 +407,7 @@ class dsstriggeractions(models.Model): triggeractionname = fields.Char('Triggeraktionname',tracking=True) triggeractiontyp = fields.Selection([('EMAIL','EMail an senden'),('NOTIZ','Notitz erstellen'),('MESSA','Message an Follower senden'),('CHANNEL','Message an Channel senden'),('ACTIV','Aufgabe erzeugen'),('MARKER','Marker eintragen'),('DSEDIT','Akt. Datensatz ändern'),('TUYA','Tuya Aktion auslössen'),('PRUEF','Wert prüfen')],'Aktionstyp',tracking=True) email_getfrom = fields.Selection([('FIX','Email fest hinterlegt'),('DATA','Email in Feld hinterlegt')],'Emailadresse von',tracking=True) + email_send_confirm = fields.Boolean('Email Bestätigen vor senden',tracking=True) email_fix_email_sender = fields.Many2one('res.partner','Absender',help='Email Sender Adresse der Aktion',tracking=True) email_fix_email = fields.Many2one('res.partner','Empfänger fix',help='Email Emüfänger Adresse für Benachrichtigung/Triggeraktion',tracking=True) email_data_table = fields.Many2one('ir.model','EmailDaten in',help='Für welche Daten ist diese Aktion gültig ?',tracking=True) @@ -501,7 +502,14 @@ 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 - self.email_template.send_mail(Dataset.id,force_send=True) + if not self.email_send_confirm: + self.email_template.send_mail(Dataset.id,force_send=True) + else: + action = (self.env["confirmation.wizard"].confirm_message( + _("Möchten Sie die EMail versenden ?"),self.email_template, # One or more records + 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.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/models/dss_web_contracts.py b/models/dss_web_contracts.py index 1477b9a..308beda 100644 --- a/models/dss_web_contracts.py +++ b/models/dss_web_contracts.py @@ -140,6 +140,8 @@ class dsscontracts(models.Model): _logger.info("create new partner...") fullname = str(self.client_short_vorname) + ' ' +str(self.client_short_name) newcontact = self.env['res.partner'].create({'name': fullname, + 'dsspartner_vorname': self.client_short_vorname, + 'dsspartner_name': self.client_short_name, 'email': self.client_short_email, 'phone': self.client_short_telefon, 'mobile': self.client_short_mobil, @@ -149,7 +151,7 @@ class dsscontracts(models.Model): 'country_id': self.env['res.country'].search([('code', '=', 'DE')], limit=1).id, 'company_type': 'person', # 'company' oder 'person', 'website': self.client_short_website, - 'commercial_company_name': self.client_short_company, + 'company_name': self.client_short_company, 'dsspartner': True, 'dsspartner_werbung': True }) @@ -188,6 +190,7 @@ class dsscontracts(models.Model): 'ads_topics': self.ads_topics, 'contract_auto_extend': self.contract_auto_extend, 'contract_date': self.contract_date, + 'work_state_info': self.remark, 'scan_vertrag': self.scan_vertrag }) _logger.info("create new Werbekampagne...") @@ -198,7 +201,7 @@ class dsscontracts(models.Model): 'date_start_planed': self.date_start_planed, 'date_remove_planed': self.date_remove_planed, #'work_state_info': 'ZA bis: '+str(self.grafik_zuarbeitBis)+' / '+self.remark - 'work_state_info': 'ZA bis: '+format_date(self.grafik_zuarbeitBis,format='dd.MM.yy',locale='de_DE')+' / '+self.remark + 'work_state_info': 'ZA bis: '+format_date(self.grafik_zuarbeitBis,format='dd.MM.yy',locale='de_DE') }) self.erfasst_in_odoo = True diff --git a/security/ir.model.access.csv b/security/ir.model.access.csv index 4db6d9c..c593f82 100755 --- a/security/ir.model.access.csv +++ b/security/ir.model.access.csv @@ -19,6 +19,8 @@ digitalsignage_dss_mediatypes_group_user,access.dss.mediatypes,model_dss_mediaty digitalsignage_dss_texts_group_user,access.dss.texts,model_dss_texts,base.group_user,1,1,1,1 digitalsignage_dss_mediarelations_group_user,access.dss.mediarelations,model_dss_mediarelations,base.group_user,1,1,1,1 digitalsignage_dss_advertisefields_group_user,access.dss.advertisefields,model_dss_advertisefields,base.group_user,1,1,1,1 +digitalsignage_dss_advertisefields_templates_group_user,access.dss.advertisefields.templates,model_dss_advertisefields_templates,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_import_group_user,access.dss.import,model_dss_import,base.group_user,1,1,1,1 digitalsignage_dss_settings_group_user,access.dss.settings,model_dss_settings,base.group_user,1,1,1,1 digitalsignage_dss_viewsettings_group_user,access.dss.viewsettings,model_dss_viewsettings,base.group_user,1,1,1,1 @@ -42,3 +44,4 @@ DigitalSignage_dss_statesave,access.dss.statesave,DigitalSignage.model_dss_state DigitalSignage_dss_activity_mixin,access.dss.activity_mixin,DigitalSignage.model_dss_activity_mixin,base.group_user,1,0,0,0 DigitalSignage_dss_triggermodel,access.dss.triggermodel,DigitalSignage.model_dss_triggermodel,base.group_user,1,0,0,0 DigitalSignage_dss_invoices,access.dss.invoices,DigitalSignage.model_dss_invoices,base.group_user,1,1,1,1 +DigitalSignage_dss_onlinestate,access.dss.onlinestate,DigitalSignage.model_dss_onlinestate,base.group_user,1,1,1,1 diff --git a/static/src/js/kanban_button.js b/static/src/js/kanban_button.js index 1629a6f..df5f169 100644 --- a/static/src/js/kanban_button.js +++ b/static/src/js/kanban_button.js @@ -40,6 +40,25 @@ export class configKanbanController extends KanbanController { }); alert("Einstellungen gespeichert !") } + Getonlinestate() { + const queryString = window.location.hash; + const urlParams = new URLSearchParams(queryString); + var TableInfo = [urlParams.get('id'),urlParams.get('model'),urlParams.get('view_type')]; + var Fields = []; + TableInfo.push(Fields); + rpc.query({ + model: 'dss.projects', + method: 'compute_getonlinestate2', + args: [TableInfo], + }); + } + Getmethod() { + rpc.query({ + model: 'dss.projects', + method: 'method', + args: [], + }); + } } registry.category("views").add("button_in_kanban", { diff --git a/static/src/xml/form_button.xml b/static/src/xml/form_button.xml index dce7029..596ee1f 100644 --- a/static/src/xml/form_button.xml +++ b/static/src/xml/form_button.xml @@ -11,6 +11,8 @@