temp update
This commit is contained in:
@ -173,4 +173,4 @@ LEAFLET_CONFIG = {
|
|||||||
REST_FRAMEWORK = {
|
REST_FRAMEWORK = {
|
||||||
'DEFAULT_FILTER_BACKENDS': ['django_filters.rest_framework.DjangoFilterBackend'],
|
'DEFAULT_FILTER_BACKENDS': ['django_filters.rest_framework.DjangoFilterBackend'],
|
||||||
'DEFAULT_AUTHENTICATION_CLASSES': ('knox.auth.TokenAuthentication', ),
|
'DEFAULT_AUTHENTICATION_CLASSES': ('knox.auth.TokenAuthentication', ),
|
||||||
}
|
}
|
||||||
|
|||||||
169
rog/models.py
169
rog/models.py
@ -23,6 +23,11 @@ from django.apps import apps
|
|||||||
from django.db import transaction
|
from django.db import transaction
|
||||||
from django.contrib.auth.models import AbstractBaseUser, PermissionsMixin, BaseUserManager
|
from django.contrib.auth.models import AbstractBaseUser, PermissionsMixin, BaseUserManager
|
||||||
from django.contrib.postgres.indexes import GistIndex
|
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 csv
|
||||||
import codecs
|
import codecs
|
||||||
@ -33,7 +38,7 @@ import uuid
|
|||||||
env = environ.Env(DEBUG=(bool, False))
|
env = environ.Env(DEBUG=(bool, False))
|
||||||
environ.Env.read_env(env_file=".env")
|
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):
|
def get_file_path(instance, filename):
|
||||||
@ -213,6 +218,14 @@ class CustomUser(AbstractBaseUser, PermissionsMixin):
|
|||||||
group = models.CharField(max_length=255,
|
group = models.CharField(max_length=255,
|
||||||
choices=Groups.choices,
|
choices=Groups.choices,
|
||||||
default=Groups.GB1)
|
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'
|
USERNAME_FIELD = 'email'
|
||||||
REQUIRED_FIELDS = ['group',]
|
REQUIRED_FIELDS = ['group',]
|
||||||
|
|
||||||
@ -221,6 +234,160 @@ class CustomUser(AbstractBaseUser, PermissionsMixin):
|
|||||||
def __str__(self):
|
def __str__(self):
|
||||||
return self.email
|
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):
|
class GoalImages(models.Model):
|
||||||
user=models.ForeignKey(CustomUser, on_delete=models.DO_NOTHING)
|
user=models.ForeignKey(CustomUser, on_delete=models.DO_NOTHING)
|
||||||
goalimage = models.FileField(upload_to='goals/%y%m%d', blank=True, null=True)
|
goalimage = models.FileField(upload_to='goals/%y%m%d', blank=True, null=True)
|
||||||
|
|||||||
Reference in New Issue
Block a user