emmett-framework / emmett

The web framework for inventors
Other
1.03k stars 70 forks source link

Bug with Self references #454

Closed josejachuf closed 1 year ago

josejachuf commented 1 year ago

I used this characteristic in previous projects, but in a new project, with the latest version of Emmett, an error occurs.

class Person(Model):
    name = Field()
    refers_to({'father': 'self'})
    has_many({'children': 'self.father'})

Indicates that there is no Person. I would not know what version it began to fail

$ emmett -a src migrations generate -m "add person" Traceback (most recent call last): File "/back/.venv/bin/emmett", line 8, in sys.exit(main()) File "/back/.venv/lib/python3.8/site-packages/emmett/cli.py", line 543, in main cli.main(prog_name="python -m emmett" if as_module else None) File "/back/.venv/lib/python3.8/site-packages/emmett/cli.py", line 239, in main return super().main(args, kwargs) File "/back/.venv/lib/python3.8/site-packages/click/core.py", line 1055, in main rv = self.invoke(ctx) File "/back/.venv/lib/python3.8/site-packages/click/core.py", line 1657, in invoke return _process_result(sub_ctx.command.invoke(sub_ctx)) File "/back/.venv/lib/python3.8/site-packages/click/core.py", line 1657, in invoke return _process_result(sub_ctx.command.invoke(sub_ctx)) File "/back/.venv/lib/python3.8/site-packages/click/core.py", line 1404, in invoke return ctx.invoke(self.callback, ctx.params) File "/back/.venv/lib/python3.8/site-packages/click/core.py", line 760, in invoke return __callback(args, kwargs) File "/back/.venv/lib/python3.8/site-packages/click/decorators.py", line 84, in new_func return ctx.invoke(f, obj, *args, *kwargs) File "/back/.venv/lib/python3.8/site-packages/click/core.py", line 760, in invoke return __callback(args, kwargs) File "/back/.venv/lib/python3.8/site-packages/emmett/cli.py", line 469, in migrations_generate app = info.load_app() File "/back/.venv/lib/python3.8/site-packages/emmett/cli.py", line 136, in load_app app = locate_app(import_name, app_name) if import_name else None File "/back/.venv/lib/python3.8/site-packages/emmett/_internal.py", line 283, in locate_app module = get_app_module(module_name, raise_on_failure=raise_on_failure) File "/back/.venv/lib/python3.8/site-packages/emmett/_internal.py", line 247, in get_app_module import(module_name) File "/back/app/src/init.py", line 49, in db.define_models([ File "/back/.venv/lib/python3.8/site-packages/emmett/orm/base.py", line 193, in define_models obj._definerelations() File "/back/.venv/lib/python3.8/site-packages/emmett/orm/models.py", line 404, in _definerelations refmodel = self.db[reference.model].model File "/back/.venv/lib/python3.8/site-packages/pydal/base.py", line 663, in getitem return self.getattr(str(key)) File "/back/.venv/lib/python3.8/site-packages/pydal/base.py", line 670, in getattr return BasicStorage.getattribute(self, key) AttributeError: 'Database' object has no attribute 'Person'

gi0baro commented 1 year ago

Found the culprit: https://github.com/emmett-framework/emmett/commit/217041205d8ed6f63d45a8a541cb3bd0f6c4b312#diff-06b6fce4899f13c7d0951ab3969d7a7f30f4f9943223f60601add41b73bfcb60L370

It seems broken just for 2.4.x and above, I should be able to make a patch release in the following days.

gi0baro commented 1 year ago

This is now fixed in master and 2.4.14

josejachuf commented 1 year ago

Thanks @gi0baro , this works fine