vscode neu
|
|
@ -9,11 +9,12 @@
|
|||
'sequence': 20,
|
||||
'summary': 'DigitalSignage Management',
|
||||
'description': """DigitalSignage Management""",
|
||||
'depends':['base','mail','web'],
|
||||
'depends':['base','mail','web','website'],
|
||||
'data': [
|
||||
'security/groups.xml',
|
||||
'security/ir.model.access.csv',
|
||||
'views/dss_contracts.xml',
|
||||
'views/dss_marker.xml',
|
||||
'views/dss_projectstate.xml',
|
||||
'views/dss_systemtypen.xml',
|
||||
'views/dss_mediarelations.xml',
|
||||
|
|
@ -30,17 +31,24 @@
|
|||
'views/dss_screendesign.xml',
|
||||
'views/dss_eventdays.xml',
|
||||
'views/dss_trigger_actions.xml',
|
||||
'views/dss_triggertypes.xml',
|
||||
'views/dss_trigger_action_groups.xml',
|
||||
'views/dss_trigger_execute.xml',
|
||||
'views/dss_triggertypes.xml',
|
||||
'views/dss_trigger_groups.xml',
|
||||
'views/dss_trigger_conditions.xml',
|
||||
'views/dss_maintains.xml',
|
||||
'views/dss_provisionstypen.xml',
|
||||
'views/dss_provision.xml',
|
||||
'views/dss_zahlungen.xml',
|
||||
'views/dss_web_contracts.xml',
|
||||
'views/dss_invoices.xml',
|
||||
'views/mainsystem_view.xml',
|
||||
'views/dss_importinvoicelist.xml',
|
||||
'views/menu.xml',
|
||||
'views/company_view.xml',
|
||||
'views/google_map.xml',
|
||||
'views/dss_report_invoice.xml',
|
||||
'data/ir_model_data.xml',
|
||||
],
|
||||
'demo': [],
|
||||
'installable': True,
|
||||
|
|
@ -51,14 +59,18 @@
|
|||
'web.assets_backend': [
|
||||
'DigitalSignage/static/src/img/*',
|
||||
'DigitalSignage/static/src/xml/screenDesignerView.xml',
|
||||
'DigitalSignage/static/src/js/form_label.js',
|
||||
'DigitalSignage/static/src/js/form_button.js',
|
||||
'DigitalSignage/static/src/js/kanban_button.js',
|
||||
'DigitalSignage/static/src/xml/form_button.xml',
|
||||
'DigitalSignage/static/src/js/dss_klistmanager.js',
|
||||
'DigitalSignage/static/src/xml/form_label.xml',
|
||||
],
|
||||
'web.assets_common': [
|
||||
'DigitalSignage/static/images/**/*',
|
||||
'DigitalSignage/static/src/js/screenDesignerView.js',
|
||||
'DigitalSignage/static/src/css/dss.css',
|
||||
'DigitalSignage/static/src/scss/style.scss',
|
||||
],
|
||||
'web.assets_qweb': [
|
||||
],
|
||||
|
|
|
|||
|
|
@ -0,0 +1,40 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
||||
|
||||
from odoo import tools
|
||||
from odoo.addons.phone_validation.tools import phone_validation
|
||||
from odoo.addons.website.controllers import form
|
||||
from odoo.http import request
|
||||
|
||||
import logging
|
||||
from odoo.http import request
|
||||
_logger = logging.getLogger(__name__)
|
||||
|
||||
class WebsiteForm(form.WebsiteForm):
|
||||
|
||||
def _get_country(self):
|
||||
visitor_partner = request.env['website.visitor']._get_visitor_from_request().partner_id
|
||||
if visitor_partner:
|
||||
# match same behaviour as in partner._phone_format()
|
||||
country = visitor_partner.country_id or request.env.company.country_id
|
||||
if country:
|
||||
return country
|
||||
country_code = request.geoip.get('country_code')
|
||||
if country_code:
|
||||
return request.env['res.country'].sudo().search([('code', '=', country_code)], limit=1)
|
||||
return request.env['res.country']
|
||||
|
||||
def _get_phone_fields_to_validate(self):
|
||||
return ['phone', 'mobile']
|
||||
|
||||
# Check and insert values from the form on the model <model> + validation phone fields
|
||||
def _handle_website_form(self, model_name, **kwargs):
|
||||
_logger.info('Im Form Handling 0')
|
||||
result = True
|
||||
return result
|
||||
|
||||
def insert_record(self, request, model, values, custom, meta=None):
|
||||
_logger.info('Im Form Handling 1')
|
||||
result = True
|
||||
# super(WebsiteForm, self).insert_record(request, model, values, custom, meta=meta)
|
||||
return result
|
||||
|
|
@ -0,0 +1,31 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<odoo>
|
||||
<data>
|
||||
<record id="DigitalSignage.model_dss_web_contracts" model="ir.model">
|
||||
<field name="website_form_key">create_contract</field>
|
||||
<field name="website_form_access">True</field>
|
||||
<field name="website_form_label">Vertragsdaten eingeben</field>
|
||||
</record>
|
||||
|
||||
<function model="ir.model.fields" name="formbuilder_whitelist">
|
||||
<value>dss.web_contracts</value>
|
||||
<value eval="[
|
||||
'contract_id',
|
||||
'contract_name',
|
||||
'contract_state',
|
||||
'client_short_company',
|
||||
'client_short_vorname',
|
||||
'client_short_name',
|
||||
'client_short_strasse',
|
||||
'client_short_plz',
|
||||
'client_short_ort',
|
||||
'client_short_email',
|
||||
'client_short_telefon',
|
||||
'client_short_website',
|
||||
'contract_date',
|
||||
'contract_auto_extend',
|
||||
'contract_auto_extend_time',
|
||||
]"/>
|
||||
</function>
|
||||
</data>
|
||||
</odoo>
|
||||
|
|
@ -1,5 +1,8 @@
|
|||
from . import dss_activity_mixin
|
||||
from . import dss_marker
|
||||
from . import dss_settings
|
||||
from . import dss_trigger
|
||||
from . import dss_ads
|
||||
from . import dss_contract
|
||||
from . import dss_projects
|
||||
from . import dss_geraetetypen
|
||||
|
|
@ -9,6 +12,7 @@ from . import dss_systems
|
|||
from . import dss_eventdays
|
||||
from . import dss_advertisefields
|
||||
from . import dss_trigger
|
||||
from . import dss_triggerexecute
|
||||
from . import dss_triggervalues
|
||||
from . import dss_zahlungen
|
||||
from . import dss
|
||||
|
|
@ -16,5 +20,8 @@ from . import dss_maintains
|
|||
from . import dss_provisionstypen
|
||||
from . import dss_provision
|
||||
from . import company
|
||||
from . import dss_invoices
|
||||
from . import dss_importinvoicelist
|
||||
from . import dss_web_contracts
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -20,8 +20,8 @@ class ResCompany(models.Model):
|
|||
dsspartner_vertrag = fields.Boolean('Aquisepartner', default=False)
|
||||
dsspartner_eigenwerbung = fields.Boolean('Eigenwerbekunde ', default=False)
|
||||
dsspartner_sonstiges = fields.Boolean('Sonstiges', default=False)
|
||||
dsspartner_sonstiges_text = fields.Char('Sonstiges', default=False)
|
||||
dssprojekte = fields.Many2many('dss.main', readonly=1 )
|
||||
dsspartner_sonstiges_text = fields.Char('Sonstiges Text', default=False)
|
||||
dssprojekte = fields.Many2many('dss.projects', readonly=1 )
|
||||
dsspartner_name = fields.Char('Kundenname', default=False)
|
||||
dsspartner_vorname = fields.Char('KundenVorname', default=False)
|
||||
dssinternpartner = fields.Boolean('Mitarbeiter', default=False)
|
||||
|
|
|
|||
708
models/dss.py
|
|
@ -50,6 +50,7 @@ def _generate_preview_from_binary_2(self, videofile_file):
|
|||
class dssimport(models.Model):
|
||||
_name = "dss.import"
|
||||
_description = "DigitalSignage Import"
|
||||
|
||||
uuid = fields.Char(default=lambda self: self._default_uuid(), required=True, readonly=True, copy=False, string='UUID')
|
||||
importfilename = fields.Binary('Import Dateiname')
|
||||
importtext = fields.Text('Import Verlauf')
|
||||
|
|
@ -93,6 +94,10 @@ class dsscontractstatus(models.Model):
|
|||
color = fields.Char(string='Color Index')
|
||||
icon = fields.Image()
|
||||
order = fields.Integer('Reihenfolge')
|
||||
systemtypdefault = fields.Boolean(string='Default Typ',tracking=True)
|
||||
systemtyp = fields.Many2one('dss.systemtypen',tracking=True)
|
||||
systemtypuuid = fields.Char(related='systemtyp.uuid',tracking=True)
|
||||
kanban_display_minimal = fields.Boolean(string='Kanban minimalisiert')
|
||||
|
||||
@api.model
|
||||
def _default_uuid(self):
|
||||
|
|
@ -309,7 +314,7 @@ class dssscreendesign(models.Model):
|
|||
user_create = fields.Char('Erstellungsuser',default=lambda self: self._default_create_user())
|
||||
user_lastedit = fields.Char('Änderungsuser')
|
||||
|
||||
screenname = fields.Char('Bildschirmname',track_visibility='onchange',tracking=True)
|
||||
screenname = fields.Char('Bildschirmname',tracking=True)
|
||||
fields = fields.One2many('dss.advertisefields','display',string='Werbefelder',tracking=True)
|
||||
|
||||
@api.model
|
||||
|
|
@ -326,704 +331,3 @@ class dssscreendesign(models.Model):
|
|||
def get_data(self):
|
||||
outlist = {'uuid' : 2222}
|
||||
return outlist
|
||||
|
||||
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"
|
||||
_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'),
|
||||
('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_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', 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)
|
||||
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):
|
||||
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:
|
||||
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 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
|
||||
|
|
|
|||
|
|
@ -0,0 +1,33 @@
|
|||
import uuid
|
||||
import logging
|
||||
import datetime
|
||||
|
||||
from odoo import api, fields, models, _
|
||||
from odoo import tools
|
||||
from datetime import datetime
|
||||
from datetime import date
|
||||
from odoo.exceptions import ValidationError
|
||||
from dateutil.relativedelta import relativedelta
|
||||
import sys
|
||||
|
||||
_logger = logging.getLogger(__name__)
|
||||
|
||||
class dssActivityMixin(models.Model):
|
||||
_name = 'dss.activity.mixin'
|
||||
_inherit = 'mail.activity.mixin'
|
||||
_description = 'DigitalSignage Activity Inherit'
|
||||
|
||||
def activity_schedule(self, act_type_xmlid='', date_deadline=None, summary='', note='', **act_values):
|
||||
_logger.info("This is my activity debug message ! - schedule")
|
||||
res = super(dssActivityMixin, self).activity_schedule(self, act_type_xmlid='', date_deadline=date_deadline, summary='', note='', **act_values)
|
||||
return res
|
||||
|
||||
def activity_feedback(self, act_type_xmlids, user_id=None, feedback=None, attachment_ids=None):
|
||||
_logger.info("This is my activity debug message ! ")
|
||||
res = super(dssActivityMixin, self).action_feedback(act_type_xmlids, user_id=user_id, feedback=feedback, attachment_ids=attachment_ids)
|
||||
return res
|
||||
|
||||
def activity_unlink(self, act_type_xmlids, user_id=None):
|
||||
_logger.info("This is my activity debug message ! unlink ")
|
||||
res = super(dssActivityMixin, self).activity_unlink(act_type_xmlids, user_id=user_id)
|
||||
return res
|
||||
|
|
@ -0,0 +1,464 @@
|
|||
# -*- 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'),
|
||||
('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_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)
|
||||
|
||||
@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:
|
||||
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 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
|
||||
|
|
@ -49,7 +49,7 @@ class dssadvertisefields(models.Model):
|
|||
isblocked = fields.Boolean('Nach Nutzung sperren',tracking=True, default=True)
|
||||
|
||||
# uuid = fields.Char('UUID', required=True, translate=True)
|
||||
auto_feldname = fields.Char('Projekt_Feldname', required=True)
|
||||
auto_feldname = fields.Char('Projekt_Feldname', default=lambda self: self._default_projektfeld(), required=True)
|
||||
display = fields.Char('Designname')
|
||||
feldname = fields.Char('Feldname', required=True)
|
||||
project = fields.Many2one('dss.projects' , string='Project', store=True)
|
||||
|
|
@ -63,6 +63,9 @@ class dssadvertisefields(models.Model):
|
|||
mediastructure_medias = fields.Many2many(related='mediastructure.medias',string='Inhalt')
|
||||
mediarelations = fields.One2many('dss.mediarelations','relname',tracking=True)
|
||||
|
||||
def _default_projektfeld(self):
|
||||
return "000_unbekannt"
|
||||
|
||||
def _default_create_date(self):
|
||||
return str(date.today())
|
||||
|
||||
|
|
|
|||
|
|
@ -1,4 +1,8 @@
|
|||
# -*- coding: utf-8 -*
|
||||
|
||||
# Test
|
||||
# Test2
|
||||
|
||||
import ast
|
||||
import datetime
|
||||
import json
|
||||
|
|
@ -16,6 +20,7 @@ import os.path
|
|||
from odoo import api, fields, models, _
|
||||
from odoo import tools
|
||||
from . import dss_settings
|
||||
from . import dss_ads
|
||||
from odoo.exceptions import ValidationError
|
||||
from datetime import date
|
||||
from datetime import datetime
|
||||
|
|
@ -60,17 +65,26 @@ class dsscontracts(models.Model):
|
|||
ds = self.env['dss.ads'].search([('contract','=',self.id)],limit=1)
|
||||
return ds
|
||||
|
||||
|
||||
def _getkorrColor(self):
|
||||
_logger.info('Contract get Color ')
|
||||
for record in self:
|
||||
record.korrectur_color = "#000000"
|
||||
return "#000000"
|
||||
|
||||
_name = "dss.contracts"
|
||||
_description = "DigitalSignage Vertraege"
|
||||
_rec_name = "contract_auto_name"
|
||||
_inherit = ['mail.thread','mail.activity.mixin','dss.triggermodel']
|
||||
_inherit = ['mail.thread','dss.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)
|
||||
contract_name = fields.Char('Kurzbezeichnung', required=True,tracking=True)
|
||||
contract_state = fields.Many2one('dss.contractstate',group_expand='_read_group_stage_ids',tracking=True)
|
||||
contract_state_color = fields.Char(related='contract_state.color',store=True)
|
||||
contract_state_order = fields.Integer(related='contract_state.order',store=True)
|
||||
contract_state_name = fields.Char(related='contract_state.statusname',string='Vertragsstatus - Text',store=True)
|
||||
contract_state_color = fields.Char(related='contract_state.color',string='Vertragsstatus - Farbe',store=True)
|
||||
contract_state_order = fields.Integer(related='contract_state.order',string='Vertragsstatus - Reihenfolge',store=True)
|
||||
contract_state_minimal_kanban = fields.Boolean(related='contract_state.kanban_display_minimal',string='Kanban mininmal',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")
|
||||
|
||||
|
|
@ -86,13 +100,15 @@ class dsscontracts(models.Model):
|
|||
remark = fields.Html('Bemerkung',tracking=True)
|
||||
|
||||
contract_writer = fields.Many2one('res.partner', tracking=True)
|
||||
contract_writer_mailcc = fields.Boolean('Vertragsschr. Mail CC ?', 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")
|
||||
|
||||
provisionsteilcalc = fields.Float('Berechnete Provision :')
|
||||
provisions = fields.Many2many('dss.provision', tracking=True)
|
||||
provisionspayedpercent = fields.Float('Ausgezahlte Provision % :',compute='_compute_provisionspayedpercent')
|
||||
grafiker = fields.Many2one('res.partner', domain="['&',('dssinternpartner','=',True),('dssinternpartner_grafik','=',True)]", tracking=True, string="abw. Grafiker",help="Grafiker nur wenn abweichend vom Projektgrafiker")
|
||||
real_grafiker = fields.Char('Grafiker tatsächlich', tracking=True)
|
||||
|
||||
contract_remark = fields.Html('Vertragshinweise',tracking=True)
|
||||
|
||||
project = fields.Many2one('dss.projects' , string='Project', store=True,tracking=True)
|
||||
|
|
@ -101,6 +117,8 @@ class dsscontracts(models.Model):
|
|||
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)
|
||||
project_system_uuid = fields.Char(related='project.grundsystemnameuuid', 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)
|
||||
|
|
@ -115,10 +133,10 @@ class dsscontracts(models.Model):
|
|||
contact_mobil = fields.Char(related="client.mobile")
|
||||
contact_email = fields.Char(related="client.email")
|
||||
contact_web = fields.Char(related="client.website")
|
||||
contact_company_name = fields.Char(related="client.name")
|
||||
contact_name = fields.Char(related="client.company_name")
|
||||
contact_dsspartner_vorname = fields.Char(related="client.dsspartner_name")
|
||||
contact_dsspartner_name = fields.Char(related="client.dsspartner_vorname")
|
||||
contact_company_name = fields.Char(related="client.company_name")
|
||||
contact_name = fields.Char(related="client.name")
|
||||
contact_dsspartner_vorname = fields.Char(related="client.dsspartner_vorname")
|
||||
contact_dsspartner_name = fields.Char(related="client.dsspartner_name")
|
||||
|
||||
parent_id = fields.Many2one('dss.contracts', string='Parent Task', index=True,tracking=True)
|
||||
|
||||
|
|
@ -136,6 +154,8 @@ class dsscontracts(models.Model):
|
|||
|
||||
client_other_projects = fields.Many2many('dss.projects',string='Weitere Projekte',tracking=True)
|
||||
|
||||
client_invoices = fields.Many2many('dss.invoices',string='Rechnungsliste',tracking=True,domain='[("invoiceclientnr","=",contract_auto_id)]')
|
||||
|
||||
werbe_feld_selected = fields.Many2many('dss.advertisefields',string='Werbefelder',tracking=True)
|
||||
shortwerbe_feld_selected = fields.Char(related='werbe_feld_selected.feldname',string='Werbefelder',tracking=True)
|
||||
cutshortwerbe_feld_selected = fields.Char(string='gekürzte Felder',compute='_compute_cutshort')
|
||||
|
|
@ -147,22 +167,24 @@ class dsscontracts(models.Model):
|
|||
# need_media_computed = fields.One2many('dss.mediarelations','field',compute='_get_media_list')
|
||||
# need_media_computed = fields.One2many('dss.mediarelations','uuid',domain="[('field','in',werbe_feld_selected)]")
|
||||
|
||||
main_runtime = fields.Integer('Gesamtlaufzeit',tracking=True)
|
||||
split_runtime_count = fields.Integer('Laufzeit Teilungen',tracking=True)
|
||||
split_runtime_time = fields.Integer('Laufzeit Sekunden',tracking=True)
|
||||
main_runtime = fields.Integer('Gesamtcliplänge',tracking=True)
|
||||
split_runtime_count = fields.Integer('Clip Teilungen',tracking=True)
|
||||
split_runtime_time = fields.Integer('Cliplänge Sekunden',tracking=True)
|
||||
|
||||
contract_date = fields.Date('Vertragsdatum',tracking=True)
|
||||
start_date = fields.Date('Start/Auslief.datum',tracking=True)
|
||||
start_date = fields.Date('Start/Auslief.datum',tracking=True,help="Datum des geplanten Startes der 1. Kampagne. Also die Uraustrahlung!")
|
||||
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)
|
||||
scan_vertrag = fields.Binary('Datei')
|
||||
scan_vertrag_filename = fields.Char("Dateiname") # Hilft, den Dateinamen zu speichern
|
||||
|
||||
runtimesystem = fields.Selection([('M','Monatslaufzeit'),('T','Tagelaufzeit'), ('E','Eventlaufzeit'), ('S','Sonderlaufzeit')],tracking=True)
|
||||
runtime_m = fields.Integer('Laufzeit',tracking=True)
|
||||
runtime_bonus_m = fields.Integer('zusätzl. Laufzeit',tracking=True)
|
||||
runtime_t = fields.Integer('Laufzeit',tracking=True)
|
||||
runtime_bonus_t = fields.Integer('zusätzl. Laufzeit',tracking=True)
|
||||
runtime_m = fields.Integer('Laufzeit Monate',tracking=True)
|
||||
runtime_bonus_m = fields.Integer('zusätzl. Laufzeit Monate',tracking=True)
|
||||
runtime_t = fields.Integer('Laufzeit Tage',tracking=True)
|
||||
runtime_bonus_t = fields.Integer('zusätzl. Laufzeit Tage',tracking=True)
|
||||
runtime_events = fields.Many2many('dss.eventdays',tracking=True)
|
||||
runtime_bonus_e = fields.Integer('zusätzl. Events',tracking=True)
|
||||
runtime_divers = fields.Char('Laufzeit',tracking=True)
|
||||
|
|
@ -175,7 +197,8 @@ class dsscontracts(models.Model):
|
|||
|
||||
base_ad = fields.Many2one('dss.ads',tracking=True)
|
||||
ads = fields.One2many('dss.ads','contract',tracking=True)
|
||||
ads_last_ad = fields.Many2one('dss.ads', help="letzte Werbekampagne",computed='_default_get_ads_last_ad',store=True)
|
||||
ads_last_ad = fields.Many2one('dss.ads', help="letzte Werbekampagne",compute='_default_get_ads_last_ad',store=True)
|
||||
ads_last_adtype = fields.Selection(related='ads_last_ad.adtype')
|
||||
ads_last_state = fields.Many2one(related='ads_last_ad.ad_state', string="Zuständigkeit letzt Kamp",help="Zuständigkeit/Status des letzten Werbekampagnen Eintrags",store=True,readonly=False,group_expand='_expand_ads_last_state')
|
||||
ads_last_state_color = fields.Char(related='ads_last_ad.ad_state_color')
|
||||
ads_last_state_text = fields.Char(related='ads_last_ad.ad_state_text',store=True,readonly=False)
|
||||
|
|
@ -184,14 +207,30 @@ class dsscontracts(models.Model):
|
|||
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',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_until = fields.Date(related='ads_last_ad.todo_state_until',readonly=False)
|
||||
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)
|
||||
ads_last_date_zuarbeit = fields.Date(related='ads_last_ad.date_zuarbeit',readonly=False)
|
||||
ads_last_date_korrekturabzug = fields.Date(related='ads_last_ad.date_korrekturabzug',readonly=False)
|
||||
ads_last_date_korrekturfreigabe_ablauf = fields.Date(related='ads_last_ad.date_korrekturfreigabe_ablauf',readonly=False)
|
||||
ads_last_date_korrekturfreigabe_ablauf_erfolgt = fields.Boolean(related='ads_last_ad.korrekturfreigabe_ablauf_erfolgt',readonly=False)
|
||||
ads_last_date_korrekturfreigabe = fields.Date(related='ads_last_ad.date_korrekturfreigabe',readonly=False)
|
||||
ads_last_date_start_planed = fields.Date(related='ads_last_ad.date_start_planed',readonly=False,help="Datum des geplanten Startes der Aktuell gültigen Kampagne !")
|
||||
ads_last_date_start_real = fields.Date(related='ads_last_ad.date_start_real',readonly=False,help="Datum des wirklichen Startes der Aktuell gültigen Kampagne !")
|
||||
ads_last_date_remove_planed = fields.Date(related='ads_last_ad.date_remove_planed',readonly=False)
|
||||
ads_last_date_remove_real = fields.Date(related='ads_last_ad.date_remove_real',readonly=False)
|
||||
ads_last_date_start_real_mail_send = fields.Boolean(related='ads_last_ad.date_start_real_mail_send',string='Kampagnen Startmail', tracking=True)
|
||||
ads_last_date_start_real_mail_data = fields.Date(related='ads_last_ad.date_start_real_mail_data', tracking=True)
|
||||
korrectur_color = fields.Char(string='Korrektur Text Color nach Status',compute=_getkorrColor)
|
||||
ads_last_date_korrekturfreigabe_ablauf_auto_cancel = fields.Boolean(related='ads_last_ad.korrekturfreigabe_ablauf_auto_cancel', tracking=True)
|
||||
|
||||
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)
|
||||
vnnox_zugang_gesendet = fields.Boolean('Vnnox Zugang gesendet?',tracking=True)
|
||||
vnnox_playlist_checked = fields.Boolean('Vnnox Liste geprüft ?',tracking=True)
|
||||
vnnox_playlist_checked_empty = fields.Boolean('Vnnox Liste war leer ?',tracking=True)
|
||||
vnnox_playlist_checked_date = fields.Date('Vnnox Liste geprüft am ',tracking=True)
|
||||
|
||||
xibo_zugang_erstellt = fields.Boolean('Xibo Zugang ?',tracking=True)
|
||||
xibo_zugang_username = fields.Char('Xibo Username',tracking=True)
|
||||
|
|
@ -213,6 +252,13 @@ class dsscontracts(models.Model):
|
|||
info_partner_changes = fields.Boolean('Benachrichtigen bei Partneränderungen',tracking=True)
|
||||
info_partner = fields.Many2one('res.partner','Benachrichtigung an : ',tracking=True)
|
||||
|
||||
work_marker_1 = fields.Boolean('Markierung 1 aktiv',tracking=True)
|
||||
work_marker_2 = fields.Boolean('Markierung 2 aktiv',tracking=True)
|
||||
work_marker_3 = fields.Boolean('Markierung 3 aktiv',tracking=True)
|
||||
work_marker_4 = fields.Boolean('Markierung 4 aktiv',tracking=True)
|
||||
|
||||
marker_list = fields.Many2many('dss.marker', string='vorhandene Marker', 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')
|
||||
|
|
@ -226,6 +272,12 @@ class dsscontracts(models.Model):
|
|||
|
||||
cloudlink = fields.Char('Cloud Verzeichnis',help='Verzeichnis für den Kunde innerhalb des Projekt Ordners')
|
||||
|
||||
tv_reach_PLZ = fields.Char(string='Reichweite PLZ',tracking=True)
|
||||
ads_radius_PLZ = fields.Integer('Umkreis PLZ in Km',tracking=True)
|
||||
ads_count_perYear = fields.Selection([('30000','30.000'),('60000','60.000'),('120000','120.000'),('1000000','1.000.000')],'Einblendungen',tracking=True)
|
||||
ads_topics = fields.Many2many('dss.contracts_ads_topics', string='Themenliste', tracking=True)
|
||||
|
||||
|
||||
|
||||
@api.depends('vertragssumme')
|
||||
def _compute_prov(self):
|
||||
|
|
@ -310,7 +362,7 @@ class dsscontracts(models.Model):
|
|||
else:
|
||||
cname = record.contract_name
|
||||
resstr = "%s%s %s" % (record.project_id,record.client_id,cname)
|
||||
cidstr: String = "%s%s" % (record.project_id,record.client_id)
|
||||
cidstr = "%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));
|
||||
|
|
@ -450,9 +502,32 @@ class dsscontracts(models.Model):
|
|||
|
||||
@api.model
|
||||
def _read_group_stage_ids(self,stages,domain,order):
|
||||
contract_state_ids = self.env['dss.contractstate'].search([],order='order')
|
||||
_logger.info('Get Columns Contract State '+ str(stages)+' / ' + str(domain)+' / '+str(domain[0])+' / '+str(len(domain[0])))
|
||||
if (len(domain[0]) > 1):
|
||||
_logger.info('get Columns Contract State ' + str(domain)+' / '+str(domain[0]))
|
||||
Pid = domain[0][2]
|
||||
else:
|
||||
_logger.info('get Columns Contract State ' + str(domain)+' / '+str(domain[1][2]))
|
||||
Pid = domain[1][2]
|
||||
Myproject=self.env['dss.projects'].search([("id","=",Pid)])
|
||||
contract_state_ids = self.env['dss.contractstate'].search(["|",("systemtypdefault","=",True),("systemtypuuid","=",Myproject.grundsystemnameuuid)],order='order')
|
||||
# contract_state_ids = self.env['dss.contractstate'].search([],order='order')
|
||||
_logger.info('get Columns Contract State ' + str(contract_state_ids)+' / '+str(self.project_system_uuid)+' / '+str(self)+' / '+str(stages)+' / '+str(domain)+' / '+str(Myproject))
|
||||
return contract_state_ids
|
||||
|
||||
@api.model
|
||||
def _read_group_system_ids(self, stages, domain, order):
|
||||
_logger.info('Get Columns System State ' + str(stages)+' / '+str(domain)+' / '+str(order))
|
||||
project_system_ids = self.env['dss.systemtypen'].search([('open_close_standard_state','=',False)], order='order')
|
||||
return project_system_ids
|
||||
|
||||
@api.model
|
||||
def fields_view_get(self,cr,uid,view_id=None,view_type='form',context=None, toolbar=False, submenu=False):
|
||||
_logger.info('Fields View Get ' + str(cr)+' / '+str(uid)+' / '+str(view)+' / '+str(parent))
|
||||
if context is None:
|
||||
context={}
|
||||
return res
|
||||
|
||||
@api.model
|
||||
def _default_client_id(self):
|
||||
return str("00")
|
||||
|
|
@ -522,11 +597,17 @@ class dsscontracts(models.Model):
|
|||
self.runtime_calendar_event=self.env['calendar.event'].create(event).id
|
||||
return ""
|
||||
|
||||
|
||||
def pyaction_dss_contract_calc_runtime(self):
|
||||
if self.start_date:
|
||||
if self.ads_last_date_start_real:
|
||||
startdatum= self.ads_last_date_start_real
|
||||
elif self.ads_last_date_start_planed:
|
||||
startdatum= self.ads_last_date_start_planed
|
||||
elif self.start_date:
|
||||
startdatum= self.start_date
|
||||
else:
|
||||
startdatum= self.contract_date
|
||||
|
||||
if startdatum :
|
||||
if self.runtimesystem == "M":
|
||||
bmonths = 0
|
||||
|
|
@ -561,7 +642,11 @@ class dsscontracts(models.Model):
|
|||
self.contract_cancel_date = enddatum - relativedelta(months=cancelmonths)
|
||||
|
||||
def pyaction_dss_contract_calc_runtime_end(self):
|
||||
if self.start_date:
|
||||
if self.ads_last_date_start_real:
|
||||
startdatum= self.ads_last_date_start_real
|
||||
elif self.ads_last_date_start_planed:
|
||||
startdatum= self.ads_last_date_start_planed
|
||||
elif self.start_date:
|
||||
startdatum= self.start_date
|
||||
else:
|
||||
startdatum= self.contract_date
|
||||
|
|
@ -801,6 +886,13 @@ class dsscontracts(models.Model):
|
|||
if record.contract_auto_id == "":
|
||||
record.contract_auto_id = cidstr
|
||||
|
||||
# def setRealGrafiker(self):
|
||||
#for record in self:
|
||||
#if self.grafiker:
|
||||
#record.real_Grafiker="Test"
|
||||
#return "Test"
|
||||
# else:
|
||||
# return self.project_grafiker
|
||||
|
||||
def setStandardValues(self):
|
||||
for record in self:
|
||||
|
|
@ -877,34 +969,28 @@ 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)+' '+str(len(jobcontracts))+' Triggergruppen gefunden')
|
||||
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) + ' Starte Triggerprüfung')
|
||||
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)+' nicht gefunden !')
|
||||
pass
|
||||
else:
|
||||
for trigger in triggergroup.triggers:
|
||||
if not trigger:
|
||||
pass
|
||||
_logger.info('Contract Cron Running C_' + str(record.id) + ' Triggerprüfung : Keine Trigger in Gruppe !')
|
||||
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')
|
||||
def _track_template(self, changes):
|
||||
res = super()._track_template(changes)
|
||||
self.trigger_track_template(changes, self)
|
||||
return res
|
||||
|
||||
|
||||
def py_open_contract_form_view(self):
|
||||
return {'name': 'Budget Edit',
|
||||
'domain': [],
|
||||
'res_model': 'dss.contracts',
|
||||
'type': 'ir.actions.act_window',
|
||||
'view_mode': 'form',
|
||||
'view_type': 'form',
|
||||
'res_id': self.id,
|
||||
# 'target': 'new',
|
||||
}
|
||||
|
||||
def pyaction_vnoxx_action1(self):
|
||||
return ""
|
||||
|
||||
def pyaction_vnoxx_action2(self):
|
||||
return ""
|
||||
|
||||
def pyaction_vnoxx_action3(self):
|
||||
return ""
|
||||
|
|
@ -0,0 +1,189 @@
|
|||
import ast
|
||||
import datetime
|
||||
import json
|
||||
import re
|
||||
import uuid
|
||||
import logging
|
||||
import base64
|
||||
import subprocess
|
||||
import tempfile
|
||||
#from symbol import return_stmt
|
||||
|
||||
import easywebdav
|
||||
import io
|
||||
import os.path
|
||||
import sys
|
||||
import csv
|
||||
#sys.path.append('/opt/odoo')
|
||||
|
||||
from odoo import api, fields, models, _
|
||||
from odoo import tools
|
||||
|
||||
from odoo.exceptions import ValidationError
|
||||
from . import dss_settings
|
||||
from datetime import date
|
||||
from datetime import datetime
|
||||
from dateutil.relativedelta import relativedelta
|
||||
|
||||
_logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class dssimportinvoicelist(models.Model):
|
||||
_name = "dss.importinvoicelist"
|
||||
_description = "DigitalSignage Rechnungsliste importieren"
|
||||
_inherit = ['mail.thread','mail.activity.mixin']
|
||||
_rec_name = "autoimportname"
|
||||
uuid = fields.Char(default=lambda self: self._default_uuid(), required=True, readonly=True, copy=False, string='UUID')
|
||||
autoimportname = fields.Char("Name des Imports",default=lambda self: self._default_name(), required=True)
|
||||
import_invoicelist = fields.Binary('Datei')
|
||||
import_error = fields.Text('Importfehler')
|
||||
file_name = fields.Char("File Name")
|
||||
alreadyimported = fields.Boolean('Bereits eingelesen?',tracking=True)
|
||||
projecttype = fields.Many2one('dss.systemtypen',tracking=True)
|
||||
date_create = fields.Date('Erstellungsdatum',default=lambda self: self._default_create_date())
|
||||
user_create = fields.Char('Erstellungsuser',default=lambda self: self._default_create_user())
|
||||
|
||||
context = fields.Char(string='Context', compute='_get_context')
|
||||
|
||||
def _get_context(self):
|
||||
self.context = dict(self.env.context)
|
||||
|
||||
@api.model
|
||||
def _default_uuid(self):
|
||||
return str(uuid.uuid4())
|
||||
|
||||
def _default_name(self):
|
||||
calcname = 'RechnungsImport_'+str(date.today())
|
||||
return str(calcname)
|
||||
|
||||
def _default_create_date(self):
|
||||
return str(date.today())
|
||||
|
||||
def _default_create_user(self):
|
||||
return str(self.env.user.name)
|
||||
|
||||
def pyimport_invoicelist(self):
|
||||
if not self.alreadyimported:
|
||||
datas=base64.b64decode(self.import_invoicelist)
|
||||
data=datas.decode('utf-8','ignore').splitlines()
|
||||
_logger.info("Import Invoices - start data : "+str(data)+" - "+str(self.import_invoicelist))
|
||||
data.pop(0)
|
||||
try:
|
||||
for row in data:
|
||||
BotText=''
|
||||
line=row.split(";")
|
||||
if (line[0] != ''):
|
||||
_logger.info("Import Invoices - row : "+str(line))
|
||||
oldimport = self.env['dss.invoices'].search([('invoiceid','=',line[0])])
|
||||
if not oldimport:
|
||||
client = self.env['dss.contracts'].search([('contract_auto_id','=',line[3])])
|
||||
entry = self.env['dss.invoices'].create({'invoiceid':line[0],'from_import':self.id,'invoicename':line[1],'invoiceclientnr':line[3],'contract':client.id,'invoice_date':datetime.strptime(line[4],"%d.%m.%Y"),'is_printed':(line[5]=="Endgltig"),'ammount_netto':line[6].strip(),'ammount_ust':line[7].strip(),'ammount_brutto':line[8].strip(),'is_payed':(line[11]=="Ja"),'invoice_type':line[9],'invoice_reference':line[10]})
|
||||
BotText='Rechnung ['+str(line[0])+'] für '+str(line[1])+' ('+str(line[3])+') neu erstellt als '
|
||||
if (line[11]=="Ja"):
|
||||
entry.is_payed_date = self.date_create
|
||||
BotText = BotText +' bezahlt'
|
||||
else:
|
||||
BotText = BotText +' nicht bezahlt'
|
||||
client.client_invoices = [(4, entry.id)]
|
||||
else:
|
||||
if oldimport.is_payed:
|
||||
if (line[11]=="Ja"):
|
||||
_logger.info("Import Invoices - "+str(line[0])+' allready imported and payed - delete bevore import again !')
|
||||
else:
|
||||
_logger.info("Import Invoices - "+str(line[0])+' allready imported and payed - now not payed again !')
|
||||
else:
|
||||
if (line[11]=="Ja"):
|
||||
oldimport.is_payed = True
|
||||
oldimport.is_payed_date = self.date_create
|
||||
BotText='Rechnung ['+str(line[0])+'] für '+str(line[1])+' ('+str(line[3])+') geändert in bezahlt !'
|
||||
_logger.info("Import Invoices - "+str(line[0])+' allready imported and not Payed - now Payed')
|
||||
else:
|
||||
_logger.info("Import Invoices - "+str(line[0])+' allready imported and not Payed - not Payed again !')
|
||||
if (BotText):
|
||||
body = BotText
|
||||
self.message_post(body=body,author_id=self.env.ref('base.partner_root').id)
|
||||
|
||||
finally:
|
||||
self.alreadyimported = True
|
||||
else:
|
||||
raise ValidationError(("Rechnungsliste wurde bereits importiert ! Bitte löschen und Import-Status zurückstetzen"))
|
||||
return 1
|
||||
|
||||
def show_popup_with_message(self):
|
||||
return {
|
||||
'name': 'Dynamic Popup',
|
||||
'type': 'ir.actions.act_window',
|
||||
'res_model': 'dss.importinvoicelist',
|
||||
'view_mode': 'form',
|
||||
'view_id': self.env.ref('DigitalSignage.view_dynamic_popup').id,
|
||||
'target': 'new',
|
||||
'context': {
|
||||
'dynamic_message': 'This is a custom message from the server!',
|
||||
},
|
||||
}
|
||||
|
||||
|
||||
|
||||
def _old_pyimport_invoicelist(self):
|
||||
# Liest Rechnungsdaten aus einer CSV-Datei und erstellt Rechnungen in Odoo.
|
||||
# :param env: Odoo-Umgebung
|
||||
# :param csv_filepath: Pfad zur CSV-Datei
|
||||
invoices = []
|
||||
try:
|
||||
# CSV-Datei öffnen
|
||||
data=base64.b64decode(self.import_invoicelist)
|
||||
with open(csv_data, mode='r', encoding='utf-8') as file:
|
||||
reader = csv.DictReader(file)
|
||||
|
||||
for row in reader:
|
||||
# Daten aus der Zeile lesen
|
||||
partner_id = int(row['partner_id'])
|
||||
invoice_date = row['Belegdatum']
|
||||
product_id = 1
|
||||
quantity = 1
|
||||
price_unit = float(row['Brutto'])
|
||||
payment_state = row['bezahlt']
|
||||
|
||||
# Rechnung erstellen
|
||||
invoice_data = {
|
||||
'move_type': 'out_invoice', # Typ: Verkaufsrechnung
|
||||
'partner_id': partner_id,
|
||||
'invoice_date': invoice_date,
|
||||
'payment_state': payment_state,
|
||||
'invoice_line_ids': [
|
||||
(0, 0, {
|
||||
'product_id': product_id,
|
||||
'quantity': quantity,
|
||||
'price_unit': price_unit,
|
||||
}),
|
||||
],
|
||||
}
|
||||
|
||||
new_invoice = env['account.move'].create(invoice_data)
|
||||
invoices.append(new_invoice)
|
||||
|
||||
# Optional: Rechnung validieren
|
||||
new_invoice.action_post()
|
||||
print(f"Rechnung erstellt: ID {new_invoice.id}, Name {new_invoice.name}")
|
||||
|
||||
print(f"{len(invoices)} Rechnungen wurden erfolgreich erstellt.")
|
||||
|
||||
except Exception as e:
|
||||
print(f"Fehler beim Verarbeiten der CSV-Datei: {e}")
|
||||
return 1
|
||||
|
||||
def pyimport_takeattachment(self):
|
||||
found = False
|
||||
for message in self.website_message_ids:
|
||||
_logger.info("Import Invoices - Get Arr. File - Message : "+str(message))
|
||||
for att in message.attachment_ids:
|
||||
_logger.info("Import Invoices - Get Att. File - Attachment : "+str(att.name))
|
||||
if "CSV" in att.name:
|
||||
found = True
|
||||
_logger.info("Import Invoices - Get Att. File - Attachment CSV found : "+str(att.name))
|
||||
self.import_invoicelist = att.datas
|
||||
break
|
||||
if not found:
|
||||
raise ValidationError(("Keine CSV Datei in den Anhängen gefunden !"))
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,59 @@
|
|||
import uuid
|
||||
import logging
|
||||
#from symbol import return_stmt
|
||||
|
||||
#sys.path.append('/opt/odoo')
|
||||
|
||||
from odoo import api, fields, models, _
|
||||
from odoo import tools
|
||||
|
||||
from odoo.exceptions import ValidationError
|
||||
from . import dss_settings
|
||||
from datetime import date
|
||||
from datetime import datetime
|
||||
from dateutil.relativedelta import relativedelta
|
||||
|
||||
_logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class dssinvoices(models.Model):
|
||||
_name = "dss.invoices"
|
||||
_description = "DigitalSignage Rechnungen"
|
||||
_inherit = ['mail.thread','mail.activity.mixin','dss.triggermodel']
|
||||
_rec_name = "invoiceid"
|
||||
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())
|
||||
from_import = fields.Many2one("dss.importinvoicelist",string="Importdatensatz",tracking=True)
|
||||
from_import_name = fields.Char(related="from_import.autoimportname")
|
||||
contract = fields.Many2one("dss.contracts",string="Importdatensatz",tracking=True)
|
||||
contract_name = fields.Char(related="contract.contract_auto_name",tracking=True)
|
||||
invoiceid = fields.Char("Rechnungsnummer",required=True,tracking=True)
|
||||
invoicename = fields.Char("Rechnungsempfänger",tracking=True)
|
||||
invoiceclientnr = fields.Char("Rechnungskundennummer",tracking=True)
|
||||
invoice_date = fields.Date("Rechnungsdatum",tracking=True)
|
||||
is_printed = fields.Boolean("Gedruckt",tracking=True)
|
||||
ammount_netto = fields.Char("Rechnungsbetrag Nettobetrag",tracking=True)
|
||||
ammount_ust = fields.Char("Rechnungs-ust",tracking=True)
|
||||
ammount_brutto = fields.Char("Rechnungs Bruttobetrag",tracking=True)
|
||||
is_payed = fields.Boolean("Bezahlt",tracking=True)
|
||||
is_payed_date = fields.Date("Zahlung erkannt",tracking=True)
|
||||
invoice_type = fields.Char("Vorgangsart",tracking=True)
|
||||
invoice_reference = fields.Char("Auftragsnummer",tracking=True)
|
||||
|
||||
def _track_template(self, changes):
|
||||
res = super()._track_template(changes)
|
||||
self.trigger_track_template(changes, self)
|
||||
return res
|
||||
|
||||
@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)
|
||||
|
||||
|
|
@ -5,6 +5,8 @@ from openerp import models, api, fields
|
|||
|
||||
class MailThread(models.AbstractModel):
|
||||
_inherit = 'mail.thread'
|
||||
|
||||
dss_mailRelations = fields.Char('eMailbezug')
|
||||
|
||||
@api.model
|
||||
def _get_tracked_fields(self, updated_fields):
|
||||
|
|
|
|||
|
|
@ -0,0 +1,40 @@
|
|||
# -*- 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
|
||||
import sys
|
||||
|
||||
_logger = logging.getLogger(__name__)
|
||||
|
||||
class dssmarker(models.Model):
|
||||
_name = "dss.marker"
|
||||
_description = "DigitalSignage Datensatz-Marker"
|
||||
_inherit = ['mail.thread','mail.activity.mixin']
|
||||
_rec_name = "markername"
|
||||
uuid = fields.Char(default=lambda self: self._default_uuid(), required=True, readonly=True, copy=False, string='UUID')
|
||||
markerid = fields.Char('Eind. ID',help="Bitte eine Eindeutige Kennung z.B: GMARKER1112 einfallen lassen ",tracking=True)
|
||||
markername = fields.Char('Name',tracking=True)
|
||||
description = fields.Text('Beschreibung',tracking=True)
|
||||
|
||||
@api.model
|
||||
def _default_uuid(self):
|
||||
return str(uuid.uuid4())
|
||||
|
|
@ -7,7 +7,10 @@ import logging
|
|||
import base64
|
||||
import subprocess
|
||||
import tempfile
|
||||
import requests
|
||||
#from symbol import return_stmt
|
||||
import json
|
||||
from types import SimpleNamespace
|
||||
|
||||
import easywebdav
|
||||
import os
|
||||
|
|
@ -34,7 +37,7 @@ class dssprojects(models.Model):
|
|||
_name = "dss.projects"
|
||||
_description = "DigitalSignage Projekte"
|
||||
_rec_name = "projektname"
|
||||
_inherit = ['mail.thread','mail.activity.mixin']
|
||||
_inherit = ['mail.thread','mail.activity.mixin','dss.triggermodel']
|
||||
projektname = fields.Char('Projektname', required=True)
|
||||
uuid = fields.Char(default=lambda self: self._default_uuid(), required=True, readonly=True, copy=False, string='UUID')
|
||||
projectid = fields.Integer('Projekt ID',tracking=True)
|
||||
|
|
@ -47,13 +50,19 @@ class dssprojects(models.Model):
|
|||
aktstatus_color = fields.Char(related='aktstatus.color')
|
||||
aktstatus_icon = fields.Image(related='aktstatus.icon')
|
||||
description = fields.Text('Beschreibung',tracking=True)
|
||||
short_partner_description = fields.Char('Kurz-Beschreibung für Kunden',tracking=True)
|
||||
partner_description = fields.Text('Beschreibung für Kunden',tracking=True)
|
||||
systemname = fields.Many2one('dss.systems',tracking=True)
|
||||
grundsystemname = fields.Many2one('dss.systemtypen',group_expand='_read_group_system_ids',tracking=True)
|
||||
grundsystem_typ = fields.Char(related='grundsystemname.kennung',tracking=True)
|
||||
grundsystemnameuuid = fields.Char(related='grundsystemname.uuid',tracking=True)
|
||||
grundsystemicon = fields.Image(related='grundsystemname.icon',tracking=True)
|
||||
grundsystem_default_adstructure = fields.Many2one(related='grundsystemname.default_adstructure',tracking=True)
|
||||
grundsystemicon5050 = fields.Image(related='grundsystemname.icon_5050')
|
||||
grundsystem_ordner = fields.Char(related='grundsystemname.default_cloud_path')
|
||||
grundsystem_showonlinestate = fields.Boolean(related='grundsystemname.showonlinestate')
|
||||
grundsystem_showonlinestate_type = fields.Selection(related='grundsystemname.showonlinestate_type')
|
||||
|
||||
standort = fields.Char('Beschreibung des Standortes')
|
||||
standort_strasse = fields.Char('Strasse des Projektes',tracking=True)
|
||||
standort_plz = fields.Char('PLZ des Projektes',tracking=True)
|
||||
|
|
@ -63,6 +72,9 @@ class dssprojects(models.Model):
|
|||
standort_long = fields.Char('Standort Longitude',tracking=True)
|
||||
standort_lati = fields.Char('Standort Latitude',tracking=True)
|
||||
standort_visible = fields.Boolean('Auf Projekt-Karte sichtbar',tracking=True)
|
||||
|
||||
zahlungsvorlauf = fields.Integer('Wochen Zahlungsvorlauf', tracking=True)
|
||||
|
||||
maps_name = fields.Char('Name in Google',tracking=True)
|
||||
maps_type = fields.Char('Type in Google',tracking=True)
|
||||
maps_marker = fields.Selection([('m1.png','Marker 1'),('m2.png','Marker 2'),('m3.png','Marker 3'),('m4.png','Marker 4'),('m5.png','Marker 5'),('pin.png','Marker Pin'),('pin2.png','3D Marker Pin'),('pin_display.png','Displpay Pin'),('pin_display_touch.png','TouchDisplpay Pin'),('pin_led.png','LEDWand Pin')],'Marker in Google',tracking=True)
|
||||
|
|
@ -89,6 +101,7 @@ class dssprojects(models.Model):
|
|||
zeiten_off = fields.Datetime('veraltet',tracking=True)
|
||||
zeitenf_on = fields.Float('Einschaltzeit',tracking=True)
|
||||
zeitenf_off = fields.Float('Ausschaltzeit',tracking=True)
|
||||
zeiten_notiz = fields.Char('Schaltzeiten Notizen', tracking=True)
|
||||
errichtet_am = fields.Date('Errichtungstag',tracking=True)
|
||||
standort_inout = fields.Selection([('indoor','im Gebäude'), ('outdoor','Aussenbereich'), ('semiindoor','Überdachter Aussenbereich'),('Divers','Andere Art')],tracking=True)
|
||||
|
||||
|
|
@ -97,6 +110,11 @@ class dssprojects(models.Model):
|
|||
cloudlink = fields.Char('Cloud Verzeichnis',help='Verzeichnis für das Project innerhalb des Cloud Struktur')
|
||||
maintains = fields.Many2many('dss.maintaintask',string="Einsätze am Projekt")
|
||||
|
||||
marker_list = fields.Many2many('dss.marker', string='vorhandene Marker', tracking=True)
|
||||
|
||||
onlinestate = fields.Char('OnlineColor',compute='_compute_getonlinestate')
|
||||
playername = fields.Char('Name des Players', tracking=True)
|
||||
|
||||
@api.model
|
||||
def _read_group_system_ids(self, stages, domain, order):
|
||||
project_system_ids = self.env['dss.systemtypen'].search([('open_close_standard_state','=',False)], order='order')
|
||||
|
|
@ -118,11 +136,21 @@ class dssprojects(models.Model):
|
|||
|
||||
@api.model
|
||||
def _compute_calendar_start(self):
|
||||
self.date_start_compute=date.today()
|
||||
for record in self:
|
||||
if record.errichtet_am:
|
||||
record.date_start_compute=record.errichtet_am
|
||||
else:
|
||||
record.date_start_compute=date.today()
|
||||
|
||||
@api.model
|
||||
def _default_uuid(self):
|
||||
return str(uuid.uuid4())
|
||||
|
||||
def _track_template(self, changes):
|
||||
res = super()._track_template(changes)
|
||||
if self.run_trigger:
|
||||
self.trigger_track_template(changes, self)
|
||||
return res
|
||||
|
||||
def pyaction_view_contracts(self):
|
||||
# action = self.env['ir.actions.act_window'].with_context({'default_project': self.id})._for_xml_id('DigitalSignage.action_dss_project_contracts')
|
||||
|
|
@ -200,3 +228,46 @@ class dssprojects(models.Model):
|
|||
def pyaction_dss_project_set_def_cloud(self):
|
||||
self.cloudlink = str(self.env['dss.settings'].search([], limit=1).def_project_cloudpath)
|
||||
return True
|
||||
|
||||
@api.model
|
||||
def _compute_getonlinestate(self):
|
||||
colorval = "#a0a0a0"
|
||||
self.onlinestate = colorval
|
||||
|
||||
@api.model
|
||||
def compute_getonlinestate2(self,project):
|
||||
proj = self.env['dss.projects'].search([('id',"=",project)])
|
||||
colorOn = str(self.env['dss.settings'].search([], limit=1).systemonline_color)
|
||||
colorOff = str(self.env['dss.settings'].search([], limit=1).systemoffline_color)
|
||||
_logger.info("Projekt Online Settings Check "+str(proj.grundsystem_showonlinestate_type)+' '+str(self)+' '+str(project))
|
||||
if (proj.grundsystem_showonlinestate_type == 'RPORT'):
|
||||
_logger.info("Projekt RPORT Settings ")
|
||||
colorval = colorOff
|
||||
elif (proj.grundsystem_showonlinestate_type == 'VNNOX'):
|
||||
vnurl = str(self.env['dss.settings'].search([], limit=1).vnnoxurl)+'/Rest/Logon'
|
||||
vnusername = str(self.env['dss.settings'].search([], limit=1).vnnoxusername)
|
||||
vnpassword = str(self.env['dss.settings'].search([], limit=1).vnnoxpassword)
|
||||
_logger.info("Projekt VNNOX Settings " + str(vnurl))
|
||||
r = requests.post(vnurl, json={"password": vnpassword,"username": vnusername})
|
||||
_logger.info("Projekt VNNOX Settings Result " + str(r.status_code))
|
||||
if (str(r.status_code) == "200"):
|
||||
content = str(r.json())
|
||||
index = content.find("token")
|
||||
content = content[index+9:]
|
||||
index = content.find("',")
|
||||
token = content[:index]
|
||||
_logger.info("Projekt VNNOX Settings Token : /" + str(token)+"/")
|
||||
vnurl_getPlayer = str(self.env['dss.settings'].search([], limit=1).vnnoxurl)+'/Rest/Player?offset=0&limit=10&sort=name&sortType=asc&search='+str(proj.playername)
|
||||
headers = {'token': token}
|
||||
r = requests.get(vnurl_getPlayer, headers=headers)
|
||||
if (str(r.status_code) == "200"):
|
||||
content = str(r.json())
|
||||
_logger.info("Projekt VNNOX Settings Data : /" + str(content)+"/")
|
||||
else:
|
||||
colorval = "#a0a0a0"
|
||||
colorval = colorOff
|
||||
else:
|
||||
colorval = "#a0a0a0"
|
||||
else:
|
||||
colorval = "#a0a0a0"
|
||||
proj.onlinestate = colorval
|
||||
|
|
|
|||
|
|
@ -36,7 +36,7 @@ class dssSettings(models.Model):
|
|||
def_project_cloudpath = fields.Char('Standard Projekt Pfad',tracking=True)
|
||||
def_project_cloudpath_sample = fields.Char('Projekt Beispiel :',store=True,tracking=True)
|
||||
def_contract_cloudpath = fields.Char('Standard Kunden Pfad',tracking=True)
|
||||
def_contract_cloudpath_sample = fields.Char('Projekt Beispiel :',tracking=True)
|
||||
def_contract_cloudpath_sample = fields.Char('Vertrags Beispiel :',tracking=True)
|
||||
def_contract_cloudpath_V2 = fields.Char('Standard Kunden Pfad V2',tracking=True)
|
||||
def_contract_cloudpath_sample_V2 = fields.Char('Projekt Beispiel V2 :',tracking=True)
|
||||
def_ad_cloudpath = fields.Char('Standard Kampagnen Pfad',tracking=True)
|
||||
|
|
@ -52,6 +52,15 @@ class dssSettings(models.Model):
|
|||
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)
|
||||
tv_vertragsankuendigung_actionID = fields.Integer('TV Vertragsankündigung ActionID',help="Aktion die ausgeführt wird, wenn im Web-Vertragseingang der Button Vertragsankündigung geklickt wird.",tracking=True)
|
||||
systemonline_color = fields.Char('Farbe Online',tracking=True)
|
||||
systemoffline_color = fields.Char('Farbe Offline',tracking=True)
|
||||
vnnoxurl = fields.Char('VNNox URL',tracking=True)
|
||||
vnnoxusername = fields.Char('VNNox Username',tracking=True)
|
||||
vnnoxpassword = fields.Char('VNNox Password',tracking=True)
|
||||
rporturl = fields.Char('RPort URL',tracking=True)
|
||||
rportusername = fields.Char('RPort Username',tracking=True)
|
||||
rportpassword = fields.Char('RPort Password',tracking=True)
|
||||
|
||||
|
||||
def _get_settingvalue(self,valuename):
|
||||
|
|
@ -115,12 +124,37 @@ class dssSettings(models.Model):
|
|||
return str(uuid.uuid4())
|
||||
|
||||
@api.model
|
||||
def saveConfig(self,savemodel,activefields):
|
||||
_logger.info("Config speichern "+str(savemodel)+" / "+str(activefields))
|
||||
def saveConfig(self,tableInfo):
|
||||
_logger.info("Config speichern "+str(tableInfo))
|
||||
activefields = tableInfo[3]
|
||||
for field in activefields:
|
||||
feldwerte = activefields.get(field)
|
||||
for wert in feldwerte:
|
||||
_logger.info("Config speichern : "+str(field)+" / "+str(wert)+" -> "+str(feldwerte.get(wert)))
|
||||
_logger.info("Config speichern : "+str(field)+" / "+str(tableInfo[0])+" -> "+str(tableInfo[1])+" "+str(tableInfo[2]))
|
||||
myview = self.env['dss.viewsettings'].search(['&',("user","=",self.env.user.name),("model_view","=",tableInfo[1]),("model_datensatz","=",tableInfo[0]),("viewtype","=",tableInfo[2]),("column","=",field[0])])
|
||||
if not myview:
|
||||
_logger.info("Config speichern : noch keine gespeicherten Daten")
|
||||
else:
|
||||
myview.unlink()
|
||||
self.env['dss.viewsettings'].create({
|
||||
'model_view':tableInfo[1],
|
||||
'model_datensatz':tableInfo[0],
|
||||
'viewtype':tableInfo[2],
|
||||
'user':self.env.user.name,
|
||||
'user_id':self.env.user.id,
|
||||
'column':field[0],
|
||||
'column_size':field[1],
|
||||
'state_visible':field[2],
|
||||
'state_collapse':field[3]
|
||||
})
|
||||
return 0
|
||||
|
||||
@api.model
|
||||
def resetConfig(self,tableInfo):
|
||||
_logger.info("Config reset "+str(tableInfo))
|
||||
myview = self.env['dss.viewsettings'].search(['&',("user","=",self.env.user.name),("model_view","=",tableInfo[1]),("model_datensatz","=",tableInfo[0]),("viewtype","=",tableInfo[2])])
|
||||
if not myview:
|
||||
_logger.info("Config Reset : noch keine gespeicherten Daten")
|
||||
else:
|
||||
myview.unlink()
|
||||
return 0
|
||||
|
||||
|
||||
|
|
@ -131,10 +165,13 @@ class dssSettingsSave(models.Model):
|
|||
_description = "DigitalSignage Ansicht Einstellungen"
|
||||
_inherit = []
|
||||
uuid = fields.Char(default=lambda self: self._default_uuid(), required=True, readonly=True, copy=False, string='UUID')
|
||||
model = fields.Many2one('ir.model',string='Ansichtsmodel')
|
||||
viewtype = fields.Char('Ansichtstyp')
|
||||
user = fields.Char('User')
|
||||
user_id = fields.Many2one('res.users',string='User_id')
|
||||
model_view = fields.Char('Model')
|
||||
model_datensatz = fields.Char('Datensatz')
|
||||
viewtype = fields.Char('Ansichtstyp')
|
||||
column = fields.Char('Spalte')
|
||||
column_size = fields.Char('Spalten Grösse')
|
||||
state_visible = fields.Char('Status sichtbar')
|
||||
state_collapse = fields.Char('Status zusammengeklappt')
|
||||
|
||||
|
|
@ -146,4 +183,7 @@ class dssSettingsSave(models.Model):
|
|||
def _default_create_user(self):
|
||||
return str(self.env.user.name)
|
||||
|
||||
def _default_create_user_id(self):
|
||||
return self.env.user.id
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -40,7 +40,7 @@ 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', tracking=True)
|
||||
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)
|
||||
|
|
@ -49,6 +49,8 @@ class dsssystemtypen(models.Model):
|
|||
open_close_standard_state = fields.Boolean('Wenn Leer geschlossen ? ', tracking=True)
|
||||
open_close_user_state = fields.Boolean('Leer-Verhalten user',compute='_get_user_openstate',tracking=True)
|
||||
order = fields.Integer('Reihenfolge')
|
||||
showonlinestate = fields.Boolean('OnlineStatus zeigen')
|
||||
showonlinestate_type = fields.Selection([('RPORT','RPort Status'),('VNNOX','Vnnox System')])
|
||||
|
||||
|
||||
|
||||
|
|
@ -88,4 +90,4 @@ class dssstatesave(models.Model):
|
|||
stategroup = fields.Selection([('SYSTYP','Systemtypen'),('CONTYP','Vertragsstatus')],'Status Gruppe', required=True)
|
||||
state = fields.Char('Status', required=True)
|
||||
user = fields.Char('Benutzer', required=True)
|
||||
state_open = fields.Boolean('Verhalten ', tracking=True)
|
||||
state_open = fields.Boolean('Verhalten ')
|
||||
|
|
|
|||
|
|
@ -1,13 +1,111 @@
|
|||
import uuid
|
||||
import logging
|
||||
import datetime
|
||||
|
||||
from odoo import api, fields, models, _
|
||||
from odoo import tools
|
||||
from datetime import datetime
|
||||
from datetime import date
|
||||
from odoo.exceptions import ValidationError
|
||||
from dateutil.relativedelta import relativedelta
|
||||
import sys
|
||||
|
||||
_logger = logging.getLogger(__name__)
|
||||
|
||||
class dsstriggerconditions(models.Model):
|
||||
_name = "dss.triggerconditions"
|
||||
_description = "DigitalSignage Trigger Bedingungen"
|
||||
_inherit = ['mail.thread','mail.activity.mixin']
|
||||
_rec_name = "triggerconditionname"
|
||||
# _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')
|
||||
|
||||
triggerconditionname = fields.Char('Trigger Bedingungsname',tracking=True)
|
||||
trigger_table = fields.Many2one('ir.model','Nutzbar in',help='Für welche Daten ist dieser Bedingung gültig ?',tracking=True)
|
||||
trigger_condition_type = fields.Selection([('WERT','Feld gleich einem Wert'),('MARKER','Marker vorhanden')],'Prüfungsart',tracking=True)
|
||||
trigger_field = fields.Many2one('ir.model.fields',string="Bedingungsfeld", help='Prüfungsfeldname in der Tabelle - für dieses Feld wird der Wert geprüft',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_value_opperator = fields.Selection([('TAG','Aktueller Tag'),('TIME','Aktuelle Zeit'),('JAHR','Aktuelles Jahr'),('BTRUE','Boolean Wahr'),('BFALSE','Boolean Falsch'),('FIX','Wert')],'Vergleichswert',tracking=True)
|
||||
trigger_negate = fields.Boolean('Ergebnis Negieren',tracking=True)
|
||||
trigger_marker_check = fields.Many2one('dss.marker','Marker',help='Welcher Marker soll eingefügt werden ?',tracking=True)
|
||||
trigger_value = fields.Char('Fix Wert',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 trigger_CheckCond(self,Dataset,Condition):
|
||||
if (Condition.trigger_condition_type == "MARKER"):
|
||||
Wert = ""
|
||||
else:
|
||||
fieldname = Condition.trigger_field.name
|
||||
field = Dataset._fields[fieldname]
|
||||
field_type = field.type
|
||||
Compare = False
|
||||
if (field_type == "date"):
|
||||
Wert = str(Dataset[fieldname])
|
||||
elif (field_type == "many2one"):
|
||||
Wert = str(Dataset[fieldname].id)
|
||||
else:
|
||||
Wert = Dataset[fieldname]
|
||||
if (Condition.trigger_condition_type == "WERT"):
|
||||
_logger.info("Trigger in CheckConditions - checking conditions : "+str(Dataset)+" field : "+str(fieldname)+' ('+str(Condition.trigger_value_opperator)+') -> '+str(Condition))
|
||||
OPP = Condition.trigger_operator
|
||||
if (Condition.trigger_value_opperator== "TAG"):
|
||||
TargetValue= str(date.today())
|
||||
if (Wert == False):
|
||||
Wert = "1900-01-01"
|
||||
elif (Condition.trigger_value_opperator== "TIME"):
|
||||
TargetValue= str(datetime.now())
|
||||
if (Wert == False):
|
||||
Wert = "00:00"
|
||||
elif (Condition.trigger_value_opperator== "JAHR"):
|
||||
TargetValue= str(date.today())
|
||||
if (Wert == False):
|
||||
Wert = "1900-01-01"
|
||||
elif (Condition.trigger_value_opperator== "BTRUE"):
|
||||
TargetValue= str(True)
|
||||
elif (Condition.trigger_value_opperator== "BFALSE"):
|
||||
TargetValue= str(False)
|
||||
elif (Condition.trigger_value_opperator== "FIX"):
|
||||
TargetValue= str(Condition.trigger_value)
|
||||
_logger.info("Trigger in CheckConditions - Vergleich : ("+str(Wert)+') ('+str(field_type)+' -> '+str(OPP)+' -> '+str(TargetValue))
|
||||
Compare = False
|
||||
|
||||
if OPP=="NGLEICH":
|
||||
Compare = str(Wert) == str(TargetValue)
|
||||
_logger.info("Trigger in CheckConditions - Vergleich GLEICH : "+str(Wert)+' = '+str(TargetValue)+" = "+str(Compare))
|
||||
if OPP=="UGLEICH":
|
||||
Compare = str(Wert) != str(TargetValue)
|
||||
_logger.info("Trigger in CheckConditions - Vergleich NGLEICH : "+str(Wert)+' <> '+str(TargetValue)+" = "+str(Compare))
|
||||
if OPP=="GGLEICH":
|
||||
Compare = str(Wert) >= str(TargetValue)
|
||||
_logger.info("Trigger in CheckConditions - Vergleich GGLEICH : "+str(Wert)+' >= '+str(TargetValue)+" = "+str(Compare))
|
||||
if OPP=="KGLEICH":
|
||||
Compare = str(Wert) <= str(TargetValue)
|
||||
_logger.info("Trigger in CheckConditions - Vergleich KGLEICH : "+str(Wert)+' <= '+str(TargetValue)+" = "+str(Compare))
|
||||
elif (Condition.trigger_condition_type == "MARKER"):
|
||||
_logger.info("Trigger in CheckConditions - checking conditions : "+str(Dataset.marker_list)+" Marker : "+str(Condition.trigger_marker_check))
|
||||
Compare = Condition.trigger_marker_check.id in Dataset.marker_list.mapped('id')
|
||||
if Condition.trigger_negate:
|
||||
Compare = not Compare
|
||||
_logger.info("Trigger in CheckConditions - NOT Invert : = "+str(Compare))
|
||||
|
||||
dotrigger = Compare
|
||||
return dotrigger
|
||||
|
||||
|
||||
class dsstriggergroups(models.Model):
|
||||
_name = "dss.triggergroups"
|
||||
_description = "DigitalSignage Trigger Gruppen"
|
||||
|
|
@ -21,8 +119,10 @@ class dsstriggergroups(models.Model):
|
|||
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)
|
||||
trigger_table = fields.Many2one('ir.model','Nutzbar in',help='Für welche Daten ist dieser Tigger gültig ?',tracking=True)
|
||||
triggers = fields.Many2many('dss.triggertypes',string='Enthaltene Trigger',tracking=True)
|
||||
trigger_allgemein = fields.Boolean('Trigger allgemein gültig ?',tracking=True)
|
||||
trigger_cron = fields.Boolean('Triggergruppe für Zeitsteuerung ?',tracking=True)
|
||||
|
||||
@api.model
|
||||
def _default_uuid(self):
|
||||
|
|
@ -33,6 +133,205 @@ class dsstriggergroups(models.Model):
|
|||
|
||||
def _default_create_user(self):
|
||||
return str(self.env.user.name)
|
||||
|
||||
@api.model
|
||||
def run_triggers(self, changes, Dataset, triggers):
|
||||
_logger.info("Trigger in run_triggers ! - start count :"+str(len(triggers)) )
|
||||
for trig in triggers:
|
||||
_logger.info("Trigger in run_triggers - Working on : "+str(trig.id))
|
||||
dochecktrigger = False
|
||||
|
||||
if (changes == False):
|
||||
dochecktrigger = True
|
||||
elif (trig.triggertyp == "COND"):
|
||||
dochecktrigger = True
|
||||
else:
|
||||
if (trig.trigger_field.name in changes):
|
||||
dochecktrigger = True
|
||||
|
||||
if (dochecktrigger):
|
||||
isinintitable = self.env['dss.triggermodel.execute'].search(['&',('trigger','=',trig.id),('data_uuid','=',Dataset.uuid)])
|
||||
dotrigger = False
|
||||
if (not isinintitable) and trig.trigger_init_trigger:
|
||||
_logger.info("Trigger in run_triggers - first run and allowed : "+str(isinintitable)+' -> '+str(trig.trigger_init_trigger)+' -> '+str(trig))
|
||||
dotrigger = True
|
||||
elif (not isinintitable) and ((not trig.trigger_init_trigger) and (not trig.trigger_onlyinit_trigger)):
|
||||
_logger.info("Trigger in run_triggers - first run but not allowed : "+str(isinintitable)+' -> '+str(trig.trigger_init_trigger)+' -> '+str(trig))
|
||||
dotrigger = False
|
||||
elif (isinintitable) and trig.trigger_onlyinit_trigger:
|
||||
_logger.info("Trigger in run_triggers - not first run but only first: "+str(isinintitable)+' -> '+str(trig.trigger_onlyinit_trigger)+' -> '+str(trig))
|
||||
dotrigger = False
|
||||
else:
|
||||
_logger.info("Trigger in run_triggers - not first run but only first: "+str(isinintitable)+' -> '+str(trig))
|
||||
dotrigger = True
|
||||
|
||||
if dotrigger:
|
||||
fieldname = trig.trigger_value_field.name
|
||||
_logger.info("Trigger in run_triggers - checking conditions : "+str(trig.triggertyp)+" field : "+str(fieldname)+' -> '+str(trig.trigger_value_field))
|
||||
if (trig.triggertyp == "FIELD_B"):
|
||||
Wert = Dataset[fieldname]
|
||||
_logger.info("Trigger in run_triggers - Boolean check : "+str(Dataset[fieldname])+" vs "+str(Wert)+' -> '+str(trig.trigger_value_Bool))
|
||||
if trig.trigger_value_Bool:
|
||||
if Wert:
|
||||
_logger.info("Trigger in run_triggers - value true - specific value found : "+str(changes)+" ("+str(Wert)+') -> '+str(trig.trigger_value_Bool))
|
||||
dotrigger = True
|
||||
else:
|
||||
_logger.info("Trigger in run_triggers - value true - specific value not found : "+str(changes)+" ("+str(Wert)+') -> '+str(trig.trigger_value_Bool))
|
||||
dotrigger = False
|
||||
else:
|
||||
if Wert:
|
||||
_logger.info("Trigger in run_triggers - value False - specific value found : "+str(changes)+" ("+str(Wert)+') -> '+str(trig.trigger_value_Bool))
|
||||
dotrigger = False
|
||||
else:
|
||||
_logger.info("Trigger in run_triggers - value False - specific value not found : "+str(changes)+" ("+str(Wert)+') -> '+str(trig.trigger_value_Bool))
|
||||
dotrigger = True
|
||||
elif (trig.triggertyp == "FIELD_S"):
|
||||
#Wert= self.env[trig.trigger_table.model].get(fieldname)
|
||||
WertDB = self.env[trig.trigger_table.model].search([('id', '=', Dataset.id)])
|
||||
field = WertDB._fields[fieldname]
|
||||
field_type = field.type
|
||||
Wert = ""
|
||||
if field_type=="many2one":
|
||||
Wert = str(Dataset[fieldname].id)
|
||||
# Dataset[fieldname].model
|
||||
# SubWertDB = self.env[].search([('id', '=', field.id)])
|
||||
# Wert = SubWertDB.id
|
||||
if field_type=="char":
|
||||
Wert = str(Dataset[fieldname])
|
||||
_logger.info("Trigger in run_triggers - specific value : "+str(changes)+" ("+str(Wert)+') -> '+str(trig.trigger_value)+' - '+str(field)+' / '+str(field_type))
|
||||
if (str(Wert) == str(trig.trigger_value)):
|
||||
_logger.info("Trigger in run_triggers - specific value found : "+str(changes)+" ("+str(Wert)+') -> '+str(trig.trigger_value))
|
||||
dotrigger = True
|
||||
else:
|
||||
_logger.info("Trigger in run_triggers - specific value not found : "+str(changes)+" ("+str(Wert)+') -> '+str(trig.trigger_value))
|
||||
dotrigger = False
|
||||
elif (trig.triggertyp == "FIELD_K"):
|
||||
dotrigger = False
|
||||
elif (trig.triggertyp == "MANUAL"):
|
||||
dotrigger = False
|
||||
elif (trig.triggertyp == "COND"):
|
||||
dotrigger = True
|
||||
|
||||
if trig.trigger_plus_conditions and dotrigger:
|
||||
runtrigger = True
|
||||
for SingleC in trig.trigger_conditions:
|
||||
_logger.info("Trigger in run_triggers - Multible Conditions found "+str(trig.trigger_conditions)+' -> '+str(SingleC)+' -> '+str(runtrigger))
|
||||
runtrigger = SingleC.trigger_CheckCond(Dataset,SingleC) and runtrigger
|
||||
else:
|
||||
runtrigger = dotrigger
|
||||
|
||||
if runtrigger:
|
||||
execds = ''
|
||||
self.trigger_run(trig,Dataset,isinintitable,execds)
|
||||
|
||||
def trigger_run(self,trig,Dataset,isinintitable,execds):
|
||||
for akt in trig.trigger_aktionen:
|
||||
if akt:
|
||||
_logger.info("Trigger in Trigger_run - Aktion "+str(akt))
|
||||
akt.Doexecute(Dataset)
|
||||
execds = execds + ";" +str(Dataset.id)+'/'+str(akt.id)
|
||||
if not isinintitable:
|
||||
# self.env['dss.triggermodel.execute'].create({'trigger':trig.id,'data_uuid':Dataset.uuid,'execdatetime':date.today(),"trigger_action":akt.id})
|
||||
self.env['dss.triggermodel.execute'].create({'trigger':trig.id,'data_uuid':Dataset.uuid,'execdatetime':date.today(),"trigger_table":self.env['ir.model'].search([('model','=',str(akt.trigger_table.model))]).id,"trigger_action":akt.id})
|
||||
# akt._run_action_code_multi(akt._get_eval_context(akt))
|
||||
else:
|
||||
_logger.info("Trigger in Trigger_run - no Aktion in Trigger !")
|
||||
for aktgroup in trig.trigger_aktionen_groups:
|
||||
if aktgroup:
|
||||
for akt in aktgroup:
|
||||
_logger.info("Trigger in Trigger_run - Aktion "+str(akt))
|
||||
akt.Doexecute(Dataset,trig,isinintitable)
|
||||
execds = execds + ";" +str(Dataset.id)+'/'+str(akt.id)
|
||||
|
||||
return execds
|
||||
|
||||
|
||||
def run_cron_triggers(self,triggergroup,triggers):
|
||||
_logger.info("Trigger in run_Cron_Triggers ! - Start für : "+str(self.trigger_table.model))
|
||||
resultstr = "Anz. Trigger : "+str(len(triggers))
|
||||
resultsimplestr = "Anz. Trigger : "+str(len(triggers))
|
||||
triggercnt = 0
|
||||
cntExecDS_init = 0
|
||||
cntExecDS = 0
|
||||
cntExecCont = 0
|
||||
cntExecContTrue = 0
|
||||
cntExecAS = 0
|
||||
dscnt = 0
|
||||
execds = ""
|
||||
for trig in triggers:
|
||||
triggercnt += 1
|
||||
resultstr = resultstr+" Trigger "+str(triggercnt)+' : '
|
||||
if (trig.triggertyp == "FILTER"):
|
||||
lea=trig.trigger_raw_condition.split(',')
|
||||
_logger.info("Trigger in run_Cron_triggers - : Filtered Datasets "+str(lea))
|
||||
AllDataset = self.env[str(triggergroup.trigger_table.model)].search([lea])
|
||||
else:
|
||||
AllDataset = self.env[str(triggergroup.trigger_table.model)].search([])
|
||||
_logger.info("Trigger in run_Cron_triggers - : All Datasets "+str(len(AllDataset)))
|
||||
resultstr = " Count Data : "+str(len(AllDataset))
|
||||
for Dataset in AllDataset:
|
||||
dscnt += 1
|
||||
resultstr = resultstr+" Data "+str(dscnt)+' : '
|
||||
_logger.info("Trigger in run_Cron_triggers - : "+str(Dataset)+" check allready execute : "+str(Dataset.uuid)+" "+str(date.today()))
|
||||
isinintitable = self.env['dss.triggermodel.execute'].search(['&',('trigger','=',trig.id),('data_uuid','=',Dataset.uuid),('execdatetime','=',date.today())])
|
||||
dotrigger = False
|
||||
if (not isinintitable) and trig.trigger_init_trigger:
|
||||
_logger.info("Trigger in run_Cron_triggers - first run and allowed : "+str(isinintitable)+' -> '+str(trig.trigger_init_trigger)+' -> '+str(trig))
|
||||
dotrigger = True
|
||||
elif (not isinintitable) and ((not trig.trigger_init_trigger) and (not trig.trigger_onlyinit_trigger)):
|
||||
_logger.info("Trigger in run_Cron_triggers - first run but not allowed : "+str(isinintitable)+' -> '+str(trig.trigger_init_trigger)+' -> '+str(trig))
|
||||
dotrigger = False
|
||||
elif (isinintitable) and trig.trigger_onlyinit_trigger:
|
||||
_logger.info("Trigger in run_Cron_triggers - not first run but only first (or day): "+str(isinintitable)+' -> '+str(trig.trigger_onlyinit_trigger)+' -> '+str(trig))
|
||||
dotrigger = False
|
||||
else:
|
||||
_logger.info("Trigger in run_Cron_triggers - running no given restrictions : "+str(isinintitable)+' -> '+str(trig))
|
||||
dotrigger = True
|
||||
|
||||
if dotrigger:
|
||||
cntExecDS_init += 1
|
||||
if (trig.triggertyp == "FILTER"):
|
||||
runtrigger = True
|
||||
elif (trig.triggertyp == "COND"):
|
||||
runtrigger = True
|
||||
for SingleC in trig.trigger_conditions:
|
||||
cntExecCont += 1
|
||||
_logger.info("Trigger in run_Cron_triggers - Multible Conditions found "+str(trig.trigger_conditions)+' -> '+str(SingleC)+' -> '+str(runtrigger))
|
||||
conres = SingleC.trigger_CheckCond(Dataset,SingleC)
|
||||
runtrigger = conres and runtrigger
|
||||
if conres:
|
||||
cntExecContTrue += 1
|
||||
else:
|
||||
_logger.info("Trigger Abgebrochen ! in ZeitGruppen sind nur BedingungsTrigger Erlaubt "+str(trig.trigger_aktionen))
|
||||
runtrigger = False
|
||||
|
||||
_logger.info("Trigger in run_Cron_triggers - Conditions result "+str(runtrigger))
|
||||
if runtrigger:
|
||||
cntExecDS += 1
|
||||
_logger.info("Trigger wird Ausgeführt - Aktionen "+str(trig.trigger_aktionen))
|
||||
resultstr = resultstr + " Anz Aktionen : "+str(len(trig.trigger_aktionen))
|
||||
execds = self.trigger_run(trig,Dataset,isinintitable,execds)
|
||||
|
||||
_logger.info("Result :"+resultstr)
|
||||
_logger.info("-------------------------------------- CRON Trigger Result --------------------------------------------------------------------")
|
||||
_logger.info("Result :"+resultsimplestr)
|
||||
_logger.info("Result : Anz. CondChecks : "+str(cntExecDS_init))
|
||||
_logger.info("Result : Anz. Conditions : "+str(cntExecCont))
|
||||
_logger.info("Result : Anz. ConditionsTrue : "+str(cntExecContTrue))
|
||||
_logger.info("Result : Anz. ConditionsFalse : "+str(cntExecCont - cntExecContTrue))
|
||||
_logger.info("Result : Anz. Conditionok : "+str(cntExecDS))
|
||||
_logger.info("Result : Anz. ExecAction : "+str(cntExecAS))
|
||||
_logger.info("Result : Exec Datasets : "+execds)
|
||||
_logger.info("-------------------------------------------------------------------------------------------------------------------------------")
|
||||
|
||||
|
||||
def exectrigger(self):
|
||||
_logger.info("Trigger Sofort Execute !"+str(self))
|
||||
if self.trigger_cron:
|
||||
self.run_cron_triggers(self,self.triggers)
|
||||
else:
|
||||
self.run_triggers(False,False,self.triggers)
|
||||
|
||||
|
||||
|
||||
class dsstriggertypes(models.Model):
|
||||
|
|
@ -47,15 +346,23 @@ class dsstriggertypes(models.Model):
|
|||
user_lastedit = fields.Char('Änderungsuser')
|
||||
|
||||
triggername = fields.Char('Triggername',tracking=True)
|
||||
triggergruppe = fields.Char('Triggergruppe',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)
|
||||
triggertyp = fields.Selection([('FIELD_A','Feldänderung allgemein'),('FIELD_S','Feldänderung spezifisch'),('FIELD_B','Feldänderung BOOL'),('FIELD_K','Feldwert berechnet'),('COND','Bedingungen prüfen'),('MANUAL','Manuell ausgelösst'),('FILTER','Manuell gefiltert')],'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_field = fields.Many2one('ir.model.fields', string="Auslöser Feld",help='Triggerfeldname in der Tabelle - Änderungen an dem Feld lösen den Trigger aus',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_time_opperator = fields.Selection([('TAG','Aktueller Tag'),('TIME','Aktuelle Zeit'),('JAHR','Aktuelles Jahr'),('FIX','Feste Zeit')],'Vergleichswert',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_onlyinit_trigger = fields.Boolean('Ausl. nur bei 1. Änderung ?',help='Soll der Trigger nur beim setzen des 1. Wertes auslösen?',tracking=True)
|
||||
trigger_plus_conditions = fields.Boolean('Zusätz. Bedingungen prüfen',help='Soll der Trigger zusätzlich zur Auslösung Bedingungen prüfen?',tracking=True)
|
||||
trigger_value_field = fields.Many2one('ir.model.fields',string="Vergleichsfeld Feld", help='Prüfungsfeldname in der Tabelle - für dieses Feld wird der Wert geprüft',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)
|
||||
trigger_value_Bool = fields.Boolean('Feldwert für Trigger (Ja/Nein)',tracking=True)
|
||||
trigger_conditions = fields.Many2many('dss.triggerconditions',string='Bedingungen zum auslösen des Triggers',tracking=True)
|
||||
trigger_aktionen = fields.Many2many('dss.triggeractions',string='Aktionen bei auslösen des Triggers',tracking=True)
|
||||
trigger_aktionen_groups = fields.Many2many('dss.triggeractions.groups',string='Aktionsgruppen bei auslösen des Triggers',tracking=True)
|
||||
trigger_raw_condition = fields.Char('Datensatz Auswahl',tracking=True)
|
||||
|
||||
@api.model
|
||||
def _default_uuid(self):
|
||||
|
|
@ -73,25 +380,7 @@ class dsstriggertypes(models.Model):
|
|||
value = getattr(value,part)
|
||||
return value
|
||||
|
||||
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.getfield(self.env[record.trigger_table.model],record.trigger_field.name+'.uuid')
|
||||
val = self.env[record.trigger_table.model]._fields[record.trigger_field.name].string
|
||||
else:
|
||||
val = False
|
||||
record.trigger_old_value = str(val)
|
||||
_logger.info('Trigger Check TR_' + str(record)+' oldValue '+str(record.trigger_old_value)+' newValue '+str(val))
|
||||
_logger.info('Trigger Check TR_' + str(record)+' Ende')
|
||||
def _check_trigger(self,DataRecord):
|
||||
return ""
|
||||
|
||||
class dsstriggeractions(models.Model):
|
||||
|
|
@ -99,25 +388,60 @@ class dsstriggeractions(models.Model):
|
|||
_description = "DigitalSignage Trigger Aktionen"
|
||||
_inherit = ['mail.thread','mail.activity.mixin']
|
||||
_rec_name = "triggeractionname"
|
||||
_order = "triggeractionprio"
|
||||
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')
|
||||
BotText = fields.Html('Ausgabetext')
|
||||
triggeractionprio = fields.Integer('Priorität',tracking=True)
|
||||
Info_Subject = fields.Char('InfoÜberschrift')
|
||||
followaction = fields.Boolean('Folgeaktion vorhanden',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',tracking=True)
|
||||
has_trigger_action_conditions = fields.Boolean('Bedingungen vorhanden',help="Sind Bedingungen vor Ausführung vorhanden?",tracking=True)
|
||||
trigger_conditions = fields.Many2many('dss.triggerconditions',string='Bedingungen zum Ausführen der Aktion',tracking=True)
|
||||
|
||||
trigger_aktionen_active = fields.Boolean('Trigger Aktion aktiv',tracking=True)
|
||||
trigger_table = fields.Many2one('ir.model','Nutzbar in',help='Für welche Daten ist dieser Tigger gültig ?',tracking=True)
|
||||
triggeractionname = fields.Char('Triggeraktionname',tracking=True)
|
||||
triggeractiontyp = fields.Selection([('EMAIL','EMail an senden'),('NOTIZ','Notitz erstellen'),('MESSA','Message an Follower senden'),('CHANNEL','Message an Channel senden'),('ACTIV','Aufgabe erzeugen'),('MARKER','Marker eintragen'),('DSEDIT','Akt. Datensatz ändern'),('TUYA','Tuya Aktion auslössen'),('PRUEF','Wert prüfen')],'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_fix_email = fields.Many2one('res.partner','Empfänger fix',help='Email Emüfänger Adresse für Benachrichtigung/Triggeraktion',tracking=True)
|
||||
email_data_table = fields.Many2one('ir.model','EmailDaten in',help='Für welche Daten ist diese Aktion gültig ?',tracking=True)
|
||||
email_data_field = fields.Many2one('ir.model.fields','Empfänger Feld', help='Feldname in der Tabelle',tracking=True)
|
||||
email_template = fields.Many2one('mail.template','Emailvorlage',tracking=True)
|
||||
|
||||
activity_user = fields.Many2one('res.users','Empfänger der Aufgabe',tracking=True)
|
||||
activity_type = fields.Many2one('mail.activity.type','Art der Aufgabe',tracking=True)
|
||||
activity_date_type = fields.Selection([('TOPLU','Von heute in x Tagen'),('TOFIX','An einem festen Datum'),('TOFIXDB','An einem festen Datum der Datenbank'),('TOPLUDB','An einem festen Datum der Datenbank + x Tage')],tracking=True)
|
||||
activity_date_type_add_days = fields.Integer('x Tage Aufschlag',tracking=True)
|
||||
activity_date_type_fix = fields.Date('Planungsdatum ',tracking=True)
|
||||
activity_text = fields.Text('Inhalt der Aufgabe',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)
|
||||
|
||||
action_table = fields.Many2one('ir.model','Nutzbar in',help='Für welche Daten ist dieser Tigger gültig ?',tracking=True)
|
||||
action_field = fields.Many2one('ir.model.fields', string="Auslöser Feld",help='Triggerfeldname in der Tabelle - Änderungen an dem Feld lösen den Trigger aus',tracking=True)
|
||||
action_test_id = fields.Char('TestID für Triggeraktion',tracking=True)
|
||||
action_value_type = fields.Selection([('FIXT','Fester Wert'),('BOOL','Boolischen Wert'),('DATE','Aktuelles Datum'),('DATX','Aktuelles Datum + X'),('CALC','Berechneter Wert'),('GROS','Aus anderer Quelle')],'Wertart des Eintrags',tracking=True)
|
||||
action_value_fix = fields.Char('Wert zum setzen',tracking=True)
|
||||
action_value_bool = fields.Boolean('Boolwert zum setzen',tracking=True)
|
||||
action_value_fix_plus = fields.Integer('Zuschlag für Berechnung',tracking=True)
|
||||
|
||||
action_value_from_same_table_bool = fields.Boolean('Wert aus akt. Datensatz ?',tracking=True)
|
||||
action_value_from_table = fields.Many2one('ir.model','Daten aus ',help='Aus welcher Datenmenge soll der Wert geholt werden ?',tracking=True)
|
||||
action_value_from_field = fields.Many2one('ir.model.fields','Feld aus ',help='Aus welchem Feld soll der Wert geholt werden ?',tracking=True,domain='[("model_id","=",action_value_from_table)]')
|
||||
|
||||
postChannel = fields.Char('Kanalnummer für Post :',tracking=True)
|
||||
|
||||
follow_action_id = fields.Many2one('dss.triggeractions', string="Nachfolgende Aktion",help='Aktion welche direkt im Anschluss unabhänig des Ablaufs ausgeführt wird',tracking=True)
|
||||
|
||||
insert_marker = fields.Many2one('dss.marker','Marker',help='Welcher Marker soll eingefügt werden ?',tracking=True)
|
||||
|
||||
@api.model
|
||||
def _default_uuid(self):
|
||||
return str(uuid.uuid4())
|
||||
|
|
@ -129,14 +453,222 @@ class dsstriggeractions(models.Model):
|
|||
return str(self.env.user.name)
|
||||
|
||||
|
||||
def Doexecute(self,Dataset):
|
||||
runaction = False
|
||||
if self.has_trigger_action_conditions:
|
||||
runaction = True
|
||||
for SingleC in self.trigger_conditions:
|
||||
_logger.info("Trigger in run_triggers - Multible Conditions found "+str(self.trigger_conditions)+' -> '+str(SingleC)+' -> '+str(runaction))
|
||||
runaction = SingleC.trigger_CheckCond(Dataset,SingleC) and runaction
|
||||
else :
|
||||
runaction=True
|
||||
if runaction:
|
||||
if (self.triggeractiontyp == 'EMAIL'):
|
||||
# mail_pool = self.env['mail.mail']
|
||||
# values={}
|
||||
# values.update({'subject': 'Your subject'})
|
||||
# values.update({'email_to': 'To email'})
|
||||
# values.update({'body_html': 'body' })
|
||||
# values.update({'body': 'body' })
|
||||
# values.update({'res_id': 'obj.id' }) #[optional] here is the record id, where you want to post that email after sending
|
||||
# values.update({'model': ''Object Name }) #[optional] here is the object(like 'project.project') to whose record id you want to post that email after sending
|
||||
# msg_id = mail_pool.create(values)
|
||||
# # And then call send function of the mail.mail,
|
||||
# if msg_id:
|
||||
# mail_pool.send([msg_id])
|
||||
ccmailto = self.email_template.email_cc
|
||||
ccmailto_org = self.email_template.email_cc
|
||||
if not ccmailto:
|
||||
ccmailto=''
|
||||
mailto = ""
|
||||
if self.email_getfrom == "FIX":
|
||||
mailto = ""
|
||||
for partner in self.email_fix_email:
|
||||
mailto = mailto+';'+partner.email
|
||||
_logger.info('Trigger Aktion TRA_' + str(self)+' Sending Email - FIX Empfänger : '+str(self.email_getfrom)+' -> '+str(mailto))
|
||||
elif self.email_getfrom == "DATA":
|
||||
mailto = str(Dataset[self.email_data_field.name])
|
||||
_logger.info('Trigger Aktion TRA_' + str(self)+' Sending Email - DATA Empfänger : '+str(self.email_getfrom)+' -> '+str(mailto))
|
||||
else:
|
||||
mailto = "technik@logumedia.de"
|
||||
_logger.info('Trigger Aktion TRA_' + str(self)+' Sending Email - NONE Empfänger : '+str(self.email_getfrom)+' -> '+str(mailto))
|
||||
if 'contract_writer_mailcc' in self.env[str(self.trigger_table.model)]._fields:
|
||||
mailcc = Dataset["contract_writer_mailcc"]
|
||||
if mailcc:
|
||||
VsPartner = self.env['res.partner'].search([('id','=',Dataset.contract_writer.id)])
|
||||
ccmailto = ccmailto+';'+VsPartner.email
|
||||
_logger.info('Trigger Aktion TRA_' + str(self)+' Sending Email CC Writer - FIX Empfänger : '+str(VsPartner)+' -> '+str(ccmailto)+' + '+str(VsPartner.email))
|
||||
_logger.info('Trigger Aktion TRA_' + str(self)+' Sending Email - Template : '+str(self.email_template)+" Empfänger :"+str(mailto)+'/'+str(ccmailto)+' -> '+str(Dataset))
|
||||
self.email_template.email_to = mailto
|
||||
self.email_template.email_cc = ccmailto
|
||||
self.email_template.send_mail(Dataset.id,force_send=True)
|
||||
self.email_template.email_cc = ccmailto_org
|
||||
elif (self.triggeractiontyp == 'DSEDIT'):
|
||||
_logger.info('Trigger Aktion TRA_' + str(self)+' Setze Wert für DS_'+str(Dataset)+' FLD_'+str(self.action_field.name)+' - Typ : '+str(self.action_value_type)+' -> '+str(self.action_value_bool))
|
||||
EditFeld = Dataset[self.action_field.name]
|
||||
field = Dataset._fields[self.action_field.name]
|
||||
field_type = field.type
|
||||
if (self.action_value_type == 'BOOL'):
|
||||
_logger.info('Trigger Aktion TRA_' + str(self)+' Setze Wert - Typ : '+str(self.action_value_type)+' / '+str(EditFeld)+' -> '+str(self.action_value_bool))
|
||||
EditFeld = Dataset.write({self.action_field.name : self.action_value_bool})
|
||||
if (self.action_value_type == 'DATE'):
|
||||
_logger.info('Trigger Aktion TRA_' + str(self)+' Setze Wert - Typ : '+str(self.action_value_type)+' / '+str(EditFeld)+' -> '+str(date.today()))
|
||||
EditFeld = Dataset.write({self.action_field.name : date.today()})
|
||||
if (self.action_value_type == 'DATX'):
|
||||
_logger.info('Trigger Aktion TRA_' + str(self)+' Setze Wert - Typ : '+str(self.action_value_type)+' / '+str(EditFeld)+' -> '+str(date.today())+' + '+str(self.action_value_fix_plus)+' = '+str(date.today()+ relativedelta(days=self.action_value_fix_plus)))
|
||||
EditFeld = Dataset.write({self.action_field.name : date.today() + relativedelta(days=self.action_value_fix_plus)})
|
||||
if (self.action_value_type == 'FIXT'):
|
||||
_logger.info('Trigger Aktion TRA_' + str(self)+' Setze Wert - Typ : '+str(self.action_value_type)+' / '+str(EditFeld)+' (Type : '+str(field_type)+') -> '+str(self.action_value_fix))
|
||||
if (field_type == "many2one"):
|
||||
Dataset[self.action_field.name] = int(self.action_value_fix)
|
||||
elif (field_type == "date"):
|
||||
Dataset.write({self.action_field.name : self.action_value_fix})
|
||||
else:
|
||||
Dataset.write({self.action_field.name : self.action_value_fix})
|
||||
if (self.action_value_type == 'GROS'):
|
||||
if (self.action_value_from_same_table_bool):
|
||||
Dataset[self.action_field.name] = Dataset[self.action_value_from_field.name]
|
||||
|
||||
elif (self.triggeractiontyp == 'ACTIV'):
|
||||
deadline = datetime.now()
|
||||
if self.activity_date_type == 'TOPLU':
|
||||
deadline = datetime.now()
|
||||
deadline = deadline + relativedelta(days=self.activity_date_type_add_days)
|
||||
elif self.activity_date_type == 'TOFIX':
|
||||
deadline = self.activity_date_type_fix
|
||||
elif self.activity_date_type == 'TOFIXDB':
|
||||
deadline = Dataset[self.action_field.name]
|
||||
elif self.activity_date_type == 'TOPLUDB':
|
||||
deadline = Dataset[self.action_field.name]
|
||||
deadline = deadline + relativedelta(days=self.activity_date_type_add_days)
|
||||
|
||||
if not Dataset:
|
||||
_logger.info('Trigger Aktion TRA_' + str(self)+' Create Task - No Dataset - use Test '+str(self.trigger_table)+' '+str(self.action_test_id))
|
||||
ds = self.env[self.trigger_table.model].search([('id','=',self.action_test_id)])
|
||||
else:
|
||||
ds = Dataset
|
||||
if not self.trigger_table:
|
||||
_logger.info('Trigger Aktion TRA_' + str(self)+' Create Task - No Model '+str(ds)+' '+str(self.trigger_table))
|
||||
else:
|
||||
_logger.info('Trigger Aktion TRA_' + str(self)+' Create Task '+str(self.Info_Subject)+' ('+str(self.activity_user)+') - Model : '+str(self.trigger_table.id)+'/'+str(ds.id)+' '+str(deadline))
|
||||
self.env['mail.activity'].create({
|
||||
'display_name': self.Info_Subject,
|
||||
'summary': self.activity_text,
|
||||
'date_deadline': deadline,
|
||||
'user_id': self.activity_user.id,
|
||||
'res_id': ds.id,
|
||||
'res_model_id': self.trigger_table.id,
|
||||
'activity_type_id': self.activity_type.id
|
||||
})
|
||||
_logger.info('Trigger Aktion TRA_' + str(self)+' Create Task '+str(self.Info_Subject)+' ('+str(self.activity_user)+') - Model : '+str(self.trigger_table.id)+'/'+str(Dataset.id)+' '+str(deadline))
|
||||
elif (self.triggeractiontyp == 'MARKER'):
|
||||
_logger.info('Trigger Aktion TRA_' + str(self)+' Insert Marker '+str(Dataset.marker_list)+' ('+str(self.insert_marker)+') - Model : '+str(self.trigger_table.id)+'/'+str(Dataset.id))
|
||||
Dataset.marker_list = [(4,self.insert_marker.id)]
|
||||
elif (self.triggeractiontyp == 'CHANNEL'):
|
||||
if (not self.BotText): self.BotText=''
|
||||
body = self.BotText + '('+str(self.id)+')'
|
||||
Channel = self.env["mail.channel"].browse(int(self.postChannel))
|
||||
Channel.message_post(body=body,author_id=self.env.ref('base.partner_root').id,subject=self.Info_Subject,message_type="comment",subtype_xmlid="mail.mt_comment")
|
||||
_logger.info('Trigger Aktion TRA_' + str(self)+' Post channel '+str(self.postChannel)+' ('+str(Channel.name)+') - Text : '+str(body))
|
||||
elif (self.triggeractiontyp == 'NOTIZ'):
|
||||
if (not self.BotText): self.BotText=''
|
||||
body = self.BotText + '('+str(self.id)+')'
|
||||
# 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 !'
|
||||
Dataset.message_post(body=body,author_id=self.env.ref('base.partner_root').id,subject=self.Info_Subject)
|
||||
# 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,'subject': akt.Info_Subject,})
|
||||
_logger.info('Trigger Aktion TRA_' + str(self)+' Create notice '+str(self.Info_Subject)+' + Text : '+str(body))
|
||||
elif (self.triggeractiontyp == 'MESSA'):
|
||||
partner_ids = Dataset.message_follower_ids.partner_id.ids
|
||||
if (not self.BotText): self.BotText=''
|
||||
body = self.BotText + '('+str(self.id)+')'
|
||||
#while '{#' in str(body):
|
||||
_logger.info('Trigger Aktion TRA_' + str(self)+' Sende Message '+str(partner_ids)+' + Text : '+str(body))
|
||||
# Dataset.message_post(body=body,author_id=self.env.ref('base.partner_root').id,subject=self.Info_Subject,partner_ids=partner_ids)
|
||||
# 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,'subject': akt.Info_Subject,})
|
||||
|
||||
return True
|
||||
|
||||
def exectriggeraction(self):
|
||||
_logger.info('Trigger Aktion Sofortauslösung TRA_' + str(self)+' '+str(self.trigger_table.model)+' Testid :'+str(self.action_test_id))
|
||||
Dataset = self.env[str(self.trigger_table.model)].search([('id','=',self.action_test_id)], limit=1)
|
||||
self.Doexecute(Dataset)
|
||||
|
||||
|
||||
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)
|
||||
run_trigger = fields.Boolean('Trigger aktiv')
|
||||
run_uni_trigger = fields.Boolean('Allgemeine Trigger aktiv',default=True)
|
||||
run_uni_sub_trigger = fields.Boolean('Allgemeine Trigger (Sub) aktiv',default=True)
|
||||
triggergroup = fields.Many2one('dss.triggergroups',string='Triggergruppe')
|
||||
|
||||
@api.model
|
||||
def _default_uuid(self):
|
||||
return str(uuid.uuid4())
|
||||
|
||||
|
||||
@api.model
|
||||
def trigger_track_template(self, changes, Dataset):
|
||||
_logger.info("Trigger in track_template - "+str(Dataset)+" - Changes : "+str(changes))
|
||||
if Dataset.run_trigger:
|
||||
_logger.info("Trigger in track_template - "+str(Dataset.triggergroup)+" - Changes : "+str(changes))
|
||||
Dataset.triggergroup.run_triggers(changes, Dataset, Dataset.triggergroup.triggers)
|
||||
|
||||
if Dataset.run_uni_trigger:
|
||||
_logger.info("Trigger in track_template - UNIVERSAL - Suche Triggergruppen : id :"+str(Dataset._name))
|
||||
triggergroups = self.env['dss.triggergroups'].search([('trigger_table','=',Dataset._name),('trigger_allgemein','=',True)])
|
||||
_logger.info("Trigger in track_template - UNIVERSAL - Triggergruppen gefunden : "+str(triggergroups))
|
||||
for trig in triggergroups:
|
||||
trig.run_triggers(changes, Dataset, trig.triggers)
|
||||
|
||||
|
||||
class dsstriggeractiongroupss(models.Model):
|
||||
_name = "dss.triggeractions.groups"
|
||||
_description = "DigitalSignage Trigger Aktionen Gruppen"
|
||||
_inherit = ['mail.thread','mail.activity.mixin']
|
||||
_rec_name = "triggeractiongroupname"
|
||||
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')
|
||||
triggeractiongroupname = fields.Char('Triggeraktion Gruppenname',tracking=True)
|
||||
trigger_list = fields.Many2many('dss.triggeractions',string='Enthaltene Trigger',help='Welche Trigger sollen ausgeführt werden ?',tracking=True)
|
||||
action_test_id = fields.Char('TestID für Triggeraktion',tracking=True)
|
||||
trigger_table = fields.Many2one('ir.model','Nutzbar in',help='Für welche Daten ist dieser Tigger gültig ?',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 Doexecute(self,Dataset,trig,isinintitable):
|
||||
for akt in self.trigger_list:
|
||||
_logger.info("Trigger in ExecTrigger_Group - Aktion "+str(akt))
|
||||
akt.Doexecute(Dataset)
|
||||
if not isinintitable:
|
||||
self.env['dss.triggermodel.execute'].create({'trigger':trig.id,'data_uuid':Dataset.uuid,'execdatetime':date.today(),"trigger_table":self.env['ir.model'].search([('model','=',str(akt.trigger_table.model))]).id,"trigger_action":akt.id})
|
||||
else:
|
||||
_logger.info("Trigger in Trigger_group_run - no Aktion in Trigger !")
|
||||
|
||||
|
||||
def DoexecuteGroup(self,Dataset):
|
||||
for akt in self.trigger_list:
|
||||
_logger.info("Trigger in ExecTrigger_Group - Aktion "+str(akt))
|
||||
akt.Doexecute(Dataset)
|
||||
|
||||
|
||||
def exectriggeraction_group(self):
|
||||
_logger.info('Trigger Aktion Sofortauslösung TRA_G' + str(self)+' '+str(self.trigger_table.model)+' Testid :'+str(self.action_test_id))
|
||||
Dataset = self.env[str(self.trigger_table.model)].search([('id','=',self.action_test_id)], limit=1)
|
||||
self.DoexecuteGroup(Dataset)
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,34 @@
|
|||
import uuid
|
||||
import logging
|
||||
import datetime
|
||||
|
||||
from odoo import api, fields, models, _
|
||||
from odoo import tools
|
||||
from datetime import datetime
|
||||
from datetime import date
|
||||
from odoo.exceptions import ValidationError
|
||||
import sys
|
||||
|
||||
_logger = logging.getLogger(__name__)
|
||||
|
||||
class dsstriggerexecuted(models.Model):
|
||||
_name = "dss.triggermodel.execute"
|
||||
_description = "DigitalSignage Trigger Execution list"
|
||||
_rec_name = "uuid"
|
||||
uuid = fields.Char(default=lambda self: self._default_uuid(), required=True, readonly=True, copy=False, string='UUID')
|
||||
trigger = fields.Many2one('dss.triggertypes')
|
||||
data_uuid = fields.Char('Datensatz')
|
||||
trigger_table = fields.Many2one('ir.model','Model')
|
||||
trigger_action = fields.Many2one('dss.triggeractions','Aktion')
|
||||
execdatetime = fields.Datetime('Ausfuerhungszeit',default=lambda self: self._default_create_date())
|
||||
trigger_user = fields.Char('Erstellungsuser',default=lambda self: self._default_create_user())
|
||||
|
||||
@api.model
|
||||
def _default_uuid(self):
|
||||
return str(uuid.uuid4())
|
||||
|
||||
def _default_create_date(self):
|
||||
return datetime.now()
|
||||
|
||||
def _default_create_user(self):
|
||||
return str(self.env.user.name)
|
||||
|
|
@ -0,0 +1,308 @@
|
|||
# -*- 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 . import dss_ads
|
||||
from odoo.exceptions import ValidationError
|
||||
from datetime import date
|
||||
from datetime import datetime
|
||||
from babel.dates import format_date
|
||||
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 dsscontracts(models.Model):
|
||||
|
||||
_name = "dss.web_contracts"
|
||||
_description = "DigitalSignage Web_Vertraege"
|
||||
_rec_name = "contract_auto_name"
|
||||
_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)
|
||||
contract_auto_id = fields.Char("Kundennummer automatisch",tracking=True,help="Wird berechnet aus Projektnummer + Kunden ID")
|
||||
contract_name = fields.Char('Kurzbezeichnung', required=True,tracking=True)
|
||||
contract_auto_name = fields.Char('Vertragskennung',tracking=True,help="Wird berechnet aus Kundennummer + Vertragskennung")
|
||||
|
||||
contract_writer = fields.Many2one('res.partner', domain="['&',('dsspartner','=',True),('dsspartner_vertrieb','=',True)]", tracking=True)
|
||||
contract_writer_formular = fields.Char('Vertragsschreiber Formular', tracking=True)
|
||||
contract_type = fields.Selection([('TV','TV'),('Web','Web')], 'Vertragstyp', tracking=True)
|
||||
|
||||
remark = fields.Char('Bemerkungen',tracking=True)
|
||||
|
||||
vertragssumme = fields.Float('Vertragssumme :', tracking=True)
|
||||
|
||||
contract_remark = fields.Html('Vertragshinweise',tracking=True)
|
||||
|
||||
project = fields.Many2one('dss.projects' , string='Project', store=True,tracking=True)
|
||||
project_id = fields.Integer(related='project.projectid', string='Project ID')
|
||||
projectIid = fields.Integer('Project IID',tracking=True)
|
||||
|
||||
client_id = fields.Char(string="KundenID (2Stellen)",help="Nur der 2 stellige letzte Teil der Kundennummer",tracking=True)
|
||||
client_short_company = fields.Char('Firmenname Kunde',tracking=True)
|
||||
client_short_vorname = fields.Char('Vorname Kunde',tracking=True)
|
||||
client_short_name = fields.Char('Name Kunde',tracking=True)
|
||||
client_short_strasse = fields.Char('Strasse Kunde',tracking=True)
|
||||
client_short_plz = fields.Char('PLZ Kunde',tracking=True)
|
||||
client_short_ort = fields.Char('Ort Kunde',tracking=True)
|
||||
client_short_land = fields.Many2one('res.country','Land Kunde',tracking=True)
|
||||
client_short_email = fields.Char('Email Kunde',tracking=True)
|
||||
client_short_telefon = fields.Char('Telefon Kunde',tracking=True)
|
||||
client_short_mobil = fields.Char('Mobilfunk Kunde',tracking=True)
|
||||
client_short_website = fields.Char('Webseite Kunde',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_other_projects = fields.Many2many('dss.projects',string='Weitere Projekte',tracking=True)
|
||||
|
||||
werbe_feld = fields.Char(string='Werbefelde(r)',tracking=True)
|
||||
werbe_feld_selected = fields.Many2many('dss.advertisefields',string='Werbefelder',tracking=True)
|
||||
werbe_feld_tv = fields.Selection([('L-Banner','L-Banner'),('Countdown','Countdown')], 'Paket', tracking=True)
|
||||
werbe_feld_web = fields.Selection([('Standard','Standard'),('Premium','Premium')], 'Paket', tracking=True)
|
||||
zahlweise = fields.Selection([('einmalig','einmalig'),('jaehrlich','jährlich'),('sonder','Sonderzahlweise')], 'Zahlweise', tracking=True)
|
||||
|
||||
main_runtime = fields.Integer('Gesamtcliplänge',tracking=True)
|
||||
split_runtime_count = fields.Integer('Clip Teilungen',tracking=True)
|
||||
split_runtime_time = fields.Integer('Cliplänge Sekunden',tracking=True)
|
||||
|
||||
contract_date = fields.Date('Vertragsdatum',tracking=True)
|
||||
contract_cancel_date = fields.Date('Kündigungsfrist Datum', tracking=True)
|
||||
|
||||
contract_cancel_mon = fields.Integer('Kündigungsfrist Monaten',tracking=True)
|
||||
|
||||
contract_auto_extend = fields.Boolean('autom. V.Verlängerung',tracking=True)
|
||||
contract_auto_extend_time = fields.Char('Verl. Monate',tracking=True)
|
||||
|
||||
runtimesystem = fields.Selection([('J','Jahreslaufzeit'),('M','Monatslaufzeit'),('T','Tagelaufzeit'), ('E','Eventlaufzeit'), ('S','Sonderlaufzeit')],'Laufzeit',tracking=True)
|
||||
runtime_j = fields.Integer('Laufzeit Jahre',tracking=True)
|
||||
runtime_m = fields.Integer('Laufzeit Monate',tracking=True)
|
||||
runtime_bonus_m = fields.Integer('zusätzl. Laufzeit Monate',tracking=True)
|
||||
runtime_t = fields.Integer('Laufzeit Tage',tracking=True)
|
||||
runtime_bonus_t = fields.Integer('zusätzl. Laufzeit Tage',tracking=True)
|
||||
runtime_events = fields.Many2many('dss.eventdays',tracking=True)
|
||||
runtime_bonus_e = fields.Integer('zusätzl. Events',tracking=True)
|
||||
runtime_divers = fields.Char('Laufzeit Spezial',tracking=True)
|
||||
runtime_finish = fields.Date('LaufzeitEnde',tracking=True)
|
||||
runtime_calendar_event = fields.Integer('Kalendereintrag ID',tracking=True)
|
||||
|
||||
date_start_planed = fields.Date(string='geplantes Startdatum', tracking=True)
|
||||
date_remove_planed = fields.Date(string='geplantes Enddatum', tracking=True)
|
||||
|
||||
tv_reach_PLZ = fields.Char('Reichweite PLZ',tracking=True)
|
||||
ads_radius_PLZ = fields.Integer('Umkreis PLZ in Km',tracking=True)
|
||||
ads_count_perYear = fields.Selection([('30000','30.000'),('60000','60.000'),('120000','120.000'),('1000000','1.000.000')],'Einblendungen',tracking=True)
|
||||
# ads_count_perYear_related = fields.Selection(related='dss.contracts.ads_count_perYear',tracking=True)
|
||||
ads_topic = fields.Selection([('auto','Auto'),('beauty','Beauty & Fashion'),('wirtschaft','Wirtschaft, Finanzen & News'),('food','Food'),('gesundheit','Gesundheit'),('lifestyle','Lifestyle'),('living','Living'),('entertainment','Entertainment'),('reise','Reise'),('technik','Technik'),('individuell','Individuell')],'Themen', tracking=True)
|
||||
ads_topics = fields.Many2many('dss.contracts_ads_topics', string='Themenliste', tracking=True)
|
||||
grafik_zuarbeitBis = fields.Date("Zuarbeit bis", tracking=True)
|
||||
grafikerstellung = fields.Boolean("Grafikerstellung Logumedia", tracking=True)
|
||||
|
||||
scan_vertrag = fields.Binary('Datei')
|
||||
file_name = fields.Char(string='Dateiname')
|
||||
|
||||
erfasst_in_odoo = fields.Boolean('In Odoo erfasst')
|
||||
erfasst_in_agenda = fields.Boolean('In Agenda erfasst')
|
||||
rechnungsanfrage_RTL = fields.Boolean('Bei RTL angekündigt')
|
||||
|
||||
# def action_send_email(self):
|
||||
# """ Sendet eine E-Mail mit den Inhalten des Objekts """
|
||||
# template = self.env.ref('dss.email_template_my_model')
|
||||
# if template:
|
||||
# template.send_mail(self.id, force_send=True)
|
||||
|
||||
def pydonewpartner1(self):
|
||||
_logger.info("create new partner...")
|
||||
|
||||
def pydonewpartner(self):
|
||||
_logger.info("create new partner...")
|
||||
fullname = str(self.client_short_vorname) + ' ' +str(self.client_short_name)
|
||||
newcontact = self.env['res.partner'].create({'name': fullname,
|
||||
'email': self.client_short_email,
|
||||
'phone': self.client_short_telefon,
|
||||
'mobile': self.client_short_mobil,
|
||||
'street': self.client_short_strasse,
|
||||
'city': self.client_short_ort,
|
||||
'zip': self.client_short_plz,
|
||||
'country_id': self.env['res.country'].search([('code', '=', 'DE')], limit=1).id,
|
||||
'company_type': 'person', # 'company' oder 'person',
|
||||
'website': self.client_short_website,
|
||||
'commercial_company_name': self.client_short_company,
|
||||
'dsspartner': True,
|
||||
'dsspartner_werbung': True
|
||||
})
|
||||
self.client = newcontact.id
|
||||
|
||||
|
||||
def pydonewcontract(self):
|
||||
_logger.info("create new contract...")
|
||||
newcontract = self.env['dss.contracts'].create({'project_id': self.project_id,
|
||||
'project': self.project.id,
|
||||
'client_id': self.client_id,
|
||||
'contract_auto_name': self.contract_auto_name,
|
||||
'contract_auto_id': self.contract_auto_id,
|
||||
'contract_name': self.contract_name,
|
||||
'contract_state': self.env['dss.contractstate'].search([("statusname","=","Angelegt")]).id,
|
||||
'werbe_feld_selected': self.werbe_feld_selected,
|
||||
'client': self.client.id,
|
||||
'client_short_vorname': self.client_short_vorname,
|
||||
'client_short_email': self.client_short_email,
|
||||
'client_short_telefon': self.client_short_telefon,
|
||||
'client_short_mobil': self.client_short_mobil,
|
||||
'client_short_strasse': self.client_short_strasse,
|
||||
'client_short_ort': self.client_short_ort,
|
||||
'client_short_plz': self.client_short_plz,
|
||||
'client_short_website': self.client_short_website,
|
||||
'client_short_company': self.client_short_company,
|
||||
'ads_count_perYear': self.ads_count_perYear,
|
||||
'runtimesystem': self.runtimesystem,
|
||||
'runtime_m': self.runtime_m,
|
||||
'runtime_t': self.runtime_t,
|
||||
'contract_auto_extend': self.contract_auto_extend,
|
||||
'contract_cancel_date': self.contract_cancel_date,
|
||||
'runtime_events': self.runtime_events,
|
||||
'tv_reach_PLZ': self.tv_reach_PLZ,
|
||||
'ads_radius_PLZ': self.ads_radius_PLZ,
|
||||
'ads_topics': self.ads_topics,
|
||||
'contract_auto_extend': self.contract_auto_extend,
|
||||
'contract_date': self.contract_date,
|
||||
'scan_vertrag': self.scan_vertrag
|
||||
})
|
||||
_logger.info("create new Werbekampagne...")
|
||||
newWK = self.env['dss.ads'].create({'contract': newcontract.id,
|
||||
'project': newcontract.project.id,
|
||||
'adname': 'WK '+self.contract_auto_name,
|
||||
'adtype': 'MAIN',
|
||||
'date_start_planed': self.date_start_planed,
|
||||
'date_remove_planed': self.date_remove_planed,
|
||||
#'work_state_info': 'ZA bis: '+str(self.grafik_zuarbeitBis)+' / '+self.remark
|
||||
'work_state_info': 'ZA bis: '+format_date(self.grafik_zuarbeitBis,format='dd.MM.yy',locale='de_DE')+' / '+self.remark
|
||||
})
|
||||
self.erfasst_in_odoo = True
|
||||
|
||||
def pysendemail_rtl(self):
|
||||
"""Sendet eine E-Mail über das Template"""
|
||||
myAction = self.env['dss.triggeractions.groups'].search([('id','=',self.env['dss.settings'].search([], limit=1).tv_vertragsankuendigung_actionID)], limit=1) #Id der TriggerAktion
|
||||
myAction.action_test_id = self.id #Id des Datensatzes für den die Mail ist
|
||||
myAction.exectriggeraction_group()
|
||||
"""
|
||||
template = self.env['mail.template'].search([('id','=',44)], limit=1)
|
||||
if template:
|
||||
template.send_mail(self.id, force_send=True)
|
||||
self.rechnungsanfrage_RTL = True
|
||||
email_body = template._render_field('body_html', [self.id])[self.id] # HTML-Body rendern
|
||||
email_subject = template._render_field('subject', [self.id])[self.id] # Betreff rendern
|
||||
email_to = template._render_field('email_to', [self.id])[self.id] # Empfänger rendern
|
||||
self.message_post(body=f"<b>Betreff:</b> {email_subject}<br/><b>Empfänger:</b> {email_to}<br/><br/>{email_body}",subject="E-Mail gesendet",message_type='comment',subtype_xmlid="mail.mt_comment")
|
||||
"""
|
||||
@api.model
|
||||
def _default_uuid(self):
|
||||
return str(uuid.uuid4())
|
||||
|
||||
|
||||
#Vertragskennungen bei onChange anpassen
|
||||
@api.onchange('client_id')
|
||||
def _onchange_client_id(self):
|
||||
for record in self :
|
||||
if record.contract_name == '' :
|
||||
cname = 'unbekannter Kunden'
|
||||
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)
|
||||
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))
|
||||
self.contract_auto_name = resstr
|
||||
self.contract_auto_id = cidstr
|
||||
|
||||
@api.onchange('project_id')
|
||||
def _onchange_project_id(self):
|
||||
for record in self :
|
||||
if record.contract_name == '' :
|
||||
cname = 'unbekannter Kunden'
|
||||
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)
|
||||
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))
|
||||
self.contract_auto_name = resstr
|
||||
self.contract_auto_id = cidstr
|
||||
|
||||
# @api.onchange('project')
|
||||
# def _onchange_project(self):
|
||||
# self.project_id = self.project.project_id
|
||||
|
||||
@api.onchange('contract_name')
|
||||
def _onchange_contract_name(self):
|
||||
for record in self :
|
||||
if record.contract_name == '' :
|
||||
cname = 'unbekannter Kunden'
|
||||
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)
|
||||
if resstr is None :
|
||||
resstr = 'nicht ermittelbar'
|
||||
_logger.info('Contract_Name_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
|
||||
|
||||
@api.onchange('contract_auto_id')
|
||||
def _onchange_contract_auto_id(self):
|
||||
for record in self :
|
||||
if record.contract_name == '' :
|
||||
cname = 'unbekannter Kunden'
|
||||
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)
|
||||
if resstr is None:
|
||||
resstr = 'nicht ermittelbar'
|
||||
_logger.info('Contract_auto_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
|
||||
|
||||
|
||||
|
||||
class dsscontractsadstopics(models.Model):
|
||||
_name = 'dss.contracts_ads_topics'
|
||||
_description = "DigitalSignage Werbung ATV Themen"
|
||||
_rec_name = "anzeigename"
|
||||
_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')
|
||||
|
||||
thema = fields.Char(string="Name")
|
||||
anzeigename = fields.Char(string='Anzeigename')
|
||||
|
|
@ -21,11 +21,24 @@ digitalsignage_dss_mediarelations_group_user,access.dss.mediarelations,model_dss
|
|||
digitalsignage_dss_advertisefields_group_user,access.dss.advertisefields,model_dss_advertisefields,base.group_user,1,1,1,1
|
||||
digitalsignage_dss_import_group_user,access.dss.import,model_dss_import,base.group_user,1,1,1,1
|
||||
digitalsignage_dss_settings_group_user,access.dss.settings,model_dss_settings,base.group_user,1,1,1,1
|
||||
digitalsignage_dss_viewsettings_group_user,access.dss.viewsettings,model_dss_viewsettings,base.group_user,1,1,1,1
|
||||
digitalsignage_dss_screendesign_group_user,access.dss.screendesign,model_dss_screendesign,base.group_user,1,1,1,1
|
||||
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_triggerexecute_group_user,access.dss.triggermodel.execute,model_dss_triggermodel_execute,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
|
||||
digitalsignage_dss_payintervals_group_user,access.dss.payintervals,model_dss_payintervals,base.group_user,1,1,1,1
|
||||
digitalsignage_dss_importinvoicelist_group_user,access.dss.importinvoicelist,model_dss_importinvoicelist,base.group_user,1,1,1,1
|
||||
digitalsignage_dss_web_contracts_group_user,access.dss_web_contracts,model_dss_web_contracts,base.group_user,1,1,1,1
|
||||
digitalsignage_dss_contracts_ads_topics_group_user,access.dss_contracts_ads_topics,model_dss_contracts_ads_topics,base.group_user,1,1,1,1
|
||||
digitalsignage_dss_triggerconditions_group_user,access.dss.triggerconditions,model_dss_triggerconditions,base.group_user,1,1,1,1
|
||||
digitalsignage_dss_marker_group_user,access.dss.marker,model_dss_marker,base.group_user,1,1,1,1
|
||||
digitalsignage_dss_triggeractions_groups_user,access.dss.triggeractions.groups,model_dss_triggeractions_groups,base.group_user,1,1,1,1
|
||||
DigitalSignage_dss_triggervalues,access.dss.triggervalues,DigitalSignage.model_dss_triggervalues,base.group_user,1,0,0,0
|
||||
DigitalSignage_dss_statesave,access.dss.statesave,DigitalSignage.model_dss_statesave,base.group_user,1,0,0,0
|
||||
DigitalSignage_dss_activity_mixin,access.dss.activity_mixin,DigitalSignage.model_dss_activity_mixin,base.group_user,1,0,0,0
|
||||
DigitalSignage_dss_triggermodel,access.dss.triggermodel,DigitalSignage.model_dss_triggermodel,base.group_user,1,0,0,0
|
||||
DigitalSignage_dss_invoices,access.dss.invoices,DigitalSignage.model_dss_invoices,base.group_user,1,1,1,1
|
||||
|
|
|
|||
|
|
After Width: | Height: | Size: 832 KiB |
|
After Width: | Height: | Size: 338 KiB |
|
After Width: | Height: | Size: 350 KiB |
|
After Width: | Height: | Size: 174 KiB |
|
After Width: | Height: | Size: 524 KiB |
|
After Width: | Height: | Size: 205 KiB |
|
After Width: | Height: | Size: 239 KiB |
|
After Width: | Height: | Size: 658 KiB |
|
After Width: | Height: | Size: 440 KiB |
|
After Width: | Height: | Size: 687 KiB |
|
After Width: | Height: | Size: 210 KiB |
|
After Width: | Height: | Size: 797 KiB |
|
After Width: | Height: | Size: 876 KiB |
|
After Width: | Height: | Size: 1.0 MiB |
|
After Width: | Height: | Size: 409 KiB |
|
After Width: | Height: | Size: 498 KiB |
|
After Width: | Height: | Size: 2.4 MiB |
|
After Width: | Height: | Size: 386 KiB |
|
After Width: | Height: | Size: 399 KiB |
|
After Width: | Height: | Size: 465 KiB |
|
After Width: | Height: | Size: 428 KiB |
|
After Width: | Height: | Size: 388 KiB |
|
After Width: | Height: | Size: 529 KiB |
|
After Width: | Height: | Size: 424 KiB |
|
After Width: | Height: | Size: 529 KiB |
|
After Width: | Height: | Size: 309 KiB |
|
After Width: | Height: | Size: 298 KiB |
|
After Width: | Height: | Size: 353 KiB |
|
After Width: | Height: | Size: 308 KiB |
|
After Width: | Height: | Size: 322 KiB |
|
After Width: | Height: | Size: 635 KiB |
|
After Width: | Height: | Size: 813 KiB |
|
After Width: | Height: | Size: 913 KiB |
|
After Width: | Height: | Size: 700 KiB |
|
After Width: | Height: | Size: 550 KiB |
|
After Width: | Height: | Size: 436 KiB |
|
After Width: | Height: | Size: 348 KiB |
|
After Width: | Height: | Size: 462 KiB |
|
After Width: | Height: | Size: 756 KiB |
|
After Width: | Height: | Size: 420 KiB |
|
After Width: | Height: | Size: 924 KiB |
|
After Width: | Height: | Size: 472 KiB |
|
After Width: | Height: | Size: 498 KiB |
|
After Width: | Height: | Size: 521 KiB |
|
After Width: | Height: | Size: 419 KiB |
|
After Width: | Height: | Size: 559 KiB |
|
After Width: | Height: | Size: 1.5 MiB |
|
After Width: | Height: | Size: 461 KiB |
|
After Width: | Height: | Size: 363 KiB |