Models in a sub-package of an app get the sub-package's label (`io_storages/s3/models.py` → app `s3`)
まだ誰も着手していません。
評価
- 難易度
- 3/5
- 見積もり時間
- 半日
- 初心者へのやさしさ
- 78/100
調査の方向性
The app label is set inline in parse_models_file() in cli/orm_lens/parser.py (around lines 610-614), and the same rule lives in _app_dir_for() in cli/orm_lens/_paths.py. Start by reproducing the io_storages/s3/models.py layout and running orm-lens list and drift, then look at how both call sites derive the app. Done means list shows io_storages.S3ImportStorage, drift reports nothing, the existing shop/ cases keep their labels, and cd cli && python -m pytest -q passes.
索引モデルが issue の本文から書いたものです。
説明
Source: label-studio — label_studio/io_storages/{s3,gcs,azure_blob,redis,localfiles}/models.py
What happens
The app label comes from the directory that holds models.py (or from the parent of a models/ package). That breaks for apps that split models into sub-packages:
io_storages/
apps.py
migrations/
models.py # from .s3.models import S3ImportStorage
s3/models.py # class S3ImportStorage(models.Model)
Django puts S3ImportStorage in io_storages: the label comes from the app config whose package contains the module, not from the file's own directory. orm-lens calls the app s3.
On label-studio list shows s3.S3ImportStorage, gcs.GCSImportStorage and so on, describe io_storages.S3ImportStorage fails, and drift prints 25 "migrated, but models.py does not declare it" lines for io_storages.*.
Repro
io_storages/__init__.py, io_storages/migrations/__init__.py, io_storages/s3/__init__.py: empty.
io_storages/models.py
from .s3.models import S3ImportStorage # noqa: F401
io_storages/s3/models.py
from django.db import models
class S3ImportStorage(models.Model):
bucket = models.TextField(null=True, blank=True)
prefix = models.TextField(null=True, blank=True)
io_storages/migrations/0001_initial.py
from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = []
operations = [
migrations.CreateModel(
name="S3ImportStorage",
fields=[
("id", models.AutoField(primary_key=True, serialize=False)),
("bucket", models.TextField(null=True, blank=True)),
("prefix", models.TextField(null=True, blank=True)),
],
),
]
$ orm-lens list
s3.S3ImportStorage
$ orm-lens describe io_storages.S3ImportStorage
error: model 'io_storages.S3ImportStorage' not found
$ orm-lens drift
~ io_storages.s3importstorage: migrated, but models.py does not declare it
stale table, or the model lives outside the parsed tree
summary: 1 model(s) drifted, 0 blocking, 1 migration(s) replayed
Expected: io_storages.S3ImportStorage, no drift.
Where
cli/orm_lens/parser.py, lines 610–614 inparse_models_file()(line 498): setsapp_namefrom the parent directory, or the grandparent formodels/.cli/orm_lens/_paths.py, line 21,_app_dir_for(): the same rule, used to group models into apps (parser.py:1191) and to pick a base class in the same app (parser.py:826). Both have to agree.
Suggested fix
Put the lookup in _app_dir_for() and use it from parse_models_file() too, instead of the inline copy:
- Start at the directory of the file (or the parent of a
models/package, as now). - If that directory has
migrations/orapps.py, it's the app. - Otherwise go up while the parent is still a package (has
__init__.py) and stop at the first directory that hasmigrations/orapps.py. - Nothing found: today's rule.
The __init__.py check keeps the walk inside the project. Meta.app_label is a separate case, leave it out.
src/parser.ts has the same rule (around lines 380 and 632). A Python-only fix is fine, leave a note in the PR for the TS side.
How to test
- A new test with the repro:
listgivesio_storages.S3ImportStorage,driftreports nothing. - A plain app (
shop/models.py) and amodels/package (shop/models/order.py) keep their labels. - A
models.pyin a folder with nomigrations/orapps.pyabove it keeps today's label. - Run the golden snapshots. If a project changes, update it and list the changes in the PR.
cd cli && python -m pytest -q,ruffandmypypass.
Difficulty: good first issue, one helper and a few tests.
- 主要言語
- Python
- スター
- 84
- フォーク
- 13
- PR マージ指標
- 30日以内にマージされた PR はありません
環境構築
- Dockerfile または Docker Compose ファイルあり
- プルリクエストのテンプレートあり
- コントリビューションガイドを読む
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
FROWNINGdev/django-orm-lens のほかの issue
-
suggest-indexes proposes composite indexes that include the primary key or a unique field対応中かも @bfs2021 が今日担当しました。 オープンbug good first issue python
難易度 2/5 1〜3時間 初心者へのやさしさ 82/100
FROWNINGdev/django-orm-lens#269 ·
-
`migration-risk` text output prints `app.None` for graph-level findings対応中かも @phoenixbycaselka が今日担当しました。 オープンbug good first issue python
難易度 1/5 1〜3時間 初心者へのやさしさ 88/100
FROWNINGdev/django-orm-lens#268 ·
-
Finish the Chinese rule reference — DOL001–DOL007再び着手できるかも @harbinresearcher が 64 日前に担当しましたが、オープン中のプルリクエストはありません。 オープンdocumentation good first issue help wanted
難易度 2/5 1〜3時間 初心者へのやさしさ 68/100
FROWNINGdev/django-orm-lens#81 · コメント 2 件 ·
-
Fields inherited from Django's `AbstractBaseUser` / `PermissionsMixin` / `AbstractUser` are missingオープンbug good first issue python
難易度 3/5 1〜2日 初心者へのやさしさ 62/100
FROWNINGdev/django-orm-lens#267 ·
-
enhancement help wanted python
難易度 4/5 3〜5日 初心者へのやさしさ 35/100
FROWNINGdev/django-orm-lens#254 ·
FROWNINGdev/django-orm-lens の issue をすべて見る
似ている issue
-
難易度 2/5 1〜3時間 初心者へのやさしさ 72/100
gorakhargosh/watchdog#1462 ·
メンテナーはふだん 1 日以内に返信
-
難易度 2/5 1〜3時間 初心者へのやさしさ 85/100
openwisp/openwisp-monitoring#889 ·
メンテナーはふだん 2 日以内に返信
-
難易度 2/5 1〜3時間 初心者へのやさしさ 70/100
OpenFreeEnergy/Lomap#180 ·
-
難易度 2/5 1〜3時間 初心者へのやさしさ 62/100
roman-corgi/corgisim#327 ·
メンテナーはふだん 2 日以内に返信
-
agent:WSL bug code-review linux pri:medium sev:low tooling
難易度 2/5 半日 初心者へのやさしさ 62/100
メンテナーはふだん 1 日以内に返信