initial setting at 20-Aug-2025
This commit is contained in:
143
rog/models.py
Normal file → Executable file
143
rog/models.py
Normal file → Executable file
@ -422,6 +422,7 @@ class Entry(models.Model):
|
||||
date = models.DateTimeField()
|
||||
owner = models.ForeignKey(CustomUser, on_delete=models.CASCADE,blank=True, null=True) # Akira 2024-7-24
|
||||
zekken_number = models.IntegerField(default=0)
|
||||
zekken_label = models.CharField(max_length=255, blank=True, null=True)
|
||||
is_active = models.BooleanField(default=True) # 新しく追加
|
||||
hasParticipated = models.BooleanField(default=False) # 新しく追加
|
||||
hasGoaled = models.BooleanField(default=False) # 新しく追加
|
||||
@ -1402,3 +1403,145 @@ def publish_data(sender, instance, created, **kwargs):
|
||||
insertUserUploadUser(instance.name, fields)
|
||||
except Exception as e:
|
||||
print('######## user csv file ##########',e)
|
||||
|
||||
|
||||
# for upper compatible
|
||||
|
||||
# 既存のモデルに追加=> 通過記録に相応しい名称に変更すべき
|
||||
|
||||
|
||||
class GpsLog(models.Model):
|
||||
"""
|
||||
GPSチェックイン情報を管理するモデル
|
||||
gps_informationテーブルに対応
|
||||
"""
|
||||
serial_number = models.IntegerField(null=False)
|
||||
|
||||
# 新規追加
|
||||
entry = models.ForeignKey(Entry, on_delete=models.CASCADE, related_name='checkpoints')
|
||||
|
||||
# Entry へ移行
|
||||
zekken_number = models.TextField(null=False)
|
||||
event_code = models.TextField(null=False)
|
||||
|
||||
cp_number = models.TextField(null=True, blank=True)
|
||||
image_address = models.TextField(null=True, blank=True)
|
||||
|
||||
# 新規追加
|
||||
checkin_time = models.DateTimeField(auto_now_add=True)
|
||||
|
||||
goal_time = models.TextField(null=True, blank=True)
|
||||
late_point = models.IntegerField(null=True, blank=True)
|
||||
create_at = models.DateTimeField(null=True, blank=True)
|
||||
create_user = models.TextField(null=True, blank=True)
|
||||
update_at = models.DateTimeField(null=True, blank=True)
|
||||
update_user = models.TextField(null=True, blank=True)
|
||||
buy_flag = models.BooleanField(null=True, blank=True)
|
||||
minus_photo_flag = models.BooleanField(null=True, blank=True)
|
||||
colabo_company_memo = models.TextField(null=False, default='')
|
||||
|
||||
# 新規追加
|
||||
is_service_checked = models.BooleanField(default=False)
|
||||
|
||||
# ゴール記録用に追加
|
||||
score = models.IntegerField(default=0, null=True, blank=True)
|
||||
scoreboard_url = models.URLField(blank=True, null=True)
|
||||
|
||||
class Meta:
|
||||
db_table = 'gps_information'
|
||||
# 複合主キーの設定
|
||||
unique_together = [['serial_number', 'zekken_number', 'event_code', 'colabo_company_memo']]
|
||||
# インデックスの設定(必要に応じて)
|
||||
indexes = [
|
||||
models.Index(fields=['zekken_number', 'event_code'], name='gpslog_zekken_event_idx'),
|
||||
models.Index(fields=['create_at'], name='gpslog_create_at_idx'),
|
||||
]
|
||||
|
||||
def __str__(self):
|
||||
return f"{self.event_code}-{self.zekken_number}-{self.serial_number}"
|
||||
|
||||
|
||||
@classmethod
|
||||
def record_start(cls, entry):
|
||||
"""
|
||||
チームのスタート情報を記録する
|
||||
以前はTeamStartモデルが担当していた機能
|
||||
"""
|
||||
return cls.objects.create(
|
||||
serial_number=0, # スタートログを表す特別な値
|
||||
entry=entry,
|
||||
zekken_number=entry.zekken_number,
|
||||
event_code=entry.event.event_name,
|
||||
cp_number="START",
|
||||
create_at=timezone.now(),
|
||||
update_at=timezone.now(),
|
||||
buy_flag=False,
|
||||
colabo_company_memo=""
|
||||
)
|
||||
|
||||
@classmethod
|
||||
def record_goal(cls, entry, goal_time=None, image_url=None, score=0, scoreboard_url=None):
|
||||
"""
|
||||
チームのゴール情報を記録する
|
||||
以前はTeamGoalモデルが担当していた機能
|
||||
"""
|
||||
if goal_time is None:
|
||||
goal_time = timezone.now()
|
||||
|
||||
return cls.objects.create(
|
||||
serial_number=9999, # ゴールログを表す特別な値
|
||||
entry=entry,
|
||||
zekken_number=entry.zekken_number,
|
||||
event_code=entry.event.event_name,
|
||||
cp_number="GOAL",
|
||||
image_address=image_url,
|
||||
create_at=goal_time,
|
||||
update_at=timezone.now(),
|
||||
goal_time=goal_time.strftime('%Y-%m-%d %H:%M:%S'),
|
||||
buy_flag=False,
|
||||
score=score,
|
||||
scoreboard_url=scoreboard_url,
|
||||
colabo_company_memo=""
|
||||
)
|
||||
|
||||
def is_start_record(self):
|
||||
"""このレコードがスタート記録かどうかを判定"""
|
||||
return self.cp_number == "START" and self.serial_number == 0
|
||||
|
||||
def is_goal_record(self):
|
||||
"""このレコードがゴール記録かどうかを判定"""
|
||||
return self.cp_number == "GOAL" and self.serial_number == 9999
|
||||
|
||||
|
||||
@property
|
||||
def start_time(self):
|
||||
"""スタート時刻を返す(TeamStartとの互換性のため)"""
|
||||
return self.create_at or self.checkin_time
|
||||
|
||||
@property
|
||||
def goal_datetime(self):
|
||||
"""ゴール時刻をDateTimeとして返す(TeamGoalとの互換性のため)"""
|
||||
if self.is_goal_record() and self.create_at:
|
||||
return self.create_at
|
||||
return None
|
||||
|
||||
|
||||
|
||||
class Waypoint(models.Model):
|
||||
entry = models.ForeignKey('Entry', on_delete=models.CASCADE, related_name='waypoints')
|
||||
latitude = models.FloatField()
|
||||
longitude = models.FloatField()
|
||||
altitude = models.FloatField(null=True, blank=True)
|
||||
accuracy = models.FloatField(null=True, blank=True)
|
||||
speed = models.FloatField(null=True, blank=True)
|
||||
recorded_at = models.DateTimeField()
|
||||
created_at = models.DateTimeField(auto_now_add=True)
|
||||
|
||||
class Meta:
|
||||
ordering = ['recorded_at']
|
||||
indexes = [
|
||||
models.Index(fields=['entry', 'recorded_at']),
|
||||
]
|
||||
|
||||
def __str__(self):
|
||||
return f"{self.entry.team_name} - {self.recorded_at.strftime('%Y-%m-%d %H:%M:%S')}"
|
||||
Reference in New Issue
Block a user