Skip to content

후원사 django app 생성 #9

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

Merged
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
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
/.idea
/db.sqlite3
/sponsor/migrations
1 change: 1 addition & 0 deletions pyconkr/settings-dev.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
}

# django-storages: S3
del MEDIA_ROOT
DEFAULT_FILE_STORAGE = "storages.backends.s3boto3.S3Boto3Storage"
STATICFILES_STORAGE = "storages.backends.s3boto3.S3StaticStorage"
AWS_S3_ACCESS_KEY_ID = os.getenv("AWS_S3_ACCESS_KEY_ID")
Expand Down
1 change: 1 addition & 0 deletions pyconkr/settings-prod.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
}

# django-storages: S3
del MEDIA_ROOT
DEFAULT_FILE_STORAGE = "storages.backends.s3boto3.S3Boto3Storage"
STATICFILES_STORAGE = "storages.backends.s3boto3.S3StaticStorage"
AWS_S3_ACCESS_KEY_ID = os.getenv("AWS_S3_ACCESS_KEY_ID")
Expand Down
11 changes: 10 additions & 1 deletion pyconkr/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,8 +37,13 @@
"django.contrib.sessions",
"django.contrib.messages",
"django.contrib.staticfiles",
# djangorestframework

# add-on
"rest_framework",
"django_summernote"

# apps
"sponsor",
]

MIDDLEWARE = [
Expand Down Expand Up @@ -123,3 +128,7 @@
# https://docs.djangoproject.com/en/4.1/ref/settings/#default-auto-field

DEFAULT_AUTO_FIELD = "django.db.models.BigAutoField"

# django-summernote
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media/')
2 changes: 2 additions & 0 deletions pyconkr/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,5 +18,7 @@

urlpatterns = [
path("api-auth/", include("rest_framework.urls")),
path('summernote/', include("django_summernote.urls")),
path("admin/", admin.site.urls),
path("sponsors/", include("sponsor.urls")),
]
3 changes: 2 additions & 1 deletion requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,5 @@ Markdown==3.4.1
mysql-connector-python==8.0.32
mysqlclient==2.1.1
sqlparse==0.4.3
tzdata==2022.7
tzdata==2022.7
sorl-thumbnail==12.9.0
Empty file added sponsor/__init__.py
Empty file.
25 changes: 25 additions & 0 deletions sponsor/admin.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
from django.contrib import admin
from sponsor.models import Sponsor, SponsorLevel


class SponsorAdmin(SummernoteModelAdmin):
formfield_overrides = {models.TextField: {
'widget': SummernoteWidgetWithCustomToolbar}}
autocomplete_fields = ('creator', 'manager_id',)
list_display = ('creator', 'name', 'level', 'manager_name', 'manager_email', 'manager_id',
'submitted', 'accepted', 'paid_at',)
list_filter = ('accepted',)
ordering = ('-created_at',)


admin.site.register(Sponsor, SponsorAdmin)


class SponsorLevelAdmin(SummernoteModelAdmin):
list_display = ('id', 'order', 'name', 'slug', 'price', 'limit',)
list_editable = ('order', 'slug',)
ordering = ('order',)
search_fields = ('name',)


admin.site.register(SponsorLevel, SponsorLevelAdmin)
6 changes: 6 additions & 0 deletions sponsor/apps.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
from django.apps import AppConfig


class SponsorConfig(AppConfig):
default_auto_field = "django.db.models.BigAutoField"
name = "sponsor"
138 changes: 138 additions & 0 deletions sponsor/models.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,138 @@
from django.db import models
from django.contrib.auth import get_user_model
from sorl.thumbnail import ImageField as SorlImageField

User = get_user_model()


class SponsorLevelManager(models.Manager):
def get_queryset(self):
return super(SponsorLevelManager, self).get_queryset().all().order_by("order")


class SponsorLevel(models.Model):
name = models.CharField(max_length=255, blank=True, default="", help_text="후원 등급명")
desc = models.TextField(
null=True, blank=True, help_text="후원 혜택을 입력하면 될 거 같아요 :) 후원사가 등급을 정할 때 볼 문구입니다."
)
visible = models.BooleanField(default=True)
price = models.IntegerField(default=0)
limit = models.IntegerField(default=0, help_text="후원사 등급 별 구좌수")
order = models.IntegerField(default=1)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)

objects = SponsorLevelManager()

@property
def current_remaining_number(self):
return (
0
if self.limit - self.accepted_count < 0
else self.limit - self.accepted_count
)

@property
def paid_count(self):
return Sponsor.objects.filter(
level=self, submitted=True, accepted=True, paid_at__isnull=False
).count()

@property
def accepted_count(self):
return Sponsor.objects.filter(level=self, submitted=True, accepted=True).count()

def __str__(self):
return self.name


def registration_file_upload_to(instance, filename):
return f"sponsor/business_registration/{instance.id}/{filename}"


def logo_image_upload_to(instance, filename):
return f"sponsor/logo/{instance.id}/{filename}"


class Sponsor(models.Model):
class Meta:
ordering = ["paid_at", "id"]

creator = models.ForeignKey(
User,
null=True, # TODO: 추루 로그인 적용 후 입력
blank=True, # TODO: 추루 로그인 적용 후 입력
on_delete=models.CASCADE,
help_text="후원사를 등록한 유저",
related_name="sponsor_creator",
)
name = models.CharField(
max_length=255, help_text="후원사의 이름입니다. 서비스나 회사 이름이 될 수 있습니다."
)
level = models.ForeignKey(
SponsorLevel,
null=True,
on_delete=models.SET_NULL,
blank=True,
help_text="후원을 원하시는 등급을 선택해주십시오. 모두 판매된 등급은 선택할 수 없습니다.",
)
desc = models.TextField(
null=True, blank=True, help_text="후원사 설명입니다. 이 설명은 국문 홈페이지에 게시됩니다."
)
eng_desc = models.TextField(
null=True, blank=True, help_text="후원사 영문 설명입니다. 이 설명은 영문 홈페이지에 게시됩니다."
)
manager_name = models.CharField(
max_length=100, help_text="준비위원회와 후원과 관련된 논의를 진행할 담당자의 이름을 입력해주십시오."
)
manager_email = models.CharField(
max_length=100,
help_text="입력하신 메일로 후원과 관련된 안내 메일이나 문의를 보낼 예정입니다. 후원 담당자의 이메일 주소를 입력해주십시오.",
)
manager_id = models.ForeignKey(
User,
null=True,
blank=True,
on_delete=models.CASCADE,
help_text="후원사를 위한 추가 아이디",
related_name="sponsor_temp_id",
)
business_registration_number = models.CharField(
max_length=100,
null=True,
blank=True,
help_text="후원사 사업자 등록번호입니다. 세금 계산서 발급에 사용됩니다.",
)
business_registration_file = models.FileField(
null=True,
blank=True,
upload_to=registration_file_upload_to,
help_text="후원사 사업자 등록증 스캔본입니다. 세금 계산서 발급에 사용됩니다.",
)
url = models.CharField(
max_length=255,
null=True,
blank=True,
help_text="파이콘 홈페이지에 공개되는 후원사 홈페이지 주소입니다.",
)
logo_image = SorlImageField(
upload_to=logo_image_upload_to,
null=True,
blank=True,
help_text="홈페이지에 공개되는 후원사 로고 이미지입니다.",
)
submitted = models.BooleanField(
default=False,
help_text="사용자가 제출했는지 여부를 저장합니다. 요청이 제출되면 준비위원회에서 검토하고 받아들일지를 결정합니다.",
)
accepted = models.BooleanField(
default=False, help_text="후원사 신청이 접수되었고, 입금 대기 상태인 경우 True로 설정됩니다."
)
paid_at = models.DateTimeField(
null=True, blank=True, help_text="후원금이 입금된 일시입니다. 아직 입금되지 않았을 경우 None이 들어갑니다."
)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)

def __str_(self):
return f"{self.name}/{self.level}"
3 changes: 3 additions & 0 deletions sponsor/tests.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
from django.test import TestCase

# Create your tests here.
6 changes: 6 additions & 0 deletions sponsor/urls.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
from django.contrib import admin
from django.urls import path, include

urlpatterns = [
# path("", ), # TODO
]
3 changes: 3 additions & 0 deletions sponsor/views.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
from django.shortcuts import render

# Create your views here.