Fix GpsCheckin
This commit is contained in:
@ -1013,14 +1013,14 @@ class GpsLogAdmin(admin.ModelAdmin):
|
||||
list_display = ['id', 'serial_number', 'zekken_number', 'event_code', 'cp_number', 'checkin_time']
|
||||
list_filter = ['event_code', 'checkin_time', 'buy_flag', 'is_service_checked']
|
||||
search_fields = ['zekken_number', 'event_code', 'cp_number']
|
||||
readonly_fields = ['checkin_time', 'create_at', 'update_at']
|
||||
readonly_fields = ['checkin_time']
|
||||
|
||||
@admin.register(GpsCheckin)
|
||||
class GpsCheckinAdmin(admin.ModelAdmin):
|
||||
list_display = ['id', 'zekken', 'event_code', 'cp_number', 'create_at']
|
||||
list_filter = ['event_code', 'create_at', 'validate_location']
|
||||
list_display = ['id', 'zekken', 'event_code', 'cp_number', 'checkin_time']
|
||||
list_filter = ['event_code', 'checkin_time']
|
||||
search_fields = ['zekken', 'event_code', 'cp_number']
|
||||
readonly_fields = ['create_at']
|
||||
readonly_fields = ['checkin_time', 'record_time']
|
||||
|
||||
@admin.register(Checkpoint)
|
||||
class CheckpointAdmin(admin.ModelAdmin):
|
||||
|
||||
189
rog/models.py
189
rog/models.py
@ -913,182 +913,27 @@ class Checkpoint(models.Model):
|
||||
return f"CP{self.cp_number} - {self.cp_name} ({self.event.event_code if self.event.event_code else self.event.event_name})"
|
||||
|
||||
class GpsCheckin(models.Model):
|
||||
id = models.AutoField(primary_key=True) # 明示的にidフィールドを追加
|
||||
zekken = models.CharField(
|
||||
max_length=20,
|
||||
null=True,
|
||||
blank=True,
|
||||
help_text="ゼッケン番号(実テーブルフィールド名に合わせて修正)"
|
||||
)
|
||||
zekken_number = models.TextField(
|
||||
null=False,
|
||||
default='',
|
||||
help_text="ゼッケン番号(後方互換性のため残す)"
|
||||
)
|
||||
event_id = models.IntegerField(
|
||||
null=True,
|
||||
blank=True,
|
||||
help_text="イベントID"
|
||||
)
|
||||
event_code = models.TextField(
|
||||
null=False,
|
||||
default='',
|
||||
help_text="イベントコード"
|
||||
)
|
||||
cp_number = models.IntegerField(
|
||||
null=True,
|
||||
blank=True,
|
||||
help_text="チェックポイント番号"
|
||||
)
|
||||
lattitude = models.FloatField(
|
||||
null=True,
|
||||
blank=True,
|
||||
help_text="緯度:写真から取得"
|
||||
)
|
||||
longitude = models.FloatField(
|
||||
null=True,
|
||||
blank=True,
|
||||
help_text="経度:写真から取得"
|
||||
)
|
||||
image_address = models.TextField(
|
||||
null=True,
|
||||
blank=True,
|
||||
help_text="チェックイン画像のパス"
|
||||
)
|
||||
image_receipt = models.TextField(
|
||||
null=True,
|
||||
blank=True,
|
||||
default=False,
|
||||
help_text="レシート画像のパス"
|
||||
)
|
||||
image_qr = models.BooleanField(
|
||||
default=False,
|
||||
help_text="QRコードスキャンフラグ"
|
||||
)
|
||||
validate_location = models.BooleanField(
|
||||
default=False,
|
||||
help_text="位置情報検証フラグ:画像認識で検証した結果"
|
||||
)
|
||||
goal_time = models.TextField(
|
||||
null=True,
|
||||
blank=True,
|
||||
help_text="ゴール時刻=ゴール時のみ使用される。画像から時刻を読み取り設定する。"
|
||||
)
|
||||
late_point = models.IntegerField(
|
||||
null=True,
|
||||
blank=True,
|
||||
help_text="遅刻ポイント:ゴールの時刻が制限時間を超えた場合、1分につき-50点が加算。"
|
||||
)
|
||||
create_at = models.DateTimeField(
|
||||
null=True,
|
||||
blank=True,
|
||||
help_text="作成日時:データの作成日時"
|
||||
)
|
||||
create_user = models.TextField(
|
||||
null=True,
|
||||
blank=True,
|
||||
help_text="作成ユーザー"
|
||||
)
|
||||
update_at = models.DateTimeField(
|
||||
null=True,
|
||||
blank=True,
|
||||
help_text="更新日時"
|
||||
)
|
||||
update_user = models.TextField(
|
||||
null=True,
|
||||
blank=True,
|
||||
help_text="更新ユーザー"
|
||||
)
|
||||
buy_flag = models.BooleanField(
|
||||
default=False,
|
||||
help_text="購入フラグ:協賛店で購入した場合、無条件でTRUEにする。"
|
||||
)
|
||||
colabo_company_memo = models.TextField(
|
||||
null=False,
|
||||
default='',
|
||||
help_text="グループコード:複数のイベントで合算する場合に使用する"
|
||||
)
|
||||
points = models.IntegerField(
|
||||
null=True,
|
||||
blank=True,
|
||||
help_text="ポイント:このチェックインによる獲得ポイント。通常ポイントと買い物ポイントは分離される。ゴールの場合には減点なども含む。"
|
||||
)
|
||||
|
||||
# MobServer統合フィールド
|
||||
serial_number = models.IntegerField(
|
||||
null=True,
|
||||
blank=True,
|
||||
help_text="MobServer gps_information.serial_number"
|
||||
)
|
||||
team = models.ForeignKey(
|
||||
'Team',
|
||||
on_delete=models.CASCADE,
|
||||
null=True,
|
||||
blank=True,
|
||||
help_text="統合チームリレーション"
|
||||
)
|
||||
team_name = models.CharField(
|
||||
max_length=255,
|
||||
null=True,
|
||||
blank=True,
|
||||
help_text="チーム名(実テーブルフィールド)"
|
||||
)
|
||||
checkin_time = models.DateTimeField(
|
||||
null=True,
|
||||
blank=True,
|
||||
help_text="チェックイン時刻(実テーブルフィールド)"
|
||||
)
|
||||
checkpoint = models.ForeignKey(
|
||||
'Checkpoint',
|
||||
on_delete=models.CASCADE,
|
||||
null=True,
|
||||
blank=True,
|
||||
help_text="統合チェックポイントリレーション"
|
||||
)
|
||||
minus_photo_flag = models.BooleanField(
|
||||
default=False,
|
||||
help_text="MobServer gps_information.minus_photo_flag"
|
||||
)
|
||||
|
||||
# 通過審査管理フィールド
|
||||
validation_status = models.CharField(
|
||||
max_length=20,
|
||||
choices=[
|
||||
('PENDING', '審査待ち'),
|
||||
('APPROVED', '承認'),
|
||||
('REJECTED', '却下'),
|
||||
('AUTO_APPROVED', '自動承認')
|
||||
],
|
||||
default='PENDING',
|
||||
help_text="通過審査ステータス"
|
||||
)
|
||||
validation_comment = models.TextField(
|
||||
null=True,
|
||||
blank=True,
|
||||
help_text="審査コメント・理由"
|
||||
)
|
||||
validated_by = models.CharField(
|
||||
max_length=255,
|
||||
null=True,
|
||||
blank=True,
|
||||
help_text="審査者"
|
||||
)
|
||||
validated_at = models.DateTimeField(
|
||||
null=True,
|
||||
blank=True,
|
||||
help_text="審査日時"
|
||||
)
|
||||
id = models.AutoField(primary_key=True)
|
||||
event_code = models.CharField(max_length=255, null=False, default='')
|
||||
zekken = models.CharField(max_length=20, null=True, blank=True)
|
||||
serial_number = models.CharField(max_length=20, null=True, blank=True)
|
||||
cp_number = models.CharField(max_length=20, null=True, blank=True)
|
||||
lat = models.FloatField(null=True, blank=True)
|
||||
lng = models.FloatField(null=True, blank=True)
|
||||
checkin_time = models.DateTimeField(null=True, blank=True)
|
||||
record_time = models.DateTimeField(null=True, blank=True)
|
||||
location = models.PointField(srid=4326, null=True, blank=True)
|
||||
mobserver_id = models.IntegerField(null=True, blank=True)
|
||||
event_id = models.BigIntegerField(null=True, blank=True)
|
||||
team_id = models.BigIntegerField(null=True, blank=True)
|
||||
checkpoint_id = models.BigIntegerField(null=True, blank=True)
|
||||
|
||||
class Meta:
|
||||
db_table = 'rog_gpscheckin' # 実際のテーブル名に合わせて修正
|
||||
indexes = [
|
||||
models.Index(fields=['zekken', 'event_code', 'serial_number'], name='idx_zekken_event'),
|
||||
models.Index(fields=['create_at'], name='idx_create_at'),
|
||||
]
|
||||
|
||||
db_table = 'rog_gpscheckin'
|
||||
managed = True
|
||||
|
||||
def __str__(self):
|
||||
return f"{self.event_code}-{self.zekken_number}-{self.serial_number}-buy:{self.buy_flag}-valid:{self.validate_location}-point:{self.points}"
|
||||
return f"GPS Checkin {self.id} - {self.zekken}"
|
||||
|
||||
def save(self, *args, **kwargs):
|
||||
# 作成時・更新時のタイムスタンプを自動設定
|
||||
|
||||
25
rog/models_clean.py
Normal file
25
rog/models_clean.py
Normal file
@ -0,0 +1,25 @@
|
||||
# 実際のテーブル構造に基づいた最小限のGpsCheckinモデル
|
||||
from django.contrib.gis.db import models
|
||||
|
||||
class GpsCheckin(models.Model):
|
||||
id = models.AutoField(primary_key=True)
|
||||
event_code = models.CharField(max_length=255, null=False, default='')
|
||||
zekken = models.CharField(max_length=20, null=True, blank=True)
|
||||
serial_number = models.CharField(max_length=20, null=True, blank=True)
|
||||
cp_number = models.CharField(max_length=20, null=True, blank=True)
|
||||
lat = models.FloatField(null=True, blank=True)
|
||||
lng = models.FloatField(null=True, blank=True)
|
||||
checkin_time = models.DateTimeField(null=True, blank=True)
|
||||
record_time = models.DateTimeField(null=True, blank=True)
|
||||
location = models.PointField(null=True, blank=True)
|
||||
mobserver_id = models.IntegerField(null=True, blank=True)
|
||||
event_id = models.BigIntegerField(null=True, blank=True)
|
||||
team_id = models.BigIntegerField(null=True, blank=True)
|
||||
checkpoint_id = models.BigIntegerField(null=True, blank=True)
|
||||
|
||||
class Meta:
|
||||
db_table = 'rog_gpscheckin'
|
||||
managed = True
|
||||
|
||||
def __str__(self):
|
||||
return f"GPS Checkin {self.id} - {self.zekken}"
|
||||
Reference in New Issue
Block a user