# Generated by Django 6.0.2 on 2026-03-29 11:38 import django.db.models.deletion from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ ("bambu_run", "0002_filament_is_transparent"), ] operations = [ migrations.AddField( model_name="printjob", name="cloud_task_id_raw", field=models.BigIntegerField( blank=True, db_index=True, help_text="MQTT task_id — captured at job start, used to link cloud task", null=True, ), ), migrations.CreateModel( name="BambuCloudTask", fields=[ ( "id", models.BigAutoField( auto_created=True, primary_key=True, serialize=False, verbose_name="ID", ), ), ( "task_id", models.BigIntegerField( db_index=True, help_text="Bambu Cloud task ID (matches MQTT task_id)", unique=True, ), ), ( "design_id", models.IntegerField( blank=True, help_text="Makerworld design ID", null=True ), ), ( "design_title", models.CharField( blank=True, help_text="Human project name from Makerworld (designTitle)", max_length=500, ), ), ( "plate_title", models.CharField( blank=True, help_text="Plate/variant name (matches MQTT subtask_name)", max_length=500, ), ), ("model_id", models.CharField(blank=True, max_length=100)), ( "profile_id", models.BigIntegerField( blank=True, help_text="Bambu Cloud profile ID", null=True ), ), ("plate_index", models.SmallIntegerField(blank=True, null=True)), ( "device_serial", models.CharField( blank=True, help_text="Printer serial number from cloud", max_length=100, ), ), ( "cover_url", models.URLField( blank=True, help_text="Plate preview image URL from S3", max_length=1000, ), ), ( "weight_grams", models.DecimalField( blank=True, decimal_places=2, help_text="Actual filament weight reported by cloud", max_digits=8, null=True, ), ), ( "length_mm", models.IntegerField( blank=True, help_text="Filament length in mm", null=True ), ), ( "cost_time_seconds", models.IntegerField( blank=True, help_text="Cloud-measured print duration in seconds", null=True, ), ), ( "cloud_status", models.SmallIntegerField( blank=True, help_text="2=finish, 3=failed", null=True ), ), ("bed_type", models.CharField(blank=True, max_length=50)), ("use_ams", models.BooleanField(default=True)), ( "print_mode", models.CharField( blank=True, help_text="cloud_file, local, etc.", max_length=50 ), ), ( "ams_detail_mapping", models.JSONField( default=list, help_text="Per-slot filament weight breakdown from cloud", ), ), ("cloud_start_time", models.DateTimeField(blank=True, null=True)), ("cloud_end_time", models.DateTimeField(blank=True, null=True)), ( "raw_data", models.JSONField( default=dict, help_text="Full task response — preserved for future use", ), ), ("synced_at", models.DateTimeField(auto_now=True)), ], options={ "verbose_name": "Bambu Cloud Task", "verbose_name_plural": "Bambu Cloud Tasks", "db_table": "infrastructure_cloud_task", "ordering": ["-cloud_start_time"], "indexes": [ models.Index( fields=["task_id"], name="infrastruct_task_id_95b5ab_idx" ), models.Index( fields=["design_id"], name="infrastruct_design__88bdc0_idx" ), models.Index( fields=["-cloud_start_time"], name="infrastruct_cloud_s_4078b0_idx", ), ], }, ), migrations.AddField( model_name="printjob", name="cloud_task", field=models.ForeignKey( blank=True, help_text="Linked Bambu Cloud task record (set by bambu_sync_cloud or collector)", null=True, on_delete=django.db.models.deletion.SET_NULL, related_name="print_jobs", to="bambu_run.bambucloudtask", ), ), ]