final home desing

This commit is contained in:
2026-08-05 17:40:33 -05:00
parent cf78128284
commit 344cb524e3
5 changed files with 186 additions and 24 deletions
+57
View File
@@ -8,6 +8,63 @@ from django.core.cache import cache
from django.test import TestCase
from django.urls import reverse
from library.models import Project
class HomeSectionsTests(TestCase):
def setUp(self):
self.user = get_user_model().objects.create_user(username='Owner', password='pw')
def _home(self):
session = self.client.session
session['authorized'] = True
session.save()
self.client.force_login(self.user)
return self.client.get(reverse('landing:home')).content.decode()
def test_empty_categories_skipped(self):
Project.objects.create(slug='only-mod', title='Only Mod', category='mod', owner=self.user)
html = self._home()
self.assertIn('>Mod</h2>', html)
self.assertNotIn('>Skin</h2>', html)
self.assertNotIn('>Guide</h2>', html)
def test_popular_ordered_by_rating(self):
Project.objects.create(slug='m0', title='Mod 0', category='mod', owner=self.user, rating_score=0)
Project.objects.create(slug='m2', title='Mod 2', category='mod', owner=self.user, rating_score=2)
Project.objects.create(slug='m1', title='Mod 1', category='mod', owner=self.user, rating_score=1)
html = self._home()
sections = html.split('class="home-cat-block"')[1:]
mod = next(s for s in sections if '>Mod</h2>' in s)
popular = mod.split('home-cat-divider')[0]
self.assertLess(popular.index('Mod 2'), popular.index('Mod 1'))
self.assertLess(popular.index('Mod 1'), popular.index('Mod 0'))
def test_columns_capped_at_six(self):
for i in range(8):
Project.objects.create(slug=f'm{i}', title=f'Mod {i}', category='mod', owner=self.user, rating_score=i)
html = self._home()
sections = html.split('class="home-cat-block"')[1:]
mod = next(s for s in sections if '>Mod</h2>' in s)
popular = mod.split('home-cat-divider')[0]
recent = mod.split('home-cat-divider')[1]
self.assertEqual(popular.count('class="pack-card-row"'), 6)
self.assertEqual(recent.count('class="pack-card-row"'), 6)
def test_recent_column_orders_by_creation(self):
Project.objects.create(slug='s0', title='High', category='skin', owner=self.user, rating_score=5)
Project.objects.create(slug='s1', title='Mid', category='skin', owner=self.user, rating_score=3)
Project.objects.create(slug='s2', title='Low', category='skin', owner=self.user, rating_score=0)
html = self._home()
sections = html.split('class="home-cat-block"')[1:]
skin = next(s for s in sections if '>Skin</h2>' in s)
popular = skin.split('home-cat-divider')[0]
recent = skin.split('home-cat-divider')[1]
# Popular leads with the top-rated pack.
self.assertLess(popular.index('High'), popular.index('Low'))
# Recent leads with the newest (created last -> 'Low').
self.assertLess(recent.index('Low'), recent.index('High'))
class ServerStatsTests(TestCase):
def setUp(self):
+28 -6
View File
@@ -76,16 +76,38 @@ def gate(request):
def home(request):
latest_projects = (
Project.objects.select_related('owner', 'thumbnail')
.prefetch_related('tag_links__tag__category', 'versions')
.order_by('-created_at')[:4]
)
total_downloads = Version.objects.aggregate(total=Sum('downloads'))['total'] or 0
creators = (
get_user_model().objects.filter(projects__isnull=False).distinct().count()
)
# Per-category Popular (by rating) + Recent columns, 6 packs each.
def _base_query(category):
return (
Project.objects.filter(category=category)
.select_related('owner', 'thumbnail')
.prefetch_related('versions')
.annotate(downloads_total=Sum('versions__downloads'))
)
home_sections = []
for value, label in Project.CATEGORY_CHOICES:
base = _base_query(value)
popular = list(base.order_by('-rating_score', '-created_at')[:6])
recent = list(base.order_by('-created_at')[:6])
if popular or recent:
home_sections.append({
'value': value,
'label': label,
'popular': popular,
'recent': recent,
})
# Two categories share each row (compact cards leave room for it).
home_rows = [
home_sections[i:i + 2] for i in range(0, len(home_sections), 2)
]
announcements = (
Announcement.objects.filter(published=True)
.annotate(comments_count=Count('comments'))
@@ -106,7 +128,7 @@ def home(request):
)
context = {
'latest_projects': latest_projects,
'home_rows': home_rows,
'stats': {
'creators': creators,
'packs': Project.objects.count(),