Fix deployment issue, see DEPLOYMENT_MIGRATION_GUIDE_en.md

This commit is contained in:
2025-08-28 14:13:39 +09:00
parent bba0422efb
commit a180c1e258
29 changed files with 5750 additions and 1 deletions

View File

@ -0,0 +1,847 @@
# Generated by Django 3.2.9 on 2025-05-13 08:22
import datetime
from django.conf import settings
import django.contrib.gis.db.models.fields
import django.contrib.postgres.indexes
from django.db import migrations, models
import django.db.models.deletion
import django.utils.timezone
import rog.models
import uuid
class Migration(migrations.Migration):
initial = True
dependencies = [
('auth', '0012_alter_user_first_name_max_length'),
]
operations = [
migrations.CreateModel(
name='GifuAreas',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('geom', django.contrib.gis.db.models.fields.MultiPolygonField(blank=True, null=True, srid=4326)),
('adm0_en', models.CharField(blank=True, max_length=254, null=True)),
('adm0_ja', models.CharField(blank=True, max_length=254, null=True)),
('adm0_pcode', models.CharField(blank=True, max_length=254, null=True)),
('adm1_en', models.CharField(blank=True, max_length=254, null=True)),
('adm1_ja', models.CharField(blank=True, max_length=254, null=True)),
('adm1_pcode', models.CharField(blank=True, max_length=254, null=True)),
('adm2_ja', models.CharField(blank=True, max_length=254, null=True)),
('adm2_en', models.CharField(blank=True, max_length=254, null=True)),
('adm2_pcode', models.CharField(blank=True, max_length=254, null=True)),
('area_nm', models.CharField(blank=True, max_length=254, null=True)),
],
options={
'db_table': 'gifu_areas',
'managed': False,
},
),
migrations.CreateModel(
name='JpnAdminMainPerf',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('geom', django.contrib.gis.db.models.fields.MultiPolygonField(blank=True, null=True, srid=4326)),
('adm0_en', models.CharField(blank=True, max_length=254, null=True)),
('adm0_ja', models.CharField(blank=True, max_length=254, null=True)),
('adm0_pcode', models.CharField(blank=True, max_length=254, null=True)),
('adm1_en', models.CharField(blank=True, max_length=254, null=True)),
('adm1_ja', models.CharField(blank=True, max_length=254, null=True)),
('adm1_pcode', models.CharField(blank=True, max_length=254, null=True)),
],
options={
'db_table': 'jpn_admin_main_perf',
'managed': False,
},
),
migrations.CreateModel(
name='JpnSubPerf',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('geom', django.contrib.gis.db.models.fields.MultiPolygonField(blank=True, null=True, srid=4326)),
('adm0_en', models.CharField(blank=True, max_length=254, null=True)),
('adm0_ja', models.CharField(blank=True, max_length=254, null=True)),
('adm0_pcode', models.CharField(blank=True, max_length=254, null=True)),
('adm1_en', models.CharField(blank=True, max_length=254, null=True)),
('adm1_ja', models.CharField(blank=True, max_length=254, null=True)),
('adm1_pcode', models.CharField(blank=True, max_length=254, null=True)),
('adm2_ja', models.CharField(blank=True, max_length=254, null=True)),
('adm2_en', models.CharField(blank=True, max_length=254, null=True)),
('adm2_pcode', models.CharField(blank=True, max_length=254, null=True)),
('name_modified', models.CharField(blank=True, max_length=254, null=True)),
('area_name', models.CharField(blank=True, max_length=254, null=True)),
('list_order', models.IntegerField(default=0)),
],
options={
'db_table': 'jpn_sub_perf',
'managed': False,
},
),
migrations.CreateModel(
name='CustomUser',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('password', models.CharField(max_length=128, verbose_name='password')),
('last_login', models.DateTimeField(blank=True, null=True, verbose_name='last login')),
('is_superuser', models.BooleanField(default=False, help_text='Designates that this user has all permissions without explicitly assigning them.', verbose_name='superuser status')),
('email', models.EmailField(max_length=254, unique=True)),
('firstname', models.CharField(blank=True, max_length=255, null=True)),
('lastname', models.CharField(blank=True, max_length=255, null=True)),
('date_of_birth', models.DateField(blank=True, null=True)),
('female', models.BooleanField(default=False)),
('group', models.CharField(blank=True, max_length=255)),
('is_active', models.BooleanField(default=True)),
('is_staff', models.BooleanField(default=False)),
('date_joined', models.DateTimeField(default=django.utils.timezone.now)),
('is_rogaining', models.BooleanField(default=False)),
('zekken_number', models.CharField(blank=True, max_length=255, null=True, verbose_name='Zekken Number')),
('event_code', models.CharField(blank=True, max_length=255, null=True, verbose_name='Event Code')),
('team_name', models.CharField(blank=True, max_length=255, null=True, verbose_name='Team Name')),
],
options={
'abstract': False,
},
),
migrations.CreateModel(
name='Category',
fields=[
('category_name', models.CharField(max_length=255, primary_key=True, serialize=False)),
('category_number', models.IntegerField(default=0)),
('duration', models.DurationField(default=datetime.timedelta(seconds=18000))),
('num_of_member', models.IntegerField(default=1)),
('family', models.BooleanField(default=False)),
('female', models.BooleanField(default=False)),
],
),
migrations.CreateModel(
name='CheckinImages',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('checkinimage', models.FileField(blank=True, null=True, upload_to='checkin/%y%m%d')),
('checkintime', models.DateTimeField(verbose_name='Goal time')),
('team_name', models.CharField(max_length=255, verbose_name='Team name')),
('event_code', models.CharField(max_length=255, verbose_name='event code')),
('cp_number', models.IntegerField(verbose_name='CP numner')),
],
),
migrations.CreateModel(
name='CheckPoint',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('cp_number', models.CharField(max_length=20)),
('image_address', models.URLField(blank=True, null=True)),
('checkin_time', models.DateTimeField(auto_now_add=True)),
('is_service_checked', models.BooleanField(default=False)),
],
options={
'ordering': ['checkin_time'],
},
),
migrations.CreateModel(
name='Entry',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('date', models.DateTimeField()),
('zekken_number', models.IntegerField(default=0)),
('is_active', models.BooleanField(default=True)),
('hasParticipated', models.BooleanField(default=False)),
('hasGoaled', models.BooleanField(default=False)),
],
),
migrations.CreateModel(
name='EntryMember',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('is_temporary', models.BooleanField(default=False)),
],
),
migrations.CreateModel(
name='Event',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('tagname', models.CharField(blank=True, max_length=512, null=True, verbose_name='Parameters')),
('status', models.CharField(choices=[('PREPARING', 'Preparing'), ('PROMOTION', 'Promotion'), ('EVENT', 'Event'), ('END', 'End')], max_length=256)),
('price', models.IntegerField(default=0, verbose_name='Paid Amount')),
('promotion_date', models.DateTimeField(blank=True, null=True, verbose_name='Promotion date')),
('event_start', models.DateTimeField(blank=True, null=True, verbose_name='Promotion date')),
('event_end', models.DateTimeField(blank=True, null=True, verbose_name='Promotion date')),
('remark', models.CharField(blank=True, max_length=256, null=True)),
('parammeters', models.CharField(blank=True, max_length=512, null=True, verbose_name='Parameters')),
('created_at', models.DateTimeField(auto_now_add=True)),
('last_updated_at', models.DateTimeField(auto_now=True)),
],
),
migrations.CreateModel(
name='EventUser',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
],
),
migrations.CreateModel(
name='Favorite',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('good', models.IntegerField(default=0, verbose_name='Good')),
('favorite', models.IntegerField(default=0, verbose_name='Favorite')),
('evaluation', models.IntegerField(default=0, verbose_name='Evaluation')),
('number_visit', models.IntegerField(default=0, verbose_name='Good')),
('last_visited', models.DateTimeField(blank=True, null=True, verbose_name='Last Visited')),
('parammeters', models.CharField(blank=True, max_length=512, null=True, verbose_name='Parameters')),
('created_at', models.DateTimeField(auto_now_add=True)),
('last_updated_at', models.DateTimeField(auto_now=True)),
],
),
migrations.CreateModel(
name='GifurogeRegister',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('event_code', models.CharField(max_length=100)),
('time', models.IntegerField(choices=[(3, '3時間'), (5, '5時間')])),
('owner_name_kana', models.CharField(max_length=100)),
('owner_name', models.CharField(max_length=100)),
('email', models.EmailField(max_length=254)),
('password', models.CharField(max_length=100)),
('owner_birthday', models.DateField(blank=True, null=True)),
('owner_sex', models.CharField(blank=True, max_length=10, null=True)),
('team_name', models.CharField(max_length=100)),
('department', models.CharField(max_length=100)),
('members_count', models.IntegerField()),
('member2', models.CharField(blank=True, max_length=100, null=True)),
('birthday2', models.DateField(blank=True, null=True)),
('sex2', models.CharField(blank=True, max_length=10, null=True)),
('member3', models.CharField(blank=True, max_length=100, null=True)),
('birthday3', models.DateField(blank=True, null=True)),
('sex3', models.CharField(blank=True, max_length=10, null=True)),
('member4', models.CharField(blank=True, max_length=100, null=True)),
('birthday4', models.DateField(blank=True, null=True)),
('sex4', models.CharField(blank=True, max_length=10, null=True)),
('member5', models.CharField(blank=True, max_length=100, null=True)),
('birthday5', models.DateField(blank=True, null=True)),
('sex5', models.CharField(blank=True, max_length=10, null=True)),
],
),
migrations.CreateModel(
name='GoalImages',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('goalimage', models.FileField(blank=True, null=True, upload_to='goals/%y%m%d')),
('goaltime', models.DateTimeField(blank=True, null=True, verbose_name='Goal time')),
('team_name', models.CharField(max_length=255, verbose_name='Team name')),
('event_code', models.CharField(max_length=255, verbose_name='event code')),
('cp_number', models.IntegerField(verbose_name='CP numner')),
('zekken_number', models.TextField(blank=True, help_text='ゼッケン番号', null=True)),
],
),
migrations.CreateModel(
name='GpsCheckin',
fields=[
('id', models.AutoField(primary_key=True, serialize=False)),
('path_order', models.IntegerField(help_text='チェックポイントの順序番号')),
('zekken_number', models.TextField(help_text='ゼッケン番号')),
('event_id', models.IntegerField(blank=True, help_text='イベントID', null=True)),
('event_code', models.TextField(help_text='イベントコード')),
('cp_number', models.IntegerField(blank=True, help_text='チェックポイント番号', null=True)),
('lattitude', models.FloatField(blank=True, help_text='緯度:写真から取得', null=True)),
('longitude', models.FloatField(blank=True, help_text='経度:写真から取得', null=True)),
('image_address', models.TextField(blank=True, help_text='チェックイン画像のパス', null=True)),
('image_receipt', models.TextField(blank=True, default=False, help_text='レシート画像のパス', null=True)),
('image_qr', models.BooleanField(default=False, help_text='QRコードスキャンフラグ')),
('validate_location', models.BooleanField(default=False, help_text='位置情報検証フラグ:画像認識で検証した結果')),
('goal_time', models.TextField(blank=True, help_text='ゴール時刻=ゴール時のみ使用される。画像から時刻を読み取り設定する。', null=True)),
('late_point', models.IntegerField(blank=True, help_text='遅刻ポイント:ゴールの時刻が制限時間を超えた場合、1分につき-50点が加算。', null=True)),
('create_at', models.DateTimeField(blank=True, help_text='作成日時:データの作成日時', null=True)),
('create_user', models.TextField(blank=True, help_text='作成ユーザー', null=True)),
('update_at', models.DateTimeField(blank=True, help_text='更新日時', null=True)),
('update_user', models.TextField(blank=True, help_text='更新ユーザー', null=True)),
('buy_flag', models.BooleanField(default=False, help_text='購入フラグ協賛店で購入した場合、無条件でTRUEにする。')),
('colabo_company_memo', models.TextField(default='', help_text='グループコード:複数のイベントで合算する場合に使用する')),
('points', models.IntegerField(blank=True, help_text='ポイント:このチェックインによる獲得ポイント。通常ポイントと買い物ポイントは分離される。ゴールの場合には減点なども含む。', null=True)),
],
options={
'db_table': 'gps_checkins',
},
),
migrations.CreateModel(
name='Location',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('location_id', models.IntegerField(blank=True, db_index=True, null=True, verbose_name='Location id')),
('sub_loc_id', models.CharField(blank=True, max_length=2048, null=True, verbose_name='Sub location id')),
('cp', models.FloatField(default=0, null=True, verbose_name='Check Point')),
('location_name', models.CharField(default='--- 場所をお願いします --', max_length=2048, verbose_name='Location Name')),
('category', models.CharField(blank=True, db_index=True, max_length=2048, null=True, verbose_name='Category')),
('subcategory', models.CharField(blank=True, max_length=2048, null=True, verbose_name='Sub Category')),
('zip', models.CharField(blank=True, max_length=12, null=True, verbose_name='Zip code')),
('address', models.CharField(blank=True, max_length=2048, null=True, verbose_name='Address')),
('prefecture', models.CharField(blank=True, max_length=2048, null=True, verbose_name='Prefecture')),
('area', models.CharField(blank=True, max_length=2048, null=True, verbose_name='Area')),
('city', models.CharField(blank=True, max_length=2048, null=True, verbose_name='City')),
('latitude', models.FloatField(blank=True, null=True, verbose_name='Latitude')),
('longitude', models.FloatField(blank=True, null=True, verbose_name='Latitude')),
('photos', models.CharField(blank=True, max_length=2048, null=True, verbose_name='Photos')),
('videos', models.CharField(blank=True, max_length=2048, null=True, verbose_name='Videos')),
('webcontents', models.CharField(blank=True, max_length=2048, null=True, verbose_name='Web Content')),
('status', models.CharField(blank=True, max_length=2048, null=True, verbose_name='Status')),
('portal', models.CharField(blank=True, max_length=2048, null=True, verbose_name='Portal')),
('group', models.CharField(blank=True, db_index=True, max_length=2048, null=True, verbose_name='Group')),
('phone', models.CharField(blank=True, max_length=2048, null=True, verbose_name='Phone')),
('fax', models.CharField(blank=True, max_length=2048, null=True, verbose_name='Fax')),
('email', models.EmailField(blank=True, max_length=2048, null=True, verbose_name='Email')),
('facility', models.CharField(blank=True, max_length=2048, null=True, verbose_name='Facility')),
('remark', models.CharField(blank=True, max_length=2048, null=True, verbose_name='Remarks')),
('tags', models.CharField(blank=True, max_length=2048, null=True, verbose_name='Tags')),
('event_name', models.CharField(blank=True, db_index=True, max_length=2048, null=True, verbose_name='Event name')),
('event_active', models.BooleanField(db_index=True, default=True, verbose_name='Is Event active')),
('hidden_location', models.BooleanField(default=False, verbose_name='Is Hidden Location')),
('auto_checkin', models.BooleanField(default=False, verbose_name='Is AutoCheckin')),
('checkin_radius', models.FloatField(blank=True, default=15.0, null=True, verbose_name='Checkin radious')),
('checkin_point', models.FloatField(blank=True, default=10, null=True, verbose_name='Checkin Point')),
('buy_point', models.FloatField(blank=True, default=0, null=True, verbose_name='buy Point')),
('evaluation_value', models.CharField(blank=True, max_length=2048, null=True, verbose_name='Evaluation value (評価)')),
('shop_closed', models.BooleanField(default=False, verbose_name='Shop Closed (休業)')),
('shop_shutdown', models.BooleanField(default=False, verbose_name='Shop Shutdown (閉業)')),
('opening_hours_mon', models.CharField(blank=True, max_length=512, null=True, verbose_name='Opening hours monday (月曜)')),
('opening_hours_tue', models.CharField(blank=True, max_length=512, null=True, verbose_name='Opening hours tuesday (火曜)')),
('opening_hours_wed', models.CharField(blank=True, max_length=512, null=True, verbose_name='Opening hours wednesday (水曜)')),
('opening_hours_thu', models.CharField(blank=True, max_length=512, null=True, verbose_name='Opening hours thursday (木曜)')),
('opening_hours_fri', models.CharField(blank=True, max_length=512, null=True, verbose_name='Opening hours frinday (金曜)')),
('opening_hours_sat', models.CharField(blank=True, max_length=512, null=True, verbose_name='Opening hours saturday (土曜)')),
('opening_hours_sun', models.CharField(blank=True, max_length=512, null=True, verbose_name='Opening hours sunday (日曜)')),
('parammeters', models.CharField(blank=True, max_length=2048, null=True, verbose_name='Parameters')),
('created_at', models.DateTimeField(auto_now_add=True)),
('last_updated_at', models.DateTimeField(auto_now=True)),
('geom', django.contrib.gis.db.models.fields.MultiPointField(srid=4326)),
('last_updated_user', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='location_updated_user', to=settings.AUTH_USER_MODEL)),
],
),
migrations.CreateModel(
name='NewCategory',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('category_name', models.CharField(max_length=255, unique=True)),
('category_number', models.IntegerField(default=0)),
('duration', models.DurationField(default=datetime.timedelta(seconds=18000))),
('num_of_member', models.IntegerField(default=1)),
('family', models.BooleanField(default=False)),
('female', models.BooleanField(default=False)),
('trial', models.BooleanField(default=False)),
],
options={
'unique_together': {('category_name', 'category_number')},
},
),
migrations.CreateModel(
name='NewEvent',
fields=[
('event_name', models.CharField(max_length=255, primary_key=True, serialize=False)),
('start_datetime', models.DateTimeField(default=django.utils.timezone.now)),
('end_datetime', models.DateTimeField()),
],
),
migrations.CreateModel(
name='NewEvent2',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('event_name', models.CharField(max_length=255, unique=True)),
('event_description', models.TextField(blank=True, max_length=255, null=True)),
('start_datetime', models.DateTimeField(default=django.utils.timezone.now)),
('end_datetime', models.DateTimeField()),
('deadlineDateTime', models.DateTimeField(blank=True, null=True)),
('public', models.BooleanField(default=False)),
('hour_3', models.BooleanField(default=False)),
('hour_5', models.BooleanField(default=True)),
('class_general', models.BooleanField(default=True)),
('class_family', models.BooleanField(default=True)),
('class_solo_male', models.BooleanField(default=True)),
('class_solo_female', models.BooleanField(default=True)),
('self_rogaining', models.BooleanField(default=False)),
],
),
migrations.CreateModel(
name='ShapeFileLocations',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('shapefile', models.CharField(blank=True, max_length=2048, null=True, verbose_name='Shapelayer')),
('locid', models.IntegerField(blank=True, null=True)),
],
),
migrations.CreateModel(
name='ShapeLayers',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=255, verbose_name='Shape Layer')),
('file', models.FileField(blank=True, upload_to=rog.models.get_file_path)),
('uploaded_date', models.DateField(auto_now_add=True)),
('layerof', models.IntegerField(choices=[(1, 'templocation'), (2, 'Location_line'), (3, 'Location_polygon')], default=1)),
('table_name', models.CharField(blank=True, max_length=255, verbose_name='Table name')),
],
),
migrations.CreateModel(
name='TempUser',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('email', models.EmailField(max_length=254, unique=True)),
('password', models.CharField(max_length=128)),
('is_rogaining', models.BooleanField(default=False)),
('zekken_number', models.CharField(blank=True, max_length=255, null=True)),
('event_code', models.CharField(blank=True, max_length=255, null=True)),
('team_name', models.CharField(blank=True, max_length=255, null=True)),
('group', models.CharField(max_length=255)),
('firstname', models.CharField(blank=True, max_length=255, null=True)),
('lastname', models.CharField(blank=True, max_length=255, 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()),
],
),
migrations.CreateModel(
name='TestModel',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('testbane', models.CharField(max_length=355, verbose_name='test field')),
('wanttogo', models.BooleanField(default=False)),
('like', models.BooleanField(default=False)),
('checkin', models.BooleanField(default=False)),
('created_at', models.DateTimeField(auto_now_add=True)),
('last_updated_at', models.DateTimeField(auto_now=True)),
],
),
migrations.CreateModel(
name='TravelList',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('travel_id', models.IntegerField(verbose_name='Travel Id')),
('start_date', models.DateTimeField(blank=True, null=True, verbose_name='Start date')),
('finish_date', models.DateTimeField(blank=True, null=True, verbose_name='End date')),
('category', models.CharField(choices=[('PRIVATE', 'Private'), ('GROUP', 'Group'), ('AGENT', 'Agent'), ('ROGAINING', 'Rogaining')], max_length=256)),
('title', models.CharField(max_length=255, verbose_name='Title')),
('transportation', models.CharField(blank=True, max_length=255, null=True, verbose_name='Transpotation')),
('moving_distance', models.IntegerField(blank=True, null=True)),
('duration', models.DurationField(blank=True, null=True, verbose_name='Duration')),
('eta', models.DateTimeField(blank=True, null=True)),
('parammeters', models.CharField(blank=True, max_length=512, null=True, verbose_name='Parameters')),
('created_at', models.DateTimeField(auto_now_add=True)),
('last_updated_at', models.DateTimeField(auto_now=True)),
('last_updated_user', models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, related_name='travel_list_updated_user', to=settings.AUTH_USER_MODEL)),
('user', models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, to=settings.AUTH_USER_MODEL)),
],
),
migrations.CreateModel(
name='UserUpload',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=255, verbose_name='User uploads')),
('file', models.FileField(blank=True, upload_to=rog.models.get_file_path)),
('uploaded_date', models.DateField(auto_now_add=True)),
],
),
migrations.CreateModel(
name='UserUploadUser',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('userfile', models.CharField(blank=True, max_length=2048, null=True, verbose_name='User file')),
('email', models.CharField(max_length=255, verbose_name='User Email')),
],
),
migrations.CreateModel(
name='Waypoint',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('latitude', models.FloatField()),
('longitude', models.FloatField()),
('altitude', models.FloatField(blank=True, null=True)),
('accuracy', models.FloatField(blank=True, null=True)),
('speed', models.FloatField(blank=True, null=True)),
('recorded_at', models.DateTimeField()),
('created_at', models.DateTimeField(auto_now_add=True)),
('entry', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='waypoints', to='rog.entry')),
],
options={
'ordering': ['recorded_at'],
},
),
migrations.CreateModel(
name='UserTracks',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('geom', django.contrib.gis.db.models.fields.MultiPointField(srid=4326)),
('created_at', models.DateTimeField(auto_now_add=True)),
('user', models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, to=settings.AUTH_USER_MODEL)),
],
),
migrations.CreateModel(
name='Useractions',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('wanttogo', models.BooleanField(default=False)),
('like', models.BooleanField(default=False)),
('checkin', models.BooleanField(default=False)),
('checkinimage', models.FileField(blank=True, null=True, upload_to='%y%m%d')),
('order', models.IntegerField(default=0)),
('created_at', models.DateTimeField(auto_now_add=True)),
('last_updated_at', models.DateTimeField(auto_now=True)),
('location', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='action_location', to='rog.location')),
('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='action_user', to=settings.AUTH_USER_MODEL)),
],
),
migrations.CreateModel(
name='TravelPoint',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('distance', models.FloatField(blank=True, null=True)),
('transportation', models.CharField(blank=True, max_length=255, null=True, verbose_name='Transpotation')),
('eta', models.DateTimeField(blank=True, null=True)),
('order_number', models.IntegerField(blank=True, null=True)),
('parammeters', models.CharField(blank=True, max_length=512, null=True, verbose_name='Parameters')),
('created_at', models.DateTimeField(auto_now_add=True)),
('last_updated_at', models.DateTimeField(auto_now=True)),
('last_updated_user', models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, related_name='travelpoint_updated_user', to=settings.AUTH_USER_MODEL)),
('location', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='rog.location')),
('travel_list', models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, to='rog.travellist')),
],
),
migrations.CreateModel(
name='templocation',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('location_id', models.IntegerField(blank=True, null=True, verbose_name='Location id')),
('sub_loc_id', models.CharField(blank=True, max_length=2048, null=True, verbose_name='Sub location id')),
('cp', models.FloatField(default=0, null=True, verbose_name='Check Point')),
('location_name', models.CharField(default='--- 場所をお願いします --', max_length=2048, verbose_name='Location Name')),
('category', models.CharField(blank=True, max_length=2048, null=True, verbose_name='Category')),
('subcategory', models.CharField(blank=True, max_length=2048, null=True, verbose_name='Sub Category')),
('zip', models.CharField(blank=True, max_length=12, null=True, verbose_name='Zip code')),
('address', models.CharField(blank=True, max_length=2048, null=True, verbose_name='Address')),
('prefecture', models.CharField(blank=True, max_length=2048, null=True, verbose_name='Prefecture')),
('area', models.CharField(blank=True, max_length=2048, null=True, verbose_name='Area')),
('city', models.CharField(blank=True, max_length=2048, null=True, verbose_name='City')),
('latitude', models.FloatField(blank=True, null=True, verbose_name='Latitude')),
('longitude', models.FloatField(blank=True, null=True, verbose_name='Latitude')),
('photos', models.CharField(blank=True, max_length=2048, null=True, verbose_name='Photos')),
('videos', models.CharField(blank=True, max_length=2048, null=True, verbose_name='Videos')),
('webcontents', models.CharField(blank=True, max_length=2048, null=True, verbose_name='Web Content')),
('status', models.CharField(blank=True, max_length=2048, null=True, verbose_name='Status')),
('portal', models.CharField(blank=True, max_length=2048, null=True, verbose_name='Portal')),
('group', models.CharField(blank=True, max_length=2048, null=True, verbose_name='Group')),
('phone', models.CharField(blank=True, max_length=2048, null=True, verbose_name='Phone')),
('fax', models.CharField(blank=True, max_length=2048, null=True, verbose_name='Fax')),
('email', models.EmailField(blank=True, max_length=2048, null=True, verbose_name='Email')),
('facility', models.CharField(blank=True, max_length=2048, null=True, verbose_name='Facility')),
('remark', models.CharField(blank=True, max_length=2048, null=True, verbose_name='Remarks')),
('tags', models.CharField(blank=True, max_length=2048, null=True, verbose_name='Tags')),
('event_name', models.CharField(blank=True, max_length=2048, null=True, verbose_name='Event name')),
('event_active', models.BooleanField(default=True, verbose_name='Is Event active')),
('hidden_location', models.BooleanField(default=False, verbose_name='Is Hidden Location')),
('auto_checkin', models.BooleanField(default=False, verbose_name='Is AutoCheckin')),
('checkin_radius', models.FloatField(blank=True, default=15.0, null=True, verbose_name='Checkin radious')),
('checkin_point', models.FloatField(blank=True, default=10, null=True, verbose_name='Checkin Point')),
('buy_point', models.FloatField(blank=True, default=0, null=True, verbose_name='buy Point')),
('evaluation_value', models.CharField(blank=True, max_length=2048, null=True, verbose_name='Evaluation value (評価)')),
('shop_closed', models.BooleanField(default=False, verbose_name='Shop Closed (休業)')),
('shop_shutdown', models.BooleanField(default=False, verbose_name='Shop Shutdown (閉業)')),
('opening_hours_mon', models.CharField(blank=True, max_length=512, null=True, verbose_name='Opening hours monday (月曜)')),
('opening_hours_tue', models.CharField(blank=True, max_length=512, null=True, verbose_name='Opening hours tuesday (火曜)')),
('opening_hours_wed', models.CharField(blank=True, max_length=512, null=True, verbose_name='Opening hours wednesday (水曜)')),
('opening_hours_thu', models.CharField(blank=True, max_length=512, null=True, verbose_name='Opening hours thursday (木曜)')),
('opening_hours_fri', models.CharField(blank=True, max_length=512, null=True, verbose_name='Opening hours frinday (金曜)')),
('opening_hours_sat', models.CharField(blank=True, max_length=512, null=True, verbose_name='Opening hours saturday (土曜)')),
('opening_hours_sun', models.CharField(blank=True, max_length=512, null=True, verbose_name='Opening hours sunday (日曜)')),
('parammeters', models.CharField(blank=True, max_length=2048, null=True, verbose_name='Parameters')),
('created_at', models.DateTimeField(auto_now_add=True)),
('last_updated_at', models.DateTimeField(auto_now=True)),
('geom', django.contrib.gis.db.models.fields.MultiPointField(srid=4326)),
('last_updated_user', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='temp_location_updated_user', to=settings.AUTH_USER_MODEL)),
],
),
migrations.CreateModel(
name='TeamStart',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('start_time', models.DateTimeField(auto_now_add=True)),
('entry', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='start_info', to='rog.entry')),
],
),
migrations.CreateModel(
name='TeamGoal',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('goal_time', models.DateTimeField()),
('image_url', models.URLField(blank=True, null=True)),
('score', models.IntegerField(default=0)),
('scoreboard_url', models.URLField(blank=True, null=True)),
('entry', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='goal_info', to='rog.entry')),
],
),
migrations.CreateModel(
name='Team',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('team_name', models.CharField(max_length=255)),
('category', models.ForeignKey(default=rog.models.get_default_category, on_delete=django.db.models.deletion.SET_DEFAULT, to='rog.newcategory')),
('owner', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='owned_teams', to=settings.AUTH_USER_MODEL)),
],
),
migrations.CreateModel(
name='SystemSettings',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('setting_name', models.CharField(max_length=255, verbose_name='Settings Name')),
('version', models.CharField(blank=True, max_length=10, null=True, verbose_name='Version')),
('effective_date', models.DateTimeField()),
('end_date', models.DateTimeField()),
('parammeters', models.CharField(max_length=512, verbose_name='Parameters')),
('created_at', models.DateTimeField(auto_now_add=True)),
('last_updated_at', models.DateTimeField(auto_now=True)),
('last_updated_user', models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, related_name='system_setting_updated_user', to=settings.AUTH_USER_MODEL)),
],
),
migrations.CreateModel(
name='RogUser',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('phone', models.CharField(max_length=55, verbose_name='Phone Number')),
('first_name', models.CharField(max_length=255, verbose_name='First Name')),
('middle_name', models.CharField(blank=True, max_length=255, null=True, verbose_name='Middle Name')),
('last_name', models.CharField(max_length=255, verbose_name='last_name')),
('nickname', models.CharField(blank=True, max_length=255, null=True, verbose_name='Nickname')),
('country', models.CharField(default='Japan', max_length=255, verbose_name='Country')),
('language', models.CharField(default='Japanese', max_length=255, verbose_name='Language')),
('prefecture', models.CharField(blank=True, max_length=255, null=True, verbose_name='Prefecture')),
('sex', models.CharField(blank=True, default='unknown', max_length=255, null=True, verbose_name='Sex')),
('birthyear', models.IntegerField(blank=True, null=True, verbose_name='Birth year')),
('family_structure', models.IntegerField(blank=True, null=True, verbose_name='Family Structure')),
('level', models.IntegerField(blank=True, default=0, null=True, verbose_name='Level')),
('paid', models.BooleanField(default=False, verbose_name='Is Paid')),
('parammeters', models.CharField(blank=True, max_length=512, null=True, verbose_name='Parameters')),
('created_at', models.DateTimeField(auto_now_add=True)),
('last_updated_at', models.DateTimeField(auto_now=True)),
('introducer', models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, related_name='introduced_uesr', to=settings.AUTH_USER_MODEL)),
('last_updated_user', models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, related_name='roguser_updated_user', to=settings.AUTH_USER_MODEL)),
('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
],
),
migrations.CreateModel(
name='Member',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('firstname', models.CharField(blank=True, max_length=255, null=True)),
('lastname', models.CharField(blank=True, max_length=255, null=True)),
('date_of_birth', models.DateField(blank=True, null=True)),
('female', models.BooleanField(default=False)),
('is_temporary', models.BooleanField(default=False)),
('team', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='members', to='rog.team')),
('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
],
),
migrations.CreateModel(
name='Location_polygon',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('location_id', models.IntegerField(blank=True, null=True, verbose_name='Location id')),
('location_name', models.CharField(max_length=255, verbose_name='Location Name')),
('category', models.CharField(blank=True, max_length=255, null=True, verbose_name='Category')),
('zip', models.CharField(blank=True, max_length=12, null=True, verbose_name='Zip code')),
('address', models.CharField(blank=True, max_length=512, null=True, verbose_name='Address')),
('prefecture', models.CharField(blank=True, max_length=255, null=True, verbose_name='Prefecture')),
('area', models.CharField(blank=True, max_length=255, null=True, verbose_name='Area')),
('city', models.CharField(blank=True, max_length=255, null=True, verbose_name='City')),
('photos', models.CharField(blank=True, max_length=255, null=True, verbose_name='Phptos')),
('videos', models.CharField(blank=True, max_length=255, null=True, verbose_name='Videos')),
('webcontents', models.CharField(blank=True, max_length=255, null=True, verbose_name='Web Content')),
('status', models.CharField(blank=True, max_length=255, null=True, verbose_name='Status')),
('portal', models.CharField(blank=True, max_length=255, null=True, verbose_name='Portal')),
('group', models.CharField(blank=True, max_length=255, null=True, verbose_name='Group')),
('phone', models.CharField(blank=True, max_length=255, null=True, verbose_name='Phone')),
('fax', models.CharField(blank=True, max_length=255, null=True, verbose_name='Fax')),
('email', models.EmailField(blank=True, max_length=255, null=True, verbose_name='Email')),
('facility', models.CharField(blank=True, max_length=255, null=True, verbose_name='Facility')),
('remark', models.CharField(blank=True, max_length=255, null=True, verbose_name='Remarks')),
('tags', models.CharField(blank=True, max_length=512, null=True, verbose_name='Tags')),
('parammeters', models.CharField(blank=True, max_length=512, null=True, verbose_name='Parameters')),
('created_at', models.DateTimeField(auto_now_add=True)),
('last_updated_at', models.DateTimeField(auto_now=True)),
('geom', django.contrib.gis.db.models.fields.MultiPolygonField(blank=True, null=True, srid=4326)),
('last_updated_user', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='location_polygon_updated_user', to=settings.AUTH_USER_MODEL)),
],
),
migrations.CreateModel(
name='Location_line',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('location_id', models.IntegerField(blank=True, null=True, verbose_name='Location id')),
('location_name', models.CharField(max_length=255, verbose_name='Location Name')),
('category', models.CharField(blank=True, max_length=255, null=True, verbose_name='Category')),
('zip', models.CharField(blank=True, max_length=12, null=True, verbose_name='Zip code')),
('address', models.CharField(blank=True, max_length=512, null=True, verbose_name='Address')),
('prefecture', models.CharField(blank=True, max_length=255, null=True, verbose_name='Prefecture')),
('area', models.CharField(blank=True, max_length=255, null=True, verbose_name='Area')),
('city', models.CharField(blank=True, max_length=255, null=True, verbose_name='City')),
('photos', models.CharField(blank=True, max_length=255, null=True, verbose_name='Phptos')),
('videos', models.CharField(blank=True, max_length=255, null=True, verbose_name='Videos')),
('webcontents', models.CharField(blank=True, max_length=255, null=True, verbose_name='Web Content')),
('status', models.CharField(blank=True, max_length=255, null=True, verbose_name='Status')),
('portal', models.CharField(blank=True, max_length=255, null=True, verbose_name='Portal')),
('group', models.CharField(blank=True, max_length=255, null=True, verbose_name='Group')),
('phone', models.CharField(blank=True, max_length=255, null=True, verbose_name='Phone')),
('fax', models.CharField(blank=True, max_length=255, null=True, verbose_name='Fax')),
('email', models.EmailField(blank=True, max_length=255, null=True, verbose_name='Email')),
('facility', models.CharField(blank=True, max_length=255, null=True, verbose_name='Facility')),
('remark', models.CharField(blank=True, max_length=255, null=True, verbose_name='Remarks')),
('tags', models.CharField(blank=True, max_length=512, null=True, verbose_name='Tags')),
('parammeters', models.CharField(blank=True, max_length=512, null=True, verbose_name='Parameters')),
('created_at', models.DateTimeField(auto_now_add=True)),
('last_updated_at', models.DateTimeField(auto_now=True)),
('geom', django.contrib.gis.db.models.fields.MultiLineStringField(blank=True, null=True, srid=4326)),
('last_updated_user', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='location_line_updated_user', to=settings.AUTH_USER_MODEL)),
],
),
migrations.CreateModel(
name='JoinedEvent',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('tagname', models.CharField(blank=True, max_length=255, null=True, verbose_name='Tag Name')),
('status', models.CharField(choices=[('REGISTERED', 'Registered'), ('ACCEPTED', 'accepted'), ('PAID', 'paid'), ('JOINED', 'joined'), ('CANCELED', 'Canceled')], max_length=256)),
('registrationid', models.CharField(max_length=56, verbose_name='Registration Id')),
('payment_code', models.CharField(max_length=255, verbose_name='Payment Code')),
('paid', models.IntegerField(default=0, verbose_name='Paid Amount')),
('remark', models.CharField(blank=True, max_length=255, null=True, verbose_name='Remark')),
('parammeters', models.CharField(max_length=512, verbose_name='Parameters')),
('created_at', models.DateTimeField(auto_now_add=True)),
('last_updated_at', models.DateTimeField(auto_now=True)),
('last_updated_user', models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, related_name='joined_event_updated_user', to=settings.AUTH_USER_MODEL)),
('user', models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, to=settings.AUTH_USER_MODEL)),
],
),
migrations.AddIndex(
model_name='gpscheckin',
index=models.Index(fields=['zekken_number', 'event_code', 'path_order'], name='idx_zekken_event'),
),
migrations.AddIndex(
model_name='gpscheckin',
index=models.Index(fields=['create_at'], name='idx_create_at'),
),
migrations.AddField(
model_name='goalimages',
name='user',
field=models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, to=settings.AUTH_USER_MODEL),
),
migrations.AddField(
model_name='favorite',
name='last_updated_user',
field=models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, related_name='favorite_updated_user', to=settings.AUTH_USER_MODEL),
),
migrations.AddField(
model_name='favorite',
name='location',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='rog.location'),
),
migrations.AddField(
model_name='favorite',
name='user',
field=models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, to=settings.AUTH_USER_MODEL),
),
migrations.AddField(
model_name='eventuser',
name='event',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='event', to='rog.event'),
),
migrations.AddField(
model_name='eventuser',
name='user',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='user', to=settings.AUTH_USER_MODEL),
),
migrations.AddField(
model_name='event',
name='last_updated_user',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='event_updated_user', to=settings.AUTH_USER_MODEL),
),
migrations.AddField(
model_name='event',
name='user',
field=models.ManyToManyField(related_name='even', through='rog.EventUser', to=settings.AUTH_USER_MODEL),
),
migrations.AddField(
model_name='entrymember',
name='entry',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='rog.entry'),
),
migrations.AddField(
model_name='entrymember',
name='member',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='rog.member'),
),
migrations.AddField(
model_name='entry',
name='category',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='rog.newcategory'),
),
migrations.AddField(
model_name='entry',
name='event',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='rog.newevent2'),
),
migrations.AddField(
model_name='entry',
name='owner',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL),
),
migrations.AddField(
model_name='entry',
name='team',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='rog.team'),
),
migrations.AddField(
model_name='checkpoint',
name='entry',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='checkpoints', to='rog.entry'),
),
migrations.AddField(
model_name='checkinimages',
name='user',
field=models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, to=settings.AUTH_USER_MODEL),
),
migrations.AlterUniqueTogether(
name='category',
unique_together={('category_name', 'category_number')},
),
migrations.AddField(
model_name='customuser',
name='groups',
field=models.ManyToManyField(blank=True, help_text='The groups this user belongs to. A user will get all permissions granted to each of their groups.', related_name='user_set', related_query_name='user', to='auth.Group', verbose_name='groups'),
),
migrations.AddField(
model_name='customuser',
name='user_permissions',
field=models.ManyToManyField(blank=True, help_text='Specific permissions for this user.', related_name='user_set', related_query_name='user', to='auth.Permission', verbose_name='user permissions'),
),
migrations.AddIndex(
model_name='waypoint',
index=models.Index(fields=['entry', 'recorded_at'], name='rog_waypoin_entry_i_fb2cb5_idx'),
),
migrations.AlterUniqueTogether(
name='member',
unique_together={('team', 'user')},
),
migrations.AddIndex(
model_name='location',
index=django.contrib.postgres.indexes.GistIndex(fields=['geom'], name='rog_locatio_geom_4793cc_gist'),
),
migrations.AlterUniqueTogether(
name='entrymember',
unique_together={('entry', 'member')},
),
migrations.AlterUniqueTogether(
name='entry',
unique_together={('zekken_number', 'event', 'date')},
),
migrations.AlterUniqueTogether(
name='checkpoint',
unique_together={('entry', 'cp_number')},
),
]

View File

@ -0,0 +1,179 @@
# Generated by manual creation for database integration on 2025-08-20
import django.contrib.gis.db.models.fields
import django.contrib.postgres.indexes
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('rog', '0001_initial'),
]
operations = [
# Create Checkpoint model first (required by other operations)
migrations.CreateModel(
name='Checkpoint',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('cp_number', models.IntegerField()),
('cp_name', models.CharField(blank=True, max_length=200, null=True)),
('location', django.contrib.gis.db.models.fields.PointField(blank=True, null=True, srid=4326)),
('photo_point', models.IntegerField(default=0)),
('buy_point', models.IntegerField(default=0)),
('sample_photo', models.CharField(blank=True, max_length=500, null=True)),
('colabo_company_memo', models.TextField(blank=True, null=True)),
('created_at', models.DateTimeField(auto_now_add=True, blank=True, null=True)),
('updated_at', models.DateTimeField(auto_now=True, blank=True, null=True)),
('event', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='rog.newevent2')),
],
),
# Create GpsLog model for MobServer integration
migrations.CreateModel(
name='GpsLog',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('serial_number', models.IntegerField()),
('zekken_number', models.TextField()),
('event_code', models.TextField()),
('cp_number', models.TextField(blank=True, null=True)),
('image_address', models.TextField(blank=True, null=True)),
('checkin_time', models.DateTimeField(auto_now_add=True)),
('goal_time', models.TextField(blank=True, null=True)),
('late_point', models.IntegerField(blank=True, null=True)),
('create_at', models.DateTimeField(blank=True, null=True)),
('create_user', models.TextField(blank=True, null=True)),
('update_at', models.DateTimeField(blank=True, null=True)),
('update_user', models.TextField(blank=True, null=True)),
('buy_flag', models.BooleanField(blank=True, null=True)),
('minus_photo_flag', models.BooleanField(blank=True, null=True)),
('colabo_company_memo', models.TextField(default='')),
('is_service_checked', models.BooleanField(default=False)),
('score', models.IntegerField(blank=True, default=0, null=True)),
('scoreboard_url', models.URLField(blank=True, null=True)),
],
options={
'db_table': 'gps_information',
},
),
# Add fields to GpsCheckin model
migrations.AddField(
model_name='gpscheckin',
name='checkpoint',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='rog.checkpoint'),
),
migrations.AddField(
model_name='gpscheckin',
name='minus_photo_flag',
field=models.BooleanField(blank=True, null=True),
),
migrations.AddField(
model_name='gpscheckin',
name='serial_number',
field=models.IntegerField(blank=True, null=True),
),
migrations.AddField(
model_name='gpscheckin',
name='team',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='rog.team'),
),
# Add fields to NewEvent2 model
migrations.AddField(
model_name='newevent2',
name='event_code',
field=models.CharField(blank=True, max_length=50, null=True),
),
migrations.AddField(
model_name='newevent2',
name='event_day',
field=models.CharField(blank=True, max_length=100, null=True),
),
migrations.AddField(
model_name='newevent2',
name='start_time',
field=models.TimeField(blank=True, null=True),
),
migrations.AddField(
model_name='newevent2',
name='venue_address',
field=models.CharField(blank=True, max_length=500, null=True),
),
migrations.AddField(
model_name='newevent2',
name='venue_location',
field=django.contrib.gis.db.models.fields.PointField(blank=True, null=True, srid=4326),
),
# Add fields to Team model
migrations.AddField(
model_name='team',
name='class_name',
field=models.CharField(blank=True, max_length=100, null=True),
),
migrations.AddField(
model_name='team',
name='event',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='rog.newevent2'),
),
migrations.AddField(
model_name='team',
name='location',
field=django.contrib.gis.db.models.fields.PointField(blank=True, null=True, srid=4326),
),
migrations.AddField(
model_name='team',
name='password',
field=models.CharField(blank=True, max_length=100, null=True),
),
migrations.AddField(
model_name='team',
name='trial',
field=models.BooleanField(blank=True, null=True),
),
migrations.AddField(
model_name='team',
name='zekken_number',
field=models.CharField(blank=True, max_length=50, null=True),
),
# Add constraints for Checkpoint model
migrations.AddConstraint(
model_name='checkpoint',
constraint=models.UniqueConstraint(fields=['cp_number', 'event'], name='unique_cp_per_event'),
),
# Create indexes (use appropriate operator classes)
migrations.AddIndex(
model_name='checkpoint',
index=models.Index(fields=['event', 'cp_number'], name='idx_checkpoint_event_cp'),
),
migrations.AddIndex(
model_name='gpslog',
index=models.Index(fields=['serial_number'], name='gps_informa_serial__77a095_idx'),
),
migrations.AddIndex(
model_name='gpslog',
index=models.Index(fields=['zekken_number'], name='gps_informa_zekken__01b27e_idx'),
),
migrations.AddIndex(
model_name='gpslog',
index=models.Index(fields=['event_code'], name='gps_informa_event_c_2ab906_idx'),
),
migrations.AddIndex(
model_name='gpslog',
index=models.Index(fields=['cp_number'], name='gps_informa_cp_numb_97c5c5_idx'),
),
migrations.AddIndex(
model_name='newevent2',
index=models.Index(fields=['event_code'], name='rog_neweven_event_c_e79a96_idx'),
),
migrations.AddIndex(
model_name='team',
index=models.Index(fields=['zekken_number'], name='rog_team_zekken__2c50d1_idx'),
),
]

View File

@ -0,0 +1,18 @@
# Generated by Django 3.2.9 on 2025-08-20 16:12
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('rog', '0002_integration_update'),
]
operations = [
migrations.AlterField(
model_name='newevent2',
name='end_datetime',
field=models.DateTimeField(null=True, blank=True),
),
]

View File

@ -0,0 +1,26 @@
# Generated manually on 2025-08-21
# Add only required timestamp fields to Team model
from django.db import migrations, models
import django.utils.timezone
class Migration(migrations.Migration):
dependencies = [
('rog', '0003_auto_20250821_0112'),
]
operations = [
migrations.AddField(
model_name='team',
name='created_at',
field=models.DateTimeField(auto_now_add=True, default=django.utils.timezone.now),
preserve_default=False,
),
migrations.AddField(
model_name='team',
name='updated_at',
field=models.DateTimeField(auto_now=True),
),
]

View File

@ -0,0 +1,74 @@
# Generated manually on 2025-08-21 08:25
import django.contrib.gis.db.models.fields
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('rog', '0004_add_team_timestamps'),
]
operations = [
# Create GpsCheckin model
migrations.CreateModel(
name='GpsCheckin',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('event_code', models.CharField(max_length=50)),
('zekken', models.CharField(max_length=20)),
('serial_number', models.CharField(max_length=50)),
('cp_number', models.CharField(blank=True, max_length=20, null=True)),
('lat', models.FloatField(blank=True, null=True)),
('lng', models.FloatField(blank=True, null=True)),
('checkin_time', models.DateTimeField(blank=True, null=True)),
('record_time', models.DateTimeField(blank=True, null=True)),
('location', django.contrib.gis.db.models.fields.PointField(blank=True, null=True, srid=4326)),
('mobserver_id', models.IntegerField(blank=True, null=True)),
('event', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='gps_checkins', to='rog.newevent2')),
('team', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='gps_checkins', to='rog.team')),
('checkpoint', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='gps_checkins', to='rog.checkpoint')),
],
options={
'db_table': 'rog_gpscheckin',
'indexes': [
models.Index(fields=['event_code'], name='rog_gpschec_event_c_9f1a75_idx'),
models.Index(fields=['zekken'], name='rog_gpschec_zekken_8e7f42_idx'),
models.Index(fields=['serial_number'], name='rog_gpschec_serial__1b5e3a_idx'),
models.Index(fields=['cp_number'], name='rog_gpschec_cp_numb_d7c8e5_idx'),
],
},
),
# Create GpsLog model
migrations.CreateModel(
name='GpsLog',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('event_code', models.CharField(max_length=50)),
('zekken', models.CharField(max_length=20)),
('serial_number', models.CharField(max_length=50)),
('cp_number', models.CharField(blank=True, max_length=20, null=True)),
('lat', models.FloatField(blank=True, null=True)),
('lng', models.FloatField(blank=True, null=True)),
('checkin_time', models.DateTimeField(blank=True, null=True)),
('record_time', models.DateTimeField(blank=True, null=True)),
('location', django.contrib.gis.db.models.fields.PointField(blank=True, null=True, srid=4326)),
('mobserver_id', models.IntegerField(blank=True, null=True)),
('event', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='gps_logs', to='rog.newevent2')),
('team', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='gps_logs', to='rog.team')),
('checkpoint', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='gps_logs', to='rog.checkpoint')),
],
options={
'db_table': 'rog_gpslog',
'indexes': [
models.Index(fields=['event_code'], name='rog_gpslog_event_c_8a2b94_idx'),
models.Index(fields=['zekken'], name='rog_gpslog_zekken_7c5f39_idx'),
models.Index(fields=['serial_number'], name='rog_gpslog_serial__6d4e28_idx'),
models.Index(fields=['cp_number'], name='rog_gpslog_cp_numb_5b3a17_idx'),
],
},
),
]

View File

@ -0,0 +1,532 @@
# Generated by Django 3.2.9 on 2025-08-24 00:29
from django.conf import settings
import django.contrib.gis.db.models.fields
import django.contrib.postgres.indexes
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('rog', '0005_create_gps_tables'),
]
operations = [
migrations.CreateModel(
name='Location2025',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('cp_number', models.IntegerField(db_index=True, verbose_name='CP番号')),
('cp_name', models.CharField(max_length=255, verbose_name='CP名')),
('latitude', models.FloatField(blank=True, null=True, verbose_name='緯度')),
('longitude', models.FloatField(blank=True, null=True, verbose_name='経度')),
('location', django.contrib.gis.db.models.fields.PointField(blank=True, null=True, srid=4326, verbose_name='位置')),
('cp_point', models.IntegerField(default=10, verbose_name='チェックポイント得点')),
('photo_point', models.IntegerField(default=0, verbose_name='写真ポイント')),
('buy_point', models.IntegerField(default=0, verbose_name='買い物ポイント')),
('checkin_radius', models.FloatField(default=15.0, verbose_name='チェックイン範囲(m)')),
('auto_checkin', models.BooleanField(default=False, verbose_name='自動チェックイン')),
('shop_closed', models.BooleanField(default=False, verbose_name='休業中')),
('shop_shutdown', models.BooleanField(default=False, verbose_name='閉業')),
('opening_hours', models.TextField(blank=True, null=True, verbose_name='営業時間')),
('address', models.CharField(blank=True, max_length=512, null=True, verbose_name='住所')),
('phone', models.CharField(blank=True, max_length=32, null=True, verbose_name='電話番号')),
('website', models.URLField(blank=True, null=True, verbose_name='ウェブサイト')),
('description', models.TextField(blank=True, null=True, verbose_name='説明')),
('is_active', models.BooleanField(db_index=True, default=True, verbose_name='有効')),
('sort_order', models.IntegerField(default=0, verbose_name='表示順')),
('csv_source_file', models.CharField(blank=True, max_length=255, null=True, verbose_name='CSVファイル名')),
('csv_upload_date', models.DateTimeField(blank=True, null=True, verbose_name='CSVアップロード日時')),
('created_at', models.DateTimeField(auto_now_add=True, verbose_name='作成日時')),
('updated_at', models.DateTimeField(auto_now=True, verbose_name='更新日時')),
],
options={
'verbose_name': 'チェックポイント2025',
'verbose_name_plural': 'チェックポイント2025',
'db_table': 'rog_location2025',
'ordering': ['event', 'sort_order', 'cp_number'],
},
),
migrations.RemoveIndex(
model_name='gpscheckin',
name='rog_gpschec_event_c_9f1a75_idx',
),
migrations.RemoveIndex(
model_name='gpscheckin',
name='rog_gpschec_zekken_8e7f42_idx',
),
migrations.RemoveIndex(
model_name='gpscheckin',
name='rog_gpschec_serial__1b5e3a_idx',
),
migrations.RemoveIndex(
model_name='gpscheckin',
name='rog_gpschec_cp_numb_d7c8e5_idx',
),
migrations.RemoveIndex(
model_name='gpslog',
name='rog_gpslog_event_c_8a2b94_idx',
),
migrations.RemoveIndex(
model_name='gpslog',
name='rog_gpslog_zekken_7c5f39_idx',
),
migrations.RemoveIndex(
model_name='gpslog',
name='rog_gpslog_serial__6d4e28_idx',
),
migrations.RemoveIndex(
model_name='gpslog',
name='rog_gpslog_cp_numb_5b3a17_idx',
),
migrations.RemoveIndex(
model_name='newevent2',
name='rog_neweven_event_c_e79a96_idx',
),
migrations.RemoveIndex(
model_name='team',
name='rog_team_zekken__2c50d1_idx',
),
migrations.RenameField(
model_name='gpslog',
old_name='record_time',
new_name='create_at',
),
migrations.RenameField(
model_name='gpslog',
old_name='mobserver_id',
new_name='late_point',
),
migrations.RemoveField(
model_name='gpscheckin',
name='checkin_time',
),
migrations.RemoveField(
model_name='gpscheckin',
name='event',
),
migrations.RemoveField(
model_name='gpscheckin',
name='lat',
),
migrations.RemoveField(
model_name='gpscheckin',
name='lng',
),
migrations.RemoveField(
model_name='gpscheckin',
name='location',
),
migrations.RemoveField(
model_name='gpscheckin',
name='mobserver_id',
),
migrations.RemoveField(
model_name='gpscheckin',
name='record_time',
),
migrations.RemoveField(
model_name='gpscheckin',
name='zekken',
),
migrations.AddField(
model_name='gpscheckin',
name='buy_flag',
field=models.BooleanField(default=False, help_text='購入フラグ協賛店で購入した場合、無条件でTRUEにする。'),
),
migrations.AddField(
model_name='gpscheckin',
name='colabo_company_memo',
field=models.TextField(default='', help_text='グループコード:複数のイベントで合算する場合に使用する'),
),
migrations.RunSQL(
sql="""
DO $$
BEGIN
IF NOT EXISTS (
SELECT 1 FROM information_schema.columns
WHERE table_name = 'rog_gpscheckin'
AND column_name = 'create_at'
) THEN
ALTER TABLE rog_gpscheckin ADD COLUMN create_at TIMESTAMP WITH TIME ZONE;
END IF;
END $$;
""",
reverse_sql="ALTER TABLE rog_gpscheckin DROP COLUMN IF EXISTS create_at CASCADE;"
),
migrations.RunSQL(
sql="""
DO $$
BEGIN
IF NOT EXISTS (
SELECT 1 FROM information_schema.columns
WHERE table_name = 'rog_gpscheckin'
AND column_name = 'create_user'
) THEN
ALTER TABLE rog_gpscheckin ADD COLUMN create_user TEXT;
END IF;
END $$;
""",
reverse_sql="ALTER TABLE rog_gpscheckin DROP COLUMN IF EXISTS create_user CASCADE;"
),
migrations.RunSQL(
sql="""
DO $$
BEGIN
IF NOT EXISTS (
SELECT 1 FROM information_schema.columns
WHERE table_name = 'rog_gpscheckin'
AND column_name = 'event_id'
) THEN
ALTER TABLE rog_gpscheckin ADD COLUMN event_id INTEGER;
END IF;
END $$;
""",
reverse_sql="ALTER TABLE rog_gpscheckin DROP COLUMN IF EXISTS event_id CASCADE;"
),
migrations.RunSQL(
sql="""
DO $$
BEGIN
IF NOT EXISTS (
SELECT 1 FROM information_schema.columns
WHERE table_name = 'rog_gpscheckin'
AND column_name = 'goal_time'
) THEN
ALTER TABLE rog_gpscheckin ADD COLUMN goal_time TEXT;
END IF;
END $$;
""",
reverse_sql="ALTER TABLE rog_gpscheckin DROP COLUMN IF EXISTS goal_time CASCADE;"
),
migrations.RunSQL(
sql="""
DO $$
BEGIN
IF NOT EXISTS (
SELECT 1 FROM information_schema.columns
WHERE table_name = 'rog_gpscheckin'
AND column_name = 'image_address'
) THEN
ALTER TABLE rog_gpscheckin ADD COLUMN image_address TEXT;
END IF;
END $$;
""",
reverse_sql="ALTER TABLE rog_gpscheckin DROP COLUMN IF EXISTS image_address CASCADE;"
),
migrations.AddField(
model_name='gpscheckin',
name='image_qr',
field=models.BooleanField(default=False, help_text='QRコードスキャンフラグ'),
),
migrations.AddField(
model_name='gpscheckin',
name='image_receipt',
field=models.TextField(blank=True, default=False, help_text='レシート画像のパス', null=True),
),
migrations.AddField(
model_name='gpscheckin',
name='late_point',
field=models.IntegerField(blank=True, help_text='遅刻ポイント:ゴールの時刻が制限時間を超えた場合、1分につき-50点が加算。', null=True),
),
migrations.AddField(
model_name='gpscheckin',
name='lattitude',
field=models.FloatField(blank=True, help_text='緯度:写真から取得', null=True),
),
migrations.AddField(
model_name='gpscheckin',
name='longitude',
field=models.FloatField(blank=True, help_text='経度:写真から取得', null=True),
),
migrations.AddField(
model_name='gpscheckin',
name='minus_photo_flag',
field=models.BooleanField(default=False, help_text='MobServer gps_information.minus_photo_flag'),
),
migrations.AddField(
model_name='gpscheckin',
name='path_order',
field=models.IntegerField(default=0, help_text='チェックポイントの順序番号'),
),
migrations.AddField(
model_name='gpscheckin',
name='points',
field=models.IntegerField(blank=True, help_text='ポイント:このチェックインによる獲得ポイント。通常ポイントと買い物ポイントは分離される。ゴールの場合には減点なども含む。', null=True),
),
migrations.AddField(
model_name='gpscheckin',
name='update_at',
field=models.DateTimeField(blank=True, help_text='更新日時', null=True),
),
migrations.AddField(
model_name='gpscheckin',
name='update_user',
field=models.TextField(blank=True, help_text='更新ユーザー', null=True),
),
migrations.AddField(
model_name='gpscheckin',
name='validate_location',
field=models.BooleanField(default=False, help_text='位置情報検証フラグ:画像認識で検証した結果'),
),
migrations.AddField(
model_name='gpscheckin',
name='zekken_number',
field=models.TextField(default='', help_text='ゼッケン番号'),
),
migrations.AddField(
model_name='gpslog',
name='buy_flag',
field=models.BooleanField(blank=True, null=True),
),
migrations.AddField(
model_name='gpslog',
name='colabo_company_memo',
field=models.TextField(default=''),
),
migrations.AddField(
model_name='gpslog',
name='create_user',
field=models.TextField(blank=True, null=True),
),
migrations.AddField(
model_name='gpslog',
name='goal_time',
field=models.TextField(blank=True, null=True),
),
migrations.AddField(
model_name='gpslog',
name='image_address',
field=models.TextField(blank=True, null=True),
),
migrations.AddField(
model_name='gpslog',
name='is_service_checked',
field=models.BooleanField(default=False),
),
migrations.AddField(
model_name='gpslog',
name='minus_photo_flag',
field=models.BooleanField(blank=True, null=True),
),
migrations.AddField(
model_name='gpslog',
name='score',
field=models.IntegerField(blank=True, default=0, null=True),
),
migrations.AddField(
model_name='gpslog',
name='scoreboard_url',
field=models.URLField(blank=True, null=True),
),
migrations.AddField(
model_name='gpslog',
name='update_at',
field=models.DateTimeField(blank=True, null=True),
),
migrations.AddField(
model_name='gpslog',
name='update_user',
field=models.TextField(blank=True, null=True),
),
migrations.AddField(
model_name='gpslog',
name='zekken_number',
field=models.TextField(default=''),
),
migrations.AlterField(
model_name='gpscheckin',
name='checkpoint',
field=models.ForeignKey(blank=True, help_text='統合チェックポイントリレーション', null=True, on_delete=django.db.models.deletion.CASCADE, to='rog.checkpoint'),
),
migrations.AlterField(
model_name='gpscheckin',
name='cp_number',
field=models.IntegerField(blank=True, help_text='チェックポイント番号', null=True),
),
migrations.AlterField(
model_name='gpscheckin',
name='event_code',
field=models.TextField(default='', help_text='イベントコード'),
),
migrations.AlterField(
model_name='gpscheckin',
name='id',
field=models.AutoField(primary_key=True, serialize=False),
),
migrations.AlterField(
model_name='gpscheckin',
name='serial_number',
field=models.IntegerField(blank=True, help_text='MobServer gps_information.serial_number', null=True),
),
migrations.AlterField(
model_name='gpscheckin',
name='team',
field=models.ForeignKey(blank=True, help_text='統合チームリレーション', null=True, on_delete=django.db.models.deletion.CASCADE, to='rog.team'),
),
migrations.AlterField(
model_name='gpslog',
name='checkin_time',
field=models.DateTimeField(auto_now_add=True),
),
migrations.AlterField(
model_name='gpslog',
name='cp_number',
field=models.TextField(blank=True, null=True),
),
migrations.AlterField(
model_name='gpslog',
name='event_code',
field=models.TextField(default=''),
),
migrations.AlterField(
model_name='gpslog',
name='id',
field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
),
migrations.AlterField(
model_name='gpslog',
name='serial_number',
field=models.IntegerField(),
),
migrations.AlterField(
model_name='newevent2',
name='event_code',
field=models.CharField(blank=True, max_length=50, null=True, unique=True),
),
migrations.AlterField(
model_name='newevent2',
name='event_day',
field=models.CharField(blank=True, max_length=20, null=True),
),
migrations.AlterField(
model_name='newevent2',
name='start_time',
field=models.CharField(blank=True, max_length=20, null=True),
),
migrations.AlterField(
model_name='team',
name='created_at',
field=models.DateTimeField(auto_now_add=True, null=True),
),
migrations.AlterField(
model_name='team',
name='trial',
field=models.BooleanField(default=False),
),
migrations.AlterField(
model_name='team',
name='updated_at',
field=models.DateTimeField(auto_now=True, null=True),
),
migrations.AlterField(
model_name='team',
name='zekken_number',
field=models.CharField(blank=True, max_length=20, null=True),
),
migrations.AlterUniqueTogether(
name='gpslog',
unique_together={('serial_number', 'zekken_number', 'event_code', 'colabo_company_memo')},
),
migrations.AddIndex(
model_name='checkpoint',
index=django.contrib.postgres.indexes.GistIndex(fields=['location'], name='idx_checkpoint_location'),
),
migrations.AddIndex(
model_name='gpscheckin',
index=models.Index(fields=['zekken_number', 'event_code', 'path_order'], name='idx_zekken_event'),
),
migrations.AddIndex(
model_name='gpscheckin',
index=models.Index(fields=['create_at'], name='idx_create_at'),
),
migrations.AddIndex(
model_name='gpslog',
index=models.Index(fields=['zekken_number', 'event_code'], name='gpslog_zekken_event_idx'),
),
migrations.AddIndex(
model_name='gpslog',
index=models.Index(fields=['create_at'], name='gpslog_create_at_idx'),
),
migrations.AddConstraint(
model_name='team',
constraint=models.UniqueConstraint(condition=models.Q(('event__isnull', False), ('zekken_number__isnull', False)), fields=('zekken_number', 'event'), name='unique_team_per_event'),
),
migrations.AlterModelTable(
name='gpscheckin',
table='gps_checkins',
),
migrations.AddField(
model_name='location2025',
name='created_by',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='location2025_created', to=settings.AUTH_USER_MODEL, verbose_name='作成者'),
),
migrations.AddField(
model_name='location2025',
name='csv_upload_user',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='location2025_csv_uploads', to=settings.AUTH_USER_MODEL, verbose_name='CSVアップロードユーザー'),
),
migrations.AddField(
model_name='location2025',
name='event',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='rog.newevent2', verbose_name='イベント'),
),
migrations.AddField(
model_name='location2025',
name='updated_by',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='location2025_updated', to=settings.AUTH_USER_MODEL, verbose_name='更新者'),
),
migrations.RemoveField(
model_name='gpslog',
name='checkpoint',
),
migrations.RemoveField(
model_name='gpslog',
name='event',
),
migrations.RemoveField(
model_name='gpslog',
name='lat',
),
migrations.RemoveField(
model_name='gpslog',
name='lng',
),
migrations.RemoveField(
model_name='gpslog',
name='location',
),
migrations.RemoveField(
model_name='gpslog',
name='team',
),
migrations.RemoveField(
model_name='gpslog',
name='zekken',
),
migrations.AddIndex(
model_name='location2025',
index=models.Index(fields=['event', 'cp_number'], name='location2025_event_cp_idx'),
),
migrations.AddIndex(
model_name='location2025',
index=models.Index(fields=['event', 'is_active'], name='location2025_event_active_idx'),
),
migrations.AddIndex(
model_name='location2025',
index=models.Index(fields=['csv_upload_date'], name='location2025_csv_date_idx'),
),
migrations.AddIndex(
model_name='location2025',
index=django.contrib.postgres.indexes.GistIndex(fields=['location'], name='location2025_location_gist_idx'),
),
migrations.AlterUniqueTogether(
name='location2025',
unique_together={('cp_number', 'event')},
),
]

View File

@ -0,0 +1,33 @@
# Generated by Django 3.2.9 on 2025-08-24 08:42
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('rog', '0006_create_location2025_only'),
]
operations = [
migrations.AddField(
model_name='gpscheckin',
name='validated_at',
field=models.DateTimeField(blank=True, help_text='審査日時', null=True),
),
migrations.AddField(
model_name='gpscheckin',
name='validated_by',
field=models.CharField(blank=True, help_text='審査者', max_length=255, null=True),
),
migrations.AddField(
model_name='gpscheckin',
name='validation_comment',
field=models.TextField(blank=True, help_text='審査コメント・理由', null=True),
),
migrations.AddField(
model_name='gpscheckin',
name='validation_status',
field=models.CharField(choices=[('PENDING', '審査待ち'), ('APPROVED', '承認'), ('REJECTED', '却下'), ('AUTO_APPROVED', '自動承認')], default='PENDING', help_text='通過審査ステータス', max_length=20),
),
]

View File

@ -0,0 +1,46 @@
# Generated by Django 3.2.9 on 2025-08-24 22:16
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('rog', '0007_add_validation_fields'),
]
operations = [
# 安全な条件付きテーブル操作
migrations.RunSQL(
"""
DO $$
BEGIN
-- TeamStartテーブルが存在する場合のみフィールドを削除
IF EXISTS (SELECT FROM pg_tables WHERE tablename = 'rog_teamstart') THEN
ALTER TABLE rog_teamstart DROP COLUMN IF EXISTS entry_id;
END IF;
-- TeamGoalテーブルが存在する場合のみ削除
IF EXISTS (SELECT FROM pg_tables WHERE tablename = 'rog_teamgoal') THEN
DROP TABLE rog_teamgoal;
END IF;
-- TeamStartテーブルが存在する場合のみ削除
IF EXISTS (SELECT FROM pg_tables WHERE tablename = 'rog_teamstart') THEN
DROP TABLE rog_teamstart;
END IF;
-- zekken_labelカラムが存在しない場合のみ追加
IF NOT EXISTS (
SELECT 1 FROM information_schema.columns
WHERE table_name = 'rog_entry'
AND column_name = 'zekken_label'
) THEN
ALTER TABLE rog_entry ADD COLUMN zekken_label VARCHAR(255) NULL;
END IF;
END
$$;
""",
reverse_sql=migrations.RunSQL.noop
),
]

View File

@ -0,0 +1,96 @@
# Generated by Django 3.2.9 on 2025-08-25 09:30
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('rog', '0008_auto_20250825_0716'),
]
operations = [
# GPS Checkin テーブルの安全な作成
migrations.RunSQL(
sql="""
DO $$
BEGIN
-- rog_gpscheckin テーブルが存在しない場合のみ作成
IF NOT EXISTS (
SELECT FROM information_schema.tables
WHERE table_schema = 'public'
AND table_name = 'rog_gpscheckin'
) THEN
CREATE TABLE rog_gpscheckin (
id SERIAL PRIMARY KEY,
event_code VARCHAR(50),
zekken VARCHAR(20),
serial_number VARCHAR(50),
team_name VARCHAR(255),
cp_number VARCHAR(20),
lat DOUBLE PRECISION,
lng DOUBLE PRECISION,
checkin_time TIMESTAMP WITH TIME ZONE,
record_time TIMESTAMP WITH TIME ZONE,
location GEOMETRY(Point, 4326),
mobserver_id INTEGER,
event_id INTEGER,
team_id INTEGER,
checkpoint_id INTEGER,
goal_time TEXT,
late_point INTEGER,
buy_flag BOOLEAN DEFAULT FALSE,
image_address TEXT,
minus_photo_flag BOOLEAN DEFAULT FALSE,
create_user TEXT,
update_user TEXT,
comment TEXT,
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);
-- インデックスの作成
CREATE INDEX IF NOT EXISTS rog_gpschec_event_c_9f1a75_idx ON rog_gpscheckin (event_code);
CREATE INDEX IF NOT EXISTS rog_gpschec_zekken_8e7f42_idx ON rog_gpscheckin (zekken);
CREATE INDEX IF NOT EXISTS rog_gpschec_serial__1b5e3a_idx ON rog_gpscheckin (serial_number);
CREATE INDEX IF NOT EXISTS rog_gpschec_cp_numb_d7c8e5_idx ON rog_gpscheckin (cp_number);
CREATE INDEX IF NOT EXISTS rog_gpscheckin_team_id_e85ab512 ON rog_gpscheckin (team_id);
END IF;
-- rog_gpslog テーブルが存在しない場合のみ作成
IF NOT EXISTS (
SELECT FROM information_schema.tables
WHERE table_schema = 'public'
AND table_name = 'rog_gpslog'
) THEN
CREATE TABLE rog_gpslog (
id SERIAL PRIMARY KEY,
event_code VARCHAR(50),
zekken VARCHAR(20),
serial_number VARCHAR(50),
cp_number VARCHAR(20),
lat DOUBLE PRECISION,
lng DOUBLE PRECISION,
checkin_time TIMESTAMP WITH TIME ZONE,
record_time TIMESTAMP WITH TIME ZONE,
location GEOMETRY(Point, 4326),
mobserver_id INTEGER,
event_id INTEGER,
team_id INTEGER,
checkpoint_id INTEGER
);
-- インデックスの作成
CREATE INDEX IF NOT EXISTS rog_gpslog_event_c_8a2b94_idx ON rog_gpslog (event_code);
CREATE INDEX IF NOT EXISTS rog_gpslog_zekken_7c5f39_idx ON rog_gpslog (zekken);
CREATE INDEX IF NOT EXISTS rog_gpslog_serial__6d4e28_idx ON rog_gpslog (serial_number);
CREATE INDEX IF NOT EXISTS rog_gpslog_cp_numb_5b3a17_idx ON rog_gpslog (cp_number);
END IF;
END $$;
""",
reverse_sql="""
DROP TABLE IF EXISTS rog_gpscheckin CASCADE;
DROP TABLE IF EXISTS rog_gpslog CASCADE;
"""
),
]

View File

@ -0,0 +1,216 @@
# Generated for safe deployment
# Conditional SQL operations to prevent duplicate table errors
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('rog', '0009_create_gps_tables_safe'),
]
operations = [
# 既存のすべてのテーブルとインデックスを条件付きで作成
migrations.RunSQL(
sql="""
-- CustomUser テーブルの安全な作成
DO $$
BEGIN
IF NOT EXISTS (SELECT FROM information_schema.tables WHERE table_name = 'rog_customuser') THEN
CREATE TABLE rog_customuser (
id SERIAL PRIMARY KEY,
password VARCHAR(128) NOT NULL,
last_login TIMESTAMP WITH TIME ZONE,
is_superuser BOOLEAN NOT NULL,
username VARCHAR(150) NOT NULL UNIQUE,
first_name VARCHAR(150) NOT NULL,
last_name VARCHAR(150) NOT NULL,
email VARCHAR(254) NOT NULL,
is_staff BOOLEAN NOT NULL,
is_active BOOLEAN NOT NULL,
date_joined TIMESTAMP WITH TIME ZONE NOT NULL
);
END IF;
END $$;
-- CustomUser インデックスの安全な作成
DO $$
BEGIN
IF NOT EXISTS (SELECT FROM pg_indexes WHERE tablename = 'rog_customuser' AND indexname = 'rog_customuser_username_key') THEN
CREATE UNIQUE INDEX rog_customuser_username_key ON rog_customuser (username);
END IF;
END $$;
-- Entry テーブルの安全な作成
DO $$
BEGIN
IF NOT EXISTS (SELECT FROM information_schema.tables WHERE table_name = 'rog_entry') THEN
CREATE TABLE rog_entry (
id SERIAL PRIMARY KEY,
event_code VARCHAR(50),
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);
END IF;
END $$;
-- Team テーブルの安全な作成
DO $$
BEGIN
IF NOT EXISTS (SELECT FROM information_schema.tables WHERE table_name = 'rog_team') THEN
CREATE TABLE rog_team (
id SERIAL PRIMARY KEY,
team_name VARCHAR(100),
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);
END IF;
END $$;
-- Member テーブルの安全な作成
DO $$
BEGIN
IF NOT EXISTS (SELECT FROM information_schema.tables WHERE table_name = 'rog_member') THEN
CREATE TABLE rog_member (
id SERIAL PRIMARY KEY,
member_name VARCHAR(100),
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);
END IF;
END $$;
-- Location2025 テーブルの安全な作成
DO $$
BEGIN
IF NOT EXISTS (SELECT FROM information_schema.tables WHERE table_name = 'rog_location2025') THEN
CREATE TABLE rog_location2025 (
id SERIAL PRIMARY KEY,
cp_number INTEGER,
cp_name VARCHAR(255),
latitude FLOAT,
longitude FLOAT,
location GEOMETRY(POINT, 4326),
cp_point INTEGER DEFAULT 10,
photo_point INTEGER DEFAULT 0,
buy_point INTEGER DEFAULT 0,
checkin_radius FLOAT DEFAULT 15.0,
auto_checkin BOOLEAN DEFAULT FALSE,
shop_closed BOOLEAN DEFAULT FALSE,
shop_shutdown BOOLEAN DEFAULT FALSE,
opening_hours TEXT,
address VARCHAR(512),
phone VARCHAR(32),
website VARCHAR(200),
description TEXT,
is_active BOOLEAN DEFAULT TRUE,
sort_order INTEGER DEFAULT 0,
csv_source_file VARCHAR(255),
csv_upload_date TIMESTAMP WITH TIME ZONE,
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
event_id INTEGER,
created_by_id INTEGER,
csv_upload_user_id INTEGER,
updated_by_id INTEGER
);
END IF;
END $$;
-- GPS Checkin テーブルの安全な作成
DO $$
BEGIN
IF NOT EXISTS (SELECT FROM information_schema.tables WHERE table_name = 'rog_gpscheckin') THEN
CREATE TABLE rog_gpscheckin (
id SERIAL PRIMARY KEY,
event_code VARCHAR(50),
zekken VARCHAR(20),
serial_number VARCHAR(50),
team_name VARCHAR(100),
cp_number VARCHAR(20),
lat FLOAT,
lng FLOAT,
checkin_time TIMESTAMP WITH TIME ZONE,
record_time TIMESTAMP WITH TIME ZONE,
goal_time TIMESTAMP WITH TIME ZONE,
late_point INTEGER,
buy_flag BOOLEAN DEFAULT FALSE,
image_address TEXT,
minus_photo_flag BOOLEAN DEFAULT FALSE,
create_user TEXT,
update_user TEXT,
comment TEXT,
location GEOMETRY(POINT, 4326),
mobserver_id INTEGER,
event_id INTEGER,
team_id INTEGER,
checkpoint_id INTEGER
);
END IF;
END $$;
-- GPS Log テーブルの安全な作成
DO $$
BEGIN
IF NOT EXISTS (SELECT FROM information_schema.tables WHERE table_name = 'rog_gpslog') THEN
CREATE TABLE rog_gpslog (
id SERIAL PRIMARY KEY,
event_code VARCHAR(50),
zekken VARCHAR(20),
serial_number VARCHAR(50),
cp_number VARCHAR(20),
lat FLOAT,
lng FLOAT,
checkin_time TIMESTAMP WITH TIME ZONE,
record_time TIMESTAMP WITH TIME ZONE,
location GEOMETRY(POINT, 4326),
mobserver_id INTEGER,
event_id INTEGER,
team_id INTEGER,
checkpoint_id INTEGER
);
END IF;
END $$;
-- 必要なインデックスの安全な作成
DO $$
BEGIN
-- GPS Checkin インデックス
IF NOT EXISTS (SELECT FROM pg_indexes WHERE tablename = 'rog_gpscheckin' AND indexname = 'rog_gpscheckin_event_code_idx') THEN
CREATE INDEX rog_gpscheckin_event_code_idx ON rog_gpscheckin (event_code);
END IF;
IF NOT EXISTS (SELECT FROM pg_indexes WHERE tablename = 'rog_gpscheckin' AND indexname = 'rog_gpscheckin_serial_number_idx') THEN
CREATE INDEX rog_gpscheckin_serial_number_idx ON rog_gpscheckin (serial_number);
END IF;
IF NOT EXISTS (SELECT FROM pg_indexes WHERE tablename = 'rog_gpscheckin' AND indexname = 'rog_gpscheckin_team_name_idx') THEN
CREATE INDEX rog_gpscheckin_team_name_idx ON rog_gpscheckin (team_name);
END IF;
-- GPS Log インデックス
IF NOT EXISTS (SELECT FROM pg_indexes WHERE tablename = 'rog_gpslog' AND indexname = 'rog_gpslog_event_code_idx') THEN
CREATE INDEX rog_gpslog_event_code_idx ON rog_gpslog (event_code);
END IF;
IF NOT EXISTS (SELECT FROM pg_indexes WHERE tablename = 'rog_gpslog' AND indexname = 'rog_gpslog_serial_number_idx') THEN
CREATE INDEX rog_gpslog_serial_number_idx ON rog_gpslog (serial_number);
END IF;
-- Location2025 インデックス
IF NOT EXISTS (SELECT FROM pg_indexes WHERE tablename = 'rog_location2025' AND indexname = 'rog_location2025_cp_number_idx') THEN
CREATE INDEX rog_location2025_cp_number_idx ON rog_location2025 (cp_number);
END IF;
IF NOT EXISTS (SELECT FROM pg_indexes WHERE tablename = 'rog_location2025' AND indexname = 'rog_location2025_event_id_idx') THEN
CREATE INDEX rog_location2025_event_id_idx ON rog_location2025 (event_id);
END IF;
END $$;
""",
reverse_sql="""
-- 逆操作は何もしない(テーブルを削除しない)
SELECT 1;
"""
),
]

View File

@ -0,0 +1,245 @@
# Generated by Django 3.2.9 on 2025-08-27 05:59
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
import django.utils.timezone
class Migration(migrations.Migration):
dependencies = [
('rog', '0010_safe_create_all_tables'),
]
operations = [
migrations.CreateModel(
name='AppVersion',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('version', models.CharField(help_text='セマンティックバージョン (1.2.3)', max_length=20)),
('platform', models.CharField(choices=[('android', 'Android'), ('ios', 'iOS')], max_length=10)),
('build_number', models.CharField(blank=True, max_length=20, null=True)),
('is_latest', models.BooleanField(default=False, help_text='最新版フラグ')),
('is_required', models.BooleanField(default=False, help_text='強制更新フラグ')),
('update_message', models.TextField(blank=True, help_text='ユーザー向け更新メッセージ', null=True)),
('download_url', models.URLField(blank=True, help_text='アプリストアURL', null=True)),
('release_date', models.DateTimeField(default=django.utils.timezone.now)),
('created_at', models.DateTimeField(auto_now_add=True)),
],
options={
'db_table': 'app_versions',
},
),
migrations.CreateModel(
name='CheckinExtended',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('gps_latitude', models.DecimalField(blank=True, decimal_places=8, max_digits=10, null=True)),
('gps_longitude', models.DecimalField(blank=True, decimal_places=8, max_digits=11, null=True)),
('gps_accuracy', models.DecimalField(blank=True, decimal_places=2, help_text='GPS精度メートル', max_digits=6, null=True)),
('gps_timestamp', models.DateTimeField(blank=True, null=True)),
('camera_capture_time', models.DateTimeField(blank=True, null=True)),
('device_info', models.TextField(blank=True, null=True)),
('validation_status', models.CharField(choices=[('pending', 'Pending'), ('approved', 'Approved'), ('rejected', 'Rejected'), ('requires_review', 'Requires Review')], default='pending', max_length=20)),
('validation_comment', models.TextField(blank=True, null=True)),
('validated_at', models.DateTimeField(blank=True, null=True)),
('bonus_points', models.IntegerField(default=0)),
('scoring_breakdown', models.JSONField(blank=True, default=dict)),
('created_at', models.DateTimeField(auto_now_add=True)),
('updated_at', models.DateTimeField(auto_now=True)),
],
options={
'db_table': 'rog_checkin_extended',
},
),
migrations.CreateModel(
name='UploadedImage',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('original_filename', models.CharField(max_length=255)),
('server_filename', models.CharField(max_length=255, unique=True)),
('file_url', models.URLField()),
('file_size', models.BigIntegerField()),
('mime_type', models.CharField(choices=[('image/jpeg', 'JPEG'), ('image/png', 'PNG'), ('image/heic', 'HEIC'), ('image/webp', 'WebP')], max_length=50)),
('event_code', models.CharField(blank=True, max_length=50, null=True)),
('team_name', models.CharField(blank=True, max_length=255, null=True)),
('cp_number', models.IntegerField(blank=True, null=True)),
('upload_source', models.CharField(choices=[('direct', 'Direct'), ('sharing_intent', 'Sharing Intent'), ('bulk_upload', 'Bulk Upload')], default='direct', max_length=50)),
('device_platform', models.CharField(blank=True, choices=[('ios', 'iOS'), ('android', 'Android'), ('web', 'Web')], max_length=20, null=True)),
('capture_timestamp', models.DateTimeField(blank=True, null=True)),
('upload_timestamp', models.DateTimeField(auto_now_add=True)),
('device_info', models.TextField(blank=True, null=True)),
('processing_status', models.CharField(choices=[('uploaded', 'Uploaded'), ('processing', 'Processing'), ('processed', 'Processed'), ('failed', 'Failed')], default='uploaded', max_length=20)),
('thumbnail_url', models.URLField(blank=True, null=True)),
('created_at', models.DateTimeField(auto_now_add=True)),
('updated_at', models.DateTimeField(auto_now=True)),
],
options={
'db_table': 'rog_uploaded_images',
},
),
# TeamStartテーブルのentryカラムを安全に削除
migrations.RunSQL(
sql="""
DO $$
BEGIN
IF EXISTS (SELECT FROM information_schema.tables WHERE table_name = 'rog_teamstart') THEN
IF EXISTS (SELECT FROM information_schema.columns WHERE table_name = 'rog_teamstart' AND column_name = 'entry_id') THEN
ALTER TABLE rog_teamstart DROP COLUMN entry_id;
END IF;
END IF;
END $$;
""",
reverse_sql="-- No reverse SQL needed for conditional operation"
),
# Entryテーブルに新しいフィールドを条件付きで追加
migrations.RunSQL(
sql="""
DO $$
BEGIN
-- can_access_private_events フィールドの追加
IF NOT EXISTS (SELECT FROM information_schema.columns WHERE table_name = 'rog_entry' AND column_name = 'can_access_private_events') THEN
ALTER TABLE rog_entry ADD COLUMN can_access_private_events BOOLEAN DEFAULT FALSE;
COMMENT ON COLUMN rog_entry.can_access_private_events IS '非公開イベント参加権限';
END IF;
-- staff_privileges フィールドの追加
IF NOT EXISTS (SELECT FROM information_schema.columns WHERE table_name = 'rog_entry' AND column_name = 'staff_privileges') THEN
ALTER TABLE rog_entry ADD COLUMN staff_privileges BOOLEAN DEFAULT FALSE;
COMMENT ON COLUMN rog_entry.staff_privileges IS 'スタッフ権限フラグ';
END IF;
-- team_validation_status フィールドの追加
IF NOT EXISTS (SELECT FROM information_schema.columns WHERE table_name = 'rog_entry' AND column_name = 'team_validation_status') THEN
ALTER TABLE rog_entry ADD COLUMN team_validation_status VARCHAR(20) DEFAULT 'approved';
COMMENT ON COLUMN rog_entry.team_validation_status IS 'チーム承認状況';
END IF;
-- zekken_label フィールドの追加
IF NOT EXISTS (SELECT FROM information_schema.columns WHERE table_name = 'rog_entry' AND column_name = 'zekken_label') THEN
ALTER TABLE rog_entry ADD COLUMN zekken_label VARCHAR(255);
END IF;
END $$;
""",
reverse_sql="-- No reverse SQL needed for conditional operation"
),
# GPSCheckinテーブルに新しいフィールドを条件付きで追加
migrations.RunSQL(
sql="""
DO $$
BEGIN
-- create_at フィールドの追加
IF NOT EXISTS (SELECT FROM information_schema.columns WHERE table_name = 'rog_gpscheckin' AND column_name = 'create_at') THEN
ALTER TABLE rog_gpscheckin ADD COLUMN create_at TIMESTAMP WITH TIME ZONE;
COMMENT ON COLUMN rog_gpscheckin.create_at IS '作成日時:データの作成日時';
END IF;
-- create_user フィールドの追加
IF NOT EXISTS (SELECT FROM information_schema.columns WHERE table_name = 'rog_gpscheckin' AND column_name = 'create_user') THEN
ALTER TABLE rog_gpscheckin ADD COLUMN create_user TEXT;
COMMENT ON COLUMN rog_gpscheckin.create_user IS '作成ユーザー';
END IF;
-- event_id フィールドの追加
IF NOT EXISTS (SELECT FROM information_schema.columns WHERE table_name = 'rog_gpscheckin' AND column_name = 'event_id') THEN
ALTER TABLE rog_gpscheckin ADD COLUMN event_id INTEGER;
COMMENT ON COLUMN rog_gpscheckin.event_id IS 'イベントID';
END IF;
-- goal_time フィールドの追加
IF NOT EXISTS (SELECT FROM information_schema.columns WHERE table_name = 'rog_gpscheckin' AND column_name = 'goal_time') THEN
ALTER TABLE rog_gpscheckin ADD COLUMN goal_time TEXT;
COMMENT ON COLUMN rog_gpscheckin.goal_time IS 'ゴール時刻=ゴール時のみ使用される。画像から時刻を読み取り設定する。';
END IF;
-- image_address フィールドの追加
IF NOT EXISTS (SELECT FROM information_schema.columns WHERE table_name = 'rog_gpscheckin' AND column_name = 'image_address') THEN
ALTER TABLE rog_gpscheckin ADD COLUMN image_address TEXT;
COMMENT ON COLUMN rog_gpscheckin.image_address IS 'チェックイン画像のパス';
END IF;
END $$;
""",
reverse_sql="-- No reverse SQL needed for conditional operation"
),
# NewEvent2テーブルに新しいフィールドを条件付きで追加
migrations.RunSQL(
sql="""
DO $$
BEGIN
-- status フィールドの追加
IF NOT EXISTS (SELECT FROM information_schema.columns WHERE table_name = 'rog_newevent2' AND column_name = 'status') THEN
ALTER TABLE rog_newevent2 ADD COLUMN status VARCHAR(20) DEFAULT 'draft';
COMMENT ON COLUMN rog_newevent2.status IS 'イベントステータス';
END IF;
END $$;
""",
reverse_sql="-- No reverse SQL needed for conditional operation"
),
migrations.AlterModelTable(
name='gpslog',
table='gps_information',
),
migrations.DeleteModel(
name='TeamGoal',
),
migrations.DeleteModel(
name='TeamStart',
),
migrations.AddField(
model_name='uploadedimage',
name='entry',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='rog.entry'),
),
migrations.AddField(
model_name='uploadedimage',
name='gpslog',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='rog.gpscheckin'),
),
migrations.AddField(
model_name='checkinextended',
name='gpslog',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='extended_info', to='rog.gpscheckin'),
),
migrations.AddField(
model_name='checkinextended',
name='validated_by',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL),
),
migrations.AddIndex(
model_name='appversion',
index=models.Index(fields=['platform'], name='idx_app_versions_platform'),
),
migrations.AddIndex(
model_name='appversion',
index=models.Index(condition=models.Q(('is_latest', True)), fields=['is_latest'], name='idx_app_versions_latest_true'),
),
migrations.AlterUniqueTogether(
name='appversion',
unique_together={('version', 'platform')},
),
migrations.AddIndex(
model_name='uploadedimage',
index=models.Index(fields=['event_code', 'team_name'], name='idx_uploaded_event_team'),
),
migrations.AddIndex(
model_name='uploadedimage',
index=models.Index(fields=['cp_number'], name='idx_uploaded_cp_number'),
),
migrations.AddIndex(
model_name='uploadedimage',
index=models.Index(fields=['upload_timestamp'], name='idx_uploaded_timestamp'),
),
migrations.AddIndex(
model_name='uploadedimage',
index=models.Index(fields=['processing_status'], name='idx_uploaded_status'),
),
migrations.AddIndex(
model_name='checkinextended',
index=models.Index(fields=['validation_status'], name='idx_checkin_ext_valid'),
),
migrations.AddIndex(
model_name='checkinextended',
index=models.Index(fields=['created_at'], name='idx_checkin_ext_created'),
),
]