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