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 . import dss_settings 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 dssprojects(models.Model): _name = "dss.projects" _description = "DigitalSignage Projekte" _rec_name = "projektname" _inherit = ['mail.thread','mail.activity.mixin'] projektname = fields.Char('Projektname', required=True) uuid = fields.Char(default=lambda self: self._default_uuid(), required=True, readonly=True, copy=False, string='UUID') projectid = fields.Integer('Projekt ID',tracking=True) color = fields.Char('Color Index',tracking=True) active = fields.Boolean('Active', default=True,tracking=True) invisible = fields.Boolean('Ausgeblendet', default=False,tracking=True) name = fields.Char('Interner Name', required=True,tracking=True) aktstatus = fields.Many2one('dss.projectstate',string='Aktueller Status:',tracking=True) aktstatus_typ = fields.Selection(related='aktstatus.typ') aktstatus_color = fields.Char(related='aktstatus.color') aktstatus_icon = fields.Image(related='aktstatus.icon') description = fields.Text('Beschreibung',tracking=True) systemname = fields.Many2one('dss.systems',tracking=True) grundsystemname = fields.Many2one('dss.systemtypen',tracking=True) grundsystemicon = fields.Image(related='grundsystemname.icon',tracking=True) grundsystem_default_adstructure = fields.Many2one(related='grundsystemname.default_adstructure',tracking=True) grundsystemicon5050 = fields.Image(related='grundsystemname.icon_5050') grundsystem_ordner = fields.Char(related='grundsystemname.default_cloud_path') standort = fields.Char('Beschreibung des Standortes') standort_strasse = fields.Char('Strasse des Projektes',tracking=True) standort_plz = fields.Char('PLZ des Projektes',tracking=True) standort_ort = fields.Char('Ort des Projektes',tracking=True) standort_bundesland = fields.Many2one('res.country.state',string='Bundesland des Projektes',tracking=True) standort_land = fields.Many2one('res.country',string='Land des Projektes',tracking=True) standort_long = fields.Char('Standort Longitude',tracking=True) standort_lati = fields.Char('Standort Latitude',tracking=True) standort_visible = fields.Boolean('Auf Projekt-Karte sichtbar',tracking=True) maps_name = fields.Char('Name in Google',tracking=True) maps_type = fields.Char('Type in Google',tracking=True) maps_marker = fields.Selection([('m1.png','Marker 1'),('m2.png','Marker 2'),('m3.png','Marker 3'),('m4.png','Marker 4'),('m5.png','Marker 5'),('pin.png','Marker Pin'),('pin2.png','3D Marker Pin'),('pin_display.png','Displpay Pin'),('pin_display_touch.png','TouchDisplpay Pin'),('pin_led.png','LEDWand Pin')],'Marker in Google',tracking=True) maps_image = fields.Binary('Google Bild',tracking=True) maps_text = fields.Html('Google Beschreibung',tracking=True) vertragsschreiber = fields.Many2one('res.partner',domain="['&',('dsspartner','=',True),('dsspartner_vertrieb','=',True)]",tracking=True) standortpartner = fields.Many2one('res.partner',domain="['&',('dsspartner','=',True),('dsspartner_standort','=',True)]",tracking=True) vertriebspartner = fields.Many2many('res.partner',domain="['&',('dsspartner','=',True),('dsspartner_vertrieb','=',True)]",tracking=True) zeiten_on = fields.Datetime('veraltet',tracking=True) zeiten_off = fields.Datetime('veraltet',tracking=True) zeitenf_on = fields.Float('Einschaltzeit',tracking=True) zeitenf_off = fields.Float('Ausschaltzeit',tracking=True) errichtet_am = fields.Date('Errichtungstag',tracking=True) standort_inout = fields.Selection([('indoor','im Gebäude'), ('outdoor','Aussenbereich'), ('semiindoor','Überdachter Aussenbereich'),('Divers','Andere Art')],tracking=True); cloudlink = fields.Char('Cloud Verzeichnis',help='Verzeichnis für das Project innerhalb des Cloud Struktur') @api.model def _default_uuid(self): return str(uuid.uuid4()) def pyaction_view_contracts(self): # action = self.env['ir.actions.act_window'].with_context({'default_project': self.id})._for_xml_id('DigitalSignage.action_dss_project_contracts') # action['display_name'] = self.projektname # context = action['context'].replace('active_id', str(self.id)) # domain = action['domain'].replace('active_id', str(self.id)) # _logger.info('Vertraege fuer : '+str(self.id)) return { 'type': 'ir.actions.act_window', 'view_type':'kanban', 'view_mode':'kanban,tree', 'res_model':'dss.contracts', 'target':'current', 'context':'{"default_project":'+str(self.id)+',"show_project_update":True}', 'res_id':self.id, 'display_name' : self.name, 'domain':'[("project","=",'+str(self.id)+')]' } # context = ast.literal_eval(context) # context = "{ # 'create': self.active, # 'active_test': self.active # } # action['context'] = context # action['domain'] = domain # return action @api.onchange('cloudlink') def _onchange_cloudlink(self): _logger.info("Project "+str(self.id)+" Cloudpath changed") if (self.cloudlink == ''): if (self._origin.cloudlink != ''): _logger.info("Project " + str(self.id) + " deleted - using standard path") self.cloudlink = dss_settings.dssSettings._get_path_converted(self,self.env['dss.settings'].search([],limit=1).def_project_cloudpath,self) def switch_invislbe(self): return { 'type': 'ir.actions.act_window', 'view_type':'kanban', 'view_mode':'kanban,tree', 'res_model':'dss.contracts', 'target':'current', 'context':'{"default_project":'+str(self.id)+',"show_project_update":True}', 'res_id':self.id, 'display_name' : self.projektname, 'domain':'[("project","=",'+str(self.id)+')]' } @api.model def _geo_localize(self, street='', zip='', city='', state='', country=''): geo_obj = self.env['base.geocoder'] search = geo_obj.geo_query_address(street=street, zip=zip, city=city, state=state, country=country) result = geo_obj.geo_find(search, force_country=country) if result is None: search = geo_obj.geo_query_address(city=city, state=state, country=country) result = geo_obj.geo_find(search, force_country=country) return result def dss_geo_localize(self): # We need country names in English below result = self._geo_localize(self.standort_strasse, self.standort_plz, self.standort_ort, self.standort_bundesland.name, self.standort_land.name) if result: self.write({ 'standort_lati': result[0], 'standort_long': result[1] }) else: partners_not_geo_localized |= partner return True