2025-05-27 11:35:23 +09:00

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}"