Parser: any class whose base name ends in `Mixin` becomes a model, even a QuerySet or a plain helper
Evaluación
- Dificultad
- 2/5
- Tiempo estimado
- 1-3 horas
- Aptitud para principiantes
- 25/100
Línea de trabajo
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.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
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.
- Lenguaje dominante
- Python
- Estrellas
- 84
- Forks
- 13
- Métricas de merge de PR
- Sin PR fusionados en 30 d
Preparar el entorno
- Incluye un Dockerfile o un archivo de Docker Compose
- Tiene una plantilla de pull request
- Leer la guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de FROWNINGdev/django-orm-lens
-
suggest-indexes proposes composite indexes that include the primary key or a unique fieldPosiblemente ocupada @bfs2021 la tomó hoy. Abiertobug good first issue python
Dificultad 2/5 1-3 horas Aptitud para principiantes 82/100
FROWNINGdev/django-orm-lens#269 ·
-
`migration-risk` text output prints `app.None` for graph-level findingsPosiblemente ocupada @phoenixbycaselka la tomó hoy. Abiertobug good first issue python
Dificultad 1/5 1-3 horas Aptitud para principiantes 88/100
FROWNINGdev/django-orm-lens#268 ·
-
Finish the Chinese rule reference — DOL001–DOL007Quizá libre de nuevo @harbinresearcher la tomó hace 64 días y no hay ningún pull request abierto. Abiertodocumentation good first issue help wanted
Dificultad 2/5 1-3 horas Aptitud para principiantes 68/100
FROWNINGdev/django-orm-lens#81 · 2 comentarios ·
-
Fields inherited from Django's `AbstractBaseUser` / `PermissionsMixin` / `AbstractUser` are missingAbiertobug good first issue python
Dificultad 3/5 1-2 días Aptitud para principiantes 62/100
FROWNINGdev/django-orm-lens#267 ·
-
bug good first issue python
Dificultad 3/5 Medio día Aptitud para principiantes 78/100
FROWNINGdev/django-orm-lens#266 ·
Todos los issues de FROWNINGdev/django-orm-lens
Issues similares
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 72/100
gorakhargosh/watchdog#1462 ·
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 85/100
openwisp/openwisp-monitoring#889 ·
Los mantenedores suelen responder en 2 días
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 70/100
OpenFreeEnergy/Lomap#180 ·
-
generate_observation_scenario_from_cpgs exposure time conversion when auto-gain set to 'yes'Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 62/100
roman-corgi/corgisim#327 ·
Los mantenedores suelen responder en 2 días
-
agent:WSL bug code-review linux pri:medium sev:low tooling
Dificultad 2/5 Medio día Aptitud para principiantes 62/100
Los mantenedores suelen responder en 1 día