From 666106e29f9c0cc6594a4b9ec517e9f893b22ed7 Mon Sep 17 00:00:00 2001 From: mortezaei Date: Sun, 9 Aug 2026 16:37:09 +0330 Subject: [PATCH 1/6] feat: add bibliographic fields to Book model and enforce HTTPS for absolute URLs across serializers --- apps/article/serializers_admin.py | 5 ++--- apps/hadis/serializers/serializers_admin.py | 5 ++--- apps/library/serializers_admin.py | 5 ++--- apps/podcast/serializers_admin.py | 5 ++--- apps/video/serializers_admin.py | 5 ++--- utils/__init__.py | 18 ++++++++++++------ 6 files changed, 22 insertions(+), 21 deletions(-) diff --git a/apps/article/serializers_admin.py b/apps/article/serializers_admin.py index 201807e..fb4e028 100644 --- a/apps/article/serializers_admin.py +++ b/apps/article/serializers_admin.py @@ -1,6 +1,7 @@ from rest_framework import serializers from django.core.files.uploadedfile import SimpleUploadedFile from utils.image_compression import maybe_compress_uploaded_file +from utils import absolute_https_url from .models import Article, ArticleCategory, ArticleCollection, ArticleContent, ContentPart, TextSection @@ -23,9 +24,7 @@ class AbsoluteImageField(serializers.ImageField): return None request = self.context.get("request") url = value.url if hasattr(value, "url") else str(value) - if request: - return request.build_absolute_uri(url) - return url + return absolute_https_url(url, request) class AbsoluteFileField(serializers.FileField): diff --git a/apps/hadis/serializers/serializers_admin.py b/apps/hadis/serializers/serializers_admin.py index 0ff0752..8f4aeb9 100644 --- a/apps/hadis/serializers/serializers_admin.py +++ b/apps/hadis/serializers/serializers_admin.py @@ -2,6 +2,7 @@ from rest_framework import serializers from django.core.files.uploadedfile import SimpleUploadedFile from utils.image_compression import maybe_compress_uploaded_file +from utils import absolute_https_url from ..models import ( Hadis, HadisCategory, HadisStatus, HadisTag, HadisCorrection, HadisInterpretation, HadisCollection, HadisSect, HadisInCollection, HadisTransmitter, HadisReference, BookReference, BookReferenceImage, BookReferenceDocument, BookAuthor, BookAttribute, BookSubjectArea, BookType, BookEdition, BookVolume, BookResearcher, BookEditor, @@ -33,9 +34,7 @@ class AbsoluteImageField(serializers.ImageField): return None request = self.context.get("request") url = value.url if hasattr(value, "url") else str(value) - if request: - return request.build_absolute_uri(url) - return url + return absolute_https_url(url, request) class AdminHadisCategorySerializer(serializers.ModelSerializer): diff --git a/apps/library/serializers_admin.py b/apps/library/serializers_admin.py index 7025282..5337135 100644 --- a/apps/library/serializers_admin.py +++ b/apps/library/serializers_admin.py @@ -1,6 +1,7 @@ from rest_framework import serializers from django.core.files.uploadedfile import SimpleUploadedFile from utils.image_compression import maybe_compress_uploaded_file +from utils import absolute_https_url from .models import Author, Book, BookCollection, Category @@ -23,9 +24,7 @@ class AbsoluteImageField(serializers.ImageField): return None request = self.context.get("request") url = value.url if hasattr(value, "url") else str(value) - if request: - return request.build_absolute_uri(url) - return url + return absolute_https_url(url, request) class AbsoluteFileField(serializers.FileField): diff --git a/apps/podcast/serializers_admin.py b/apps/podcast/serializers_admin.py index 043e757..7dd7104 100644 --- a/apps/podcast/serializers_admin.py +++ b/apps/podcast/serializers_admin.py @@ -1,6 +1,7 @@ from rest_framework import serializers from django.core.files.uploadedfile import SimpleUploadedFile from utils.image_compression import maybe_compress_uploaded_file +from utils import absolute_https_url from .models import PlaylistItem, Podcast, PodcastCategory, PodcastCollection, PodcastPlaylist @@ -23,9 +24,7 @@ class AbsoluteImageField(serializers.ImageField): return None request = self.context.get("request") url = value.url if hasattr(value, "url") else str(value) - if request: - return request.build_absolute_uri(url) - return url + return absolute_https_url(url, request) class AbsoluteFileField(serializers.FileField): diff --git a/apps/video/serializers_admin.py b/apps/video/serializers_admin.py index 3758426..fd73d08 100644 --- a/apps/video/serializers_admin.py +++ b/apps/video/serializers_admin.py @@ -1,6 +1,7 @@ from rest_framework import serializers from django.core.files.uploadedfile import SimpleUploadedFile from utils.image_compression import maybe_compress_uploaded_file +from utils import absolute_https_url from .models import PlaylistItem, Video, VideoCategory, VideoCollection, VideoPlaylist @@ -23,9 +24,7 @@ class AbsoluteImageField(serializers.ImageField): return None request = self.context.get("request") url = value.url if hasattr(value, "url") else str(value) - if request: - return request.build_absolute_uri(url) - return url + return absolute_https_url(url, request) class AbsoluteFileField(serializers.FileField): diff --git a/utils/__init__.py b/utils/__init__.py index b6d9016..36941ce 100644 --- a/utils/__init__.py +++ b/utils/__init__.py @@ -36,6 +36,17 @@ from utils.image_compression import maybe_compress_uploaded_file logger = logging.getLogger(__name__) + +def absolute_https_url(url, request=None): + """Build an absolute URL and always expose it over HTTPS.""" + if request: + url = request.build_absolute_uri(url) + + if isinstance(url, str) and url.startswith('http://'): + return f'https://{url[7:]}' + + return url + # Moved filer imports to avoid circular imports # These will be imported when needed in functions @@ -63,12 +74,7 @@ def get_thumbs(obj, request: HttpRequest = None) -> dict: # برای هر سه سایز، همان URL اصلی را برگردان for size in sizes: - if request: - url = request.build_absolute_uri(original_url) - else: - url = original_url - - thumbnail_object[size] = url + thumbnail_object[size] = absolute_https_url(original_url, request) return thumbnail_object From 4be852ff416510ffbd11b67eb445dc3a3801935b Mon Sep 17 00:00:00 2001 From: mortezaei Date: Sun, 9 Aug 2026 16:38:57 +0330 Subject: [PATCH 2/6] refactor(api): replace build_absolute_uri with absolute_https_url Replace direct calls to `request.build_absolute_uri` with a centralized `absolute_https_url` utility across account and hadis modules. This ensures consistent enforcement of HTTPS for all absolute media URLs (avatars, thumbnails, and images) in serializers and views.rl --- apps/account/views/user.py | 8 ++++---- apps/hadis/serializers/hadis.py | 17 +++++++++-------- apps/hadis/serializers/reference_v2.py | 19 ++++++++++--------- apps/hadis/serializers/serializers_admin.py | 6 +++--- apps/hadis/views/category.py | 3 ++- 5 files changed, 28 insertions(+), 25 deletions(-) diff --git a/apps/account/views/user.py b/apps/account/views/user.py index c5d8e69..21bae69 100644 --- a/apps/account/views/user.py +++ b/apps/account/views/user.py @@ -27,7 +27,7 @@ from apps.account.serializers import UserRegisterSerializer, UserProfileSerializ from apps.account.serializers.user_web import WebUserRegisterSerializer from utils.redis import RedisManager from utils.exceptions import AppAPIException -from utils import send_email, is_valid_email +from utils import send_email, is_valid_email, absolute_https_url from config.settings import base as settings from apps.account.permissions import IsActiveUser, IsSuperAdminOrReadOnlyForProfessor from apps.account.doc import * @@ -431,7 +431,7 @@ class UserLoginView(CreateAPIView): "email": user.email, "token": token.key, "user_type": user.user_type, - "avatar": request.build_absolute_uri(user.avatar.url) if user.avatar else None, + "avatar": absolute_https_url(user.avatar.url, request) if user.avatar else None, }, status=status.HTTP_201_CREATED) @@ -492,7 +492,7 @@ class UserRecoverPassword(CreateAPIView): "fullname": user.fullname, "phone_number": str(user.phone_number) if user.phone_number else None, "email": user.email if user.email else None, - "avatar": request.build_absolute_uri(user.avatar.url) if user.avatar else None, + "avatar": absolute_https_url(user.avatar.url, request) if user.avatar else None, "message": "Forgot password code sent" }, status=status.HTTP_202_ACCEPTED, @@ -633,7 +633,7 @@ class AdminLoginView(CreateAPIView): "email": user.email, "token": token.key, "user_type": effective_user_type, - "avatar": request.build_absolute_uri(user.avatar.url) if user.avatar else None, + "avatar": absolute_https_url(user.avatar.url, request) if user.avatar else None, }, status=status.HTTP_201_CREATED) diff --git a/apps/hadis/serializers/hadis.py b/apps/hadis/serializers/hadis.py index ac4dd8c..891bddd 100644 --- a/apps/hadis/serializers/hadis.py +++ b/apps/hadis/serializers/hadis.py @@ -8,6 +8,7 @@ from .category import LocalizedField, ArabicLocalizedField from .category import get_localized_text, get_arabic_localized_text from .category import get_localized_text from apps.bookmark.serializers.bookmark import BookmarkStatusSerializer +from utils import absolute_https_url from ..models import ( Hadis, HadisStatus, HadisTag, HadisTransmitter, @@ -58,8 +59,8 @@ class PinnedHadisCollectionSerializer(serializers.ModelSerializer): if obj.thumbnail: request = self.context.get('request') if request: - return request.build_absolute_uri(obj.thumbnail.url) - return obj.thumbnail.url + return absolute_https_url(obj.thumbnail.url, request) + return absolute_https_url(obj.thumbnail.url) return None class HadisCollectionListSerializer(serializers.ModelSerializer): @@ -75,8 +76,8 @@ class HadisCollectionListSerializer(serializers.ModelSerializer): if obj.thumbnail: request = self.context.get('request') if request: - return request.build_absolute_uri(obj.thumbnail.url) - return obj.thumbnail.url + return absolute_https_url(obj.thumbnail.url, request) + return absolute_https_url(obj.thumbnail.url) return None @@ -142,7 +143,7 @@ class HadisSyncSerializer(serializers.ModelSerializer): for img in reference.images.all(): thumb_url = None if img.thumbnail: - thumb_url = request.build_absolute_uri(img.thumbnail.url) if request else img.thumbnail.url + thumb_url = absolute_https_url(img.thumbnail.url, request) reference_images_block.append({ 'id': img.id, 'thumbnail': thumb_url, @@ -770,8 +771,8 @@ class ReferenceImageSerializer(serializers.ModelSerializer): if obj.thumbnail: request = self.context.get('request') if request: - return request.build_absolute_uri(obj.thumbnail.url) - return obj.thumbnail.url + return absolute_https_url(obj.thumbnail.url, request) + return absolute_https_url(obj.thumbnail.url) return None @@ -1220,4 +1221,4 @@ class TransmitterOriginalTextDetailSerializer(serializers.ModelSerializer): "id": obj.transmitter.id, "slug": obj.transmitter.slug, "name": get_localized_text(obj.transmitter.full_name, self.context.get('request')) - } \ No newline at end of file + } diff --git a/apps/hadis/serializers/reference_v2.py b/apps/hadis/serializers/reference_v2.py index cfcd09f..6b87afa 100644 --- a/apps/hadis/serializers/reference_v2.py +++ b/apps/hadis/serializers/reference_v2.py @@ -5,6 +5,7 @@ from .category import get_localized_text from apps.hadis.serializers import HadisListSerializer, HadisShortSerializer from ..serializers.category import LocalizedField from ..serializers.reference import BookAttributeSerializer, BookReferenceImageSerializer +from utils import absolute_https_url class BookTagV2Serializer(serializers.ModelSerializer): title = LocalizedField() @@ -58,8 +59,8 @@ class BookReferenceV2ListSerializer(serializers.ModelSerializer): if first_image and first_image.image: request = self.context.get('request') if request: - return request.build_absolute_uri(first_image.image.url) - return first_image.image.url + return absolute_https_url(first_image.image.url, request) + return absolute_https_url(first_image.image.url) return None class BookEditionV2Serializer(serializers.ModelSerializer): @@ -99,8 +100,8 @@ class BookVolumeV2Serializer(serializers.ModelSerializer): if first_image and first_image.image: request = self.context.get('request') if request: - return request.build_absolute_uri(first_image.image.url) - return first_image.image.url + return absolute_https_url(first_image.image.url, request) + return absolute_https_url(first_image.image.url) return None class BookReferenceV2DetailSerializer(serializers.ModelSerializer): @@ -128,8 +129,8 @@ class BookReferenceV2DetailSerializer(serializers.ModelSerializer): if first_image and first_image.image: request = self.context.get('request') if request: - return request.build_absolute_uri(first_image.image.url) - return first_image.image.url + return absolute_https_url(first_image.image.url, request) + return absolute_https_url(first_image.image.url) return None def get_information(self, obj): @@ -305,8 +306,8 @@ class AuthorBookReferenceSerializer(serializers.ModelSerializer): if first_image and first_image.image: request = self.context.get('request') if request: - return request.build_absolute_uri(first_image.image.url) - return first_image.image.url + return absolute_https_url(first_image.image.url, request) + return absolute_https_url(first_image.image.url) return None # یک سریالایزر مینیمال برای کتاب‌ها داخل سینک @@ -350,4 +351,4 @@ class BookAuthorSyncSerializer(serializers.ModelSerializer): 'death_year_miladi', 'books', # 👈 لیست کتاب‌های هر نویسنده 'related_narrator_slug' - ] \ No newline at end of file + ] diff --git a/apps/hadis/serializers/serializers_admin.py b/apps/hadis/serializers/serializers_admin.py index 8f4aeb9..aea293e 100644 --- a/apps/hadis/serializers/serializers_admin.py +++ b/apps/hadis/serializers/serializers_admin.py @@ -414,7 +414,7 @@ class AdminHadisCorrectionSerializer(serializers.ModelSerializer): ret["images"] = [ { "id": img.id, - "image": request.build_absolute_uri(img.image.url) if request and img.image else img.image.url + "image": absolute_https_url(img.image.url, request) if request and img.image else absolute_https_url(img.image.url) } for img in images ] @@ -533,7 +533,7 @@ class AdminHadisInterpretationSerializer(serializers.ModelSerializer): ret["images"] = [ { "id": img.id, - "image": request.build_absolute_uri(img.image.url) if request and img.image else img.image.url + "image": absolute_https_url(img.image.url, request) if request and img.image else absolute_https_url(img.image.url) } for img in images ] @@ -1197,7 +1197,7 @@ class AdminTransmitterOriginalTextSerializer(serializers.ModelSerializer): ret["images"] = [ { "id": img.id, - "image": request.build_absolute_uri(img.image.url) if request and img.image else img.image.url + "image": absolute_https_url(img.image.url, request) if request and img.image else absolute_https_url(img.image.url) } for img in (ref.images.all() if ref else []) ] diff --git a/apps/hadis/views/category.py b/apps/hadis/views/category.py index a49b200..45a956e 100644 --- a/apps/hadis/views/category.py +++ b/apps/hadis/views/category.py @@ -5,6 +5,7 @@ from utils.pagination import NoPagination from django.db.models import Q from collections import defaultdict from utils.pagination import StandardResultsSetPagination +from utils import absolute_https_url from ..models import HadisSect, HadisCategory,Hadis from apps.bookmark.serializers.bookmark import BookmarkStatusSerializer from ..serializers import ( @@ -218,7 +219,7 @@ class HadisCategoryTreeView(ListAPIView): def _get_thumbnail_url(self, category, request): """Get absolute thumbnail URL""" if hasattr(category, 'thumbnail') and category.thumbnail: - return request.build_absolute_uri(category.thumbnail.url) if request else category.thumbnail.url + return absolute_https_url(category.thumbnail.url, request) return None def _get_xmind_url(self, category, request): From d6afe2cc54c0991217480b02454ecc9ab2c8bf74 Mon Sep 17 00:00:00 2001 From: "H.shokhmgar86" Date: Mon, 10 Aug 2026 14:28:29 +0330 Subject: [PATCH 3/6] feat: implement REST API views for article, hadis, library, podcast, and video modules --- apps/article/views.py | 5 +++-- apps/hadis/views/hadis.py | 5 +++-- apps/library/views.py | 5 +++-- apps/podcast/views.py | 5 +++-- apps/video/views.py | 5 +++-- 5 files changed, 15 insertions(+), 10 deletions(-) diff --git a/apps/article/views.py b/apps/article/views.py index 472ceb0..7609ca8 100755 --- a/apps/article/views.py +++ b/apps/article/views.py @@ -64,8 +64,9 @@ class PinnedArticleCollectionListView(generics.ListAPIView): def get_queryset(self): return PinnedArticleCollection.objects.filter( status=True, - display_position=ArticleCollection.DisplayPosition.PINNED - ).order_by('order', '-created_at') + display_position=ArticleCollection.DisplayPosition.PINNED, + articles__isnull=False + ).distinct().order_by('order', '-created_at') def list(self, request, *args, **kwargs): response = super().list(request, *args, **kwargs) diff --git a/apps/hadis/views/hadis.py b/apps/hadis/views/hadis.py index 64831d8..b67f4d1 100644 --- a/apps/hadis/views/hadis.py +++ b/apps/hadis/views/hadis.py @@ -33,8 +33,9 @@ class PinnedHadisCollectionListView(ListAPIView): def get_queryset(self): return HadisCollection.objects.filter( status=True, - display_position=HadisCollection.DisplayPosition.PINNED - ).order_by('order', '-created_at') + display_position=HadisCollection.DisplayPosition.PINNED, + hadis_items__isnull=False + ).distinct().order_by('order', '-created_at') def list(self, request, *args, **kwargs): # 1. گرفتن خروجی استاندارد لیست مجموعه‌ها diff --git a/apps/library/views.py b/apps/library/views.py index 7d1e23a..127a928 100644 --- a/apps/library/views.py +++ b/apps/library/views.py @@ -67,8 +67,9 @@ class PinnedBookCollectionListView(ListAPIView): def get_queryset(self): return BookCollection.objects.filter( status=True, - display_position=BookCollection.DisplayPosition.PINNED - ).order_by('order', '-created_at') + display_position=BookCollection.DisplayPosition.PINNED, + books__isnull=False + ).distinct().order_by('order', '-created_at') def list(self, request, *args, **kwargs): diff --git a/apps/podcast/views.py b/apps/podcast/views.py index b0bba13..361fcf6 100644 --- a/apps/podcast/views.py +++ b/apps/podcast/views.py @@ -71,8 +71,9 @@ class PinnedPodcastCollectionListView(generics.ListAPIView): def get_queryset(self): return PinnedPodcastCollection.objects.filter( status=True, - display_position=PodcastCollection.DisplayPosition.PINNED - ).order_by('order', '-created_at') + display_position=PodcastCollection.DisplayPosition.PINNED, + podcasts__isnull=False + ).distinct().order_by('order', '-created_at') def list(self, request, *args, **kwargs): response = super().list(request, *args, **kwargs) diff --git a/apps/video/views.py b/apps/video/views.py index 8641286..30b260f 100644 --- a/apps/video/views.py +++ b/apps/video/views.py @@ -84,8 +84,9 @@ class PinnedVideoCollectionListView(generics.ListAPIView): def get_queryset(self): queryset = PinnedVideoCollection.objects.filter( status=True, - display_position=VideoCollection.DisplayPosition.PINNED - ).order_by('order', '-created_at') + display_position=VideoCollection.DisplayPosition.PINNED, + related_playlists__isnull=False + ).distinct().order_by('order', '-created_at') # Filter by bookmarks if requested is_bookmark = self.request.query_params.get('is_bookmark', '').lower() From d55dc063d6ffce005d8e1e8140a4ce5549f574e6 Mon Sep 17 00:00:00 2001 From: "H.shokhmgar86" Date: Mon, 10 Aug 2026 14:48:16 +0330 Subject: [PATCH 4/6] feat: implement REST API views for podcast, video, article, hadis, and library modules --- apps/article/views.py | 2 +- apps/hadis/views/hadis.py | 2 +- apps/library/views.py | 2 +- apps/podcast/views.py | 2 +- apps/video/views.py | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/apps/article/views.py b/apps/article/views.py index 7609ca8..92abe4a 100755 --- a/apps/article/views.py +++ b/apps/article/views.py @@ -65,7 +65,7 @@ class PinnedArticleCollectionListView(generics.ListAPIView): return PinnedArticleCollection.objects.filter( status=True, display_position=ArticleCollection.DisplayPosition.PINNED, - articles__isnull=False + articles__status=True ).distinct().order_by('order', '-created_at') def list(self, request, *args, **kwargs): diff --git a/apps/hadis/views/hadis.py b/apps/hadis/views/hadis.py index b67f4d1..e5b9cdc 100644 --- a/apps/hadis/views/hadis.py +++ b/apps/hadis/views/hadis.py @@ -34,7 +34,7 @@ class PinnedHadisCollectionListView(ListAPIView): return HadisCollection.objects.filter( status=True, display_position=HadisCollection.DisplayPosition.PINNED, - hadis_items__isnull=False + hadis_items__hadis__status=True ).distinct().order_by('order', '-created_at') def list(self, request, *args, **kwargs): diff --git a/apps/library/views.py b/apps/library/views.py index 127a928..cfdc254 100644 --- a/apps/library/views.py +++ b/apps/library/views.py @@ -68,7 +68,7 @@ class PinnedBookCollectionListView(ListAPIView): return BookCollection.objects.filter( status=True, display_position=BookCollection.DisplayPosition.PINNED, - books__isnull=False + books__status=True ).distinct().order_by('order', '-created_at') diff --git a/apps/podcast/views.py b/apps/podcast/views.py index 361fcf6..c6be57b 100644 --- a/apps/podcast/views.py +++ b/apps/podcast/views.py @@ -72,7 +72,7 @@ class PinnedPodcastCollectionListView(generics.ListAPIView): return PinnedPodcastCollection.objects.filter( status=True, display_position=PodcastCollection.DisplayPosition.PINNED, - podcasts__isnull=False + podcasts__status=True ).distinct().order_by('order', '-created_at') def list(self, request, *args, **kwargs): diff --git a/apps/video/views.py b/apps/video/views.py index 30b260f..5d3aff9 100644 --- a/apps/video/views.py +++ b/apps/video/views.py @@ -85,7 +85,7 @@ class PinnedVideoCollectionListView(generics.ListAPIView): queryset = PinnedVideoCollection.objects.filter( status=True, display_position=VideoCollection.DisplayPosition.PINNED, - related_playlists__isnull=False + related_playlists__status=True ).distinct().order_by('order', '-created_at') # Filter by bookmarks if requested From 2c72947f298ebd6a223820db0a4790eefe750eac Mon Sep 17 00:00:00 2001 From: "H.shokhmgar86" Date: Mon, 10 Aug 2026 17:22:53 +0330 Subject: [PATCH 5/6] feat: initialize URL patterns and admin routers for Hadis application modules --- apps/hadis/urls.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/hadis/urls.py b/apps/hadis/urls.py index 4be3e7a..cd29611 100644 --- a/apps/hadis/urls.py +++ b/apps/hadis/urls.py @@ -104,10 +104,10 @@ urlpatterns = [ # Narrator paths path('narrators//teachers/', NarratorTeachersView.as_view(), name='narrator-teachers'), path('narrators//students/', NarratorStudentsView.as_view(), name='narrator-students'), - path('narrators//arguments', NarratorArgumentsListView.as_view(), name='narrator-arguments'), - path('narrators//opinions', TransmitterOpinionView.as_view(), name='narrator-opinions'), - path('narrators//original_texts', TransmitterOriginalTextView.as_view(), name='narrator-original-texts'), - path('narrators/', TransmitterDetailView.as_view(), name='narrator-detail'), + path('narrators//arguments/', NarratorArgumentsListView.as_view(), name='narrator-arguments'), + path('narrators//opinions/', TransmitterOpinionView.as_view(), name='narrator-opinions'), + path('narrators//original_texts/', TransmitterOriginalTextView.as_view(), name='narrator-original-texts'), + path('narrators//', TransmitterDetailView.as_view(), name='narrator-detail'), path('narrators/filters/', TransmitterFiltersView.as_view(), name='narrator-filters'), path('narrators/', TransmitterView.as_view(), name='narrators'), From 798c0d962e3be0e1911ff31a48722eb11918c39f Mon Sep 17 00:00:00 2001 From: "H.shokhmgar86" Date: Mon, 10 Aug 2026 17:56:07 +0330 Subject: [PATCH 6/6] feat: initialize Celery app in config package for shared task support --- config/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/__init__.py b/config/__init__.py index b5a50bd..a9ef1ea 100644 --- a/config/__init__.py +++ b/config/__init__.py @@ -5,4 +5,4 @@ from __future__ import absolute_import, unicode_literals # Django starts so that shared_task will use this app. from .celery import app as celery_app -__all__ = ('celery_app',) \ No newline at end of file +__all__ = ('celery_app',)