Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. Weโ€™ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature/faq #31

Closed
wants to merge 11 commits into from
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -56,4 +56,4 @@ make setup
# uv remove --dev <package name>
# or uv add --group dev <package name>
> uv remove --dev pre-commit
```
```
40 changes: 35 additions & 5 deletions src/config/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,21 +27,51 @@

ALLOWED_HOSTS = []

# ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ (Third-party Apps)
THIRD_PARTY_APPS = [
"rest_framework",
"drf_spectacular",
]

# Application definition
# ๋กœ์ปฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ (Local Apps)
LOCAL_APPS = [
"config",
"faq",
]

INSTALLED_APPS = [
# Built-in Django Applications
# ๊ธฐ๋ณธ ์žฅ๊ณ  ๋‚ด์žฅ ์•ฑ (Built-in Django Applications)
DJANGO_APPS = [
"django.contrib.admin",
"django.contrib.auth",
"django.contrib.contenttypes",
"django.contrib.sessions",
"django.contrib.messages",
"django.contrib.staticfiles",
# Local Applications
"config",
]

#INSTALLED_APPS ๊ตฌ์„ฑ
INSTALLED_APPS = DJANGO_APPS + THIRD_PARTY_APPS + LOCAL_APPS

# rest_framework settings
REST_FRAMEWORK = {
'DEFAULT_SCHEMA_CLASS': 'drf_spectacular.openapi.AutoSchema',
'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
'PAGE_SIZE': 10,
'MAX_PAGE_SIZE': 100,
'PAGE_SIZE_QUERY_PARAM': 'page_size',
}
# spectacular settings
SPECTACULAR_SETTINGS = {
'TITLE': 'HelloPy Backend API',
'DEFAULT_SCHEMA_CLASS': 'HelloPy API Documentation',
'VERSION': '0.1.0',
# API ์Šคํ‚ค๋งˆ ํŒŒ์ผ ์ง์ ‘ ์ œ๊ณต ์—ฌ๋ถ€
'SERVE_INCLUDE_SCHEMA': False,
'SWAGGER_UI_SETTINGS' : {
'persisAuthorization': True,
},
}

MIDDLEWARE = [
"django.middleware.security.SecurityMiddleware",
"django.contrib.sessions.middleware.SessionMiddleware",
Expand Down
13 changes: 12 additions & 1 deletion src/config/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,19 @@
2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path
from django.conf import settings
from django.urls import include, path

urlpatterns = [
path('admin/', admin.site.urls),
path('api/faqs/', include('faq.urls')), # ์•ฑ์˜ urls.py๋ฅผ ํฌํ•จ
]

# ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ๋งŒ Swagger ๋ฐ Redoc ํ™œ์„ฑํ™”
if settings.DEBUG:
from drf_spectacular.views import SpectacularAPIView, SpectacularRedocView, SpectacularSwaggerView
urlpatterns += [
path('api/schema/', SpectacularAPIView.as_view(), name='schema'),
path('api/docs/', SpectacularSwaggerView.as_view(url_name='schema'), name='swagger-ui'),
path('api/redoc/', SpectacularRedocView.as_view(url_name='schema'), name='redoc'),
]
Empty file added src/faq/__init__.py
Empty file.
2 changes: 2 additions & 0 deletions src/faq/admin.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@

# Register your models here.
6 changes: 6 additions & 0 deletions src/faq/apps.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
from django.apps import AppConfig


class FaqConfig(AppConfig):
default_auto_field = "django.db.models.BigAutoField"
name = "faq"
72 changes: 72 additions & 0 deletions src/faq/migrations/0001_initial.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
# Generated by Django 5.1.5 on 2025-02-05 01:16

from django.db import migrations, models


class Migration(migrations.Migration):

initial = True

dependencies = []

operations = [
migrations.CreateModel(
name="FAQ",
fields=[
("id", models.AutoField(primary_key=True, serialize=False)),
(
"status",
models.CharField(
choices=[
("normal", "๊ฒŒ์‹œ๋จ"),
("hidden", "์ˆจ๊น€"),
("deleted", "์‚ญ์ œ๋จ"),
],
default="normal",
max_length=10,
verbose_name="๊ฒŒ์‹œ๋ฌผ ์ƒํƒœ",
),
),
("question", models.CharField(max_length=255, verbose_name="์งˆ๋ฌธ")),
("answer", models.TextField(verbose_name="๋‹ต๋ณ€")),
(
"question_type",
models.CharField(
choices=[("activity", "ํ™œ๋™"), ("conference", "๊ธฐํƒ€๋“ฑ๋“ฑ")],
max_length=20,
),
),
("created_at", models.DateTimeField(auto_now_add=True)),
("updated_at", models.DateTimeField(auto_now=True)),
],
options={
"verbose_name": "FAQ",
"verbose_name_plural": "FAQs",
},
),
migrations.CreateModel(
name="Notice",
fields=[
("id", models.AutoField(primary_key=True, serialize=False)),
(
"status",
models.CharField(
choices=[
("normal", "๊ฒŒ์‹œ๋จ"),
("hidden", "์ˆจ๊น€"),
("deleted", "์‚ญ์ œ๋จ"),
],
default="normal",
max_length=10,
verbose_name="๊ฒŒ์‹œ๋ฌผ ์ƒํƒœ",
),
),
("title", models.CharField(max_length=255, verbose_name="๊ณต์ง€ ์ œ๋ชฉ")),
("content", models.TextField(verbose_name="๊ณต์ง€ ๋‚ด์šฉ")),
],
options={
"verbose_name": "๊ณต์ง€์‚ฌํ•ญ",
"verbose_name_plural": "๊ณต์ง€์‚ฌํ•ญ ๋ชฉ๋ก",
},
),
]
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
# Generated by Django 5.1.5 on 2025-02-06 16:05

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
("faq", "0001_initial"),
]

operations = [
migrations.DeleteModel(
name="Notice",
),
migrations.RemoveField(
model_name="faq",
name="question_type",
),
migrations.RemoveField(
model_name="faq",
name="status",
),
migrations.AddField(
model_name="faq",
name="is_deleted",
field=models.BooleanField(default=False, verbose_name="์‚ญ์ œ ์—ฌ๋ถ€"),
),
migrations.AlterField(
model_name="faq",
name="id",
field=models.BigAutoField(
auto_created=True, primary_key=True, serialize=False, verbose_name="ID"
),
),
]
32 changes: 32 additions & 0 deletions src/faq/migrations/0003_notice_alter_faq_id.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
# Generated by Django 5.1.5 on 2025-02-07 05:44

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
("faq", "0002_delete_notice_remove_faq_question_type_and_more"),
]

operations = [
migrations.CreateModel(
name="Notice",
fields=[
("id", models.AutoField(primary_key=True, serialize=False)),
("created_at", models.DateTimeField(auto_now_add=True)),
("updated_at", models.DateTimeField(auto_now=True)),
("title", models.CharField(max_length=255, verbose_name="๊ณต์ง€ ์ œ๋ชฉ")),
("content", models.TextField(verbose_name="๊ณต์ง€ ๋‚ด์šฉ")),
],
options={
"verbose_name": "๊ณต์ง€์‚ฌํ•ญ",
"verbose_name_plural": "๊ณต์ง€์‚ฌํ•ญ ๋ชฉ๋ก",
},
),
migrations.AlterField(
model_name="faq",
name="id",
field=models.AutoField(primary_key=True, serialize=False),
),
]
23 changes: 23 additions & 0 deletions src/faq/migrations/0004_delete_notice_alter_faq_id.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
# Generated by Django 5.1.5 on 2025-02-09 11:05

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
("faq", "0003_notice_alter_faq_id"),
]

operations = [
migrations.DeleteModel(
name="Notice",
),
migrations.AlterField(
model_name="faq",
name="id",
field=models.BigAutoField(
auto_created=True, primary_key=True, serialize=False, verbose_name="ID"
),
),
]
Empty file added src/faq/migrations/__init__.py
Empty file.
16 changes: 16 additions & 0 deletions src/faq/models.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
from django.db import models

class FAQ(models.Model):
"""
### FAQ ํ•„๋“œ ์ •์˜
"""
is_deleted = models.BooleanField(default=False, verbose_name="์‚ญ์ œ ์—ฌ๋ถ€")
question = models.CharField(max_length=255, verbose_name="์งˆ๋ฌธ")
answer = models.TextField(verbose_name="๋‹ต๋ณ€")
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
class Meta:
verbose_name = "FAQ"
verbose_name_plural = "FAQs"
def __str__(self):
return self.question
10 changes: 10 additions & 0 deletions src/faq/serializers.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
from rest_framework import serializers

from .models import FAQ


class FAQSerializer(serializers.ModelSerializer):
class Meta:
model = FAQ
fields = ['id', 'question', 'answer', 'is_deleted', 'created_at', 'updated_at']

2 changes: 2 additions & 0 deletions src/faq/tests.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@

# Create your tests here.
7 changes: 7 additions & 0 deletions src/faq/urls.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
from rest_framework.routers import DefaultRouter
from .views import FAQViewSet

router = DefaultRouter()
router.register(r'', FAQViewSet, basename="faq") # 'faqs' ๋Œ€์‹  ๋นˆ ๋ฌธ์ž์—ด

urlpatterns = router.urls
Loading