Parser: any class whose base name ends in `Mixin` becomes a model, even a QuerySet or a plain helper
Valutazione
- Difficoltà
- 2/5
- Tempo stimato
- 1-3 ore
- Idoneità per principianti
- 25/100
Direzione di ricerca
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.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
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.
- Lingua principale
- Python
- Stelle
- 84
- Fork
- 13
- Metriche di merge delle PR
- Nessuna PR unita negli ultimi 30g
Preparare l'ambiente
- Include un Dockerfile o un file Docker Compose
- Ha un modello di pull request
- Leggi la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di FROWNINGdev/django-orm-lens
-
suggest-indexes proposes composite indexes that include the primary key or a unique fieldForse già presa @bfs2021 l’ha presa oggi. Apertabug good first issue python
Difficoltà 2/5 1-3 ore Idoneità per principianti 82/100
FROWNINGdev/django-orm-lens#269 ·
-
`migration-risk` text output prints `app.None` for graph-level findingsForse già presa @phoenixbycaselka l’ha presa oggi. Apertabug good first issue python
Difficoltà 1/5 1-3 ore Idoneità per principianti 88/100
FROWNINGdev/django-orm-lens#268 ·
-
Finish the Chinese rule reference — DOL001–DOL007Forse di nuovo libera @harbinresearcher l’ha presa 64 giorni fa e non c’è nessuna pull request aperta. Apertadocumentation good first issue help wanted
Difficoltà 2/5 1-3 ore Idoneità per principianti 68/100
FROWNINGdev/django-orm-lens#81 · 2 commenti ·
-
Fields inherited from Django's `AbstractBaseUser` / `PermissionsMixin` / `AbstractUser` are missingApertabug good first issue python
Difficoltà 3/5 1-2 giorni Idoneità per principianti 62/100
FROWNINGdev/django-orm-lens#267 ·
-
bug good first issue python
Difficoltà 3/5 Mezza giornata Idoneità per principianti 78/100
FROWNINGdev/django-orm-lens#266 ·
Tutte le issue di FROWNINGdev/django-orm-lens
Issue simili
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 72/100
gorakhargosh/watchdog#1462 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 85/100
openwisp/openwisp-monitoring#889 ·
I maintainer di solito rispondono entro 2 giorni
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 70/100
OpenFreeEnergy/Lomap#180 ·
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 62/100
roman-corgi/corgisim#327 ·
I maintainer di solito rispondono entro 2 giorni
-
agent:WSL bug code-review linux pri:medium sev:low tooling
Difficoltà 2/5 Mezza giornata Idoneità per principianti 62/100
I maintainer di solito rispondono entro 1 giorno