Skip to content

Commit

Permalink
Merge pull request #22 from OZ-Coding-School/dev
Browse files Browse the repository at this point in the history
Dev -> main 관리자 페이지 이미지 필드 추가
  • Loading branch information
im-niber authored Sep 2, 2024
2 parents 91c5063 + f97a078 commit 9d11580
Show file tree
Hide file tree
Showing 32 changed files with 710 additions and 85 deletions.
39 changes: 32 additions & 7 deletions customk/classes/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -84,17 +84,42 @@ class ExchangeRateAdmin(admin.ModelAdmin): # type: ignore
@admin.register(ClassImages)
class ClassImagesAdmin(admin.ModelAdmin):
form = ClassImagesForm
list_display = ["class_id", "image_url"]
list_display = [
"class_id",
"thumbnail_image_urls",
"description_image_urls",
"detail_image_urls",
]
search_fields = ["class_id"]

def save_model(self, request, obj, form, change): #
def save_model(self, request, obj, form, change):
super().save_model(request, obj, form, change)

if "images" in request.FILES:
image_file = request.FILES["images"]
image_url = upload_image_to_object_storage(image_file)
obj.image_url = image_url
obj.save()
# Handle thumbnail image
if form.cleaned_data.get("thumbnail_image"):
thumbnail_image = form.cleaned_data["thumbnail_image"]
thumbnail_url = upload_image_to_object_storage(thumbnail_image)
thumbnail_image_urls = obj.thumbnail_image_urls or []
thumbnail_image_urls.append(thumbnail_url)
obj.thumbnail_image_urls = thumbnail_image_urls

# Handle description image
if form.cleaned_data.get("description_image"):
description_image = form.cleaned_data["description_image"]
description_url = upload_image_to_object_storage(description_image)
description_image_urls = obj.description_image_urls or []
description_image_urls.append(description_url)
obj.description_image_urls = description_image_urls

# Handle detail image
if form.cleaned_data.get("detail_image"):
detail_image = form.cleaned_data["detail_image"]
detail_url = upload_image_to_object_storage(detail_image)
detail_image_urls = obj.detail_image_urls or []
detail_image_urls.append(detail_url)
obj.detail_image_urls = detail_image_urls

obj.save()


@admin.register(Genre)
Expand Down
6 changes: 4 additions & 2 deletions customk/classes/forms.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,10 @@


class ClassImagesForm(forms.ModelForm):
images = forms.ImageField()
thumbnail_image = forms.ImageField(required=False)
detail_image = forms.ImageField(required=False)
description_image = forms.ImageField(required=False)

class Meta:
model = ClassImages
fields = ["class_id", "images"]
fields = ["class_id", "thumbnail_image", "detail_image", "description_image"]
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
# Generated by Django 5.1 on 2024-09-02 06:49

from django.db import migrations, models


class Migration(migrations.Migration):
dependencies = [
("classes", "0015_class_discount_rate"),
]

operations = [
migrations.RemoveField(
model_name="classimages",
name="image_url",
),
migrations.AddField(
model_name="classimages",
name="description_image_url",
field=models.CharField(blank=True, max_length=255),
),
migrations.AddField(
model_name="classimages",
name="detail_image_url",
field=models.CharField(default="", max_length=255),
preserve_default=False,
),
migrations.AddField(
model_name="classimages",
name="thumbnail_image_url",
field=models.CharField(default="", max_length=255),
preserve_default=False,
),
]
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
# Generated by Django 5.1 on 2024-09-02 07:57

from django.db import migrations, models


class Migration(migrations.Migration):
dependencies = [
("classes", "0016_remove_classimages_image_url_and_more"),
]

operations = [
migrations.RemoveField(
model_name="classimages",
name="description_image_url",
),
migrations.RemoveField(
model_name="classimages",
name="detail_image_url",
),
migrations.RemoveField(
model_name="classimages",
name="thumbnail_image_url",
),
migrations.AddField(
model_name="classimages",
name="description_image_urls",
field=models.JSONField(blank=True, default=list),
),
migrations.AddField(
model_name="classimages",
name="detail_image_urls",
field=models.JSONField(blank=True, default=list),
),
migrations.AddField(
model_name="classimages",
name="thumbnail_image_urls",
field=models.JSONField(blank=True, default=list),
),
]
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
# Generated by Django 5.1 on 2024-09-02 08:06

from django.db import migrations, models


class Migration(migrations.Migration):
dependencies = [
("classes", "0017_remove_classimages_description_image_url_and_more"),
]

operations = [
migrations.RemoveField(
model_name="classimages",
name="description_image_urls",
),
migrations.RemoveField(
model_name="classimages",
name="detail_image_urls",
),
migrations.RemoveField(
model_name="classimages",
name="thumbnail_image_urls",
),
migrations.AddField(
model_name="classimages",
name="description_image_url",
field=models.CharField(blank=True, max_length=255),
),
migrations.AddField(
model_name="classimages",
name="detail_image_url",
field=models.CharField(default="", max_length=255),
preserve_default=False,
),
migrations.AddField(
model_name="classimages",
name="thumbnail_image_url",
field=models.CharField(default="", max_length=255),
preserve_default=False,
),
]
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
# Generated by Django 5.1 on 2024-09-02 08:08

from django.db import migrations, models


class Migration(migrations.Migration):
dependencies = [
("classes", "0018_remove_classimages_description_image_urls_and_more"),
]

operations = [
migrations.AlterField(
model_name="classimages",
name="detail_image_url",
field=models.CharField(blank=True, max_length=255),
),
migrations.AlterField(
model_name="classimages",
name="thumbnail_image_url",
field=models.CharField(blank=True, max_length=255),
),
]
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
# Generated by Django 5.1 on 2024-09-02 08:27

from django.db import migrations, models


class Migration(migrations.Migration):
dependencies = [
("classes", "0019_alter_classimages_detail_image_url_and_more"),
]

operations = [
migrations.RemoveField(
model_name="classimages",
name="description_image_url",
),
migrations.RemoveField(
model_name="classimages",
name="detail_image_url",
),
migrations.RemoveField(
model_name="classimages",
name="thumbnail_image_url",
),
migrations.AddField(
model_name="classimages",
name="description_image_urls",
field=models.JSONField(blank=True, default=list),
),
migrations.AddField(
model_name="classimages",
name="detail_image_urls",
field=models.JSONField(blank=True, default=list),
),
migrations.AddField(
model_name="classimages",
name="thumbnail_image_urls",
field=models.JSONField(blank=True, default=list),
),
]
7 changes: 4 additions & 3 deletions customk/classes/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,8 @@
from typing import Any, Dict, Optional

from django.core.serializers.json import DjangoJSONEncoder
from django.core.validators import MinValueValidator
from django.db import models
from django.db.models import Avg
from django.db.models import Avg, JSONField

from common.models import CommonModel

Expand Down Expand Up @@ -82,7 +81,9 @@ class ClassDate(models.Model):

class ClassImages(models.Model):
class_id = models.ForeignKey(Class, related_name="images", on_delete=models.CASCADE)
image_url = models.CharField()
description_image_urls = JSONField(blank=True, default=list)
detail_image_urls = JSONField(blank=True, default=list)
thumbnail_image_urls = JSONField(blank=True, default=list)

def __str__(self) -> str:
return f"{self.class_id.title}"
29 changes: 25 additions & 4 deletions customk/classes/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -55,13 +55,20 @@ class Meta:

class ClassImagesSerializer(serializers.ModelSerializer):
class_id = serializers.PrimaryKeyRelatedField(read_only=True)
thumbnail_image_url = serializers.CharField(required=False)
description_image_url = serializers.CharField(required=False)
detail_image_url = serializers.CharField(required=False)

class Meta:
model = ClassImages
fields = "__all__"

def get_image_url(self, obj):
return obj.image_url
def get_image_urls(self, obj):
return {
"thumbnail_image_url": obj.thumbnail_image_url,
"description_image_url": obj.description_image_url,
"additional_image_url": obj.additional_image_url,
}


class ClassSerializer(serializers.ModelSerializer):
Expand Down Expand Up @@ -123,7 +130,21 @@ def create(self, validated_data):
ClassDate.objects.create(class_id=class_instance, **date_data)

for image_data64 in images_data64:
image_url = upload_image_to_object_storage(image_data64["image_url"])
ClassImages.objects.create(class_id=class_instance, image_url=image_url)
thumbnail_url = upload_image_to_object_storage(
image_data64["thumbnail_image_url"]
)
description_url = upload_image_to_object_storage(
image_data64["description_image_url"]
)
detail_image_url = upload_image_to_object_storage(
image_data64["detail_image_url"]
)

ClassImages.objects.create(
class_id=class_instance,
thumbnail_image_url=thumbnail_url,
description_image_url=description_url,
detail_image_url=detail_image_url,
)

return class_instance
3 changes: 2 additions & 1 deletion customk/classes/urls.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
from django.urls import re_path

from classes.views import ClassListView
from classes.views import ClassDetailView, ClassListView

urlpatterns = [
re_path(r"^$", ClassListView.as_view(), name="class-list"),
re_path(r"^(?P<class_id>\d+)/$", ClassDetailView.as_view(), name="class-detail"),
]
50 changes: 49 additions & 1 deletion customk/classes/views.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
from typing import Any

from drf_spectacular.utils import OpenApiResponse, extend_schema
from drf_spectacular.types import OpenApiTypes
from drf_spectacular.utils import OpenApiParameter, OpenApiResponse, extend_schema
from rest_framework.permissions import AllowAny, IsAuthenticated
from rest_framework.request import Request
from rest_framework.response import Response
Expand Down Expand Up @@ -120,3 +121,50 @@ def delete(self, request: Request, *args: Any, **kwargs: Any) -> Response:
return Response(
{"status": "error", "message": "삭제 실패했습니다"}, status=404
)


class ClassDetailView(APIView):
def get_permissions(self):
if self.request.method == "GET":
return [AllowAny()]
return [IsAuthenticated()]

@extend_schema(
methods=["GET"],
summary="특정 클래스 조회",
description="특정 클래스의 세부 정보를 조회하는 API입니다.",
parameters=[
OpenApiParameter(
name="class_id",
description="클래스 ID",
required=True,
type=OpenApiTypes.INT,
location=OpenApiParameter.PATH,
),
],
responses={
200: OpenApiResponse(
description="클래스 조회 성공", response=ClassSerializer
),
404: OpenApiResponse(description="클래스가 존재하지 않음"),
},
)
def get(self, request: Request, *args: Any, **kwargs: Any) -> Response:
class_id = kwargs.get("class_id")
if class_id is None:
return Response(
{"status": "error", "message": "Class ID not provided"}, status=400
)
try:
class_instance = Class.objects.get(id=class_id)
serializer = ClassSerializer(class_instance)
response_data = {
"status": "success",
"message": "Class fetched successfully",
"data": serializer.data,
}
return Response(response_data, status=200)
except Class.DoesNotExist:
return Response(
{"status": "error", "message": "Class not found"}, status=404
)
1 change: 1 addition & 0 deletions customk/config/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
"reviews",
"reactions",
"corsheaders",
"favorites",
]


Expand Down
Loading

0 comments on commit 9d11580

Please sign in to comment.