DigitalSignage/models/dss_ads.py

472 lines
22 KiB
Python
Executable File

# -*- coding: utf-8 -*
# Test
# Test2
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 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_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'),('VERL', 'Verlängerung des Vertrages'),
('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)
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_fields = fields.Many2many(related='contract.werbe_feld_selected')
contract_need_media = fields.Many2many(related='contract.need_media', string='Vertragsmedien', 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', tracking=True)
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', tracking=True)
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',tracking=True)
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)
korrekturfreigabe_ablauf_auto_cancel = fields.Boolean('Ablaufprüfung verhintern',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_start_real_mail_send_verbose = fields.Boolean(string='Startmail nicht versendet', tracking=True)
date_start_real_mail_send = fields.Boolean(string='Startmail versendet', tracking=True)
date_start_real_mail_data = fields.Date(string='Startmail versendet am', tracking=True)
date_remove_planed = fields.Date(string='geplantes Enddatum', tracking=True)
date_remove_real = fields.Date(string='wirkliches Enddatum', tracking=True)
special_reason = fields.Char('Sonderinformation',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):
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
@api.onchange('date_korrekturabzug')
def _date_korrekturabzug_change(self):
for record in self:
_logger.info('Korrekturabzug änderung : C_' + str(self.id) + 'K_' + str(record.id)+' / '+str(record.date_korrekturabzug)+' / '+str(record._origin.date_korrekturabzug))
autodays=0
if record.date_korrekturabzug:
_logger.info('Korrekturabzug Änderung erfolgt : C_' + str(self.id) + 'K_' + str(record.id))
autodays=self.env['dss.settings'].search([],limit=1).freigabe_auto_time
record.date_korrekturfreigabe_ablauf = record.date_korrekturabzug + relativedelta(days=autodays)
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(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:
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