156 lines
7.7 KiB
Python
156 lines
7.7 KiB
Python
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
|