Skip to content

Commit 0aa773d

Browse files
committed
- Addressed some feedback from PR Review
1 parent b3bc67a commit 0aa773d

File tree

8 files changed

+68
-53
lines changed

8 files changed

+68
-53
lines changed

home/forms.py

+3-4
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,14 @@
1+
from django.apps import apps
12
from wagtail.admin.forms import WagtailAdminPageForm
23

3-
from home.utils.progress import get_progress_bar_eligible_sections
4-
5-
64
class SectionPageForm(WagtailAdminPageForm):
75

86
def clean(self):
97
cleaned_data = super().clean()
108

119
if cleaned_data['show_progress_bar']:
12-
if self.instance not in get_progress_bar_eligible_sections():
10+
Section = apps.get_model('home', 'Section')
11+
if self.instance not in Section.get_progress_bar_eligible_sections():
1312
progress_bar_enabled_ancestor_title = self.instance.get_progress_bar_enabled_ancestor().title
1413
self.add_error(
1514
'show_progress_bar',
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
# Generated by Django 3.1.12 on 2021-06-29 08:21
2+
3+
from django.db import migrations
4+
5+
6+
class Migration(migrations.Migration):
7+
8+
dependencies = [
9+
('home', '0019_section_show_progress_bar'),
10+
('home', '0021_auto_20210628_1107'),
11+
]
12+
13+
operations = [
14+
]

home/models.py

+25-4
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
1+
from django.contrib.admin.utils import flatten
2+
from django.contrib.auth import get_user_model
13
from django.db import models
24
from django.utils.encoding import force_str
35
from django.utils.translation import gettext_lazy as _
46

57
from modelcluster.contrib.taggit import ClusterTaggableManager
8+
from rest_framework import status
69
from taggit.models import TaggedItemBase
710
from modelcluster.fields import ParentalKey
811
from wagtail.admin.edit_handlers import (
@@ -30,6 +33,7 @@
3033
from .forms import SectionPageForm
3134
from .utils.progress_manager import ProgressManager
3235

36+
User = get_user_model()
3337

3438
class HomePage(Page):
3539
template = 'home/home_page.html'
@@ -134,10 +138,11 @@ class Section(Page):
134138
base_form_class = SectionPageForm
135139

136140
def get_descendant_articles(self):
137-
return Article.objects.descendant_of(self).type(Article)
141+
return Article.objects.descendant_of(self).exact_type(Article)
138142

139143
def get_progress_bar_enabled_ancestor(self):
140-
return Section.objects.ancestor_of(self, inclusive=True).type(Section).filter(show_progress_bar=True).first()
144+
return Section.objects.ancestor_of(self, inclusive=True).exact_type(Section).filter(
145+
show_progress_bar=True).first()
141146

142147
def get_user_progress_dict(self, request):
143148
progress_manager = ProgressManager(request)
@@ -162,6 +167,22 @@ def get_context(self, request):
162167

163168
return context
164169

170+
@staticmethod
171+
def get_progress_bar_eligible_sections():
172+
"""
173+
Eligibility criteria:
174+
Sections whose ancestors don't have show_progress_bar=True are eligible to
175+
show progress bars.
176+
:return:e
177+
"""
178+
progress_bar_sections = Section.objects.filter(show_progress_bar=True)
179+
all_descendants = [list(Section.objects.type(Section).descendant_of(section).values_list('pk', flat=True)) for
180+
section in
181+
progress_bar_sections]
182+
all_descendants = set(flatten(all_descendants))
183+
184+
return Section.objects.exclude(pk__in=all_descendants)
185+
165186

166187
class ArticleRecommendation(Orderable):
167188
source = ParentalKey('Article', related_name='recommended_articles', on_delete=models.CASCADE, blank=True)
@@ -273,8 +294,8 @@ def get_context(self, request):
273294

274295
def serve(self, request):
275296
response = super().serve(request)
276-
progress_manager = ProgressManager(request)
277-
progress_manager.record_article_read(self)
297+
if response.status_code == status.HTTP_200_OK:
298+
User.record_article_read(request=request, article=self)
278299
return response
279300

280301
def description(self):
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
<div class="user-progress-container">
2-
{% if total %}
1+
{% if total %}
2+
<div class="user-progress-container">
33
<div>
44
User Progress: {{ read }}/{{ total }} completed
55
</div>
6-
{% endif %}
7-
</div>
6+
</div>
7+
{% endif %}

home/utils/progress.py

-19
This file was deleted.

home/utils/progress_manager.py

+1-18
Original file line numberDiff line numberDiff line change
@@ -3,29 +3,12 @@ class ProgressManager:
33
def __init__(self, request):
44
self.request = request
55

6-
def record_article_read(self, article):
7-
user = self.request.user
8-
if user.is_anonymous:
9-
read_articles = self.request.session.get('read_articles', [])
10-
if read_articles:
11-
if article.pk not in read_articles:
12-
# https://code.djangoproject.com/wiki/NewbieMistakes#Appendingtoalistinsessiondoesntwork
13-
read_articles = self.request.session['read_articles']
14-
read_articles.append(article.pk)
15-
self.request.session['read_articles'] = read_articles
16-
else:
17-
self.request.session['read_articles'] = [article.pk]
18-
else:
19-
if not user.viewed_articles.filter(id=article.id).exists():
20-
user.viewed_articles.add(article)
21-
22-
236
def get_progress(self, section):
247
user = self.request.user
258
if self.request.user.is_anonymous:
269
read_article_ids = set(self.request.session.get('read_articles', []))
2710
else:
28-
read_article_ids = set(user.viewed_articles.values_list('pk', flat=True))
11+
read_article_ids = set(user.read_articles.values_list('pk', flat=True))
2912

3013
progress_enabled_ancestor = section.get_progress_bar_enabled_ancestor()
3114
if progress_enabled_ancestor:
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,19 @@
1-
# Generated by Django 3.1.12 on 2021-06-28 17:21
1+
# Generated by Django 3.1.12 on 2021-06-29 08:23
22

33
from django.db import migrations, models
44

55

66
class Migration(migrations.Migration):
77

88
dependencies = [
9-
('home', '0019_section_show_progress_bar'),
9+
('home', '0022_merge_20210629_0821'),
1010
('iogt_users', '0002_auto_20210624_0739'),
1111
]
1212

1313
operations = [
1414
migrations.AddField(
1515
model_name='user',
16-
name='viewed_articles',
16+
name='read_articles',
1717
field=models.ManyToManyField(to='home.Article'),
1818
),
1919
]

iogt_users/models.py

+18-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,24 @@ class User(AbstractUser):
1313

1414
has_filled_registration_survey = models.BooleanField(default=False)
1515

16-
viewed_articles = models.ManyToManyField(to='home.Article')
16+
read_articles = models.ManyToManyField(to='home.Article')
17+
18+
@classmethod
19+
def record_article_read(cls, request, article):
20+
user = request.user
21+
if user.is_anonymous:
22+
read_articles = request.session.get('read_articles', [])
23+
if read_articles:
24+
if article.pk not in read_articles:
25+
# https://code.djangoproject.com/wiki/NewbieMistakes#Appendingtoalistinsessiondoesntwork
26+
read_articles = request.session['read_articles']
27+
read_articles.append(article.pk)
28+
request.session['read_articles'] = read_articles
29+
else:
30+
request.session['read_articles'] = [article.pk]
31+
else:
32+
if not user.read_articles.filter(id=article.id).exists():
33+
user.read_articles.add(article)
1734

1835
class Meta:
1936
ordering = ('id',)

0 commit comments

Comments
 (0)