diff --git a/pypro/modulos/facade.py b/pypro/modulos/facade.py index 78c5f39..6b69175 100644 --- a/pypro/modulos/facade.py +++ b/pypro/modulos/facade.py @@ -1,5 +1,5 @@ from typing import List - +from django.db.models import Prefetch from pypro.modulos.models import Modulo, Aula @@ -22,3 +22,10 @@ def listar_aulas_de_modulo_ordenadas(modulo: Modulo): def encontrar_aula(slug): return Aula.objects.select_related('modulo').get(slug=slug) + + +def listar_modulos_com_aulas(): + aulas_ordenadas = Aula.objects.order_by('order') + return Modulo.objects.order_by('order').prefetch_related( + Prefetch('aula_set', queryset=aulas_ordenadas, to_attr='aulas') + ).all() diff --git a/pypro/modulos/templates/modulos/indice.html b/pypro/modulos/templates/modulos/indice.html new file mode 100644 index 0000000..7e7fae1 --- /dev/null +++ b/pypro/modulos/templates/modulos/indice.html @@ -0,0 +1,28 @@ +{% extends 'base/base.html' %} +{% load static %} +{% block title %}{{modulo.titulo}}{% endblock title %} +{% block description %}Página com detalhes do módulo {{modulo.titulo}}{% endblock description %} +{% block body %} +
+ {% for modulo in modulos %} +
+
+

{{ modulo.titulo }}

+
+
Público
+
{{ modulo.publico }}
+
Descrição
+
{{ modulo.descricao }}
+
+

Aulas

+
    + {% for aula in modulo.aulas %} +
  1. {{ aula.titulo }}
  2. + {% endfor %} +
+
+
+ {% endfor %} +
+{% endblock body %} + diff --git a/pypro/modulos/tests/test_modulos_indice.py b/pypro/modulos/tests/test_modulos_indice.py new file mode 100644 index 0000000..5f6dac6 --- /dev/null +++ b/pypro/modulos/tests/test_modulos_indice.py @@ -0,0 +1,56 @@ +from typing import List + +import pytest +from django.urls import reverse +from pypro.django_assertions import assert_contains +from model_mommy import mommy + +from pypro.modulos.models import Modulo, Aula + + +@pytest.fixture +def modulos(db): + return mommy.make(Modulo, 2) + + +@pytest.fixture +def aulas(modulos): + aulas = [] + for modulo in modulos: + aulas.extend(mommy.make(Aula, 3, modulo=modulo)) + return aulas + + +@pytest.fixture +def resp(client, modulos, aulas): + resp = client.get(reverse('modulos:indice')) + return resp + + +def test_indice_disponivel(resp): + assert resp.status_code == 200 + + +def test_titulo(resp, modulos: List[Modulo]): + for modulo in modulos: + assert_contains(resp, modulo.titulo) + + +def test_descricao(resp, modulos: List[Modulo]): + for modulo in modulos: + assert_contains(resp, modulo.descricao) + + +def test_publico(resp, modulos: List[Modulo]): + for modulo in modulos: + assert_contains(resp, modulo.publico) + + +def test_aulas_titulos(resp, aulas: List[Aula]): + for aula in aulas: + assert_contains(resp, aula.titulo) + + +def test_aulas_urls(resp, aulas: List[Aula]): + for aula in aulas: + assert_contains(resp, aula.get_absolute_url()) diff --git a/pypro/modulos/urls.py b/pypro/modulos/urls.py index 1df8ee4..569e9d9 100644 --- a/pypro/modulos/urls.py +++ b/pypro/modulos/urls.py @@ -5,5 +5,6 @@ app_name = 'modulos' urlpatterns = [ path('', views.detalhe, name='detalhe'), + path('', views.indice, name='indice'), path('aulas/', views.aula, name='aula'), ] diff --git a/pypro/modulos/views.py b/pypro/modulos/views.py index 7be242d..5bf6de2 100644 --- a/pypro/modulos/views.py +++ b/pypro/modulos/views.py @@ -9,6 +9,11 @@ def detalhe(request, slug): return render(request, 'modulos/modulo_detalhe.html', {'modulo': modulo, 'aulas': aulas}) +def indice(request): + ctx = {'modulos': facade.listar_modulos_com_aulas()} + return render(request, 'modulos/indice.html', ctx) + + def aula(request, slug): aula = facade.encontrar_aula(slug) return render(request, 'modulos/aula_detalhe.html', {'aula': aula})