Relations ok, Import Begin
|
|
@ -3,8 +3,9 @@
|
|||
<component name="NewModuleRootManager">
|
||||
<content url="file://$MODULE_DIR$">
|
||||
<excludeFolder url="file://$MODULE_DIR$/.venv" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/venv" />
|
||||
</content>
|
||||
<orderEntry type="inheritedJdk" />
|
||||
<orderEntry type="jdk" jdkName="Python 3.7 (DigitalSignage)" jdkType="Python SDK" />
|
||||
<orderEntry type="sourceFolder" forTests="false" />
|
||||
</component>
|
||||
</module>
|
||||
|
|
@ -1,5 +1,6 @@
|
|||
<component name="InspectionProjectProfileManager">
|
||||
<settings>
|
||||
<option name="PROJECT_PROFILE" value="Default" />
|
||||
<option name="USE_PROJECT_PROFILE" value="false" />
|
||||
<version value="1.0" />
|
||||
</settings>
|
||||
|
|
|
|||
|
|
@ -1,4 +1,7 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="Black">
|
||||
<option name="sdkName" value="Python 3.7 (DigitalSignage)" />
|
||||
</component>
|
||||
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.7 (DigitalSignage)" project-jdk-type="Python SDK" />
|
||||
</project>
|
||||
|
|
@ -18,8 +18,8 @@
|
|||
'views/dss_systemtypen.xml',
|
||||
'views/dss_mediarelations.xml',
|
||||
'views/dss_advertisementfields.xml',
|
||||
'views/dss_projects.xml',
|
||||
'views/dss_ads.xml',
|
||||
'views/dss_projects.xml','views/dss_import.xml',
|
||||
'views/dss_ads.xml','views/dss_settings.xml',
|
||||
'views/dss_mediafiles.xml',
|
||||
'views/dss_addstructures.xml',
|
||||
'views/dss_texts.xml',
|
||||
|
|
|
|||
281
models/dss.py
|
|
@ -39,12 +39,92 @@ def _generate_preview_from_binary_2(self, videofile_file):
|
|||
|
||||
return base64.b64encode(out)
|
||||
|
||||
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')
|
||||
|
||||
def _default_uuid(self):
|
||||
return str(uuid.uuid4())
|
||||
|
||||
def pyimport(self):
|
||||
|
||||
return action
|
||||
|
||||
class dssSettings(models.Model):
|
||||
_name = "dss.settings"
|
||||
_description = "DigitalSignage Einstellungen"
|
||||
uuid = fields.Char(default=lambda self: self._default_uuid(), required=True, readonly=True, copy=False, string='UUID')
|
||||
def_project_cloudpath = fields.Char('Standard Projekt Pfad')
|
||||
def_project_cloudpath_sample = fields.Char('Projekt Beispiel :',store=True)
|
||||
def_contract_cloudpath = fields.Char('Standard Kunden Pfad')
|
||||
def_contract_cloudpath_sample = fields.Char('Projekt Beispiel :')
|
||||
def_ad_cloudpath = fields.Char('Standard Kampagnen Pfad')
|
||||
def_ad_cloudpath_sample = fields.Char('Kampagnen Beispiel :')
|
||||
|
||||
def _get_path_converted(self,path,record):
|
||||
alls = ''
|
||||
_logger.info("GetPath with " + str(path)+ " and Record : "+str(record.id))
|
||||
if path:
|
||||
for parts in path.split(','):
|
||||
if parts[0] == '$':
|
||||
fels = parts[1:]
|
||||
parts = record._origin.read([fels])
|
||||
_logger.info("Default Cloudpath Setzen - MusterProjekt gefunden " + str(parts))
|
||||
if parts:
|
||||
value = str(parts[0][fels])
|
||||
else:
|
||||
value = ''
|
||||
_logger.info("Default Cloudpath Setzen - MusterProjekt gefunden " + str(value))
|
||||
alls = alls + value
|
||||
else:
|
||||
alls = alls + str(parts)
|
||||
return alls
|
||||
|
||||
@api.onchange('def_project_cloudpath')
|
||||
def _onchange_def_project_cloudpath(self):
|
||||
_logger.info("Default Project Cloudpath Setzen")
|
||||
project_1 = self.env['dss.projects'].search([('uuid','=ilike','%')],limit=1)
|
||||
if not project_1:
|
||||
_logger.info("Default Cloudpath Setzen - kein MusterProjekt gefunden")
|
||||
else:
|
||||
_logger.info("Default Cloudpath Setzen - MusterProjekt gefunden "+str(project_1.id))
|
||||
alls = self._get_path_converted(self.def_project_cloudpath,project_1)
|
||||
self.def_project_cloudpath_sample = alls
|
||||
|
||||
@api.onchange('def_contract_cloudpath')
|
||||
def _onchange_def_contract_cloudpath(self):
|
||||
_logger.info("Default Contract Cloudpath Setzen")
|
||||
contract_1 = self.env['dss.contracts'].search([('uuid','=ilike','%')],limit=1)
|
||||
if not contract_1:
|
||||
_logger.info("Default Cloudpath Setzen - kein MusterProjekt gefunden")
|
||||
else:
|
||||
_logger.info("Default Cloudpath Setzen - MusterProjekt gefunden "+str(contract_1.id))
|
||||
alls = self._get_path_converted(self.def_contract_cloudpath,contract_1)
|
||||
self.def_contract_cloudpath_sample = alls
|
||||
|
||||
@api.onchange('def_ad_cloudpath')
|
||||
def _onchange_def_ad_cloudpath(self):
|
||||
_logger.info("Default ad Cloudpath Setzen")
|
||||
ad_1 = self.env['dss.ads'].search([('uuid','=ilike','%')],limit=1)
|
||||
if not ad_1:
|
||||
_logger.info("Default Cloudpath Setzen - kein MusterProjekt gefunden")
|
||||
else:
|
||||
_logger.info("Default Cloudpath Setzen - MusterProjekt gefunden "+str(ad_1.id))
|
||||
alls = self._get_path_converted(self.def_ad_cloudpath,ad_1)
|
||||
self.def_ad_cloudpath_sample = alls
|
||||
|
||||
def _default_uuid(self):
|
||||
return str(uuid.uuid4())
|
||||
|
||||
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)
|
||||
ds = self.env['dss.projects'].search([('id','=',self.env.context.get('active_id'))],limit=1)
|
||||
return ds
|
||||
|
||||
def _default_work_state(self):
|
||||
|
|
@ -185,7 +265,7 @@ class dsscontracts(models.Model):
|
|||
# todo_state_info = fields.Char('Zusatzinfo',tracking=True)
|
||||
# todo_state_until = fields.Date('Abarbeiten bis',tracking=True)
|
||||
|
||||
cloudlink = fields.Char('Cloud Verzeichnis',help='Verzeichnis für das Project innerhalb des Projekt Ordners')
|
||||
cloudlink = fields.Char('Cloud Verzeichnis',help='Verzeichnis für den Kunde innerhalb des Projekt Ordners')
|
||||
|
||||
@api.constrains('client_id')
|
||||
def _check_client_id(self) :
|
||||
|
|
@ -298,69 +378,121 @@ class dsscontracts(models.Model):
|
|||
_logger.info('Click auf Werbekampagne : C_'+str(self.id)+'A_'+str(ds.id)+' - Keine Medien gefunden ')
|
||||
|
||||
# Medien erzeugen wenn nicht vorhanden
|
||||
_logger.info('Click auf Werbekampagne : C_'+str(self.id)+' Suche Kampagne allgemein ')
|
||||
kampagne=self.env['dss.ads'].search([('contract','=',self.id)],limit=1)
|
||||
_logger.info('Click auf Werbekampagne : '+str(self.id)+' 3')
|
||||
if not kampagne:
|
||||
_logger.info('Click auf Werbekampagne : '+str(self.id)+' kein kampagne')
|
||||
_logger.info('Click auf Werbekampagne : C_'+str(self.id)+' kein kampagne')
|
||||
defadstate = self.env['dss.adstate'].search([('func','=','STD')],limit=1)
|
||||
if not defadstate :
|
||||
_logger.info('Click auf Werbekampagne : '+str(self.id)+' kein defstate')
|
||||
_logger.info('Click auf Werbekampagne : C_'+str(self.id)+' kein defstate')
|
||||
defadstateid = 1
|
||||
else:
|
||||
defadstateid = defadstate.id
|
||||
kampagne = self.env['dss.ads'].create({'contract': self.id, 'project': self.project.id, 'adname': 'WK '+self.contract_auto_name,'adtype':'MAIN','ad_state':defadstateid})
|
||||
self.ads_last_ad = kampagne.id
|
||||
_logger.info('Click auf Werbekampagne : '+str(self.id)+' Kampagne erstellt '+str(kampagne.id))
|
||||
_logger.info('Click auf Werbekampagne : C_'+str(self.id)+' Kampagne erstellt A_'+str(kampagne.id))
|
||||
kampagne.parent_ad = kampagne.id
|
||||
mediaids = []
|
||||
for feld in self.werbe_feld_selected:
|
||||
for media in feld.mediastructure.medias:
|
||||
if not media:
|
||||
_logger.info('Prüfe Medien : C_'+str(self.id)+'K_'+str(kampagne.id)+' Kein Medium in MedienStructur von F_'+str(feld.id)+'M_'+str(media.id))
|
||||
else:
|
||||
newmedia=self.env['dss.mediarelations'].create({
|
||||
newmedi=media.copy({'contract':self.id,'ad':kampagne.id})
|
||||
_logger.info('Prüfe Medien : C_'+str(self.id)+'K_'+str(kampagne.id)+' setze Vertrag für Medium : '+str(newmedi.contract)+'/'+str(newmedi.ad))
|
||||
mediaids.append(newmedi.id)
|
||||
kampagne.write({'need_media': [(6,0,mediaids)]})
|
||||
_logger.info('Click auf Werbekampagne : '+str(self.id)+'/'+str(kampagne.id)+' setze Media '+str(kampagne.need_media))
|
||||
if not self.werbe_feld_selected:
|
||||
_logger.info('Prüfe Medien : C_' + str(self.id) + 'A_' + str(
|
||||
kamp.id) + ' Keine Felder im Vertrag')
|
||||
raise ValidationError(_("Vertrag hat keine Felder ! Kampagnen benötigen Felder - auch virtuelle"))
|
||||
else:
|
||||
for feld in self.werbe_feld_selected:
|
||||
if not feld:
|
||||
_logger.info('Prüfe Medien : C_' + str(self.id) + 'A_' + str(
|
||||
kamp.id) + ' Keine Felder im Vertrag')
|
||||
raise ValidationError(_("Vertrag hat keine Felder ! Kampagnen benötigen Felder - auch virtuelle"))
|
||||
else:
|
||||
for media in feld.mediastructure.medias:
|
||||
if not media:
|
||||
_logger.info('Prüfe Medien : C_'+str(self.id)+'K_'+str(kampagne.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.id,'project':self.project.id,'field_uuid':feld.uuid,'ad':kampagne.id, 'relname': media.medianame,
|
||||
'mediatype': media.id})
|
||||
_logger.info('Prüfe Medien : C_'+str(self.id)+'K_'+str(kampagne.id)+' setze Vertrag für Medium : '+str(newmedia.contract)+'/'+str(newmedia.ad))
|
||||
mediaids.append(newmedia.id)
|
||||
kampagne.write({'need_media': [(6,0,mediaids)]})
|
||||
_logger.info('Click auf Werbekampagne : C_'+str(self.id)+'/'+str(kampagne.id)+' setze Media '+str(kampagne.need_media))
|
||||
else:
|
||||
_logger.info('Click auf Werbekampagne : '+str(self.id)+' mind. 1 Kampagne vorhanden '+str(kampagne.id))
|
||||
_logger.info('Prüfe Medien : C_'+str(self.id))
|
||||
_logger.info('Click auf Werbekampagne : C_'+str(self.id)+' mind. 1 Kampagne vorhanden A_'+str(kampagne.id))
|
||||
kampagnen=self.env['dss.ads'].search([('contract','=',self.id)])
|
||||
_logger.info('Prüfe Medien : C_'+str(self.id)+' alle Kamp : '+str(kampagnen))
|
||||
for kamp in kampagnen:
|
||||
_logger.info('Prüfe Medien : C_'+str(self.id)+'K_'+str(kamp.id))
|
||||
_logger.info('Prüfe Medien : C_'+str(self.id)+'A_'+str(kamp.id))
|
||||
if kamp:
|
||||
mediaids = []
|
||||
medias = self.env['dss.mediarelations'].search([('ad','=',kamp.id)])
|
||||
if not medias:
|
||||
_logger.info('Prüfe Medien : C_'+str(self.id)+'K_'+str(kamp.id)+' keine Medien gefunden !')
|
||||
for singlemedi in self.need_media:
|
||||
if not singlemedi:
|
||||
_logger.info('Prüfe Medien : C_'+str(self.id)+'K_'+str(kamp.id)+' Kein Medium in NEED_MEDIA')
|
||||
else:
|
||||
newmedi=singlemedi.copy({'ad':kamp.id})
|
||||
_logger.info('Prüfe Medien : C_'+str(self.id)+'K_'+str(kamp.id)+' Kopiere Medium : '+str(singlemedi)+' -> '+str(newmedi))
|
||||
_logger.info('Prüfe Medien : C_'+str(self.id)+'K_'+str(kamp.id)+' Medien evtl erstellt !')
|
||||
medias = self.env['dss.mediarelations'].search([('ad','=',kamp.id)])
|
||||
_logger.info('Click auf Werbekampagne : C_'+str(self.id)+'K_'+str(kamp.id)+' neue Media '+str(mediaids))
|
||||
kamp.write({'need_media': [(6,0,medias.ids)]})
|
||||
# self.write({'need_media': [(5,0,0)]})
|
||||
# _logger.info('Click auf Werbekampagne : C_'+str(self.id)+'K_'+str(kamp.id)+' setze Media '+str(kamp.need_media))
|
||||
else:
|
||||
_logger.info('Prüfe Medien : C_'+str(self.id)+'K_'+str(kamp.id)+' Medien gefunden !')
|
||||
medias = self.env['dss.mediarelations'].search([('ad','=',kamp.id)])
|
||||
# mediaids.append(medias.ids)
|
||||
_logger.info('Click auf Werbekampagne : C_'+str(self.id)+'K_'+str(kamp.id)+' gefundene Media '+str(mediaids))
|
||||
kampagne=self.env['dss.ads'].browse(kamp.id)
|
||||
_logger.info('Click auf Werbekampagne : C_'+str(self.id)+'K_'+str(kamp.id)+' gefundene Media '+str(mediaids)+' Kampagne '+str(kampagne))
|
||||
if kampagne.need_media != medias:
|
||||
_logger.info('Click auf Werbekampagne : C_'+str(self.id)+'K_'+str(kamp.id)+' Media unterschiede - setze Media '+str(mediaids)+'/'+str(kampagne.need_media))
|
||||
_logger.info('Prüfe Medien : C_'+str(self.id)+'A_'+str(kamp.id)+' keine Medien gefunden !')
|
||||
if not self.werbe_feld_selected:
|
||||
_logger.info('Prüfe Medien : C_' + str(self.id) + 'A_' + str(
|
||||
kamp.id) + ' Keine Felder im Vertrag')
|
||||
raise ValidationError(
|
||||
_("Vertrag hat keine Felder ! Kampagnen benötigen Felder - auch virtuelle"))
|
||||
else:
|
||||
_logger.info('Click auf Werbekampagne : C_'+str(self.id)+'K_'+str(kamp.id)+' Media gleich '+str(kampagne.need_media))
|
||||
for feld in self.werbe_feld_selected:
|
||||
if not feld:
|
||||
_logger.info('Prüfe Medien : C_' + str(self.id) + 'A_' + str(
|
||||
kamp.id) + ' Keine Felder im Vertrag')
|
||||
raise ValidationError(_("Vertrag hat keine Felder ! Kampagnen benötigen Felder - auch virtuelle"))
|
||||
else:
|
||||
for media in feld.mediastructure.medias:
|
||||
if not media:
|
||||
_logger.info('Prüfe Medien : C_'+str(self.id)+'A_'+str(kamp.id)+' Kein Medium in der Struktur F_'+str(feld.id)+'M_'+str(feld.mediastructure.id))
|
||||
else:
|
||||
newmedi = self.env['dss.mediarelations'].create(
|
||||
{ 'field': feld.id, 'contract': self.id, 'project': self.project.id,
|
||||
'field_uuid': feld.uuid, 'ad': kamp.id, 'relname':media.medianame,'mediatype':media.id})
|
||||
_logger.info('Prüfe Medien : C_'+str(self.id)+'A_'+str(kamp.id)+' Erstelle Medium : M_'+str(media.id)+' -> '+str(newmedi.id))
|
||||
_logger.info('Prüfe Medien : C_'+str(self.id)+'A_'+str(kamp.id)+' Medien evtl erstellt ! NM_'+str(newmedi.id))
|
||||
medias = self.env['dss.mediarelations'].search([('ad','=',kamp.id)])
|
||||
_logger.info('Click auf Werbekampagne : C_'+str(self.id)+'A_'+str(kamp.id)+' neue Media '+str(mediaids))
|
||||
kamp.write({'need_media': [(6,0,medias.ids)]})
|
||||
# self.write({'need_media': [(5,0,0)]})
|
||||
# _logger.info('Click auf Werbekampagne : C_'+str(self.id)+'K_'+str(kamp.id)+' setze Media '+str(kamp.need_media))
|
||||
else:
|
||||
_logger.info('Prüfe Medien : C_'+str(self.id)+'A_'+str(kamp.id)+' Medien gefunden !')
|
||||
if not self.werbe_feld_selected:
|
||||
_logger.info('Prüfe Medien : C_' + str(self.id) + 'A_' + str(
|
||||
kamp.id) + ' Keine Felder im Vertrag')
|
||||
raise ValidationError(
|
||||
_("Vertrag hat keine Felder ! Kampagnen benötigen Felder - auch virtuelle"))
|
||||
else:
|
||||
for feld in self.werbe_feld_selected:
|
||||
_logger.info('Prüfe Medien : C_' + str(self.id) + 'A_' + str(kamp.id)+'F_'+str(feld.id))
|
||||
if not feld:
|
||||
_logger.info('Prüfe Medien : C_' + str(self.id) + 'A_' + str(
|
||||
kamp.id) + ' Keine Felder im Vertrag')
|
||||
raise ValidationError(_("Vertrag hat keine Felder ! Kampagnen benötigen Felder - auch virtuelle"))
|
||||
else:
|
||||
for media in feld.mediastructure.medias:
|
||||
if not media:
|
||||
_logger.info('Prüfe Medien : C_' + str(self.id) + 'A_' + str(
|
||||
kamp.id) + ' Kein Medium in der Struktur F_' + str(feld.id) + 'M_' + str(
|
||||
feld.mediastructure.id))
|
||||
else:
|
||||
_logger.info('Prüfe Medien : C_' + str(self.id) + 'A_' + str(kamp.id) + 'F_' + str(
|
||||
feld.id) + 'M_' + str(media.id))
|
||||
existmedia = self.env['dss.mediarelations'].search(['&',('ad','=',kamp.id),('mediatype','=',media.id),('field','=',feld.id)])
|
||||
if not existmedia:
|
||||
newmedi = self.env['dss.mediarelations'].create(
|
||||
{'field': feld.id, 'contract': self.id, 'project': self.project.id,
|
||||
'field_uuid': feld.uuid, 'ad': kamp.id, 'relname': media.medianame,
|
||||
'mediatype': media.id})
|
||||
_logger.info('Prüfe Medien : C_' + str(self.id) + 'A_' + str(
|
||||
kamp.id) + ' Erstelle Medium : M_' + str(media.id) + ' -> ' + str(
|
||||
newmedi.id))
|
||||
# mediaids.append(medias.ids)
|
||||
_logger.info('Click auf Werbekampagne : C_'+str(self.id)+'A_'+str(kamp.id)+' gefundene Media '+str(mediaids))
|
||||
kampagne=self.env['dss.ads'].browse(kamp.id)
|
||||
_logger.info('Click auf Werbekampagne : C_'+str(self.id)+'A_'+str(kamp.id)+' gefundene Media '+str(mediaids)+' Kampagne '+str(kampagne))
|
||||
if kampagne.need_media != medias:
|
||||
_logger.info('Click auf Werbekampagne : C_'+str(self.id)+'A_'+str(kamp.id)+' Media unterschiede - setze Media '+str(mediaids)+'/'+str(kampagne.need_media))
|
||||
else:
|
||||
_logger.info('Click auf Werbekampagne : C_'+str(self.id)+'A_'+str(kamp.id)+' Media gleich '+str(kampagne.need_media))
|
||||
else:
|
||||
_logger.info('Prüfe Medien : C_'+str(self.id)+'K_'+str(kamp.id)+' Keine Kampagne gefunden !')
|
||||
_logger.info('Prüfe Medien : C_'+str(self.id)+'A_'+str(kamp.id)+' Keine Kampagne gefunden !')
|
||||
# _logger.info('Click auf Werbekampagne : '+str(self.id)+' 4 '+str(kampagne.id))
|
||||
return {
|
||||
'type': 'ir.actions.act_window',
|
||||
|
|
@ -431,6 +563,8 @@ class dssmain(models.Model):
|
|||
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')
|
||||
standort = fields.Char('Hauptstandort des Projektes',tracking=True)
|
||||
vertragsschreiber = fields.Many2one('res.partner',domain="['&',('dsspartner','=',True),('dsspartner_vertrieb','=',True)]",tracking=True)
|
||||
standortpartner = fields.Many2one('res.partner',domain="['&',('dsspartner','=',True),('dsspartner_standort','=',True)]",tracking=True)
|
||||
vertriebspartner = fields.Many2many('res.partner',domain="['&',('dsspartner','=',True),('dsspartner_vertrieb','=',True)]",tracking=True)
|
||||
|
|
@ -470,9 +604,13 @@ class dssmain(models.Model):
|
|||
# action['context'] = context
|
||||
# action['domain'] = domain
|
||||
# return action
|
||||
|
||||
|
||||
|
||||
@api.onchange('cloudlink')
|
||||
def _onchange_cloudlink(self):
|
||||
_logger.info("Project "+str(self.id)+" Cloudpath changed")
|
||||
if (self.cloudlink == ''):
|
||||
if (self._origin.cloudlink != ''):
|
||||
_logger.info("Project " + str(self.id) + " deleted - using standard path")
|
||||
self.cloudlink = dssSettings._get_path_converted(self,self.env['dss.settings'].search([],limit=1).def_project_cloudpath,self)
|
||||
|
||||
|
||||
class dssgeraetetypen(models.Model):
|
||||
|
|
@ -483,9 +621,12 @@ class dssgeraetetypen(models.Model):
|
|||
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')],tracking=True)
|
||||
grundsystem = fields.Many2one('dss.systemtypen', string="Gerät ist nutzbar für",tracking=True)
|
||||
# grundsystem = fields.Many2one('dss.systemtypen', string="Gerät ist nutzbar für",tracking=True)
|
||||
grundsystem = fields.Many2many('dss.systemtypen', string="Gerät ist nutzbar für",tracking=True)
|
||||
grundsystem_kennung = fields.Char(string='Kennung', related='grundsystem.kennung',tracking=True)
|
||||
|
||||
standort = fields.Char('Hauptstandort des Gerätes',tracking=True)
|
||||
|
||||
farbe = fields.Char('Grundfarbe',tracking=True)
|
||||
|
||||
has_heizung = fields.Boolean('Mit Heizsystem',tracking=True)
|
||||
|
|
@ -538,6 +679,8 @@ class dssgeraetetypen(models.Model):
|
|||
hw_umwelt = fields.Many2one('dss.geraetetypen',domain="['|',('geraetetyp','=','SYS'),('geraetetyp','=','DIV')]",tracking=True)
|
||||
|
||||
zusatz_integrationen = fields.Many2one('dss.geraetetypen',tracking=True)
|
||||
zusatz_zubehoer = fields.Char('Sonstiges Zubehör',tracking=True)
|
||||
|
||||
|
||||
@api.model
|
||||
def _default_uuid(self):
|
||||
|
|
@ -563,6 +706,7 @@ class dsssystemtypen(models.Model):
|
|||
icon = fields.Image()
|
||||
icon_5050 = fields.Image("Icon 50",compute='_compute_icon_5050')
|
||||
default_adstructure = fields.Many2one('dss.adstructures',String='Standard-Werbeaufbau')
|
||||
default_cloud_path = fields.Char('Standard Cloud Path')
|
||||
@api.model
|
||||
def _default_uuid(self):
|
||||
return str(uuid.uuid4())
|
||||
|
|
@ -613,6 +757,7 @@ class dsssystems(models.Model):
|
|||
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')
|
||||
|
|
@ -1091,7 +1236,7 @@ class dsscontractads(models.Model):
|
|||
order = fields.Integer('Reihenfolge')
|
||||
|
||||
# need_media = fields.Many2many('dss.mediarelations','ad',string='Medien')
|
||||
need_media = fields.Many2many('dss.mediarelations','mediarelations_ad_relations','ad_id','mediarelations_id',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')
|
||||
|
|
@ -1222,27 +1367,25 @@ class dsscontractads(models.Model):
|
|||
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 = []
|
||||
medias = self.env['dss.mediarelations'].search([('ad','=',newkampagne.id)])
|
||||
if not medias:
|
||||
_logger.info('Prüfe Medien : C_'+str(self.id)+'K_'+str(newkampagne.id)+' keine Medien gefunden !')
|
||||
medias = self.env['dss.mediarelations'].search(['&',('contract','=',self.contract.id),('ad','=',False)])
|
||||
if not medias:
|
||||
_logger.info('Prüfe Medien : C_'+str(self.id)+'K_'+str(newkampagne.id)+' keine Medien im vertrag gefunden !')
|
||||
else:
|
||||
for singlemedi in medias:
|
||||
if not singlemedi:
|
||||
_logger.info('Prüfe Medien : C_'+str(self.id)+'K_'+str(newkampagne.id)+' Kein Medium')
|
||||
else:
|
||||
newmedi=singlemedi.copy({'ad':newkampagne.id})
|
||||
mediaids.append(newmedi.id)
|
||||
_logger.info('Prüfe Medien : C_'+str(self.id)+'K_'+str(newkampagne.id)+' Kopiere Medium : '+str(singlemedi)+' -> '+str(newmedi))
|
||||
medias = self.env['dss.mediarelations'].search([('ad','=',newkampagne.id)])
|
||||
_logger.info('Click auf Werbekampagne : C_'+str(self.id)+'K_'+str(newkampagne.id)+' neue Media '+str(mediaids))
|
||||
newkampagne.write({'need_media': [(6,0,medias.ids)]})
|
||||
# self.write({'need_media': [(5,0,0)]})
|
||||
# _logger.info('Click auf Werbekampagne : C_'+str(self.id)+'K_'+str(kamp.id)+' setze Media '+str(kamp.need_media))
|
||||
# _logger.info('Click auf Werbekampagne : '+str(self.id)+' 4 '+str(kampagne.id))
|
||||
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',
|
||||
|
|
|
|||
|
|
@ -18,4 +18,6 @@ digitalsignage_dss_adstructures_group_user,access.dss.adstructures,model_dss_ads
|
|||
digitalsignage_dss_mediatypes_group_user,access.dss.mediatypes,model_dss_mediatypes,base.group_user,1,1,1,1
|
||||
digitalsignage_dss_texts_group_user,access.dss.texts,model_dss_texts,base.group_user,1,1,1,1
|
||||
digitalsignage_dss_mediarelations_group_user,access.dss.mediarelations,model_dss_mediarelations,base.group_user,1,1,1,1
|
||||
digitalsignage_dss_advertisefields_group_user,access.dss.advertisefields,model_dss_advertisefields,base.group_user,1,1,1,1
|
||||
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
|
||||
|
|
|
|||
|
|
Before Width: | Height: | Size: 5.2 KiB After Width: | Height: | Size: 5.2 KiB |
|
Before Width: | Height: | Size: 6.2 KiB After Width: | Height: | Size: 6.2 KiB |
|
Before Width: | Height: | Size: 241 B After Width: | Height: | Size: 241 B |
|
Before Width: | Height: | Size: 207 B After Width: | Height: | Size: 207 B |
|
Before Width: | Height: | Size: 4.6 KiB After Width: | Height: | Size: 4.6 KiB |
|
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 10 KiB |
|
Before Width: | Height: | Size: 5.8 KiB After Width: | Height: | Size: 5.8 KiB |
|
Before Width: | Height: | Size: 2.0 KiB After Width: | Height: | Size: 2.0 KiB |
|
Before Width: | Height: | Size: 8.0 KiB After Width: | Height: | Size: 8.0 KiB |
|
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 18 KiB |
|
Before Width: | Height: | Size: 2.5 KiB After Width: | Height: | Size: 2.5 KiB |
|
Before Width: | Height: | Size: 4.1 KiB After Width: | Height: | Size: 4.1 KiB |
|
Before Width: | Height: | Size: 4.0 KiB After Width: | Height: | Size: 4.0 KiB |
|
Before Width: | Height: | Size: 42 KiB After Width: | Height: | Size: 42 KiB |
|
Before Width: | Height: | Size: 7.3 KiB After Width: | Height: | Size: 7.3 KiB |
|
|
@ -338,88 +338,79 @@
|
|||
</group>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row" >
|
||||
<div class="col-8">
|
||||
<div class="row" >
|
||||
<div class="col-8">
|
||||
<group attrs="{'invisible': [('runtimesystem','!=','M')]}" >>
|
||||
<field name="runtime_m" string="Laufzeit Monate"/>
|
||||
</group>
|
||||
<field name="runtime_m" string="Laufzeit Monate"/>
|
||||
</group>
|
||||
<group attrs="{'invisible': [('runtimesystem','!=','T')]}" >>
|
||||
<field name="runtime_t" string="Laufzeit Tage"/>
|
||||
</group>
|
||||
<field name="runtime_t" string="Laufzeit Tage"/>
|
||||
</group>
|
||||
<group attrs="{'invisible': [('runtimesystem','!=','E')]}" >>
|
||||
<field name="runtime_events" string="Laufzeit EventTage"/>
|
||||
</group>
|
||||
<field name="runtime_events" string="Laufzeit EventTage"/>
|
||||
</group>
|
||||
<group attrs="{'invisible': [('runtimesystem','!=','S')]}" >>
|
||||
<field name="runtime_divers" string="Laufzeit sontige"/>
|
||||
</group>
|
||||
<field name="runtime_divers" string="Laufzeit sontige"/>
|
||||
</group>
|
||||
</div>
|
||||
</div>
|
||||
<hr>></hr>
|
||||
<div class="row" >
|
||||
<div class="col-8">
|
||||
<hr>></hr>
|
||||
<div class="row" >
|
||||
<div class="col-8">
|
||||
<group>
|
||||
<field name="paymentsystems" string="Abrechnung"/>
|
||||
<field name="intern_info_payment_off"/>
|
||||
<field name="paymentsystems" string="Abrechnung"/>
|
||||
<field name="intern_info_payment_off"/>
|
||||
</group>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</page>
|
||||
<page name="contractsettings" string="Kampagnen/Verlauf">
|
||||
<group>
|
||||
<group>
|
||||
<field name="ads" string="" readonly="1">
|
||||
<tree string="kampagnen" editable="none" create="none">
|
||||
<field name="adname" string="Kampagne"/>
|
||||
<field name="adtype" string="Kamapgnen-Art"/>
|
||||
<field name="create_date" string="Erstellt am"/>
|
||||
<field name="description" string="Bemerkung"/>
|
||||
<field name="ad_state_color" string="Status" widget="color"/>
|
||||
</tree>
|
||||
</field>
|
||||
</group>
|
||||
<tree string="kampagnen" editable="none" create="none">
|
||||
<field name="adname" string="Kampagne"/>
|
||||
<field name="adtype" string="Kamapgnen-Art"/>
|
||||
<field name="create_date" string="Erstellt am"/>
|
||||
<field name="description" string="Bemerkung"/>
|
||||
<field name="ad_state_color" string="Status" widget="color"/>
|
||||
</tree>
|
||||
</field>
|
||||
</group>
|
||||
</page>
|
||||
<page name="contractmedia" string="letzte Medien">
|
||||
<group>
|
||||
<group>
|
||||
<field name="last_media" string="" readonly="1">
|
||||
<tree string="kampagnen" editable="none" create="none" >
|
||||
<field name="field" string="vom Feld"/>
|
||||
<field name="ad" string="vom Kampagne"/>
|
||||
<field name="mediatype_name" string="Nutzung"/>
|
||||
<button name="dload" string="" type="object" icon="fa-download"/>
|
||||
<field name="mediafile" string="Vorschau" options="{'size':[50]}" widget="image"/>
|
||||
<field name="secured_ro" string="Gesperrt" widget="boolean_toggle"/>
|
||||
<field name="used_ro" string="Genutzt" widget="boolean_toggle"/>
|
||||
</tree>
|
||||
</field>
|
||||
</group>
|
||||
</page>
|
||||
<page name="contractmedia" string="Erforderliche Medien">
|
||||
<group>
|
||||
<field name="need_media" string="" readonly="1">
|
||||
<tree string="kampagnen" editable="none" create="none" >
|
||||
<field name="field" string="vom Feld"/>
|
||||
<field name="mediatype_name" string="Nutzung"/>
|
||||
<field name="mediatype_type" string="Art"/>
|
||||
<!-- <field name="secured_ro" string="Gesperrt" widget="boolean_toggle"/>
|
||||
<field name="used_ro" string="Genutzt" widget="boolean_toggle"/>-->
|
||||
</tree>
|
||||
</field>
|
||||
</group>
|
||||
<tree string="kampagnen" editable="none" create="none" >
|
||||
<field name="field" string="vom Feld"/>
|
||||
<field name="ad" string="vom Kampagne"/>
|
||||
<field name="mediatype_name" string="Nutzung"/>
|
||||
<button name="dload" string="" type="object" icon="fa-download"/>
|
||||
<field name="mediafile" string="Vorschau" options="{'size':[50]}" widget="image"/>
|
||||
<field name="secured_ro" string="Gesperrt" widget="boolean_toggle"/>
|
||||
<field name="used_ro" string="Genutzt" widget="boolean_toggle"/>
|
||||
</tree>
|
||||
</field>
|
||||
</group>
|
||||
</page>
|
||||
<!-- <page name="querprojects" string="Weitere Projekte">
|
||||
<group>
|
||||
<field name="client_other_projects" string="Weitere Projekte"/>
|
||||
</group>
|
||||
<group>
|
||||
<field name="client_other_projects" string="Weitere Projekte"/>
|
||||
</group>
|
||||
</page>-->
|
||||
<page name="informations" string="Informationen">
|
||||
<group>
|
||||
<field name="contract_id" string="Kunden/Vert.nummer" readonly="1"/>
|
||||
<field name="id" string="Vertrags Interne Id" readonly="1"/>
|
||||
<field name="ads_last_state" string="letzter Vorgang" readonly="1"/>
|
||||
<field name="projectIid" string="Project IId" readonly="1"/>
|
||||
<field name="uuid" string="Datensatz UUID"/>
|
||||
<field name="project_ad_structure" string="Project Aufbau" readonly="1"/>
|
||||
<field name="cloudlink"/>
|
||||
</group>
|
||||
<group>
|
||||
<field name="cloudlink"/>
|
||||
</group>
|
||||
</page>
|
||||
<page name="informations" string="Informationen">
|
||||
<group>
|
||||
<field name="contract_id" string="Kunden/Vert.nummer" readonly="1"/>
|
||||
<field name="id" string="Vertrags Interne Id" readonly="1"/>
|
||||
<field name="ads_last_state" string="letzter Vorgang" readonly="1"/>
|
||||
<field name="projectIid" string="Project IId" readonly="1"/>
|
||||
<field name="uuid" string="Datensatz UUID"/>
|
||||
<field name="project_ad_structure" string="Project Aufbau" readonly="1"/>
|
||||
</group>
|
||||
</page>
|
||||
</notebook>
|
||||
</sheet>
|
||||
|
|
|
|||
|
|
@ -37,7 +37,6 @@
|
|||
<field name="mediatype" string="Medium"/>
|
||||
<field name="secured_ro" widget="boolean_toggle"/>
|
||||
<field name="used_ro" widget="boolean_toggle"/>
|
||||
<field name="isreference" widget="boolean_toggle"/>
|
||||
<field name="mediafile" string="Medium-Inhalt" widget="image"/>
|
||||
</group>
|
||||
</group>
|
||||
|
|
|
|||
|
|
@ -27,12 +27,13 @@
|
|||
<field name="vertriebspartner"/>
|
||||
</group>
|
||||
</page>
|
||||
<page name="basesettings" string="Details">
|
||||
<page name="basesettings" string="Details (Zeiten,Standort)">
|
||||
<group>
|
||||
<field name="zeiten_on"/>
|
||||
<field name="zeiten_off"/>
|
||||
</group>
|
||||
</page>
|
||||
<field name="standort"/>
|
||||
<field name="zeiten_on"/>
|
||||
<field name="zeiten_off"/>
|
||||
</group>
|
||||
</page>
|
||||
<page name="geraetesettings" string="Systeme">
|
||||
<group>
|
||||
<field name="systemname" string="Abspiel/Controlsystem"/>
|
||||
|
|
|
|||
|
|
@ -24,14 +24,15 @@
|
|||
<form>
|
||||
<sheet>
|
||||
<group name="erscheinung" string="Kennungen">
|
||||
<field name="systemname"/>
|
||||
<field name="kennung" string="Kurzkennung (XXX)"/>
|
||||
<field name="default_adstructure"/>
|
||||
<field name="systemname"/>
|
||||
<field name="kennung" string="Kurzkennung (XXX)"/>
|
||||
<field name="default_adstructure"/>
|
||||
<field name="default_cloud_path"/>
|
||||
</group>
|
||||
<group name="erscheinung" string="Aussehen">
|
||||
<field name="farbe" string="Farbkennung" widget="color"/>
|
||||
<field name="icon" widget="image"/>
|
||||
<field name="icon_5050" widget="image"/>
|
||||
<field name="farbe" string="Farbkennung" widget="color"/>
|
||||
<field name="icon" widget="image"/>
|
||||
<field name="icon_5050" widget="image"/>
|
||||
</group>
|
||||
</sheet>
|
||||
<div class="oe_chatter">
|
||||
|
|
|
|||
|
|
@ -95,82 +95,6 @@
|
|||
</field>
|
||||
</record>
|
||||
|
||||
<record id="dss_geraetetypen_view_form" model="ir.ui.view">
|
||||
<field name="name">dss_geraetetypen_form</field>
|
||||
<field name="model">dss.geraetetypen</field>
|
||||
<field name="arch" type="xml">
|
||||
<form>
|
||||
<sheet>
|
||||
<group>
|
||||
<group name="basesettings" >
|
||||
<field name="geraetename"/>
|
||||
<field name="geraetetyp"/>
|
||||
<field name="grundsystem" string="Nutzung für "/>
|
||||
<field name="grundsystem_kennung" invisible="1"/>
|
||||
<field name="led_geraetetyp" attrs="{'invisible': ['|',('geraetetyp','!=','STE'),('grundsystem_kennung','!=','LED')]}"/>
|
||||
</group>
|
||||
</group>
|
||||
<notebook>
|
||||
<page name="osssetings" string="LCDSystem Daten" attrs="{'invisible': ['|',('geraetetyp','!=','TOP'),('grundsystem_kennung','!=','LCD')]}" >
|
||||
<group name="lcdsettings">
|
||||
<field name="lcd_size"/>
|
||||
<field name="lcd_size_sonstige" attrs="{'invisible': [('lcd_size','!=','00')]}"/>
|
||||
</group>
|
||||
</page>
|
||||
<page name="osssetings" string="LEDModul Daten" attrs="{'invisible': ['|',('led_geraetetyp','!=','MOD'),('grundsystem_kennung','!=','LED')]}" >
|
||||
<group name="ledsettings_hw" string="LED Modul Daten" colspan="2">
|
||||
<group name="ledsettings" string="LED Modul Grunddaten" colspan="2">
|
||||
<field name="led_module_pixelpitch" colspan="2"/>
|
||||
<field name="led_module_breite"/>
|
||||
<field name="led_module_hoehe"/>
|
||||
<field name="led_module_pixel_breite"/>
|
||||
<field name="led_module_pixel_hoehe"/>
|
||||
</group>
|
||||
<group name="ledsettings" string="LED Modul Kennungen" colspan="2">
|
||||
<field name="led_module_kennung"/>
|
||||
<field name="led_module_serial"/>
|
||||
<field name="led_module_vendor"/>
|
||||
</group>
|
||||
<group name="ledsettings" string="LED Modul typ" colspan="2">
|
||||
<field name="led_module_system"/>
|
||||
<field name="led_module_system_sonstige" attrs="{'invisible': [('led_module_system','!=','SON')]}"/>
|
||||
</group>
|
||||
</group>
|
||||
</page>
|
||||
<page name="receivingssetings" string="Receivingcard Daten" attrs="{'invisible': ['|',('led_geraetetyp','!=','REC'),('grundsystem_kennung','!=','LED')]}" >
|
||||
<group name="ledsettings_hw" string="LED Receivingcard Daten" colspan="2">
|
||||
<field name="led_receivingcard_kennung" colspan="2"/>
|
||||
<field name="led_receivingcard_vendor"/>
|
||||
</group>
|
||||
</page>
|
||||
<page name="ntssetings" string="Netzteil Daten" attrs="{'invisible': ['|',('led_geraetetyp','!=','NET'),('grundsystem_kennung','!=','LED')]}" >
|
||||
<group name="ledsettings_hw_nt" string="LED Netzteil Daten" colspan="2">
|
||||
<field name="led_netzteil_typ"/>
|
||||
<field name="led_netzteil_kennung"/>
|
||||
<field name="led_netzteil_vendor"/>
|
||||
<field name="led_netzteil_spannung"/>
|
||||
<field name="led_netzteil_leistung"/>
|
||||
</group>
|
||||
</page>
|
||||
<page name="geraetezusatz" string="Zubehör" colspan="4">
|
||||
<group>
|
||||
<field name="zusatz_integrationen" string="Zubehör"/>
|
||||
</group>
|
||||
</page>
|
||||
<page name="informations" string="Informationen">
|
||||
<field name="uuid" string="UUID"/>
|
||||
</page>
|
||||
</notebook>
|
||||
</sheet>
|
||||
<div class="oe_chatter">
|
||||
<field name="message_follower_ids" options="{'post_refresh':True}" help="Follow this project to automatically track the events associated to tasks and issues of this project." groups="base.group_user"/>
|
||||
<field name="activity_ids"/>
|
||||
<field name="message_ids"/>
|
||||
</div>
|
||||
</form>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
|
||||
<record id="dss_systems_view_tree" model="ir.ui.view">
|
||||
<field name="name">dss_systems_tree</field>
|
||||
|
|
@ -183,20 +107,6 @@
|
|||
</field>
|
||||
</record>
|
||||
|
||||
<record id="dss_geraetetypen_view_tree" model="ir.ui.view">
|
||||
<field name="name">dss_geraetetypen_tree</field>
|
||||
<field name="model">dss.geraetetypen</field>
|
||||
<field name="priority" eval="16"/>
|
||||
<field name="arch" type="xml">
|
||||
<tree string="Geraetetypen">
|
||||
<field name="geraetename"/>
|
||||
<field name="geraetetyp"/>
|
||||
<field name="grundsystem"/>
|
||||
<field name="led_geraetetyp"/>
|
||||
</tree>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="dss_software_view_form" model="ir.ui.view">
|
||||
<field name="name">dss_software_form</field>
|
||||
<field name="model">dss.software</field>
|
||||
|
|
|
|||
|
|
@ -18,6 +18,12 @@
|
|||
parent="menu_dss_main"
|
||||
sequence="4"/>
|
||||
|
||||
<menuitem
|
||||
id="menu_dss_interntools"
|
||||
name="Tools"
|
||||
parent="menu_dss_main"
|
||||
sequence="5"/>
|
||||
|
||||
<menuitem
|
||||
id="menu_dss_wtyp_internsetup"
|
||||
name="Medien und Werbevorlagen"
|
||||
|
|
@ -179,10 +185,24 @@
|
|||
action="action_dss_paysystems_view"
|
||||
sequence="120"/>
|
||||
|
||||
<menuitem
|
||||
id="menu_dss_configuration_settings"
|
||||
name="Grundeinstellungen"
|
||||
parent="menu_dss_internsetup"
|
||||
action="action_dss_settings_view"
|
||||
sequence="130"/>
|
||||
|
||||
<menuitem id="menu_dss_email_templates"
|
||||
parent="menu_dss_configurationen_system"
|
||||
action="action_dss_email_template_tree_all"
|
||||
sequence="130"/>
|
||||
parent="menu_dss_configurationen_system"
|
||||
action="action_dss_email_template_tree_all"
|
||||
sequence="130"/>
|
||||
|
||||
<menuitem
|
||||
id="menu_dss_openprojectimport"
|
||||
name="OpenProject-Import via API"
|
||||
parent="menu_dss_interntools"
|
||||
action="action_dss_import_view"
|
||||
sequence="10"/>
|
||||
|
||||
|
||||
</odoo>
|
||||