<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Blog Odoo Tips]]></title><description><![CDATA[Apasionados por la tecnología]]></description><link>https://blog.odootips.com</link><generator>RSS for Node</generator><lastBuildDate>Sat, 16 May 2026 13:28:27 GMT</lastBuildDate><atom:link href="https://blog.odootips.com/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Agregando link de descarga en el formulario Odoo]]></title><description><![CDATA[Agregando en el formulario un enlace de descarga para un archivo estático que se encuentra en nuestro módulo.
<a class="oe-link" download="Header.txt" href="/name_nodule/static/src/files/header.txt" target="_blank"><i class="fa fa-fw fa-arrow-right"/...]]></description><link>https://blog.odootips.com/agregando-link-de-descarga-en-el-formulario-odoo</link><guid isPermaLink="true">https://blog.odootips.com/agregando-link-de-descarga-en-el-formulario-odoo</guid><dc:creator><![CDATA[Odoo Tips]]></dc:creator><pubDate>Fri, 06 Mar 2020 20:28:21 GMT</pubDate><content:encoded><![CDATA[<p>Agregando en el formulario un enlace de descarga para un archivo estático que se encuentra en nuestro módulo.</p>
<pre><code class="lang-xml"><span class="hljs-tag">&lt;<span class="hljs-name">a</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"oe-link"</span> <span class="hljs-attr">download</span>=<span class="hljs-string">"Header.txt"</span> <span class="hljs-attr">href</span>=<span class="hljs-string">"/name_nodule/static/src/files/header.txt"</span> <span class="hljs-attr">target</span>=<span class="hljs-string">"_blank"</span>&gt;</span><span class="hljs-tag">&lt;<span class="hljs-name">i</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"fa fa-fw fa-arrow-right"</span>/&gt;</span>Header file example<span class="hljs-tag">&lt;/<span class="hljs-name">a</span>&gt;</span>
</code></pre>
]]></content:encoded></item><item><title><![CDATA[Obtener atributo de manera dinámica]]></title><description><![CDATA[@api.model
def render_qweb_html(self, docids, data=None):
    if not data:
        data = {}
    data.setdefault('report_type', 'html')
    data = self._get_rendering_context(docids, data)
    return self.render_template(self.report_name, data), 'htm...]]></description><link>https://blog.odootips.com/obtener-atributo-de-manera-dinamica</link><guid isPermaLink="true">https://blog.odootips.com/obtener-atributo-de-manera-dinamica</guid><dc:creator><![CDATA[Odoo Tips]]></dc:creator><pubDate>Sat, 29 Feb 2020 05:21:07 GMT</pubDate><content:encoded><![CDATA[<pre><code class="lang-python"><span class="hljs-meta">@api.model</span>
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">render_qweb_html</span><span class="hljs-params">(self, docids, data=None)</span>:</span>
    <span class="hljs-keyword">if</span> <span class="hljs-keyword">not</span> data:
        data = {}
    data.setdefault(<span class="hljs-string">'report_type'</span>, <span class="hljs-string">'html'</span>)
    data = self._get_rendering_context(docids, data)
    <span class="hljs-keyword">return</span> self.render_template(self.report_name, data), <span class="hljs-string">'html'</span>

<span class="hljs-meta">@api.multi</span>
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">render</span><span class="hljs-params">(self, res_ids, data=None)</span>:</span>
    report_type = self.report_type.lower().replace(<span class="hljs-string">'-'</span>, <span class="hljs-string">'_'</span>)
    <span class="hljs-comment"># report_type = 'qweb_html'</span>
    render_func = getattr(self, <span class="hljs-string">'render_'</span> + report_type, <span class="hljs-keyword">None</span>)
    <span class="hljs-keyword">if</span> <span class="hljs-keyword">not</span> render_func:
        <span class="hljs-keyword">return</span> <span class="hljs-keyword">None</span>
    <span class="hljs-keyword">return</span> render_func(res_ids, data=data)
</code></pre>
]]></content:encoded></item><item><title><![CDATA[Obteniendo el atributo de un objeto Odoo - python]]></title><description><![CDATA[sheet.write(row, 1, (getattr(tmpl, 'pos_categ_id', None) and tmpl.pos_categ_id.display_name) or tmpl.categ_id.display_name or "", format_values_left)]]></description><link>https://blog.odootips.com/obteniendo-el-atributo-de-un-objeto-odoo-python</link><guid isPermaLink="true">https://blog.odootips.com/obteniendo-el-atributo-de-un-objeto-odoo-python</guid><dc:creator><![CDATA[Odoo Tips]]></dc:creator><pubDate>Thu, 20 Feb 2020 20:40:49 GMT</pubDate><content:encoded><![CDATA[<pre><code class="lang-python">sheet.write(row, <span class="hljs-number">1</span>, (getattr(tmpl, <span class="hljs-string">'pos_categ_id'</span>, <span class="hljs-keyword">None</span>) <span class="hljs-keyword">and</span> tmpl.pos_categ_id.display_name) <span class="hljs-keyword">or</span> tmpl.categ_id.display_name <span class="hljs-keyword">or</span> <span class="hljs-string">""</span>, format_values_left)
</code></pre>
]]></content:encoded></item><item><title><![CDATA[Obtener valores de un campo tipo Selection Odoo]]></title><description><![CDATA[amount_type = fields.Selection([
    ('fixed', 'Fixed'),
    ('percentage', 'Percentage of balance')], default='percentage')

def print_value(self):
    # De acuerdo al tipo que se haya guardado en el registro obtendra el valor
    # Ejemplo: si se g...]]></description><link>https://blog.odootips.com/obtener-valores-de-un-campo-tipo-selection-odoo</link><guid isPermaLink="true">https://blog.odootips.com/obtener-valores-de-un-campo-tipo-selection-odoo</guid><dc:creator><![CDATA[Odoo Tips]]></dc:creator><pubDate>Thu, 20 Feb 2020 20:33:56 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1582230822982/FORZ_NYKC.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<pre><code class="lang-python">amount_type = fields.Selection([
    (<span class="hljs-string">'fixed'</span>, <span class="hljs-string">'Fixed'</span>),
    (<span class="hljs-string">'percentage'</span>, <span class="hljs-string">'Percentage of balance'</span>)], default=<span class="hljs-string">'percentage'</span>)

<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">print_value</span><span class="hljs-params">(self)</span>:</span>
    <span class="hljs-comment"># De acuerdo al tipo que se haya guardado en el registro obtendra el valor</span>
    <span class="hljs-comment"># Ejemplo: si se guardo el amount_type como 'Percentage of balance'</span>
    print(self.amount_type)
    <span class="hljs-comment"># Out key</span>
    <span class="hljs-comment"># 'percentage'</span>
    print(dict(self._fields[<span class="hljs-string">'amount_type'</span>].selection).get(self.amount_type))
    <span class="hljs-comment"># Out value</span>
    <span class="hljs-string">'Percentage of balance'</span>
</code></pre>
]]></content:encoded></item><item><title><![CDATA[Configurar el posbox Odoo]]></title><description><![CDATA[Descargamos la imagen ya preparada del  posbox  con la versión deseada
Descargamos la aplicación  BalenaEtcher de acuerdo a su sistema operativo, esta app permite crear una unidad flash USB o un disco duro externo USB como arranque Live USB
Abrimos l...]]></description><link>https://blog.odootips.com/configurar-el-posbox-odoo</link><guid isPermaLink="true">https://blog.odootips.com/configurar-el-posbox-odoo</guid><dc:creator><![CDATA[Odoo Tips]]></dc:creator><pubDate>Wed, 11 Dec 2019 00:18:54 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1576023522022/xxrJBJrMD.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<ol>
<li>Descargamos la imagen ya preparada del  <a target='_blank' rel='noopener noreferrer'  href="https://nightly.odoo.com/master/posbox/">posbox</a>  con la versión deseada</li>
<li>Descargamos la aplicación  <a target='_blank' rel='noopener noreferrer'  href="https://www.balena.io/etcher/">BalenaEtcher</a> de acuerdo a su sistema operativo, esta app permite crear una unidad flash USB o un disco duro externo USB como arranque Live USB</li>
<li>Abrimos la app Etcher
<img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1576021082008/XYPgW4mQd.png" alt="Etcher_005.png"></li>
<li>Seleccionamos la imagen y la unidad (Si usas Windows de preferencia descomprimes la image)
<img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1576021324532/4BcTvuoCY.png" alt="Etcher_006.png"></li>
<li>Una vez completado sacamos la SD y lo colocamos en en raspberry
<img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1576022368260/S6CDO14Ux.png" alt="Selección_007.png"></li>
<li>Encendemos el raspberry y lo conectamos a la red con la entrada RJ45 le asignara una IP dinamica si desean establecer una IP estatica en el posbox puedes seguir el siguiente  <a target='_blank' rel='noopener noreferrer'  href="https://odootips.com/ip-est%C3%A1tica-en-posbox-8843a763216">artículo</a> </li>
</ol>
]]></content:encoded></item><item><title><![CDATA[Config sub domain Hashnode]]></title><description><![CDATA[https://blog.cleiver.me/devblog-dreamhost-yes-you-can-cjvu4g8it003yn3s1o360aqna]]></description><link>https://blog.odootips.com/config-sub-domain-hashnode</link><guid isPermaLink="true">https://blog.odootips.com/config-sub-domain-hashnode</guid><category><![CDATA[domain]]></category><dc:creator><![CDATA[Odoo Tips]]></dc:creator><pubDate>Tue, 16 Jul 2019 20:51:44 GMT</pubDate><content:encoded><![CDATA[<p>https://blog.cleiver.me/devblog-dreamhost-yes-you-can-cjvu4g8it003yn3s1o360aqna</p>
]]></content:encoded></item><item><title><![CDATA[Herramienta para comprimir imagenes]]></title><description><![CDATA[https://compressjpeg.com/]]></description><link>https://blog.odootips.com/herramienta-para-comprimir-imagenes</link><guid isPermaLink="true">https://blog.odootips.com/herramienta-para-comprimir-imagenes</guid><dc:creator><![CDATA[Odoo Tips]]></dc:creator><pubDate>Mon, 10 Jun 2019 19:49:51 GMT</pubDate><content:encoded><![CDATA[<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" data-card-width="600px" data-card-key="2e4d628b39a64b99917c73956a16b477" href="https://compressjpeg.com/" data-card-controls="0" data-card-theme="light">https://compressjpeg.com/</a></div>
]]></content:encoded></item><item><title><![CDATA[Trabajando con fechas en Odoo]]></title><description><![CDATA[Función para convertir la fecha y hora en datetime:
# Retorna tipo datetime (UTC)
fields.Datetime.from_string(picking_id.date_done)
# <class 'datetime.datetime'>
2019-06-06 23:08:14
Función para convertir la fecha en cadena a date:
# Retorna tipo dat...]]></description><link>https://blog.odootips.com/trabajando-con-fechas-en-odoo</link><guid isPermaLink="true">https://blog.odootips.com/trabajando-con-fechas-en-odoo</guid><dc:creator><![CDATA[Odoo Tips]]></dc:creator><pubDate>Fri, 07 Jun 2019 06:48:10 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1559890055897/vU5DV9vPG.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Función para convertir la fecha y hora en datetime:</p>
<pre><code><span class="hljs-comment"># Retorna tipo datetime (UTC)</span>
fields.Datetime.from_string(picking_id.date_<span class="hljs-keyword">done</span>)
<span class="hljs-comment"># &lt;class 'datetime.datetime'&gt;</span>
2019-06-06 23:08:14
</code></pre><p>Función para convertir la fecha en cadena a date:</p>
<pre><code><span class="hljs-meta"># Retorna tipo date</span>
fields.Date.from_string(picking_id.date)
<span class="hljs-meta"># <span class="hljs-meta-string">&lt;class 'datetime.date'&gt;</span></span>
<span class="hljs-number">2019</span><span class="hljs-number">-06</span><span class="hljs-number">-06</span>
</code></pre><p>Obtiene la fecha y hora según la configuración de la zona horaria del usuario</p>
<pre><code><span class="hljs-meta"># Retorna tipo datetime (UTC-5)</span>
fields.Datetime.context_timestamp(<span class="hljs-keyword">self</span>, fields.Datetime.from_string(i.date_done))
<span class="hljs-meta"># <span class="hljs-meta-string">&lt;class 'datetime.datetime'&gt;</span></span>
<span class="hljs-number">2019</span><span class="hljs-number">-06</span><span class="hljs-number">-06</span> <span class="hljs-number">18</span>:<span class="hljs-number">08</span>:<span class="hljs-number">14</span><span class="hljs-number">-05</span>:<span class="hljs-number">00</span>
</code></pre><p>Obtener la fecha por defecto según mi zona horaria (Ejemplo: si llamaria a esa función más de las 7:00 pm, me retornaria la fecha con el día siguiente)</p>
<pre><code><span class="hljs-meta"># Retorna tipo cadena</span>
fields.Date.today()
<span class="hljs-meta"># <span class="hljs-meta-string">&lt;class 'str'&gt;</span></span>
<span class="hljs-string">"2019-06-07"</span>
</code></pre><p>Considerando el tz de la configuración del usuario</p>
<pre><code><span class="hljs-meta"># Retorna tipo cadena</span>
fields.Date.context_today(<span class="hljs-keyword">self</span>)
<span class="hljs-meta"># <span class="hljs-meta-string">&lt;class 'str'&gt;</span></span>
<span class="hljs-string">"2019-06-07"</span>
</code></pre><p>Obtiene la fecha y hora por defecto</p>
<pre><code><span class="hljs-meta"># Retorna tipo cadena</span>
fields.Datetime.now()
<span class="hljs-meta"># <span class="hljs-meta-string">&lt;class 'str'&gt;</span></span>
<span class="hljs-string">"2019-06-07 05:18:22"</span>
</code></pre><p>Función convierte la fecha y hora en cadena:</p>
<pre><code><span class="hljs-meta"># Retorna cadena</span>
fields.Datetime.to_string(<span class="hljs-number">2019</span><span class="hljs-number">-06</span><span class="hljs-number">-06</span> <span class="hljs-number">18</span>:<span class="hljs-number">08</span>:<span class="hljs-number">14</span><span class="hljs-number">-05</span>:<span class="hljs-number">00</span>)
<span class="hljs-meta"># <span class="hljs-meta-string">&lt;class 'str'&gt;</span></span>
<span class="hljs-meta"># <span class="hljs-meta-string">"2019-06-06 18:08:14"</span></span>
</code></pre><p>Obtener los días de una diferencia de fechas:</p>
<pre><code>expired = fields.Date.from_string(item.expired_date) - fields.Date.from_string(fields.Date.context_today(self))
expired.days
<span class="hljs-comment"># 5</span>
</code></pre><p>Sumar días, semanas, meses a una fecha determinada:</p>
<pre><code>from dateutil.relativedelta import relativedelta
<span class="hljs-comment"># Suma 5 días</span>
expired_date = fields.Datetime.from_string(item.delivery) + relativedelta(days=5)
<span class="hljs-comment"># Suma 2 semanas</span>
expired_date = fields.Datetime.from_string(item.delivery) + relativedelta(days=7 * 2)
<span class="hljs-comment"># Suma 3 meses</span>
expired_date = fields.Datetime.from_string(item.delivery) + relativedelta(months=3)
</code></pre><p>Inverso timezone:</p>
<pre><code>import pytz
tz = pytz.timezone(self.env.user.tz) <span class="hljs-keyword">if</span> self.env.user.tz <span class="hljs-keyword">else</span> pytz.utc
<span class="hljs-comment"># Obtiene la fecha tal cual esta en la base de datos</span>
check_<span class="hljs-keyword">in</span>_end_date = fields.Datetime.from_string(i.date_<span class="hljs-keyword">done</span>)
2019-06-06 23:08:14
<span class="hljs-comment"># Inverse datetime time zone</span>
<span class="hljs-comment"># Suma la zona horaria a la fecha y hora</span>
check_<span class="hljs-keyword">in</span>_end_date = tz.localize(check_<span class="hljs-keyword">in</span>_end_date).astimezone(pytz.utc)
2019-06-07 04:08:14+00:00
</code></pre><p>Obtener solo la fecha de un datetime</p>
<pre><code>dt = <span class="hljs-string">"2019-06-06 23:08:14"</span>
date = fields.<span class="hljs-type">Datetime</span>.to_string(fields.<span class="hljs-type">Datetime</span>.context_timestamp(<span class="hljs-keyword">self</span>, fields.<span class="hljs-type">Datetime</span>.from_string(dt)))[:<span class="hljs-number">10</span>]
<span class="hljs-built_in">print</span>(date)
<span class="hljs-string">"2019-06-06"</span>
</code></pre><p>Otra forma de convertir la fecha y hora a nuestra zona horaria:</p>
<pre><code><span class="hljs-keyword">import</span> pytz
from datetime <span class="hljs-keyword">import</span> datetime
from odoo.tools <span class="hljs-keyword">import</span> DEFAULT_SERVER_DATETIME_FORMAT

dt = <span class="hljs-number">2019</span>-<span class="hljs-number">06</span>-<span class="hljs-number">06</span> <span class="hljs-number">23</span>:<span class="hljs-number">08</span>:<span class="hljs-number">14</span>
user_tz = pytz.timezone(<span class="hljs-keyword">self</span>.env.context.<span class="hljs-keyword">get</span>('tz') or <span class="hljs-keyword">self</span>.env.user.tz or '<span class="hljs-type">UTC'</span>)
date_tz = pytz.<span class="hljs-type">UTC</span>.localize(datetime.strptime(dt, <span class="hljs-type">DEFAULT_SERVER_DATETIME_FORMAT</span>)).astimezone(user_tz)

<span class="hljs-built_in">print</span>(date_tz)
# &lt;<span class="hljs-class"><span class="hljs-keyword">class</span> '<span class="hljs-title">datetime</span>.<span class="hljs-title">datetime</span>'&gt;
2019-06-06 18:08:14-05:00</span>
</code></pre><p>Formato por defecto de fecha y hora:</p>
<pre><code>from odoo.tools import DEFAULT_SERVER_DATETIME_FORMAT, DEFAULT_SERVER_DATE_FORMAT
<span class="hljs-string">"%Y-%m-%d %H:%M:%S"</span>
<span class="hljs-string">"%Y-%m-%d"</span>
</code></pre><p>Convertir al formato según tu idioma o lenguaje:</p>
<pre><code><span class="hljs-keyword">from</span> datetime <span class="hljs-keyword">import</span> datetime
<span class="hljs-keyword">from</span> odoo.tools <span class="hljs-keyword">import</span> DEFAULT_SERVER_DATE_FORMAT

<span class="hljs-comment"># date = '2019-06-06'</span>
<span class="hljs-comment"># record_lang.date_format = '%d/%m/%Y'</span>
lang = self._context.get(<span class="hljs-string">"lang"</span>)
record_lang = self.env[<span class="hljs-string">"res.lang"</span>].search([(<span class="hljs-string">"code"</span>, <span class="hljs-string">"="</span>, lang)], limit=<span class="hljs-number">1</span>)
format_date = datetime.strptime(date, DEFAULT_SERVER_DATE_FORMAT).strftime(record_lang.date_format)

<span class="hljs-comment"># Salida</span>
print(format_date)
<span class="hljs-string">'06/06/2019'</span>
</code></pre>]]></content:encoded></item></channel></rss>