diff --git a/__manifest__.py b/__manifest__.py index 47a4836..f63483f 100755 --- a/__manifest__.py +++ b/__manifest__.py @@ -45,6 +45,7 @@ 'views/dss_zahlungen.xml', 'views/dss_web_contracts.xml', 'views/dss_invoices.xml', + 'views/dss_m2mmail.xml', 'views/mainsystem_view.xml', 'views/dss_importinvoicelist.xml', 'views/menu.xml', @@ -62,11 +63,19 @@ 'web.assets_backend': [ 'DigitalSignage/static/src/img/*', 'DigitalSignage/static/src/xml/screenDesignerView.xml', + 'DigitalSignage/static/src/xml/dss_screenview_controller.xml', + 'DigitalSignage/static/src/xml/dss_screenview_renderer.xml', + 'DigitalSignage/static/src/js/dss_screenview_archparser.js', + 'DigitalSignage/static/src/js/dss_screenview_controller.js', + '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/js/form_label.js', 'DigitalSignage/static/src/js/form_button.js', 'DigitalSignage/static/src/js/kanban_button.js', 'DigitalSignage/static/src/xml/form_button.xml', 'DigitalSignage/static/src/js/dss_klistmanager.js', + 'DigitalSignage/static/src/js/screenDesignerViewReload.js', 'DigitalSignage/static/src/xml/form_label.xml', ], 'web.assets_common': [ diff --git a/controllers/__init__.py b/controllers/__init__.py index 5d4b25d..b979a1e 100644 --- a/controllers/__init__.py +++ b/controllers/__init__.py @@ -2,3 +2,4 @@ # Part of Odoo. See LICENSE file for full copyright and licensing details. from . import main +from . import dss_screendesigner_controller diff --git a/controllers/__pycache__/__init__.cpython-311.pyc b/controllers/__pycache__/__init__.cpython-311.pyc index 20fe4d9..4bd8fc1 100644 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 new file mode 100644 index 0000000..7358fd7 Binary files /dev/null and b/controllers/__pycache__/dss_screendesigner_controller.cpython-311.pyc differ diff --git a/controllers/dss_screendesigner_controller.py b/controllers/dss_screendesigner_controller.py new file mode 100644 index 0000000..8d7282e --- /dev/null +++ b/controllers/dss_screendesigner_controller.py @@ -0,0 +1,32 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. +from odoo import http +import os +import os.path +import base64 + +import logging +from odoo.http import request +_logger = logging.getLogger(__name__) +from odoo.tools.json import scriptsafe + +class screendesignercontroller(http.Controller): + @http.route('/dss/displaydesigner/', auth='user', website=True, csrf=False) + def changeScreenTemplateView(self): + + request.env.ref('DigitalSignage.dss_screenDesigner_action_dss_screenDesigner').run() + + +# odss_sales_order = http.request.env['sale.orders'] +# new_so = odss_sales_order.create({ +# 'delivery_Time': delivery_time, +# }) + + values = { + 'project_url': partner_url, + 'address': project.standort_strasse, + 'projects_data': scriptsafe.dumps(projects_data), + 'google_maps_api_key': google_maps_api_key, + } + + return \ No newline at end of file diff --git a/models/__init__.py b/models/__init__.py index ddf2f1c..30a6afa 100755 --- a/models/__init__.py +++ b/models/__init__.py @@ -26,4 +26,5 @@ from . import company from . import dss_invoices from . import dss_importinvoicelist from . import dss_web_contracts +from . import dss_m2mmail diff --git a/models/__pycache__/__init__.cpython-311.pyc b/models/__pycache__/__init__.cpython-311.pyc index 8edd246..dd75390 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.cpython-311.pyc b/models/__pycache__/dss.cpython-311.pyc index d9e8294..73520dc 100644 Binary files a/models/__pycache__/dss.cpython-311.pyc and b/models/__pycache__/dss.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 d3beac0..05edd48 100644 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 ef22ab9..3d18fd6 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 6f645d5..46588a8 100644 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_m2mmail.cpython-311.pyc b/models/__pycache__/dss_m2mmail.cpython-311.pyc new file mode 100644 index 0000000..26a64bd Binary files /dev/null and b/models/__pycache__/dss_m2mmail.cpython-311.pyc differ diff --git a/models/__pycache__/dss_trigger.cpython-311.pyc b/models/__pycache__/dss_trigger.cpython-311.pyc index 71a87bf..b069571 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 1ededb2..c33e53b 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.py b/models/dss.py index 7ce9f6d..8c2f09e 100755 --- a/models/dss.py +++ b/models/dss.py @@ -331,3 +331,30 @@ class dssscreendesign(models.Model): def get_data(self): outlist = {'uuid' : 2222} return outlist + + def myscreenrebuild(self): + _logger.info('inside Screenrebuild') + return { + 'type': 'ir.actions.client', + 'name': 'reload', + 'context' : {'screenlayout': 1}, + 'tag': 'dss_screenDesigner_js_action' + } + + +class View(models.Model): + """ + Extends the base 'ir.ui.view' model to include a new type of view + called 'grid'. + """ + _inherit = 'ir.ui.view' + type = fields.Selection(selection_add=[('screenview', "ScreenView")]) + +class IrActionsActWindowView(models.Model): + """ + Extends the base 'ir.actions.act_window.view' model to include + 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 diff --git a/models/dss_advertisefields_templates.py b/models/dss_advertisefields_templates.py index 0a3bcd1..a51c9fc 100755 --- a/models/dss_advertisefields_templates.py +++ b/models/dss_advertisefields_templates.py @@ -48,7 +48,7 @@ class dssadvertisefields(models.Model): # 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) + 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) @@ -106,3 +106,15 @@ class dssadvertisefields(models.Model): @api.model def _default_uuid(self): return str(uuid.uuid4()) + + @api.model + def get_data(self,template): + if not template: + template = 1 + alldata = self.env['dss.advertisefields.templates'].search([('displaytemplate',"=",template)]) + outlist = [] + self.env["confirmation.wizard"].with_context(hide_cancel=True).confirm_no_action_message(message="Debug : "+str(len(alldata))+"/"+str(alldata),title="Notification") + _logger.info("Screendesigner DataRequest : " + str(len(alldata))+"/"+str(alldata)) + for data in alldata: + outlist.append({'uuid' : data.uuid,'pos_x':data.btn_pos_x,'pos_y':data.btn_pos_y,'pos_w':data.btn_pos_w,'pos_h':data.btn_pos_h,'feldname':data.feldname}) + return outlist diff --git a/models/dss_contract.py b/models/dss_contract.py index ce21933..7791c33 100755 --- a/models/dss_contract.py +++ b/models/dss_contract.py @@ -776,8 +776,8 @@ class dsscontracts(models.Model): kampagnen=self.env['dss.ads'].search([('contract','=',self.id)]) _logger.info('Prüfe Medien : C_'+str(self.id)+' alle Kamp : '+str(kampagnen)) for kamp in kampagnen: - _logger.info('Prüfe Medien : C_'+str(self.id)+'A_'+str(kamp.id)) - if kamp: + _logger.info('Prüfe Medien : C_'+str(self.id)+'A_'+str(kamp.id)+' - P_'+str(kamp.parent_ad)) + if kamp: mediaids = [] medias = self.env['dss.mediarelations'].search([('ad','=',kamp.id)]) if not medias: @@ -859,8 +859,9 @@ class dsscontracts(models.Model): 'target':'current', 'context':'{"kampagne_id":'+str(kampagne.id)+',"show_project_update":True}', 'context':'', - 'res_id':kampagne.id, - 'display_name' : 'Änderung zur Werbekampagne '+kampagne.parent_ad.adname, + 'res_id':self.ads_last_ad.id, + #kampagne.id, +# 'display_name' : 'Änderung zur Werbekampagne '+kampagne.parent_ad.adname, 'domain':'[("id","=","context[kampagne_id]")]' } def setFirstKampagne(self): diff --git a/models/dss_display_templates.py b/models/dss_display_templates.py index a79e29e..9616d50 100755 --- a/models/dss_display_templates.py +++ b/models/dss_display_templates.py @@ -48,7 +48,8 @@ class dssadvertisefields(models.Model): # 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) - + fullsize_w = fields.Integer("Auflösung Breite",tracking=True) + fullsize_h = fields.Integer("Auflösung Höhe",tracking=True) def _default_create_date(self): return str(date.today()) @@ -59,3 +60,15 @@ class dssadvertisefields(models.Model): @api.model def _default_uuid(self): return str(uuid.uuid4()) + + @api.model + def get_data(self): + alldata = self.env['dss.display.templates'].search([]) + outlist = [] + self.env["confirmation.wizard"].with_context(hide_cancel=True).confirm_no_action_message(message="Debug : "+str(len(alldata))+"/"+str(alldata),title="Notification") + _logger.info("Screendesigner Displaydata DataRequest : " + str(len(alldata))+"/"+str(alldata)) + a = 0 + for data in alldata: + a += 1 + outlist.append({'uuid' : data.uuid,'displayname':data.displayname,'fullsizew':data.fullsize_w,'fullsizeh':data.fullsize_w,'nr':a}) + return outlist diff --git a/models/dss_m2mmail.py b/models/dss_m2mmail.py new file mode 100644 index 0000000..aad798b --- /dev/null +++ b/models/dss_m2mmail.py @@ -0,0 +1,14 @@ +from odoo import api, fields, models, _ +from odoo import tools + + +class dssm2mvalues(models.Model): + _name = "dss.m2mmail" + _description = "DigitalSignage M2M Rückmeldungen" +# _rec_name = "statusname" + _inherit = ['mail.thread', 'mail.activity.mixin'] + uuid = fields.Char(default=lambda self: self._default_uuid(), required=True, readonly=True, copy=False, string='UUID') + + @api.model + def _default_uuid(self): + return str(uuid.uuid4()) diff --git a/models/dss_trigger.py b/models/dss_trigger.py index 4f30522..52fa504 100644 --- a/models/dss_trigger.py +++ b/models/dss_trigger.py @@ -138,7 +138,7 @@ class dsstriggergroups(models.Model): def run_triggers(self, changes, Dataset, triggers): _logger.info("Trigger in run_triggers ! - start count :"+str(len(triggers)) ) for trig in triggers: - _logger.info("Trigger in run_triggers - Working on : "+str(trig.id)) + _logger.info("Trigger in run_triggers - Working on : "+str(trig.triggername)+'('+str(trig.id)+')') dochecktrigger = False if (changes == False): diff --git a/models/dss_web_contracts.py b/models/dss_web_contracts.py index 308beda..cd7490a 100644 --- a/models/dss_web_contracts.py +++ b/models/dss_web_contracts.py @@ -168,8 +168,9 @@ class dsscontracts(models.Model): 'contract_name': self.contract_name, 'contract_state': self.env['dss.contractstate'].search([("statusname","=","Angelegt")]).id, 'werbe_feld_selected': self.werbe_feld_selected, - 'client': self.client.id, + 'client': self.client, 'client_short_vorname': self.client_short_vorname, + 'client_short_name': self.client_short_name, 'client_short_email': self.client_short_email, 'client_short_telefon': self.client_short_telefon, 'client_short_mobil': self.client_short_mobil, diff --git a/security/ir.model.access.csv b/security/ir.model.access.csv index c593f82..1d904a1 100755 --- a/security/ir.model.access.csv +++ b/security/ir.model.access.csv @@ -45,3 +45,4 @@ DigitalSignage_dss_activity_mixin,access.dss.activity_mixin,DigitalSignage.model 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 +DigitalSignage_dss_m2mmail,access.dss.m2mmail,DigitalSignage.model_dss_m2mmail,base.group_user,1,1,1,1 diff --git a/static/src/js/dss_screenview_archparser.js b/static/src/js/dss_screenview_archparser.js new file mode 100644 index 0000000..041301c --- /dev/null +++ b/static/src/js/dss_screenview_archparser.js @@ -0,0 +1,60 @@ +/** @odoo-module */ + +import { XMLParser } from "@web/core/utils/xml"; + +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; + } + } + }); + return archInfo; + } +} +// parse(arch) { +// const xmlDoc = this.parseXML(arch); +// const fieldFromTheArch = xmlDoc.getAttribute("fieldFromTheArch"); +// return { +// fieldFromTheArch, +// }; +// } +//} \ No newline at end of file diff --git a/static/src/js/dss_screenview_controller.js b/static/src/js/dss_screenview_controller.js new file mode 100644 index 0000000..7eec9d0 --- /dev/null +++ b/static/src/js/dss_screenview_controller.js @@ -0,0 +1,28 @@ +/** @odoo-module **/ +import { Layout } from "@web/search/layout"; +import {useService } from "@web/core/utils/hooks"; +import { Component, onWillStart, useState} from "@odoo/owl"; +export class ScreenViewController extends Component { + setup() { + this.orm = useService("orm"); + + // 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(); + }); + } +}; + +ScreenViewController.template = "dss.screenview"; +ScreenViewController.components = { Layout }; diff --git a/static/src/js/dss_screenview_model.js b/static/src/js/dss_screenview_model.js new file mode 100644 index 0000000..6bc89a9 --- /dev/null +++ b/static/src/js/dss_screenview_model.js @@ -0,0 +1,24 @@ +/** @odoo-module **/ +import { KeepLast } from "@web/core/utils/concurrency"; + +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; + this.keepLast = new KeepLast(); + } + + 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; + } +} \ No newline at end of file diff --git a/static/src/js/dss_screenview_register.js b/static/src/js/dss_screenview_register.js new file mode 100644 index 0000000..afc9d99 --- /dev/null +++ b/static/src/js/dss_screenview_register.js @@ -0,0 +1,40 @@ +/** @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, + }; + + } +}; +// 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 new file mode 100644 index 0000000..3db1fed --- /dev/null +++ b/static/src/js/dss_screenview_renderer.js @@ -0,0 +1,8 @@ +/** @odoo-module **/ +import { Component } from "@odoo/owl"; +export class ScreenViewRenderer extends Component { + async setup() { + } + +} +ScreenViewRenderer.template = "dss.screenviewrenderer"; diff --git a/static/src/js/screenDesignerView.js b/static/src/js/screenDesignerView.js index 6897729..087b4e6 100644 --- a/static/src/js/screenDesignerView.js +++ b/static/src/js/screenDesignerView.js @@ -11,17 +11,47 @@ var _t = core._t; var rpc = require('web.rpc'); var self = this; var session = require('web.session'); +var viewRegistry = require('web.view_registry'); +var aktcontext = ""; +function _onclickevent(event) { + // Check if the clicked element has the class "button" + if (event.target.classList.contains("ddbtn")) { + alert(JSON.stringify($(event.currentTarget))) + }; +}; +function _onchangeevent(event) { + // Check if the clicked element has the class "button" + if (event.target.classList.contains("ddown")) { + // Your event handler code + // here +// alert($(this)) +// alert(event.target.value) +// alert(JSON.stringify($(event.target.value))) + aktcontext.context.screenlayout = event.target.value + alert(aktcontext); + rpc.query({model: 'dss.screendesign', + method: 'myscreenrebuild', + args: [this.res_id], + }).then(function (result) { + alert(JSON.stringify(result)); + event.do_action(result); + return result; + }); + } +}; var screenDesigner = AbstractAction.extend({ - contentTemplate: 'dssscreenDesignerView', - init: function(parent, context) { + contentTemplate: 'screen_view.ScreenView', + init: function(parent, context) { this._super(parent, context); + aktcontext = context; this.dashboard_templates = ['MainSection']; }, start: function() { var self = this; + alert(aktcontext.context.screenlayout); this.set("title", 'Dashboard'); return this._super().then(function() { self.render_dashboards(); @@ -33,31 +63,67 @@ var screenDesigner = AbstractAction.extend({ }, render_dashboards: function() { var self = this; - this.fetch_data() + var meins = ""; var templates = [] var templates = ['MainSection']; - _.each(templates, function(template) { - self.$('.o_hr_dashboard').append(QWeb.render(template, {widget: self})) - }); - }, - fetch_data: function() { - var self = this -// fetch data to the tiles - var def1 = this._rpc({ - model: 'dss.screendesign', - method: "get_data", - }) - .then(function (result) { - $('#product_templates').append('' + result.uuid + ''); - $('#variants_count').append('' + result.uuid + ''); - $('#products_storable').append('' + result.uuid + ''); - $('#product_consumable').append('' + result.uuid + ''); - }); + + 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)); + }) + } + + _.each(templates, function(template) {self.$('.meinfeld').append(meins)}); + }) + + document.addEventListener("click",_onclickevent) + document.addEventListener("change",_onchangeevent) + + var def1 =this._rpc({ + model: 'dss.advertisefields.templates', + method: "get_data", + args: [[aktcontext.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 = '
Test
+