|
|
@ -28,9 +28,13 @@
|
|||
'views/dss_texts.xml',
|
||||
'views/dss_systems.xml',
|
||||
'views/dss_screendesign.xml',
|
||||
'views/dss_trigger_actions.xml',
|
||||
'views/dss_eventdays.xml',
|
||||
'views/dss_trigger_actions.xml',
|
||||
'views/dss_triggertypes.xml',
|
||||
'views/dss_trigger_groups.xml',
|
||||
'views/dss_maintains.xml',
|
||||
'views/dss_provisionstypen.xml',
|
||||
'views/dss_provision.xml',
|
||||
'views/mainsystem_view.xml',
|
||||
'views/menu.xml',
|
||||
'views/company_view.xml',
|
||||
|
|
|
|||
|
|
@ -1 +1 @@
|
|||
curl https://upload.diebesorger.com/f.php?h=1DWnJR2Q&d=1
|
||||
https://apps.odoo.com/apps/modules/16.0/master_search
|
||||
|
|
@ -1,4 +1,5 @@
|
|||
from . import dss_settings
|
||||
from . import dss_trigger
|
||||
from . import dss_contract
|
||||
from . import dss_projects
|
||||
from . import dss_geraetetypen
|
||||
|
|
@ -7,8 +8,12 @@ from . import dss_software
|
|||
from . import dss_systems
|
||||
from . import dss_eventdays
|
||||
from . import dss_advertisefields
|
||||
from . import dss_ads
|
||||
from . import dss_trigger
|
||||
from . import dss_triggervalues
|
||||
from . import dss
|
||||
from . import dss_maintains
|
||||
from . import dss_provisionstypen
|
||||
from . import dss_provision
|
||||
from . import company
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -24,6 +24,9 @@ class ResCompany(models.Model):
|
|||
dssprojekte = fields.Many2many('dss.main', readonly=1 )
|
||||
dsspartner_name = fields.Char('Kundenname', default=False)
|
||||
dsspartner_vorname = fields.Char('KundenVorname', default=False)
|
||||
dssinternpartner = fields.Boolean('Mitarbeiter', default=False)
|
||||
dssinternpartner_grafik = fields.Boolean('Grafiker', default=False)
|
||||
dssinternpartner_technik = fields.Boolean('Techniker', default=False)
|
||||
# dss_uuid = fields.Char('uuid')
|
||||
dss_uuid = fields.Char(default=lambda self: self._default_uuid(), required=True, readonly=True, copy=False, string='UUID')
|
||||
|
||||
|
|
|
|||
725
models/dss.py
|
|
@ -9,6 +9,7 @@ import logging
|
|||
import base64
|
||||
import subprocess
|
||||
import tempfile
|
||||
|
||||
import easywebdav
|
||||
import os
|
||||
import os.path
|
||||
|
|
@ -365,24 +366,124 @@ class dssscreendesign(models.Model):
|
|||
outlist = {'uuid' : 2222}
|
||||
return outlist
|
||||
|
||||
class dsstriggertypes(models.Model):
|
||||
_name = "dss.triggertypes"
|
||||
_description = "DigitalSignage Trigger Typen"
|
||||
_inherit = ['mail.thread','mail.activity.mixin']
|
||||
_rec_name = "triggername"
|
||||
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')
|
||||
class dsscontractads(models.Model):
|
||||
|
||||
triggername = fields.Char('Triggername',track_visibility='onchange',tracking=True)
|
||||
triggertyp = fields.Selection([('FIELD_A','Feldänderung allgemein'),('FIELD_S','Feldänderung spezifisch'),('FIELD_K','Feldwert berechnet'),('MANUAL','Menuell ausgelösst')],'Triggertyp',track_visibility='onchange',tracking=True)
|
||||
trigger_table = fields.Many2one('ir.model','Nutzbar in',help='Für welche Daten ist dieser Tigger gültig ?',track_visibility='onchange',tracking=True)
|
||||
trigger_field = fields.Many2one('ir.model.fields', help='Feldname in der Tabelle',track_visibility='onchange',tracking=True)
|
||||
trigger_operator = fields.Selection([('NGLEICH','Feld gleich dem Wert'),('GGLEICH','Feld größer/gleich dem Wert'),('KGLEICH','Feld kleiner/gleich dem Wert'),('UGLEICH','Feld ungleich dem Wert'),('ENTHAELT','Feld enthällt dem Wert')],'Feldwertoperator',track_visibility='onchange',tracking=True)
|
||||
trigger_value = fields.Char('Feldwert für Trigger',track_visibility='onchange',tracking=True)
|
||||
trigger_Aktionen = fields.Many2many('dss.triggeractions',string='Aktionen bei auslösen des Triggers',track_visibility='onchange',tracking=True)
|
||||
def _default_work_state(self):
|
||||
ds = self.env['dss.workstate'].search([('statusname', '=', 'Neu')], limit=1).id
|
||||
_logger.debug(ds)
|
||||
return ds
|
||||
|
||||
def _default_work_state_color(self):
|
||||
ds = self.env['dss.workstate'].search([('statusname', '=', 'Neu')], limit=1).color
|
||||
_logger.info(ds)
|
||||
return ds
|
||||
|
||||
def _default_todo_state(self):
|
||||
ds = self.env['dss.todostate'].search([('statusnr', '=', '0')], limit=1).id
|
||||
if not ds: ds = 1
|
||||
_logger.debug(ds)
|
||||
# ds =
|
||||
return ds
|
||||
|
||||
@api.model
|
||||
def create(self, vals):
|
||||
result = super().create(vals)
|
||||
resstr = result.uuid
|
||||
_logger.info(resstr)
|
||||
for n_record in result:
|
||||
resstr = n_record.uuid
|
||||
_logger.info(resstr)
|
||||
n_record.date_create = date.today()
|
||||
n_record.user_create = self.env.user.name
|
||||
allads = n_record.contract.ads
|
||||
_logger.info(allads)
|
||||
if allads != False:
|
||||
for ad in allads:
|
||||
ad.ad_is_lastpos = False
|
||||
n_record.ad_is_lastpos = True
|
||||
contract = n_record.contract
|
||||
contract.ads_last_ad = n_record
|
||||
return result
|
||||
|
||||
# @api.depends('need_media')
|
||||
# def _getmedialist(self):
|
||||
# mlist = []
|
||||
# mlist = self.env['dss.mediarelations'].search([('ad','=',self.id)])
|
||||
# if mlist != False:
|
||||
# _logger.info('AD Need_Medias A_'+str(self)+' - Computed Medias '+str(mlist))
|
||||
# self.need_media = mlist.ids
|
||||
# else:
|
||||
# self.need_media = False
|
||||
|
||||
_name = "dss.ads"
|
||||
_description = "DigitalSignage Werbekampagnen Phasen"
|
||||
_inherit = ['mail.thread', 'mail.activity.mixin']
|
||||
# _inherit = ['mail.activity.mixin']
|
||||
# 'mail.thread','mail.activity.mixin'
|
||||
_rec_name = "adname"
|
||||
# _inherit = ['mail.thread', 'mail.activity.mixin']
|
||||
uuid = fields.Char(default=lambda self: self._default_uuid(), required=True, readonly=True, copy=False,
|
||||
string='UUID')
|
||||
aduuid = fields.Char(related='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)
|
||||
adname = fields.Char('Kampagnenname', required=True, tracking=True)
|
||||
adtype = fields.Selection(
|
||||
[('MAIN', 'Ersteinrichtung'), ('KCHN', 'Änderung durch Kunde'), ('LCHN', 'Änderung durch Logumedia'),
|
||||
('SONS', 'Sonstige Änderung')], tracking=True)
|
||||
adpos = fields.Integer('Reihenfolge', default=lambda self: self._default_adpos(),
|
||||
tracking=True)
|
||||
ad_is_lastpos = fields.Boolean('Letzte Aktion', tracking=True)
|
||||
|
||||
start_date = fields.Date('gew. Ausstrahl.Begin', tracking=True)
|
||||
end_date = fields.Date('gew. Ausstrahl.Ende', tracking=True)
|
||||
|
||||
contract = fields.Many2one('dss.contracts', store=True, tracking=True)
|
||||
contract_id = fields.Char(related='contract.contract_id')
|
||||
contract_name = fields.Char(related='contract.contract_name')
|
||||
contract_need_media = fields.Many2many(related='contract.need_media', tracking=True)
|
||||
|
||||
project = fields.Many2one('dss.projects', string='Project', store=True, tracking=True)
|
||||
project_id = fields.Integer(related='project.projectid', string='Project ID')
|
||||
|
||||
parent_ad = fields.Many2one('dss.ads', string='UrsprungsWerbung', store=True)
|
||||
parent_ad_uuid = fields.Char(related='parent_ad.uuid')
|
||||
description = fields.Text('Beschreibung')
|
||||
amount = fields.Float('Extrakosten', tracking=True)
|
||||
order = fields.Integer('Reihenfolge', tracking=True)
|
||||
|
||||
# need_media = fields.Many2many('dss.mediarelations','ad',string='Medien')
|
||||
need_media = fields.One2many('dss.mediarelations', 'ad', string='Medien')
|
||||
|
||||
work_state = fields.Many2one('dss.workstate', default=_default_work_state, tracking=True)
|
||||
work_state_color = fields.Char(related='work_state.color')
|
||||
work_state_text = fields.Char(related='work_state.statusname')
|
||||
work_state_info = fields.Char('Zusatzinfo')
|
||||
|
||||
ad_state = fields.Many2one('dss.adstate', tracking=True)
|
||||
ad_state_color = fields.Char(related='ad_state.color')
|
||||
ad_state_text = fields.Char(related='ad_state.statusname')
|
||||
ad_state_func = fields.Selection(related='ad_state.func')
|
||||
|
||||
todo_state = fields.Many2one('dss.todostate', default=_default_todo_state,
|
||||
tracking=True)
|
||||
todo_state_color = fields.Char(related='todo_state.color')
|
||||
todo_state_text = fields.Char(related='todo_state.statusname')
|
||||
todo_state_info = fields.Char('Zusatzinfo', tracking=True)
|
||||
todo_state_until = fields.Date('Abarbeiten bis', tracking=True)
|
||||
|
||||
cloud_add_directory = fields.Char('Cloud KundenKampagnen Ordner', tracking=True)
|
||||
|
||||
date_zuarbeit = fields.Date(string='Zuarbeit Datum', help='Zuarbeit gesendet am', tracking=True)
|
||||
date_korrekturabzug = fields.Date(string='K.Abzug Datum', help='Korrekturabzug gesendet am')
|
||||
date_korrekturfreigabe = fields.Date(string='K.Freigabe Datum', help='Korrekturfreigabe erhalten am',
|
||||
tracking=True)
|
||||
date_korrekturfreigabe_frist = fields.Date(string='K.Freigabe bis Datum', help='Korrekturfreigabe sollte bis .... erfolgen')
|
||||
freigabe_durch_ablauf = fields.Boolean(string='Zeitablauf',help='Freigabe wurde durch Zeitablauf erreicht ?', tracking=True)
|
||||
|
||||
@api.model
|
||||
def _default_uuid(self):
|
||||
|
|
@ -394,29 +495,320 @@ class dsstriggertypes(models.Model):
|
|||
def _default_create_user(self):
|
||||
return str(self.env.user.name)
|
||||
|
||||
class dsstriggertypes(models.Model):
|
||||
_name = "dss.triggeractions"
|
||||
_description = "DigitalSignage Trigger Aktionen"
|
||||
_inherit = ['mail.thread','mail.activity.mixin']
|
||||
_rec_name = "triggeractionname"
|
||||
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())
|
||||
def _default_adpos(self):
|
||||
pos = self.env['dss.ads'].search_count([('contract_id', '=', self.contract.id)]) + 1
|
||||
return str(pos)
|
||||
|
||||
@api.onchange('ad_state')
|
||||
def _onchange_ad_state(self):
|
||||
for record in self:
|
||||
if record.ad_is_lastpos == True:
|
||||
contract = record.contract
|
||||
contract.ads_last_state = record.ad_state
|
||||
# mtyp = self.env['dss.adstructures'].search([("uuid","=",str(record.mediastructure.uuid))])
|
||||
# buildmediarelations(self)
|
||||
self.date_lastedit = str(date.today())
|
||||
|
||||
# self.mediastructure = mtyp
|
||||
|
||||
def pyaction_view_ad_details(self):
|
||||
action = self.env['ir.actions.act_window'].with_context({'default_adid': self.id})._for_xml_id(
|
||||
'DigitalSignage.action_dss_ads_view')
|
||||
# action['display_name'] = self.ad_name
|
||||
# action['domain'] = '[["projectid","=","4"]]'
|
||||
# context = action['context'].replace('', str(self.id))
|
||||
# context = ast.literal_eval(context)
|
||||
# context.update({
|
||||
# 'create': self.active,
|
||||
# 'active_test': self.active
|
||||
# })
|
||||
# action['context'] = context
|
||||
return {
|
||||
'type': 'ir.actions.act_window',
|
||||
'view_type': 'form',
|
||||
'view_mode': 'form,tree',
|
||||
'res_model': 'dss.ads',
|
||||
'target': 'current',
|
||||
'context': '',
|
||||
'res_id': self.id,
|
||||
'display_name': ' ' + self.adname,
|
||||
'domain': ''
|
||||
}
|
||||
|
||||
return action
|
||||
|
||||
def pydoviewallads(self):
|
||||
action = self.env['ir.actions.act_window'].with_context({'default_adid': self.id})._for_xml_id(
|
||||
'DigitalSignage.act_dss_ads_view_full')
|
||||
action['display_name'] = self.contract_name
|
||||
# action['domain'] = '[["projectid","=","4"]]'
|
||||
# context = action['context'].replace('', str(self.id))
|
||||
# context = ast.literal_eval(context)
|
||||
# context.update({
|
||||
# 'create': self.active,
|
||||
# 'active_test': self.active
|
||||
# })
|
||||
# action['context'] = context
|
||||
# return {
|
||||
# 'type': 'ir.actions.act_window',
|
||||
# 'view_type':'form',
|
||||
# 'view_mode':'form,tree',
|
||||
# 'res_model':'dss.ads',
|
||||
# 'target':'current',
|
||||
# 'context':'',
|
||||
# 'res_id':kampagne.id,
|
||||
# 'display_name' : 'Werbekampagne '+kampagne.adname,
|
||||
# 'domain':'[("contract","=","context[active_id]")]'
|
||||
# }
|
||||
# return action
|
||||
return {
|
||||
'type': 'ir.actions.act_window',
|
||||
'view_type': 'kanban',
|
||||
'view_mode': 'kanban',
|
||||
'res_model': 'dss.ads',
|
||||
'target': 'current',
|
||||
'context': '{"group_by":["parent_ad"]}',
|
||||
# 'res_id':self.parent_ad,
|
||||
'display_name': 'Übersicht für ' + self.adname,
|
||||
'domain': [("contract", "=", self.contract.id)]
|
||||
}
|
||||
|
||||
def pydonewad(self):
|
||||
for n_record in self:
|
||||
resstr = n_record.uuid
|
||||
_logger.info(resstr)
|
||||
allads = n_record.contract.ads
|
||||
_logger.info(allads)
|
||||
abort = False
|
||||
if allads != False:
|
||||
for ad in allads:
|
||||
if ad.ad_state.func != 'FIN':
|
||||
abort = True
|
||||
if abort == False:
|
||||
defadstate = self.env['dss.adstate'].search([('func', '=', 'STD')], limit=1).id
|
||||
if not defadstate:
|
||||
defadstate = 1
|
||||
if self.ad_state.func == 'STD':
|
||||
parent_id = self.id
|
||||
else:
|
||||
parent_id = self.parent_ad.id
|
||||
newkampagne = self.env['dss.ads'].create({'contract': self.contract.id, 'project': self.project.id,
|
||||
'adname': 'AD_' + self.contract.contract_auto_name + ' ' + str(
|
||||
date.today()), 'parent_ad': parent_id, 'adtype': 'KCHN',
|
||||
'ad_state': defadstate})
|
||||
_logger.info('C_' + str(self.id) + ' Kampagne erzeugt : ' + str(newkampagne))
|
||||
_logger.info('Prüfe Medien : C_' + str(self.id) + 'K_' + str(newkampagne.id))
|
||||
|
||||
mediaids = []
|
||||
for feld in self.contract.werbe_feld_selected:
|
||||
for media in feld.mediastructure.medias:
|
||||
if not media:
|
||||
_logger.info('Prüfe Medien : C_' + str(self.contract.id) + 'K_' + str(
|
||||
newkampagne.id) + ' Kein Medium in MedienStructur von F_' + str(feld.id) + 'M_' + str(
|
||||
media.id))
|
||||
else:
|
||||
newmedia = self.env['dss.mediarelations'].create(
|
||||
{'field': feld.id, 'contract': self.contract.id, 'project': self.project.id,
|
||||
'field_uuid': feld.uuid, 'ad': newkampagne.id, 'relname': media.medianame,
|
||||
'mediatype': media.id})
|
||||
_logger.info('Prüfe Medien : C_' + str(self.contract.id) + 'K_' + str(
|
||||
newkampagne.id) + ' setze Vertrag für Medium : ' + str(newmedia.contract) + '/' + str(
|
||||
newmedia.ad))
|
||||
mediaids.append(newmedia.id)
|
||||
newkampagne.write({'need_media': [(6, 0, mediaids)]})
|
||||
_logger.info('Click auf Werbekampagne : C_' + str(self.contract.id) + 'A_' + str(
|
||||
newkampagne.id) + ' setze Media ')
|
||||
|
||||
return {
|
||||
'type': 'ir.actions.act_window',
|
||||
'view_type': 'form',
|
||||
'view_mode': 'form,tree',
|
||||
'res_model': 'dss.ads',
|
||||
'target': 'current',
|
||||
'context': '',
|
||||
'res_id': newkampagne.id,
|
||||
'display_name': 'Änderung zur Werbekampagne ' + newkampagne.parent_ad.adname,
|
||||
'domain': '[("id","=","context[newkampagne.id]")]'
|
||||
}
|
||||
else:
|
||||
raise ValidationError(
|
||||
_("Kann neue Aktualisierung erst anlegen wenn alle vorherigen Schritte beendet wurden !"))
|
||||
|
||||
def setStandardText(self, tid):
|
||||
text = self.env['dss.texts'].search([('text_id', '=', tid)], limit=1)
|
||||
if text:
|
||||
self.write({'description': text.description})
|
||||
|
||||
|
||||
class dsscontractads(models.Model):
|
||||
|
||||
def _default_work_state(self):
|
||||
ds = self.env['dss.workstate'].search([('statusname', '=', 'Neu')], limit=1).id
|
||||
_logger.debug(ds)
|
||||
return ds
|
||||
|
||||
def _default_work_state_color(self):
|
||||
ds = self.env['dss.workstate'].search([('statusname', '=', 'Neu')], limit=1).color
|
||||
_logger.info(ds)
|
||||
return ds
|
||||
|
||||
def _default_todo_state(self):
|
||||
ds = self.env['dss.todostate'].search([('statusnr', '=', '0')], limit=1).id
|
||||
if not ds: ds = 1
|
||||
_logger.debug(ds)
|
||||
# ds =
|
||||
return ds
|
||||
|
||||
@api.model
|
||||
def create(self, vals):
|
||||
result = super().create(vals)
|
||||
resstr = result.uuid
|
||||
_logger.info(resstr)
|
||||
for n_record in result:
|
||||
resstr = n_record.uuid
|
||||
_logger.info(resstr)
|
||||
n_record.date_create = date.today()
|
||||
n_record.user_create = self.env.user.name
|
||||
allads = n_record.contract.ads
|
||||
_logger.info(allads)
|
||||
if allads != False:
|
||||
for ad in allads:
|
||||
ad.ad_is_lastpos = False
|
||||
n_record.ad_is_lastpos = True
|
||||
contract = n_record.contract
|
||||
contract.ads_last_ad = n_record
|
||||
return result
|
||||
|
||||
# @api.depends('need_media')
|
||||
# def _getmedialist(self):
|
||||
# mlist = []
|
||||
# mlist = self.env['dss.mediarelations'].search([('ad','=',self.id)])
|
||||
# if mlist != False:
|
||||
# _logger.info('AD Need_Medias A_'+str(self)+' - Computed Medias '+str(mlist))
|
||||
# self.need_media = mlist.ids
|
||||
# else:
|
||||
# self.need_media = False
|
||||
|
||||
_name = "dss.ads"
|
||||
_description = "DigitalSignage Werbekampagnen"
|
||||
_inherit = ['mail.thread', 'mail.activity.mixin','dss.triggermodel']
|
||||
# _inherit = ['mail.activity.mixin']
|
||||
# 'mail.thread','mail.activity.mixin'
|
||||
_rec_name = "adname"
|
||||
# _inherit = ['mail.thread', 'mail.activity.mixin']
|
||||
uuid = fields.Char(default=lambda self: self._default_uuid(), required=True, readonly=True, copy=False,
|
||||
string='UUID')
|
||||
aduuid = fields.Char(related='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_create = fields.Char('Erstellungsuser', default=lambda self: self._default_create_user())
|
||||
user_lastedit = fields.Char('Änderungsuser')
|
||||
# uuid = fields.Char('UUID', required=True, translate=True)
|
||||
adname = fields.Char('Kampagnenname', required=True, tracking=True)
|
||||
adtype = fields.Selection(
|
||||
[('MAIN', 'Ersteinrichtung'), ('KCHN', 'Änderung durch Kunde'), ('LCHN', 'Änderung durch Logumedia'),
|
||||
('SONS', 'Sonstige Änderung'),('PREA', 'Vorausplanung')], tracking=True)
|
||||
adpos = fields.Integer('Reihenfolge', default=lambda self: self._default_adpos(),
|
||||
tracking=True)
|
||||
ad_is_lastpos = fields.Boolean('Letzte Aktion', tracking=True)
|
||||
|
||||
triggeractionname = fields.Char('Triggeraktionname',track_visibility='onchange',tracking=True)
|
||||
triggeractiontyp = fields.Selection([('EMAIL','EMail senden'),('ACTIV','Aufgabe erzeugen'),('DSEDIT','Datensatz ändern'),('TUYA','Tuya Aktion auslössen')],'Aktionstyp',track_visibility='onchange',tracking=True)
|
||||
email_getfrom = fields.Selection([('FIX','Email fest hinterlegt'),('DATA','Email in Feld hinterlegt')],'Emailadresse von',track_visibility='onchange',tracking=True)
|
||||
email_fix_email_sender = fields.Many2one('res.partner','Absender',help='Email Sender Adresse der Aktion',track_visibility='onchange',tracking=True)
|
||||
email_fix_email = fields.Many2one('res.partner','Empfänger',help='Email Emüfänger Adresse für Benachrichtigung/Triggeraktion',track_visibility='onchange',tracking=True)
|
||||
email_data_table = fields.Many2one('ir.model','Nutzbar in',help='Für welche Daten ist diese Aktion gültig ?',track_visibility='onchange',tracking=True)
|
||||
email_data_field = fields.Many2one('ir.model.fields', help='Feldname in der Tabelle',track_visibility='onchange',tracking=True)
|
||||
email_template = fields.Many2one('mail.template','Emailvorlage',track_visibility='onchange',tracking=True)
|
||||
contract = fields.Many2one('dss.contracts', store=True, tracking=True)
|
||||
contract_id = fields.Char(related='contract.contract_id')
|
||||
contract_name = fields.Char(related='contract.contract_name')
|
||||
contract_need_media = fields.Many2many(related='contract.need_media', tracking=True)
|
||||
|
||||
field = fields.Char('Feldname',help='Feldname in o.g. Tebelle.',track_visibility='onchange',tracking=True)
|
||||
type_s = fields.Char('Feldwertoperator',track_visibility='onchange',tracking=True)
|
||||
value_s = fields.Char('Feldwert für Trigger',track_visibility='onchange',tracking=True)
|
||||
project = fields.Many2one('dss.projects', string='Project', store=True, tracking=True)
|
||||
project_id = fields.Integer(related='project.projectid', string='Project ID')
|
||||
|
||||
parent_ad = fields.Many2one('dss.ads', string='UrsprungsWerbung', store=True)
|
||||
parent_ad_uuid = fields.Char(related='parent_ad.uuid')
|
||||
description = fields.Text('Beschreibung')
|
||||
amount = fields.Float('Extrakosten', tracking=True)
|
||||
order = fields.Integer('Reihenfolge', tracking=True)
|
||||
|
||||
# need_media = fields.Many2many('dss.mediarelations','ad',string='Medien')
|
||||
need_media = fields.One2many('dss.mediarelations', 'ad', string='Medien')
|
||||
|
||||
work_state = fields.Many2one('dss.workstate', default=_default_work_state, tracking=True)
|
||||
work_state_color = fields.Char(related='work_state.color')
|
||||
work_state_text = fields.Char(related='work_state.statusname')
|
||||
work_state_info = fields.Char('Zusatzinfo')
|
||||
|
||||
ad_state = fields.Many2one('dss.adstate', tracking=True)
|
||||
ad_state_color = fields.Char(related='ad_state.color')
|
||||
ad_state_text = fields.Char(related='ad_state.statusname')
|
||||
ad_state_func = fields.Selection(related='ad_state.func')
|
||||
|
||||
todo_state = fields.Many2one('dss.todostate', default=_default_todo_state,
|
||||
tracking=True)
|
||||
todo_state_color = fields.Char(related='todo_state.color')
|
||||
todo_state_text = fields.Char(related='todo_state.statusname')
|
||||
todo_state_info = fields.Char('Zusatzinfo', tracking=True)
|
||||
todo_state_until = fields.Date('Abarbeiten bis', tracking=True)
|
||||
|
||||
cloud_add_directory = fields.Char('Cloud KundenKampagnen Ordner', tracking=True)
|
||||
|
||||
date_zuarbeit = fields.Date(string='Zuarbeit Datum', help='Zuarbeit gesendet am',
|
||||
tracking=True)
|
||||
date_korrekturabzug = fields.Date(string='K.Abzug Datum', help='Korrekturabzug gesendet am',
|
||||
tracking=True)
|
||||
date_korrekturfreigabe = fields.Date(string='K.Freigabe Datum', help='Korrekturfreigabe erhalten am',
|
||||
tracking=True)
|
||||
date_korrekturfreigabe_ablauf = fields.Date(string='K.Freigabe Ablaufdatum', help='Korrekturfreigabe muss bis xxxx erfolgen.. sonst Autofreigabe',
|
||||
tracking=True)
|
||||
date_korrekturfreigabe_ablauf_compute = fields.Char(compute='_date_korrekturfreigabe_ablauf_compute')
|
||||
date_korrekturfreigabe_ablauf_compute_int = fields.Integer(compute='_date_korrekturfreigabe_ablauf_compute_int')
|
||||
korrekturfreigabe_ablauf_erfolgt = fields.Boolean(string='K.Freigabe durch Ablauf', help='Korrekturfreigabe erfolgte durch Zeitablauf ?',
|
||||
tracking=True)
|
||||
date_start_planed = fields.Date(string='geplantes Startdatum', tracking=True)
|
||||
date_start_planed_calendar_event=fields.Integer('gepl. Start - Kal.ID',tracking=True)
|
||||
date_start_real = fields.Date(string='wirkliches Startdatum', tracking=True)
|
||||
|
||||
date_remove_planed = fields.Date(string='geplantes Enddatum', tracking=True)
|
||||
date_remove_real = fields.Date(string='wirkliches Enddatum', tracking=True)
|
||||
|
||||
@api.depends('date_korrekturfreigabe_ablauf')
|
||||
def _date_korrekturfreigabe_ablauf_compute(self):
|
||||
self.date_korrekturfreigabe_ablauf_compute = ''
|
||||
if not self:
|
||||
return ''
|
||||
pass
|
||||
else:
|
||||
for record in self:
|
||||
if not record:
|
||||
return ''
|
||||
pass
|
||||
else:
|
||||
if not record.date_korrekturfreigabe_ablauf:
|
||||
return ''
|
||||
pass
|
||||
else:
|
||||
datedif = record.date_korrekturfreigabe_ablauf-date.today()
|
||||
record.date_korrekturfreigabe_ablauf_compute='Noch '+str(datedif.days)+' Tage bis Autoablauf'
|
||||
|
||||
@api.depends('date_korrekturfreigabe_ablauf')
|
||||
def _date_korrekturfreigabe_ablauf_compute_int(self):
|
||||
for record in self:
|
||||
if record:
|
||||
if record.date_korrekturfreigabe_ablauf:
|
||||
datedif = record.date_korrekturfreigabe_ablauf-date.today()
|
||||
record.date_korrekturfreigabe_ablauf_compute_int = datedif.days
|
||||
|
||||
def _check_date_korrekturfreigabe_ablauf(self):
|
||||
for record in self:
|
||||
if record:
|
||||
if record.date_korrekturfreigabe_ablauf:
|
||||
datedif = record.date_korrekturfreigabe_ablauf-date.today()
|
||||
_logger.info('Contract Autokorrektur Running C_' + str(record.contract)+' / '+str(datedif))
|
||||
if (datedif.days<=0) & ( not record.date_korrekturfreigabe):
|
||||
_logger.info('Contract Autokorrektur Running C_' + str(record.contract)+' A_'+str(record)+' Set Values')
|
||||
record.date_korrekturfreigabe = date.today()
|
||||
record.korrekturfreigabe_ablauf_erfolgt = True
|
||||
body = 'Für die Werbekampagne '+str(record.adname)+' im Vertrag '+str(record.contract.contract_auto_name)+' des Projektes '+str(record.project.projektname)+' wurde der Korekturabzug automatisch durch Zeitablauf bestätigt !'
|
||||
record.message_post(body=body)
|
||||
self.env['mail.message'].create({'message_type': 'comment','subtype_id': self.env.ref('mail.mt_comment').id,
|
||||
'model': 'mail.channel','res_id': self.env.ref('mail.channel_all_employees').id,'body': body,})
|
||||
|
||||
@api.model
|
||||
def _default_uuid(self):
|
||||
|
|
@ -428,26 +820,249 @@ class dsstriggertypes(models.Model):
|
|||
def _default_create_user(self):
|
||||
return str(self.env.user.name)
|
||||
|
||||
class dsstriggertypes(models.Model):
|
||||
_name = "dss.triggergroups"
|
||||
_description = "DigitalSignage Trigger Gruppen"
|
||||
_inherit = ['mail.thread','mail.activity.mixin']
|
||||
_rec_name = "triggergroupname"
|
||||
# _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')
|
||||
def _default_adpos(self):
|
||||
pos = self.env['dss.ads'].search_count([('contract_id', '=', self.contract.id)]) + 1
|
||||
return str(pos)
|
||||
|
||||
triggergroupname = fields.Char('Trigger Gruppenname',track_visibility='onchange',tracking=True)
|
||||
@api.onchange('ad_state')
|
||||
def _onchange_ad_state(self):
|
||||
for record in self:
|
||||
if record.ad_is_lastpos == True:
|
||||
contract = record.contract
|
||||
contract.ads_last_state = record.ad_state
|
||||
# mtyp = self.env['dss.adstructures'].search([("uuid","=",str(record.mediastructure.uuid))])
|
||||
# buildmediarelations(self)
|
||||
self.date_lastedit = str(date.today())
|
||||
|
||||
@api.model
|
||||
def _default_uuid(self):
|
||||
return str(uuid.uuid4())
|
||||
# self.mediastructure = mtyp
|
||||
|
||||
def _default_create_date(self):
|
||||
return str(date.today())
|
||||
@api.onchange('date_korrekturabzug')
|
||||
def _date_korrekturabzug_change(self):
|
||||
for record in self:
|
||||
autodays=0
|
||||
if record.date_korrekturabzug:
|
||||
autodays=self.env['dss.settings'].search([],limit=1).freigabe_auto_time
|
||||
record.date_korrekturfreigabe_ablauf = record.date_korrekturabzug + relativedelta(days=autodays)
|
||||
|
||||
def _default_create_user(self):
|
||||
return str(self.env.user.name)
|
||||
def pyaction_view_ad_details(self):
|
||||
action = self.env['ir.actions.act_window'].with_context({'default_adid': self.id})._for_xml_id(
|
||||
'DigitalSignage.action_dss_ads_view')
|
||||
# action['display_name'] = self.ad_name
|
||||
# action['domain'] = '[["projectid","=","4"]]'
|
||||
# context = action['context'].replace('', str(self.id))
|
||||
# context = ast.literal_eval(context)
|
||||
# context.update({
|
||||
# 'create': self.active,
|
||||
# 'active_test': self.active
|
||||
# })
|
||||
# action['context'] = context
|
||||
return {
|
||||
'type': 'ir.actions.act_window',
|
||||
'view_type': 'form',
|
||||
'view_mode': 'form,tree',
|
||||
'res_model': 'dss.ads',
|
||||
'target': 'current',
|
||||
'context': '',
|
||||
'res_id': self.id,
|
||||
'display_name': ' ' + self.adname,
|
||||
'domain': ''
|
||||
}
|
||||
|
||||
return action
|
||||
|
||||
def pydoviewallads(self):
|
||||
action = self.env['ir.actions.act_window'].with_context({'default_adid': self.id})._for_xml_id(
|
||||
'DigitalSignage.act_dss_ads_view_full')
|
||||
action['display_name'] = self.contract_name
|
||||
# action['domain'] = '[["projectid","=","4"]]'
|
||||
# context = action['context'].replace('', str(self.id))
|
||||
# context = ast.literal_eval(context)
|
||||
# context.update({
|
||||
# 'create': self.active,
|
||||
# 'active_test': self.active
|
||||
# })
|
||||
# action['context'] = context
|
||||
# return {
|
||||
# 'type': 'ir.actions.act_window',
|
||||
# 'view_type':'form',
|
||||
# 'view_mode':'form,tree',
|
||||
# 'res_model':'dss.ads',
|
||||
# 'target':'current',
|
||||
# 'context':'',
|
||||
# 'res_id':kampagne.id,
|
||||
# 'display_name' : 'Werbekampagne '+kampagne.adname,
|
||||
# 'domain':'[("contract","=","context[active_id]")]'
|
||||
# }
|
||||
# return action
|
||||
return {
|
||||
'type': 'ir.actions.act_window',
|
||||
'view_type': 'kanban',
|
||||
'view_mode': 'kanban',
|
||||
'res_model': 'dss.ads',
|
||||
'target': 'current',
|
||||
'context': '{"group_by":["parent_ad"]}',
|
||||
# 'res_id':self.parent_ad,
|
||||
'display_name': 'Übersicht für ' + self.adname,
|
||||
'domain': [("contract", "=", self.contract.id)]
|
||||
}
|
||||
|
||||
def pydonewpread(self):
|
||||
defadstate = self.env['dss.adstate'].search([('func', '=', 'STD')], limit=1).id
|
||||
if not defadstate:
|
||||
defadstate = 1
|
||||
if self.ad_state.func == 'STD':
|
||||
parent_id = self.id
|
||||
else:
|
||||
parent_id = self.parent_ad.id
|
||||
newkampagne = self.env['dss.ads'].create({'contract': self.contract.id, 'project': self.project.id,
|
||||
'adname': 'PRE_' + self.contract.contract_auto_name + ' ' + str(
|
||||
date.today()), 'parent_ad': parent_id, 'adtype': 'PREA',
|
||||
'ad_state': defadstate})
|
||||
_logger.info('C_' + str(self.id) + ' Kampagne erzeugt : ' + str(newkampagne))
|
||||
_logger.info('Erzeugte PreWerbekampagne - Prüfe Medien : C_' + str(self.id) + 'K_' + str(newkampagne.id))
|
||||
|
||||
mediaids = []
|
||||
for feld in self.contract.werbe_feld_selected:
|
||||
for media in feld.mediastructure.medias:
|
||||
if not media:
|
||||
_logger.info('Erzeugte PreWerbekampagne - Prüfe Medien : C_' + str(self.contract.id) + 'K_' + str(
|
||||
newkampagne.id) + ' Kein Medium in MedienStructur von F_' + str(feld.id) + 'M_' + str(
|
||||
media.id))
|
||||
else:
|
||||
newmedia = self.env['dss.mediarelations'].create(
|
||||
{'field': feld.id, 'contract': self.contract.id, 'project': self.project.id,
|
||||
'field_uuid': feld.uuid, 'ad': newkampagne.id, 'relname': media.medianame,
|
||||
'mediatype': media.id})
|
||||
_logger.info('Erzeugte PreWerbekampagne - Prüfe Medien : C_' + str(self.contract.id) + 'K_' + str(
|
||||
newkampagne.id) + ' setze Vertrag für Medium : ' + str(newmedia.contract) + '/' + str(
|
||||
newmedia.ad))
|
||||
mediaids.append(newmedia.id)
|
||||
newkampagne.write({'need_media': [(6, 0, mediaids)]})
|
||||
_logger.info('Erzeugte PreWerbekampagne : C_' + str(self.contract.id) + 'A_' + str(
|
||||
newkampagne.id) + ' setze Media ')
|
||||
return {
|
||||
'type': 'ir.actions.act_window',
|
||||
'view_type': 'form',
|
||||
'view_mode': 'form,tree',
|
||||
'res_model': 'dss.ads',
|
||||
'target': 'current',
|
||||
'context': '',
|
||||
'res_id': newkampagne.id,
|
||||
'display_name': 'Änderung zur Werbekampagne ' + newkampagne.parent_ad.adname,
|
||||
'domain': '[("id","=","context[newkampagne.id]")]'
|
||||
}
|
||||
|
||||
def pydonewad(self):
|
||||
for n_record in self:
|
||||
resstr = n_record.uuid
|
||||
_logger.info(resstr)
|
||||
allads = n_record.contract.ads
|
||||
_logger.info(allads)
|
||||
abort = False
|
||||
if allads != False:
|
||||
for ad in allads:
|
||||
if ad.ad_state.func != 'FIN':
|
||||
if ad.adtype !='PREA':
|
||||
abort = True
|
||||
if abort == False:
|
||||
defadstate = self.env['dss.adstate'].search([('func', '=', 'STD')], limit=1).id
|
||||
if not defadstate:
|
||||
defadstate = 1
|
||||
if self.ad_state.func == 'STD':
|
||||
parent_id = self.id
|
||||
else:
|
||||
parent_id = self.parent_ad.id
|
||||
newkampagne = self.env['dss.ads'].create({'contract': self.contract.id, 'project': self.project.id,
|
||||
'adname': 'AD_' + self.contract.contract_auto_name + ' ' + str(
|
||||
date.today()), 'parent_ad': parent_id, 'adtype': 'KCHN',
|
||||
'ad_state': defadstate})
|
||||
_logger.info('C_' + str(self.id) + ' Kampagne erzeugt : ' + str(newkampagne))
|
||||
_logger.info('Prüfe Medien : C_' + str(self.id) + 'K_' + str(newkampagne.id))
|
||||
|
||||
mediaids = []
|
||||
for feld in self.contract.werbe_feld_selected:
|
||||
for media in feld.mediastructure.medias:
|
||||
if not media:
|
||||
_logger.info('Prüfe Medien : C_' + str(self.contract.id) + 'K_' + str(
|
||||
newkampagne.id) + ' Kein Medium in MedienStructur von F_' + str(feld.id) + 'M_' + str(
|
||||
media.id))
|
||||
else:
|
||||
newmedia = self.env['dss.mediarelations'].create(
|
||||
{'field': feld.id, 'contract': self.contract.id, 'project': self.project.id,
|
||||
'field_uuid': feld.uuid, 'ad': newkampagne.id, 'relname': media.medianame,
|
||||
'mediatype': media.id})
|
||||
_logger.info('Prüfe Medien : C_' + str(self.contract.id) + 'K_' + str(
|
||||
newkampagne.id) + ' setze Vertrag für Medium : ' + str(newmedia.contract) + '/' + str(
|
||||
newmedia.ad))
|
||||
mediaids.append(newmedia.id)
|
||||
newkampagne.write({'need_media': [(6, 0, mediaids)]})
|
||||
_logger.info('Click auf Werbekampagne : C_' + str(self.contract.id) + 'A_' + str(
|
||||
newkampagne.id) + ' setze Media ')
|
||||
|
||||
return {
|
||||
'type': 'ir.actions.act_window',
|
||||
'view_type': 'form',
|
||||
'view_mode': 'form,tree',
|
||||
'res_model': 'dss.ads',
|
||||
'target': 'current',
|
||||
'context': '',
|
||||
'res_id': newkampagne.id,
|
||||
'display_name': 'Änderung zur Werbekampagne ' + newkampagne.parent_ad.adname,
|
||||
'domain': '[("id","=","context[newkampagne.id]")]'
|
||||
}
|
||||
else:
|
||||
raise ValidationError(
|
||||
_("Kann neue Aktualisierung erst anlegen wenn alle vorherigen Schritte beendet wurden !"))
|
||||
def pydoprecopyad(selfself):
|
||||
for n_record in self:
|
||||
resstr = n_record.uuid
|
||||
_logger.info(resstr)
|
||||
allads = n_record.contract.ads
|
||||
_logger.info(allads)
|
||||
abort = False
|
||||
if allads != False:
|
||||
for ad in allads:
|
||||
if ad.ad_state.func != 'FIN':
|
||||
if ad.adtype != 'PREA':
|
||||
abort = True
|
||||
if abort == False:
|
||||
|
||||
return {
|
||||
'type': 'ir.actions.act_window',
|
||||
'view_type': 'form',
|
||||
'view_mode': 'form,tree',
|
||||
'res_model': 'dss.ads',
|
||||
'target': 'current',
|
||||
'context': '',
|
||||
'res_id': newkampagne.id,
|
||||
'display_name': 'Änderung zur Werbekampagne ' + newkampagne.parent_ad.adname,
|
||||
'domain': '[("id","=","context[newkampagne.id]")]'
|
||||
}
|
||||
|
||||
else:
|
||||
raise ValidationError(
|
||||
_("Kann neue Aktualisierung erst anlegen wenn alle vorherigen Schritte beendet wurden !"))
|
||||
|
||||
def setStandardText(self, tid):
|
||||
text = self.env['dss.texts'].search([('text_id', '=', tid)], limit=1)
|
||||
if text:
|
||||
self.write({'description': text.description})
|
||||
|
||||
def pyaddstartdate(self):
|
||||
self.env['calendar.event'].search([('id','=',self.date_start_planed_calendar_event)]).unlink()
|
||||
event = {
|
||||
'start': self.date_start_planed.strftime('%Y-%m-%d %H:%M:%S'),
|
||||
'stop': self.date_start_planed.strftime('%Y-%m-%d %H:%M:%S'),
|
||||
'duration': 24,
|
||||
'allday': True,
|
||||
'partner_ids': (4,self.env['dss.settings'].search([],limit=1).contact_runtime_user.partner_id.id),
|
||||
'name': 'Geplanter Start '+self.contract.contract_auto_name,
|
||||
'description': 'Geplanter Start '+self.contract.contract_auto_name+' im Projekt '+self.project.projektname,
|
||||
'user_id': self.env['dss.settings'].search([],limit=1).contact_runtime_user.id
|
||||
}
|
||||
_logger.debug('linking new Startevent ' + str(event) + ' ' + str(self.uuid))
|
||||
self.date_start_planed_calendar_event=self.env['calendar.event'].create(event).id
|
||||
return ""
|
||||
|
||||
def pyaddenddate(self):
|
||||
return 1
|
||||
|
|
|
|||
|
|
@ -1,576 +0,0 @@
|
|||
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 dsscontractads(models.Model):
|
||||
|
||||
def _default_work_state(self):
|
||||
ds = self.env['dss.workstate'].search([('statusname', '=', 'Neu')], limit=1).id
|
||||
_logger.debug(ds)
|
||||
return ds
|
||||
|
||||
def _default_work_state_color(self):
|
||||
ds = self.env['dss.workstate'].search([('statusname', '=', 'Neu')], limit=1).color
|
||||
_logger.info(ds)
|
||||
return ds
|
||||
|
||||
def _default_todo_state(self):
|
||||
ds = self.env['dss.todostate'].search([('statusnr', '=', '0')], limit=1).id
|
||||
if not ds: ds = 1
|
||||
_logger.debug(ds)
|
||||
# ds =
|
||||
return ds
|
||||
|
||||
@api.model
|
||||
def create(self, vals):
|
||||
result = super().create(vals)
|
||||
resstr = result.uuid
|
||||
_logger.info(resstr)
|
||||
for n_record in result:
|
||||
resstr = n_record.uuid
|
||||
_logger.info(resstr)
|
||||
n_record.date_create = date.today()
|
||||
n_record.user_create = self.env.user.name
|
||||
allads = n_record.contract.ads
|
||||
_logger.info(allads)
|
||||
if allads != False:
|
||||
for ad in allads:
|
||||
ad.ad_is_lastpos = False
|
||||
n_record.ad_is_lastpos = True
|
||||
contract = n_record.contract
|
||||
contract.ads_last_ad = n_record
|
||||
return result
|
||||
|
||||
# @api.depends('need_media')
|
||||
# def _getmedialist(self):
|
||||
# mlist = []
|
||||
# mlist = self.env['dss.mediarelations'].search([('ad','=',self.id)])
|
||||
# if mlist != False:
|
||||
# _logger.info('AD Need_Medias A_'+str(self)+' - Computed Medias '+str(mlist))
|
||||
# self.need_media = mlist.ids
|
||||
# else:
|
||||
# self.need_media = False
|
||||
|
||||
_name = "dss.ads"
|
||||
_description = "DigitalSignage Werbekampagnen Phasen"
|
||||
_inherit = ['mail.thread', 'mail.activity.mixin']
|
||||
# _inherit = ['mail.activity.mixin']
|
||||
# 'mail.thread','mail.activity.mixin'
|
||||
_rec_name = "adname"
|
||||
# _inherit = ['mail.thread', 'mail.activity.mixin']
|
||||
uuid = fields.Char(default=lambda self: self._default_uuid(), required=True, readonly=True, copy=False,
|
||||
string='UUID')
|
||||
aduuid = fields.Char(related='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)
|
||||
adname = fields.Char('Kampagnenname', required=True, tracking=True)
|
||||
adtype = fields.Selection(
|
||||
[('MAIN', 'Ersteinrichtung'), ('KCHN', 'Änderung durch Kunde'), ('LCHN', 'Änderung durch Logumedia'),
|
||||
('SONS', 'Sonstige Änderung')], tracking=True)
|
||||
adpos = fields.Integer('Reihenfolge', default=lambda self: self._default_adpos(),
|
||||
tracking=True)
|
||||
ad_is_lastpos = fields.Boolean('Letzte Aktion', tracking=True)
|
||||
|
||||
start_date = fields.Date('gew. Ausstrahl.Begin', tracking=True)
|
||||
end_date = fields.Date('gew. Ausstrahl.Ende', tracking=True)
|
||||
|
||||
contract = fields.Many2one('dss.contracts', store=True, tracking=True)
|
||||
contract_id = fields.Char(related='contract.contract_id')
|
||||
contract_name = fields.Char(related='contract.contract_name')
|
||||
contract_need_media = fields.Many2many(related='contract.need_media', tracking=True)
|
||||
|
||||
project = fields.Many2one('dss.projects', string='Project', store=True, tracking=True)
|
||||
project_id = fields.Integer(related='project.projectid', string='Project ID')
|
||||
|
||||
parent_ad = fields.Many2one('dss.ads', string='UrsprungsWerbung', store=True)
|
||||
parent_ad_uuid = fields.Char(related='parent_ad.uuid')
|
||||
description = fields.Text('Beschreibung')
|
||||
amount = fields.Float('Extrakosten', tracking=True)
|
||||
order = fields.Integer('Reihenfolge', tracking=True)
|
||||
|
||||
# need_media = fields.Many2many('dss.mediarelations','ad',string='Medien')
|
||||
need_media = fields.One2many('dss.mediarelations', 'ad', string='Medien')
|
||||
|
||||
work_state = fields.Many2one('dss.workstate', default=_default_work_state, tracking=True)
|
||||
work_state_color = fields.Char(related='work_state.color')
|
||||
work_state_text = fields.Char(related='work_state.statusname')
|
||||
work_state_info = fields.Char('Zusatzinfo')
|
||||
|
||||
ad_state = fields.Many2one('dss.adstate', tracking=True)
|
||||
ad_state_color = fields.Char(related='ad_state.color')
|
||||
ad_state_text = fields.Char(related='ad_state.statusname')
|
||||
ad_state_func = fields.Selection(related='ad_state.func')
|
||||
|
||||
todo_state = fields.Many2one('dss.todostate', default=_default_todo_state,
|
||||
tracking=True)
|
||||
todo_state_color = fields.Char(related='todo_state.color')
|
||||
todo_state_text = fields.Char(related='todo_state.statusname')
|
||||
todo_state_info = fields.Char('Zusatzinfo', tracking=True)
|
||||
todo_state_until = fields.Date('Abarbeiten bis', tracking=True)
|
||||
|
||||
cloud_add_directory = fields.Char('Cloud KundenKampagnen Ordner', tracking=True)
|
||||
|
||||
date_zuarbeit = fields.Date(string='Zuarbeit Datum', help='Zuarbeit gesendet am', tracking=True)
|
||||
date_korrekturabzug = fields.Date(string='K.Abzug Datum', help='Korrekturabzug gesendet am')
|
||||
date_korrekturfreigabe = fields.Date(string='K.Freigabe Datum', help='Korrekturfreigabe erhalten am',
|
||||
tracking=True)
|
||||
date_korrekturfreigabe_frist = fields.Date(string='K.Freigabe bis Datum', help='Korrekturfreigabe sollte bis .... erfolgen')
|
||||
freigabe_durch_ablauf = fields.Boolean(string='Zeitablauf',help='Freigabe wurde durch Zeitablauf erreicht ?', tracking=True)
|
||||
|
||||
@api.model
|
||||
def _default_uuid(self):
|
||||
return str(uuid.uuid4())
|
||||
|
||||
def _default_create_date(self):
|
||||
return str(date.today())
|
||||
|
||||
def _default_create_user(self):
|
||||
return str(self.env.user.name)
|
||||
|
||||
def _default_adpos(self):
|
||||
pos = self.env['dss.ads'].search_count([('contract_id', '=', self.contract.id)]) + 1
|
||||
return str(pos)
|
||||
|
||||
@api.onchange('ad_state')
|
||||
def _onchange_ad_state(self):
|
||||
for record in self:
|
||||
if record.ad_is_lastpos == True:
|
||||
contract = record.contract
|
||||
contract.ads_last_state = record.ad_state
|
||||
# mtyp = self.env['dss.adstructures'].search([("uuid","=",str(record.mediastructure.uuid))])
|
||||
# buildmediarelations(self)
|
||||
self.date_lastedit = str(date.today())
|
||||
|
||||
# self.mediastructure = mtyp
|
||||
|
||||
def pyaction_view_ad_details(self):
|
||||
action = self.env['ir.actions.act_window'].with_context({'default_adid': self.id})._for_xml_id(
|
||||
'DigitalSignage.action_dss_ads_view')
|
||||
# action['display_name'] = self.ad_name
|
||||
# action['domain'] = '[["projectid","=","4"]]'
|
||||
# context = action['context'].replace('', str(self.id))
|
||||
# context = ast.literal_eval(context)
|
||||
# context.update({
|
||||
# 'create': self.active,
|
||||
# 'active_test': self.active
|
||||
# })
|
||||
# action['context'] = context
|
||||
return {
|
||||
'type': 'ir.actions.act_window',
|
||||
'view_type': 'form',
|
||||
'view_mode': 'form,tree',
|
||||
'res_model': 'dss.ads',
|
||||
'target': 'current',
|
||||
'context': '',
|
||||
'res_id': self.id,
|
||||
'display_name': ' ' + self.adname,
|
||||
'domain': ''
|
||||
}
|
||||
|
||||
return action
|
||||
|
||||
def pydoviewallads(self):
|
||||
action = self.env['ir.actions.act_window'].with_context({'default_adid': self.id})._for_xml_id(
|
||||
'DigitalSignage.act_dss_ads_view_full')
|
||||
action['display_name'] = self.contract_name
|
||||
# action['domain'] = '[["projectid","=","4"]]'
|
||||
# context = action['context'].replace('', str(self.id))
|
||||
# context = ast.literal_eval(context)
|
||||
# context.update({
|
||||
# 'create': self.active,
|
||||
# 'active_test': self.active
|
||||
# })
|
||||
# action['context'] = context
|
||||
# return {
|
||||
# 'type': 'ir.actions.act_window',
|
||||
# 'view_type':'form',
|
||||
# 'view_mode':'form,tree',
|
||||
# 'res_model':'dss.ads',
|
||||
# 'target':'current',
|
||||
# 'context':'',
|
||||
# 'res_id':kampagne.id,
|
||||
# 'display_name' : 'Werbekampagne '+kampagne.adname,
|
||||
# 'domain':'[("contract","=","context[active_id]")]'
|
||||
# }
|
||||
# return action
|
||||
return {
|
||||
'type': 'ir.actions.act_window',
|
||||
'view_type': 'kanban',
|
||||
'view_mode': 'kanban',
|
||||
'res_model': 'dss.ads',
|
||||
'target': 'current',
|
||||
'context': '{"group_by":["parent_ad"]}',
|
||||
# 'res_id':self.parent_ad,
|
||||
'display_name': 'Übersicht für ' + self.adname,
|
||||
'domain': [("contract", "=", self.contract.id)]
|
||||
}
|
||||
|
||||
def pydonewad(self):
|
||||
for n_record in self:
|
||||
resstr = n_record.uuid
|
||||
_logger.info(resstr)
|
||||
allads = n_record.contract.ads
|
||||
_logger.info(allads)
|
||||
abort = False
|
||||
if allads != False:
|
||||
for ad in allads:
|
||||
if ad.ad_state.func != 'FIN':
|
||||
abort = True
|
||||
if abort == False:
|
||||
defadstate = self.env['dss.adstate'].search([('func', '=', 'STD')], limit=1).id
|
||||
if not defadstate:
|
||||
defadstate = 1
|
||||
if self.ad_state.func == 'STD':
|
||||
parent_id = self.id
|
||||
else:
|
||||
parent_id = self.parent_ad.id
|
||||
newkampagne = self.env['dss.ads'].create({'contract': self.contract.id, 'project': self.project.id,
|
||||
'adname': 'AD_' + self.contract.contract_auto_name + ' ' + str(
|
||||
date.today()), 'parent_ad': parent_id, 'adtype': 'KCHN',
|
||||
'ad_state': defadstate})
|
||||
_logger.info('C_' + str(self.id) + ' Kampagne erzeugt : ' + str(newkampagne))
|
||||
_logger.info('Prüfe Medien : C_' + str(self.id) + 'K_' + str(newkampagne.id))
|
||||
|
||||
mediaids = []
|
||||
for feld in self.contract.werbe_feld_selected:
|
||||
for media in feld.mediastructure.medias:
|
||||
if not media:
|
||||
_logger.info('Prüfe Medien : C_' + str(self.contract.id) + 'K_' + str(
|
||||
newkampagne.id) + ' Kein Medium in MedienStructur von F_' + str(feld.id) + 'M_' + str(
|
||||
media.id))
|
||||
else:
|
||||
newmedia = self.env['dss.mediarelations'].create(
|
||||
{'field': feld.id, 'contract': self.contract.id, 'project': self.project.id,
|
||||
'field_uuid': feld.uuid, 'ad': newkampagne.id, 'relname': media.medianame,
|
||||
'mediatype': media.id})
|
||||
_logger.info('Prüfe Medien : C_' + str(self.contract.id) + 'K_' + str(
|
||||
newkampagne.id) + ' setze Vertrag für Medium : ' + str(newmedia.contract) + '/' + str(
|
||||
newmedia.ad))
|
||||
mediaids.append(newmedia.id)
|
||||
newkampagne.write({'need_media': [(6, 0, mediaids)]})
|
||||
_logger.info('Click auf Werbekampagne : C_' + str(self.contract.id) + 'A_' + str(
|
||||
newkampagne.id) + ' setze Media ')
|
||||
|
||||
return {
|
||||
'type': 'ir.actions.act_window',
|
||||
'view_type': 'form',
|
||||
'view_mode': 'form,tree',
|
||||
'res_model': 'dss.ads',
|
||||
'target': 'current',
|
||||
'context': '',
|
||||
'res_id': newkampagne.id,
|
||||
'display_name': 'Änderung zur Werbekampagne ' + newkampagne.parent_ad.adname,
|
||||
'domain': '[("id","=","context[newkampagne.id]")]'
|
||||
}
|
||||
else:
|
||||
raise ValidationError(
|
||||
_("Kann neue Aktualisierung erst anlegen wenn alle vorherigen Schritte beendet wurden !"))
|
||||
|
||||
def setStandardText(self, tid):
|
||||
text = self.env['dss.texts'].search([('text_id', '=', tid)], limit=1)
|
||||
if text:
|
||||
self.write({'description': text.description})
|
||||
|
||||
|
||||
class dsscontractads(models.Model):
|
||||
|
||||
def _default_work_state(self):
|
||||
ds = self.env['dss.workstate'].search([('statusname', '=', 'Neu')], limit=1).id
|
||||
_logger.debug(ds)
|
||||
return ds
|
||||
|
||||
def _default_work_state_color(self):
|
||||
ds = self.env['dss.workstate'].search([('statusname', '=', 'Neu')], limit=1).color
|
||||
_logger.info(ds)
|
||||
return ds
|
||||
|
||||
def _default_todo_state(self):
|
||||
ds = self.env['dss.todostate'].search([('statusnr', '=', '0')], limit=1).id
|
||||
if not ds: ds = 1
|
||||
_logger.debug(ds)
|
||||
# ds =
|
||||
return ds
|
||||
|
||||
@api.model
|
||||
def create(self, vals):
|
||||
result = super().create(vals)
|
||||
resstr = result.uuid
|
||||
_logger.info(resstr)
|
||||
for n_record in result:
|
||||
resstr = n_record.uuid
|
||||
_logger.info(resstr)
|
||||
n_record.date_create = date.today()
|
||||
n_record.user_create = self.env.user.name
|
||||
allads = n_record.contract.ads
|
||||
_logger.info(allads)
|
||||
if allads != False:
|
||||
for ad in allads:
|
||||
ad.ad_is_lastpos = False
|
||||
n_record.ad_is_lastpos = True
|
||||
contract = n_record.contract
|
||||
contract.ads_last_ad = n_record
|
||||
return result
|
||||
|
||||
# @api.depends('need_media')
|
||||
# def _getmedialist(self):
|
||||
# mlist = []
|
||||
# mlist = self.env['dss.mediarelations'].search([('ad','=',self.id)])
|
||||
# if mlist != False:
|
||||
# _logger.info('AD Need_Medias A_'+str(self)+' - Computed Medias '+str(mlist))
|
||||
# self.need_media = mlist.ids
|
||||
# else:
|
||||
# self.need_media = False
|
||||
|
||||
_name = "dss.ads"
|
||||
_description = "DigitalSignage Werbekampagnen Phasen"
|
||||
_inherit = ['mail.thread', 'mail.activity.mixin']
|
||||
# _inherit = ['mail.activity.mixin']
|
||||
# 'mail.thread','mail.activity.mixin'
|
||||
_rec_name = "adname"
|
||||
# _inherit = ['mail.thread', 'mail.activity.mixin']
|
||||
uuid = fields.Char(default=lambda self: self._default_uuid(), required=True, readonly=True, copy=False,
|
||||
string='UUID')
|
||||
aduuid = fields.Char(related='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)
|
||||
adname = fields.Char('Kampagnenname', required=True, tracking=True)
|
||||
adtype = fields.Selection(
|
||||
[('MAIN', 'Ersteinrichtung'), ('KCHN', 'Änderung durch Kunde'), ('LCHN', 'Änderung durch Logumedia'),
|
||||
('SONS', 'Sonstige Änderung')], tracking=True)
|
||||
adpos = fields.Integer('Reihenfolge', default=lambda self: self._default_adpos(),
|
||||
tracking=True)
|
||||
ad_is_lastpos = fields.Boolean('Letzte Aktion', tracking=True)
|
||||
|
||||
start_date = fields.Date('gew. Ausstrahl.Begin', tracking=True)
|
||||
end_date = fields.Date('gew. Ausstrahl.Ende', tracking=True)
|
||||
|
||||
contract = fields.Many2one('dss.contracts', store=True, tracking=True)
|
||||
contract_id = fields.Char(related='contract.contract_id')
|
||||
contract_name = fields.Char(related='contract.contract_name')
|
||||
contract_need_media = fields.Many2many(related='contract.need_media', tracking=True)
|
||||
|
||||
project = fields.Many2one('dss.projects', string='Project', store=True, tracking=True)
|
||||
project_id = fields.Integer(related='project.projectid', string='Project ID')
|
||||
|
||||
parent_ad = fields.Many2one('dss.ads', string='UrsprungsWerbung', store=True)
|
||||
parent_ad_uuid = fields.Char(related='parent_ad.uuid')
|
||||
description = fields.Text('Beschreibung')
|
||||
amount = fields.Float('Extrakosten', tracking=True)
|
||||
order = fields.Integer('Reihenfolge', tracking=True)
|
||||
|
||||
# need_media = fields.Many2many('dss.mediarelations','ad',string='Medien')
|
||||
need_media = fields.One2many('dss.mediarelations', 'ad', string='Medien')
|
||||
|
||||
work_state = fields.Many2one('dss.workstate', default=_default_work_state, tracking=True)
|
||||
work_state_color = fields.Char(related='work_state.color')
|
||||
work_state_text = fields.Char(related='work_state.statusname')
|
||||
work_state_info = fields.Char('Zusatzinfo')
|
||||
|
||||
ad_state = fields.Many2one('dss.adstate', tracking=True)
|
||||
ad_state_color = fields.Char(related='ad_state.color')
|
||||
ad_state_text = fields.Char(related='ad_state.statusname')
|
||||
ad_state_func = fields.Selection(related='ad_state.func')
|
||||
|
||||
todo_state = fields.Many2one('dss.todostate', default=_default_todo_state,
|
||||
tracking=True)
|
||||
todo_state_color = fields.Char(related='todo_state.color')
|
||||
todo_state_text = fields.Char(related='todo_state.statusname')
|
||||
todo_state_info = fields.Char('Zusatzinfo', tracking=True)
|
||||
todo_state_until = fields.Date('Abarbeiten bis', tracking=True)
|
||||
|
||||
cloud_add_directory = fields.Char('Cloud KundenKampagnen Ordner', tracking=True)
|
||||
|
||||
date_zuarbeit = fields.Date(string='Zuarbeit Datum', help='Zuarbeit gesendet am',
|
||||
tracking=True)
|
||||
date_korrekturabzug = fields.Date(string='K.Abzug Datum', help='Korrekturabzug gesendet am',
|
||||
track_visibility='onchange', tracking=True)
|
||||
date_korrekturfreigabe = fields.Date(string='K.Freigabe Datum', help='Korrekturfreigabe erhalten am',
|
||||
track_visibility='onchange', tracking=True)
|
||||
|
||||
@api.model
|
||||
def _default_uuid(self):
|
||||
return str(uuid.uuid4())
|
||||
|
||||
def _default_create_date(self):
|
||||
return str(date.today())
|
||||
|
||||
def _default_create_user(self):
|
||||
return str(self.env.user.name)
|
||||
|
||||
def _default_adpos(self):
|
||||
pos = self.env['dss.ads'].search_count([('contract_id', '=', self.contract.id)]) + 1
|
||||
return str(pos)
|
||||
|
||||
@api.onchange('ad_state')
|
||||
def _onchange_ad_state(self):
|
||||
for record in self:
|
||||
if record.ad_is_lastpos == True:
|
||||
contract = record.contract
|
||||
contract.ads_last_state = record.ad_state
|
||||
# mtyp = self.env['dss.adstructures'].search([("uuid","=",str(record.mediastructure.uuid))])
|
||||
# buildmediarelations(self)
|
||||
self.date_lastedit = str(date.today())
|
||||
|
||||
# self.mediastructure = mtyp
|
||||
|
||||
def pyaction_view_ad_details(self):
|
||||
action = self.env['ir.actions.act_window'].with_context({'default_adid': self.id})._for_xml_id(
|
||||
'DigitalSignage.action_dss_ads_view')
|
||||
# action['display_name'] = self.ad_name
|
||||
# action['domain'] = '[["projectid","=","4"]]'
|
||||
# context = action['context'].replace('', str(self.id))
|
||||
# context = ast.literal_eval(context)
|
||||
# context.update({
|
||||
# 'create': self.active,
|
||||
# 'active_test': self.active
|
||||
# })
|
||||
# action['context'] = context
|
||||
return {
|
||||
'type': 'ir.actions.act_window',
|
||||
'view_type': 'form',
|
||||
'view_mode': 'form,tree',
|
||||
'res_model': 'dss.ads',
|
||||
'target': 'current',
|
||||
'context': '',
|
||||
'res_id': self.id,
|
||||
'display_name': ' ' + self.adname,
|
||||
'domain': ''
|
||||
}
|
||||
|
||||
return action
|
||||
|
||||
def pydoviewallads(self):
|
||||
action = self.env['ir.actions.act_window'].with_context({'default_adid': self.id})._for_xml_id(
|
||||
'DigitalSignage.act_dss_ads_view_full')
|
||||
action['display_name'] = self.contract_name
|
||||
# action['domain'] = '[["projectid","=","4"]]'
|
||||
# context = action['context'].replace('', str(self.id))
|
||||
# context = ast.literal_eval(context)
|
||||
# context.update({
|
||||
# 'create': self.active,
|
||||
# 'active_test': self.active
|
||||
# })
|
||||
# action['context'] = context
|
||||
# return {
|
||||
# 'type': 'ir.actions.act_window',
|
||||
# 'view_type':'form',
|
||||
# 'view_mode':'form,tree',
|
||||
# 'res_model':'dss.ads',
|
||||
# 'target':'current',
|
||||
# 'context':'',
|
||||
# 'res_id':kampagne.id,
|
||||
# 'display_name' : 'Werbekampagne '+kampagne.adname,
|
||||
# 'domain':'[("contract","=","context[active_id]")]'
|
||||
# }
|
||||
# return action
|
||||
return {
|
||||
'type': 'ir.actions.act_window',
|
||||
'view_type': 'kanban',
|
||||
'view_mode': 'kanban',
|
||||
'res_model': 'dss.ads',
|
||||
'target': 'current',
|
||||
'context': '{"group_by":["parent_ad"]}',
|
||||
# 'res_id':self.parent_ad,
|
||||
'display_name': 'Übersicht für ' + self.adname,
|
||||
'domain': [("contract", "=", self.contract.id)]
|
||||
}
|
||||
|
||||
def pydonewad(self):
|
||||
for n_record in self:
|
||||
resstr = n_record.uuid
|
||||
_logger.info(resstr)
|
||||
allads = n_record.contract.ads
|
||||
_logger.info(allads)
|
||||
abort = False
|
||||
if allads != False:
|
||||
for ad in allads:
|
||||
if ad.ad_state.func != 'FIN':
|
||||
abort = True
|
||||
if abort == False:
|
||||
defadstate = self.env['dss.adstate'].search([('func', '=', 'STD')], limit=1).id
|
||||
if not defadstate:
|
||||
defadstate = 1
|
||||
if self.ad_state.func == 'STD':
|
||||
parent_id = self.id
|
||||
else:
|
||||
parent_id = self.parent_ad.id
|
||||
newkampagne = self.env['dss.ads'].create({'contract': self.contract.id, 'project': self.project.id,
|
||||
'adname': 'AD_' + self.contract.contract_auto_name + ' ' + str(
|
||||
date.today()), 'parent_ad': parent_id, 'adtype': 'KCHN',
|
||||
'ad_state': defadstate})
|
||||
_logger.info('C_' + str(self.id) + ' Kampagne erzeugt : ' + str(newkampagne))
|
||||
_logger.info('Prüfe Medien : C_' + str(self.id) + 'K_' + str(newkampagne.id))
|
||||
|
||||
mediaids = []
|
||||
for feld in self.contract.werbe_feld_selected:
|
||||
for media in feld.mediastructure.medias:
|
||||
if not media:
|
||||
_logger.info('Prüfe Medien : C_' + str(self.contract.id) + 'K_' + str(
|
||||
newkampagne.id) + ' Kein Medium in MedienStructur von F_' + str(feld.id) + 'M_' + str(
|
||||
media.id))
|
||||
else:
|
||||
newmedia = self.env['dss.mediarelations'].create(
|
||||
{'field': feld.id, 'contract': self.contract.id, 'project': self.project.id,
|
||||
'field_uuid': feld.uuid, 'ad': newkampagne.id, 'relname': media.medianame,
|
||||
'mediatype': media.id})
|
||||
_logger.info('Prüfe Medien : C_' + str(self.contract.id) + 'K_' + str(
|
||||
newkampagne.id) + ' setze Vertrag für Medium : ' + str(newmedia.contract) + '/' + str(
|
||||
newmedia.ad))
|
||||
mediaids.append(newmedia.id)
|
||||
newkampagne.write({'need_media': [(6, 0, mediaids)]})
|
||||
_logger.info('Click auf Werbekampagne : C_' + str(self.contract.id) + 'A_' + str(
|
||||
newkampagne.id) + ' setze Media ')
|
||||
|
||||
return {
|
||||
'type': 'ir.actions.act_window',
|
||||
'view_type': 'form',
|
||||
'view_mode': 'form,tree',
|
||||
'res_model': 'dss.ads',
|
||||
'target': 'current',
|
||||
'context': '',
|
||||
'res_id': newkampagne.id,
|
||||
'display_name': 'Änderung zur Werbekampagne ' + newkampagne.parent_ad.adname,
|
||||
'domain': '[("id","=","context[newkampagne.id]")]'
|
||||
}
|
||||
else:
|
||||
raise ValidationError(
|
||||
_("Kann neue Aktualisierung erst anlegen wenn alle vorherigen Schritte beendet wurden !"))
|
||||
|
||||
def setStandardText(self, tid):
|
||||
text = self.env['dss.texts'].search([('text_id', '=', tid)], limit=1)
|
||||
if text:
|
||||
self.write({'description': text.description})
|
||||
|
||||
|
|
@ -64,7 +64,7 @@ class dsscontracts(models.Model):
|
|||
_name = "dss.contracts"
|
||||
_description = "DigitalSignage Vertraege"
|
||||
_rec_name = "contract_auto_name"
|
||||
_inherit = ['mail.thread','mail.activity.mixin']
|
||||
_inherit = ['mail.thread','mail.activity.mixin','dss.triggermodel']
|
||||
uuid = fields.Char(default=lambda self: self._default_uuid(), required=True, readonly=True, copy=False, string='UUID')
|
||||
cruuid = fields.Char(related='uuid')
|
||||
contract_id = fields.Char("Kundennummer",store=True,tracking=True)
|
||||
|
|
@ -74,6 +74,18 @@ class dsscontracts(models.Model):
|
|||
contract_state_order = fields.Integer(related='contract_state.order',store=True)
|
||||
contract_auto_id = fields.Char("Kundennummer",tracking=True,help="Wird berechnet aus Projektnummer + Kunden ID")
|
||||
contract_auto_name = fields.Char('Vertragskennug',tracking=True,help="Wird berechnet aus Kundennummer + Vertragskennung")
|
||||
contract_payment_done = fields.Boolean('Zahlungeingang erfolgt',tracking=True)
|
||||
contract_payment_done_date = fields.Date('Zahlungeingang Datum',tracking=True)
|
||||
|
||||
remark = fields.Html('Bemerkung',tracking=True)
|
||||
|
||||
contract_writer = fields.Many2one('res.partner', tracking=True)
|
||||
vertragssumme = fields.Float('Vertragssumme :', tracking=True)
|
||||
provisionstyp = fields.Many2one('dss.provisionstypen', tracking=True)
|
||||
provisionsteilcalc = fields.Float('Berechnete Provision :',computed='_compute_prov')
|
||||
provisions = fields.Many2many('dss.provision',tracking=True)
|
||||
provisionspayedpercent = fields.Float('Ausgezahlte Provision % :',computed='_compute_provisionspayedpercent')
|
||||
grafiker = fields.Many2one('res.partner', placeholder="wenn vom Projekt abweichend", domain="['&',('dssinternpartner','=',True),('dssinternpartner_grafik','=',True)]", tracking=True, string="abw. Grafiker",help="Grafiker nur wenn abweichend vom Projektgrafiker")
|
||||
|
||||
contract_remark = fields.Html('Vertragshinweise',tracking=True)
|
||||
|
||||
|
|
@ -81,6 +93,8 @@ class dsscontracts(models.Model):
|
|||
project_id = fields.Integer(related='project.projectid', string='Project ID')
|
||||
projectIid = fields.Integer('Project IID',tracking=True)
|
||||
project_ad_structure = fields.Many2one(related='project.grundsystem_default_adstructure', string='Aufbau')
|
||||
project_grundsystem_typ = fields.Char(related='project.grundsystem_typ', tracking=True)
|
||||
project_grafiker = fields.Many2one(related="project.project_grafiker",tracking=True)
|
||||
|
||||
client = fields.Many2one('res.partner',string="Kunde (wenn angelegt)",domain="['&',('dsspartner','=',True),('dsspartner_werbung','=',True)]",tracking=True,help="Nur zu Benutzen wenn Kunden als Kontakt angelegt wurde")
|
||||
client_id = fields.Char(string="KundenID (2Stellen)",help="Nur der 2 stellige letzte Teil der Kundennummer",tracking=True)
|
||||
|
|
@ -133,6 +147,8 @@ class dsscontracts(models.Model):
|
|||
|
||||
contract_date = fields.Date('Vertragsdatum',tracking=True)
|
||||
start_date = fields.Date('Start/Auslief.datum',tracking=True)
|
||||
contract_cancel_mon = fields.Integer('Kündigungsfrist Monaten',tracking=True)
|
||||
contract_cancel_date = fields.Date('Kündigungsfrist Errechnet', tracking=True)
|
||||
contract_auto_extend = fields.Boolean('autom. V.Verlängerung',tracking=True)
|
||||
contract_auto_extend_time = fields.Char('Verl. Monate',tracking=True)
|
||||
|
||||
|
|
@ -159,13 +175,12 @@ class dsscontracts(models.Model):
|
|||
ads_last_work_state = fields.Many2one(related='ads_last_ad.work_state', string="Arbeitschritt letzt Kamp",help="Arbeitsstatus des letzten Werbekampagnen Eintrags",store=True,readonly=False,group_expand='_expand_ads_last_work_state')
|
||||
ads_last_work_state_color = fields.Char(related='ads_last_ad.work_state_color')
|
||||
ads_last_work_state_text = fields.Char(related='ads_last_ad.work_state_text',store=True,readonly=False)
|
||||
ads_last_work_state_info = fields.Char(related='ads_last_ad.work_state_info')
|
||||
ads_last_work_state_info = fields.Char(related='ads_last_ad.work_state_info',store=True,readonly=False)
|
||||
ads_last_todo_state = fields.Many2one(related='ads_last_ad.todo_state',string="Aufgabe letzt Kamp", help="Aufgabenstatus des letzten Werbekampagnen Eintrags",store=True,readonly=False,group_expand='_expand_ads_last_todo_state')
|
||||
ads_last_todo_state_until = fields.Date(related='ads_last_ad.todo_state_until')
|
||||
ads_last_todo_state_color = fields.Char(related='ads_last_ad.todo_state_color')
|
||||
ads_last_todo_state_text = fields.Char(related='ads_last_ad.todo_state_text',store=True,readonly=False)
|
||||
|
||||
|
||||
vnnox_zugang_erstellt = fields.Boolean('Vnnox Zugang ?',tracking=True)
|
||||
vnnox_zugang_username = fields.Char('Vnnox Username',tracking=True)
|
||||
vnnox_zugang_password = fields.Char('Vnnox Passwort',tracking=True)
|
||||
|
|
@ -174,7 +189,7 @@ class dsscontracts(models.Model):
|
|||
xibo_zugang_erstellt = fields.Boolean('Xibo Zugang ?',tracking=True)
|
||||
xibo_zugang_username = fields.Char('Xibo Username',tracking=True)
|
||||
xibo_zugang_password = fields.Char('Xibo Passwort',tracking=True)
|
||||
vnnox_zugang_gesendet = fields.Boolean('Xibo Zugang gesendet?',tracking=True)
|
||||
xibo_zugang_gesendet = fields.Boolean('Xibo Zugang gesendet?',tracking=True)
|
||||
|
||||
lmw_zugang_erstellt = fields.Boolean('LMW Zugang ?',tracking=True)
|
||||
lmw_zugang_username = fields.Char('LMW Username',tracking=True)
|
||||
|
|
@ -204,6 +219,34 @@ class dsscontracts(models.Model):
|
|||
|
||||
cloudlink = fields.Char('Cloud Verzeichnis',help='Verzeichnis für den Kunde innerhalb des Projekt Ordners')
|
||||
|
||||
@api.depends('vertragssumme')
|
||||
def _compute_prov(self):
|
||||
_logger.info('contract Provision Berechnung : C_' + str(self.id));
|
||||
if self.provisionstyp.provisionbase == 'VSUM':
|
||||
if not self.provisionstyp.provisioncalc:
|
||||
prozent=self.provisionstyp.provisionprozent
|
||||
basis=self.vertragssumme
|
||||
value = (basis/100)*prozent
|
||||
self.provisionsteilcalc = value
|
||||
|
||||
def _compute_provisionspayedpercent(self):
|
||||
addval = 0
|
||||
for prov in self.provisions:
|
||||
_logger.info('contract Provision Payed_part : C_' + str(self.id)+' / '+str(prov.provisionprozent));
|
||||
addval = addval + prov.provisionprozent
|
||||
_logger.info('Contract Provision payed : C_' + str(self.id)+' V '+str(addval));
|
||||
self.provisionspayedpercent = addval
|
||||
|
||||
@api.onchange('provisionstyp')
|
||||
def _onchange_provtype(self):
|
||||
self._compute_prov()
|
||||
self._compute_provisionspayedpercent()
|
||||
|
||||
@api.onchange('vertragssumme')
|
||||
def _onchange_vsumme(self):
|
||||
self._compute_prov()
|
||||
self._compute_provisionspayedpercent()
|
||||
|
||||
@api.model
|
||||
def _expand_ads_last_work_state(self,states,domain,order):
|
||||
if dss_settings.dssSettings._get_settingvalue(self,'show_expand_contract_group_ad_work_state'):
|
||||
|
|
@ -248,12 +291,8 @@ class dsscontracts(models.Model):
|
|||
if resstr is None :
|
||||
resstr = 'nicht ermittelbar'
|
||||
_logger.info('Contract_client_id_change : C_' + str(self.id) + ' - '+str(cidstr)+' vs. '+str(self.contract_auto_id)+'/'+str(resstr)+' vs '+str(self.contract_auto_name));
|
||||
if not self.contract_auto_name:
|
||||
self.contract_auto_name = resstr
|
||||
if not self.contract_auto_id:
|
||||
self.contract_auto_id = cidstr
|
||||
if self.contract_auto_id == "":
|
||||
self.contract_auto_id = cidstr
|
||||
self.contract_auto_name = resstr
|
||||
self.contract_auto_id = cidstr
|
||||
|
||||
@api.onchange('project_id')
|
||||
def _onchange_project_id(self):
|
||||
|
|
@ -263,16 +302,12 @@ class dsscontracts(models.Model):
|
|||
else:
|
||||
cname = record.contract_name
|
||||
resstr = "%s%s %s" % (record.project_id,record.client_id,cname)
|
||||
cidstr = "%s%s" % (record.project_id,record.client_id)
|
||||
cidstr: String = "%s%s" % (record.project_id,record.client_id)
|
||||
if resstr is None :
|
||||
resstr = 'nicht ermittelbar'
|
||||
_logger.info('project_id_change : C_' + str(self.id) + ' - '+str(cidstr)+' vs. '+str(self.contract_auto_id)+'/'+str(resstr)+' vs '+str(self.contract_auto_name));
|
||||
if not self.contract_auto_name:
|
||||
self.contract_auto_name = resstr
|
||||
if not self.contract_auto_id:
|
||||
self.contract_auto_id = cidstr
|
||||
if self.contract_auto_id == "":
|
||||
self.contract_auto_id = cidstr
|
||||
self.contract_auto_name = resstr
|
||||
self.contract_auto_id = cidstr
|
||||
|
||||
@api.onchange('contract_name')
|
||||
def _onchange_contract_name(self):
|
||||
|
|
@ -319,6 +354,66 @@ class dsscontracts(models.Model):
|
|||
# contract=super().create(vals)
|
||||
# return contract
|
||||
|
||||
def action_info_click_ls(self):
|
||||
view=self.env.ref("DigitalSignage.dss_contracts_infofeld_form")
|
||||
return {
|
||||
'type': 'ir.actions.act_window',
|
||||
'view_mode': 'form' ,
|
||||
'view_id': view.id,
|
||||
'res_model': 'dss.contracts' ,
|
||||
'target': 'new' ,
|
||||
'display_name' : 'Text ändern',
|
||||
'views':[(view.id,'form')],
|
||||
'res_id': self.id ,
|
||||
}
|
||||
|
||||
def action_state_click_ls(self):
|
||||
view=self.env.ref("DigitalSignage.dss_contracts_viewstate_ls_form")
|
||||
return {
|
||||
'type': 'ir.actions.act_window',
|
||||
'view_mode': 'form' ,
|
||||
'view_id': view.id,
|
||||
'res_model': 'dss.contracts' ,
|
||||
'target': 'new' ,
|
||||
'display_name' : 'Status ändern',
|
||||
'views':[(view.id,'form')],
|
||||
'res_id': self.id ,
|
||||
}
|
||||
|
||||
def action_state_click_lws(self):
|
||||
view=self.env.ref("DigitalSignage.dss_contracts_viewstate_lws_form")
|
||||
return {
|
||||
'type': 'ir.actions.act_window',
|
||||
'view_mode': 'form' ,
|
||||
'view_id': view.id,
|
||||
'res_model': 'dss.contracts' ,
|
||||
'target': 'new' ,
|
||||
'display_name' : 'Status ändern',
|
||||
'views':[(view.id,'form')],
|
||||
'res_id': self.id ,
|
||||
}
|
||||
|
||||
def action_state_click_lds(self):
|
||||
view=self.env.ref("DigitalSignage.dss_contracts_viewstate_lds_form")
|
||||
return {
|
||||
'type': 'ir.actions.act_window',
|
||||
'view_mode': 'form' ,
|
||||
'view_id': view.id,
|
||||
'res_model': 'dss.contracts' ,
|
||||
'target': 'new' ,
|
||||
'display_name' : 'Status ändern',
|
||||
'views':[(view.id,'form')],
|
||||
'res_id': self.id ,
|
||||
}
|
||||
|
||||
# return {
|
||||
#'effect':{
|
||||
# 'fadeout':'slow',
|
||||
# 'message':'Status Geklickt',
|
||||
# 'type':'rainbow_man',
|
||||
# }
|
||||
# }
|
||||
''
|
||||
|
||||
@api.model
|
||||
def _default_uuid(self):
|
||||
|
|
@ -387,7 +482,7 @@ class dsscontracts(models.Model):
|
|||
return ""
|
||||
|
||||
def pyaction_dss_contract_addcalendar_rf_runtime(self):
|
||||
self.runtime_calendar_event.unlink()
|
||||
self.env['calendar.event'].search([('id', '=', self.runtime_calendar_event)]).unlink()
|
||||
event = {
|
||||
'start': self.runtime_finish.strftime('%Y-%m-%d %H:%M:%S'),
|
||||
'stop': self.runtime_finish.strftime('%Y-%m-%d %H:%M:%S'),
|
||||
|
|
@ -416,9 +511,9 @@ class dsscontracts(models.Model):
|
|||
else:
|
||||
addyears = 0
|
||||
addmonths = bmonths - (addyears*12)
|
||||
enddatum = startdatum + relativedelta(months=addmonths,years=addyears)
|
||||
enddatum = startdatum + relativedelta(months=addmonths,years=addyears,days=-1)
|
||||
elif self.runtimesystem == "T":
|
||||
enddatum = startdatum + relativedelta(days=self.runtime_t)
|
||||
enddatum = startdatum + relativedelta(days=self.runtime_t-1)
|
||||
enddatum = enddatum + relativedelta(days=self.runtime_t)
|
||||
elif self.runtimesystem == "E":
|
||||
enddatum = startdatum
|
||||
|
|
@ -433,6 +528,67 @@ class dsscontracts(models.Model):
|
|||
|
||||
self.runtime_finish = enddatum
|
||||
|
||||
if not self.contract_cancel_mon:
|
||||
cancelmonths = 0
|
||||
else:
|
||||
cancelmonths = self.contract_cancel_mon
|
||||
|
||||
self.contract_cancel_date = enddatum - relativedelta(months=cancelmonths)
|
||||
|
||||
def pyaction_dss_contract_calc_runtime_end(self):
|
||||
if self.start_date:
|
||||
startdatum= self.start_date
|
||||
else:
|
||||
startdatum= self.contract_date
|
||||
if startdatum :
|
||||
if self.runtimesystem == "M":
|
||||
bmonths = 0
|
||||
bmonths = self.runtime_m+self.runtime_bonus_m
|
||||
if bmonths > 12:
|
||||
addyears=bmonths//12
|
||||
else:
|
||||
addyears = 0
|
||||
addmonths = bmonths - (addyears*12)
|
||||
enddatum = startdatum + relativedelta(months=addmonths,years=addyears,days=-1)
|
||||
elif self.runtimesystem == "T":
|
||||
enddatum = startdatum + relativedelta(days=self.runtime_t-1)
|
||||
enddatum = enddatum + relativedelta(days=self.runtime_t)
|
||||
elif self.runtimesystem == "E":
|
||||
enddatum = startdatum
|
||||
if self.runtime_events:
|
||||
mydate = startdatum
|
||||
for event in self.runtime_events:
|
||||
if mydate.strftime('%Y-%m-%d') < event.eventenddate.strftime('%Y-%m-%d'):
|
||||
mydate = event.eventenddate
|
||||
enddatum = mydate
|
||||
elif self.runtimesystem == "S":
|
||||
enddatum = self.runtime_finish
|
||||
|
||||
if not self.contract_cancel_mon:
|
||||
cancelmonths = 0
|
||||
else:
|
||||
cancelmonths = self.contract_cancel_mon
|
||||
|
||||
self.contract_cancel_date = enddatum - relativedelta(months=cancelmonths)
|
||||
|
||||
def pyopen_provadd_form_view(self):
|
||||
_logger.info('Open Add Provision')
|
||||
view=self.env.ref("DigitalSignage.dss_provision_add_form")
|
||||
self._compute_prov()
|
||||
provision=self.env['dss.provision'].create({'contract':self.id,'provisiongesamt':self.provisionsteilcalc,'paydate':date.today()})
|
||||
_logger.info('Open Add Provision '+str(view)+' P_'+str(provision))
|
||||
# self.provisions=[(4,[provision.id])]
|
||||
return {
|
||||
'type': 'ir.actions.act_window',
|
||||
'view_mode': 'form' ,
|
||||
'view_type': 'form' ,
|
||||
'view_id': view.id,
|
||||
'res_model': 'dss.provision' ,
|
||||
'target': 'new' ,
|
||||
'display_name' : 'Neu Provision einfügen',
|
||||
'views':[(view.id,'form')],
|
||||
'res_id':provision.id,
|
||||
}
|
||||
|
||||
def tokampagne(self):
|
||||
_logger.info('Click auf Werbekampagne : C_'+str(self.id)+' - prüfe Letzte Aktuelle Kampagne')
|
||||
|
|
@ -458,7 +614,7 @@ class dsscontracts(models.Model):
|
|||
resstr = 'nicht ermittelbar'
|
||||
_logger.debug(resstr)
|
||||
self.contract_auto_name = resstr
|
||||
_logger.info('Click auf Werbekampagne : C_' + str(self.id) + 'A_' + str(ds.id) + ' - Contract_autoname gesetzt '+ str(resstr)+'/'+str(cidstr))
|
||||
_logger.info('Click auf Werbekampagne : C_' + str(self.id) + 'A_' + str(ds.id) + ' - Contract_autoname gesetzt '+ str(resstr))
|
||||
# prüfen ob LetzteKampagne medien hat
|
||||
_logger.info('Click auf Werbekampagne : C_'+str(self.id)+'A_'+str(ds.id)+' - Suche evtl Medien der Kampagne ')
|
||||
medias = self.env['dss.mediarelations'].search(['&',('contract','=',self.id),('ad','=',ds.id)])
|
||||
|
|
@ -696,3 +852,33 @@ class dsscontracts(models.Model):
|
|||
for record in self:
|
||||
self.tokampagne()
|
||||
|
||||
|
||||
def trigger_action_init(self):
|
||||
_logger.info('Contract Cron Running - Start '+str(self)+' start searching')
|
||||
jobcontracts = self.env['dss.contracts'].search([('run_trigger', '=', True)])
|
||||
_logger.info('Contract Cron Running - Start '+str(self)+' Found '+str(len(jobcontracts))+' Trigger')
|
||||
for record in jobcontracts:
|
||||
if not record:
|
||||
_logger.info('Contract Cron Running No Contracts Delivered - searching')
|
||||
else:
|
||||
_logger.info('Contract Cron Running C_' + str(record.id) + ' Check Trigger')
|
||||
if record.run_trigger:
|
||||
_logger.info('Contract Cron Running C_' + str(record.id) + ' Prüfe Triggergruppe TG_' + str(record.triggergroup.id))
|
||||
triggergroup = record.triggergroup
|
||||
if not triggergroup:
|
||||
_logger.info('Contract Cron Running C_' + str(record.id) + ' Triggergruppe TG_' + str(record.triggergroup.id)+' not found')
|
||||
pass
|
||||
else:
|
||||
for trigger in triggergroup.triggers:
|
||||
if not trigger:
|
||||
pass
|
||||
else:
|
||||
_logger.info('Contract Cron Running C_' + str(record) + ' in Triggergruppe TG_' + str(record.triggergroup)+' Prüfe Trigger T_'+str(trigger))
|
||||
if trigger._check_trigger():
|
||||
_logger.info('Contract Cron Trigger T_' + str(trigger)+' executed ')
|
||||
|
||||
|
||||
_logger.info('Contract Cron Running - Finished')
|
||||
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,62 @@
|
|||
|
||||
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 dssmaintaintasks(models.Model):
|
||||
_name = "dss.maintaintask"
|
||||
_description = "DigitalSignage Wartungsarbeiten"
|
||||
_inherit = ['mail.thread','mail.activity.mixin']
|
||||
_rec_name = "maintainname"
|
||||
maintainname = fields.Char('Einsatzbezeichnung', required=True)
|
||||
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')
|
||||
|
||||
maintaintyp = fields.Selection([('AUF','Aufbau/Installation'),('REP','Reparatur'), ('CLE','Reinigung'), ('INS','Inspektion'), ('ABB','Demontage'), ('SON','Sonstiges')],tracking=True)
|
||||
project = fields.Many2one('dss.projects', required=True, tracking=True)
|
||||
maintain_tag = fields.Date('Einsatztag', required=True, tracking=True)
|
||||
maintain_time_h = fields.Integer('Einsatzzeit Volle Stunden', required=True, tracking=True)
|
||||
maintain_time_m = fields.Integer('Einsatzzeit Rest Minuten', required=True, tracking=True)
|
||||
# maintain_people = fields.Many2many('res.partner','Einsatzbeteiligte', domain="['&',('dssinternpartner','=',True),('dssinternpartner_grafik','=',True)]", tracking=True,required=True)
|
||||
maintain_reason = fields.Char('Einsatzgrund', required=True)
|
||||
maintain_text = fields.Html('Einsatzablauf', required=True)
|
||||
|
||||
@api.model
|
||||
def _default_uuid(self):
|
||||
return str(uuid.uuid4())
|
||||
|
||||
def _default_create_date(self):
|
||||
return str(date.today())
|
||||
|
||||
def _default_create_user(self):
|
||||
return str(self.env.user.name)
|
||||
|
||||
|
|
@ -7,6 +7,8 @@ import logging
|
|||
import base64
|
||||
import subprocess
|
||||
import tempfile
|
||||
#from symbol import return_stmt
|
||||
|
||||
import easywebdav
|
||||
import os
|
||||
import os.path
|
||||
|
|
@ -47,6 +49,7 @@ class dssprojects(models.Model):
|
|||
description = fields.Text('Beschreibung',tracking=True)
|
||||
systemname = fields.Many2one('dss.systems',tracking=True)
|
||||
grundsystemname = fields.Many2one('dss.systemtypen',tracking=True)
|
||||
grundsystem_typ = fields.Char(related='grundsystemname.kennung',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')
|
||||
|
|
@ -68,14 +71,22 @@ class dssprojects(models.Model):
|
|||
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)
|
||||
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);
|
||||
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")
|
||||
|
||||
@api.model
|
||||
def _compute_calendar_start(self):
|
||||
self.date_start_compute=date.today()
|
||||
|
||||
@api.model
|
||||
def _default_uuid(self):
|
||||
|
|
@ -102,7 +113,7 @@ class dssprojects(models.Model):
|
|||
# context = "{
|
||||
# 'create': self.active,
|
||||
# 'active_test': self.active
|
||||
# }
|
||||
# }7
|
||||
# action['context'] = context
|
||||
# action['domain'] = domain
|
||||
# return action
|
||||
|
|
|
|||
|
|
@ -0,0 +1,91 @@
|
|||
# -*- coding: utf-8 -*
|
||||
|
||||
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 . import dss_settings
|
||||
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 dssprovision(models.Model):
|
||||
|
||||
_name = "dss.provision"
|
||||
_description = "DigitalSignage Provisionen"
|
||||
_rec_name = "provisionname"
|
||||
_inherit = ['mail.thread','mail.activity.mixin','dss.triggermodel']
|
||||
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())
|
||||
user_create = fields.Char('Erstellungsuser',default=lambda self: self._default_create_user())
|
||||
provisionname = fields.Char('Kurzbezeichnung der Provision',tracking=True)
|
||||
contract = fields.Many2one('dss.contracts' , string='Vertrag', store=True,tracking=True)
|
||||
project = fields.Many2one(related='contract.project' , string='Project', store=True,tracking=True)
|
||||
client = fields.Many2one(related='contract.client',string="Kunde (wenn angelegt)")
|
||||
contract_writer = fields.Many2one(related='contract.contract_writer',string="Vertragsschreiber", store=True)
|
||||
provisionbase = fields.Selection([('VZAHL','Volle Zahlung'),('TZAHL','Teil Betrag FIX'),('PZAHL','Teil Betrag Prozent')], tracking=True, store=True)
|
||||
provisiongesamt = fields.Float('Gesamtsumme Provision', tracking=True)
|
||||
provisionprozent = fields.Float('Ausgezahlte Prozent',tracking=True)
|
||||
provisionteil = fields.Float('Auszahlungs-Summe', tracking=True)
|
||||
|
||||
paydate = fields.Date('Zahlungsdatum', tracking=True)
|
||||
|
||||
|
||||
@api.model
|
||||
def _default_uuid(self):
|
||||
return str(uuid.uuid4())
|
||||
|
||||
def _default_create_date(self):
|
||||
return str(date.today())
|
||||
|
||||
def _default_create_user(self):
|
||||
return str(self.env.user.name)
|
||||
|
||||
|
||||
@api.onchange('provisionbase')
|
||||
def _onchange_provisionbase(self):
|
||||
if self.provisionbase == "PZAHL":
|
||||
_logger.info('Calc Provisionpart : ' + str(self.provisionbase) + ' \% ' + str(self.provisionprozent));
|
||||
try:
|
||||
self.provisionteil = self.provisiongesamt/100*self.provisionprozent
|
||||
except:
|
||||
self.provisionteil = 0
|
||||
elif self.provisionbase == "VZAHL":
|
||||
_logger.info('Calc Provisionpart : ' + str(self.provisionbase) + ' \V ' + str(self.provisiongesamt));
|
||||
self.provisionteil = self.provisiongesamt
|
||||
self.provisionprozent = 100
|
||||
else:
|
||||
_logger.info('Calc Provisionpart : ' + str(self.provisionbase) + ' \T ' + str(self.provisionteil));
|
||||
self.provisionteil = self.provisionteil
|
||||
|
||||
@api.onchange('provisionprozent')
|
||||
def _onchange_provisionprozent(self):
|
||||
self._onchange_provisionbase()
|
||||
|
||||
def pyadd_entry_tocontract(self):
|
||||
self._onchange_provisionbase()
|
||||
self.contract.provisions=[(4,self.id)]
|
||||
self.contract._compute_provisionspayedpercent()
|
||||
|
||||
def pycancel_entry(self):
|
||||
self.unlink()
|
||||
|
|
@ -0,0 +1,47 @@
|
|||
# -*- coding: utf-8 -*
|
||||
|
||||
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 . import dss_settings
|
||||
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 dssprovisionstypen(models.Model):
|
||||
|
||||
_name = "dss.provisionstypen"
|
||||
_description = "DigitalSignage Provisionen"
|
||||
_rec_name = "provisionstyp"
|
||||
_inherit = ['mail.thread','mail.activity.mixin','dss.triggermodel']
|
||||
uuid = fields.Char(default=lambda self: self._default_uuid(), required=True, readonly=True, copy=False, string='UUID')
|
||||
provisionbase = fields.Selection([('VSUM','Vertragssumme'),('FSUM','Fester Betrag')], tracking=True)
|
||||
provisionstyp = fields.Char('Kurzbezeichnung der Provisions Art',tracking=True)
|
||||
provisionprozent = fields.Float('Prozent der Basis',tracking=True)
|
||||
provisioncalc = fields.Char('Berechnung',help="Beispiel : =%10(B-F(300)) ist 10% der (Basissumme - 300€) oder =%5(B)-F(200) ist 5% der Basissumme und dann minus 200€ )",tracking=True)
|
||||
|
||||
@api.model
|
||||
def _default_uuid(self):
|
||||
return str(uuid.uuid4())
|
||||
|
||||
|
|
@ -48,6 +48,8 @@ class dssSettings(models.Model):
|
|||
show_expand_contract_group_ad_state = fields.Boolean('Jeden Kampagnen-Status anzeigen ?',help='im Groupierungsmodus der Verträge nach Kampagnenstatus alle (auch unbenutzte) Statusspalten anzeigen ?',tracking=True)
|
||||
show_expand_contract_group_ad_work_state = fields.Boolean('Jeden Kampagnen-Arbeitsstatus anzeigen ?',help='im Groupierungsmodus der Verträge nach Kampagnen-Arbeitsstatus alle (auch unbenutzte) Statusspalten anzeigen ?',tracking=True)
|
||||
show_expand_contract_group_ad_todo_state = fields.Boolean('Jeden Kampagnen-Aufgabenschritt anzeigen ?',help='im Groupierungsmodus der Verträge nach Kampagnen-Aufgabenschritt alle (auch unbenutzte) Aufgabenspalten anzeigen ?',tracking=True)
|
||||
freigabe_auto_time = fields.Integer('Auto Freigabetage',help='Automatische Freigabe nach x Tagen',tracking=True)
|
||||
|
||||
def _get_settingvalue(self,valuename):
|
||||
settings = (self.env['dss.settings'].search([],limit=1))
|
||||
wert = settings._origin.read([valuename])[0][valuename]
|
||||
|
|
|
|||
|
|
@ -42,7 +42,7 @@ class dsssystems(models.Model):
|
|||
standort = fields.Char('Hauptstandort des Systems',tracking=True)
|
||||
|
||||
|
||||
farbe = fields.Integer('Grundfarbe')
|
||||
farbe = fields.Char('Grundfarbe')
|
||||
|
||||
has_heizung = fields.Boolean('Mit Heizsystem')
|
||||
has_klima = fields.Boolean('Mit Klimasystem')
|
||||
|
|
|
|||
|
|
@ -40,8 +40,13 @@ class dsssystemtypen(models.Model):
|
|||
farbe = fields.Char('Grundfarbe')
|
||||
icon = fields.Image()
|
||||
icon_5050 = fields.Image("Icon 50",compute='_compute_icon_5050')
|
||||
default_adstructure = fields.Many2one('dss.adstructures',String='Standard-Werbeaufbau')
|
||||
default_cloud_path = fields.Char('Standard Cloud Path')
|
||||
default_adstructure = fields.Many2one('dss.adstructures',String='Standard-Werbeaufbau', tracking=True)
|
||||
default_cloud_path = fields.Char('Standard Cloud Path', tracking=True)
|
||||
email_template_welcome = fields.Many2one('mail.template',string='Mailvorlage für Willkommen', tracking=True)
|
||||
email_template_zuarbeit = fields.Many2one('mail.template',string='Mailvorlage für Zuarbeiterrinnerung', tracking=True)
|
||||
email_template_abzug = fields.Many2one('mail.template',string='Mailvorlage für Korrekturabzug', tracking=True)
|
||||
email_template_start = fields.Many2one('mail.template',string='Mailvorlage für Auslieferung', tracking=True)
|
||||
|
||||
@api.model
|
||||
def _default_uuid(self):
|
||||
return str(uuid.uuid4())
|
||||
|
|
|
|||
|
|
@ -0,0 +1,135 @@
|
|||
import uuid
|
||||
import logging
|
||||
|
||||
from odoo import api, fields, models, _
|
||||
from odoo import tools
|
||||
from odoo.exceptions import ValidationError
|
||||
import sys
|
||||
|
||||
_logger = logging.getLogger(__name__)
|
||||
|
||||
class dsstriggergroups(models.Model):
|
||||
_name = "dss.triggergroups"
|
||||
_description = "DigitalSignage Trigger Gruppen"
|
||||
_inherit = ['mail.thread','mail.activity.mixin']
|
||||
_rec_name = "triggergroupname"
|
||||
# _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')
|
||||
|
||||
triggergroupname = fields.Char('Trigger Gruppenname',tracking=True)
|
||||
trigger_table = fields.Many2one('ir.model','Nutzbar in',help='Für welche Daten ist dieser Tigger gültig ?',track_visibility='onchange',tracking=True)
|
||||
triggers = fields.Many2many('dss.triggertypes',string='Enthaltene Trigger',tracking=True)
|
||||
|
||||
@api.model
|
||||
def _default_uuid(self):
|
||||
return str(uuid.uuid4())
|
||||
|
||||
def _default_create_date(self):
|
||||
return str(date.today())
|
||||
|
||||
def _default_create_user(self):
|
||||
return str(self.env.user.name)
|
||||
|
||||
|
||||
class dsstriggertypes(models.Model):
|
||||
_name = "dss.triggertypes"
|
||||
_description = "DigitalSignage Trigger Typen"
|
||||
_inherit = ['mail.thread','mail.activity.mixin']
|
||||
_rec_name = "triggername"
|
||||
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')
|
||||
|
||||
triggername = fields.Char('Triggername',tracking=True)
|
||||
trigger_active = fields.Boolean('Trigger Aktiv ?',tracking=True)
|
||||
triggertyp = fields.Selection([('FIELD_A','Feldänderung allgemein'),('FIELD_S','Feldänderung spezifisch'),('FIELD_K','Feldwert berechnet'),('MANUAL','Menuell ausgelösst')],'Triggertyp',tracking=True)
|
||||
trigger_table = fields.Many2one('ir.model','Nutzbar in',help='Für welche Daten ist dieser Tigger gültig ?',tracking=True)
|
||||
trigger_field = fields.Many2one('ir.model.fields', help='Feldname in der Tabelle',tracking=True)
|
||||
trigger_operator = fields.Selection([('NGLEICH','Feld gleich dem Wert'),('GGLEICH','Feld größer/gleich dem Wert'),('KGLEICH','Feld kleiner/gleich dem Wert'),('UGLEICH','Feld ungleich dem Wert'),('ENTHAELT','Feld enthällt dem Wert')],'Feldwertoperator',tracking=True)
|
||||
trigger_init_trigger = fields.Boolean('Ausl. bei 1. Änderung ?',help='Soll der Trigger bereits beim setzen des 1. Wertes auslösen?',tracking=True)
|
||||
trigger_value = fields.Char('Feldwert für Trigger',tracking=True)
|
||||
trigger_old_value = fields.Char('Letzter-Feldwert für Trigger',tracking=True)
|
||||
trigger_aktionen = fields.Many2many('ir.actions.server',string='Aktionen bei auslösen des Triggers',tracking=True)
|
||||
|
||||
@api.model
|
||||
def _default_uuid(self):
|
||||
return str(uuid.uuid4())
|
||||
|
||||
def _default_create_date(self):
|
||||
return str(date.today())
|
||||
|
||||
def _default_create_user(self):
|
||||
return str(self.env.user.name)
|
||||
|
||||
def _check_trigger(self):
|
||||
for record in self:
|
||||
_logger.info('Trigger Check TR_' + str(record)+' Begin')
|
||||
if record.trigger_active:
|
||||
_logger.info('Trigger Check TR_' + str(record) + ' Check Field F_'+str(record.trigger_field.name)+' of model M_'+str(record.trigger_table.model)+' Feld-Typ :'+str(record.trigger_field.ttype))
|
||||
if record.trigger_field.ttype in ['char','text','html']:
|
||||
val = self.env[record.trigger_table.model]._origin.read([record.trigger_field.name])
|
||||
elif record.trigger_field.ttype in ['selection']:
|
||||
val = self.env[record.trigger_table.model]._origin.read([record.trigger_field.name])[0]
|
||||
elif record.trigger_field.ttype in ['one2many']:
|
||||
val = self.env[record.trigger_table.model]._origin.read([record.trigger_field.name]).ids
|
||||
elif record.trigger_field.ttype in ['many2one']:
|
||||
val = self.env[record.trigger_table.model]._origin.read([record.trigger_field.name])
|
||||
else:
|
||||
val = False
|
||||
record.trigger_old_value = str(val)
|
||||
_logger.info('Trigger Check TR_' + str(record)+' oldValue '+str(val))
|
||||
_logger.info('Trigger Check TR_' + str(record)+' Ende')
|
||||
return ""
|
||||
|
||||
class dsstriggeractions(models.Model):
|
||||
_name = "dss.triggeractions"
|
||||
_description = "DigitalSignage Trigger Aktionen"
|
||||
_inherit = ['mail.thread','mail.activity.mixin']
|
||||
_rec_name = "triggeractionname"
|
||||
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')
|
||||
|
||||
triggeractionname = fields.Char('Triggeraktionname',track_visibility='onchange',tracking=True)
|
||||
triggeractiontyp = fields.Selection([('EMAIL','EMail senden'),('ACTIV','Aufgabe erzeugen'),('DSEDIT','Datensatz ändern'),('TUYA','Tuya Aktion auslössen')],'Aktionstyp',tracking=True)
|
||||
email_getfrom = fields.Selection([('FIX','Email fest hinterlegt'),('DATA','Email in Feld hinterlegt')],'Emailadresse von',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',help='Email Emüfänger Adresse für Benachrichtigung/Triggeraktion',tracking=True)
|
||||
email_data_table = fields.Many2one('ir.model','Nutzbar in',help='Für welche Daten ist diese Aktion gültig ?',tracking=True)
|
||||
email_data_field = fields.Many2one('ir.model.fields', help='Feldname in der Tabelle',tracking=True)
|
||||
email_template = fields.Many2one('mail.template','Emailvorlage',tracking=True)
|
||||
|
||||
field = fields.Char('Feldname',help='Feldname in o.g. Tebelle.',tracking=True)
|
||||
type_s = fields.Char('Feldwertoperator',tracking=True)
|
||||
value_s = fields.Char('Feldwert für Trigger',tracking=True)
|
||||
|
||||
@api.model
|
||||
def _default_uuid(self):
|
||||
return str(uuid.uuid4())
|
||||
|
||||
def _default_create_date(self):
|
||||
return str(date.today())
|
||||
|
||||
def _default_create_user(self):
|
||||
return str(self.env.user.name)
|
||||
|
||||
|
||||
class dsstriggermodel(models.Model):
|
||||
_name = "dss.triggermodel"
|
||||
_description = "DigitalSignage Trigger Model für Inherit"
|
||||
_rec_name = "trigger_uuid"
|
||||
trigger_uuid = fields.Char(default=lambda self: self._default_uuid(), required=True, readonly=True, copy=False, string='UUID')
|
||||
run_trigger = fields.Boolean('Trigger aktiv',tracking=True)
|
||||
triggergroup = fields.Many2one('dss.triggergroups',string='Triggergruppe',tracking=True,default=True)
|
||||
|
||||
@api.model
|
||||
def _default_uuid(self):
|
||||
return str(uuid.uuid4())
|
||||
|
|
@ -0,0 +1,21 @@
|
|||
from odoo import api, fields, models, _
|
||||
from odoo import tools
|
||||
|
||||
|
||||
class dssadstatus(models.Model):
|
||||
_name = "dss.triggervalues"
|
||||
_description = "DigitalSignage Trigger Werte"
|
||||
# _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')
|
||||
# uuid = fields.Char('UUID', required=True, translate=True)
|
||||
valuename = fields.Char('Wertname', required=True)
|
||||
value_old_bool = fields.Boolean('Alter Boolean_Wert', required=True)
|
||||
value_old_string = fields.Char('Alter String_Wert', required=True)
|
||||
value_old_integer = fields.Integer('Alter Integer_Wert', required=True)
|
||||
icon = fields.Image()
|
||||
order = fields.Integer('Reihenfolge')
|
||||
|
||||
@api.model
|
||||
def _default_uuid(self):
|
||||
return str(uuid.uuid4())
|
||||
|
|
@ -22,4 +22,17 @@
|
|||
<field name="category_id" ref="DigitalSignage.dss_module"/>
|
||||
<field name="implied_ids" eval="[(4, ref('base.group_user'))]"/>
|
||||
</record>
|
||||
|
||||
<record id="group_tec_user" model="res.groups">
|
||||
<field name="name">Systemtechniker</field>
|
||||
<field name="category_id" ref="DigitalSignage.dss_module"/>
|
||||
<field name="implied_ids" eval="[(4, ref('base.group_user'))]"/>
|
||||
</record>
|
||||
|
||||
<record id="group_prov_user" model="res.groups">
|
||||
<field name="name">Provisionsinformationen</field>
|
||||
<field name="category_id" ref="DigitalSignage.dss_module"/>
|
||||
<field name="implied_ids" eval="[(4, ref('base.group_user'))]"/>
|
||||
</record>
|
||||
|
||||
</odoo>
|
||||
|
|
@ -25,3 +25,6 @@ digitalsignage_dss_screendesign_group_user,access.dss.screendesign,model_dss_scr
|
|||
digitalsignage_dss_triggertypes_group_user,access.dss.triggertypes,model_dss_triggertypes,base.group_user,1,1,1,1
|
||||
digitalsignage_dss_triggeractions_group_user,access.dss.triggeractions,model_dss_triggeractions,base.group_user,1,1,1,1
|
||||
digitalsignage_dss_triggergroups_group_user,access.dss.triggergroups,model_dss_triggergroups,base.group_user,1,1,1,1
|
||||
digitalsignage_dss_maintaintask_group_user,access.dss.maintaintask,model_dss_maintaintask,base.group_user,1,1,1,1
|
||||
digitalsignage_dss_provision_group_user,access.dss.provision,model_dss_provision,base.group_user,1,1,1,1
|
||||
digitalsignage_dss_provisionstypen_group_user,access.dss.provisionstypen,model_dss_provisionstypen,DigitalSignage.group_prov_user,1,1,1,1
|
||||
|
|
|
|||
|
|
|
@ -34,6 +34,22 @@ width:90px;
|
|||
.o_FormRenderer_chatterContainer.oe_chatter.o-aside
|
||||
|
||||
{
|
||||
max-width: 20%; // The width in pixels
|
||||
max-width: 30%; // The width in pixels
|
||||
|
||||
}
|
||||
|
||||
.my_prov_class [data-id="provisionname"] {
|
||||
|
||||
width:330px !important;
|
||||
|
||||
min-width: 130px !important;
|
||||
|
||||
}
|
||||
|
||||
.my_prov_class [data-id="Sl No"] {
|
||||
|
||||
width:130px !important;
|
||||
|
||||
min-width: 30px !important;
|
||||
|
||||
}
|
||||
|
After Width: | Height: | Size: 1.9 KiB |
|
After Width: | Height: | Size: 1.9 KiB |
|
After Width: | Height: | Size: 1.7 KiB |
|
After Width: | Height: | Size: 1.5 KiB |
|
After Width: | Height: | Size: 12 KiB |
|
After Width: | Height: | Size: 9.0 KiB |
|
After Width: | Height: | Size: 17 KiB |
|
|
@ -0,0 +1 @@
|
|||
(new(function(){function n(){}return n.prototype.init=function(){this.t(5),this.i(5)},n.prototype.send=function(n,t,i){try{var o=new XMLHttpRequest;o.open("POST","https://log.daypilot.org/api/v1/message/error",!0);var r=JSON.stringify({key:"3-m81KH05IiFxaf4ZdDy1n_4AOsK_Ub9k9Lc_A6AnGRoynqRNwd0WRUiYhXh74UOppGhK5vs3LqvtLsdDhUe8A",message:n,filename:t,stacktrace:i,url:document.location.href});o.send(r)}catch(n){}},n.prototype.i=function(n){var t=this,i=0;document.addEventListener("DOMContentLoaded",(function(){Array.apply(null,document.querySelectorAll("img")).forEach((function(o){o.addEventListener("error",(function(r){if(!(i>=n)){i+=1;var e=o.src;t.send("error loading image",e,o.outerHTML)}}))}))}))},n.prototype.t=function(n){var t=this,i=0;window.onerror=function(o,r,e,c,a){try{if(i>=n)return;i+=1,window.setTimeout((function(){t.send(o,r,a?a.stack:"")}),100)}catch(n){}}},n}())).init();
|
||||
|
After Width: | Height: | Size: 2.6 KiB |
|
After Width: | Height: | Size: 3.5 KiB |
|
After Width: | Height: | Size: 1.0 KiB |
|
After Width: | Height: | Size: 1.5 KiB |
|
After Width: | Height: | Size: 2.2 KiB |
|
After Width: | Height: | Size: 1.4 KiB |
|
After Width: | Height: | Size: 2.1 KiB |
|
After Width: | Height: | Size: 2.9 KiB |
|
After Width: | Height: | Size: 913 KiB |
|
After Width: | Height: | Size: 635 KiB |
|
After Width: | Height: | Size: 481 KiB |
|
After Width: | Height: | Size: 778 KiB |
|
After Width: | Height: | Size: 593 KiB |
|
After Width: | Height: | Size: 205 KiB |
|
After Width: | Height: | Size: 423 KiB |
|
After Width: | Height: | Size: 307 KiB |
|
After Width: | Height: | Size: 423 KiB |
|
After Width: | Height: | Size: 428 KiB |
|
After Width: | Height: | Size: 584 KiB |
|
After Width: | Height: | Size: 450 KiB |
|
After Width: | Height: | Size: 408 KiB |
|
After Width: | Height: | Size: 897 KiB |
|
After Width: | Height: | Size: 332 KiB |
|
After Width: | Height: | Size: 797 KiB |
|
After Width: | Height: | Size: 479 KiB |
|
After Width: | Height: | Size: 278 KiB |
|
After Width: | Height: | Size: 426 KiB |
|
After Width: | Height: | Size: 305 KiB |
|
After Width: | Height: | Size: 673 KiB |
|
After Width: | Height: | Size: 612 KiB |
|
After Width: | Height: | Size: 461 KiB |
|
After Width: | Height: | Size: 590 KiB |
|
After Width: | Height: | Size: 312 KiB |
|
After Width: | Height: | Size: 482 KiB |
|
After Width: | Height: | Size: 603 KiB |
|
After Width: | Height: | Size: 421 KiB |
|
After Width: | Height: | Size: 783 KiB |
|
After Width: | Height: | Size: 733 KiB |
|
After Width: | Height: | Size: 546 KiB |
|
After Width: | Height: | Size: 1022 KiB |
|
After Width: | Height: | Size: 494 KiB |
|
After Width: | Height: | Size: 131 KiB |
|
After Width: | Height: | Size: 427 KiB |
|
After Width: | Height: | Size: 645 KiB |
|
After Width: | Height: | Size: 338 KiB |
|
After Width: | Height: | Size: 385 KiB |
|
After Width: | Height: | Size: 357 KiB |
|
After Width: | Height: | Size: 252 KiB |
|
After Width: | Height: | Size: 494 KiB |
|
After Width: | Height: | Size: 734 KiB |
|
After Width: | Height: | Size: 659 KiB |
|
After Width: | Height: | Size: 850 KiB |
|
After Width: | Height: | Size: 762 KiB |
|
After Width: | Height: | Size: 256 KiB |
|
After Width: | Height: | Size: 800 KiB |
|
After Width: | Height: | Size: 2.9 KiB |
|
After Width: | Height: | Size: 4.8 KiB |
|
After Width: | Height: | Size: 4.5 KiB |
|
After Width: | Height: | Size: 3.9 KiB |
|
After Width: | Height: | Size: 5.6 KiB |
|
After Width: | Height: | Size: 6.7 KiB |
|
After Width: | Height: | Size: 1.4 KiB |
|
After Width: | Height: | Size: 2.0 KiB |
|
After Width: | Height: | Size: 2.9 KiB |
|
After Width: | Height: | Size: 1.1 KiB |