Skip to content

Commit efcbe4e

Browse files
renzonrenzon
authored andcommitted
Implemented Chapters
close #274
1 parent 1ae1222 commit efcbe4e

File tree

18 files changed

+271
-21
lines changed

18 files changed

+271
-21
lines changed

contrib/env-sample

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ DEBUG=True
22
SECRET_KEY=Change for a secret here
33
ALLOWED_HOSTS=localhost, 127.0.0.1
44
SENTRY_DSN=
5+
DATABASE_URL=
56

67
# Amazon S3 configuration
78
DJANGO_AWS_ACCESS_KEY_ID=

pythonpro/modules/admin.py

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,21 @@
11
from django.contrib import admin
22
from ordered_model.admin import OrderedModelAdmin
33

4-
from pythonpro.modules.models import Section, Module
4+
from pythonpro.modules.models import Section, Module, Chapter
5+
6+
7+
class ModuleAdmin(OrderedModelAdmin):
8+
list_display = 'title slug order move_up_down_links'.split()
59

610

711
class SectionAdmin(OrderedModelAdmin):
812
list_display = 'title slug module order move_up_down_links'.split()
913

1014

11-
class ModuleAdmin(OrderedModelAdmin):
12-
list_display = 'title slug order move_up_down_links'.split()
15+
class ChapterAdmin(OrderedModelAdmin):
16+
list_display = 'title slug section order move_up_down_links'.split()
1317

1418

15-
admin.site.register(Section, SectionAdmin)
1619
admin.site.register(Module, ModuleAdmin)
20+
admin.site.register(Section, SectionAdmin)
21+
admin.site.register(Chapter, ChapterAdmin)

pythonpro/modules/chapters_urls.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
from django.urls import path
2+
3+
from pythonpro.modules import chapters_views
4+
5+
app_name = 'chapters'
6+
urlpatterns = [
7+
path('<slug:slug>/', chapters_views.detail, name='detail'),
8+
]
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
from django.shortcuts import render
2+
3+
from pythonpro.modules import facade
4+
5+
6+
def detail(request, slug):
7+
ctx = {'chapter': facade.get_chapter_with_contents(slug=slug)}
8+
return render(request, 'chapters/chapter_detail.html', context=ctx)

pythonpro/modules/facade.py

Lines changed: 35 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
from django.db.models import Prefetch
22

3-
from pythonpro.modules.models import Section as _Section, Module as _Module
3+
from pythonpro.modules.models import Section as _Section, Module as _Module, Chapter as _Chapter
44

55

66
def get_all_modules():
@@ -11,16 +11,46 @@ def get_all_modules():
1111
return tuple(_Module.objects.order_by('order'))
1212

1313

14-
def get_module_sections(slug):
14+
def get_module_with_sections_and_chapters(slug):
1515
"""
16-
Search for a module with respective sections
17-
:param slug: module slugs
16+
Search for a module with respective sections and chapters
17+
:param slug: module's slug
1818
:return: Module with respective section on attribute sections
1919
"""
2020

2121
return _Module.objects.filter(slug=slug).prefetch_related(
2222
Prefetch(
2323
'section_set',
24-
queryset=_Section.objects.order_by('order'),
24+
queryset=_Section.objects.order_by('order').prefetch_related(
25+
Prefetch(
26+
'chapter_set',
27+
queryset=_Chapter.objects.order_by('order'),
28+
to_attr='chapters'
29+
)
30+
),
2531
to_attr='sections')
2632
).get()
33+
34+
35+
def get_section_with_module_and_chapters(slug):
36+
"""
37+
Search for a section with respective module and chapters
38+
:param slug: section's slug
39+
:return: Section
40+
"""
41+
return _Section.objects.filter(slug=slug).select_related('module').prefetch_related(
42+
Prefetch(
43+
'chapter_set',
44+
queryset=_Chapter.objects.order_by('order'),
45+
to_attr='chapters'
46+
)
47+
).get()
48+
49+
50+
def get_chapter_with_contents(slug):
51+
"""
52+
Search for a chapter respective to slug with it's module and section
53+
:param slug: chapter's slug
54+
:return: Chapter
55+
"""
56+
return _Chapter.objects.filter(slug=slug).select_related('section').select_related('section__module').get()
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
[{"model": "modules.chapter", "pk": 1, "fields": {"order": 0, "title": "Introdu\u00e7\u00e3o", "description": "Nesse cap\u00edtulo voc\u00ea vai conferir a motiva\u00e7\u00e3o do curso, ou seja, como o jogo ficar\u00e1 ap\u00f3s a implementa\u00e7\u00e3o. Logo depois voc\u00ea vai aprender como instalar o Python em seu sistema operacional, editar c\u00f3digo e fazer pequenos testes no console.", "slug": "introducao-python-birds", "section": 1}}, {"model": "modules.chapter", "pk": 2, "fields": {"order": 1, "title": "Tipos Embutidos", "description": "Nesse cap\u00edtulo voc\u00ea vai aprender sobre os tipos embutidos. Eles formam um conjunto b\u00e1sicos de classes que serve para modelar o seu programa como n\u00fameros e palavras.", "slug": "tipos-embutidos", "section": 1}}]
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
[{"model": "modules.section", "pk": 1, "fields": {"order": 0, "title": "Programa\u00e7\u00e3o Procedural", "description": "Nessa se\u00e7\u00e3o voc\u00ea vai aprender programa\u00e7\u00e3o procedural. Esse paradigma consiste em voc\u00ea definir a resolu\u00e7\u00e3o de um problema, passo a passo, de forma linear. Funciona como uma receita culin\u00e1ria, onde cada passado \u00e9 definido exatamente um depois do outro.", "slug": "programacao-procedural", "module": 1}}, {"model": "modules.section", "pk": 2, "fields": {"order": 1, "title": "Orienta\u00e7\u00e3o a Objetos", "description": "Depois de aprende o paradigma procedural na se\u00e7\u00e3o anterior chega hora de conhecer outro: a Orienta\u00e7\u00e3o a Objetos (OO). Voc\u00ea vai aprender sobre classes e seus componentes, heran\u00e7a e utilizar esses conceitos para implementar o jogo Python Birds. Como toda mudan\u00e7a de paradigma, demora um tempo para se acostumar, mas \u00e9 importante aprender bem OO porque ela utilizada em in\u00fameras bibliotecas e frameworks.", "slug": "orientacao-a-objetos", "module": 1}}]
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
# Generated by Django 2.0.3 on 2018-03-17 16:03
2+
3+
from django.db import migrations, models
4+
import django.db.models.deletion
5+
6+
7+
class Migration(migrations.Migration):
8+
9+
dependencies = [
10+
('modules', '0005_auto_20180314_1817'),
11+
]
12+
13+
operations = [
14+
migrations.CreateModel(
15+
name='Chapter',
16+
fields=[
17+
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
18+
('order', models.PositiveIntegerField(db_index=True, editable=False)),
19+
('title', models.CharField(max_length=50)),
20+
('description', models.TextField()),
21+
('slug', models.SlugField(unique=True)),
22+
('section', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='modules.Section')),
23+
],
24+
options={
25+
'ordering': ['section', 'order'],
26+
},
27+
),
28+
]

pythonpro/modules/models.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,3 +69,17 @@ def get_absolute_url(self):
6969

7070
def parent(self):
7171
return self.module
72+
73+
74+
class Chapter(Content):
75+
section = models.ForeignKey('Section', on_delete=models.CASCADE)
76+
order_with_respect_to = 'section'
77+
78+
class Meta:
79+
ordering = ['section', 'order']
80+
81+
def get_absolute_url(self):
82+
return reverse('chapters:detail', kwargs={'slug': self.slug})
83+
84+
def parent(self):
85+
return self.section

pythonpro/modules/modules_views.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,12 @@
22
from django.shortcuts import render
33

44
# Create your views here.
5-
from pythonpro.modules.facade import get_module_sections, get_all_modules
5+
from pythonpro.modules.facade import get_module_with_sections_and_chapters, get_all_modules
66

77

88
@login_required
99
def detail(request, slug):
10-
module = get_module_sections(slug)
10+
module = get_module_with_sections_and_chapters(slug)
1111
return render(request, 'modules/module_detail.html', {'module': module})
1212

1313

0 commit comments

Comments
 (0)