Skip to content

Commit 3b074e0

Browse files
authored
INFRA-295: Odoo Iniz to work with Odoo 14 (#46)
1 parent 7f4fa5d commit 3b074e0

30 files changed

+210
-276
lines changed

README.md

+7-5
Original file line numberDiff line numberDiff line change
@@ -150,19 +150,21 @@ By default the repo URL will be Mekom Nexus repository, but you can provide your
150150
```
151151

152152
### Additional info
153-
- The `test` Gradle task will in fact run 2 substasks: **runTests** and **processCSVs**.
154-
You can run those 2 tasks independently if you which.
153+
- To run Odoo tests and process the CSV files:
155154
```
156-
./gradlew clean runTests
155+
./gradlew clean test
157156
```
157+
158+
- To process CSV files and keep Odoo server running:
158159
```
159-
./gradlew clean processCSVs
160+
./gradlew clean run
160161
```
161162

162-
- If you are willing to leave the Odoo server running after running the tests, use:
163+
Note: You can always run both tasks by using
163164
```
164165
./gradlew clean test run
165166
```
167+
166168
The Odoo server will be accessible at http://localhost:8069
167169

168170
- If you want to force remove all the containers created in the tests, run the following:

build.gradle

+4-56
Original file line numberDiff line numberDiff line change
@@ -46,29 +46,8 @@ task removeOdooWithCompose(type: Exec) {
4646
'-v'
4747
}
4848

49-
task runDbDetached(type: Exec) {
50-
dependsOn copyTestResources
51-
workingDir testResourcesDir
52-
commandLine 'docker-compose',
53-
'-f',
54-
'dockerfiles/run-db.yml',
55-
'up',
56-
'-d'
57-
}
58-
59-
task initializeDb(type: Exec) {
60-
dependsOn copyTestResources,
61-
runDbDetached
62-
workingDir testResourcesDir
63-
commandLine 'docker-compose',
64-
'-f',
65-
'dockerfiles/initialize-db.yml',
66-
'up',
67-
'--abort-on-container-exit'
68-
}
69-
7049
task runTests(type: Exec) {
71-
dependsOn initializeDb
50+
dependsOn copyTestResources
7251
workingDir testResourcesDir
7352
commandLine 'docker-compose',
7453
'-f',
@@ -77,43 +56,12 @@ task runTests(type: Exec) {
7756
'--abort-on-container-exit'
7857
}
7958

80-
task setVolumePermissions(type: Exec) {
81-
dependsOn runDbDetached
82-
workingDir testResourcesDir
83-
commandLine 'docker-compose',
84-
'-f',
85-
'dockerfiles/set-volume-permissions.yml',
86-
'up',
87-
'--abort-on-container-exit'
88-
}
89-
90-
task installBaseAddons(type: Exec) {
91-
dependsOn setVolumePermissions
92-
workingDir testResourcesDir
93-
commandLine 'docker-compose',
94-
'-f',
95-
'dockerfiles/install-base-addons.yml',
96-
'up',
97-
'--abort-on-container-exit'
98-
}
99-
100-
task processCSVs(type: Exec) {
101-
dependsOn copyTestResources,
102-
installBaseAddons
103-
workingDir testResourcesDir
104-
commandLine 'docker-compose',
105-
'-f',
106-
'dockerfiles/process-csvs.yml',
107-
'up',
108-
'--abort-on-container-exit'
109-
}
110-
11159
task runOdoo(type: Exec) {
112-
dependsOn installBaseAddons
60+
dependsOn copyTestResources
11361
workingDir testResourcesDir
11462
commandLine 'docker-compose',
11563
'-f',
116-
'dockerfiles/run-with-csvs.yml',
64+
'dockerfiles/process-csvs.yml',
11765
'up',
11866
'--abort-on-container-exit'
11967
}
@@ -190,7 +138,7 @@ task createPom {
190138
}
191139

192140
test {
193-
dependsOn runTests, processCSVs
141+
dependsOn runTests
194142
}
195143

196144
task cleanDocker {

odoo_initializer/__init__.py

+1
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
11
from . import activator
2+
from .activator import start_init

odoo_initializer/__manifest__.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -22,5 +22,6 @@
2222

2323
"application": True,
2424
"installable": True,
25-
"auto_install": True
25+
"auto_install": True,
26+
"post_startup_hook": 'start_init'
2627
}

odoo_initializer/activator.py

+42-38
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import logging
22

33
from .utils import config
4+
from .utils.registry import registry
45
from .utils.models_import import ModelsImport
56

67
from .models.country_loader import CountryLoader
@@ -30,50 +31,53 @@
3031

3132
_logger = logging.getLogger(__name__)
3233

33-
_logger.info("start initialization process")
3434

35-
# loaders are ordered based on dependency to each others
35+
def start_init(cr):
36+
_logger.info("start initialization process")
3637

37-
registered_loaders = [
38-
CurrencyLoader,
39-
CountryLoader,
40-
FiscalPositionLoader,
41-
PartnerLoader,
42-
CompanyLoader,
43-
AccountLoader,
44-
JournalLoader,
45-
PaymentTermLoader,
46-
UOMLoader,
47-
StockLocationLoader,
48-
ProductCategoryLoader,
49-
DrugLoader,
50-
OrdersLoader,
51-
ProductVariantLoader,
52-
ProductLoader,
53-
PriceListLoader,
54-
SaleShopLoader,
55-
OrderTypeLoader,
56-
ShopMappingLoader,
57-
DefaultValueLoader,
58-
CompanyPropertyLoader,
59-
SystemParameterLoader,
60-
DecimalPrecisionLoader,
61-
LanguageLoader,
62-
]
38+
# loaders are ordered based on dependency to each others
6339

64-
for registered_loader in registered_loaders:
65-
loader = registered_loader()
66-
loader.load_()
40+
registered_loaders = [
41+
CurrencyLoader,
42+
CountryLoader,
43+
FiscalPositionLoader,
44+
PartnerLoader,
45+
CompanyLoader,
46+
AccountLoader,
47+
JournalLoader,
48+
PaymentTermLoader,
49+
UOMLoader,
50+
StockLocationLoader,
51+
ProductCategoryLoader,
52+
DrugLoader,
53+
OrdersLoader,
54+
ProductVariantLoader,
55+
ProductLoader,
56+
PriceListLoader,
57+
SaleShopLoader,
58+
OrderTypeLoader,
59+
ShopMappingLoader,
60+
DefaultValueLoader,
61+
CompanyPropertyLoader,
62+
SystemParameterLoader,
63+
DecimalPrecisionLoader,
64+
LanguageLoader,
65+
]
6766

68-
config.init = False
67+
registry.initialize(cr)
68+
for registered_loader in registered_loaders:
69+
loader = registered_loader()
70+
loader.load_()
6971

72+
config.init = False
7073

71-
_logger.info("load Initializer configurable loaders file")
74+
_logger.info("load Initializer configurable loaders file")
7275

73-
configurable_loaders = ModelsImport().get_iniz_config_file_models()
76+
configurable_loaders = ModelsImport().get_iniz_config_file_models()
7477

75-
for config_loader in configurable_loaders:
76-
loader = config_loader
77-
loader.load_()
78+
for config_loader in configurable_loaders:
79+
loader = config_loader
80+
loader.load_()
7881

79-
_logger.info("initialization done")
82+
registry.clear()
83+
_logger.info("initialization done")

odoo_initializer/models/base_loader.py

+32-48
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,10 @@
11
import logging
22
from os.path import basename
33

4-
import odoo
5-
from odoo import api
6-
7-
from ..utils.config import config
4+
from ..utils.registry import registry
85
from ..utils.data_files_utils import data_files
6+
from ..utils.config import config
7+
from odoo import modules as modules
98

109
_logger = logging.getLogger(__name__)
1110

@@ -23,7 +22,12 @@ def __init__(self):
2322
filters = {}
2423
field_rules = {}
2524

26-
def apply_rules(self, record={}, rules={}):
25+
def apply_rules(self, record=None, rules=None):
26+
27+
if rules is None:
28+
rules = {}
29+
if record is None:
30+
record = {}
2731

2832
# all rules should be registered here
2933
_rules_register = {
@@ -43,42 +47,24 @@ def load_files(self, relevant_folder, model_name):
4347
def load_file(self, file_):
4448
if not file_:
4549
return []
46-
with api.Environment.manage():
47-
registry = odoo.registry(config.db_name)
48-
with registry.cursor() as cr:
49-
uid = odoo.SUPERUSER_ID
50-
cr.execute('SELECT model FROM ir_model ')
51-
models = cr.dictfetchall()
52-
53-
# Checking if the model is available in database
54-
found = False
55-
for model in models:
56-
if model['model'] == self.model_name:
57-
found = True
58-
59-
if (not config.init) and found and (self.model_name not in odoo.api.Environment(cr, uid, {})):
60-
_logger.info("Updating registry once")
61-
registry.delete(config.db_name)
62-
config.init = True
63-
64-
if self.model_name not in odoo.api.Environment(cr, uid, {}):
65-
_logger.warn("Model '" + self.model_name + "' not found.")
66-
return False
67-
68-
ctx = odoo.api.Environment(cr, uid, {})['res.users'].context_get()
69-
env = odoo.api.Environment(cr, uid, ctx)
70-
71-
model = env["base_import.import"]
72-
import_wizard = model.create(
73-
{
74-
"res_model": self.model_name,
75-
"file": file_,
76-
"file_type": "text/csv",
77-
}
78-
)
79-
result = import_wizard.do(
80-
self.fields, {"quoting": '"', "separator": ",", "headers": True}
81-
)
50+
51+
env = registry.env
52+
if self.model_name not in env:
53+
_logger.warning("Model '" + self.model_name + "' not found.")
54+
return False
55+
56+
model = env["base_import.import"]
57+
import_wizard = model.create(
58+
{
59+
"res_model": self.model_name,
60+
"file": file_,
61+
"file_type": "text/csv",
62+
}
63+
)
64+
result = import_wizard.do(
65+
self.fields, [], {"quoting": '"', "separator": ",", "headers": True}
66+
)
67+
8268
return True
8369

8470
def _validate_mapping(self, mapping, file_header):
@@ -92,7 +78,7 @@ def _validate_mapping(self, mapping, file_header):
9278
validated_mapping[field[0]] = field[1]
9379
else:
9480
validated_mapping = {}
95-
_logger.warn("Skipping file import, Field '" + field[1] + "' is missing")
81+
_logger.warning("Skipping file import, Field '" + field[1] + "' is missing")
9682
break
9783
return validated_mapping
9884

@@ -144,11 +130,9 @@ def _pre_process(self, file_, mapping, filters_):
144130
return data_files.build_csv(mapped_dict) if mapped_dict else []
145131

146132
def _record_exist(self, record_id):
147-
with api.Environment.manage():
148-
registry = odoo.registry(config.db_name)
149-
with registry.cursor() as cr:
150-
cr.execute("SELECT res_id FROM ir_model_data WHERE name='" + record_id + "';")
151-
return cr.dictfetchall() or False
133+
cr = registry.cursor
134+
cr.execute("SELECT res_id FROM ir_model_data WHERE name='" + record_id + "';")
135+
return cr.dictfetchall() or False
152136

153137
# Rule to delete a field that shouldn't be updated if found, from the record
154138
def _no_update_rule(self, record=None, field=None):
@@ -188,4 +172,4 @@ def load_(self):
188172
data_files.get_checksum_path(file_, self.model_name), data_files.md5(file_)
189173
)
190174
else:
191-
_logger.warn("File cannot be loaded: " + basename(file_))
175+
_logger.warning("File cannot be loaded: " + basename(file_))
+9-13
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
1-
import odoo
2-
from odoo import api
3-
from odoo.api import Environment
4-
from ..utils.config import config
1+
import logging
2+
3+
from ..utils.registry import registry
54

65
from .base_loader import BaseLoader
76

7+
_logger = logging.getLogger(__name__)
8+
89

910
class LanguageLoader(BaseLoader):
1011
folder = "language"
@@ -15,13 +16,8 @@ class LanguageLoader(BaseLoader):
1516
def load_file(self, file_):
1617
if not file_:
1718
return []
18-
with api.Environment.manage():
19-
registry = odoo.registry(config.db_name)
20-
with registry.cursor() as cr:
21-
uid = odoo.SUPERUSER_ID
22-
env = Environment(cr, uid, {})
23-
model = env[self.model_name]
24-
for lang in file_:
25-
installer = model.create({'lang': lang.text})
26-
installer.lang_install()
19+
env = registry.env
20+
model = env[self.model_name]
21+
for lang in file_:
22+
model.create({'lang': lang.text}).lang_install()
2723
return

odoo_initializer/models/product_loader.py

-4
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,3 @@ class ProductLoader(BaseLoader):
55
model_name = "product.template"
66
folder = "product"
77
filters = {}
8-
field_rules = {
9-
"lst_price": "NO_UPDATE",
10-
"standard_price": "NO_UPDATE"
11-
}

odoo_initializer/models/product_variant_loader.py

+1-2
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,5 @@ class ProductVariantLoader(BaseLoader):
66
folder = "product_variant"
77
filters = {}
88
field_rules = {
9-
"lst_price": "NO_UPDATE",
10-
"standard_price": "NO_UPDATE"
9+
"lst_price": "NO_UPDATE"
1110
}

0 commit comments

Comments
 (0)