573 lines
31 KiB
Python
Executable File
573 lines
31 KiB
Python
Executable File
import ast
|
|
import datetime
|
|
import json
|
|
import re
|
|
from .dsslogger import OdooCustomLogger
|
|
import logging
|
|
import uuid
|
|
import base64
|
|
import subprocess
|
|
import tempfile
|
|
import requests
|
|
#from symbol import return_stmt
|
|
import json
|
|
from types import SimpleNamespace
|
|
|
|
|
|
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
|
|
from webdav4.client import Client
|
|
from webdav4.fsspec import WebdavFileSystem
|
|
import sys
|
|
|
|
TUYA_LOGGER.setLevel(logging.DEBUG)
|
|
|
|
logging.setLoggerClass(OdooCustomLogger)
|
|
_logger = logging.getLogger(__name__)
|
|
|
|
|
|
class dssprojects(models.Model):
|
|
|
|
|
|
_name = "dss.projects"
|
|
_description = "DigitalSignage Projekte"
|
|
_rec_name = "projektname"
|
|
_inherit = ['mail.thread','mail.activity.mixin','dss.triggermodel']
|
|
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)
|
|
short_partner_description = fields.Char('Kurz-Beschreibung für Kunden',tracking=True)
|
|
partner_description = fields.Text('Beschreibung für Kunden',tracking=True)
|
|
systemname = fields.Many2one('dss.systems',tracking=True)
|
|
grundsystemname = fields.Many2one('dss.systemtypen',group_expand='_read_group_system_ids',tracking=True)
|
|
grundsystem_typ = fields.Char(related='grundsystemname.kennung',tracking=True)
|
|
grundsystemnameuuid = fields.Char(related='grundsystemname.uuid',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')
|
|
grundsystem_default_cloud_structure_project = fields.Char(related='grundsystemname.default_cloud_structure_project')
|
|
grundsystem_default_cloud_structure_contract = fields.Char(related='grundsystemname.default_cloud_structure_contract')
|
|
grundsystem_showonlinestate = fields.Boolean(related='grundsystemname.showonlinestate')
|
|
grundsystem_showonlinestate_type = fields.Selection(related='grundsystemname.showonlinestate_type')
|
|
grundsystemicon_different = fields.Boolean('Grundsystem Icon anders',default=False,tracking=True)
|
|
grundsystemicon_different_image = fields.Binary('Anderes Icon',tracking=True)
|
|
|
|
btntemplate = fields.Many2one('dss.display.templates',string='Buttonsvorlage',tracking=True)
|
|
btntemplate_displaytemplate_fullsize_w = fields.Integer(related='btntemplate.fullsize_w',string="Auflösung Breite",tracking=True)
|
|
btntemplate_displaytemplate_fullsize_h = fields.Integer(related='btntemplate.fullsize_h',string="Auflösung Höhe",tracking=True)
|
|
|
|
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)
|
|
|
|
zahlungsvorlauf = fields.Integer('Wochen Zahlungsvorlauf', 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_image_2 = fields.Binary('Google Bild 2',tracking=True)
|
|
maps_image_3 = fields.Binary('Google Bild 3',tracking=True)
|
|
maps_text = fields.Html('Google Beschreibung',tracking=True)
|
|
maps_typ_interactive = fields.Boolean('Ist Interactive ?', tracking=True)
|
|
maps_visitors = fields.Integer('Besucher pro Tag', tracking=True)
|
|
maps_displaytyp = fields.Char('Anzeigetyp in Google', tracking=True)
|
|
maps_displaysize = fields.Char('Anzeigegroesse in Google',tracking=True)
|
|
maps_werbeflaechen_a_free = fields.Boolean('Werbeflächen 1 Frei', tracking=True)
|
|
maps_werbeflaechen_a = fields.Char('Werbeflächenbeschreibung 1',tracking=True)
|
|
maps_werbeflaechen_b_free = fields.Boolean('Werbeflächen 2 Frei', tracking=True)
|
|
maps_werbeflaechen_b = fields.Char('Werbeflächenbeschreibung 2',tracking=True)
|
|
maps_werbemedien = fields.Char('Werbeflächen-Dateien',tracking=True)
|
|
maps_freespaces_b_show = fields.Boolean('Freie Flächen zeigen ?', tracking=True)
|
|
maps_freespaces_b = fields.Char('Freie Werbeflächen',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)
|
|
project_grafiker = fields.Many2one('res.partner',domain="['&',('dssinternpartner','=',True),('dssinternpartner_grafik','=',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)
|
|
zeiten_notiz = fields.Char('Schaltzeiten Notizen', tracking=True)
|
|
errichtet_am = fields.Date('Errichtungstag',tracking=True)
|
|
cancel_am_in = fields.Date('Kündigung Insti - Eingang Kündigung',tracking=True)
|
|
cancel_am_to = fields.Date('Kündigung Insti - Kündigung zum',tracking=True)
|
|
finish_am = fields.Date('Beendigungstag',tracking=True)
|
|
standort_inout = fields.Selection([('indoor','im Gebäude'), ('outdoor','Aussenbereich'), ('semiindoor','Überdachter Aussenbereich'),('Divers','Andere Art')],tracking=True)
|
|
|
|
date_start_compute = fields.Date('Kalender Start intern',compute='_compute_calendar_start')
|
|
|
|
cloudlink = fields.Char('Cloud Verzeichnis',help='Verzeichnis für das Project innerhalb des Cloud Struktur')
|
|
maintains = fields.Many2many('dss.maintaintask',string="Einsätze am Projekt")
|
|
|
|
marker_list = fields.Many2many('dss.marker', string='vorhandene Marker', 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):
|
|
project_system_ids = self.env['dss.systemtypen'].search([('open_close_standard_state','=',False)], order='order')
|
|
return project_system_ids
|
|
|
|
def jumpcloud(self):
|
|
urlbase=str(self.env['dss.settings'].search([], limit=1).def_cloud_url_base)
|
|
_logger.info("Cloud Open Link Urlbase DB " + str(urlbase))
|
|
if not urlbase:
|
|
urlbase = 'https://cloud.logumedia.de/index.php/apps/files/?dir=';
|
|
_logger.info("Cloud Open Link Urlbase Used " + str(urlbase))
|
|
url=str(urlbase)+str(dss_settings.dssSettings._get_path_converted(self,self.cloudlink,self))
|
|
_logger.info("Cloud Open Link " + str(url))
|
|
return {
|
|
'type': 'ir.actions.act_url',
|
|
'url': str(url),
|
|
'target': 'new',
|
|
}
|
|
|
|
@api.model
|
|
def _compute_calendar_start(self):
|
|
for record in self:
|
|
if record.errichtet_am:
|
|
record.date_start_compute=record.errichtet_am
|
|
else:
|
|
record.date_start_compute=date.today()
|
|
|
|
@api.model
|
|
def _default_uuid(self):
|
|
return str(uuid.uuid4())
|
|
|
|
def _track_template(self, changes):
|
|
res = super()._track_template(changes)
|
|
if self.run_trigger:
|
|
self.trigger_track_template(changes, self)
|
|
return res
|
|
|
|
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,screenview',
|
|
# '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)+')]'
|
|
# }
|
|
|
|
action = self.env["ir.actions.actions"]._for_xml_id("DigitalSignage.action_dss_project_contracts")
|
|
return action
|
|
# context = ast.literal_eval(context)
|
|
# context = "{
|
|
# 'create': self.active,
|
|
# 'active_test': self.active
|
|
# }7
|
|
# 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
|
|
|
|
def pyaction_dss_project_set_def_cloud(self):
|
|
self.cloudlink = str(self.env['dss.settings'].search([], limit=1).def_project_cloudpath)
|
|
return True
|
|
|
|
@api.model
|
|
def _compute_getonlinestate(self):
|
|
colorval = "#a0a0a0"
|
|
self.onlinestate = colorval
|
|
|
|
@api.model
|
|
def compute_getonlinestate2(self,project):
|
|
projekte = self.env['dss.projects'].search([('grundsystem_showonlinestate','=',True)])
|
|
for pro in projekte:
|
|
self.compute_getonlinestate_single(pro)
|
|
|
|
@api.model
|
|
def get_data(self,template):
|
|
if not template:
|
|
outlist = [{"error":"Kein Projekt übermittelt"}]
|
|
else:
|
|
project = self.env['dss.projects'].search([('id',"=",template)])
|
|
contracts = self.env['dss.contracts'].search([('project',"=",project.id),('contract_state','=',4)])
|
|
if not project.btntemplate:
|
|
outlist=[{"error":"Kein Button-template definiert"}]
|
|
else:
|
|
#alldata = self.env['dss.advertisefields.templates'].search([('displaytemplate',"=",project.btntemplate.id)])
|
|
outlist = ([])
|
|
#self.env["confirmation.wizard"].with_context(hide_cancel=True).confirm_no_action_message(message="Debug : "+str(len(alldata))+"/"+str(alldata),title="Notification")
|
|
for contract in contracts:
|
|
for feld in contract.werbe_feld_selected:
|
|
if feld.is_btn:
|
|
if contract.client:
|
|
name1 = contract.contact_company_name
|
|
name2 = contract.contact_dsspartner_vorname+' '+contract.contact_dsspartner_name
|
|
name3 = contract.contact_street2
|
|
name4 = contract.contact_zip+' '+contract.contact_city
|
|
else:
|
|
name1 = contract.client_short_company
|
|
name2 = contract.client_short_vorname+' '+contract.client_short_name
|
|
name3 = contract.client_short_strasse
|
|
name4 = contract.client_short_plz+' '+contract.client_short_ort
|
|
|
|
if feld.btn_image_bin:
|
|
# Convert the binary image data to a Base64 string
|
|
image_base64 = str(feld.btn_image_bin)[2:][:-1]
|
|
else:
|
|
image_base64 = ''
|
|
_logger.info("Button Image : "+str(feld.btn_image_bin))
|
|
outlist.append({'uuid':contract.uuid,'pos_x':feld.btn_pos_x,'pos_y':feld.btn_pos_y,'pos_w':feld.btn_pos_w,'pos_h':feld.btn_pos_h,'feldname':feld.feldname,'kunde_1':name1,'kunde_2':name2,'kunde_3':name3,'kunde_4':name4,'btn_image':image_base64})
|
|
return outlist
|
|
|
|
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'):
|
|
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))
|
|
r = requests.post(vnurl, json={"password": vnpassword,"username": vnusername})
|
|
if (str(r.status_code) == "200"):
|
|
content = str(r.json())
|
|
index = content.find("token")
|
|
content = content[index+9:]
|
|
index = content.find("',")
|
|
token = content[:index]
|
|
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_1']=colorval
|
|
|
|
@api.model
|
|
def go_contract(self,uuid):
|
|
_logger.info("UUID : "+str(uuid))
|
|
if uuid:
|
|
contract = self.env['dss.contracts'].search([('uuid','=',uuid)])
|
|
if contract:
|
|
action = self.env["ir.actions.actions"]._for_xml_id("DigitalSignage.action_dss_contracts")
|
|
action['context'] = {'default_project': contract.project.id}
|
|
action['domain'] = [('id', '=', contract.id)]
|
|
action['res_id'] = contract.id
|
|
return action
|
|
else:
|
|
_logger.info("UUID : "+str(uuid)+" not found")
|
|
return False
|
|
else:
|
|
_logger.info("UUID : "+str(uuid)+" not found")
|
|
return False
|
|
|
|
def getScreenViewData(self,domain):
|
|
ViewParams = {}
|
|
ViewParams.screensize_x=1980
|
|
ViewParams.screensize_y=1024
|
|
return ViewParams
|
|
|
|
def method(self):
|
|
return (
|
|
self.env["confirmation.wizard"]
|
|
.with_context(hide_cancel=True)
|
|
.confirm_no_action_message(
|
|
message="Message",
|
|
title="Notification"
|
|
)
|
|
)
|
|
@api.model
|
|
def newwizzard(self):
|
|
_logger.info("Create new Project")
|
|
action = self.env["ir.actions.actions"]._for_xml_id("DigitalSignage.new_wizard_action")
|
|
action['context'] = {'default_state': 'start'}
|
|
|
|
return action
|
|
|
|
|
|
|
|
class dssprojects_new_wizard(models.TransientModel):
|
|
_name = "dss.projects.new.wizard"
|
|
_description = "DigitalSignage Projekte - Wizard"
|
|
#_inherit = ['mail.thread','mail.activity.mixin']
|
|
_inherit = ['multi.step.wizard.mixin']
|
|
_rec_name = "projectid"
|
|
|
|
state = fields.Selection(selection='_selection_state', string='Status', default='start')
|
|
allow_back = fields.Boolean('Allow Back', default=False)
|
|
projectid = fields.Integer('Projekt ID', required=True)
|
|
projektname = fields.Char('Projektname', required=True)
|
|
name = fields.Char('Interner Name', required=True)
|
|
aktstatus = fields.Many2one('dss.projectstate',string='Aktueller Status:')
|
|
grundsystemname = fields.Many2one('dss.systemtypen', required=True)
|
|
grundsystemnameuuid = fields.Char(related='grundsystemname.uuid')
|
|
grundsystemicon = fields.Image(related='grundsystemname.icon')
|
|
grundsystem_default_adstructure = fields.Many2one(related='grundsystemname.default_adstructure')
|
|
grundsystem_ordner = fields.Char(related='grundsystemname.default_cloud_path')
|
|
isdifferendcouldstructure = fields.Boolean('Andere Cloud Struktur ?')
|
|
cloudgenerate = fields.Boolean('Cloud Struktur erzeugen ?')
|
|
differendcouldstructurefolder = fields.Char('Cloud Struktur')
|
|
kundenbeschreibung = fields.Char('Kundenbeschreibung')
|
|
run_uni_trigger = fields.Boolean('Allgemeine Trigger aktiv',default=True)
|
|
cloudlink = fields.Char('Cloud Verzeichnis',help='Verzeichnis für das Project innerhalb des Cloud Struktur')
|
|
|
|
standort = fields.Char('Beschreibung des Standortes')
|
|
standort_strasse = fields.Char('Strasse des Projektes')
|
|
standort_plz = fields.Char('PLZ des Projektes')
|
|
standort_ort = fields.Char('Ort des Projektes')
|
|
standort_bundesland = fields.Many2one('res.country.state',string='Bundesland des Projektes')
|
|
standort_land = fields.Many2one('res.country',string='Land des Projektes')
|
|
|
|
vertragsschreiber = fields.Many2one('res.partner',domain="['&',('dsspartner','=',True),('dsspartner_vertrieb','=',True)]")
|
|
standortpartner = fields.Many2one('res.partner',domain="['&',('dsspartner','=',True),('dsspartner_standort','=',True)]")
|
|
vertriebspartner = fields.Many2many('res.partner',domain="['&',('dsspartner','=',True),('dsspartner_vertrieb','=',True)]")
|
|
project_grafiker = fields.Many2one('res.partner',domain="['&',('dssinternpartner','=',True),('dssinternpartner_grafik','=',True)]")
|
|
|
|
@api.model
|
|
def _selection_state(self):
|
|
return [
|
|
('start', 'Start'),
|
|
('configure', 'Configure'),
|
|
('custom', 'Customize'),
|
|
('final', 'Final'),
|
|
]
|
|
|
|
def open_next(self):
|
|
_logger.info("Open Next")
|
|
# if self.state == 'start': self.state = 'configure'
|
|
# elif self.state == 'configure': self.state = 'custom'
|
|
# elif self.state == 'custom': self.state = 'final'
|
|
# elif self.state == 'final': self.action_create_project()
|
|
self.action_create_project()
|
|
|
|
def open_previous(self):
|
|
_logger.info("Open Previous")
|
|
if self.state == 'configure':
|
|
self.state = 'start'
|
|
elif self.state == 'custom':
|
|
self.state = 'configure'
|
|
elif self.state == 'final':
|
|
self.state = 'custom'
|
|
|
|
def state_exit_start(self):
|
|
self.state = 'configure'
|
|
|
|
def state_exit_configure(self):
|
|
self.state = 'custom'
|
|
|
|
def state_exit_custom(self):
|
|
self.state = 'final'
|
|
|
|
def _create_cloud_structure(self, newProjekt, isdifferendcouldstructure, differendcouldstructurefolder):
|
|
_logger.info("Create Cloud Structure for Project "+str(newProjekt.id)+" - "+str(newProjekt.cloudlink))
|
|
if isdifferendcouldstructure:
|
|
cloudpath = str(differendcouldstructurefolder)
|
|
else:
|
|
cloudpath = str(newProjekt.grundsystem_default_cloud_structure_project)
|
|
|
|
client = Client("https://cloud.logumedia.de/remote.php/dav/files/OdooDav/", auth=("odooClient@logumedia.de", "lm2020#OdooDav"))
|
|
new_folder = dss_settings.dssSettings.getprojectpath(self,newProjekt)
|
|
_logger.info("Neuer Cloud Path : "+str(new_folder))
|
|
try:
|
|
#client.mkdir(new_folder)
|
|
#_logger.info("Make Cloud Path : "+str(new_folder))
|
|
if isdifferendcouldstructure:
|
|
_logger.info("Create Differend Cloud Structure for Project "+str(newProjekt.id)+" - "+str(newProjekt.cloudlink))
|
|
client.copy(differendcouldstructurefolder+'/',new_folder)
|
|
_logger.info("Make Differend Cloud Path : "+str(new_folder+'/'+str(differendcouldstructurefolder)))
|
|
else:
|
|
_logger.info("Create Standard Cloud Structure for Project "+str(newProjekt.id)+" - "+str(newProjekt.cloudlink))
|
|
client.copy(newProjekt.grundsystem_default_cloud_structure_project+'/',new_folder)
|
|
_logger.info("Make Standard Cloud Path : "+str(new_folder+'/'+str(newProjekt.grundsystem_default_cloud_structure_project)))
|
|
except Exception as e:
|
|
_logger.info("Make Cloud Path error : "+str(e))
|
|
return True
|
|
|
|
|
|
def action_create_project(self):
|
|
_logger.info("Create Project")
|
|
newProjekt = self.env['dss.projects'].create({'projektname':self.projektname,'name':self.name,'aktstatus':self.aktstatus.id,'projectid':self.projectid,'grundsystemname':self.grundsystemname.id,'grundsystemnameuuid':self.grundsystemnameuuid,'grundsystemicon':self.grundsystemicon,'grundsystem_ordner':self.grundsystem_ordner,'grundsystem_default_adstructure':self.grundsystem_default_adstructure,'standort':self.standort,'standort_ort':self.standort_ort,'standort_plz':self.standort_plz,'standort_land':self.standort_land.id,'standort_bundesland':self.standort_bundesland.id,'standort_strasse':self.standort_strasse,'vertragsschreiber':self.vertragsschreiber.id,'standortpartner':self.standortpartner.id,'vertriebspartner': self.vertriebspartner.ids,'project_grafiker': self.project_grafiker.id,'short_partner_description':self.kundenbeschreibung})
|
|
newProjekt.cloudlink = dss_settings.dssSettings.getprojectpath(self,newProjekt)
|
|
if newProjekt:
|
|
_logger.info("Project created with ID : "+str(newProjekt.id))
|
|
if self.cloudgenerate:
|
|
_logger.info("Create Cloud Structure for Project "+str(newProjekt.id)+" - "+str(newProjekt.cloudlink))
|
|
self._create_cloud_structure(newProjekt,self.isdifferendcouldstructure, self.differendcouldstructurefolder)
|
|
return True
|
|
|
|
|
|
|