content and core
This commit is contained in:
parent
6186a3717b
commit
0a8b9caed4
@ -1,5 +1,6 @@
|
|||||||
from django.db import models
|
from django.db import models
|
||||||
from django_softdelete.models import SoftDeleteModel
|
from django_softdelete.models import SoftDeleteModel
|
||||||
|
from django.core.validators import MaxValueValidator, MinValueValidator
|
||||||
|
|
||||||
class ContentTheme(SoftDeleteModel):
|
class ContentTheme(SoftDeleteModel):
|
||||||
theme = models.CharField(max_length=255, null=False)
|
theme = models.CharField(max_length=255, null=False)
|
||||||
@ -27,18 +28,22 @@ class ContentTopic(SoftDeleteModel):
|
|||||||
def __str__(self):
|
def __str__(self):
|
||||||
return self.topic
|
return self.topic
|
||||||
|
|
||||||
class ContentFormat(SoftDeleteModel):
|
|
||||||
format = models.CharField(max_length=255, null=False)
|
|
||||||
|
|
||||||
featured_image = models.CharField(max_length=1000)
|
|
||||||
|
|
||||||
created_at = models.DateTimeField(auto_now_add=True)
|
|
||||||
updated_at = models.DateTimeField(auto_now=True)
|
|
||||||
|
|
||||||
def __str__(self):
|
|
||||||
return self.format
|
|
||||||
|
|
||||||
class Content(SoftDeleteModel):
|
class Content(SoftDeleteModel):
|
||||||
|
|
||||||
|
class ContentFormat(models.TextChoices):
|
||||||
|
TEXT = 'Text', 'Teks'
|
||||||
|
INFOGRAPHIC = 'Infographic', 'Infografis'
|
||||||
|
IMAGE = 'Image', 'Gambar'
|
||||||
|
VIDEO = 'Video', 'Video'
|
||||||
|
BRANCHING_SCENARIO = 'Branching Scenario', 'Pilihan Bercabang'
|
||||||
|
CROSSWORD = 'Crossword', 'Teka-teki Silang'
|
||||||
|
DRAG_AND_DROP = 'Drag And Drop', 'Pencocokan'
|
||||||
|
FIND_THE_WORDS = 'Find the Words', 'Cari Kata'
|
||||||
|
MEMORY_GAME = 'Memory Game', 'Permainan Memori'
|
||||||
|
PERSONALITY_QUIZ = 'Personality Quiz', 'Permainan Tebak Sifat'
|
||||||
|
GAME_MAP = 'Game Map', 'Peta Permainan'
|
||||||
|
MULTIPLE_CHOICE = 'Multiple Choice', 'Pilihan Ganda'
|
||||||
|
|
||||||
title = models.CharField(max_length=255, null=False)
|
title = models.CharField(max_length=255, null=False)
|
||||||
slug = models.SlugField(max_length=255)
|
slug = models.SlugField(max_length=255)
|
||||||
|
|
||||||
@ -46,9 +51,12 @@ class Content(SoftDeleteModel):
|
|||||||
|
|
||||||
theme = models.ForeignKey(ContentTheme, on_delete=models.CASCADE, null=False)
|
theme = models.ForeignKey(ContentTheme, on_delete=models.CASCADE, null=False)
|
||||||
topic = models.ForeignKey(ContentTopic, on_delete=models.CASCADE, null=False)
|
topic = models.ForeignKey(ContentTopic, on_delete=models.CASCADE, null=False)
|
||||||
format = models.ForeignKey(ContentFormat, on_delete=models.CASCADE, null=False)
|
format = models.CharField(max_length=25, choices=ContentFormat.choices, default=ContentFormat.TEXT)
|
||||||
|
|
||||||
content = models.TextField()
|
content = models.TextField(null=True)
|
||||||
|
data = models.JSONField(null=True)
|
||||||
|
|
||||||
|
grades = models.JSONField(null=True)
|
||||||
|
|
||||||
point = models.IntegerField()
|
point = models.IntegerField()
|
||||||
coin = models.IntegerField()
|
coin = models.IntegerField()
|
||||||
|
|||||||
@ -1,40 +1,33 @@
|
|||||||
from rest_framework import serializers
|
from rest_framework import serializers
|
||||||
from .models import Content, ContentTheme, ContentTopic, ContentFormat
|
from content import models
|
||||||
|
|
||||||
|
|
||||||
class ContentThemeSerializer(serializers.ModelSerializer):
|
class ContentThemeSerializer(serializers.ModelSerializer):
|
||||||
class Meta:
|
class Meta:
|
||||||
model = ContentTheme
|
model = models.ContentTheme
|
||||||
fields = ['id', 'theme', 'description', 'featured_image']
|
fields = ['id', 'theme', 'description', 'featured_image']
|
||||||
|
|
||||||
class ContentTopicSerializer(serializers.ModelSerializer):
|
class ContentTopicSerializer(serializers.ModelSerializer):
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = ContentTopic
|
model = models.ContentTopic
|
||||||
fields = ['id', 'topic', 'description', 'featured_image', 'theme']
|
fields = ['id', 'topic', 'description', 'featured_image', 'theme']
|
||||||
|
|
||||||
class ContentTopicDetailSerializer(serializers.ModelSerializer):
|
class ContentTopicDetailSerializer(serializers.ModelSerializer):
|
||||||
theme = ContentThemeSerializer(read_only=True)
|
theme = ContentThemeSerializer(read_only=True)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = ContentTopic
|
model = models.ContentTopic
|
||||||
fields = ['id', 'topic', 'description', 'featured_image', 'theme']
|
fields = ['id', 'topic', 'description', 'featured_image', 'theme']
|
||||||
|
|
||||||
class ContentFormatSerializer(serializers.ModelSerializer):
|
|
||||||
class Meta:
|
|
||||||
model = ContentFormat
|
|
||||||
fields = ['id', 'format', 'featured_image', 'created_at', 'updated_at']
|
|
||||||
|
|
||||||
class ContentSerializer(serializers.ModelSerializer):
|
class ContentSerializer(serializers.ModelSerializer):
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Content
|
model = models.Content
|
||||||
fields = ['id', 'title', 'slug', 'featured_image', 'theme', 'topic', 'format', 'content', 'point', 'coin']
|
fields = ['id', 'title', 'slug', 'featured_image', 'theme', 'topic', 'format', 'content', 'point', 'coin', 'data', 'grades']
|
||||||
|
|
||||||
class ContentDetailSerializer(serializers.ModelSerializer):
|
class ContentDetailSerializer(serializers.ModelSerializer):
|
||||||
theme = ContentThemeSerializer(read_only=True)
|
theme = ContentThemeSerializer(read_only=True)
|
||||||
topic = ContentTopicDetailSerializer(read_only=True)
|
topic = ContentTopicDetailSerializer(read_only=True)
|
||||||
format = ContentFormatSerializer(read_only=True)
|
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Content
|
model = models.Content
|
||||||
fields = ['id', 'title', 'slug', 'featured_image', 'theme', 'topic', 'format', 'content', 'point', 'coin']
|
fields = ['id', 'title', 'slug', 'featured_image', 'theme', 'topic', 'format', 'content', 'point', 'coin', 'data', 'grades']
|
||||||
|
|||||||
@ -1,16 +1,13 @@
|
|||||||
from django.urls import path
|
from django.urls import path
|
||||||
from .views import ContentList, ContentDetail, ContentThemeList, ContentFormatList, ContentTopicList
|
from content import views
|
||||||
|
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
path('contents/', ContentList.as_view()),
|
path('contents/', views.ContentList.as_view()),
|
||||||
path('contents/<int:pk>/', ContentDetail.as_view()),
|
path('contents/<int:pk>/', views.ContentDetail.as_view()),
|
||||||
|
|
||||||
path('themes/', ContentThemeList.as_view()),
|
path('themes/', views.ContentThemeList.as_view()),
|
||||||
path('themes/<int:pk>/', ContentThemeList.as_view()),
|
path('themes/<int:pk>/', views.ContentThemeDetail.as_view()),
|
||||||
|
|
||||||
path('formats/', ContentFormatList.as_view()),
|
path('topics/', views.ContentTopicList.as_view()),
|
||||||
path('formats/<int:pk>/', ContentFormatList.as_view()),
|
path('topics/<int:pk>/', views.ContentTopicDetail.as_view()),
|
||||||
|
|
||||||
path('topics/', ContentTopicList.as_view()),
|
|
||||||
path('topics/<int:pk>/', ContentTopicList.as_view()),
|
|
||||||
]
|
]
|
||||||
|
|||||||
@ -1,21 +1,53 @@
|
|||||||
from django.shortcuts import render
|
|
||||||
from rest_framework import generics, filters
|
from rest_framework import generics, filters
|
||||||
from django_filters.rest_framework import DjangoFilterBackend
|
from django_filters.rest_framework import DjangoFilterBackend, FilterSet, CharFilter
|
||||||
|
|
||||||
from content import models, serializers
|
from content import models, serializers
|
||||||
|
|
||||||
|
class ContentFilter(FilterSet):
|
||||||
|
grade = CharFilter(
|
||||||
|
method='filter_grades_contains', label="Grade/Class"
|
||||||
|
)
|
||||||
|
|
||||||
|
def filter_grades_contains(self, queryset, name, value):
|
||||||
|
try:
|
||||||
|
value_int = int(value)
|
||||||
|
except ValueError:
|
||||||
|
return queryset.none()
|
||||||
|
return queryset.filter(grades__contains=[value_int])
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
model = models.Content
|
||||||
|
fields = ['format', 'theme', 'topic', 'grade']
|
||||||
|
|
||||||
class ContentList(generics.ListCreateAPIView):
|
class ContentList(generics.ListCreateAPIView):
|
||||||
queryset = models.Content.objects.all()
|
queryset = models.Content.objects.all()
|
||||||
serializer_class = serializers.ContentSerializer
|
serializer_class = serializers.ContentSerializer
|
||||||
filter_backends = [filters.SearchFilter, filters.OrderingFilter, DjangoFilterBackend]
|
filter_backends = [filters.SearchFilter, filters.OrderingFilter, DjangoFilterBackend]
|
||||||
search_fields = ['title']
|
search_fields = ['title']
|
||||||
filterset_fields = ['format', 'theme', 'topic']
|
#filterset_fields = ['format', 'theme', 'topic']
|
||||||
|
filterset_class = ContentFilter
|
||||||
ordering_fields = '__all__'
|
ordering_fields = '__all__'
|
||||||
|
|
||||||
|
def get_serializer_class(self):
|
||||||
|
serializer_class = self.serializer_class
|
||||||
|
|
||||||
|
if self.request.method == 'GET':
|
||||||
|
serializer_class = serializers.ContentDetailSerializer
|
||||||
|
|
||||||
|
return serializer_class
|
||||||
|
|
||||||
class ContentDetail(generics.RetrieveUpdateDestroyAPIView):
|
class ContentDetail(generics.RetrieveUpdateDestroyAPIView):
|
||||||
queryset = models.Content.objects.all()
|
queryset = models.Content.objects.all()
|
||||||
serializer_class = serializers.ContentSerializer
|
serializer_class = serializers.ContentSerializer
|
||||||
|
|
||||||
|
def get_serializer_class(self):
|
||||||
|
serializer_class = self.serializer_class
|
||||||
|
|
||||||
|
if self.request.method == 'GET':
|
||||||
|
serializer_class = serializers.ContentDetailSerializer
|
||||||
|
|
||||||
|
return serializer_class
|
||||||
|
|
||||||
class ContentThemeList(generics.ListCreateAPIView):
|
class ContentThemeList(generics.ListCreateAPIView):
|
||||||
queryset = models.ContentTheme.objects.all()
|
queryset = models.ContentTheme.objects.all()
|
||||||
serializer_class = serializers.ContentThemeSerializer
|
serializer_class = serializers.ContentThemeSerializer
|
||||||
@ -35,17 +67,23 @@ class ContentTopicList(generics.ListCreateAPIView):
|
|||||||
filterset_fields = ['theme']
|
filterset_fields = ['theme']
|
||||||
ordering_fields = '__all__'
|
ordering_fields = '__all__'
|
||||||
|
|
||||||
|
def get_serializer_class(self):
|
||||||
|
serializer_class = self.serializer_class
|
||||||
|
|
||||||
|
if self.request.method == 'GET':
|
||||||
|
serializer_class = serializers.ContentTopicDetailSerializer
|
||||||
|
|
||||||
|
return serializer_class
|
||||||
|
|
||||||
class ContentTopicDetail(generics.RetrieveUpdateDestroyAPIView):
|
class ContentTopicDetail(generics.RetrieveUpdateDestroyAPIView):
|
||||||
queryset = models.ContentTopic.objects.all()
|
queryset = models.ContentTopic.objects.all()
|
||||||
serializer_class = serializers.ContentTopicSerializer
|
serializer_class = serializers.ContentTopicSerializer
|
||||||
|
|
||||||
class ContentFormatList(generics.ListCreateAPIView):
|
def get_serializer_class(self):
|
||||||
queryset = models.ContentFormat.objects.all()
|
serializer_class = self.serializer_class
|
||||||
serializer_class = serializers.ContentFormatSerializer
|
|
||||||
filter_backends = [filters.SearchFilter, filters.OrderingFilter]
|
if self.request.method == 'GET':
|
||||||
search_fields = ['format']
|
serializer_class = serializers.ContentTopicDetailSerializer
|
||||||
ordering_fields = '__all__'
|
|
||||||
|
return serializer_class
|
||||||
|
|
||||||
class ContentFormatDetail(generics.RetrieveUpdateDestroyAPIView):
|
|
||||||
queryset = models.ContentFormat.objects.all()
|
|
||||||
serializer_class = serializers.ContentFormatSerializer
|
|
||||||
|
|||||||
@ -1,4 +1,5 @@
|
|||||||
from django.db import models
|
from django.db import models
|
||||||
|
from django.contrib.auth.models import User
|
||||||
from django_softdelete.models import SoftDeleteModel
|
from django_softdelete.models import SoftDeleteModel
|
||||||
|
|
||||||
class Province(SoftDeleteModel):
|
class Province(SoftDeleteModel):
|
||||||
@ -34,3 +35,18 @@ class Village(models.Model):
|
|||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return self.name
|
return self.name
|
||||||
|
|
||||||
|
# Tambahan Data untuk User
|
||||||
|
class Student(models.Model):
|
||||||
|
user = models.OneToOneField(User, on_delete=models.CASCADE)
|
||||||
|
|
||||||
|
school = models.CharField(max_length=255, null=True)
|
||||||
|
class_grade = models.SmallIntegerField(null=True)
|
||||||
|
|
||||||
|
province = models.ForeignKey(Province, on_delete=models.CASCADE, null=True)
|
||||||
|
regency_city = models.ForeignKey(RegencyCity, on_delete=models.CASCADE, null=True)
|
||||||
|
district = models.ForeignKey(District, on_delete=models.CASCADE, null=True)
|
||||||
|
village = models.ForeignKey(Village, on_delete=models.CASCADE, null=True)
|
||||||
|
|
||||||
|
address = models.CharField(max_length=1000, null=True)
|
||||||
|
phone_number = models.CharField(max_length=25, null=True)
|
||||||
@ -26,7 +26,6 @@ class DistrictSerializer(serializers.ModelSerializer):
|
|||||||
model = models.District
|
model = models.District
|
||||||
fields = ['id', 'code', 'name', 'regency_city']
|
fields = ['id', 'code', 'name', 'regency_city']
|
||||||
|
|
||||||
|
|
||||||
class DistrictDetailSerializer(serializers.ModelSerializer):
|
class DistrictDetailSerializer(serializers.ModelSerializer):
|
||||||
regency_city = RegencyCityDetailSerializer()
|
regency_city = RegencyCityDetailSerializer()
|
||||||
|
|
||||||
@ -40,3 +39,26 @@ class VillageSerializer(serializers.ModelSerializer):
|
|||||||
class Meta:
|
class Meta:
|
||||||
model = models.Village
|
model = models.Village
|
||||||
fields = ['id', 'code', 'name', 'district']
|
fields = ['id', 'code', 'name', 'district']
|
||||||
|
|
||||||
|
class VillageDetailSerializer(serializers.ModelSerializer):
|
||||||
|
district = DistrictDetailSerializer()
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
model = models.Village
|
||||||
|
fields = ['id', 'code', 'name', 'district']
|
||||||
|
|
||||||
|
class StudentSerializer(serializers.ModelSerializer):
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
model = models.Student
|
||||||
|
fields = ['id', 'user', 'school', 'class_grade', 'province', 'regency_city', 'district', 'village', 'address', 'phone_number']
|
||||||
|
|
||||||
|
class StudentDetailSerializer(serializers.ModelSerializer):
|
||||||
|
province = ProvinceSerializer(read_only=True)
|
||||||
|
regency_city = RegencyCitySerializer(read_only=True)
|
||||||
|
district = DistrictSerializer(read_only=True)
|
||||||
|
village = VillageSerializer(read_only=True)
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
model = models.Student
|
||||||
|
fields = ['id', 'user', 'school', 'class_grade', 'province', 'regency_city', 'district', 'village', 'address', 'phone_number']
|
||||||
@ -11,6 +11,12 @@ urlpatterns = [
|
|||||||
|
|
||||||
path('districts/', views.DistrictList.as_view()),
|
path('districts/', views.DistrictList.as_view()),
|
||||||
path('districts/<int:pk>/', views.DistrictDetail.as_view()),
|
path('districts/<int:pk>/', views.DistrictDetail.as_view()),
|
||||||
|
|
||||||
|
path('villages/', views.VillageList.as_view()),
|
||||||
|
path('villages/<int:pk>/', views.VillageDetail.as_view()),
|
||||||
|
|
||||||
|
path('students/', views.StudentList.as_view()),
|
||||||
|
path('students/<int:pk>/', views.StudentDetail.as_view()),
|
||||||
]
|
]
|
||||||
|
|
||||||
urlpatterns = format_suffix_patterns(urlpatterns)
|
urlpatterns = format_suffix_patterns(urlpatterns)
|
||||||
@ -77,3 +77,62 @@ class DistrictDetail(generics.RetrieveUpdateDestroyAPIView):
|
|||||||
serializer_class = serializers.DistrictDetailSerializer
|
serializer_class = serializers.DistrictDetailSerializer
|
||||||
|
|
||||||
return serializer_class
|
return serializer_class
|
||||||
|
|
||||||
|
# VILLAGE
|
||||||
|
class VillageList(generics.ListCreateAPIView):
|
||||||
|
queryset = models.Village.objects.all()
|
||||||
|
serializer_class = serializers.VillageSerializer
|
||||||
|
filter_backends = [filters.SearchFilter, filters.OrderingFilter, DjangoFilterBackend]
|
||||||
|
search_fields = ['name', 'code']
|
||||||
|
filterset_fields = ['name', 'code', 'district']
|
||||||
|
ordering_fields = '__all__'
|
||||||
|
|
||||||
|
def get_serializer_class(self):
|
||||||
|
serializer_class = self.serializer_class
|
||||||
|
|
||||||
|
if self.request.method == 'GET':
|
||||||
|
serializer_class = serializers.VillageDetailSerializer
|
||||||
|
|
||||||
|
return serializer_class
|
||||||
|
|
||||||
|
class VillageDetail(generics.RetrieveUpdateDestroyAPIView):
|
||||||
|
queryset = models.Village.objects.all()
|
||||||
|
serializer_class = serializers.VillageSerializer
|
||||||
|
|
||||||
|
def get_serializer_class(self):
|
||||||
|
serializer_class = self.serializer_class
|
||||||
|
|
||||||
|
if self.request.method == 'GET':
|
||||||
|
serializer_class = serializers.VillageDetailSerializer
|
||||||
|
|
||||||
|
return serializer_class
|
||||||
|
|
||||||
|
# STUDENT
|
||||||
|
class StudentList(generics.ListCreateAPIView):
|
||||||
|
queryset = models.Student.objects.all()
|
||||||
|
serializer_class = serializers.StudentSerializer
|
||||||
|
filter_backends = [filters.SearchFilter, filters.OrderingFilter, DjangoFilterBackend]
|
||||||
|
search_fields = ['name', 'id']
|
||||||
|
filterset_fields = ['class_grade', 'province', 'regency_city', 'district', 'village']
|
||||||
|
ordering_fields = '__all__'
|
||||||
|
|
||||||
|
def get_serializer_class(self):
|
||||||
|
serializer_class = self.serializer_class
|
||||||
|
|
||||||
|
if self.request.method == 'GET':
|
||||||
|
serializer_class = serializers.StudentDetailSerializer
|
||||||
|
|
||||||
|
return serializer_class
|
||||||
|
|
||||||
|
class StudentDetail(generics.RetrieveUpdateDestroyAPIView):
|
||||||
|
queryset = models.Student.objects.all()
|
||||||
|
serializer_class = serializers.StudentSerializer
|
||||||
|
|
||||||
|
def get_serializer_class(self):
|
||||||
|
serializer_class = self.serializer_class
|
||||||
|
|
||||||
|
if self.request.method == 'GET':
|
||||||
|
serializer_class = serializers.StudentDetailSerializer
|
||||||
|
|
||||||
|
return serializer_class
|
||||||
|
|
||||||
|
|||||||
@ -40,12 +40,14 @@ INSTALLED_APPS = [
|
|||||||
|
|
||||||
'oauth2_provider',
|
'oauth2_provider',
|
||||||
'rest_framework',
|
'rest_framework',
|
||||||
|
'djoser',
|
||||||
'psycopg2',
|
'psycopg2',
|
||||||
'corsheaders',
|
'corsheaders',
|
||||||
'django_filters',
|
'django_filters',
|
||||||
|
|
||||||
'core',
|
'core',
|
||||||
'content',
|
'content',
|
||||||
|
'character',
|
||||||
]
|
]
|
||||||
|
|
||||||
MIDDLEWARE = [
|
MIDDLEWARE = [
|
||||||
@ -145,21 +147,19 @@ CORS_ALLOWED_ORIGINS = [
|
|||||||
]
|
]
|
||||||
|
|
||||||
REST_FRAMEWORK = {
|
REST_FRAMEWORK = {
|
||||||
# 'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
|
|
||||||
# 'PAGE_SIZE': 10,
|
|
||||||
'DEFAULT_PAGINATION_CLASS':
|
'DEFAULT_PAGINATION_CLASS':
|
||||||
'freekake_api.pagination.CustomPagination',
|
'freekake_api.pagination.CustomPagination',
|
||||||
'DEFAULT_FILTER_BACKENDS': [
|
'DEFAULT_FILTER_BACKENDS': [
|
||||||
'django_filters.rest_framework.DjangoFilterBackend'
|
'django_filters.rest_framework.DjangoFilterBackend'
|
||||||
],
|
],
|
||||||
'DEFAULT_AUTHENTICATION_CLASSES': (
|
# 'DEFAULT_AUTHENTICATION_CLASSES': (
|
||||||
'rest_framework.authentication.BasicAuthentication',
|
# 'rest_framework.authentication.BasicAuthentication',
|
||||||
'rest_framework.authentication.SessionAuthentication',
|
# 'rest_framework.authentication.SessionAuthentication',
|
||||||
'oauth2_provider.contrib.rest_framework.OAuth2Authentication',
|
# 'oauth2_provider.contrib.rest_framework.OAuth2Authentication',
|
||||||
),
|
# ),
|
||||||
'DEFAULT_PERMISSION_CLASSES': (
|
# 'DEFAULT_PERMISSION_CLASSES': (
|
||||||
'rest_framework.permissions.IsAuthenticated',
|
# 'rest_framework.permissions.IsAuthenticated',
|
||||||
)
|
# )
|
||||||
}
|
}
|
||||||
|
|
||||||
OAUTH2_PROVIDER = {
|
OAUTH2_PROVIDER = {
|
||||||
@ -168,3 +168,11 @@ OAUTH2_PROVIDER = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
LOGIN_URL = '/admin/login/'
|
LOGIN_URL = '/admin/login/'
|
||||||
|
|
||||||
|
DJOSER = {
|
||||||
|
'PASSWORD_RESET_CONFIRM_URL': '#/password/reset/confirm/{uid}/{token}',
|
||||||
|
'USERNAME_RESET_CONFIRM_URL': '#/username/reset/confirm/{uid}/{token}',
|
||||||
|
'ACTIVATION_URL': '#/activate/{uid}/{token}',
|
||||||
|
'SEND_ACTIVATION_EMAIL': True,
|
||||||
|
'SERIALIZERS': {},
|
||||||
|
}
|
||||||
@ -22,7 +22,9 @@ urlpatterns = [
|
|||||||
# path('admin/', admin.site.urls),
|
# path('admin/', admin.site.urls),
|
||||||
path('admin/', admin.site.urls),
|
path('admin/', admin.site.urls),
|
||||||
path('oauth/', include(oauth2_urls)),
|
path('oauth/', include(oauth2_urls)),
|
||||||
|
path('auth/', include('djoser.urls')),
|
||||||
|
|
||||||
path('core/', include('core.urls')),
|
path('core/', include('core.urls')),
|
||||||
path('content/', include('content.urls')),
|
path('content/', include('content.urls')),
|
||||||
|
path('character/', include('character.urls')),
|
||||||
]
|
]
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user