RPC_ERROR Odoo Server Error Traceback (most recent...
बनाया गया: 15 सितंबर 2025
बनाया गया: 15 सितंबर 2025
RPC_ERROR
Odoo Server Error
Traceback (most recent call last):
File "/home/odoo/src/odoo/odoo/http.py", line 1848, in _serve_db
return service_model.retrying(self._serve_ir_http, self.env)
File "/home/odoo/src/odoo/odoo/service/model.py", line 152, in retrying
result = func()
File "/home/odoo/src/odoo/odoo/http.py", line 1876, in _serve_ir_http
response = self.dispatcher.dispatch(rule.endpoint, args)
File "/home/odoo/src/odoo/odoo/http.py", line 2080, in dispatch
result = self.request.registry['ir.http']._dispatch(endpoint)
File "/home/odoo/src/odoo/addons/website/models/ir_http.py", line 237, in _dispatch
response = super()._dispatch(endpoint)
File "/home/odoo/src/odoo/odoo/addons/base/models/ir_http.py", line 154, in _dispatch
result = endpoint(**request.params)
File "/home/odoo/src/odoo/odoo/http.py", line 763, in route_wrapper
result = endpoint(self, *args, **params_ok)
File "/home/odoo/src/odoo/addons/web/controllers/dataset.py", line 47, in call_button
action = self._call_kw(model, method, args, kwargs)
File "/home/odoo/src/odoo/addons/web/controllers/dataset.py", line 34, in _call_kw
return call_kw(Model, method, args, kwargs)
File "/home/odoo/src/odoo/odoo/api.py", line 484, in call_kw
result = _call_kw_multi(method, model, args, kwargs)
File "/home/odoo/src/odoo/odoo/api.py", line 469, in _call_kw_multi
result = method(recs, *args, **kwargs)
File "<decorator-gen-77>", line 2, in button_immediate_install
File "/home/odoo/src/odoo/odoo/addons/base/models/ir_module.py", line 74, in check_and_log
return method(self, *args, **kwargs)
File "/home/odoo/src/odoo/odoo/addons/base/models/ir_module.py", line 478, in button_immediate_install
return self._button_immediate_function(self.env.registry[self._name].button_install)
File "/home/odoo/src/odoo/odoo/addons/base/models/ir_module.py", line 602, in _button_immediate_function
registry = modules.registry.Registry.new(self._cr.dbname, update_module=True)
File "<decorator-gen-16>", line 2, in new
File "/home/odoo/src/odoo/odoo/tools/func.py", line 87, in locked
return func(inst, *args, **kwargs)
File "/home/odoo/src/odoo/odoo/modules/registry.py", line 87, in new
odoo.modules.load_modules(registry, force_demo, status, update_module)
File "/home/odoo/src/odoo/odoo/modules/loading.py", line 493, in load_modules
processed_modules += load_marked_modules(cr, graph,
File "/home/odoo/src/odoo/odoo/modules/loading.py", line 374, in load_marked_modules
loaded, processed = load_module_graph(
File "/home/odoo/src/odoo/odoo/modules/loading.py", line 190, in load_module_graph
load_openerp_module(package.name)
File "/home/odoo/src/odoo/odoo/modules/module.py", line 471, in load_openerp_module
import('odoo.addons.' + module_name)
File "/home/odoo/src/user/job_cost_trend/init.py", line 3, in <module>
from . import models
ImportError: cannot import name 'models' from partially initialized module 'odoo.addons.job_cost_trend' (most likely due to a circular import) (/home/odoo/src/user/job_cost_trend/init.py)
The above server error caused the following client error:
RPC_ERROR: Odoo Server Error
RPC_ERROR
at makeErrorFromResponse (https://pcco-testcons-23708883.dev.odoo.com/web/assets/30964-bae3cd4/web.assets_backend.min.js:1010:163)
at XMLHttpRequest.<anonymous> (https://pcco-testcons-23708883.dev.odoo.com/web/assets/30964-bae3cd4/web.assets_backend.min.js:1018:13)
Got it — that traceback means Python hit a circular import while loading your custom module job_cost_trend
. In Odoo that almost always comes from how the package is laid out or from importing your own package inside your model files.
Here’s a quick, focused checklist to fix it fast.
Use either a single models.py
or a models/
package — not both.
Option A: single file
textjob_cost_trend/ ├─ __init__.py ├─ __manifest__.py ├─ models.py └─ views/...
__init__.py
:
python# job_cost_trend/__init__.py from . import models # refers to models.py
Option B: package of model files
textjob_cost_trend/ ├─ __init__.py ├─ __manifest__.py ├─ models/ │ ├─ __init__.py │ ├─ job_cost.py │ └─ trend.py └─ views/...
__init__.py
:
python# job_cost_trend/__init__.py from . import models
models/__init__.py
:
python# job_cost_trend/models/__init__.py from . import job_cost from . import trend
📌 If you currently have both a models.py
file and a models/
folder, pick one pattern and delete/rename the other (this collision can trigger confusing import behavior).
Inside files like job_cost.py
or models.py
, you should not do:
pythonfrom odoo.addons.job_cost_trend import models # ❌ causes circular import
Use Odoo’s base classes directly:
pythonfrom odoo import models, fields, api, _
Circular imports often happen when a file tries to import odoo.addons.job_cost_trend
(which is still initializing), while __init__.py
is importing that file.
__init__.py
imports simpleTop-level __init__.py
should only import the top-level packages (e.g., models
, controllers
, wizards
). Don’t import specific model classes there; that’s what models/__init__.py
is for.
Good:
python# job_cost_trend/__init__.py from . import models
Avoid:
python# ❌ importing specific modules from deeper paths here from .models import job_cost, trend
Look for patterns like:
models/job_cost.py
imports something from models/trend.py
models/trend.py
imports something back from models/job_cost.py
If you genuinely need cross-references, prefer lazy lookups via the environment instead of importing each other:
pythonother_model = self.env['job.cost.trend'] # ✅ no Python-level import
Ensure none of your files use names that clash with stdlib or Odoo core modules (e.g., avoid naming a file types.py
, logging.py
, fields.py
, etc.).
Create the smallest possible models.py
to verify imports:
python# job_cost_trend/models.py (or models/job_cost.py) from odoo import models, fields class JobCostTrend(models.Model): _name = 'job.cost.trend' _description = 'Job Cost Trend' name = fields.Char(required=True)
If this loads, the skeleton is fine; then reintroduce other files step by step.
After you fix the structure/imports:
find /home/odoo/src/user/job_cost_trend -name "*.pyc" -delete -o -name "__pycache__" -type d -exec rm -rf {} +
odoo-bin -d <your_db> -u job_cost_trend
models/__init__.py
that does from .. import models
(wrong). It should import sibling files only (from . import foo
).models
and a file named models.py
.If you paste your current tree (just the file/folder names) and the top ~10 lines of job_cost_trend/__init__.py
and models/__init__.py
(or models.py
), I can point to the exact line to change.
ممكن الشرح عربي
تمام ✅
المشكلة اللي ظهرت لك في Odoo هي خطأ "circular import" أو "استيراد دائري"، يعني فيه ملف يستدعي ملف ثاني، وهذا الملف الثاني يرجع يستدعي الأول → فيصير Python يحتار وما يقدر يكمّل التحميل.
خليني أشرح لك خطوة بخطوة بالعربي:
موديول Odoo لازم يكون منظم بشكل واضح. عندك خيارين فقط:
models.py
textjob_cost_trend/ ├─ __init__.py ├─ __manifest__.py ├─ models.py └─ views/...
وفي __init__.py
:
pythonfrom . import models
models/
فيه عدة ملفاتtextjob_cost_trend/ ├─ __init__.py ├─ __manifest__.py ├─ models/ │ ├─ __init__.py │ ├─ job_cost.py │ └─ trend.py └─ views/...
وفي __init__.py
:
pythonfrom . import models
وفي models/__init__.py
:
pythonfrom . import job_cost from . import trend
🚨 إذا عندك ملف اسمه models.py
ومجلد اسمه models/
بنفس الوقت → هذا يسبب المشكلة. لازم تختار واحد منهم فقط.
داخل أي ملف model (زي job_cost.py
أو models.py
) لازم تكتب:
pythonfrom odoo import models, fields, api, _
❌ لا تكتب:
pythonfrom odoo.addons.job_cost_trend import models
لأن هذا يسبب الاستيراد الدائري.
__init__.py
الـ __init__.py
في جذر الموديول يكفي يكون:
pythonfrom . import models
وما يحتاج تذكر أسماء الملفات الفردية (خليها في models/__init__.py
فقط).
لو عندك ملفين يعتمدوا على بعض:
job_cost.py
يستورد من trend.py
trend.py
يستورد من job_cost.py
هذا يعمل دورة (circular import). الحل: لا تستورد الملف الثاني مباشرة، بل استخدم self.env
للوصول للموديل:
pythonother_model = self.env['job.cost.trend']
models.py
أو models/
(مش الاثنين).__init__.py
بحيث يكون بسيط.odoo.addons.job_cost_trend
إلى from odoo import ...
.find /home/odoo/src/user/job_cost_trend -name "*.pyc" -delete -o -name "__pycache__" -type d -exec rm -rf {} +
odoo-bin -d اسم_القاعدة -u job_cost_trend
تحب تكتب لي محتويات ملف job_cost_trend/__init__.py
وأسماء الملفات اللي داخل مجلد models/
(أو ملف models.py
)؟
عشان أقولك بالضبط السطر اللي لازم يتغير.