From 2a8d5f1978879fe6a4c62787e26e5c5944d5aefe Mon Sep 17 00:00:00 2001 From: Timofey Date: Mon, 18 Aug 2025 12:08:52 +0300 Subject: [PATCH] fix / AEB-21 migrations --- backend/requirements.txt | 15 +++ .../sitemanagement/migrations/0001_initial.py | 123 ++++++++++++++++++ 2 files changed, 138 insertions(+) create mode 100644 backend/requirements.txt create mode 100644 backend/sitemanagement/migrations/0001_initial.py diff --git a/backend/requirements.txt b/backend/requirements.txt new file mode 100644 index 0000000..018eba2 --- /dev/null +++ b/backend/requirements.txt @@ -0,0 +1,15 @@ +asgiref==3.9.1 +Django==5.2.4 +django-cors-headers==4.7.0 +djangorestframework==3.16.0 +dotenv==0.9.9 +iniconfig==2.1.0 +packaging==25.0 +pluggy==1.6.0 +psycopg2-binary==2.9.10 +pycodestyle==2.14.0 +Pygments==2.19.2 +pytest==8.4.1 +pytest-django==4.11.1 +python-dotenv==1.1.1 +sqlparse==0.5.3 diff --git a/backend/sitemanagement/migrations/0001_initial.py b/backend/sitemanagement/migrations/0001_initial.py new file mode 100644 index 0000000..908cced --- /dev/null +++ b/backend/sitemanagement/migrations/0001_initial.py @@ -0,0 +1,123 @@ +# Generated by Django 5.2.4 on 2025-08-18 09:02 + +import django.db.models.deletion +from decimal import Decimal +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='Multiplexor', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=50, unique=True)), + ('ip', models.GenericIPAddressField(blank=True, null=True)), + ('subnet', models.GenericIPAddressField(blank=True, null=True)), + ('gateway', models.GenericIPAddressField(blank=True, null=True)), + ('sd_path', models.CharField(blank=True, max_length=255, null=True)), + ], + ), + migrations.CreateModel( + name='SensorType', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('code', models.CharField(max_length=10, unique=True)), + ('name', models.CharField(max_length=100)), + ('description', models.TextField(blank=True, null=True)), + ('min_value', models.DecimalField(blank=True, decimal_places=4, max_digits=12, null=True)), + ('max_value', models.DecimalField(blank=True, decimal_places=4, max_digits=12, null=True)), + ], + ), + migrations.CreateModel( + name='Channel', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('number', models.PositiveSmallIntegerField()), + ('position', models.DecimalField(decimal_places=1, default=Decimal('1.0'), max_digits=4)), + ('multiplexor', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='channels', to='sitemanagement.multiplexor')), + ], + options={ + 'unique_together': {('multiplexor', 'number', 'position')}, + }, + ), + migrations.CreateModel( + name='Sensor', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('serial_number', models.CharField(blank=True, max_length=50, null=True)), + ('name', models.CharField(blank=True, max_length=50, null=True)), + ('channel', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='sensors', to='sitemanagement.channel')), + ('sensor_type', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='sitemanagement.sensortype')), + ], + ), + migrations.CreateModel( + name='Metric', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('timestamp', models.DateTimeField()), + ('raw_value', models.CharField(max_length=50)), + ('value', models.FloatField(blank=True, null=True)), + ('status', models.CharField(blank=True, max_length=20, null=True)), + ('sensor', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='metrics', to='sitemanagement.sensor')), + ], + ), + migrations.CreateModel( + name='Alert', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('message', models.CharField(max_length=255)), + ('severity', models.CharField(choices=[('warning', 'Warning'), ('critical', 'Critical')], default='warning', max_length=20)), + ('created_at', models.DateTimeField(auto_now_add=True)), + ('resolved', models.BooleanField(default=False)), + ('metric', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='alerts', to='sitemanagement.metric')), + ('sensor', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='alerts', to='sitemanagement.sensor')), + ('sensor_type', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='alerts', to='sitemanagement.sensortype')), + ], + ), + migrations.CreateModel( + name='SignalFormat', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('code', models.CharField(max_length=50)), + ('unit', models.CharField(blank=True, max_length=20, null=True)), + ('conversion_rule', models.CharField(blank=True, max_length=255, null=True)), + ('sensor_type', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='formats', to='sitemanagement.sensortype')), + ], + ), + migrations.AddField( + model_name='sensor', + name='signal_format', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='sitemanagement.signalformat'), + ), + migrations.AddIndex( + model_name='metric', + index=models.Index(fields=['timestamp'], name='sitemanagem_timesta_ac22b7_idx'), + ), + migrations.AddIndex( + model_name='metric', + index=models.Index(fields=['sensor'], name='sitemanagem_sensor__8d94ff_idx'), + ), + migrations.AddIndex( + model_name='alert', + index=models.Index(fields=['created_at'], name='sitemanagem_created_3e8f3a_idx'), + ), + migrations.AddIndex( + model_name='alert', + index=models.Index(fields=['sensor'], name='sitemanagem_sensor__ef8d7b_idx'), + ), + migrations.AddIndex( + model_name='alert', + index=models.Index(fields=['sensor_type'], name='sitemanagem_sensor__a5f1eb_idx'), + ), + migrations.AlterUniqueTogether( + name='signalformat', + unique_together={('sensor_type', 'code')}, + ), + ]