temp update

This commit is contained in:
2024-07-22 06:53:48 +00:00
parent 6de4aabebb
commit 6f79d9a4be
2 changed files with 169 additions and 2 deletions

View File

@ -23,6 +23,11 @@ from django.apps import apps
from django.db import transaction
from django.contrib.auth.models import AbstractBaseUser, PermissionsMixin, BaseUserManager
from django.contrib.postgres.indexes import GistIndex
from django.utils import timezone
from datetime import timedelta,date
#from django.db import models
from django.core.exceptions import ValidationError
import csv
import codecs
@ -33,7 +38,7 @@ import uuid
env = environ.Env(DEBUG=(bool, False))
environ.Env.read_env(env_file=".env")
db = Db(dbname=env("POSTGRES_DBNAME"), user=env("POSTGRES_USER"), password=env("POSTGRES_PASS"), host="postgres-db", port=env("PG_PORT"))
db = Db(dbname=env("POSTGRES_DBNAME"), user=env("POSTGRES_USER"), password=env("POSTGRES_PASS"), host=env("PG_HOST"), port=env("PG_PORT"))
def get_file_path(instance, filename):
@ -213,6 +218,14 @@ class CustomUser(AbstractBaseUser, PermissionsMixin):
group = models.CharField(max_length=255,
choices=Groups.choices,
default=Groups.GB1)
# Akira
firstname = models.CharField(max_length=255,blank=True, null=True)
lastname = models.CharField(max_length=255, blank=True, null=True)
date_of_birth = models.DateField(blank=True, null=True)
female = models.BooleanField(default=False)
# Akira
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = ['group',]
@ -221,6 +234,160 @@ class CustomUser(AbstractBaseUser, PermissionsMixin):
def __str__(self):
return self.email
class TempUser(models.Model):
email = models.EmailField(unique=True)
password = models.CharField(max_length=128)
is_rogaining = models.BooleanField(default=False)
zekken_number = models.CharField(max_length=255, blank=True, null=True)
event_code = models.CharField(max_length=255, blank=True, null=True)
team_name = models.CharField(max_length=255, blank=True, null=True)
group = models.CharField(max_length=255)
firstname = models.CharField(max_length=255,blank=True, null=True)
lastname = models.CharField(max_length=255, blank=True, null=True)
date_of_birth = models.DateField(blank=True, null=True)
female = models.BooleanField(default=False)
verification_code = models.UUIDField(default=uuid.uuid4, editable=False)
created_at = models.DateTimeField(auto_now_add=True)
expires_at = models.DateTimeField()
def __str__(self):
return self.email
def save(self, *args, **kwargs):
if not self.expires_at:
self.expires_at = timezone.now() + timedelta(hours=24) # 24時間の有効期限
super().save(*args, **kwargs)
def is_valid(self):
return timezone.now() <= self.expires_at
class Event(models.Model):
event_name = models.CharField(max_length=255, primary_key=True)
start_datetime = models.DateTimeField(default=timezone.now)
end_datetime = models.DateTimeField()
def __str__(self):
return f"{self.event_name} - From:{self.start_datetime} To:{self.end_datetime}"
class Team(models.Model):
zekken_number = models.CharField(max_length=255, primary_key=True)
team_name = models.CharField(max_length=255)
password = models.CharField(max_length=128)
owner = models.ForeignKey(CustomUser, on_delete=models.CASCADE)
def __str__(self):
return f"{self.zekken_number} - {self.team_name}, owner:{self.owner.lastname} {self.owner.firstname}"
class Member(models.Model):
team = models.ForeignKey(Team, on_delete=models.CASCADE)
user = models.ForeignKey(CustomUser, on_delete=models.CASCADE)
class Meta:
unique_together = ('team', 'user')
def __str__(self):
return f"{self.team.zekken_number} - {self.user.lastname} {self.user.firstname}"
#
class Category(models.Model):
category_name = models.CharField(max_length=255, primary_key=True)
category_number = models.IntegerField(unique=True)
duration = models.DurationField(default=timedelta(hours=5))
num_of_member = models.IntegerField(default=1)
family = models.BooleanField(default=False)
female = models.BooleanField(default=False)
class Meta:
unique_together = ('category_name','category_number')
def __str__(self):
hours = self.duration.total_seconds() // 3600
return f"{self.category_name} - {self.category_number} ({int(hours)}時間)"
@property
def hours(self):
return self.duration.total_seconds() // 3600
class Entry(models.Model):
team = models.ForeignKey(Team, on_delete=models.CASCADE)
event = models.ForeignKey(Event, on_delete=models.CASCADE)
category = models.ForeignKey(Category, on_delete=models.CASCADE)
date = models.DateTimeField()
class Meta:
unique_together = ('team', 'event', 'date')
def __str__(self):
return f"{self.team.zekken_number} - {self.event.event_name} - {self.date}"
def clean(self):
super().clean()
if self.event and self.category and self.date:
start = self.event.start_datetime
end = self.event.end_datetime - self.category.duration
if not (start <= self.date <= end):
raise ValidationError({
'date': f'日時は{start}から{end}の間である必要があります。'
})
# メンバーの年齢と性別をチェック
members = Member.objects.filter(team=self.team)
if not members.exists():
raise ValidationError("チームにメンバーが登録されていません。")
adults = [m for m in members if self.is_adult(m.user.date_of_birth)]
children = [m for m in members if self.is_child(m.user.date_of_birth)]
teenagers = [m for m in members if self.is_teenager(m.user.date_of_birth)]
if self.category.family:
if not (adults and children):
raise ValidationError("ファミリーカテゴリーには、18歳以上のメンバーと小学生以下のメンバーが各1名以上必要です。")
else:
if not adults:
raise ValidationError("18歳以上のメンバーが1名以上必要です。")
if children:
raise ValidationError("ファミリーカテゴリー以外では、小学生以下のメンバーは参加できません。")
if self.category.num_of_member == 1:
if len(members) != 1:
raise ValidationError("このカテゴリーはソロ参加のみ可能です。")
if not adults:
raise ValidationError("ソロ参加は18歳以上のみ可能です。")
if self.category.female and not members[0].user.female:
raise ValidationError("このカテゴリーは女性のみ参加可能です。")
if not self.category.female and members[0].user.female:
raise ValidationError("このカテゴリーは男性のみ参加可能です。")
if len(members) > self.category.num_of_member:
raise ValidationError(f"このカテゴリーは{self.category.num_of_member}名までの参加が必要です。")
def save(self, *args, **kwargs):
self.full_clean()
super().save(*args, **kwargs)
@staticmethod
def is_adult(birth_date):
today = date.today()
age = today.year - birth_date.year - ((today.month, today.day) < (birth_date.month, birth_date.day))
return age >= 18
@staticmethod
def is_child(birth_date):
today = date.today()
age = today.year - birth_date.year - ((today.month, today.day) < (birth_date.month, birth_date.day))
return age <= 12
@staticmethod
def is_teenager(birth_date):
today = date.today()
age = today.year - birth_date.year - ((today.month, today.day) < (birth_date.month, birth_date.day))
return 13 <= age <= 17
class GoalImages(models.Model):
user=models.ForeignKey(CustomUser, on_delete=models.DO_NOTHING)
goalimage = models.FileField(upload_to='goals/%y%m%d', blank=True, null=True)