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 %}
+ - {{ aula.titulo }}
+ {% 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})