129 lines
5.7 KiB
Python
Executable File
129 lines
5.7 KiB
Python
Executable File
import os
|
|
from datetime import datetime
|
|
from django.contrib.auth.models import AbstractUser
|
|
from django.db import models
|
|
from django.conf import settings
|
|
|
|
class CustomUser(AbstractUser):
|
|
nickname = models.CharField(max_length=30, unique=True)
|
|
birthdate = models.DateField(null=True, blank=True)
|
|
email_verified = models.BooleanField(default=False)
|
|
character_image = models.ImageField(upload_to='characters/', null=True, blank=True)
|
|
skin_image = models.ImageField(upload_to='skins/', null=True, blank=True)
|
|
gender = models.CharField(max_length=2, choices=[('남', '남'), ('여', '여')], blank=True)
|
|
phone = models.CharField(max_length=20, blank=True)
|
|
address = models.CharField(max_length=255, blank=True)
|
|
|
|
def __str__(self):
|
|
return self.username
|
|
|
|
|
|
class LottoDraw(models.Model):
|
|
draw_no = models.IntegerField(primary_key=True)
|
|
number_1 = models.PositiveSmallIntegerField()
|
|
number_2 = models.PositiveSmallIntegerField()
|
|
number_3 = models.PositiveSmallIntegerField()
|
|
number_4 = models.PositiveSmallIntegerField()
|
|
number_5 = models.PositiveSmallIntegerField()
|
|
number_6 = models.PositiveSmallIntegerField()
|
|
bonus = models.PositiveSmallIntegerField()
|
|
first_prize = models.BigIntegerField()
|
|
first_winners = models.IntegerField()
|
|
second_prize = models.BigIntegerField()
|
|
second_winners = models.IntegerField()
|
|
draw_date = models.DateField(null=True, blank=True)
|
|
|
|
def __str__(self):
|
|
return f"{self.draw_no}회"
|
|
|
|
class LottoRecommendation(models.Model):
|
|
METHOD_CHOICES = [
|
|
('freq', '빈도 기반'),
|
|
('gap', '간격 기반'),
|
|
('pattern', '패턴 기반'),
|
|
('cluster', '클러스터링 기반'),
|
|
('extra', '보조 추천'),
|
|
]
|
|
|
|
method = models.CharField(max_length=10, choices=METHOD_CHOICES)
|
|
numbers = models.JSONField()
|
|
created_at = models.DateTimeField(auto_now_add=True)
|
|
|
|
def __str__(self):
|
|
return f"{self.get_method_display()} 추천 ({self.created_at.date()})"
|
|
|
|
class NewsArticle(models.Model):
|
|
aid = models.CharField(max_length=20, blank=True, null=True)
|
|
title = models.CharField(max_length=300)
|
|
link = models.CharField(max_length=200, unique=True)
|
|
content_html = models.TextField()
|
|
content_txt = models.TextField(blank=True, null=True) # ✅ 본문 텍스트
|
|
content_image = models.TextField(blank=True, null=True) # ✅ 본문 내 이미지 src 모음
|
|
desc = models.TextField(blank=True, null=True) # ✅ 요약 설명
|
|
author = models.CharField(max_length=100, blank=True, null=True) # ✅ 기자
|
|
section = models.CharField(max_length=50, blank=True, null=True) # ✅ 정치/사회 등 섹션
|
|
main_image = models.URLField(blank=True, null=True) # ✅ 대표 썸네일
|
|
isvod = models.BooleanField(default=False) # ✅ 영상 포함 여부
|
|
pub_date = models.DateTimeField()
|
|
|
|
def __str__(self):
|
|
return self.title
|
|
|
|
class UserProfile(models.Model):
|
|
user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
|
|
nickname = models.CharField(max_length=30, default='나') # 1인칭 호칭
|
|
mbti = models.CharField(max_length=4) # 예: INFJ, ENFP 등
|
|
mood_baseline = models.CharField(max_length=100) # 평소 기분 상태 (예: 차분함)
|
|
personality = models.TextField() # 작성자 자가 기술
|
|
favorite_keywords = models.CharField(max_length=255) # 선호 키워드 (예: 고요함, 계절, 추억)
|
|
writing_style = models.TextField() # 시적인, 간결한, 철학적인 등
|
|
tone = models.CharField(max_length=100, default='조용하고 따뜻한 어조') # 말투
|
|
dream_type = models.CharField(max_length=100, blank=True) # 꿈의 성향 (몽환적, 현실적 등)
|
|
preferred_time = models.CharField(max_length=50, blank=True) # 선호 시간대 (새벽, 밤, 낮)
|
|
|
|
def __str__(self):
|
|
return f"{self.user.username}의 프로필"
|
|
|
|
class Diary(models.Model):
|
|
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
|
|
date = models.DateField()
|
|
keywords = models.CharField(max_length=255)
|
|
mood = models.CharField(max_length=100)
|
|
weather = models.CharField(max_length=100)
|
|
diary_text = models.TextField()
|
|
created_at = models.DateTimeField(auto_now_add=True)
|
|
|
|
# 🔗 연결 관계 (작성된 프롬프트 기반 입력 정보)
|
|
input = models.OneToOneField("DiaryInput", on_delete=models.SET_NULL, null=True, blank=True)
|
|
|
|
def __str__(self):
|
|
return f"[{self.date}] {self.keywords}"
|
|
|
|
def diary_image_upload_path(instance, filename):
|
|
now = datetime.now()
|
|
folder = now.strftime("%Y%m")
|
|
ext = os.path.splitext(filename)[1]
|
|
user_id = instance.user.id if instance.user else "anonymous"
|
|
fname = f"{user_id}_{now.strftime('%Y%m%d%H%M%S')}{ext}"
|
|
return f"diary_images/{folder}/{fname}" # MEDIA_ROOT 기준 경로
|
|
|
|
class DiaryInput(models.Model):
|
|
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
|
|
date = models.DateField(auto_now_add=True)
|
|
mood = models.CharField(max_length=50)
|
|
state = models.CharField(max_length=50)
|
|
location = models.CharField(max_length=100)
|
|
weather = models.CharField(max_length=50)
|
|
time_of_day = models.CharField(max_length=50)
|
|
with_whom = models.CharField(max_length=50)
|
|
event = models.CharField(max_length=50)
|
|
one_word = models.CharField(max_length=50)
|
|
most_important = models.CharField(max_length=255)
|
|
keywords = models.TextField()
|
|
summary = models.TextField(blank=True, null=True)
|
|
prompt = models.TextField() # ✅ 프롬프트 저장 필드
|
|
created_at = models.DateTimeField(auto_now_add=True)
|
|
image = models.ImageField(upload_to=diary_image_upload_path, blank=True, null=True)
|
|
|
|
def __str__(self):
|
|
return f"{self.user.username} - {self.date}" |