From 63fda6195c5d1433de9c902dd9a49cfd408ef1ba Mon Sep 17 00:00:00 2001 From: Imran Farhat Date: Tue, 16 Jun 2026 16:42:10 +0530 Subject: [PATCH] fix: track migration files in git, stop ignoring them in .gitignore (Bug 16) Root cause: .gitignore had a bare 'migrations' pattern that silently excluded every Django migration file repo-wide, not just for saveAPI. Only a couple of migrations/__init__.py files were ever committed before this rule existed; every actual migration (0001_initial.py etc, including saveAPI's pinned field migration) only ever existed on individual developers' local disks. This meant a fresh clone + migrate produced a database missing columns that the application code expects (e.g. StateSave.pinned), causing 500 errors on /api/save and /api/save/list. Fix: - Remove the 'migrations' line from .gitignore - Commit the current, verified-consistent migration files for every app (confirmed via 'makemigrations --check --dry-run' showing 'No changes detected' against the current develop model state) This includes the previously-missing saveAPI.0002_statesave_pinned migration that caused the originally reported 500 error. --- .gitignore | 1 - .../authAPI/migrations/0001_initial.py | 44 ++++++ .../authAPI/migrations/__init__.py | 0 .../libAPI/migrations/0001_initial.py | 77 ++++++++++ .../ltiAPI/migrations/0001_initial.py | 119 ++++++++++++++++ .../ltiAPI/migrations/__init__.py | 0 .../publishAPI/migrations/0001_initial.py | 134 ++++++++++++++++++ .../publishAPI/migrations/__init__.py | 0 .../saveAPI/migrations/0001_initial.py | 65 +++++++++ .../migrations/0002_statesave_pinned.py | 18 +++ .../saveAPI/migrations/__init__.py | 0 .../simulationAPI/migrations/0001_initial.py | 64 +++++++++ .../workflowAPI/migrations/0001_initial.py | 66 +++++++++ .../workflowAPI/migrations/__init__.py | 0 14 files changed, 587 insertions(+), 1 deletion(-) create mode 100644 esim-cloud-backend/authAPI/migrations/0001_initial.py create mode 100644 esim-cloud-backend/authAPI/migrations/__init__.py create mode 100644 esim-cloud-backend/libAPI/migrations/0001_initial.py create mode 100644 esim-cloud-backend/ltiAPI/migrations/0001_initial.py create mode 100644 esim-cloud-backend/ltiAPI/migrations/__init__.py create mode 100644 esim-cloud-backend/publishAPI/migrations/0001_initial.py create mode 100644 esim-cloud-backend/publishAPI/migrations/__init__.py create mode 100644 esim-cloud-backend/saveAPI/migrations/0001_initial.py create mode 100644 esim-cloud-backend/saveAPI/migrations/0002_statesave_pinned.py create mode 100644 esim-cloud-backend/saveAPI/migrations/__init__.py create mode 100644 esim-cloud-backend/simulationAPI/migrations/0001_initial.py create mode 100644 esim-cloud-backend/workflowAPI/migrations/0001_initial.py create mode 100644 esim-cloud-backend/workflowAPI/migrations/__init__.py diff --git a/.gitignore b/.gitignore index 3766b7c37..4411f079d 100644 --- a/.gitignore +++ b/.gitignore @@ -9,7 +9,6 @@ mongo_data/ sample_lib/ symbols/* .DS_Store -migrations symbol_svgs postgres_data file_storage diff --git a/esim-cloud-backend/authAPI/migrations/0001_initial.py b/esim-cloud-backend/authAPI/migrations/0001_initial.py new file mode 100644 index 000000000..79f315b2b --- /dev/null +++ b/esim-cloud-backend/authAPI/migrations/0001_initial.py @@ -0,0 +1,44 @@ +# Generated by Django 2.2.12 on 2026-05-25 15:40 + +import django.contrib.auth.models +import django.contrib.auth.validators +from django.db import migrations, models +import django.utils.timezone + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('auth', '0011_update_proxy_permissions'), + ] + + operations = [ + migrations.CreateModel( + name='User', + fields=[ + ('id', models.AutoField(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')), + ('username', models.CharField(error_messages={'unique': 'A user with that username already exists.'}, help_text='Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.', max_length=150, unique=True, validators=[django.contrib.auth.validators.UnicodeUsernameValidator()], verbose_name='username')), + ('first_name', models.CharField(blank=True, max_length=30, verbose_name='first name')), + ('last_name', models.CharField(blank=True, max_length=150, verbose_name='last name')), + ('is_staff', models.BooleanField(default=False, help_text='Designates whether the user can log into this admin site.', verbose_name='staff status')), + ('is_active', models.BooleanField(default=True, help_text='Designates whether this user should be treated as active. Unselect this instead of deleting accounts.', verbose_name='active')), + ('date_joined', models.DateTimeField(default=django.utils.timezone.now, verbose_name='date joined')), + ('email', models.EmailField(max_length=254, unique=True)), + ('groups', 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')), + ('user_permissions', 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')), + ], + options={ + 'verbose_name': 'user', + 'verbose_name_plural': 'users', + 'abstract': False, + }, + managers=[ + ('objects', django.contrib.auth.models.UserManager()), + ], + ), + ] diff --git a/esim-cloud-backend/authAPI/migrations/__init__.py b/esim-cloud-backend/authAPI/migrations/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/esim-cloud-backend/libAPI/migrations/0001_initial.py b/esim-cloud-backend/libAPI/migrations/0001_initial.py new file mode 100644 index 000000000..e9f1cfcc8 --- /dev/null +++ b/esim-cloud-backend/libAPI/migrations/0001_initial.py @@ -0,0 +1,77 @@ +# Generated by Django 2.2.12 on 2026-05-25 15:40 + +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='Library', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('library_name', models.CharField(max_length=200)), + ('saved_on', models.DateTimeField(auto_now=True)), + ], + ), + migrations.CreateModel( + name='LibrarySet', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('default', models.BooleanField(default=False)), + ('name', models.CharField(default='default', max_length=24)), + ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='user')), + ], + options={ + 'unique_together': {('user', 'name')}, + }, + ), + migrations.CreateModel( + name='LibraryComponent', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=200)), + ('svg_path', models.CharField(max_length=400)), + ('thumbnail_path', models.CharField(max_length=400)), + ('description', models.CharField(max_length=400)), + ('data_link', models.URLField()), + ('full_name', models.CharField(max_length=200)), + ('keyword', models.CharField(max_length=200)), + ('symbol_prefix', models.CharField(max_length=10)), + ('component_library', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='library', to='libAPI.Library')), + ], + ), + migrations.AddField( + model_name='library', + name='library_set', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='libAPI.LibrarySet', verbose_name='library_set'), + ), + migrations.CreateModel( + name='FavouriteComponent', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('last_change', models.DateTimeField(auto_now=True)), + ('component', models.ManyToManyField(to='libAPI.LibraryComponent')), + ('owner', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ], + ), + migrations.CreateModel( + name='ComponentAlternate', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('part', models.CharField(max_length=1)), + ('dmg', models.PositiveSmallIntegerField()), + ('full_name', models.CharField(max_length=200)), + ('svg_path', models.CharField(max_length=400)), + ('parent_component', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='alternate_component', to='libAPI.LibraryComponent')), + ], + ), + ] diff --git a/esim-cloud-backend/ltiAPI/migrations/0001_initial.py b/esim-cloud-backend/ltiAPI/migrations/0001_initial.py new file mode 100644 index 000000000..a0afa2263 --- /dev/null +++ b/esim-cloud-backend/ltiAPI/migrations/0001_initial.py @@ -0,0 +1,119 @@ +# Generated by Django 2.2.12 on 2026-05-25 15:41 + +from django.conf import settings +import django.contrib.postgres.fields +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('saveAPI', '0001_initial'), + ('simulationAPI', '0001_initial'), + ] + + operations = [ + migrations.CreateModel( + name='ArduinLTIConsumer', + fields=[ + ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False, unique=True)), + ('consumer_key', models.CharField(max_length=50)), + ('secret_key', models.CharField(max_length=50)), + ('score', models.FloatField(blank=True, null=True)), + ('con_weightage', models.FloatField(default=60)), + ('scored', models.BooleanField()), + ('view_code', models.BooleanField()), + ('initial_schematic', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='arduino_initial_schematic', to='saveAPI.StateSave')), + ('model_schematic', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='arduino_model_schematic', to='saveAPI.StateSave')), + ('test_case', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='saveAPI.ArduinoModelSimulationData')), + ], + ), + migrations.CreateModel( + name='ArduinoLTISession', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('user_id', models.CharField(max_length=200, null=True)), + ('lis_result_sourcedid', models.CharField(max_length=300, null=True)), + ('lis_outcome_service_url', models.CharField(max_length=300, null=True)), + ('oauth_nonce', models.CharField(max_length=300)), + ('oauth_timestamp', models.CharField(max_length=300)), + ('oauth_consumer_key', models.CharField(max_length=300)), + ('oauth_signature_method', models.CharField(max_length=300)), + ('oauth_version', models.CharField(max_length=300)), + ('oauth_signature', models.CharField(max_length=300)), + ('lti_consumer', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='ltiAPI.ArduinLTIConsumer')), + ('simulations', models.ManyToManyField(to='saveAPI.ArduinoModelSimulationData')), + ], + ), + migrations.CreateModel( + name='ArduinoLTISimData', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('result', models.TextField()), + ('circuit_id', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='saveAPI.StateSave')), + ('session_id', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='ltiAPI.ArduinoLTISession')), + ], + ), + migrations.CreateModel( + name='lticonsumer', + fields=[ + ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False, unique=True)), + ('consumer_key', models.CharField(max_length=50)), + ('secret_key', models.CharField(max_length=50)), + ('score', models.FloatField(blank=True, null=True)), + ('sim_params', django.contrib.postgres.fields.ArrayField(base_field=models.CharField(max_length=20), blank=True, null=True, size=None)), + ('scored', models.BooleanField()), + ('initial_schematic', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='initial_schematic', to='saveAPI.StateSave')), + ('model_schematic', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='model_schematic', to='saveAPI.StateSave')), + ('test_case', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='simulationAPI.simulation')), + ], + ), + migrations.CreateModel( + name='ltiSession', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('user_id', models.CharField(max_length=200, null=True)), + ('lis_result_sourcedid', models.CharField(max_length=300, null=True)), + ('lis_outcome_service_url', models.CharField(max_length=300, null=True)), + ('oauth_nonce', models.CharField(max_length=300)), + ('oauth_timestamp', models.CharField(max_length=300)), + ('oauth_consumer_key', models.CharField(max_length=300)), + ('oauth_signature_method', models.CharField(max_length=300)), + ('oauth_version', models.CharField(max_length=300)), + ('oauth_signature', models.CharField(max_length=300)), + ('lti_consumer', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='ltiAPI.lticonsumer')), + ('simulations', models.ManyToManyField(to='simulationAPI.simulation')), + ], + ), + migrations.CreateModel( + name='Submission', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('score', models.FloatField()), + ('lms_success', models.BooleanField(null=True)), + ('ltisession', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='ltiAPI.ltiSession')), + ('project', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='ltiAPI.lticonsumer')), + ('schematic', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='saveAPI.StateSave')), + ('student', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ('student_simulation', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='simulationAPI.simulation')), + ], + ), + migrations.CreateModel( + name='ArduinoSubmission', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('score', models.FloatField()), + ('lms_success', models.BooleanField(null=True)), + ('ltisession', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='ltiAPI.ArduinoLTISession')), + ('project', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='ltiAPI.ArduinLTIConsumer')), + ('schematic', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='saveAPI.StateSave')), + ('student', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ('student_simulation', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='ltiAPI.ArduinoLTISimData')), + ], + ), + ] diff --git a/esim-cloud-backend/ltiAPI/migrations/__init__.py b/esim-cloud-backend/ltiAPI/migrations/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/esim-cloud-backend/publishAPI/migrations/0001_initial.py b/esim-cloud-backend/publishAPI/migrations/0001_initial.py new file mode 100644 index 000000000..dbeb34b9e --- /dev/null +++ b/esim-cloud-backend/publishAPI/migrations/0001_initial.py @@ -0,0 +1,134 @@ +# Generated by Django 2.2.12 on 2026-05-25 15:40 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('workflowAPI', '0001_initial'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.CreateModel( + name='ACAnalysisParameters', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('input', models.CharField(default='dec', max_length=200)), + ('stop', models.CharField(max_length=200, null=True)), + ('start', models.CharField(max_length=200, null=True)), + ('pointsBydecade', models.CharField(max_length=200, null=True)), + ], + ), + migrations.CreateModel( + name='CircuitTag', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('tag', models.CharField(max_length=100, unique=True)), + ('description', models.CharField(max_length=200)), + ], + ), + migrations.CreateModel( + name='DCSweepParameters', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('parameter', models.CharField(max_length=200, null=True)), + ('sweepType', models.CharField(default='Linear', max_length=200)), + ('start', models.CharField(max_length=200, null=True)), + ('stop', models.CharField(max_length=200, null=True)), + ('step', models.CharField(max_length=200, null=True)), + ('parameter2', models.CharField(max_length=200, null=True)), + ('start2', models.CharField(max_length=200, null=True)), + ('stop2', models.CharField(max_length=200, null=True)), + ('step2', models.CharField(max_length=200, null=True)), + ], + ), + migrations.CreateModel( + name='Field', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=40)), + ('text', models.CharField(max_length=400, null=True)), + ], + ), + migrations.CreateModel( + name='Project', + fields=[ + ('project_id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)), + ('title', models.CharField(max_length=200)), + ('description', models.CharField(max_length=1000, null=True)), + ('is_arduino', models.BooleanField(default=False)), + ('is_reported', models.BooleanField(default=False, null=True)), + ('active_branch', models.CharField(max_length=20, null=True)), + ('active_version', models.CharField(max_length=20, null=True)), + ('ac_analysis', models.OneToOneField(null=True, on_delete=django.db.models.deletion.CASCADE, to='publishAPI.ACAnalysisParameters')), + ('author', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ('dc_sweep', models.OneToOneField(null=True, on_delete=django.db.models.deletion.CASCADE, to='publishAPI.DCSweepParameters')), + ('fields', models.ManyToManyField(to='publishAPI.Field')), + ('state', models.ForeignKey(default=1, on_delete=django.db.models.deletion.CASCADE, to='workflowAPI.State')), + ], + ), + migrations.CreateModel( + name='TFAnalysisParameters', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('outputNodes', models.BooleanField(default=False)), + ('outputVoltageSource', models.CharField(max_length=200, null=True)), + ('inputVoltageSource', models.CharField(max_length=200, null=True)), + ], + ), + migrations.CreateModel( + name='TransientAnalysisParameters', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('start', models.CharField(max_length=200, null=True)), + ('stop', models.CharField(max_length=200, null=True)), + ('step', models.CharField(max_length=200, null=True)), + ('skipInitial', models.BooleanField(default=False)), + ], + ), + migrations.CreateModel( + name='TransitionHistory', + fields=[ + ('id', models.AutoField(primary_key=True, serialize=False)), + ('transition_time', models.DateTimeField(auto_now_add=True)), + ('reviewer_notes', models.CharField(blank=True, max_length=500)), + ('is_done_by_reviewer', models.BooleanField(default=False, null=True)), + ('project', models.ForeignKey(editable=False, null=True, on_delete=django.db.models.deletion.CASCADE, to='publishAPI.Project')), + ('transition', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='workflowAPI.Transition')), + ('transition_author', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ], + options={ + 'verbose_name_plural': 'Transition Histories', + }, + ), + migrations.CreateModel( + name='Report', + fields=[ + ('id', models.AutoField(primary_key=True, serialize=False)), + ('report_open', models.BooleanField(default=True)), + ('report_time', models.DateTimeField(auto_now_add=True)), + ('description', models.CharField(max_length=500)), + ('approved', models.BooleanField(default=None, null=True)), + ('project', models.ForeignKey(editable=False, null=True, on_delete=django.db.models.deletion.CASCADE, to='publishAPI.Project')), + ('reporter', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='reporter', to=settings.AUTH_USER_MODEL)), + ('resolver', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='resolver', to=settings.AUTH_USER_MODEL)), + ], + ), + migrations.AddField( + model_name='project', + name='tf_analysis', + field=models.OneToOneField(null=True, on_delete=django.db.models.deletion.CASCADE, to='publishAPI.TFAnalysisParameters'), + ), + migrations.AddField( + model_name='project', + name='transient_analysis', + field=models.OneToOneField(null=True, on_delete=django.db.models.deletion.CASCADE, to='publishAPI.TransientAnalysisParameters'), + ), + ] diff --git a/esim-cloud-backend/publishAPI/migrations/__init__.py b/esim-cloud-backend/publishAPI/migrations/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/esim-cloud-backend/saveAPI/migrations/0001_initial.py b/esim-cloud-backend/saveAPI/migrations/0001_initial.py new file mode 100644 index 000000000..6677ae292 --- /dev/null +++ b/esim-cloud-backend/saveAPI/migrations/0001_initial.py @@ -0,0 +1,65 @@ +# Generated by Django 2.2.12 on 2026-05-25 15:40 + +from django.conf import settings +import django.core.files.storage +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('libAPI', '0001_initial'), + ('publishAPI', '0001_initial'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.CreateModel( + name='StateSave', + fields=[ + ('id', models.AutoField(primary_key=True, serialize=False)), + ('name', models.CharField(max_length=200, null=True)), + ('description', models.CharField(max_length=400, null=True)), + ('save_time', models.DateTimeField(auto_now=True, db_index=True)), + ('create_time', models.DateTimeField(auto_now_add=True)), + ('save_id', models.UUIDField(default=uuid.uuid4)), + ('data_dump', models.TextField()), + ('shared', models.BooleanField(default=False)), + ('base64_image', models.ImageField(null=True, storage=django.core.files.storage.FileSystemStorage(base_url='/files', location='/code/file_storage'), upload_to='circuit_images')), + ('version', models.CharField(max_length=20)), + ('branch', models.CharField(max_length=20)), + ('is_arduino', models.BooleanField(default=False)), + ('is_submission', models.BooleanField(blank=True, null=True)), + ('esim_libraries', models.ManyToManyField(to='libAPI.Library')), + ('owner', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ('project', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='publishAPI.Project')), + ], + ), + migrations.CreateModel( + name='Gallery', + fields=[ + ('id', models.AutoField(primary_key=True, serialize=False)), + ('save_id', models.CharField(max_length=500, unique=True)), + ('data_dump', models.TextField()), + ('name', models.CharField(default='Untitled', max_length=100)), + ('description', models.CharField(max_length=1000)), + ('media', models.ImageField(null=True, storage=django.core.files.storage.FileSystemStorage(base_url='/files', location='/code/file_storage'), upload_to='circuit_images_esim')), + ('shared', models.BooleanField(default=True)), + ('save_time', models.DateTimeField(auto_now=True)), + ('is_arduino', models.BooleanField(default=False)), + ('esim_libraries', models.ManyToManyField(to='libAPI.Library')), + ], + ), + migrations.CreateModel( + name='ArduinoModelSimulationData', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('result', models.TextField(default=True, null=True)), + ('save_id', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='saveAPI.StateSave')), + ], + ), + ] diff --git a/esim-cloud-backend/saveAPI/migrations/0002_statesave_pinned.py b/esim-cloud-backend/saveAPI/migrations/0002_statesave_pinned.py new file mode 100644 index 000000000..d979b1da0 --- /dev/null +++ b/esim-cloud-backend/saveAPI/migrations/0002_statesave_pinned.py @@ -0,0 +1,18 @@ +# Generated by Django 2.2.12 on 2026-06-16 06:12 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('saveAPI', '0001_initial'), + ] + + operations = [ + migrations.AddField( + model_name='statesave', + name='pinned', + field=models.BooleanField(default=False), + ), + ] diff --git a/esim-cloud-backend/saveAPI/migrations/__init__.py b/esim-cloud-backend/saveAPI/migrations/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/esim-cloud-backend/simulationAPI/migrations/0001_initial.py b/esim-cloud-backend/simulationAPI/migrations/0001_initial.py new file mode 100644 index 000000000..78a602367 --- /dev/null +++ b/esim-cloud-backend/simulationAPI/migrations/0001_initial.py @@ -0,0 +1,64 @@ +# Generated by Django 2.2.12 on 2026-05-25 15:41 + +from django.conf import settings +import django.contrib.postgres.fields.jsonb +import django.core.files.storage +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('saveAPI', '0001_initial'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.CreateModel( + name='Limit', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('timeLimit', models.IntegerField()), + ], + ), + migrations.CreateModel( + name='runtimeStat', + fields=[ + ('exec_time', models.IntegerField(primary_key=True, serialize=False)), + ('qty', models.IntegerField(default=0)), + ], + ), + migrations.CreateModel( + name='Task', + fields=[ + ('task_time', models.DateTimeField(auto_now=True, db_index=True)), + ('task_id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)), + ], + ), + migrations.CreateModel( + name='spiceFile', + fields=[ + ('file_id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)), + ('file', models.FileField(storage=django.core.files.storage.FileSystemStorage(location='/code/file_storage'), upload_to='')), + ('upload_time', models.DateTimeField(auto_now=True, db_index=True)), + ('task', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='file', to='simulationAPI.Task')), + ], + ), + migrations.CreateModel( + name='simulation', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('simulation_type', models.CharField(blank=True, max_length=30, null=True)), + ('simulation_time', models.DateTimeField(auto_now_add=True)), + ('netlist', models.TextField()), + ('result', django.contrib.postgres.fields.jsonb.JSONField(blank=True, null=True)), + ('owner', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ('schematic', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='saveAPI.StateSave')), + ('task', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='simulationAPI.Task')), + ], + ), + ] diff --git a/esim-cloud-backend/workflowAPI/migrations/0001_initial.py b/esim-cloud-backend/workflowAPI/migrations/0001_initial.py new file mode 100644 index 000000000..8ea66f998 --- /dev/null +++ b/esim-cloud-backend/workflowAPI/migrations/0001_initial.py @@ -0,0 +1,66 @@ +# Generated by Django 2.2.12 on 2026-05-25 15:40 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('auth', '0011_update_proxy_permissions'), + ] + + operations = [ + migrations.CreateModel( + name='State', + fields=[ + ('id', models.AutoField(primary_key=True, serialize=False)), + ('name', models.CharField(max_length=200, unique=True)), + ('description', models.CharField(max_length=200, null=True)), + ('public', models.BooleanField(default=False)), + ('report', models.BooleanField(default=False)), + ], + ), + migrations.CreateModel( + name='Transition', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=100, null=True)), + ('restricted_for_creator', models.BooleanField(default=True, verbose_name='Transition allowed for all users of specified roles except creator')), + ('only_for_creator', models.BooleanField(default=False, verbose_name='Transition that ONLY the creator should be able to do it.')), + ('event_creator', models.CharField(blank=True, max_length=200, null=True, verbose_name='Event Text for the Creator')), + ('history_creator', models.CharField(blank=True, max_length=200, null=True, verbose_name='History Text for the Creator')), + ('event_reviewer', models.CharField(blank=True, max_length=200, null=True, verbose_name='Event Text for the Reviewer')), + ('history_reviewer', models.CharField(blank=True, max_length=200, null=True, verbose_name='History Text for the Reviewer')), + ('event_other', models.CharField(blank=True, max_length=200, null=True, verbose_name='Event Text for the Other User')), + ('history_other', models.CharField(blank=True, max_length=200, null=True, verbose_name='History Text for the Other User')), + ('from_state', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='fromtransitions', to='workflowAPI.State')), + ('role', models.ManyToManyField(related_name='role', to='auth.Group')), + ('to_state', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='totransitions', to='workflowAPI.State')), + ], + ), + migrations.CreateModel( + name='Permission', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('del_own_states', models.ManyToManyField(blank=True, related_name='del_own_states', to='workflowAPI.State', verbose_name='Can Delete own Project')), + ('edit_own_states', models.ManyToManyField(blank=True, related_name='edit_own_states', to='workflowAPI.State', verbose_name='Can Edit Details and Status own Project')), + ('role', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='permission_role', to='auth.Group')), + ('view_other_states', models.ManyToManyField(blank=True, related_name='view_other_states', to='workflowAPI.State', verbose_name='Can View other Project')), + ('view_own_states', models.ManyToManyField(blank=True, related_name='view_own_states', to='workflowAPI.State', verbose_name='Can View own Project')), + ], + ), + migrations.CreateModel( + name='CustomGroup', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('is_arduino', models.BooleanField(default=False)), + ('is_type_reviewer', models.BooleanField(default=False)), + ('is_type_staff', models.BooleanField(default=False)), + ('is_default_role', models.BooleanField(default=False)), + ('group', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to='auth.Group')), + ], + ), + ] diff --git a/esim-cloud-backend/workflowAPI/migrations/__init__.py b/esim-cloud-backend/workflowAPI/migrations/__init__.py new file mode 100644 index 000000000..e69de29bb