101 lines
6.1 KiB
Python
101 lines
6.1 KiB
Python
|
|
# Generated by Django 4.2.16 on 2026-03-25 10:15
|
||
|
|
|
||
|
|
from django.conf import settings
|
||
|
|
from django.db import migrations, models
|
||
|
|
import django.db.models.deletion
|
||
|
|
|
||
|
|
|
||
|
|
class Migration(migrations.Migration):
|
||
|
|
|
||
|
|
initial = True
|
||
|
|
|
||
|
|
dependencies = [
|
||
|
|
('tools', '0003_remove_shotgroup_result_picture_delete_resultpicture'),
|
||
|
|
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
||
|
|
]
|
||
|
|
|
||
|
|
operations = [
|
||
|
|
migrations.CreateModel(
|
||
|
|
name='GroupPhoto',
|
||
|
|
fields=[
|
||
|
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||
|
|
('caption', models.CharField(blank=True, max_length=255, verbose_name='caption')),
|
||
|
|
('order', models.PositiveSmallIntegerField(default=0, verbose_name='order')),
|
||
|
|
],
|
||
|
|
options={
|
||
|
|
'verbose_name': 'group photo',
|
||
|
|
'verbose_name_plural': 'group photos',
|
||
|
|
'ordering': ['order', 'id'],
|
||
|
|
},
|
||
|
|
),
|
||
|
|
migrations.CreateModel(
|
||
|
|
name='PointOfImpact',
|
||
|
|
fields=[
|
||
|
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||
|
|
('order', models.PositiveSmallIntegerField(default=0, help_text='1-based sequence; used when shot FK is absent.', verbose_name='order')),
|
||
|
|
('x_px', models.PositiveSmallIntegerField(verbose_name='x (px)')),
|
||
|
|
('y_px', models.PositiveSmallIntegerField(verbose_name='y (px)')),
|
||
|
|
('x_mm', models.DecimalField(blank=True, decimal_places=2, max_digits=7, null=True, verbose_name='x offset (mm)')),
|
||
|
|
('y_mm', models.DecimalField(blank=True, decimal_places=2, max_digits=7, null=True, verbose_name='y offset (mm)')),
|
||
|
|
('radius_mm', models.DecimalField(blank=True, decimal_places=2, max_digits=6, null=True, verbose_name='bullet hole radius (mm)')),
|
||
|
|
('notes', models.CharField(blank=True, max_length=255, verbose_name='notes')),
|
||
|
|
('group_photo', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='points_of_impact', to='photos.groupphoto', verbose_name='group photo')),
|
||
|
|
('shot', models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='point_of_impact', to='tools.shot', verbose_name='shot')),
|
||
|
|
],
|
||
|
|
options={
|
||
|
|
'verbose_name': 'point of impact',
|
||
|
|
'verbose_name_plural': 'points of impact',
|
||
|
|
'ordering': ['order', 'id'],
|
||
|
|
},
|
||
|
|
),
|
||
|
|
migrations.CreateModel(
|
||
|
|
name='Photo',
|
||
|
|
fields=[
|
||
|
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||
|
|
('data', models.BinaryField(verbose_name='data')),
|
||
|
|
('content_type', models.CharField(max_length=50, verbose_name='content type')),
|
||
|
|
('size', models.PositiveIntegerField(verbose_name='size (bytes)')),
|
||
|
|
('width', models.PositiveSmallIntegerField(blank=True, null=True, verbose_name='width (px)')),
|
||
|
|
('height', models.PositiveSmallIntegerField(blank=True, null=True, verbose_name='height (px)')),
|
||
|
|
('uploaded_at', models.DateTimeField(auto_now_add=True, verbose_name='uploaded at')),
|
||
|
|
('description', models.CharField(blank=True, max_length=255, verbose_name='description')),
|
||
|
|
('uploaded_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='photos', to=settings.AUTH_USER_MODEL, verbose_name='uploaded by')),
|
||
|
|
],
|
||
|
|
options={
|
||
|
|
'verbose_name': 'photo',
|
||
|
|
'verbose_name_plural': 'photos',
|
||
|
|
'ordering': ['-uploaded_at'],
|
||
|
|
},
|
||
|
|
),
|
||
|
|
migrations.CreateModel(
|
||
|
|
name='GroupPhotoAnalysis',
|
||
|
|
fields=[
|
||
|
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||
|
|
('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)')),
|
||
|
|
('notes', models.TextField(blank=True, verbose_name='notes')),
|
||
|
|
('group_photo', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='analysis', to='photos.groupphoto', verbose_name='group photo')),
|
||
|
|
],
|
||
|
|
options={
|
||
|
|
'verbose_name': 'group photo analysis',
|
||
|
|
'verbose_name_plural': 'group photo analyses',
|
||
|
|
},
|
||
|
|
),
|
||
|
|
migrations.AddField(
|
||
|
|
model_name='groupphoto',
|
||
|
|
name='photo',
|
||
|
|
field=models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='group_photo', to='photos.photo', verbose_name='photo'),
|
||
|
|
),
|
||
|
|
migrations.AddField(
|
||
|
|
model_name='groupphoto',
|
||
|
|
name='shot_group',
|
||
|
|
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='group_photos', to='tools.shotgroup', verbose_name='shot group'),
|
||
|
|
),
|
||
|
|
]
|