Programmera Odoo versionsagnostiskt

En stor tidstjyv när det gäller modul-utveckling är hanteringen av olika versioner. Problemet är inte porteringsarbetet i sig utan underhållet, att buggrättningar och nya finesser hamnar i alla aktuella utgåvor av en modul. Lösningen är p-filer. En p-fil är en fil som omvandlas till en fil för en viss Odoo-utgåva i samband med utcheckningen. Genom att använda denna teknik så ligger koden för alla varianter i p-filen, p-filen distribueras till alla Odoo-utgåvor och det finns endast en fil att underhålla.


P-filen

P-filen är namngiven med ett extra P framför sin vanliga filändelse. Istället för <filnamn>.py blir det <filnamn>.p.py. Skillnaderna mellan ollika Odoo-versioner läggs in via if-satser. Dessa if-satser evalueras i samband med utcheckning av modulen.


    Python (*.p.py), Javascript (*.p.js), csv (*.p.csv), bash (*.p.sh)

        # #if VERSION <  "17.0"
        ...
        # #elif VERSION == "17.0"
        ...
        # #else
        ...
        # #endif






    Replacement:

    ##VERSION## ->  17.0
    ##REPO##    ->  odoo-base

    HTML (*.htm, *.html) or XML (*.xml, *.kpf, *.xul) files:

        <!-- #if FOO -->
        ...
        <!-- #endif -->


Shortcuts

odoodif2p =

$ /usr/share/odoo-maintenance/maintenance_monitoring_status_extension$ ls
controllers  __init__.py  __manifest__.py  README.rst  static
$ /usr/share/odoo-maintenance/maintenance_monitoring_status_extension$ odoodiff2p *
Wrong filename, not a diff-file
Wrong filename, not a diff-file

odoobranchpfile =

$ /usr/share/odoo-maintenance$ odoobranchpfile -m maintenance_monitoring_status

odoobranchdiff =

odooaddpreprocess =

odoopreprocess =

odooprecp =

odooreqclone =

odoodiff2p =

Installation

Säkerställ att odootools.sh är den nyaste versionen.

https://github.com/vertelab/odootools/tree/common
1. sudo wget -O /etc/profile.d/odootools.sh https://raw.githubusercontent.com/vertelab/odootools/common/odootools.sh

2. Läs in de nya kommandona i Terminalen, logga ut + logga in igen!

Förberedelse

1. Kopiera modulen du ska porta från Odoo 14 till Odoo 17 projektet.
2. Gör de korrigeringar som krävs, för att din modul ska fungera i Odoo 17.
3. Lägg in kommandon från Git och med det menas exempelvis "git pull", "git add ." samt "git commit -a", "git push".


odooaddpreprocess [odoo-repository]

Gör detta för varje projekt som ska ha denna funktionalitet

Exempel på arbetsflöde 1, porta från 14 till 17.

Viktigt! Utvecklingen sker på din lokala Odoo 17-maskin i detta skedet!

Exempel på kod finns i ett övningsprojekt

https://github.com/vertelab/odoo-crm-test/

Förbered med git clone (eller odoogitclone) av projektet med aktuell modul  på Odoo 17.

1. cdp odoo-crm-test



2. Ändra och testa modulen, att koden  passar med Odoo 17.


3. odoobranchget -m base_olidid -s 14.0 -d 17.0



4. Korrigera fel  och testa modulen i 17.0

5. odoobranchdiff -m base_oldid -d 14.0 -s 16.0 -> skapar diff-filer


5. Ändra difffilerna till p-filer med kod för respektive Odoo-utgåva

6. Lägg till filerna (git add . , git commit , git push)

7. odoobranchpfile  -> spara pfilerna i alla Odoo-utgåvor

I respektive Odooutgåva checka ut modulen, testa och odoosync till driftmaskin


Utveckling med P-filer

Exempel: Arbeta i Odoo 16

Hur man arbetar

Genomför förändringar i p-filen. Bygg körbar källkod med build-menyvaler för preprocess 16.

Starta om Odoo. (Ändringar i py-fil.)

Uppgradera modul. (Ändring i vy.)

Testa att koden fungerar!

git add .

git commit -a

git push

odoobranchpfile -p [project]
odoobranchpfile -p odoo-crm

Installation

Uppdatera Geany (på din egna dator)

$ sudo apt install geany

$ wget -O- https://raw.githubusercontent.com/vertelab/geany-odoo/master/install | bash

Länk: https://github.com/vertelab/geany-odoo


Hämta senaste versionen av Odootools

sudo wget -O /etc/profile.d/odootools.sh https://raw.githubusercontent.com/vertelab/odootools/common/odootools.sh

Länk: https://github.com/vertelab/odootools/tree/common


Lägg på preprocessor på projektet

odooaddpreprocess [odoo-repository]

Gör detta för varje projekt som ska ha denna funktionalitet  

Portning av P-filer i ett projekt

Finns denna modulen i andra branscher?

Sekvensiell införande av P-fil av genomförande på disk.

odoobranchget -m base_oldid -s 14.0 -d 17.0  .

Uppdatera Geany (på din egna dator)

Professional themes

Change theme in a few clicks, and browse through Odoo's catalog of ready-to-use themes available in our app store.

Införande av P-filer

Exempel: Uppdatera 14, 16 och 17

git checkout 16.0 (om 16 inte är aktuell branch)

odoobranchdiff -m base_oldid -s 14.0

Gå igenom alla diff-filer, lägg skillnader i if-satser. Ta bort diff-filer som är skapade på andra p-filer. (Blir det diff-filer på p-filer, beror på att branscherna är ur sync. ) Ta bort diff-filer av security-filer.

Filer som inte har någon diff-fil men är av typen xml, js, scss och py kan döpas om till

odoodiff2p */*.diff

odoopreprocess (skapar xml- och py-filer.)

Testa att koden fungerar!

git add .

git commit -a

git push

odoobranchpfile -p odoo-crm


P-filer... bara!

P-filer utan olika branch

1. Ladda ner senaste odootools, som ovan

2. Kolla om modulen finns i annan branch.


cdp odoo-account

3. Innan odoodiff2p *

 

odoodiff2p *

3. Gå igenom varje folder, byt namn med hjälp av odoodiff2p!


Installation

Säkerställ att odootools.sh är den nyaste versionen.

https://github.com/vertelab/odootools/tree/common
sudo wget -O /etc/profile.d/odootools.sh https://raw.githubusercontent.com/vertelab/odootools/common/odootools.sh

odooaddpreprocess [odoo-repository]

Gör detta för varje projekt som ska ha denna funktionalitet

Användning av p-filer

Vad är p-filer

P-filer är egentligen bara filer som har filändelsen .p innan sin riktiga filändelse, till exempel fil.p.py, och har i sig själv inga speciella egenskaper. Vad som gör p-filer speciella är python-biblioteket preprocess.

Problmet

För varje version av odoo så gör odoo SA ändringar i kod basen. Detta leder i sintur till att vi behöver göra ändra vår kod så den är komplatibel med odoo SA:s ändrinagr vi får där av en kod bas för varje utgåva av odoo. Där till så blir det väldigt mycket arbete att lägga till ny  funktiner som sedan måste testas och läggas till i alla andra utgåvor.

Lösningen

P-filer  låter oss ha  versionshantering  inuti vår kod. Genom att skriva kommentarer med  if-satser  kan vi ha flera versioner av en kodimplementering i en och samma  fil . Och genom att synka dessa filer mellan de olika kodbaserna kan vi också synka nya  funktioner  mellan alla versioner. Detta gör att mängden underhåll minskar.


Priset

som  alting här i värden så är p-filer inte en perfekct lösning och kommer till ett prise. För att p-filer ska fungera behöver dom implementeras corect. Detta kan inebära att sätte vi jobbar på måste ändras för att p-filer ska ha den effekt vi är ute efter och en ansträning i att faktikt implementera p-filer måste göras.

Riktlinjer

För att p-filer ska fungera behöver man följa dess riktlinjer.
1. 


Hur använder vi p-filer

I vår implementation av p-filer har vi deklarerat en variabel som heter VERSION. VERSION är vilken Odoo-version som Git-branchen är incheckad på.

Ett exempel på vilket värde VERSION kan ha är "18.0". Viktigt att komma ihåg är att VERSION alltid kommer att vara en float-sträng.

För att vår kod ämnad för p-filer inte ska tolkas som en del av den originella koden skriver vi den i kommentarer. Se exempel nedan.


    HTML (*.htm, *.html) or XML (*.xml, *.kpf, *.xul) files:

        <!-- #if FOO -->

        ...

        <!-- #endif -->

    Python (*.py), Perl (*.pl), Tcl (*.tcl), Ruby (*.rb), Bash (*.sh),

    or make ([Mm]akefile*) files:

        # #if defined('FAV_COLOR') and FAV_COLOR == "blue"

        ...

        # #elif FAV_COLOR == "red"

        ...

        # #else

        ...

        # #endif


    C (*.c, *.h), C++ (*.cpp, *.cxx, *.cc, *.h, *.hpp, *.hxx, *.hh),

    Java (*.java), PHP (*.php) or C# (*.cs) files:

        // #define FAV_COLOR 'blue'

        ...

        /* #ifndef FAV_COLOR */

        ...

        // #endif


    Fortran 77 (*.f) or 90/95 (*.f90) files:

        C     #if COEFF == 'var'

              ...

        C     #endif


    And other languages.


När vi implementerar p-filer kan det se ut så som det som vissas nedan.

----Python----
# #if VERSION >= "15.0"
ai_quest = self.env['res.users'].browse(self.channel_member_ids.mapped('partner_id.user_ids.id')).mapped
    'ai_quest_id')
# #elif VERSION <= "14.0"
ai_quest = self.env['res.users'].browse(self.channel_last_seen_partner_ids.mapped('partner_id.user_ids.id')).mapped(
    'ai_quest_id')
# #endif

----XML----
 <!-- #if VERSION >= "18.0" -->
<list editable="bottom">
    <field name="sequence" widget="handle" />
    <field name="ai_tool_id" nolabel="1" />
</list>
<!-- #elif VERSION <= "17.0" -->
<tree editable="bottom">
    <field name="sequence" widget="handle" />
    <field name="ai_tool_id" nolabel="1" />
</tree>
<!-- #endif -->


Installation


För att börja behöver du köra kommandot odooaddpreprocess följt av projectet som du vill ska ha tillgång till det. odooaddpreprocess är en del av odootools så du måte ha till gång till det för att det ska funka. Första gången du kör detta på en maskin kommer den att instalera python bitlioteket preprocess. Exsempel nedan.



odooaddpreprocess kommer att lägga till ett script i .git mapen på project som valts. Se nedan.