From 1d2e90f5467369252e5f521678c9ad4897095d44 Mon Sep 17 00:00:00 2001 From: nik <83764985+n11ik@users.noreply.github.com> Date: Mon, 24 Feb 2025 16:31:10 +0100 Subject: [PATCH] Revert "Revert "74 add seperate measurements table for calibration data"" --- ...93613bf91_calibrationmeasurement_added_.py | 32 ++++++++++++++ .../versions/e2dda8ce7cd2_fixed_name.py | 30 +++++++++++++ ...fd58_added_calibrationmeasurement_table.py | 42 +++++++++++++++++++ code/models.py | 20 +++++++++ code/routers/station.py | 36 +++++++++++----- code/schemas.py | 1 + 6 files changed, 150 insertions(+), 11 deletions(-) create mode 100644 code/alembic/versions/a0593613bf91_calibrationmeasurement_added_.py create mode 100644 code/alembic/versions/e2dda8ce7cd2_fixed_name.py create mode 100644 code/alembic/versions/fc8c3d3efd58_added_calibrationmeasurement_table.py diff --git a/code/alembic/versions/a0593613bf91_calibrationmeasurement_added_.py b/code/alembic/versions/a0593613bf91_calibrationmeasurement_added_.py new file mode 100644 index 0000000..e140128 --- /dev/null +++ b/code/alembic/versions/a0593613bf91_calibrationmeasurement_added_.py @@ -0,0 +1,32 @@ +"""CalibrationMeasurement added relationships + +Revision ID: a0593613bf91 +Revises: fc8c3d3efd58 +Create Date: 2025-02-24 14:37:56.645678 + +""" +from typing import Sequence, Union + +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision: str = 'a0593613bf91' +down_revision: Union[str, None] = 'fc8c3d3efd58' +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.add_column('values', sa.Column('calibration_measurement_id', sa.Integer(), nullable=True)) + op.create_foreign_key(None, 'values', 'calibration_measurements', ['calibration_measurement_id'], ['id']) + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.drop_constraint(None, 'values', type_='foreignkey') + op.drop_column('values', 'calibration_measurement_id') + # ### end Alembic commands ### diff --git a/code/alembic/versions/e2dda8ce7cd2_fixed_name.py b/code/alembic/versions/e2dda8ce7cd2_fixed_name.py new file mode 100644 index 0000000..42394f6 --- /dev/null +++ b/code/alembic/versions/e2dda8ce7cd2_fixed_name.py @@ -0,0 +1,30 @@ +"""Fixed name + +Revision ID: e2dda8ce7cd2 +Revises: a0593613bf91 +Create Date: 2025-02-24 14:40:49.184316 + +""" +from typing import Sequence, Union + +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision: str = 'e2dda8ce7cd2' +down_revision: Union[str, None] = 'a0593613bf91' +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + pass + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + pass + # ### end Alembic commands ### diff --git a/code/alembic/versions/fc8c3d3efd58_added_calibrationmeasurement_table.py b/code/alembic/versions/fc8c3d3efd58_added_calibrationmeasurement_table.py new file mode 100644 index 0000000..1d3fdf1 --- /dev/null +++ b/code/alembic/versions/fc8c3d3efd58_added_calibrationmeasurement_table.py @@ -0,0 +1,42 @@ +"""Added CalibrationMeasurement Table + +Revision ID: fc8c3d3efd58 +Revises: 80277768fe1d +Create Date: 2025-02-24 14:30:44.766046 + +""" +from typing import Sequence, Union + +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision: str = 'fc8c3d3efd58' +down_revision: Union[str, None] = '80277768fe1d' +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.create_table('calibration_measurements', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('time_received', sa.DateTime(), nullable=True), + sa.Column('time_measured', sa.DateTime(), nullable=True), + sa.Column('sensor_model', sa.Integer(), nullable=True), + sa.Column('location_id', sa.Integer(), nullable=True), + sa.Column('station_id', sa.Integer(), nullable=True), + sa.ForeignKeyConstraint(['location_id'], ['locations.id'], ), + sa.ForeignKeyConstraint(['station_id'], ['stations.id'], ), + sa.PrimaryKeyConstraint('id') + ) + op.create_index(op.f('ix_calibration_measurements_id'), 'calibration_measurements', ['id'], unique=False) + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.drop_index(op.f('ix_calibration_measurements_id'), table_name='calibration_measurements') + op.drop_table('calibration_measurements') + # ### end Alembic commands ### diff --git a/code/models.py b/code/models.py index a06f21e..653fb4d 100644 --- a/code/models.py +++ b/code/models.py @@ -59,6 +59,7 @@ class Location(Base): country = relationship("Country") stations = relationship("Station", back_populates="location") measurements = relationship("Measurement", back_populates="location") + calibration_measurements = relationship("CalibrationMeasurement", back_populates="location") class Station(Base): @@ -74,6 +75,7 @@ class Station(Base): location_id = Column(Integer, ForeignKey('locations.id')) location = relationship("Location", back_populates="stations") measurements = relationship("Measurement", back_populates="station") + calibration_measurements = relationship("CalibrationMeasurement", back_populates="station") hourly_avg = relationship("HourlyDimensionAverages", back_populates="station") stationStatus = relationship("StationStatus", back_populates="station") @@ -93,6 +95,21 @@ class Measurement(Base): values = relationship("Values", back_populates="measurement") +class CalibrationMeasurement(Base): + __tablename__ = "calibration_measurements" + + id = Column(Integer, primary_key=True, index=True) + time_received = Column(DateTime) + time_measured = Column(DateTime) + sensor_model = Column(Integer) + # Relationships: + location_id = Column(Integer, ForeignKey('locations.id')) + location = relationship("Location", back_populates="calibration_measurements") + station_id = Column(Integer, ForeignKey('stations.id')) + station = relationship("Station", back_populates="calibration_measurements") + values = relationship("Values", back_populates="calibration_measurement") + + class Values(Base): __tablename__ = "values" @@ -103,6 +120,9 @@ class Values(Base): measurement_id = Column(Integer, ForeignKey('measurements.id')) measurement = relationship("Measurement", back_populates="values") + calibration_measurement_id = Column(Integer, ForeignKey('calibration_measurements.id')) + calibration_measurement = relationship("CalibrationMeasurement", back_populates="values") + class StationStatus(Base): __tablename__ = "stationStatus" diff --git a/code/routers/station.py b/code/routers/station.py index b6c08fc..fdf5ca5 100644 --- a/code/routers/station.py +++ b/code/routers/station.py @@ -11,7 +11,7 @@ from enum import Enum from itertools import groupby -from models import Station, Location, Measurement, Values, StationStatus, HourlyDimensionAverages, City +from models import Station, Location, Measurement, CalibrationMeasurement, Values, StationStatus, HourlyDimensionAverages, City from schemas import StationDataCreate, SensorsCreate, StationStatusCreate from utils import get_or_create_location, download_csv, get_or_create_station, standard_output_to_csv, standard_output_to_json from enums import Precision, OutputFormat, Order, Dimension @@ -232,6 +232,11 @@ async def create_station_data( db: Session = Depends(get_db) ): + MeasurementClass = Measurement + + if station.calibration_mode: + MeasurementClass = CalibrationMeasurement + db_station = get_or_create_station( db = db, station = station @@ -243,10 +248,10 @@ async def create_station_data( # Durch alle Sensoren iterieren for sensor_id, sensor_data in sensors.root.items(): # Prüfen, ob bereits eine Messung mit dem gleichen time_measured und sensor_model existiert - existing_measurement = db.query(Measurement).filter( - Measurement.station_id == db_station.id, - Measurement.time_measured == station.time, - Measurement.sensor_model == sensor_data.type + existing_measurement = db.query(MeasurementClass).filter( + MeasurementClass.station_id == db_station.id, + MeasurementClass.time_measured == station.time, + MeasurementClass.sensor_model == sensor_data.type ).first() if existing_measurement: @@ -256,7 +261,7 @@ async def create_station_data( ) # Wenn keine bestehende Messung gefunden wurde, füge eine neue hinzu - db_measurement = Measurement( + db_measurement = MeasurementClass( sensor_model=sensor_data.type, station_id=db_station.id, time_measured=station.time, @@ -269,11 +274,20 @@ async def create_station_data( # Werte (dimension, value) für die Messung hinzufügen for dimension, value in sensor_data.data.items(): - db_value = Values( - dimension=dimension, - value=value, - measurement_id=db_measurement.id - ) + db_value = None + if station.calibration_mode: + db_value = Values( + dimension=dimension, + value=value, + calibration_measurement_id=db_measurement.id + ) + else: + db_value = Values( + dimension=dimension, + value=value, + measurement_id=db_measurement.id + ) + db.add(db_value) db_station.last_active = station.time diff --git a/code/schemas.py b/code/schemas.py index 65c1960..e2d2313 100644 --- a/code/schemas.py +++ b/code/schemas.py @@ -21,6 +21,7 @@ class StationDataCreate(BaseModel): apikey: str location: LocationCreate source: Optional[int] = 1 + calibration_mode: bool class SensorDataCreate(BaseModel):