mirror of
https://github.com/HamzaSha1/zod-backend.git
synced 2025-07-15 18:07:02 +00:00
web_admin module added, api for article created
This commit is contained in:
0
web_admin/__init__.py
Normal file
0
web_admin/__init__.py
Normal file
27
web_admin/admin.py
Normal file
27
web_admin/admin.py
Normal 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
6
web_admin/apps.py
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
from django.apps import AppConfig
|
||||||
|
|
||||||
|
|
||||||
|
class WebAdminConfig(AppConfig):
|
||||||
|
default_auto_field = 'django.db.models.BigAutoField'
|
||||||
|
name = 'web_admin'
|
60
web_admin/migrations/0001_initial.py
Normal file
60
web_admin/migrations/0001_initial.py
Normal 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')),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
]
|
0
web_admin/migrations/__init__.py
Normal file
0
web_admin/migrations/__init__.py
Normal file
54
web_admin/models.py
Normal file
54
web_admin/models.py
Normal 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
55
web_admin/serializers.py
Normal 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
3
web_admin/tests.py
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
from django.test import TestCase
|
||||||
|
|
||||||
|
# Create your tests here.
|
16
web_admin/urls.py
Normal file
16
web_admin/urls.py
Normal 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
23
web_admin/views.py
Normal 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)
|
@ -56,6 +56,7 @@ INSTALLED_APPS = [
|
|||||||
'account',
|
'account',
|
||||||
'junior',
|
'junior',
|
||||||
'guardian',
|
'guardian',
|
||||||
|
'web_admin',
|
||||||
# 'social_django'
|
# 'social_django'
|
||||||
]
|
]
|
||||||
|
|
||||||
@ -221,3 +222,5 @@ ALIYUN_OSS_REGION = os.getenv('ALIYUN_OSS_REGION')
|
|||||||
STATIC_URL = 'static/'
|
STATIC_URL = 'static/'
|
||||||
STATIC_ROOT = 'static'
|
STATIC_ROOT = 'static'
|
||||||
|
|
||||||
|
MEDIA_URL = "/media/"
|
||||||
|
MEDIA_ROOT = os.path.join(os.path.dirname(BASE_DIR), 'media')
|
||||||
|
@ -30,4 +30,5 @@ urlpatterns = [
|
|||||||
path('', include(('account.urls', 'account'), namespace='account')),
|
path('', include(('account.urls', 'account'), namespace='account')),
|
||||||
path('', include('guardian.urls')),
|
path('', include('guardian.urls')),
|
||||||
path('', include(('junior.urls', 'junior'), namespace='junior')),
|
path('', include(('junior.urls', 'junior'), namespace='junior')),
|
||||||
|
path('', include(('web_admin.urls', 'web_admin'), namespace='web_admin')),
|
||||||
]
|
]
|
||||||
|
Reference in New Issue
Block a user