August 2025 Build

This commit is contained in:
jopster
2025-08-04 08:35:55 +02:00
parent a2e4beba27
commit 4e32d9ba82
17 changed files with 277 additions and 25 deletions
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
Binary file not shown.
Binary file not shown.
+1
View File
@@ -124,6 +124,7 @@ class dssadvertisefields(models.Model):
btn_text_2_font = fields.Char('Textzeile 2 Schriftart', tracking=True) btn_text_2_font = fields.Char('Textzeile 2 Schriftart', tracking=True)
btn_text_3_font = fields.Char('Textzeile 3 Schriftart', tracking=True) btn_text_3_font = fields.Char('Textzeile 3 Schriftart', tracking=True)
btn_text_4_font = fields.Char('Textzeile 4 Schriftart', tracking=True) btn_text_4_font = fields.Char('Textzeile 4 Schriftart', tracking=True)
Field_notinCloud = fields.Boolean('Feld im Cloudname',tracking=True, default=True)
loopfiles = fields.Char('Durchlaufdateien', tracking=True) loopfiles = fields.Char('Durchlaufdateien', tracking=True)
+1
View File
@@ -42,6 +42,7 @@ class dsseventdays(models.Model):
color = fields.Char(string='Color Index') color = fields.Char(string='Color Index')
username = fields.Many2one('res.users',string="Kalendercontact") username = fields.Many2one('res.users',string="Kalendercontact")
calendarevent = fields.Integer('Kalenderevent ID') calendarevent = fields.Integer('Kalenderevent ID')
category = fields.Char('Kategorie', required=True)
@api.model @api.model
def _default_uuid(self): def _default_uuid(self):
+1 -1
View File
@@ -65,7 +65,7 @@ class dssm2mvalues(models.Model):
self.project = False self.project = False
for record in self: for record in self:
if record.project_id: if record.project_id:
project = self.env['dss.projects'].search([('projectid', '=', int(record.project_id))]) project = self.env['dss.projects'].search([('projectid', '=', int(record.project_id))],limit=1)
if project: if project:
record.project = project record.project = project
+149 -4
View File
@@ -41,15 +41,160 @@ class dssmaintaintasks(models.Model):
user_create = fields.Char('Erstellungsuser', default=lambda self: self._default_create_user()) user_create = fields.Char('Erstellungsuser', default=lambda self: self._default_create_user())
user_lastedit = fields.Char('Änderungsuser') user_lastedit = fields.Char('Änderungsuser')
maintaintyp = fields.Selection([('AUF','Aufbau/Installation'),('REP','Reparatur'), ('CLE','Reinigung'), ('INS','Inspektion'), ('ABB','Demontage'), ('SON','Sonstiges')],tracking=True) maintaintyp = fields.Selection([('AUF','Aufbau/Installation'),('REP','Reparatur'), ('CLE','Reinigung'), ('INS','Inspektion'), ('ABB','Demontage'), ('REN','Erneuerung'),('SON','Sonstiges')],tracking=True)
project = fields.Many2one('dss.projects', required=True, tracking=True) project = fields.Many2one('dss.projects', required=True, tracking=True)
maintain_tag = fields.Date('Einsatztag', required=True, tracking=True) maintain_tag = fields.Date('Einsatztag', tracking=True)
maintain_time_h = fields.Integer('Einsatzzeit Volle Stunden', required=True, tracking=True) maintain_time_h = fields.Integer('Einsatzzeit Volle Stunden', tracking=True)
maintain_time_m = fields.Integer('Einsatzzeit Rest Minuten', required=True, tracking=True) maintain_time_m = fields.Integer('Einsatzzeit Rest Minuten', tracking=True)
# maintain_people = fields.Many2many('res.partner','Einsatzbeteiligte', domain="['&',('dssinternpartner','=',True),('dssinternpartner_grafik','=',True)]", tracking=True,required=True) # maintain_people = fields.Many2many('res.partner','Einsatzbeteiligte', domain="['&',('dssinternpartner','=',True),('dssinternpartner_grafik','=',True)]", tracking=True,required=True)
maintain_reason = fields.Char('Einsatzgrund', required=True) maintain_reason = fields.Char('Einsatzgrund', required=True)
maintain_text = fields.Html('Einsatzablauf', required=True) maintain_text = fields.Html('Einsatzablauf', required=True)
maintain_travel_start = fields.Datetime('Anreisebeginn', tracking=True)
maintain_travel_end = fields.Datetime('Ankunftszeit', tracking=True)
maintain_travel_distance = fields.Float('Anreise Entfernung', tracking=True)
maintain_travel_duration = fields.Float('Anreise Dauer', tracking=True, compute='_compute_travel_total_time', store=True)
maintain_travel_duration_text = fields.Char('Anreise Dauer', tracking=True, compute='_compute_travel_total_time_text', store=True)
maintain_work_start = fields.Datetime('Arbeitsbeginn', tracking=True)
maintain_work_end = fields.Datetime('Arbeitsende', tracking=True)
maintain_work_duration = fields.Float('Arbeits Dauer', tracking=True,compute='_compute_work_total_time', store=True)
maintain_work_duration_text = fields.Char('Arbeits Dauer', tracking=True, compute='_compute_work_total_time_text', store=True)
maintain_return_start = fields.Datetime('Rückreisebeginn', tracking=True)
maintain_return_end = fields.Datetime('Rückreiseende', tracking=True)
maintain_return_duration = fields.Float('Rückreise Dauer', tracking=True,compute='_compute_return_total_time', store=True)
maintain_return_distance = fields.Float('Rückreise Entfernung', tracking=True)
maintain_return_duration_text = fields.Char('Rückreise Dauer', tracking=True, compute='_compute_return_total_time_text', store=True)
maintain_total_start = fields.Datetime('Einsatzbeginn', tracking=True,compute='_compute_maintain_total_start', store=True)
maintain_total_end = fields.Datetime('Einsatzende', tracking=True, compute='_compute_maintain_total_end', store=True)
maintain_total_duration = fields.Float('Einsatz Dauer', tracking=True,compute='_compute_maintain_total_time', store=True)
maintain_total_duration_text = fields.Char('Einsatz Dauer', tracking=True, compute='_compute_maintain_total_time_text', store=True)
maintain_total_duration_money = fields.Float('Einsatz Kosten', tracking=True, compute='_compute_maintain_total_cost', store=True)
maintain_is_calculate = fields.Boolean('Einsatz ist Abrechenbar', default=False, tracking=True)
maintain_employee =fields.Many2many('hr.employee', string='Einsatzmitarbeiter', tracking=True, required=True)
@api.depends('maintain_employee')
@api.onchange('maintain_employee')
def _compute_maintain_total_cost(self):
for record in self:
total_cost = 0.0
if record.maintain_employee:
for employee in record.maintain_employee:
if employee.hourly_cost:
# Calculate the total cost for each employee based on their hourly cost and the total duration of the maintenance task
total_cost += employee.hourly_cost * record.maintain_total_duration
record.maintain_total_duration_money = total_cost
@api.depends('maintain_travel_duration')
@api.onchange('maintain_travel_duration')
def _compute_travel_total_time_text(self):
for record in self:
if record.maintain_travel_duration:
hours = int(record.maintain_travel_duration)
minutes = int((record.maintain_travel_duration - hours) * 60)
record.maintain_travel_duration_text = f"{hours} Stunden {minutes} Minuten"
else:
record.maintain_travel_duration_text = "0 Stunden 0 Minuten"
@api.depends('maintain_work_duration')
@api.onchange('maintain_work_duration')
def _compute_work_total_time_text(self):
for record in self:
if record.maintain_work_duration:
hours = int(record.maintain_work_duration)
minutes = int((record.maintain_work_duration - hours) * 60)
record.maintain_work_duration_text = f"{hours} Stunden {minutes} Minuten"
else:
record.maintain_work_duration_text = "0 Stunden 0 Minuten"
@api.depends('maintain_return_duration')
@api.onchange('maintain_return_duration')
def _compute_return_total_time_text(self):
for record in self:
if record.maintain_return_duration:
hours = int(record.maintain_return_duration)
minutes = int((record.maintain_return_duration - hours) * 60)
record.maintain_return_duration_text = f"{hours} Stunden {minutes} Minuten"
else:
record.maintain_return_duration_text = "0 Stunden 0 Minuten"
@api.depends('maintain_total_duration')
@api.onchange('maintain_total_duration')
def _compute_maintain_total_time_text(self):
for record in self:
if record.maintain_total_duration:
hours = int(record.maintain_total_duration)
minutes = int((record.maintain_total_duration - hours) * 60)
record.maintain_total_duration_text = f"{hours} Stunden {minutes} Minuten"
else:
record.maintain_total_duration_text = "0 Stunden 0 Minuten"
@api.constrains('maintain_travel_start', 'maintain_travel_end')
@api.onchange('maintain_travel_start', 'maintain_travel_end')
def _compute_travel_total_time(self):
for record in self:
if record.maintain_travel_start and record.maintain_travel_end:
if record.maintain_travel_start >= record.maintain_travel_end:
raise ValidationError(_("Anreisebeginn muss vor Ankunftszeit liegen."))
record.maintain_travel_duration = (record.maintain_travel_end - record.maintain_travel_start).total_seconds() / 3600.0
@api.constrains('maintain_work_start', 'maintain_work_end')
@api.onchange('maintain_work_start', 'maintain_work_end')
def _compute_work_total_time(self):
for record in self:
if record.maintain_work_start and record.maintain_work_end:
if record.maintain_work_start >= record.maintain_work_end:
raise ValidationError(_("Arbeitsbeginn muss vor Arbeitsende liegen."))
record.maintain_work_duration = (record.maintain_work_end - record.maintain_work_start).total_seconds() / 3600.0
@api.constrains('maintain_return_start', 'maintain_return_end')
@api.onchange('maintain_return_start', 'maintain_return_end')
def _compute_return_total_time(self):
for record in self:
if record.maintain_return_start and record.maintain_return_end:
if record.maintain_return_start >= record.maintain_return_end:
raise ValidationError(_("Rückreisebeginn muss vor Rückreiseende liegen."))
record.maintain_return_duration = (record.maintain_return_end - record.maintain_return_start).total_seconds() / 3600.0
@api.depends('maintain_travel_start', 'maintain_work_start', 'maintain_return_start')
def _compute_maintain_total_start(self):
for record in self:
if record.maintain_travel_start and record.maintain_work_start and record.maintain_return_start:
# Find the earliest start time among travel, work, and return
earliest_start = min(record.maintain_travel_start, record.maintain_work_start, record.maintain_return_start)
record.maintain_total_start = earliest_start
else:
record.maintain_total_start = False
@api.depends('maintain_travel_end', 'maintain_work_end', 'maintain_return_end')
def _compute_maintain_total_end(self):
for record in self:
if record.maintain_travel_end and record.maintain_work_end and record.maintain_return_end:
# Find the latest end time among travel, work, and return
latest_end = max(record.maintain_travel_end, record.maintain_work_end, record.maintain_return_end)
record.maintain_total_end = latest_end
else:
record.maintain_total_end = False
@api.depends('maintain_travel_duration', 'maintain_work_duration', 'maintain_return_duration')
@api.onchange('maintain_travel_duration', 'maintain_work_duration', 'maintain_return_duration')
def _compute_maintain_total_time(self):
for record in self:
total_duration = 0.0
if record.maintain_travel_duration:
total_duration += record.maintain_travel_duration
if record.maintain_work_duration:
total_duration += record.maintain_work_duration
if record.maintain_return_duration:
total_duration += record.maintain_return_duration
record.maintain_total_duration = total_duration
@api.model @api.model
def _default_uuid(self): def _default_uuid(self):
return str(uuid.uuid4()) return str(uuid.uuid4())
+4
View File
@@ -58,6 +58,8 @@ class dssprojects(models.Model):
aktstatus_color = fields.Char(related='aktstatus.color') aktstatus_color = fields.Char(related='aktstatus.color')
aktstatus_icon = fields.Image(related='aktstatus.icon') aktstatus_icon = fields.Image(related='aktstatus.icon')
description = fields.Text('Beschreibung',tracking=True) description = fields.Text('Beschreibung',tracking=True)
remarks = fields.Html('Bemerkungen',tracking=True)
hotremarks = fields.Html('Wichtige Bemerkungen',tracking=True)
short_partner_description = fields.Char('Kurz-Beschreibung für Kunden',tracking=True) short_partner_description = fields.Char('Kurz-Beschreibung für Kunden',tracking=True)
partner_description = fields.Text('Beschreibung für Kunden',tracking=True) partner_description = fields.Text('Beschreibung für Kunden',tracking=True)
systemname = fields.Many2one('dss.systems',tracking=True) systemname = fields.Many2one('dss.systems',tracking=True)
@@ -157,6 +159,8 @@ class dssprojects(models.Model):
simstart_DVEmpty_3 = fields.Boolean('Simkarte 3 DV leer', tracking=True) simstart_DVEmpty_3 = fields.Boolean('Simkarte 3 DV leer', tracking=True)
simstart_DVEmpty_3_lastdate = fields.Date('Simkarte 3 Leerdatum', tracking=True) simstart_DVEmpty_3_lastdate = fields.Date('Simkarte 3 Leerdatum', tracking=True)
playsetup_user = fields.Many2one('res.users',domain="[('user_type','=','1')]",string='Einspielung - Benutzer',tracking=True)
@api.model @api.model
def _read_group_system_ids(self, stages, domain, order): def _read_group_system_ids(self, stages, domain, order):
project_system_ids = self.env['dss.systemtypen'].search([('open_close_standard_state','=',False)], order='order') project_system_ids = self.env['dss.systemtypen'].search([('open_close_standard_state','=',False)], order='order')
+7 -1
View File
@@ -76,7 +76,13 @@ class dssSettings(models.Model):
for parts in path.split(','): for parts in path.split(','):
if parts[0] == '$': if parts[0] == '$':
fels = parts[1:] fels = parts[1:]
parts = record._origin.read([fels]) if fels == 'shortwerbe_feld_selected':
if not record.werbe_feld_selected.Field_notinCloud:
parts = ''
else:
parts = record._origin.read([fels])
else:
parts = record._origin.read([fels])
_logger.info("Get Path - Anfrage-Teil gefunden : " + str(parts)) _logger.info("Get Path - Anfrage-Teil gefunden : " + str(parts))
if parts: if parts:
value = str(parts[0][fels]) value = str(parts[0][fels])
+9 -8
View File
@@ -26,20 +26,21 @@
<sheet> <sheet>
<group> <group>
<group name="basethings"> <group name="basethings">
<field name="feldname" string="Feldname"/> <field name="feldname" string="Feldname"/>
<field name="project" string="Projekt"/> <field name="project" string="Projekt"/>
<field name="auto_feldname" string="Projekt_Feld" readonly="1"/> <field name="auto_feldname" string="Projekt_Feld" readonly="1"/>
<field name="contract" string="Vertrag"> <field name="contract" string="Vertrag">
<tree string="Verträge"> <tree string="Verträge">
<field name="contract_auto_name"/> <field name="contract_auto_name"/>
<field name="contract_auto_id"/> <field name="contract_auto_id"/>
<field name="contract_name" /> <field name="contract_name" />
</tree> </tree>
</field> </field>
<div colspan="2" style="font-color:#E00000;"><p>Die Struktur kann erst nach Speichern der Grunddaten eingerichtet werden !</p></div> <div colspan="2" style="font-color:#E00000;"><p>Die Struktur kann erst nach Speichern der Grunddaten eingerichtet werden !</p></div>
<field name="mediastructure" attrs="{'invisible': [('issaved','!=',True)]}" /> <field name="mediastructure" attrs="{'invisible': [('issaved','!=',True)]}" />
<field name="isblocked" widget="boolean_toggle"/> <field name="isblocked" widget="boolean_toggle"/>
<field name="is_btn"/> <field name="is_btn"/>
<field name="Field_notinCloud" widget="boolean_toggle"/>
</group> </group>
</group> </group>
<notebook> <notebook>
+2
View File
@@ -10,6 +10,7 @@
<field name="eventname"/> <field name="eventname"/>
<field name="eventstartdate"/> <field name="eventstartdate"/>
<field name="eventenddate"/> <field name="eventenddate"/>
<field name="category"/>
<field name="description"/> <field name="description"/>
<field name="color" widget="color"/> <field name="color" widget="color"/>
</tree> </tree>
@@ -32,6 +33,7 @@
<field name="description" string="Beschreibung"/> <field name="description" string="Beschreibung"/>
<field name="color" widget="color"/> <field name="color" widget="color"/>
<field name="username" string="Benutzer in dessen Kalender Event einzutragen ist"/> <field name="username" string="Benutzer in dessen Kalender Event einzutragen ist"/>
<field name="category"/>
</group> </group>
<notebook> <notebook>
<page name="informations" string="Informationen"> <page name="informations" string="Informationen">
+77 -6
View File
@@ -15,17 +15,86 @@
<field name="maintaintyp"/> <field name="maintaintyp"/>
<field name="project"/> <field name="project"/>
</group> </group>
<group name="settings" string="Einsatzzeiten">
<field name="maintain_tag"/>
<field name="maintain_time_h" />
<field name="maintain_time_m" />
</group>
<group name="settings" string="Einsatzablauf"> <group name="settings" string="Einsatzablauf">
<field name="maintain_reason"/> <field name="maintain_reason"/>
<field name="maintain_text"/> <field name="maintain_text"/>
<field name="maintain_is_calculate" widget="boolean_toggle" options="{'terminology': 'Abrechenbar'}"/>
</group> </group>
</group> </group>
<notebook> <notebook>
<page name="maintaintimes" string="Einsatzzeiten">
<div class="row">
<div class="col-md-6">
<group name="maintain_travel" string="Anreise">
<field name="maintain_travel_start"/>
</group>
</div>
<div class="col-md-6">
<group name="maintain_travel" string="Anreise">
<field name="maintain_travel_end"/>
</group>
</div>
</div>
<div class="row">
<div class="col-md-6">
<label for="maintain_travel_distance" string="Fahr - Entfernung in km"/><field name="maintain_travel_distance"/>
</div>
<div class="col-md-6">
<label for="maintain_travel_duration_text" string="Fahrzeit gesamt in h"/><field name="maintain_travel_duration_text" readonly="1"/>
</div>
</div>
<div class="row">
<div class="col-md-6">
<group name="maintain_times" string="Einsatzzeiten">
<field name="maintain_work_start"/>
</group>
</div>
<div class="col-md-6">
<group name="maintain_times" string="Einsatzzeiten">
<field name="maintain_work_end"/>
</group>
</div>
</div>
<div class="row">
<div class="col-md-10">
<label for="maintain_work_duration_text" string="Gesamt Arbeitszeit in h"/><field name="maintain_work_duration_text" readonly="1"/>
</div>
</div>
<div class="row">
<div class="col-md-6">
<group name="maintain_return" string="Rückreise">
<field name="maintain_return_start"/>
</group>
</div>
<div class="col-md-6">
<group name="maintain_return" string="Rückreise">
<field name="maintain_return_end"/>
</group>
</div>
</div>
<div class="row">
<div class="col-md-6">
<label for="maintain_return_distance" string="Rückfahr - Entfernung in km"/><field name="maintain_return_distance"/>
</div>
<div class="col-md-6">
<label for="maintain_return_duration_text" string="Gesamt Rückfahrzeit in h"/><field name="maintain_return_duration_text" readonly="1"/>
</div>
</div>
<group name="maintain_total" string="Gesamtzeiten">
<field name="maintain_total_start" readonly="1"/>
<field name="maintain_total_end" readonly="1"/>
<field name="maintain_total_duration_text" readonly="1"/>
</group>
</page>
<page name="employees" string="Mitarbeiter">
<group name="maintain_employee" string="Einsatzbeteiligte">
<field name="maintain_employee" widget="many2many_tags" options="{'no_create': True, 'no_create_edit': True}"/>
</group>
<group name="maintain_employee_other" string="Kosten">
<field name="maintain_total_duration_money"/>
</group>
</page>
<page name="informations" string="Informationen"> <page name="informations" string="Informationen">
<group name="settings" string="interne Informationen"> <group name="settings" string="interne Informationen">
<field name="uuid" string="UUID"/> <field name="uuid" string="UUID"/>
@@ -53,7 +122,9 @@
<field name="maintainname"/> <field name="maintainname"/>
<field name="maintaintyp"/> <field name="maintaintyp"/>
<field name="project"/> <field name="project"/>
<field name="maintain_tag"/> <field name="maintain_total_start"/>
<field name="maintain_total_duration" sum="Gesamtzeit"/>
<field name="maintain_total_duration_money" sum="Gesamtkosten"/>
</tree> </tree>
</field> </field>
</record> </record>
+14 -4
View File
@@ -182,7 +182,10 @@
<field name="maintainname"/> <field name="maintainname"/>
<field name="maintaintyp"/> <field name="maintaintyp"/>
<field name="project"/> <field name="project"/>
<field name="maintain_tag"/> <field name="maintain_total_start"/>
<field name="maintain_total_duration_text"/>
<field name="maintain_total_duration" sum="Gesamtzeit"/>
<field name="maintain_total_duration_money" sum="Gesamtkosten"/>
</tree> </tree>
</field> </field>
</page> </page>
@@ -201,7 +204,7 @@
<field name="simstart_DVEmpty_3" widget="boolean_toggle"/> <field name="simstart_DVEmpty_3" widget="boolean_toggle"/>
<field name="simstart_DVEmpty_3_lastdate"/> <field name="simstart_DVEmpty_3_lastdate"/>
</group> </group>
</page> </page>
<page name="trigger" string="Aktionen/Trigger"> <page name="trigger" string="Aktionen/Trigger">
<group> <group>
<field name="run_trigger" string="Trigger aktiv ?" widget="Boolean_toggle"/> <field name="run_trigger" string="Trigger aktiv ?" widget="Boolean_toggle"/>
@@ -210,6 +213,12 @@
<field name="run_uni_sub_trigger" string="Allgemeine Vertrags - Trigger ausführen ?" widget="Boolean_toggle"/> <field name="run_uni_sub_trigger" string="Allgemeine Vertrags - Trigger ausführen ?" widget="Boolean_toggle"/>
</group> </group>
</page> </page>
<page name="Bemerkungen" string="Bemerkungen/Anweisungen/Notizen">
<group>
<field name="remarks"/>
<field name="hotremarks"/>
</group>
</page>
<page name="informations" string="Interne Informationen"> <page name="informations" string="Interne Informationen">
<group> <group>
<field name="id" string="Iid" readonly="1"/> <field name="id" string="Iid" readonly="1"/>
@@ -256,6 +265,7 @@
<field name="playername_2"/> <field name="playername_2"/>
<field name="playername_3"/> <field name="playername_3"/>
<field name="grundsystemicon_different"/> <field name="grundsystemicon_different"/>
<field name="hotremarks"/>
<templates> <templates>
<t t-name="kanban-box"> <t t-name="kanban-box">
<t t-set="colonr" t-value="aktstatus_color"/> <t t-set="colonr" t-value="aktstatus_color"/>
@@ -276,8 +286,8 @@
</div> </div>
<div class="col-8" style="white-space:nowrap;overflow:hidden;text-overflow:ellipsis;"> <div class="col-8" style="white-space:nowrap;overflow:hidden;text-overflow:ellipsis;">
<div class="row"> <div class="row">
<div style="white-space:nowrap;overflow:hidden;text-overflow:ellipsis;"> <div style="white-space:nowrap;overflow:hidden;text-overflow:ellipsis;">
<span style="font-size:17px;"><field name="projektname" string="Project Name"/></span> <span style="font-size:17px;"><field name="projektname" string="Project Name"/></span>
</div> </div>
</div> </div>
<div class="row"> <div class="row">
+12 -1
View File
@@ -51,11 +51,22 @@
</field> </field>
</record> </record>
<record id="dss_triggerconditions_trigger_condition_view" model="ir.ui.view">
<field name="name">dss_triggerconditions_tree</field>
<field name="model">dss.triggerconditions</field>
<field name="priority" eval="16"/>
<field name="arch" type="xml">
<trigger_condition_view string="Trigger Aktionen">
<field name="triggerconditionname"/>
</tree>
</field>
</record>
<record id="action_dss_triggerconditions_view" model="ir.actions.act_window"> <record id="action_dss_triggerconditions_view" model="ir.actions.act_window">
<field name="name">DigitalSignage TriggerBedingungen</field> <field name="name">DigitalSignage TriggerBedingungen</field>
<field name="type">ir.actions.act_window</field> <field name="type">ir.actions.act_window</field>
<field name="res_model">dss.triggerconditions</field> <field name="res_model">dss.triggerconditions</field>
<field name="view_mode">tree,form</field> <field name="view_mode">tree,form,trigger_condition_view</field>
<field name="context">{}</field> <field name="context">{}</field>
<field name="help" type="html"> <field name="help" type="html">
<p class="'o_view_nocontent_smiling_face"> <p class="'o_view_nocontent_smiling_face">