94 lines
5.7 KiB
Python
94 lines
5.7 KiB
Python
|
|
# Generated by Django 4.2.16 on 2026-03-24 12:28
|
||
|
|
|
||
|
|
from django.conf import settings
|
||
|
|
from django.db import migrations, models
|
||
|
|
import django.db.models.deletion
|
||
|
|
|
||
|
|
|
||
|
|
class Migration(migrations.Migration):
|
||
|
|
|
||
|
|
initial = True
|
||
|
|
|
||
|
|
dependencies = [
|
||
|
|
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
||
|
|
]
|
||
|
|
|
||
|
|
operations = [
|
||
|
|
migrations.CreateModel(
|
||
|
|
name='ChronographAnalysis',
|
||
|
|
fields=[
|
||
|
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||
|
|
('name', models.CharField(max_length=150, verbose_name='name')),
|
||
|
|
('date', models.DateField(verbose_name='date')),
|
||
|
|
('notes', models.TextField(blank=True, verbose_name='notes')),
|
||
|
|
('created_at', models.DateTimeField(auto_now_add=True, verbose_name='created at')),
|
||
|
|
('updated_at', models.DateTimeField(auto_now=True, verbose_name='updated at')),
|
||
|
|
('user', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='chronograph_analyses', to=settings.AUTH_USER_MODEL, verbose_name='user')),
|
||
|
|
],
|
||
|
|
options={
|
||
|
|
'verbose_name': 'chronograph analysis',
|
||
|
|
'verbose_name_plural': 'chronograph analyses',
|
||
|
|
'ordering': ['-date', '-created_at'],
|
||
|
|
},
|
||
|
|
),
|
||
|
|
migrations.CreateModel(
|
||
|
|
name='ResultPicture',
|
||
|
|
fields=[
|
||
|
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||
|
|
('image', models.ImageField(upload_to='result_pictures/', verbose_name='image')),
|
||
|
|
('description', models.CharField(blank=True, max_length=255, verbose_name='description')),
|
||
|
|
('group_size_mm', models.DecimalField(blank=True, decimal_places=2, max_digits=7, null=True, verbose_name='group size (mm)')),
|
||
|
|
('group_size_moa', models.DecimalField(blank=True, decimal_places=3, max_digits=7, null=True, verbose_name='group size (MOA)')),
|
||
|
|
('elevation_offset_mm', models.DecimalField(blank=True, decimal_places=2, max_digits=7, null=True, verbose_name='elevation offset (mm)')),
|
||
|
|
('elevation_offset_moa', models.DecimalField(blank=True, decimal_places=3, max_digits=7, null=True, verbose_name='elevation offset (MOA)')),
|
||
|
|
('windage_offset_mm', models.DecimalField(blank=True, decimal_places=2, max_digits=7, null=True, verbose_name='windage offset (mm)')),
|
||
|
|
('windage_offset_moa', models.DecimalField(blank=True, decimal_places=3, max_digits=7, null=True, verbose_name='windage offset (MOA)')),
|
||
|
|
('mean_radius_mm', models.DecimalField(blank=True, decimal_places=2, max_digits=7, null=True, verbose_name='mean radius (mm)')),
|
||
|
|
('mean_radius_moa', models.DecimalField(blank=True, decimal_places=3, max_digits=7, null=True, verbose_name='mean radius (MOA)')),
|
||
|
|
('uploaded_at', models.DateTimeField(auto_now_add=True, verbose_name='uploaded at')),
|
||
|
|
('user', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='result_pictures', to=settings.AUTH_USER_MODEL, verbose_name='user')),
|
||
|
|
],
|
||
|
|
options={
|
||
|
|
'verbose_name': 'result picture',
|
||
|
|
'verbose_name_plural': 'result pictures',
|
||
|
|
'ordering': ['-uploaded_at'],
|
||
|
|
},
|
||
|
|
),
|
||
|
|
migrations.CreateModel(
|
||
|
|
name='ShotGroup',
|
||
|
|
fields=[
|
||
|
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||
|
|
('label', models.CharField(max_length=100, verbose_name='label')),
|
||
|
|
('distance_m', models.DecimalField(blank=True, decimal_places=1, max_digits=7, null=True, verbose_name='distance (m)')),
|
||
|
|
('order', models.PositiveSmallIntegerField(default=0, verbose_name='order')),
|
||
|
|
('notes', models.TextField(blank=True, verbose_name='notes')),
|
||
|
|
('analysis', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='shot_groups', to='tools.chronographanalysis', verbose_name='analysis')),
|
||
|
|
('result_picture', models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='shot_group', to='tools.resultpicture', verbose_name='result picture')),
|
||
|
|
],
|
||
|
|
options={
|
||
|
|
'verbose_name': 'shot group',
|
||
|
|
'verbose_name_plural': 'shot groups',
|
||
|
|
'ordering': ['order', 'id'],
|
||
|
|
},
|
||
|
|
),
|
||
|
|
migrations.CreateModel(
|
||
|
|
name='Shot',
|
||
|
|
fields=[
|
||
|
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||
|
|
('shot_number', models.PositiveSmallIntegerField(editable=False, verbose_name='shot number')),
|
||
|
|
('velocity_fps', models.DecimalField(decimal_places=1, max_digits=6, verbose_name='velocity (fps)')),
|
||
|
|
('notes', models.CharField(blank=True, max_length=255, verbose_name='notes')),
|
||
|
|
('group', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='shots', to='tools.shotgroup', verbose_name='group')),
|
||
|
|
],
|
||
|
|
options={
|
||
|
|
'verbose_name': 'shot',
|
||
|
|
'verbose_name_plural': 'shots',
|
||
|
|
'ordering': ['shot_number'],
|
||
|
|
},
|
||
|
|
),
|
||
|
|
migrations.AddConstraint(
|
||
|
|
model_name='shot',
|
||
|
|
constraint=models.UniqueConstraint(fields=('group', 'shot_number'), name='unique_shot_number_per_group'),
|
||
|
|
),
|
||
|
|
]
|