Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion src/config/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -167,6 +167,7 @@
],
"toolbar": {
"items": [
"fullscreen",
"heading",
"|",
"outdent",
Expand Down Expand Up @@ -430,7 +431,7 @@
# Related Modal #
#################
# Use modals instead of popups
"related_modal_active": False,
"related_modal_active": True,
#############
# UI Tweaks #
#############
Expand Down
11 changes: 11 additions & 0 deletions src/core/storage.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
import boto3
from django.conf import settings


def s3_delete_file(file_name: str) -> None:
storage = boto3.client(
"s3",
aws_access_key_id=settings.AWS_ACCESS_KEY_ID,
aws_secret_access_key=settings.AWS_SECRET_ACCESS_KEY,
)
storage.delete_object(Bucket=settings.AWS_STORAGE_BUCKET_NAME, Key=file_name)
2 changes: 1 addition & 1 deletion src/notice/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ def save_new_instance(self, obj, *args, **kwargs):

@admin.register(Notice)
class NoticeAdmin(admin.ModelAdmin):
list_display = ("id", "title", "is_pinned")
list_display = ("id", "title", "is_pinned", "is_deleted")
list_filter = ("is_pinned",)
search_fields = ("title", "content")
ordering = ("-created_at",)
Expand Down
20 changes: 10 additions & 10 deletions src/notice/models.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
import os

from bs4 import BeautifulSoup
from django.conf import settings
from django.core.exceptions import ValidationError
from django.db import models
from django_ckeditor_5.fields import CKEditor5Field
from django_ckeditor_5.signals import extract_image_paths

from core.mixins.models import SoftDeleteModel
from core.storage import s3_delete_file
from public.tag_models import NoticeTag, Tag


Expand All @@ -30,14 +30,14 @@ def delete(self, *args, **kwargs):
super().delete(*args, **kwargs)

def _delete_ckeditor_images(self):
soup = BeautifulSoup(self.content, "html.parser")
for img_tag in soup.find_all("img"):
src = img_tag.get("src")
if src and src.startswith(settings.MEDIA_URL + "notice/ckeditor"):
relative_path = src.replace(settings.MEDIA_URL, "")
file_path = os.path.join(settings.MEDIA_ROOT, relative_path)
if os.path.isfile(file_path):
os.remove(file_path)
images_to_delete = extract_image_paths(self.content)
try:
for img_path in images_to_delete:
# CKEditor5Field의 이미지 경로는 상대 경로이므로, 절대 경로로 변환
file_path = img_path.removeprefix(f"https://{settings.AWS_S3_CUSTOM_DOMAIN}/")
s3_delete_file(file_path)
except Exception as e:
raise ValidationError(f"이미지 삭제 오류: {e}")

class Meta:
verbose_name = "공지사항"
Expand Down
Loading