Parser: any class whose base name ends in `Mixin` becomes a model, even a QuerySet or a plain helper
Đánh giá
- Độ khó
- 2/5
- Thời gian dự kiến
- 1-3 giờ
- Mức phù hợp với người mới
- 25/100
Hướng nghiên cứu
Start in cli/orm_lens/parser.py: the Mixin$ branch of _looks_like_model() (around line 442) and where _resolve_and_filter() (around line 829) seeds is_model_name from it. Run the repro from the issue to confirm that only projects.Project should be listed. Done when phantom mixins drop out, the abstract-mixin test in test_abstract_and_auth_user.py and the mezzanine golden snapshot still pass, and pytest, ruff and mypy are clean. Note that open pull request #258 already targets this issue, so check it before starting.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Mô tả
Source: label-studio — label_studio/projects/models.py:72, label_studio/tasks/models.py; weblate — weblate/trans/mixins.py:74,81,154
What happens
_looks_like_model() returns True as soon as a base's name ends with Mixin. That's a guess for third-party bases we can't see. But it also fires when the mixin is defined right there in the workspace and is a plain class:
- label-studio:
class ProjectQuerySetWithFSM(FSMStateQuerySetMixin, ProjectQuerySet).ProjectQuerySetis amodels.QuerySet,FSMStateQuerySetMixinis a plain class. orm-lens listsprojects.ProjectQuerySetWithFSMas a model, anddriftsays blocking: "declared, but no migration creates it". Four of these, sodriftfails the build. - weblate:
class URLMixin(BaseURLMixin),LoggerMixin(BaseURLMixin),PathMixin(LoggerMixin, URLMixin)intrans/mixins.py.BaseURLMixinisclass BaseURLMixin:. They're pulled in becauseProjectinheritsPathMixin, and then show up as three blockingdriftentries.
Repro
projects/mixins.py
class StateQuerySetMixin:
def with_state(self):
return self
class URLMixin:
def get_absolute_url(self):
return "/"
projects/models.py
from django.db import models
from .mixins import StateQuerySetMixin, URLMixin
class ProjectQuerySet(models.QuerySet):
pass
class ProjectQuerySetWithState(StateQuerySetMixin, ProjectQuerySet):
pass
class PathMixin(URLMixin):
def full_path(self):
return self.get_absolute_url()
class Project(models.Model, PathMixin):
title = models.CharField(max_length=100)
objects = ProjectQuerySetWithState.as_manager()
$ orm-lens list
projects.ProjectQuerySetWithState
projects.PathMixin
projects.Project
Expected: only projects.Project.
Where
cli/orm_lens/parser.py
- line 442,
_looks_like_model(), there.search(r"Mixin$", tail)branch; - line 829,
_resolve_and_filter(), which seedsis_model_namefrom_looks_like_model()and then runs the fixed point over real definitions.
Suggested fix
Use the name guess only for bases we have no definition for. In _resolve_and_filter(), collect defined = {m.name for m in all_defs} and pass it to _looks_like_model(); skip the Mixin$ branch when tail in defined. A mixin that really is a model (class TimeStampMixin(models.Model)) still gets in through the fixed-point loop, because its own base is models.Model.
test_abstract_and_auth_user.py covers abstract mixins and should stay green. The mezzanine golden fixture has *Mixin classes too, so run the golden tests and update the snapshot if a phantom model drops out (say so in the PR).
How to test
- A test in
cli/tests/test_cross_module_bases.py(or a new file) with the repro: onlyProjectis returned. - A mixin defined as
class OwnedMixin(models.Model)withabstract = True, plusclass Doc(OwnedMixin):Docis still a model and inherits the fields. cd cli && python -m pytest -q,ruffandmypypass.
Difficulty: good first issue.
- Ngôn ngữ chính
- Python
- Star
- 84
- Fork
- 13
- Chỉ số merge pull request
- Không có pull request nào được merge trong 30 ngày
Chuẩn bị môi trường
- Có Dockerfile hoặc tệp Docker Compose
- Có mẫu pull request
- Đọc hướng dẫn đóng góp
Bắt đầu từ đâu
- Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
- Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
- Fork repository và làm thay đổi trên một nhánh.
- Mở pull request có tham chiếu số hiệu của issue.
Issue khác của FROWNINGdev/django-orm-lens
-
suggest-indexes proposes composite indexes that include the primary key or a unique fieldCó thể đã có người làm @bfs2021 đã nhận hôm nay. Đang mởbug good first issue python
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 82/100
FROWNINGdev/django-orm-lens#269 ·
-
`migration-risk` text output prints `app.None` for graph-level findingsCó thể đã có người làm @phoenixbycaselka đã nhận hôm nay. Đang mởbug good first issue python
Độ khó 1/5 1-3 giờ Mức phù hợp với người mới 88/100
FROWNINGdev/django-orm-lens#268 ·
-
Finish the Chinese rule reference — DOL001–DOL007Có thể làm lại được @harbinresearcher đã nhận 64 ngày trước và không có pull request nào đang mở. Đang mởdocumentation good first issue help wanted
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 68/100
FROWNINGdev/django-orm-lens#81 · 2 bình luận ·
-
Fields inherited from Django's `AbstractBaseUser` / `PermissionsMixin` / `AbstractUser` are missingĐang mởbug good first issue python
Độ khó 3/5 1-2 ngày Mức phù hợp với người mới 62/100
FROWNINGdev/django-orm-lens#267 ·
-
bug good first issue python
Độ khó 3/5 Nửa ngày Mức phù hợp với người mới 78/100
FROWNINGdev/django-orm-lens#266 ·
Tất cả issue của FROWNINGdev/django-orm-lens
Issue tương tự
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 72/100
gorakhargosh/watchdog#1462 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 85/100
openwisp/openwisp-monitoring#889 ·
Maintainer thường phản hồi trong vòng 2 ngày
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 70/100
OpenFreeEnergy/Lomap#180 ·
-
generate_observation_scenario_from_cpgs exposure time conversion when auto-gain set to 'yes'Đang mở
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 62/100
roman-corgi/corgisim#327 ·
Maintainer thường phản hồi trong vòng 2 ngày
-
agent:WSL bug code-review linux pri:medium sev:low tooling
Độ khó 2/5 Nửa ngày Mức phù hợp với người mới 62/100
Maintainer thường phản hồi trong vòng 1 ngày