# -*- coding: utf-8 -*- import ast import json import re import uuid import logging from odoo import api, fields, models, _ from odoo.exceptions import ValidationError _logger = logging.getLogger(__name__) class dsscontracts(models.Model): @api.model def _get_default_project(self): _logger.debug("Ermittelte Id aus Context : %s" % (self.env.context.get('active_id'))) ds = self.env('dss.projects').search([('id','=',self.env.context.get('active_id'))],limit=1) return ds 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 _name = "dss.contracts" _description = "DigitalSignage Vertraege" _rec_name = "contract_auto_name" _inherit = ['mail.thread'] uuid = fields.Char(default=lambda self: self._default_uuid(), required=True, readonly=True, copy=False, string='UUID') contract_id = fields.Char("Kundennummer",store=True) contract_name = fields.Char('Kurzbezeichnung', required=True) contract_state = fields.Many2one('dss.contractstate',group_expand='_read_group_stage_ids') contract_state_order = fields.Integer(related='contract_state.order',store=True) contract_auto_id = fields.Char("Kundennummer") contract_auto_name = fields.Char('Vertragskennug') project = fields.Many2one('dss.projects' , string='Project', store=True) project_id = fields.Integer(related='project.projectid', string='Project ID') projectIid = fields.Integer('Project IID') client = fields.Many2one('res.partner',domain="['&',('dsspartner','=',True),('dsspartner_werbung','=',True)]") client_id = fields.Char("Kundenid") client_uuid = fields.Char(related="client.dss_uuid") parent_id = fields.Many2one('dss.contracts', string='Parent Task', index=True) client_short_company = fields.Char('Firmenname Kunde') client_short_vorname = fields.Char('Vorname Kunde') client_short_name = fields.Char('Name Kunde') client_short_strasse = fields.Char('Strasse Kunde') client_short_plz = fields.Char('PLZ Kunde') client_short_ort = fields.Char('Ort Kunde') client_short_land = fields.Many2one('res.country','Land Kunde') client_short_email = fields.Char('Email Kunde') client_short_telefon = fields.Char('Telefon Kunde') client_short_mobil = fields.Char('Mobilfunk Kunde') client_short_website = fields.Char('Webseite Kunde') client_other_projects = fields.Many2many('dss.projects',string='Weitere Projekte') werbe_feld_selected = fields.Many2many('dss.advertisefields',string='Werbefelder') main_runtime = fields.Integer('Gesamtlaufzeit') split_runtime_count = fields.Integer('Laufzeit Teilungen') split_runtime_time = fields.Integer('Laufzeit Sekunden') contract_date = fields.Date('Vertragsdatum') start_date = fields.Date('Ausstrahlungsdatum') runtimesystem = fields.Selection([('M','Monatslaufzeit'),('T','Tagelaufzeit'), ('E','Eventlaufzeit'), ('S','Sonderlaufzeit')]) runtime_m = fields.Integer('Laufzeit') runtime_t = fields.Integer('Laufzeit') runtime_events = fields.Many2many('dss.eventdays') runtime_divers = fields.Char('Laufzeit') info_account_changes = fields.Boolean('Benarichtigen bei Accountänderungen') info_spot_changes = fields.Boolean('Benarichtigen bei Spotänderungen') info_contract_changes = fields.Boolean('Benarichtigen bei Vertragsänderungen') info_partner_changes = fields.Boolean('Benarichtigen bei Partneränderungen') info_partner = fields.Many2one('res.partner','Benarichtigung an : ') work_state = fields.Many2one('dss.workstate',default=_default_work_state) work_state_color = fields.Char(related='work_state.color') work_state_text = fields.Char(related='work_state.statusname') work_state_info = fields.Char('Zusatzinfo') todo_state = fields.Many2one('dss.todostate',default=_default_todo_state) todo_state_color = fields.Char(related='todo_state.color') todo_state_text = fields.Char(related='todo_state.statusname') todo_state_info = fields.Char('Zusatzinfo') todo_state_until = fields.Date('Abarbeiten bis') @api.constrains('client_id') def _check_client_id(self) : for record in self : if len(record.client_id) != 2 : _logger.debug("Kundenid muss 2 Stellen haben %s" % (record.client_id)) raise ValidationError(_("KundenID muss 2 Stellen haben")) @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.debug(resstr) 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.debug(resstr) self.contract_auto_name = resstr self.contract_auto_id = cidstr @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) if resstr is None : resstr = 'nicht ermittelbar' _logger.debug(resstr) self.contract_auto_name = resstr # @api.model # def create(self,vals): # vals['projectid'] = self.env.context.get('active_id') # project = self.env('dss.projects').search(['id','=',vals['projectid']]) # vals['project'] = project('projektname'); # contract=super().create(vals) # return contract @api.model def _default_uuid(self): return str(uuid.uuid4()) def _getdefwscolor(self): return str('#ffffff') @api.model def _default_client_id(self): return str("00") @api.model def _read_group_stage_ids(self,stages,domain,order): contract_state_ids = self.env['dss.contractstate'].search([],order='order') return contract_state_ids @api.model def pyaction_dss_contract_make_partner(self): action = self.env['ir.actions.act_window'].with_context({'default_contractid': self.id})._for_xml_id('DigitalSignage.act_dss_project_view_contract') 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 action @api.model def pyaction_view_contract(self): action = self.env['ir.actions.act_window'].with_context({'default_contractid': self.id})._for_xml_id('DigitalSignage.act_dss_project_view_contract') 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 action def pyaction_new_contract_kanban(self): action = self.env['ir.actions.act_window'].with_context({'default_contractid': self.id})._for_xml_id('DigitalSignage.action_dss_project_new_contract_kanban') 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 action def pyaction_dss_project_make_contract(self): action = self.env['ir.actions.act_window'].with_context({'default_projectid': self.id})._for_xml_id('DigitalSignage.action_dss_project_view_contract') return action class dssmain(models.Model): _name = "dss.projects" _description = "DigitalSignage Projekte" _rec_name = "projektname" _inherit = ['mail.thread'] 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') color = fields.Integer('Color Index') active = fields.Boolean('Active', default=True) name = fields.Char('Interner Name', required=True) aktstatus = fields.Many2one('dss.projectstate',string='Aktueller Status:') aktstatus_color = fields.Integer(related='aktstatus.color') aktstatus_icon = fields.Image(related='aktstatus.icon') description = fields.Text('Beschreibung') systemname = fields.Many2one('dss.systems') grundsystemname = fields.Many2one('dss.systemtypen') grundsystemicon = fields.Image(related='grundsystemname.icon') grundsystemicon5050 = fields.Image(related='grundsystemname.icon_5050') vertragsschreiber = fields.Many2one('res.partner',domain="['&',('dsspartner','=',True),('dsspartner_vertrieb','=',True)]") standortpartner = fields.Many2one('res.partner',domain="['&',('dsspartner','=',True),('dsspartner_standort','=',True)]") vertriebspartner = fields.Many2many('res.partner',domain="['&',('dsspartner','=',True),('dsspartner_vertrieb','=',True)]") zeiten_on = fields.Datetime('Einschaltzeit') zeiten_off = fields.Datetime('Ausschaltzeit') errichtet_am = fields.Datetime('Errichtungstag') standort_inout = fields.Selection([('indoor','im Gebäude'), ('outdoor','Aussenbereich'), ('semiindoor','Überdachter Aussenbereich'),('Divers','Andere Art')]); @api.model def _default_uuid(self): return str(uuid.uuid4()) def pyaction_view_contracts(self): action = self.env['ir.actions.act_window'].with_context({'default_project': self.id})._for_xml_id('DigitalSignage.action_dss_project_contracts') action['display_name'] = self.projektname context = action['context'].replace('active_id', str(self.id)) # context = ast.literal_eval(context) # context = "{ # 'create': self.active, # 'active_test': self.active # } action['context'] = context return action class dssgeraetetypen(models.Model): _name = "dss.geraetetypen" _description = "DigitalSignage Geraetetypen" _inherit = ['mail.thread'] _rec_name = "geraetename" geraetename = fields.Char('Geraetename', required=True) uuid = fields.Char(default=lambda self: self._default_uuid(), required=True, readonly=True, copy=False, string='UUID') geraetetyp = fields.Selection([('SYS','Systemgerät'), ('STE','Steuergerät'), ('DIV','Anderes'), ('ANZ','Anzeigegerät'), ('PLY','Abspielgerät')]) grundsystem = fields.Many2one('dss.systemtypen', string="Gerät ist nutzbar für") grundsystem_kennung = fields.Char(string='Kennung', related='grundsystem.kennung') farbe = fields.Char('Grundfarbe') has_heizung = fields.Boolean('Mit Heizsystem') has_klima = fields.Boolean('Mit Klimasystem') has_fan = fields.Boolean('Mit Ventiltorensystem') stromzaehler = fields.Many2one('dss.geraetetypen') stromverbrauch_avg = fields.Integer('Stromverbrauch AVG in W') osvorhanden = fields.Boolean('Mit Betriebssystem') osname = fields.Char('Betriebssystem') ostyp = fields.Selection([('Win','Windows'), ('Lin','Linux'), ('And','Android'),('Ras','Raspberry PI'),('Non','Keines bekannt'),('Div','Anderes')]); lcd_ausrichtung = fields.Selection([('quer','Horizontal/Querformat'), ('hoch','Vertikal/Hochformat'),('Divers','Andere Art')],'LCD Ausrichtung'); lcd_touch = fields.Boolean('Touchsystem') lcd_montage = fields.Selection([('WAN','Wandmontage'), ('FUS','Standfuss rollbar'), ('FI1','Boden verankert 1 Fuss'),('FI2','Boden verankert 2 Füsse'),('FIX','Bodenverankert Blockfuss'),('XXX','Sonstige')],'Montage/Befestigung'); lcd_montage_sonstige = fields.Char('Sonstige Montageart') lcd_size = fields.Selection([('42','42 Zoll'), ('55','55 Zoll'), ('65','65 Zoll'),('75','75 Zoll'),('10','10.x Zoll'),('00','Sonstige')],'LCD Größe'); lcd_size_sonstige = fields.Char('LCD Sondergröße') led_geraetetyp = fields.Selection([('MOD','LED Modul'),('NET','Netzgerät'), ('REC','Receiving Karte'), ('STE','Steuerkarte'),('LFT','Lüftertyp')]) led_module_pixelpitch = fields.Float('Modulpixelpitch') led_module_breite = fields.Integer('Modulbreite mm') led_module_hoehe = fields.Integer('Modulhoehe mm') led_module_pixel_breite = fields.Integer('Modulbreite px') led_module_pixel_hoehe = fields.Integer('Modulhoehe px') led_module_system = fields.Selection([('FIX1','Fix Verschraubt'), ('MAG1','Magnetisch haltend'), ('RIG1','Imbus Veriegelt (vorn)'),('SONS','Sonstige')],'Modul Montage/Befestigung'); led_module_system_sonstige = fields.Char('Modulbefestigung Sonstige') led_module_kennung = fields.Char('Modulbezeichnung') led_module_serial = fields.Char('Modulseriennummer') led_module_vendor = fields.Many2one('res.partner','Modul Hersteller') led_receivingcard_vendor = fields.Many2one('res.partner','Receivingcard Hersteller') led_receivingcard_kennung = fields.Char('Receivingcardtyp') led_netzteil_typ = fields.Selection([('SNT','Schaltnetzteil'), ('STN','Steckernetzteil'), ('HNT','Hutschienennetzteil'),('INT','Internes Netzteil')],'Netzteil Bauart'); led_netzteil_vendor = fields.Many2one('res.partner','Netzteil Hersteller') led_netzteil_kennung = fields.Char('Netzteilkennung') led_netzteil_spannung = fields.Char('Netzteil Spannung V') led_netzteil_leistung = fields.Char('Netzteil Leistung W') lcd_montage = fields.Selection([('WAN','Wandmontage'), ('FUS','Standfuss rollbar'), ('FI1','Boden verankert 1 Fuss'),('FI2','Boden verankert 2 Füsse'),('FIX','Bodenverankert Blockfuss'),('XXX','Sonstige')],'Montage/Befestigung'); lcd_montage_sonstige = fields.Char('Sonstige Montageart') hw_anzeige = fields.Many2one('dss.geraetetypen',domain="[('geraetetyp','=','ANZ')]") hw_steuerung = fields.Many2one('dss.geraetetypen',domain="['&',('geraetetyp','=','STE'),('grundsystem_kennung','=','LED')]") hw_player = fields.Many2one('dss.geraetetypen',domain="[('geraetetyp','=','PLY')]") hw_umwelt = fields.Many2one('dss.geraetetypen',domain="['|',('geraetetyp','=','SYS'),('geraetetyp','=','DIV')]") zusatz_integrationen = fields.Many2one('dss.geraetetypen') @api.model def _default_uuid(self): return str(uuid.uuid4()) @api.depends('grundsystem') def _compute_grundsystem_kennung(self): for syst in self: if syst.grundsystem: syst.grundsystem_kennung = syst.grundsystem.kennung class dsssystemtypen(models.Model): _name = "dss.systemtypen" _inherit = ['mail.thread'] _description = "DigitalSignage Systemtypen" _rec_name = "systemname" uuid = fields.Char(default=lambda self: self._default_uuid(), required=True, readonly=True, copy=False, string='UUID') systemname = fields.Char('Systemname', required=True) kennung = fields.Char('Kurzkennung', required=True) farbe = fields.Integer('Grundfarbe') icon = fields.Image() icon_5050 = fields.Image("Icon 50") @api.model def _default_uuid(self): return str(uuid.uuid4()) class dsssoftware(models.Model): _name = "dss.software" _description = "Softwaresysteme" _inherit = ['mail.thread'] _rec_name = "softwarename" # _inherit = ['mail.thread', 'mail.activity.mixin'] uuid = fields.Char(default=lambda self: self._default_uuid(), required=True, readonly=True, copy=False, string='UUID') # uuid = fields.Char('UUID', required=True, translate=True) softwarename = fields.Char('Softwarename', required=True) version = fields.Char('Version') hersteller = fields.Char('Hersteller') @api.model def _default_uuid(self): return str(uuid.uuid4()) class dsssystems(models.Model): _name = "dss.systems" _description = "DigitalSignage Systemtypen" _inherit = ['mail.thread'] _rec_name = "systemname" # _inherit = ['mail.thread', 'mail.activity.mixin'] uuid = fields.Char(default=lambda self: self._default_uuid(), required=True, readonly=True, copy=False, string='UUID') # uuid = fields.Char('UUID', required=True, translate=True) systemname = fields.Char('Systemname', required=True) grundsystem = fields.Many2one('dss.systemtypen', string="Gerät ist nutzbar für") grundsystem_kennung = fields.Char(string='Kennung', related='grundsystem.kennung') farbe = fields.Integer('Grundfarbe') has_heizung = fields.Boolean('Mit Heizsystem') has_klima = fields.Boolean('Mit Klimasystem') has_fan = fields.Boolean('Mit Ventiltorensystem') stromzaehler = fields.Many2one('dss.geraetetypen') stromverbrauch_avg = fields.Integer('Stromverbrauch AVG in W') osvorhanden = fields.Boolean('Mit Betriebssystem') osname = fields.Char('Betriebssystem') ostyp = fields.Selection([('Win','Windows'), ('Lin','Linux'), ('And','Android'),('Ras','Raspberry PI'),('Non','Keines bekannt'),('Div','Anderes')]); lcd_ausrichtung = fields.Selection([('quer','Horizontal/Querformat'), ('hoch','Vertikal/Hochformat'),('Divers','Andere Art')],'LCD Ausrichtung'); lcd_touch = fields.Boolean('Touchsystem') lcd_montage = fields.Selection([('WAN','Wandmontage'), ('FUS','Standfuss rollbar'), ('FI1','Boden verankert 1 Fuss'),('FI2','Boden verankert 2 Füsse'),('FIX','Bodenverankert Blockfuss'),('XXX','Sonstige')],'Montage/Befestigung'); lcd_montage_sonstige = fields.Char('Sonstige Montageart') lcd_panel = fields.Many2one('dss.geraetetypen',domain="['&',('grundsystem_kennung','=','LCD'),('led_geraetetyp','=','ANZ')]") lcd_mainboard = fields.Many2one('dss.geraetetypen',domain="['&',('grundsystem_kennung','=','LCD'),('led_geraetetyp','=','STE')]") lcd_touchcontroler = fields.Many2one('dss.geraetetypen',domain="['&',('grundsystem_kennung','=','LCD'),('led_geraetetyp','=','SYS')]") lcd_netzteil = fields.Many2one('dss.geraetetypen',domain="['&',('grundsystem_kennung','=','LCD'),('led_geraetetyp','=','NET')]") led_pixelpitch = fields.Char('Pixelabstand') led_breite = fields.Integer('LED Breite mm') led_hoehe = fields.Integer('LED Hoehe mm') led_pixel_breite = fields.Integer('LED Breite px') led_pixel_hoehe = fields.Integer('LED Hoehe px') led_receivingcard = fields.Many2one('dss.geraetetypen',domain="['&',('grundsystem_kennung','=','LED'),('led_geraetetyp','=','REC')]") led_netzteile = fields.Many2one('dss.geraetetypen',domain="['&',('grundsystem_kennung','=','LED'),('led_geraetetyp','=','NET')]") led_module = fields.Many2one('dss.geraetetypen',domain="['&',('grundsystem_kennung','=','LED'),('led_geraetetyp','=','MOD')]") led_montage = fields.Selection([('WAN','Wandmontage'), ('FUS','1 standFuss zentral'), ('FU2','2 Standfüsse Aussen'),('FU3','1 Standfuss dezentral'),('MO1','manuell Mobil bewegbar'),('MO2','Mobil bewegbar Container'),('XXX','Sonstige')],'Montage/Befestigung'); led_montage_sonstige = fields.Char('Sonstige Montageart') zusatz_integrationen = fields.Many2many('dss.geraetetypen') @api.model def _default_uuid(self): return str(uuid.uuid4()) class dsspprojektstatus(models.Model): _name = "dss.projectstate" _description = "DigitalSignage Projektstatus" _inherit = ['mail.thread'] _rec_name = "statusname" # _inherit = ['mail.thread', 'mail.activity.mixin'] uuid = fields.Char(default=lambda self: self._default_uuid(), required=True, readonly=True, copy=False, string='UUID') # uuid = fields.Char('UUID', required=True, translate=True) statusname = fields.Char('Statusname', required=True) color = fields.Integer(string='Color Index') icon = fields.Image() @api.model def _default_uuid(self): return str(uuid.uuid4()) class dsscontractstatus(models.Model): _name = "dss.contractstate" _description = "DigitalSignage Vertragsstatus" _inherit = ['mail.thread'] _rec_name = "statusname" # _inherit = ['mail.thread', 'mail.activity.mixin'] uuid = fields.Char(default=lambda self: self._default_uuid(), required=True, readonly=True, copy=False, string='UUID') # uuid = fields.Char('UUID', required=True, translate=True) statusname = fields.Char('Statusname', required=True) color = fields.Integer(string='Color Index') icon = fields.Image() order = fields.Integer('Reihenfolge') @api.model def _default_uuid(self): return str(uuid.uuid4()) class dssworkstatus(models.Model): _name = "dss.workstate" _description = "DigitalSignage Bearbeitungsstatus" _inherit = ['mail.thread'] _rec_name = "statusname" # _inherit = ['mail.thread', 'mail.activity.mixin'] uuid = fields.Char(default=lambda self: self._default_uuid(), required=True, readonly=True, copy=False, string='UUID') # uuid = fields.Char('UUID', required=True, translate=True) statusname = fields.Char('Statusname', required=True) color = fields.Char(string='Color Index') icon = fields.Image() @api.model def _default_uuid(self): return str(uuid.uuid4()) class dsseventdays(models.Model): _name = "dss.eventdays" _description = "DigitalSignage EventSpieltage" _inherit = ['mail.thread'] _rec_name = "eventname" # _inherit = ['mail.thread', 'mail.activity.mixin'] uuid = fields.Char(default=lambda self: self._default_uuid(), required=True, readonly=True, copy=False, string='UUID') # uuid = fields.Char('UUID', required=True, translate=True) eventname = fields.Char('Eventname', required=True) description = fields.Text('EventBeschreibung') eventdate = fields.Date('EventDatum', required=True) color = fields.Char(string='Color Index') @api.model def _default_uuid(self): return str(uuid.uuid4()) class dsstodostatus(models.Model): _name = "dss.todostate" _description = "DigitalSignage Bearbeitungsschritte" _inherit = ['mail.thread'] _rec_name = "statusname" # _inherit = ['mail.thread', 'mail.activity.mixin'] uuid = fields.Char(default=lambda self: self._default_uuid(), required=True, readonly=True, copy=False, string='UUID') # uuid = fields.Char('UUID', required=True, translate=True) statusname = fields.Char('Statusname', required=True) statusnr = fields.Integer('Litenpostion', required=True) color = fields.Char(string='Color Index') icon = fields.Image() @api.model def _default_uuid(self): return str(uuid.uuid4()) class dssadvertisefields(models.Model): _name = "dss.advertisefields" _description = "DigitalSignage Werbefelder" _inherit = ['mail.thread'] _rec_name = "feldname" # _inherit = ['mail.thread', 'mail.activity.mixin'] uuid = fields.Char(default=lambda self: self._default_uuid(), required=True, readonly=True, copy=False, string='UUID') # uuid = fields.Char('UUID', required=True, translate=True) feldname = fields.Char('Feldname', required=True) project = fields.Many2one('dss.projects' , string='Project', store=True) project_id = fields.Integer(related='project.projectid', string='Project ID') color_used = fields.Char(string='Color Index') color_unused = fields.Char(string='Color Index') icon = fields.Image() @api.model def _default_uuid(self): return str(uuid.uuid4())