<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Abraham</title>
    <description>The latest articles on Forem by Abraham (@drownie).</description>
    <link>https://forem.com/drownie</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1147153%2F96854c7e-20df-4a4e-bca3-e2912fffa9b3.png</url>
      <title>Forem: Abraham</title>
      <link>https://forem.com/drownie</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/drownie"/>
    <language>en</language>
    <item>
      <title>Odoo Docker fix print bug</title>
      <dc:creator>Abraham</dc:creator>
      <pubDate>Sat, 19 Jul 2025 10:28:12 +0000</pubDate>
      <link>https://forem.com/drownie/odoo-docker-fix-print-bug-3phj</link>
      <guid>https://forem.com/drownie/odoo-docker-fix-print-bug-3phj</guid>
      <description>&lt;p&gt;If you've followed my previous tutorial on &lt;a href="https://dev.to/drownie/odoo17-installation-docker-572"&gt;how to install Odoo 17 using Docker&lt;/a&gt;, you might have encountered an issue where &lt;code&gt;wkhtmltopdf&lt;/code&gt; doesn't work properly. This is a common problem many face during PDF generation, and it’s caused by a &lt;code&gt;wkhtmltopdf&lt;/code&gt; bug when running inside certain Docker environments.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Problem
&lt;/h3&gt;

&lt;p&gt;When generating PDFs in Odoo (e.g., for invoices or reports), the result might look broken — not only is the &lt;strong&gt;header missing&lt;/strong&gt;, but also the &lt;strong&gt;CSS and overall styling fail to load properly&lt;/strong&gt;. This typically happens because &lt;code&gt;wkhtmltopdf&lt;/code&gt; cannot access the correct internal URLs or assets during rendering in a Docker container.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftifk5gi0p711fqogf4xl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftifk5gi0p711fqogf4xl.png" alt="Wkhtml error" width="800" height="29"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Broken PDF example:
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy9yj3b4km8ntf1svx6zn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy9yj3b4km8ntf1svx6zn.png" alt="Broken PDF example" width="800" height="460"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  The Solution
&lt;/h3&gt;

&lt;p&gt;To fix this issue, you just need to &lt;strong&gt;add a system parameter&lt;/strong&gt; in Odoo's settings:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Navigate to &lt;strong&gt;Settings&lt;/strong&gt; → &lt;strong&gt;Technical&lt;/strong&gt; → &lt;strong&gt;Parameters&lt;/strong&gt; → &lt;strong&gt;System Parameters&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Add the following parameter:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl01mp0713nsq63hdkrne.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl01mp0713nsq63hdkrne.png" alt="System Parameter" width="800" height="118"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 If you don’t see the "System Parameters" menu, make sure you have activated developer mode.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4&gt;
  
  
  Fixed PDF
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy3ykbyn0jvsvpvn6k7xm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy3ykbyn0jvsvpvn6k7xm.png" alt="Fixed PDF" width="800" height="504"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;While &lt;code&gt;wkhtmltopdf&lt;/code&gt; bugs can be frustrating, this quick fix will save you hours of troubleshooting. Once you set the &lt;code&gt;report.url&lt;/code&gt; parameter, your reports should render perfectly with the correct headers, styles, and layout. This is especially important because printing is deeply integrated across many Odoo modules from quotations to logistics.&lt;/p&gt;

</description>
      <category>odoo</category>
      <category>bugfix</category>
      <category>docker</category>
    </item>
    <item>
      <title>Odoo Developer 101: OOP</title>
      <dc:creator>Abraham</dc:creator>
      <pubDate>Sat, 12 Jul 2025 12:43:15 +0000</pubDate>
      <link>https://forem.com/drownie/odoo-developer-101-oop-4o8</link>
      <guid>https://forem.com/drownie/odoo-developer-101-oop-4o8</guid>
      <description>&lt;h2&gt;
  
  
  &lt;strong&gt;OOP Definitions&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;OOP(Object Oriented Programming) is a programming paradigm not only in Odoo but in the overall programming world. To better understand this OOP you can use blueprint analogy. Imagine we're building a car. &lt;/p&gt;

&lt;p&gt;A car consists of various parts tires, chassis, and body. Each has its own purposes and properties(e.g., a tire has material, size, and tread pattern). &lt;/p&gt;

&lt;p&gt;In programming, these components can be modeled as classes, which act as blueprints for creating objects. This approach allows developers to break down a complex system into manageable, reusable components.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;OOP in Odoo&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Odoo is built entirely around OOP principles. When you create a new model (e.g., &lt;code&gt;res.partner&lt;/code&gt;), you're creating a class that inherits from a base class (&lt;code&gt;models.Model&lt;/code&gt;). &lt;/p&gt;

&lt;p&gt;This allows for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Code reuse&lt;/li&gt;
&lt;li&gt;Extensibility&lt;/li&gt;
&lt;li&gt;Better organization&lt;/li&gt;
&lt;li&gt;Easier debugging and maintenance&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Advantages of OOP in Odoo&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. &lt;strong&gt;Modularity &amp;amp; Maintainability&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Each component or class handles one responsibility, as a developer we can be more focused when developing or debugging the code.&lt;/p&gt;

&lt;p&gt;For example a login system can be divided into component like this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Database Access&lt;/strong&gt; - manage reading/writing user data&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Authentication&lt;/strong&gt; - handle login validation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;UI Handling&lt;/strong&gt; - manage user interaction and input flow&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  2. &lt;strong&gt;Inheritance (Blueprint Functionality)&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Previously I said that OOP is like a blueprint in a big system. This mean a blueprint can be extended or used in creating a specified system. &lt;/p&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;BaseModel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Model&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;_abstract&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;
    &lt;span class="n"&gt;create_date&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;fields&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;write_date&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;fields&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;User&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BaseModel&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;fields&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Char&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Car&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BaseModel&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;model_type&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;fields&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Char&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here, User and Car both inherit the fields create_date and write_date from BaseModel. This prevents code duplication.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;ℹ️ In OOP terms, &lt;code&gt;BaseModel&lt;/code&gt; is the &lt;strong&gt;parent class&lt;/strong&gt;, while &lt;code&gt;User&lt;/code&gt; and &lt;code&gt;Car&lt;/code&gt; are &lt;strong&gt;child classes&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  3. &lt;strong&gt;Overriding&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;As we discussed earlier, inheritance allows a child class to reuse methods from its parent class. However, sometimes we don’t want to use the inherited version of a method because it doesn’t suit the specific behavior we need. So overriding can be used for this issue. &lt;/p&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;BaseModel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Model&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;print_info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;This is a base model&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;User&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BaseModel&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;print_info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;This is a user model&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Car&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BaseModel&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;print_info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;This is a car model&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, calling &lt;code&gt;print_info()&lt;/code&gt; on a &lt;code&gt;User&lt;/code&gt; or &lt;code&gt;Car&lt;/code&gt; instance will execute their specific version, not the one from &lt;code&gt;BaseModel&lt;/code&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;🔸 In Odoo and Python, the &lt;strong&gt;child class method always overrides the parent&lt;/strong&gt; if they share the same method name.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  4. &lt;strong&gt;Method Extension&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Previously we override the whole method removing the parent method. In some cases, we only want to add extra behavior to a method but still keep the original functionality. Instead of completely overriding the method, we can extend it using Python’s &lt;code&gt;super()&lt;/code&gt; function. The principle is simple we will called the previous method and add our piece of code.&lt;/p&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;BaseModel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Model&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;vals&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Base write logic&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;super&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BaseModel&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;vals&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;User&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BaseModel&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;vals&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;super&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;User&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;vals&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Additional logic after writing User&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;res&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Car&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BaseModel&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;vals&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Custom logic before writing Car&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;super&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Car&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;vals&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;res&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This pattern is common in Odoo when you want to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Call the original logic (&lt;code&gt;super()&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Add logging, triggers, or other custom behaviors&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Closing&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Understanding Object-Oriented Programming is essential for every Odoo developer, as it forms the foundation of how Odoo is built and extended. Concepts like inheritance, overriding, and method extension enable you to write clean, modular, and maintainable code while leveraging the full power of the Odoo framework. Whether you're creating new models or customizing existing ones, thinking in terms of objects will help you build scalable solutions and contribute more effectively to any Odoo project.&lt;/p&gt;

</description>
      <category>odoo</category>
      <category>oop</category>
      <category>programming</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Odoo 101: View</title>
      <dc:creator>Abraham</dc:creator>
      <pubDate>Thu, 26 Jun 2025 07:56:33 +0000</pubDate>
      <link>https://forem.com/drownie/odoo-101-view-2c43</link>
      <guid>https://forem.com/drownie/odoo-101-view-2c43</guid>
      <description>&lt;p&gt;If you're just starting with Odoo development, understanding how views, menus, and UI logic work is essential. In this guide, we’ll walk through the basics of creating views, linking them to menus and actions, understanding different view types, and how to extend existing views from other modules.&lt;/p&gt;




&lt;h3&gt;
  
  
  📁 1. How to Create a View
&lt;/h3&gt;

&lt;h4&gt;
  
  
  🔹 View Directory Structure
&lt;/h4&gt;

&lt;p&gt;In your custom module, organize the views like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;your_module/
├── __init__.py
├── __manifest__.py
├── models/
├── views/
│   └── library_book_views.xml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  🔹 Define XML View
&lt;/h4&gt;

&lt;p&gt;Example of a basic form and tree view:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;odoo&amp;gt;&lt;/span&gt;
    &lt;span class="c"&gt;&amp;lt;!-- Tree View --&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;record&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"view_library_book_tree"&lt;/span&gt; &lt;span class="na"&gt;model=&lt;/span&gt;&lt;span class="s"&gt;"ir.ui.view"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;field&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"name"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;library.book.tree&lt;span class="nt"&gt;&amp;lt;/field&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;field&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"model"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;library.book&lt;span class="nt"&gt;&amp;lt;/field&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;field&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"arch"&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"xml"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;tree&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;field&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"name"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;field&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"author"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;/tree&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/field&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/record&amp;gt;&lt;/span&gt;

    &lt;span class="c"&gt;&amp;lt;!-- Form View --&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;record&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"view_library_book_form"&lt;/span&gt; &lt;span class="na"&gt;model=&lt;/span&gt;&lt;span class="s"&gt;"ir.ui.view"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;field&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"name"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;library.book.form&lt;span class="nt"&gt;&amp;lt;/field&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;field&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"model"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;library.book&lt;span class="nt"&gt;&amp;lt;/field&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;field&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"arch"&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"xml"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;form&lt;/span&gt; &lt;span class="na"&gt;string=&lt;/span&gt;&lt;span class="s"&gt;"Library Book"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;group&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;field&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"name"&lt;/span&gt; &lt;span class="na"&gt;readonly=&lt;/span&gt;&lt;span class="s"&gt;"1"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;field&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"author"&lt;/span&gt; &lt;span class="na"&gt;invisible=&lt;/span&gt;&lt;span class="s"&gt;"state == 'draft'"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;/group&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;/form&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/field&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/record&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/odoo&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  🔹 Register View in Manifest
&lt;/h4&gt;

&lt;p&gt;In &lt;code&gt;__manifest__.py&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;data&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;views/library_book_views.xml&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;⚠️ Important Note: Order of XML Files in Manifest&lt;/p&gt;

&lt;p&gt;When adding XML files to the data section of your &lt;strong&gt;manifest&lt;/strong&gt;.py, make sure that any files defining record IDs that will be referenced later (like menus, views, or actions) are listed first.&lt;/p&gt;

&lt;p&gt;For example, if a view references a menuitem or action by id, the XML file containing that referenced record must appear above the current file in the list.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;data&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;views/menu.xml&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;             &lt;span class="c1"&gt;# Defines menuitem IDs
&lt;/span&gt;    &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;views/library_book_views.xml&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="c1"&gt;# Uses menuitem/action/component IDs defined above
&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you reverse the order and library_book_views.xml tries to attach to a menuitem that hasn't been defined yet, Odoo will raise a ValueError because it cannot find the referenced ID.&lt;/p&gt;




&lt;h3&gt;
  
  
  🧭 2. Menu Items and Submenus
&lt;/h3&gt;

&lt;p&gt;Menus in Odoo follow a hierarchy and sequence.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- Root Menu --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;menuitem&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"library_menu_root"&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"Library"&lt;/span&gt; &lt;span class="na"&gt;sequence=&lt;/span&gt;&lt;span class="s"&gt;"10"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;

&lt;span class="c"&gt;&amp;lt;!-- Submenu --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;menuitem&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"library_menu_books"&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"Books"&lt;/span&gt;
          &lt;span class="na"&gt;parent=&lt;/span&gt;&lt;span class="s"&gt;"library_menu_root"&lt;/span&gt; &lt;span class="na"&gt;sequence=&lt;/span&gt;&lt;span class="s"&gt;"20"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;sequence&lt;/code&gt;: lower numbers show higher in the menu&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;parent&lt;/code&gt;: defines nesting (submenu)&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  ⚙️ 3. Actions and View Types (&lt;code&gt;act_window&lt;/code&gt;)
&lt;/h3&gt;

&lt;p&gt;To make a menu open a specific model/view, define an action:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;record&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"action_library_book"&lt;/span&gt; &lt;span class="na"&gt;model=&lt;/span&gt;&lt;span class="s"&gt;"ir.actions.act_window"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;field&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"name"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Books&lt;span class="nt"&gt;&amp;lt;/field&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;field&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"res_model"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;library.book&lt;span class="nt"&gt;&amp;lt;/field&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;field&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"view_mode"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;tree,form&lt;span class="nt"&gt;&amp;lt;/field&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/record&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;menuitem&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"library_menu_books"&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"Books"&lt;/span&gt;
          &lt;span class="na"&gt;parent=&lt;/span&gt;&lt;span class="s"&gt;"library_menu_root"&lt;/span&gt; &lt;span class="na"&gt;action=&lt;/span&gt;&lt;span class="s"&gt;"action_library_book"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  👓 4. View Types in Odoo
&lt;/h3&gt;

&lt;h4&gt;
  
  
  📄 tree (List View)
&lt;/h4&gt;

&lt;p&gt;Displays a list of records. Can include:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;tree&lt;/span&gt; &lt;span class="na"&gt;editable=&lt;/span&gt;&lt;span class="s"&gt;"bottom"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;field&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"name"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/tree&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  📝 form
&lt;/h4&gt;

&lt;p&gt;Used for creating or editing a record.&lt;/p&gt;

&lt;p&gt;Tips:&lt;br&gt;
When we use many2many, one2many we can display them using tree.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;form&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;field&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"name"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;field&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"line_ids"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;tree&lt;/span&gt; &lt;span class="na"&gt;editable=&lt;/span&gt;&lt;span class="s"&gt;"bottom"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;field&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"product_id"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;field&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"quantity"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/tree&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/field&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/form&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  🧱 kanban
&lt;/h4&gt;

&lt;p&gt;Used for stage-based workflows (like CRM pipelines).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;kanban&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;templates&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;t&lt;/span&gt; &lt;span class="na"&gt;t-name=&lt;/span&gt;&lt;span class="s"&gt;"kanban-box"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;div&amp;gt;&amp;lt;strong&amp;gt;&amp;lt;field&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"name"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&amp;lt;/strong&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/t&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/templates&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/kanban&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  🔍 search
&lt;/h4&gt;

&lt;p&gt;Adds filters and group-by options.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;search&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;field&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"name"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;filter&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"draft"&lt;/span&gt; &lt;span class="na"&gt;string=&lt;/span&gt;&lt;span class="s"&gt;"Draft"&lt;/span&gt; &lt;span class="na"&gt;domain=&lt;/span&gt;&lt;span class="s"&gt;"[('state','=','draft')]"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/search&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  🎛️ 5. Widgets
&lt;/h3&gt;

&lt;p&gt;Widgets control how a field appears in the UI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;field&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"priority"&lt;/span&gt; &lt;span class="na"&gt;widget=&lt;/span&gt;&lt;span class="s"&gt;"priority"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;field&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"image"&lt;/span&gt; &lt;span class="na"&gt;widget=&lt;/span&gt;&lt;span class="s"&gt;"image"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;field&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"tags"&lt;/span&gt; &lt;span class="na"&gt;widget=&lt;/span&gt;&lt;span class="s"&gt;"many2many_tags"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;List of widgets &lt;a href=""&gt;here&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  🔁 6. Inheritance from Other Module
&lt;/h3&gt;

&lt;p&gt;You can inherit and modify views using &lt;code&gt;inherit_id&lt;/code&gt; and &lt;code&gt;xpath&lt;/code&gt;. You can use inherit component when you want to modify component attributes or replacing component.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;record&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"view_partner_form_inherit"&lt;/span&gt; &lt;span class="na"&gt;model=&lt;/span&gt;&lt;span class="s"&gt;"ir.ui.view"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;field&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"name"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;res.partner.form.inherit&lt;span class="nt"&gt;&amp;lt;/field&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;field&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"model"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;res.partner&lt;span class="nt"&gt;&amp;lt;/field&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;field&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"inherit_id"&lt;/span&gt; &lt;span class="na"&gt;ref=&lt;/span&gt;&lt;span class="s"&gt;"base.view_partner_form"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;field&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"arch"&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"xml"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;xpath&lt;/span&gt; &lt;span class="na"&gt;expr=&lt;/span&gt;&lt;span class="s"&gt;"//field[@name='phone']"&lt;/span&gt; &lt;span class="na"&gt;position=&lt;/span&gt;&lt;span class="s"&gt;"after"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;field&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"x_loyalty_points"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/xpath&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/field&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/record&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  🧩 7. QWeb Sneak Peek (Teaser)
&lt;/h3&gt;

&lt;p&gt;QWeb is used for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;PDF reports&lt;/li&gt;
&lt;li&gt;Kanban customization&lt;/li&gt;
&lt;li&gt;Client-side rendering&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A teaser example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;t&lt;/span&gt; &lt;span class="na"&gt;t-name=&lt;/span&gt;&lt;span class="s"&gt;"MyCustomTemplate"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"my-box"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;t&lt;/span&gt; &lt;span class="na"&gt;t-esc=&lt;/span&gt;&lt;span class="s"&gt;"doc.name"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/t&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;📌 &lt;em&gt;More of QWeb will be covered in Odoo 101: QWeb&lt;/em&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  ✅ Final Tips
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Enable &lt;strong&gt;developer mode&lt;/strong&gt; to inspect view IDs and structure&lt;/li&gt;
&lt;li&gt;Always test your views with real data for usability&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>odoo</category>
      <category>erp</category>
      <category>programming</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Odoo CE: Automatic Inventory Valuation</title>
      <dc:creator>Abraham</dc:creator>
      <pubDate>Sat, 14 Jun 2025 09:01:14 +0000</pubDate>
      <link>https://forem.com/drownie/odoo-ce-automatic-inventory-valuation-5c0g</link>
      <guid>https://forem.com/drownie/odoo-ce-automatic-inventory-valuation-5c0g</guid>
      <description>&lt;h3&gt;
  
  
  What is Odoo Automatic Inventory Valuation?
&lt;/h3&gt;

&lt;p&gt;Automatic Inventory Valuation in Odoo allows stock movements (such as receipts, deliveries, and internal transfers) to automatically generate corresponding accounting journal entries. This ensures that your inventory valuation is always accurate and reflects in your financial reports in real-time.&lt;/p&gt;

&lt;p&gt;Previously, this feature was restricted to the Odoo Enterprise Edition. However, starting with &lt;strong&gt;Odoo 17&lt;/strong&gt;, the &lt;strong&gt;Community Edition&lt;/strong&gt; now supports automatic valuation technically — although it still lacks the full UI to enable it directly. With some manual setup, you can fully use this feature without paying for Enterprise.&lt;/p&gt;

&lt;p&gt;📖 &lt;strong&gt;Read more in the official Odoo documentation:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;a href="https://www.odoo.com/documentation/17.0/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/inventory_valuation_config.html" rel="noopener noreferrer"&gt;Inventory Valuation Configuration — Odoo 17.0 Docs&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  How to Enable Automatic Inventory Valuation in Odoo Community
&lt;/h3&gt;

&lt;p&gt;Since the interface to toggle this feature is hidden in Community, you must manually enable the required groups and permissions.&lt;/p&gt;

&lt;h4&gt;
  
  
  Step-by-step Instructions
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;1. Activate Stock Accounting Automatic for the user:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Navigate to:
 &lt;code&gt;Settings &amp;gt; Users &amp;amp; Companies &amp;gt; Users&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Select a user (e.g., admin).&lt;/li&gt;
&lt;li&gt;Under the &lt;strong&gt;Technical&lt;/strong&gt; tab, manually enable the group:
 &lt;code&gt;Stock Accounting Automatic&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo0n2bwp46cjh1xxji673.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo0n2bwp46cjh1xxji673.png" alt="Activate Technical Group" width="800" height="403"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Show Accounting Features in Inventory Settings:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Navigate to:
 &lt;code&gt;Settings &amp;gt; Users &amp;amp; Companies &amp;gt; Groups&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Search for:
 &lt;code&gt;"Show Accounting Features - Readonly"&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Add the previously selected user to this group.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzcc6zvlotak80881vj2p.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzcc6zvlotak80881vj2p.png" alt="Add User To the Group" width="800" height="403"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Configure Product Category for Automated Valuation:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Navigate to:
 &lt;code&gt;Inventory &amp;gt; Configuration &amp;gt; Product Categories&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Select or create a product category.&lt;/li&gt;
&lt;li&gt;Under the &lt;strong&gt;Inventory Valuation&lt;/strong&gt; section:

&lt;ul&gt;
&lt;li&gt;Set &lt;strong&gt;Inventory Valuation&lt;/strong&gt; to: &lt;code&gt;Automated&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Set &lt;strong&gt;Costing Method&lt;/strong&gt;: &lt;code&gt;Standard&lt;/code&gt;, &lt;code&gt;FIFO&lt;/code&gt;, etc.&lt;/li&gt;
&lt;li&gt;Choose the appropriate:

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Inventory Valuation Account&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Stock Input/Output Accounts&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Inventory Journal&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fociz4ktdorlxayk6cdhh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fociz4ktdorlxayk6cdhh.png" alt="Change the product category to automated" width="800" height="403"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Additional Notes
&lt;/h2&gt;

&lt;p&gt;🧩 &lt;strong&gt;Enable Full Accounting in Odoo Community&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Odoo Community Edition comes with limited accounting features by default. To unlock full accounting functionality (like journals, budgets, P&amp;amp;L reports, and more), consider installing this excellent community module:&lt;/p&gt;

&lt;p&gt;🔗 &lt;strong&gt;Base Accounting Kit&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;a href="https://apps.odoo.com/apps/modules/17.0/base_accounting_kit" rel="noopener noreferrer"&gt;https://apps.odoo.com/apps/modules/17.0/base_accounting_kit&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This module enhances Community Edition with much of the functionality typically found in Enterprise, making it ideal for real-world business use.&lt;/p&gt;




&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;With a few manual steps, &lt;strong&gt;Odoo Community Edition&lt;/strong&gt; can now support &lt;strong&gt;automatic inventory valuation&lt;/strong&gt; — a significant feature for accurate, real-time stock accounting. This makes Odoo Community much more powerful for SMEs that require integrated inventory and accounting without paying for Enterprise Edition.&lt;/p&gt;

</description>
      <category>odoo</category>
      <category>erp</category>
      <category>accounting</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Odoo 101: Create a Module</title>
      <dc:creator>Abraham</dc:creator>
      <pubDate>Sun, 01 Jun 2025 12:41:02 +0000</pubDate>
      <link>https://forem.com/drownie/odoo-101-create-a-module-1fd2</link>
      <guid>https://forem.com/drownie/odoo-101-create-a-module-1fd2</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Hello everyone today I want to share about Odoo Development. In this tutorial I will cover about creating module, and install it on your local Odoo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Creating a new module
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Create module dir&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In this steps we must create a dir file in the addons directory.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Requirement:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Lowercase only&lt;/strong&gt;, Example: sale_order, not SaleOrder or Sale-Order.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Underscores for separation&lt;/strong&gt;, Use underscores (_) to separate words instead of dashes or camelCase. Example: helpdesk_repair, product_warranty.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Avoid special characters&lt;/strong&gt; Only use letters, numbers, and underscores. Avoid spaces, dashes, dots, or other symbols.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Unique across the Odoo instance&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;ps: addons directory can be seen on &lt;code&gt;odoo.conf&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;tips: dir name is very important because it will be used when a module is being depend on.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;2. Create Manifest file&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In this steps we will add &lt;code&gt;__manifest__.py&lt;/code&gt; file in the root of the module directory.&lt;/p&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sale_dashboard
|
└── __manifest__.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Below is manifest example&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Application&lt;/span&gt; &lt;span class="nc"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;version&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Application&lt;/span&gt; &lt;span class="nc"&gt;Version&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;summary&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Application&lt;/span&gt; &lt;span class="nc"&gt;Summary&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;description&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Application&lt;/span&gt; &lt;span class="nc"&gt;Description&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;author&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Author&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;depends&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Dependency&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;category&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Application&lt;/span&gt; &lt;span class="nc"&gt;Category&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;data&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Data&lt;/span&gt; &lt;span class="nc"&gt;File&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
    &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;assets&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Static&lt;/span&gt; &lt;span class="nf"&gt;asset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;license&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Application&lt;/span&gt; &lt;span class="nc"&gt;License&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;application&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Is&lt;/span&gt; &lt;span class="n"&gt;this&lt;/span&gt; &lt;span class="n"&gt;application&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;technical&lt;/span&gt; &lt;span class="nf"&gt;app&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Bool&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;depends: Specify dependency modules of the current module. When the module is installed, the depend module will automatically installed.&lt;/li&gt;
&lt;li&gt;license: Specify license for the module. Supported license: AGPL-3, GPL-3, LGPL-3, OPL-1, Other OSI approved licence, Other proprietary, OEEL-1. &lt;a href="https://apps.odoo.com/apps/faq#maintainer_faq_04" rel="noopener noreferrer"&gt;More information here&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;3. Install module into Odoo&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Firstly, we must open the Odoo in your web browser. In my case I use &lt;code&gt;http://localhost:10017/web&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnjchgdb9rbt7mkb1gj98.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnjchgdb9rbt7mkb1gj98.png" alt="Odoo App interface" width="800" height="427"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Secondly, we activate the debug mode. Debug mode can be activated by adding &lt;code&gt;?debug=1&lt;/code&gt; in the url. After activating debug mode, we can now see &lt;code&gt;Update App List&lt;/code&gt; button.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuwim43q2uxfegdde9r7x.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuwim43q2uxfegdde9r7x.png" alt="Odoo interface (debug mode)" width="800" height="427"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After clicking &lt;code&gt;Update App List&lt;/code&gt;, a window will be opened and we can update the app list.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fej9ympap7uqkd0ekbzha.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fej9ympap7uqkd0ekbzha.png" alt="Update app list window" width="800" height="427"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Updating app list could be used to insert new added app into Odoo app.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Finally, we can search the app by using the search bar.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3rbgyaw65h5s7bxtzkum.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3rbgyaw65h5s7bxtzkum.png" alt="Installing Module" width="800" height="427"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;When searching odoo module we can use the name from module directory or the name from manifest file.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Final Words
&lt;/h2&gt;

&lt;p&gt;This is the end of tutorial, there are still a lot of things to covers for example creating a view, adding icons, creating models, wizard, depending on other module, Qweb, uploading module to Odoo store, etc. I will continue about Odoo tutorial in the next article.&lt;/p&gt;

</description>
      <category>odoo</category>
      <category>erp</category>
      <category>programming</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Odoo Introduction</title>
      <dc:creator>Abraham</dc:creator>
      <pubDate>Sat, 31 May 2025 04:18:05 +0000</pubDate>
      <link>https://forem.com/drownie/odoo-introduction-424f</link>
      <guid>https://forem.com/drownie/odoo-introduction-424f</guid>
      <description>&lt;h2&gt;
  
  
  Unlocking Business Potential: A Comprehensive Introduction to Odoo
&lt;/h2&gt;

&lt;p&gt;In today's fast-paced business landscape, integrated management solutions are no longer a luxury but a necessity. Companies are constantly seeking ways to streamline operations, enhance efficiency, and gain a holistic view of their processes. Enter Odoo, a powerful suite of open-source business management software that has rapidly gained traction worldwide. This article delves into the core of Odoo, exploring its definition, key features, how it stacks up against competitors, and what to expect regarding its learning curve.&lt;/p&gt;

&lt;h3&gt;
  
  
  What is Odoo?
&lt;/h3&gt;

&lt;p&gt;Odoo, originally known as OpenERP, stands for "On-Demand Open Object." It is an all-in-one business management software that offers a comprehensive suite of integrated applications to manage various business processes. Unlike traditional siloed software, Odoo operates on a unified platform, allowing seamless data flow and communication across different departments.&lt;/p&gt;

&lt;p&gt;At its heart, Odoo's philosophy revolves around providing a modular yet fully integrated system. Businesses can select and implement only the applications (or "modules") they need, ranging from customer relationship management (CRM) and accounting to manufacturing, inventory, human resources, and e-commerce. This modularity ensures flexibility and scalability, allowing companies to start small and expand their Odoo implementation as their needs evolve.&lt;/p&gt;

&lt;p&gt;Odoo is available in two main editions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Odoo Community:&lt;/strong&gt; The open-source, free edition that provides core functionalities and is maintained by the Odoo community.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Odoo Enterprise:&lt;/strong&gt; A proprietary, paid edition that offers additional features, mobile app access, dedicated support, and hosting options, catering to larger businesses with more complex requirements.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Key Features and Modules
&lt;/h3&gt;

&lt;p&gt;Odoo's strength lies in its extensive range of integrated applications, each designed to address specific business needs. Here's a glimpse into some of its most prominent modules:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqsx8wufp4e0klnyveid7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqsx8wufp4e0klnyveid7.png" alt="Odoo features and modules" width="800" height="196"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;These modules work synergistically, eliminating data redundancy and providing real-time insights across the organization. For instance, a sales order placed in the Sales module can automatically trigger inventory updates, accounting entries, and manufacturing orders if needed.&lt;/p&gt;

&lt;h3&gt;
  
  
  Odoo in Comparison: Standing Against the Giants
&lt;/h3&gt;

&lt;p&gt;Odoo operates in a competitive landscape, vying with established Enterprise Resource Planning (ERP) solutions. Here's a comparison with some of its prominent competitors:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;SAP Business One:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Focus:&lt;/strong&gt; Geared towards small and medium-sized enterprises (SMEs), offering a comprehensive suite for various business functions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Strengths:&lt;/strong&gt; Industry-specific solutions, robust financial management, strong global presence.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Weaknesses:&lt;/strong&gt; Can be costly, requires significant implementation expertise, less flexible for deep customization compared to Odoo's open-source nature.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Odoo vs. SAP B1:&lt;/strong&gt; Odoo generally offers more flexibility due to its open-source nature and a lower entry cost, especially with the Community edition. SAP B1 is often seen as more complex to implement and maintain, but provides deep industry-specific functionalities out-of-the-box.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;NetSuite (Oracle NetSuite):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Focus:&lt;/strong&gt; Cloud-based ERP for businesses of all sizes, known for its strong financial and e-commerce capabilities.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Strengths:&lt;/strong&gt; Highly scalable, powerful reporting, robust financial management, extensive e-commerce features.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Weaknesses:&lt;/strong&gt; High cost, complex implementation, can be overkill for smaller businesses.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Odoo vs. NetSuite:&lt;/strong&gt; NetSuite is a premium cloud-native solution with a higher price tag. Odoo provides a more cost-effective alternative with greater customization potential and a more flexible deployment model (on-premise or cloud).&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Microsoft Dynamics 365:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Focus:&lt;/strong&gt; A suite of modular cloud-based business applications, combining ERP and CRM functionalities.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Strengths:&lt;/strong&gt; Seamless integration with other Microsoft products (Office 365, Power BI), strong analytics, familiar user interface for Microsoft users.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Weaknesses:&lt;/strong&gt; Can be complex and costly, requires significant customization for specific business needs, licensing can be intricate.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Odoo vs. Dynamics 365:&lt;/strong&gt; Odoo offers a more unified and typically less expensive solution for end-to-end business management. Dynamics 365 excels in deep integration within the Microsoft ecosystem, but its modular nature can lead to higher cumulative costs and integration challenges if not managed carefully.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;ERPNext:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Focus:&lt;/strong&gt; Another open-source ERP solution, often seen as a direct competitor to Odoo in the open-source space.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Strengths:&lt;/strong&gt; User-friendly interface, comprehensive features for SMEs, active community.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Weaknesses:&lt;/strong&gt; Smaller ecosystem of third-party apps compared to Odoo, less widespread adoption.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Odoo vs. ERPNext:&lt;/strong&gt; Both are excellent open-source choices. Odoo often has a larger community, more third-party apps, and a slightly more polished interface, while ERPNext is praised for its simplicity and ease of use.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Zoho One:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Focus:&lt;/strong&gt; A comprehensive suite of over 40 business applications, primarily targeting small and medium-sized businesses.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Strengths:&lt;/strong&gt; Affordable, vast array of integrated apps, good for businesses seeking an all-in-one suite without extensive customization.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Weaknesses:&lt;/strong&gt; Not a true ERP, more of a collection of business apps, deep customization is limited compared to Odoo.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Odoo vs. Zoho One:&lt;/strong&gt; Odoo is a true ERP system designed for integrated process management, offering deeper customization and scalability for complex workflows. Zoho One is a strong contender for businesses needing a broad set of integrated tools at an attractive price point, but it may lack the depth of an ERP.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Key Differentiators for Odoo:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Open-Source Advantage:&lt;/strong&gt; Offers unparalleled flexibility, transparency, and a vibrant community for support and development.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cost-Effectiveness:&lt;/strong&gt; The Community edition is free, and the Enterprise edition is generally more affordable than comparable proprietary solutions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Modularity &amp;amp; Scalability:&lt;/strong&gt; Allows businesses to grow into the system, adding modules as needed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Customization:&lt;/strong&gt; Highly customizable to fit unique business processes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Integration:&lt;/strong&gt; Designed for seamless integration between its own modules, and with external systems.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9lkd20obu2bscnun739g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9lkd20obu2bscnun739g.png" alt="Odoo price comparison" width="550" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  The Odoo Learning Curve
&lt;/h3&gt;

&lt;p&gt;While Odoo boasts a user-friendly interface for basic operations, mastering its full potential requires dedication. The learning curve can vary significantly depending on the user's technical aptitude, the complexity of the desired implementation, and the specific modules being utilized.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Common Challenges:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Initial Setup and Configuration:&lt;/strong&gt; Setting up Odoo to perfectly align with specific business workflows can be intricate, requiring a clear understanding of business processes and Odoo's capabilities.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Customization Complexity:&lt;/strong&gt; While highly customizable, deep customizations often require technical expertise in Python and Odoo's XML-based development framework.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Varying Quality of Third-Party Apps:&lt;/strong&gt; The Odoo App Store offers a plethora of third-party modules, but their quality and compatibility can vary.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Understanding Business Flows:&lt;/strong&gt; Users need to understand how different modules interact and how data flows through the system to leverage Odoo effectively.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Advantages that Ease the Learning:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Intuitive User Interface:&lt;/strong&gt; Odoo's modern and clean interface makes basic navigation and data entry relatively straightforward.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Modularity:&lt;/strong&gt; Users can learn one module at a time, gradually expanding their knowledge.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Comprehensive Documentation:&lt;/strong&gt; Odoo provides extensive official documentation and guides.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vibrant Community Support:&lt;/strong&gt; A large and active community offers forums, discussions, and shared solutions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Online Resources:&lt;/strong&gt; Numerous tutorials, videos, and blogs are available from both Odoo and third-party experts.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scalability:&lt;/strong&gt; The ability to start with core modules and gradually expand reduces the initial learning burden.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Odoo Learning Resources
&lt;/h3&gt;

&lt;p&gt;To navigate the Odoo learning curve effectively, a wealth of resources is available:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Official Odoo Documentation:&lt;/strong&gt; Comprehensive guides covering installation, configuration, and module functionalities.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Odoo eLearning and Certifications:&lt;/strong&gt; Odoo offers official training programs and certifications for various roles (functional, technical).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Odoo Community Forum:&lt;/strong&gt; An active platform where users and developers can ask questions, share knowledge, and find solutions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Odoo YouTube Channel:&lt;/strong&gt; Provides video tutorials and demonstrations of various features.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub Repository:&lt;/strong&gt; For developers, the source code is available on GitHub, allowing for deeper understanding and contributions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Third-Party Blogs and Tutorials:&lt;/strong&gt; Many Odoo partners and enthusiasts publish helpful articles, how-to guides, and video series.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Odoo Partners and Consultants:&lt;/strong&gt; For businesses seeking professional assistance, Odoo partners offer implementation, customization, and training services.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;Odoo stands as a compelling solution for businesses looking to unify and optimize their operations. Its open-source nature, modular design, and comprehensive suite of applications provide unparalleled flexibility and cost-effectiveness. While the learning curve requires dedication, the extensive array of available resources, coupled with a supportive community, makes mastering Odoo an achievable goal. By embracing Odoo, companies can unlock significant business potential, fostering greater efficiency, collaboration, and informed decision-making in the digital age.&lt;/p&gt;

</description>
      <category>odoo</category>
      <category>erp</category>
      <category>programming</category>
    </item>
    <item>
      <title>Tricks for Efficient Odoo Development</title>
      <dc:creator>Abraham</dc:creator>
      <pubDate>Thu, 19 Dec 2024 15:51:13 +0000</pubDate>
      <link>https://forem.com/drownie/tricks-for-efficient-odoo-development-3g7a</link>
      <guid>https://forem.com/drownie/tricks-for-efficient-odoo-development-3g7a</guid>
      <description>&lt;p&gt;Developing custom modules, widgets, or features in Odoo can be streamlined with the right tools and techniques. Here are some proven tricks that can make your development process more efficient and insightful:&lt;/p&gt;

&lt;h3&gt;
  
  
  Use the Search Feature in VSCode
&lt;/h3&gt;

&lt;p&gt;When working on Odoo development, the search functionality in VSCode or Other IDE can be invaluable for exploring the source code and understanding how things work under the hood.&lt;/p&gt;

&lt;h4&gt;
  
  
  Tips:
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;Activate Debug Mode

&lt;ul&gt;
&lt;li&gt;Use Odoo's debug mode to identify key information such as IDs, record names, or registry keys.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Search the Source Code

&lt;ul&gt;
&lt;li&gt;Search for relevant keywords in the source code to locate models, view IDs, or registry names.&lt;/li&gt;
&lt;li&gt;For instance, if you're working on a custom widget, you can refer to existing widgets as examples.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;br&gt;
Suppose you're developing a custom widget. To learn from the &lt;code&gt;color&lt;/code&gt; widget, you can search for the following code in VSCode:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;category("fields").add("color"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This search will reveal the implementation of the &lt;code&gt;color&lt;/code&gt; widget, allowing you to understand its structure and apply similar techniques to your widget.&lt;/p&gt;

&lt;h3&gt;
  
  
  Use ChatGPT or Other Large Language Models (LLMs)
&lt;/h3&gt;

&lt;p&gt;LLMs like ChatGPT are powerful tools for Odoo developers, offering quick guidance and examples to solve problems or implement new features.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to Leverage LLMs:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ask for sample code snippets or explanations for a feature you're trying to build.&lt;/li&gt;
&lt;li&gt;Use the responses as a reference or starting point for your implementation.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;br&gt;
When building a feature to search for customers by phone number, you might receive a snippet like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;odoo&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fields&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;api&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ResPartner&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Model&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;_inherit&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;res.partner&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;

    &lt;span class="nd"&gt;@api.model&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;name_search&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;operator&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;ilike&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;limit&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;args&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;partners&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;search&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
                &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;|&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;|&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;operator&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
                &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;phone&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;operator&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
                &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;mobile&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;operator&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;limit&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;limit&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;partners&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;search&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;limit&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;limit&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;partners&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;name_get&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then while exploring, you might realize that Odoo uses &lt;code&gt;_name_search&lt;/code&gt; instead of &lt;code&gt;name_search&lt;/code&gt;. This insight, combined with LLM guidance, significantly speeds up development.&lt;/p&gt;

&lt;h3&gt;
  
  
  Learn from Webs and Forums
&lt;/h3&gt;

&lt;p&gt;Online resources like the Odoo forums or dedicated blogs (e.g., Cybrosys) are treasure troves of knowledge. These platforms provide:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Real-world solutions to common problems.&lt;/li&gt;
&lt;li&gt;Tutorials for building a strong foundation in custom module development.&lt;/li&gt;
&lt;li&gt;Insights into debugging and performance optimization.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Read Logs for Debugging
&lt;/h3&gt;

&lt;p&gt;Logs are a developer’s best friend when identifying and fixing issues in custom modules. Odoo provides logs for the user, the logs path can be seen from the &lt;code&gt;odoo.conf&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tips for Reading Logs:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;QWeb and JavaScript Issues

&lt;ul&gt;
&lt;li&gt;Errors in QWeb templates or JavaScript will typically appear in the browser’s developer console.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Python Errors

&lt;ul&gt;
&lt;li&gt;Check the logs file to identify backend issues like missing fields or incorrect method calls.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;By analyzing logs, you can pinpoint errors quickly, reducing debugging time and effort.&lt;/p&gt;

&lt;h3&gt;
  
  
  Explore and Replicate Existing Features
&lt;/h3&gt;

&lt;p&gt;Rather than starting from scratch, study how similar features are implemented in the Odoo source code.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Search for widget implementations, controllers, or method overrides.&lt;/li&gt;
&lt;li&gt;Modify existing patterns to suit your custom requirements.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;By combining these techniques, you can navigate Odoo’s complexities with ease, build robust customizations, and enhance your development workflow.&lt;/p&gt;

</description>
      <category>erp</category>
      <category>odoo</category>
      <category>development</category>
    </item>
    <item>
      <title>Odoo17: Installation Docker</title>
      <dc:creator>Abraham</dc:creator>
      <pubDate>Mon, 02 Sep 2024 15:50:21 +0000</pubDate>
      <link>https://forem.com/drownie/odoo17-installation-docker-572</link>
      <guid>https://forem.com/drownie/odoo17-installation-docker-572</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Hello Everyone, I want to share with you guys about my experience in Odoo Development. In this article i will specifically share about the installation process for odoo17 in docker so we doesn't need to install too much dependencies.&lt;/p&gt;

&lt;h2&gt;
  
  
  Advantage and disadvantages using odoo docker
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Advantage:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Simple installation progress. &lt;/p&gt;

&lt;p&gt;Without docker we need to install a lot of dependencies, setting user, etc.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Disadvatage:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Hard to change the dependencies.&lt;/p&gt;

&lt;p&gt;In docker it is hard for us to change the dependencies. For example in Odoo 17.0 docker version it uses wkhtmltopdf v0.12.6 but it has bug where the header for invoice is invisible So we must downgrade it to wkhtmltopdf v0.12.5.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Create the docker compose file
&lt;/h2&gt;

&lt;p&gt;First we need to create the &lt;code&gt;compose.yml&lt;/code&gt; file in the root folder. We need to first configure the odoo docker image version according to available versions from this &lt;a href="https://hub.docker.com/_/odoo" rel="noopener noreferrer"&gt;documentation&lt;/a&gt;. In this tutorial I am using odoo:17.0 and make the odoo forward the port to 10017. Because Odoo is using postgreSQL as their db we can also add postgre db to the compose file. &lt;/p&gt;

&lt;p&gt;Here is the example &lt;code&gt;compose.yml&lt;/code&gt; code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;3.1'&lt;/span&gt;
&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;web&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;odoo:17.0&lt;/span&gt; &lt;span class="c1"&gt;# Configure docker image version&lt;/span&gt;
    &lt;span class="na"&gt;user&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;root&lt;/span&gt;
    &lt;span class="na"&gt;depends_on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;db&lt;/span&gt;
    &lt;span class="na"&gt;tty&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;10017:8069"&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="c1"&gt;# Configure Volumes&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;./logs:/etc/odoo-logs/&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;./config:/etc/odoo/&lt;/span&gt; &lt;span class="c1"&gt;# Odoo Config Path&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;./odoo_github/addon_custom:/mnt/extra-addons&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;HOST=db&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;USER=odoo&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;PASSWORD=strongpassword&lt;/span&gt; &lt;span class="c1"&gt;# Should be the same as PG DB&lt;/span&gt;
  &lt;span class="na"&gt;db&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;postgres:16&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="c1"&gt;# Configure DB&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;POSTGRES_USER=odoo&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;POSTGRES_PASSWORD=strongpassword&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;POSTGRES_DB=postgres&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;PGDATA=/var/lib/postgresql/data/pgdata&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;5432:5432"&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;odoo-db-data:/var/lib/postgresql/data/pgdata&lt;/span&gt;
&lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;odoo-web-data&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;odoo-db-data&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Create the &lt;code&gt;odoo.conf&lt;/code&gt; File
&lt;/h2&gt;

&lt;p&gt;We should also create the &lt;code&gt;odoo.conf&lt;/code&gt; file for odoo configuration. For the conf file location should be placed according to the compose file, if you follow this tutorial the location will be on &lt;code&gt;config/odoo.conf&lt;/code&gt;. This file is used to configure the Odoo setting for example the master password, odoo app port, addons path, log path, etc. For more information about odoo configuration file you can &lt;a href="https://www.cybrosys.com/odoo/odoo-books/odoo-17-development/setup-development-environment/conf-file/" rel="noopener noreferrer"&gt;check this out&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Here is the example &lt;code&gt;odoo.conf&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight conf"&gt;&lt;code&gt;[&lt;span class="n"&gt;options&lt;/span&gt;]
&lt;span class="n"&gt;data_dir&lt;/span&gt; = /&lt;span class="n"&gt;etc&lt;/span&gt;/&lt;span class="n"&gt;odoo&lt;/span&gt;
&lt;span class="n"&gt;admin_passwd&lt;/span&gt; = &lt;span class="n"&gt;easypassword&lt;/span&gt;

&lt;span class="n"&gt;dev_mode&lt;/span&gt; = &lt;span class="n"&gt;reload&lt;/span&gt;

&lt;span class="n"&gt;xmlrpc_port&lt;/span&gt; = &lt;span class="m"&gt;8069&lt;/span&gt;

&lt;span class="n"&gt;logfile&lt;/span&gt; = /&lt;span class="n"&gt;etc&lt;/span&gt;/&lt;span class="n"&gt;odoo&lt;/span&gt;-&lt;span class="n"&gt;logs&lt;/span&gt;/&lt;span class="n"&gt;odoo&lt;/span&gt;-&lt;span class="n"&gt;server&lt;/span&gt;.&lt;span class="n"&gt;log&lt;/span&gt;
&lt;span class="n"&gt;addons_path&lt;/span&gt; = /&lt;span class="n"&gt;mnt&lt;/span&gt;/&lt;span class="n"&gt;extra&lt;/span&gt;-&lt;span class="n"&gt;addons&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Running the docker
&lt;/h2&gt;

&lt;p&gt;To run the docker we can simply run the code below.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker compose up &lt;span class="nt"&gt;-d&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After running the docker you can go to the browser and enter &lt;a href="http://localhost:10017" rel="noopener noreferrer"&gt;http://localhost:10017&lt;/a&gt;. If everything is okay you should be able to see this page below.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkhzy6u1dikkymlhac4xj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkhzy6u1dikkymlhac4xj.png" alt="Odoo Login page" width="800" height="457"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Project Path
&lt;/h2&gt;

&lt;p&gt;Below is the project path for this entire tutorial.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;root
|
├── compose.yml
|
├── config
|    └── odoo.conf
|
└── logs
     └── odoo-server.log
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Final words
&lt;/h2&gt;

&lt;p&gt;This is the end of odoo docker installation tutorial. If you want the git code base you can get it &lt;a href="https://github.com/Drownie-Team/Odoo17-docker-codebase/tree/master" rel="noopener noreferrer"&gt;here&lt;/a&gt;. I will continue the tutorial in the next article about getting started in odoo.&lt;/p&gt;

</description>
      <category>odoo</category>
      <category>tutorial</category>
      <category>docker</category>
    </item>
  </channel>
</rss>
