First commit of claude's rework in django + vanillajs fronted

This commit is contained in:
Gérald Colangelo
2026-04-02 11:24:30 +02:00
parent 7710a876df
commit fde92f92db
163 changed files with 84852 additions and 15 deletions

View File

@@ -0,0 +1,100 @@
# 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'),
),
]