From 6f79d9a4be0e1c62f5c2ed88e80944ae78b88d7e Mon Sep 17 00:00:00 2001 From: Akira Miyata Date: Mon, 22 Jul 2024 06:53:48 +0000 Subject: [PATCH] temp update --- config/settings.py | 2 +- rog/models.py | 169 ++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 169 insertions(+), 2 deletions(-) diff --git a/config/settings.py b/config/settings.py index af494b0..6f7d0bf 100644 --- a/config/settings.py +++ b/config/settings.py @@ -173,4 +173,4 @@ LEAFLET_CONFIG = { REST_FRAMEWORK = { 'DEFAULT_FILTER_BACKENDS': ['django_filters.rest_framework.DjangoFilterBackend'], 'DEFAULT_AUTHENTICATION_CLASSES': ('knox.auth.TokenAuthentication', ), -} \ No newline at end of file +} diff --git a/rog/models.py b/rog/models.py index 5937134..b50c447 100644 --- a/rog/models.py +++ b/rog/models.py @@ -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)