From 95505c696e6980e4569d257d5b7bdcbc047ff659 Mon Sep 17 00:00:00 2001 From: Nik Sauer Date: Fri, 6 Dec 2024 15:49:47 +0100 Subject: [PATCH 01/11] use env db settings --- app/main/settings.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/app/main/settings.py b/app/main/settings.py index d8a1dcd..d41cf79 100644 --- a/app/main/settings.py +++ b/app/main/settings.py @@ -111,12 +111,12 @@ DATABASES = { 'default': { - "ENGINE": "django.db.backends.postgresql", - "NAME": "postgres", - "USER": "postgres", - "PASSWORD": "password", - "HOST": "db", - "PORT": 5432, + 'ENGINE': 'django.db.backends.postgresql', + 'NAME': env('POSTGRES_DB', default='postgres'), + 'USER': env('POSTGRES_USER', default='postgres'), + 'PASSWORD': env('POSTGRES_PASSWORD', default='password'), + 'HOST': env('DB_HOST', default='db'), + 'PORT': env('POSTGRES_PORT', default=5432), } } From f3492ef21054cff6d774336969e51926ebf3195d Mon Sep 17 00:00:00 2001 From: Nik Sauer Date: Mon, 9 Dec 2024 08:52:46 +0100 Subject: [PATCH 02/11] auto generate migrations --- ...el_remove_device_sensor_bme280_and_more.py | 90 +++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100644 app/devices/migrations/0004_alter_device_model_remove_device_sensor_bme280_and_more.py diff --git a/app/devices/migrations/0004_alter_device_model_remove_device_sensor_bme280_and_more.py b/app/devices/migrations/0004_alter_device_model_remove_device_sensor_bme280_and_more.py new file mode 100644 index 0000000..157d01e --- /dev/null +++ b/app/devices/migrations/0004_alter_device_model_remove_device_sensor_bme280_and_more.py @@ -0,0 +1,90 @@ +# Generated by Django 5.1.2 on 2024-12-09 07:47 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('devices', '0003_remove_device_name_device_device_name_and_more'), + ] + + operations = [ + migrations.AlterField( + model_name='device', + name='model', + field=models.CharField(blank=True, default=None, max_length=255), + preserve_default=False, + ), + migrations.RemoveField( + model_name='device', + name='sensor_bme280', + ), + migrations.RemoveField( + model_name='device', + name='sensor_bme680', + ), + migrations.RemoveField( + model_name='device', + name='sensor_sen5x', + ), + migrations.RemoveField( + model_name='sensor', + name='description', + ), + migrations.AddField( + model_name='device', + name='firmware', + field=models.CharField(blank=True, max_length=12), + ), + migrations.AddField( + model_name='sensor', + name='firmware', + field=models.CharField(blank=True, max_length=50), + ), + migrations.AddField( + model_name='sensor', + name='hardware', + field=models.CharField(blank=True, max_length=50), + ), + migrations.AddField( + model_name='sensor', + name='id', + field=models.AutoField(default=None, primary_key=True, serialize=False), + preserve_default=False, + ), + migrations.AddField( + model_name='sensor', + name='product_type', + field=models.CharField(blank=True, max_length=100), + ), + migrations.AddField( + model_name='sensor', + name='protocol', + field=models.CharField(blank=True, max_length=50), + ), + migrations.AddField( + model_name='sensor', + name='serial', + field=models.CharField(blank=True, max_length=100), + ), + migrations.AlterField( + model_name='device', + name='device_name', + field=models.CharField(blank=True, default=None, max_length=255), + preserve_default=False, + ), + migrations.AlterField( + model_name='device', + name='id', + field=models.CharField(max_length=255, primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='sensor', + name='name', + field=models.CharField(max_length=100), + ), + migrations.DeleteModel( + name='DeviceModel', + ), + ] From e3fdef094ff8cc22d6d5a0aec57b2a8d788ceee7 Mon Sep 17 00:00:00 2001 From: Nik Sauer Date: Mon, 9 Dec 2024 10:23:26 +0100 Subject: [PATCH 03/11] changed pk and fk --- app/api/migrations/0002_alter_fk.py | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 app/api/migrations/0002_alter_fk.py diff --git a/app/api/migrations/0002_alter_fk.py b/app/api/migrations/0002_alter_fk.py new file mode 100644 index 0000000..3ef94bb --- /dev/null +++ b/app/api/migrations/0002_alter_fk.py @@ -0,0 +1,27 @@ +# Generated by Django 5.1.2 on 2024-12-09 08:58 + +from django.db import migrations, models +from devices.models import Sensor + + +class Migration(migrations.Migration): + + dependencies = [ + ('api', '0001_initial'), + ('devices', '0004_alter_device_model_remove_device_sensor_bme280_and_more') + ] + # TODO: migrate data aswell + operations = [ + migrations.RemoveField( + model_name='measurement', + name='sensor', + ), + migrations.AddField( + model_name='measurement', + name='sensor', + field=models.ForeignKey( + to='devices.Sensor', + on_delete=models.CASCADE, + ), + ), + ] From cf21456e6eac0653d649deb52bfff10b94e7ddd5 Mon Sep 17 00:00:00 2001 From: Nik Sauer Date: Mon, 9 Dec 2024 11:49:42 +0100 Subject: [PATCH 04/11] added new tables specified in datahub_er_model.puml --- app/api/models.py | 43 +++++++++++++++++ app/campaign/models.py | 87 +++++++++++++++++++++++++++------- datahub_er_model.puml | 103 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 216 insertions(+), 17 deletions(-) create mode 100644 datahub_er_model.puml diff --git a/app/api/models.py b/app/api/models.py index feb4f99..70739b7 100644 --- a/app/api/models.py +++ b/app/api/models.py @@ -1,6 +1,7 @@ from django.db import models from workshops.models import Participant, Workshop from devices.models import Device, Sensor +from campaign.models import Room #from campaign.models import Campaign @@ -75,3 +76,45 @@ class AirQualityRecord(models.Model): lon = models.FloatField(null=True, blank=True) location_precision = models.FloatField(null=True, blank=True) mode = models.ForeignKey(MobilityMode, on_delete=models.CASCADE, null=True, blank=True) + + +class Measurement(models.Model): + """ + Measurement taken by a device in a room. + """ + id = models.IntegerField(primary_key=True) + time_received = models.DateTimeField() + time_measured = models.DateTimeField() + sensor_model = models.IntegerField() + device = models.ForeignKey(Device, on_delete=models.CASCADE) + room = models.ForeignKey(Room, on_delete=models.CASCADE) + + def __str__(self): + return f'Measurement {self.id} from Device {self.device.id}' + + +class Values(models.Model): + """ + Values associated with a measurement. + """ + id = models.IntegerField(primary_key=True) + dimension = models.IntegerField() + value = models.FloatField() + measurement = models.ForeignKey(Measurement, on_delete=models.CASCADE) + + def __str__(self): + return f'Value {self.id} for Measurement {self.measurement.id}' + + +class DeviceLogs(models.Model): + """ + Logs for each device. + """ + id = models.IntegerField(primary_key=True) + device = models.ForeignKey(Device, on_delete=models.CASCADE) + timestamp = models.DateTimeField() + level = models.IntegerField() + message = models.TextField() + + def __str__(self): + return f'Log {self.id} for Device {self.device.id}' \ No newline at end of file diff --git a/app/campaign/models.py b/app/campaign/models.py index 52b6f65..44008de 100644 --- a/app/campaign/models.py +++ b/app/campaign/models.py @@ -4,7 +4,11 @@ import random class Campaign(models.Model): - name = models.CharField(max_length=100) + """ + Represents a campaign. + """ + id = models.IntegerField(primary_key=True) + name = models.CharField(max_length=255) description = models.TextField(null=True, blank=True) start_date = models.DateTimeField() end_date = models.DateTimeField() @@ -13,25 +17,74 @@ class Campaign(models.Model): owner = models.ForeignKey( settings.AUTH_USER_MODEL, on_delete=models.CASCADE, - related_name='owned_campaigns', # Allows user.owned_campaigns.all() to get all owned workshops + related_name='owned_campaigns', null=True, blank=True ) + organization = models.ForeignKey( + 'Organization', + on_delete=models.CASCADE, + related_name='campaigns' + ) def __str__(self): return self.name - - def save(self, *args, **kwargs): - if not self.id_token: - # Generate a unique ID for new workshops - self.id_token = self.generate_id_token() - super(Campaign, self).save(*args, **kwargs) - - @staticmethod - def generate_id_token(): - length = 8 - # Ensure the generated ID is unique - while Campaign.objects.filter(id_token=id_token).exists(): - # Generate a random string of letters and digits - id_token = ''.join(random.choices(string.ascii_letters + string.digits, k=length)) - return id_token \ No newline at end of file + + +class Room(models.Model): + """ + Represents a room where a campaign takes place. + """ + campaign = models.ForeignKey('Campaign', on_delete=models.CASCADE, related_name='rooms') + name = models.CharField(max_length=255) + + class Meta: + unique_together = ('campaign', 'name') + + def __str__(self): + return f'{self.name} in {self.campaign}' + + +class Organization(models.Model): + """ + Represents an organization that owns campaigns and users can be part of. + """ + id = models.IntegerField(primary_key=True) + name = models.CharField(max_length=255) + description = models.TextField(null=True, blank=True) + owner = models.ForeignKey( + settings.AUTH_USER_MODEL, + on_delete=models.CASCADE, + related_name='owned_organizations' + ) + + def __str__(self): + return self.name + + +class UserOrganization(models.Model): + """ + Represents the many-to-many relationship between users and organizations. + """ + user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE) + organization = models.ForeignKey(Organization, on_delete=models.CASCADE) + + class Meta: + unique_together = ('user', 'organization') + + def __str__(self): + return f'{self.user} in {self.organization}' + + +class UserCampaign(models.Model): + """ + Represents the many-to-many relationship between users and campaigns. + """ + user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE) + campaign = models.ForeignKey('Campaign', on_delete=models.CASCADE) + + class Meta: + unique_together = ('user', 'campaign') + + def __str__(self): + return f'{self.user} in {self.campaign}' diff --git a/datahub_er_model.puml b/datahub_er_model.puml new file mode 100644 index 0000000..98067b5 --- /dev/null +++ b/datahub_er_model.puml @@ -0,0 +1,103 @@ +@startuml +entity "Device" as Device { + + id : String [PK] + + device_name : String + + model : String + + firmware : String + + btmac_address : String + + last_update : DateTime + + notes : Text +} + +entity "Measurement" as Measurement { + + id : Integer [PK] + + time_received : DateTime + + time_measured : DateTime + + sensor_model : Integer + -- + + device_id : String [FK] + + room_id : Integer [FK] +} + +entity "Values" as Values { + + id : Integer [PK] + + dimension : Integer + + value : Float + -- + + measurement_id : Integer [FK] +} + +entity "DeviceLogs" as DeviceLogs { + + id : Integer [PK] + + device_id : String [FK] + + timestamp : DateTime + + level : Integer + + message : String + -- + + device_id : String [FK] +} + +entity "Room" as Room { + + campaign_id : Integer [PK, FK] + + name : String [PK] + -- + + campaign_id : Integer [FK] +} + +entity "Campaign" as Campaign { + + id : Integer [PK] + + name : String + + description : Text + + start_date : DateTime + + end_date : DateTime + + public : Boolean + + id_token : String [unique] + + owner_id : Integer [FK] + -- + + owner_id : Integer [FK] +} + +entity "DeviceStatus" as DeviceStatus { + + id : Integer [PK] + + time_received : DateTime + + battery_voltage : Float + + battery_soc : Float + + sensors : JSON + -- + + device_id : String [FK] +} + +entity "Organization" as Organization { + + id : Integer [PK] + + name : String + + description : Text + -- + + owner_id : Integer [FK] +} + +entity "UserOrganization" as UserOrganization { + + id : Integer [PK] + -- + + user_id : Integer [FK] + + organization_id : Integer [FK] +} + +entity "UserCampaign" as UserCampaign { + + id : Integer [PK] + -- + + user_id : Integer [FK] + + campaign_id : Integer [FK] +} + +Device ||--o{ Measurement : "records" +Measurement ||--o{ Values : "has" +Device ||--o{ DeviceLogs : "logs" +Device ||--o{ DeviceStatus : "has status" +Measurement ||--o{ Room : "takes place in" +Campaign ||--o{ Room : "contains" +UserOrganization ||--o{ User : "user is part of" +UserOrganization ||--o{ Organization : "organization has users" +UserCampaign ||--o{ User : "user participates in" +UserCampaign ||--o{ Campaign : "campaign has users" +Campaign ||--o{ Organization : "organization has campaigns" +@enduml \ No newline at end of file From 957ffe3ae8b5267c770ce0275ad1fb28d99f591b Mon Sep 17 00:00:00 2001 From: Nik Sauer Date: Mon, 9 Dec 2024 11:54:25 +0100 Subject: [PATCH 05/11] changed name of new Measurement table to MeasurementNew --- app/api/models.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/api/models.py b/app/api/models.py index 70739b7..b8bb356 100644 --- a/app/api/models.py +++ b/app/api/models.py @@ -78,7 +78,7 @@ class AirQualityRecord(models.Model): mode = models.ForeignKey(MobilityMode, on_delete=models.CASCADE, null=True, blank=True) -class Measurement(models.Model): +class MeasurementNew(models.Model): """ Measurement taken by a device in a room. """ @@ -100,7 +100,7 @@ class Values(models.Model): id = models.IntegerField(primary_key=True) dimension = models.IntegerField() value = models.FloatField() - measurement = models.ForeignKey(Measurement, on_delete=models.CASCADE) + measurement = models.ForeignKey(MeasurementNew, on_delete=models.CASCADE) def __str__(self): return f'Value {self.id} for Measurement {self.measurement.id}' From d7c4289b2268877a28ec97e6bdc014627592d292 Mon Sep 17 00:00:00 2001 From: Nik Sauer Date: Mon, 9 Dec 2024 12:03:04 +0100 Subject: [PATCH 06/11] changed to custom migration --- ...model_remove_device_sensor_bme280_and_more.py | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/app/devices/migrations/0004_alter_device_model_remove_device_sensor_bme280_and_more.py b/app/devices/migrations/0004_alter_device_model_remove_device_sensor_bme280_and_more.py index 157d01e..c788b7f 100644 --- a/app/devices/migrations/0004_alter_device_model_remove_device_sensor_bme280_and_more.py +++ b/app/devices/migrations/0004_alter_device_model_remove_device_sensor_bme280_and_more.py @@ -7,6 +7,7 @@ class Migration(migrations.Migration): dependencies = [ ('devices', '0003_remove_device_name_device_device_name_and_more'), + ('api', '0001_initial') ] operations = [ @@ -47,12 +48,6 @@ class Migration(migrations.Migration): name='hardware', field=models.CharField(blank=True, max_length=50), ), - migrations.AddField( - model_name='sensor', - name='id', - field=models.AutoField(default=None, primary_key=True, serialize=False), - preserve_default=False, - ), migrations.AddField( model_name='sensor', name='product_type', @@ -79,11 +74,20 @@ class Migration(migrations.Migration): name='id', field=models.CharField(max_length=255, primary_key=True, serialize=False), ), + migrations.RunSQL( + "ALTER TABLE api_measurement DROP CONSTRAINT api_measurement_sensor_id_8039993a_fk_devices_sensor_name;", # PostgreSQL example + "ALTER TABLE api_measurement ADD CONSTRAINT api_measurement_sensor_id_8039993a_fk_devices_sensor_name FOREIGN KEY (sensor) REFERENCES devices_sensor(name);" + ), migrations.AlterField( model_name='sensor', name='name', field=models.CharField(max_length=100), ), + migrations.AddField( + model_name='sensor', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'), + ), migrations.DeleteModel( name='DeviceModel', ), From 21b7c20e78b812ed5c187c89b9f5deb5e76ee579 Mon Sep 17 00:00:00 2001 From: Nik Sauer Date: Mon, 9 Dec 2024 12:08:10 +0100 Subject: [PATCH 07/11] created and tested migrations --- .../0003_devicelogs_measurementnew_values.py | 46 ++++++++++++ ...ter_campaign_name_organization_and_more.py | 74 +++++++++++++++++++ .../migrations/0005_alter_sensor_id.py | 18 +++++ 3 files changed, 138 insertions(+) create mode 100644 app/api/migrations/0003_devicelogs_measurementnew_values.py create mode 100644 app/campaign/migrations/0002_alter_campaign_id_alter_campaign_name_organization_and_more.py create mode 100644 app/devices/migrations/0005_alter_sensor_id.py diff --git a/app/api/migrations/0003_devicelogs_measurementnew_values.py b/app/api/migrations/0003_devicelogs_measurementnew_values.py new file mode 100644 index 0000000..3a5a5ac --- /dev/null +++ b/app/api/migrations/0003_devicelogs_measurementnew_values.py @@ -0,0 +1,46 @@ +# Generated by Django 5.1.2 on 2024-12-09 11:06 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('api', '0002_alter_fk'), + ('campaign', '0002_alter_campaign_id_alter_campaign_name_organization_and_more'), + ('devices', '0005_alter_sensor_id'), + ] + + operations = [ + migrations.CreateModel( + name='DeviceLogs', + fields=[ + ('id', models.IntegerField(primary_key=True, serialize=False)), + ('timestamp', models.DateTimeField()), + ('level', models.IntegerField()), + ('message', models.TextField()), + ('device', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='devices.device')), + ], + ), + migrations.CreateModel( + name='MeasurementNew', + fields=[ + ('id', models.IntegerField(primary_key=True, serialize=False)), + ('time_received', models.DateTimeField()), + ('time_measured', models.DateTimeField()), + ('sensor_model', models.IntegerField()), + ('device', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='devices.device')), + ('room', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='campaign.room')), + ], + ), + migrations.CreateModel( + name='Values', + fields=[ + ('id', models.IntegerField(primary_key=True, serialize=False)), + ('dimension', models.IntegerField()), + ('value', models.FloatField()), + ('measurement', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='api.measurementnew')), + ], + ), + ] diff --git a/app/campaign/migrations/0002_alter_campaign_id_alter_campaign_name_organization_and_more.py b/app/campaign/migrations/0002_alter_campaign_id_alter_campaign_name_organization_and_more.py new file mode 100644 index 0000000..2828efb --- /dev/null +++ b/app/campaign/migrations/0002_alter_campaign_id_alter_campaign_name_organization_and_more.py @@ -0,0 +1,74 @@ +# Generated by Django 5.1.2 on 2024-12-09 11:06 + +import django.db.models.deletion +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('campaign', '0001_initial'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.AlterField( + model_name='campaign', + name='id', + field=models.IntegerField(primary_key=True, serialize=False), + ), + migrations.AlterField( + model_name='campaign', + name='name', + field=models.CharField(max_length=255), + ), + migrations.CreateModel( + name='Organization', + fields=[ + ('id', models.IntegerField(primary_key=True, serialize=False)), + ('name', models.CharField(max_length=255)), + ('description', models.TextField(blank=True, null=True)), + ('owner', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='owned_organizations', to=settings.AUTH_USER_MODEL)), + ], + ), + migrations.AddField( + model_name='campaign', + name='organization', + field=models.ForeignKey(default=None, on_delete=django.db.models.deletion.CASCADE, related_name='campaigns', to='campaign.organization'), + preserve_default=False, + ), + migrations.CreateModel( + name='Room', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=255)), + ('campaign', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='rooms', to='campaign.campaign')), + ], + options={ + 'unique_together': {('campaign', 'name')}, + }, + ), + migrations.CreateModel( + name='UserCampaign', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('campaign', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='campaign.campaign')), + ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ], + options={ + 'unique_together': {('user', 'campaign')}, + }, + ), + migrations.CreateModel( + name='UserOrganization', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('organization', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='campaign.organization')), + ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ], + options={ + 'unique_together': {('user', 'organization')}, + }, + ), + ] diff --git a/app/devices/migrations/0005_alter_sensor_id.py b/app/devices/migrations/0005_alter_sensor_id.py new file mode 100644 index 0000000..f795b4a --- /dev/null +++ b/app/devices/migrations/0005_alter_sensor_id.py @@ -0,0 +1,18 @@ +# Generated by Django 5.1.2 on 2024-12-09 11:06 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('devices', '0004_alter_device_model_remove_device_sensor_bme280_and_more'), + ] + + operations = [ + migrations.AlterField( + model_name='sensor', + name='id', + field=models.AutoField(primary_key=True, serialize=False), + ), + ] From e6fc0d81078c6abac834310a97612d8162b20f03 Mon Sep 17 00:00:00 2001 From: Nik Sauer Date: Mon, 9 Dec 2024 12:12:27 +0100 Subject: [PATCH 08/11] added pgadmin to test migration --- docker-compose.yml | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/docker-compose.yml b/docker-compose.yml index 6d5f79a..8e35623 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -23,5 +23,16 @@ services: - "80:80" depends_on: - app + admin: + image: dpage/pgadmin4:latest + env_file: + - .env + depends_on: + - db + volumes: + - pgadmin-data:/var/lib/pgadmin/ + ports: + - "8080:80" volumes: - postgres_data: \ No newline at end of file + postgres_data: + pgadmin-data: \ No newline at end of file From db8e41746833204a1bc646ec075363c5ffd2f8c8 Mon Sep 17 00:00:00 2001 From: Nik Sauer Date: Mon, 9 Dec 2024 14:36:28 +0100 Subject: [PATCH 09/11] exclude backup folder --- .gitignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index dbfd0bc..2b06ffc 100644 --- a/.gitignore +++ b/.gitignore @@ -154,4 +154,5 @@ dmypy.json cython_debug/ # docker compose production environment -docker-compose.prod.yml \ No newline at end of file +docker-compose.prod.yml +db_backup \ No newline at end of file From 47ed5229cf7ed67bd32f4f70889b9b5900fff665 Mon Sep 17 00:00:00 2001 From: Nik Sauer Date: Mon, 9 Dec 2024 15:07:18 +0100 Subject: [PATCH 10/11] fixed null error --- .../0003_devicelogs_measurementnew_values.py | 2 +- ...del_remove_device_sensor_bme280_and_more.py | 6 +++--- app/devices/migrations/0005_alter_sensor_id.py | 18 ------------------ app/devices/models.py | 4 ++-- docker-compose.yml | 1 + 5 files changed, 7 insertions(+), 24 deletions(-) delete mode 100644 app/devices/migrations/0005_alter_sensor_id.py diff --git a/app/api/migrations/0003_devicelogs_measurementnew_values.py b/app/api/migrations/0003_devicelogs_measurementnew_values.py index 3a5a5ac..a2be83f 100644 --- a/app/api/migrations/0003_devicelogs_measurementnew_values.py +++ b/app/api/migrations/0003_devicelogs_measurementnew_values.py @@ -9,7 +9,7 @@ class Migration(migrations.Migration): dependencies = [ ('api', '0002_alter_fk'), ('campaign', '0002_alter_campaign_id_alter_campaign_name_organization_and_more'), - ('devices', '0005_alter_sensor_id'), + ('devices', '0004_alter_device_model_remove_device_sensor_bme280_and_more'), ] operations = [ diff --git a/app/devices/migrations/0004_alter_device_model_remove_device_sensor_bme280_and_more.py b/app/devices/migrations/0004_alter_device_model_remove_device_sensor_bme280_and_more.py index c788b7f..02e258b 100644 --- a/app/devices/migrations/0004_alter_device_model_remove_device_sensor_bme280_and_more.py +++ b/app/devices/migrations/0004_alter_device_model_remove_device_sensor_bme280_and_more.py @@ -14,7 +14,7 @@ class Migration(migrations.Migration): migrations.AlterField( model_name='device', name='model', - field=models.CharField(blank=True, default=None, max_length=255), + field=models.CharField(blank=True, max_length=255, null=True), preserve_default=False, ), migrations.RemoveField( @@ -66,7 +66,7 @@ class Migration(migrations.Migration): migrations.AlterField( model_name='device', name='device_name', - field=models.CharField(blank=True, default=None, max_length=255), + field=models.CharField(blank=True, max_length=255, null=True), preserve_default=False, ), migrations.AlterField( @@ -86,7 +86,7 @@ class Migration(migrations.Migration): migrations.AddField( model_name='sensor', name='id', - field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'), + field=models.CharField(max_length=255, primary_key=True), ), migrations.DeleteModel( name='DeviceModel', diff --git a/app/devices/migrations/0005_alter_sensor_id.py b/app/devices/migrations/0005_alter_sensor_id.py deleted file mode 100644 index f795b4a..0000000 --- a/app/devices/migrations/0005_alter_sensor_id.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 5.1.2 on 2024-12-09 11:06 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('devices', '0004_alter_device_model_remove_device_sensor_bme280_and_more'), - ] - - operations = [ - migrations.AlterField( - model_name='sensor', - name='id', - field=models.AutoField(primary_key=True, serialize=False), - ), - ] diff --git a/app/devices/models.py b/app/devices/models.py index e037d60..8b20ed9 100644 --- a/app/devices/models.py +++ b/app/devices/models.py @@ -7,8 +7,8 @@ class Device(models.Model): Device model. """ id = models.CharField(max_length=255, primary_key=True) - device_name = models.CharField(max_length=255, blank=True) - model = models.CharField(max_length=255, blank=True) + device_name = models.CharField(max_length=255, blank=True, null=True) + model = models.CharField(max_length=255, blank=True, null=True) firmware = models.CharField(max_length=12, blank=True) btmac_address = models.CharField(max_length=12, null=True, blank=True) last_update = models.DateTimeField(null=True, blank=True) diff --git a/docker-compose.yml b/docker-compose.yml index 8e35623..b09957b 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -11,6 +11,7 @@ services: db: image: postgres:16-alpine volumes: + - ./db_backup/read:/docker-entrypoint-initdb.d/:ro - postgres_data:/var/lib/postgresql/data/ env_file: - .env From b4b7cede435e26ed8bf9242b3ce882c11b75930f Mon Sep 17 00:00:00 2001 From: Nik Sauer Date: Mon, 9 Dec 2024 15:18:09 +0100 Subject: [PATCH 11/11] fixed fk problem --- ...del_remove_device_sensor_bme280_and_more.py | 2 +- app/devices/migrations/0005_alter_sensor_id.py | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 app/devices/migrations/0005_alter_sensor_id.py diff --git a/app/devices/migrations/0004_alter_device_model_remove_device_sensor_bme280_and_more.py b/app/devices/migrations/0004_alter_device_model_remove_device_sensor_bme280_and_more.py index 02e258b..e8bc65f 100644 --- a/app/devices/migrations/0004_alter_device_model_remove_device_sensor_bme280_and_more.py +++ b/app/devices/migrations/0004_alter_device_model_remove_device_sensor_bme280_and_more.py @@ -86,7 +86,7 @@ class Migration(migrations.Migration): migrations.AddField( model_name='sensor', name='id', - field=models.CharField(max_length=255, primary_key=True), + field=models.AutoField(primary_key=True), ), migrations.DeleteModel( name='DeviceModel', diff --git a/app/devices/migrations/0005_alter_sensor_id.py b/app/devices/migrations/0005_alter_sensor_id.py new file mode 100644 index 0000000..f5c746d --- /dev/null +++ b/app/devices/migrations/0005_alter_sensor_id.py @@ -0,0 +1,18 @@ +# Generated by Django 5.1.2 on 2024-12-09 14:16 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('devices', '0004_alter_device_model_remove_device_sensor_bme280_and_more'), + ] + + operations = [ + migrations.AlterField( + model_name='sensor', + name='id', + field=models.AutoField(primary_key=True, serialize=False), + ), + ]