Fix mypy relation resolution in CI
All checks were successful
CI / nightly-e2e (pull_request) Has been skipped
CI / deploy (pull_request) Has been skipped
CI / pr-e2e (pull_request) Successful in 1m16s
CI / ci (pull_request) Successful in 1m23s

Disable reverse manager generation on ArticlePage.category and switch category selection to id-based queries so CI mypy can resolve models reliably.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
This commit is contained in:
Mark
2026-03-03 11:37:20 +00:00
parent 7669a5049c
commit f7ca4bc44b
2 changed files with 10 additions and 9 deletions

View File

@@ -68,7 +68,7 @@ class Migration(migrations.Migration):
blank=True, blank=True,
null=True, null=True,
on_delete=django.db.models.deletion.PROTECT, on_delete=django.db.models.deletion.PROTECT,
related_name="articles", related_name="+",
to="blog.category", to="blog.category",
), ),
), ),
@@ -79,7 +79,7 @@ class Migration(migrations.Migration):
name="category", name="category",
field=models.ForeignKey( field=models.ForeignKey(
on_delete=django.db.models.deletion.PROTECT, on_delete=django.db.models.deletion.PROTECT,
related_name="articles", related_name="+",
to="blog.category", to="blog.category",
), ),
), ),

View File

@@ -49,8 +49,9 @@ class HomePage(Page):
id__in=ArticlePage.objects.live().public().values_list("tags__id", flat=True) id__in=ArticlePage.objects.live().public().values_list("tags__id", flat=True)
).distinct().order_by("name") ).distinct().order_by("name")
) )
ctx["available_categories"] = ( category_ids = ArticlePage.objects.live().public().values_list("category_id", flat=True)
Category.objects.filter(show_in_nav=True, articles__live=True).distinct().order_by("sort_order", "name") ctx["available_categories"] = Category.objects.filter(show_in_nav=True, id__in=category_ids).order_by(
"sort_order", "name"
) )
return ctx return ctx
@@ -76,9 +77,8 @@ class ArticleIndexPage(RoutablePageMixin, Page):
tag_slug = request.GET.get("tag") tag_slug = request.GET.get("tag")
articles = self.get_articles() articles = self.get_articles()
all_articles = articles all_articles = articles
available_categories = ( category_ids = all_articles.values_list("category_id", flat=True)
Category.objects.filter(articles__in=all_articles).distinct().order_by("sort_order", "name") available_categories = Category.objects.filter(id__in=category_ids).order_by("sort_order", "name")
)
category_links = [ category_links = [
{"category": category, "url": self.get_category_url(category)} {"category": category, "url": self.get_category_url(category)}
for category in available_categories for category in available_categories
@@ -111,7 +111,8 @@ class ArticleIndexPage(RoutablePageMixin, Page):
@route(r"^category/(?P<category_slug>[-\w]+)/$") @route(r"^category/(?P<category_slug>[-\w]+)/$")
def category_listing(self, request, category_slug): def category_listing(self, request, category_slug):
category_qs = Category.objects.filter(articles__in=self.get_articles()).distinct() category_ids = self.get_articles().values_list("category_id", flat=True)
category_qs = Category.objects.filter(id__in=category_ids)
category = get_object_or_404(category_qs, slug=category_slug) category = get_object_or_404(category_qs, slug=category_slug)
return self.render(request, context_overrides=self.get_listing_context(request, active_category=category)) return self.render(request, context_overrides=self.get_listing_context(request, active_category=category))
@@ -187,7 +188,7 @@ class TagMetadata(models.Model):
class ArticlePage(SeoMixin, Page): class ArticlePage(SeoMixin, Page):
category = models.ForeignKey("blog.Category", on_delete=PROTECT, related_name="articles") category = models.ForeignKey("blog.Category", on_delete=PROTECT, related_name="+")
author = models.ForeignKey("authors.Author", on_delete=PROTECT) author = models.ForeignKey("authors.Author", on_delete=PROTECT)
hero_image = models.ForeignKey( hero_image = models.ForeignKey(
"wagtailimages.Image", null=True, blank=True, on_delete=SET_NULL, related_name="+" "wagtailimages.Image", null=True, blank=True, on_delete=SET_NULL, related_name="+"