Skip to content

Commit 5d91878

Browse files
Merge pull request #12 from ukhsa-collaboration/feature/A10N-2356
Feature/a10 n 2356
2 parents 70cb5ee + 3bfee56 commit 5d91878

14 files changed

Lines changed: 70 additions & 64 deletions

File tree

.python-version

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
3.11
1+
3.11.14

Dockerfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
FROM python:3.11.9-slim-bullseye
1+
FROM python:3.11.14-slim-bookworm
22
ENV PYTHONUNBUFFERED=1
33

44
RUN apt-get update &&\

active10/middleware.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -54,9 +54,8 @@ class SecurityHeadersMiddleware(MiddlewareMixin):
5454
def process_response(self, request, response):
5555
response["Permissions-Policy"] = "geolocation=(), microphone=(), camera=()"
5656

57-
# these headers do not necessarily apply to this app
58-
# response['Cross-Origin-Embedder-Policy'] = 'require-corp'
59-
# response['Cross-Origin-Resource-Policy'] = 'same-origin'
57+
response['Cross-Origin-Embedder-Policy'] = 'require-corp'
58+
response['Cross-Origin-Resource-Policy'] = 'same-origin'
6059
return response
6160

6261

active10/settings.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -401,6 +401,7 @@
401401
# Static files (CSS, JavaScript, Images)
402402
# https://docs.djangoproject.com/en/2.0/howto/static-files/
403403

404+
AWS_S3_CUSTOM_DOMAIN = None
404405
if getenv("AWS_STORAGE_BUCKET_NAME", None) is not None:
405406
REDIRECT_STATIC_TO_CDN = True
406407
AWS_ACCESS_KEY_ID = getenv("AWS_ACCESS_KEY_ID", "")
@@ -476,3 +477,10 @@
476477
)
477478
CSP_IMG_SRC = ("'self'", "*.s3.amazonaws.com", AWS_S3_CUSTOM_DOMAIN, "https://www.gravatar.com")
478479
CSP_FONT_SRC = ("'self'", "*.s3.amazonaws.com", AWS_S3_CUSTOM_DOMAIN, "https://www.gravatar.com")
480+
if AWS_S3_CUSTOM_DOMAIN:
481+
CSP_DEFAULT_SRC.append(AWS_S3_CUSTOM_DOMAIN)
482+
CSP_STYLE_SRC.append(AWS_S3_CUSTOM_DOMAIN)
483+
CSP_SCRIPT_SRC.append(AWS_S3_CUSTOM_DOMAIN)
484+
CSP_IMG_SRC.append(AWS_S3_CUSTOM_DOMAIN)
485+
CSP_FONT_SRC.append(AWS_S3_CUSTOM_DOMAIN)
486+

applications/articles/serializers.py

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
from rest_framework import serializers
22

3-
from .models import Article, ArticleCategory, ContentView
3+
from .models import Article, ArticleCategory
44
from .utils import html_text_to_json
55

66

@@ -28,14 +28,10 @@ def get_destination(self, obj):
2828
return {"ios": ios, "android": android}
2929

3030
def get_view_ids(self, obj):
31-
return obj.views.through.objects.filter(article=obj.id).order_by("order").values_list("view_id", flat=True)
31+
return [av.view_id for av in obj.articleview_set.all()]
3232

3333
def get_related_article_ids(self, obj):
34-
return (
35-
obj.related.through.objects.filter(article=obj.id)
36-
.order_by("order")
37-
.values_list("related_article", flat=True)
38-
)
34+
return [ar.related_article_id for ar in obj.parent_article.all()]
3935

4036
def get_category_name(self, obj):
4137
return obj.category.name
@@ -50,7 +46,7 @@ def get_content_as_json(self, obj):
5046
return html_text_to_json(obj.content)
5147

5248
def get_content_view_ids(self, obj):
53-
return ContentView.objects.filter(article__id=obj.id).order_by("order").values_list("view_id", flat=True)
49+
return [cv.view_id for cv in obj.contentview_set.all()]
5450

5551
class Meta:
5652
model = Article

applications/articles/views.py

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,22 @@
1+
from django.db.models import Prefetch
12
from django.utils.decorators import method_decorator
23
from django.views.decorators.cache import cache_page
34
from rest_framework import viewsets
45
from rest_framework.response import Response
56

6-
from .models import Article, ArticleCategory
7+
from .models import Article, ArticleCategory, ArticleView, ArticleRelated, ContentView
78
from .serializers import ArticleCategorySerializer, ArticleSerializer
89

910

1011
@method_decorator(cache_page(60), name="dispatch")
1112
class ArticlesViewSet(viewsets.ModelViewSet):
12-
queryset = Article.objects.filter(published=True)
13+
queryset = Article.objects.filter(published=True).select_related(
14+
'category', 'image'
15+
).prefetch_related(
16+
Prefetch('articleview_set', queryset=ArticleView.objects.order_by('order')),
17+
Prefetch('parent_article', queryset=ArticleRelated.objects.order_by('order')),
18+
Prefetch('contentview_set', queryset=ContentView.objects.order_by('order')),
19+
)
1320
serializer_class = ArticleSerializer
1421
http_method_names = ["get", "options"] # noqa: RUF012
1522
lookup_field = "id"

applications/discover/views.py

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,6 @@
1010
@method_decorator(name="get", decorator=discover_doc())
1111
class DiscoverView(GenericAPIView):
1212
def get(self, request, *args, **kwargs):
13-
discover_serializer = DiscoverSerializer(
14-
Discover.objects.filter(published=True),
15-
many=True,
16-
context=self.get_serializer_context(),
17-
)
18-
tip_serializer = TipSerializer(
19-
Carousel.objects.filter(published=True),
20-
many=True,
21-
context=self.get_serializer_context(),
22-
)
13+
discover_serializer = DiscoverSerializer(Discover.objects.filter(published=True).select_related('splash_screen'), many=True, context=self.get_serializer_context())
14+
tip_serializer = TipSerializer(Carousel.objects.filter(published=True).select_related('cta'), many=True, context=self.get_serializer_context())
2315
return Response(dict(discover=discover_serializer.data, tips=tip_serializer.data))

applications/global_rules/serializers.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ def to_representation(self, instance):
6969
)
7070

7171
serialized_app_version = AppVersionSerializer(
72-
AppVersion.objects.all(), many=True, context=self.context
72+
AppVersion.objects.select_related('app').all(), many=True, context=self.context
7373
)
7474

7575
# Flaten the list of dictionaries

applications/my_walks/serializers.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ def get_my_walks_dynamic_text(self, obj):
4646
return MyWalkDynamicTextSerializer(MyWalk.objects.all(), many=True).data
4747

4848
def get_todays_walks_dynamic_text(self, obj):
49-
return TodayWalkDynamicTextSerializer(TodayWalk.objects.all(), many=True).data
49+
return TodayWalkDynamicTextSerializer(TodayWalk.objects.prefetch_related('target_set').all(), many=True).data
5050

5151
def to_representation(self, instance):
5252
original_representation = super(MyWalksSerializer, self).to_representation(instance) # noqa: UP008

applications/notifications/serializers.py

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
LocalNotification,
66
Onboarding,
77
Reminder,
8-
UserInfo,
98
)
109

1110

@@ -26,7 +25,7 @@ class Meta:
2625

2726
def get_userinfo(self, obj):
2827
serializer = UserInfoSerializer(
29-
UserInfo.objects.filter(lapsed=obj.id), many=True, context=self.context
28+
obj.userinfo.all(), many=True, context=self.context
3029
)
3130

3231
# Flaten the list of dictionaries
@@ -46,7 +45,7 @@ class Meta:
4645

4746
def get_userinfo(self, obj):
4847
serializer = UserInfoSerializer(
49-
UserInfo.objects.filter(onboarding=obj.id), many=True, context=self.context
48+
obj.userinfo.all(), many=True, context=self.context
5049
)
5150

5251
# Flaten the list of dictionaries
@@ -75,10 +74,10 @@ def __init__(self, instance=None, data=dict(), **kwargs): # noqa: B006
7574

7675
def to_representation(self, instance):
7776
serialized_onboarding = OnboardingSerializer(
78-
Onboarding.objects.all(), many=True, context=self.context
77+
Onboarding.objects.prefetch_related('userinfo').all(), many=True, context=self.context
7978
)
8079

81-
serialized_lapsed = LapsedSerializer(Lapsed.objects.all(), many=True, context=self.context)
80+
serialized_lapsed = LapsedSerializer(Lapsed.objects.prefetch_related('userinfo').all(), many=True, context=self.context)
8281

8382
serialized_reminder = ReminderSerializer(
8483
Reminder.objects.all(),

0 commit comments

Comments
 (0)