web_admin module added, api for article created

This commit is contained in:
abutalib-kiwi
2023-07-13 19:51:17 +05:30
parent aadced6a13
commit a4d9997580
12 changed files with 248 additions and 0 deletions

0
web_admin/__init__.py Normal file
View File

27
web_admin/admin.py Normal file
View File

@ -0,0 +1,27 @@
from django.contrib import admin
from web_admin.models import Article, ArticleCard, ArticleSurvey, SurveyOption
@admin.register(Article)
class ArticleAdmin(admin.ModelAdmin):
"""Junior Points Admin"""
list_display = ['id', 'title', 'description', 'is_published']
@admin.register(ArticleCard)
class ArticleAdmin(admin.ModelAdmin):
"""Junior Points Admin"""
list_display = ['id', 'article', 'title', 'description', 'image']
@admin.register(ArticleSurvey)
class ArticleAdmin(admin.ModelAdmin):
"""Junior Points Admin"""
list_display = ['id', 'article', 'question', 'points']
@admin.register(SurveyOption)
class ArticleAdmin(admin.ModelAdmin):
"""Junior Points Admin"""
list_display = ['id', 'survey', 'option', 'is_answer']

6
web_admin/apps.py Normal file
View File

@ -0,0 +1,6 @@
from django.apps import AppConfig
class WebAdminConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'web_admin'

View File

@ -0,0 +1,60 @@
# Generated by Django 4.2.2 on 2023-07-13 13:01
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
initial = True
dependencies = [
]
operations = [
migrations.CreateModel(
name='Article',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('title', models.CharField(max_length=255)),
('description', models.TextField()),
('created_at', models.DateTimeField(auto_now_add=True)),
('updated_at', models.DateTimeField(auto_now=True)),
('is_published', models.BooleanField(default=False)),
],
),
migrations.CreateModel(
name='ArticleSurvey',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('question', models.CharField(max_length=255)),
('points', models.IntegerField()),
('created_at', models.DateTimeField(auto_now_add=True)),
('updated_at', models.DateTimeField(auto_now=True)),
('article', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='web_admin.article')),
],
),
migrations.CreateModel(
name='SurveyOption',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('option', models.CharField(max_length=255)),
('is_answer', models.BooleanField(default=False)),
('created_at', models.DateTimeField(auto_now_add=True)),
('updated_at', models.DateTimeField(auto_now=True)),
('survey', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='web_admin.articlesurvey')),
],
),
migrations.CreateModel(
name='ArticleCard',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('title', models.CharField(max_length=255)),
('description', models.TextField()),
('image', models.ImageField(upload_to='card_images/')),
('created_at', models.DateTimeField(auto_now_add=True)),
('updated_at', models.DateTimeField(auto_now=True)),
('article', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='web_admin.article')),
],
),
]

View File

54
web_admin/models.py Normal file
View File

@ -0,0 +1,54 @@
"""
web_admin model file
"""
# django imports
from django.db import models
class Article(models.Model):
title = models.CharField(max_length=255)
description = models.TextField()
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
is_published = models.BooleanField(default=False)
def __str__(self):
"""Return title"""
return f'{self.id} | {self.title}'
class ArticleCard(models.Model):
article = models.ForeignKey(Article, on_delete=models.CASCADE)
title = models.CharField(max_length=255)
description = models.TextField()
image = models.ImageField(upload_to='card_images/')
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
def __str__(self):
"""Return title"""
return f'{self.id} | {self.title}'
class ArticleSurvey(models.Model):
article = models.ForeignKey(Article, on_delete=models.CASCADE)
question = models.CharField(max_length=255)
points = models.IntegerField()
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
def __str__(self):
"""Return title"""
return f'{self.id} | {self.article}'
class SurveyOption(models.Model):
survey = models.ForeignKey(ArticleSurvey, on_delete=models.CASCADE)
option = models.CharField(max_length=255)
is_answer = models.BooleanField(default=False)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
def __str__(self):
"""Return title"""
return f'{self.id} | {self.survey}'

55
web_admin/serializers.py Normal file
View File

@ -0,0 +1,55 @@
"""
web_admin serializers file
"""
from rest_framework import serializers
from web_admin.models import Article, ArticleCard, SurveyOption, ArticleSurvey
class ArticleCardSerializer(serializers.ModelSerializer):
class Meta:
model = ArticleCard
fields = ('title', 'description')
class SurveyOptionSerializer(serializers.ModelSerializer):
class Meta:
model = SurveyOption
fields = ('option', 'is_answer')
class ArticleSurveySerializer(serializers.ModelSerializer):
options = SurveyOptionSerializer(many=True)
class Meta:
model = ArticleSurvey
fields = ('question', 'points', 'options')
class ArticleSerializer(serializers.ModelSerializer):
article_cards = ArticleCardSerializer(many=True)
article_survey = ArticleSurveySerializer(many=True)
class Meta:
"""
meta class
"""
model = Article
fields = ('title', 'description', 'article_cards', 'article_survey')
def create(self, validated_data):
article_cards = validated_data.pop('article_cards')
article_survey = validated_data.pop('article_survey')
article = Article.objects.create(**validated_data)
for card in article_cards:
ArticleCard.objects.create(article=article, **card)
for survey in article_survey:
options = survey.pop('options')
survey_obj = ArticleSurvey.objects.create(article=article, **survey)
for option in options:
SurveyOption.objects.create(survey=survey_obj, **option)
return article

3
web_admin/tests.py Normal file
View File

@ -0,0 +1,3 @@
from django.test import TestCase
# Create your tests here.

16
web_admin/urls.py Normal file
View File

@ -0,0 +1,16 @@
"""
web_admin urls file
"""
# django imports
from django.urls import path, include
from rest_framework import routers
from web_admin.views import ArticleViewSet
router = routers.SimpleRouter()
router.register('article', ArticleViewSet, basename='article')
urlpatterns = [
path('api/v1/', include(router.urls)),
]

23
web_admin/views.py Normal file
View File

@ -0,0 +1,23 @@
"""
web_admin views file
"""
# django imports
from rest_framework.viewsets import GenericViewSet, mixins
from rest_framework.response import Response
from rest_framework import status
# local imports
from web_admin.models import Article
from web_admin.serializers import ArticleSerializer
class ArticleViewSet(GenericViewSet, mixins.CreateModelMixin):
serializer_class = ArticleSerializer
permission_classes = []
queryset = Article.objects.all()
def create(self, request, *args, **kwargs):
serializer = self.serializer_class(data=request.data)
serializer.is_valid(raise_exception=True)
serializer.save()
return Response({'message': "created"}, status=status.HTTP_201_CREATED)

View File

@ -56,6 +56,7 @@ INSTALLED_APPS = [
'account',
'junior',
'guardian',
'web_admin',
# 'social_django'
]
@ -221,3 +222,5 @@ ALIYUN_OSS_REGION = os.getenv('ALIYUN_OSS_REGION')
STATIC_URL = 'static/'
STATIC_ROOT = 'static'
MEDIA_URL = "/media/"
MEDIA_ROOT = os.path.join(os.path.dirname(BASE_DIR), 'media')

View File

@ -30,4 +30,5 @@ urlpatterns = [
path('', include(('account.urls', 'account'), namespace='account')),
path('', include('guardian.urls')),
path('', include(('junior.urls', 'junior'), namespace='junior')),
path('', include(('web_admin.urls', 'web_admin'), namespace='web_admin')),
]