feat: add people to projects and articles

This commit is contained in:
mohamad
2026-10-28 22:10:43 +08:00
parent 473637f477
commit 7c186b4230
14 changed files with 288 additions and 18 deletions
+38 -1
View File
@@ -1,7 +1,10 @@
from django.test import TestCase
from django.urls import reverse
from apps.products.models import Article, ArticleSection, MainProduct, SubProduct
from apps.products.models import (
Article, ArticlePerson, ArticleSection, MainProduct, MainProductPerson,
SubProduct, SubProductPerson,
)
class ProductViewsSetup(TestCase):
@@ -56,6 +59,31 @@ class ProductOverviewViewTest(ProductViewsSetup):
class MainProductDetailViewTest(ProductViewsSetup):
def test_project_and_article_people_are_independent_and_ordered(self):
MainProductPerson.objects.create(main_product=self.main_product, name="Main collaborator", role="Collaborator", order=1)
MainProductPerson.objects.create(main_product=self.main_product, name="Main organizer", role="Organizer", order=9)
main_article = Article.objects.create(main_product=self.main_product, title="Main article", description="Text")
ArticlePerson.objects.create(article=main_article, name="Article advisor", role="Scientific advisor", order=0)
response = self.client.get(self.main_product.get_absolute_url())
html = response.content.decode()
self.assertLess(html.index("Main organizer"), html.index("Main collaborator"))
self.assertContains(response, "Article advisor")
self.assertNotContains(response, "Sub collaborator")
self.assertContains(response, f'id="article-{main_article.pk}-people"')
def test_people_section_is_hidden_until_created_and_read_more_is_optional(self):
response = self.client.get(self.main_product.get_absolute_url())
self.assertNotContains(response, 'id="main-project-people"')
person = MainProductPerson.objects.create(
main_product=self.main_product, name="Project leader", description="A long biography",
)
response = self.client.get(self.main_product.get_absolute_url())
self.assertContains(response, "Project leader")
self.assertNotContains(response, 'data-readmore="88"')
person.read_more_description = True
person.save(update_fields=["read_more_description"])
self.assertContains(self.client.get(self.main_product.get_absolute_url()), 'data-readmore="88"')
def test_read_more_can_be_set_per_article_and_section(self):
url = self.main_product.get_absolute_url()
article = Article.objects.create(main_product=self.main_product, title="Notes", description="Long notes")
@@ -112,6 +140,15 @@ class MainProductDetailViewTest(ProductViewsSetup):
class SubProductDetailViewTest(ProductViewsSetup):
def test_sub_project_and_article_people_render_separately(self):
SubProductPerson.objects.create(sub_product=self.sub_product, name="Sub organizer", role="Organizer")
ArticlePerson.objects.create(article=self.article, name="Article collaborator", role="Collaborator")
response = self.client.get(self.sub_product.get_absolute_url())
self.assertContains(response, "Sub organizer")
self.assertContains(response, "Article collaborator")
self.assertContains(response, 'id="sub-project-people"')
self.assertNotContains(self.client.get(self.main_product.get_absolute_url()), "Sub organizer")
def test_sub_detail_returns_200(self):
url = reverse(
"products:sub_product_detail",