diff --git a/alembic/versions/0c66dabb0be9_takeofflanding_add_status_remove_.py b/alembic/versions/0c66dabb0be9_takeofflanding_add_status_remove_.py new file mode 100644 index 0000000..0c1c42e --- /dev/null +++ b/alembic/versions/0c66dabb0be9_takeofflanding_add_status_remove_.py @@ -0,0 +1,27 @@ +"""TakeoffLanding: add status, remove duration + +Revision ID: 0c66dabb0be9 +Revises: 5717cf8e17c +Create Date: 2016-10-31 17:54:24.170607 + +""" + +# revision identifiers, used by Alembic. +revision = '0c66dabb0be9' +down_revision = '5717cf8e17c' +branch_labels = None +depends_on = None + +from alembic import op +import sqlalchemy as sa + + +def upgrade(): + op.add_column('aircraft_beacon', sa.Column('status', sa.SmallInteger)) + op.create_index('ix_aircraft_beacon_status', 'aircraft_beacon', ['status']) + op.drop_column('takeoff_landing', 'duration') + + +def downgrade(): + op.drop_column('aircraft_beacon', 'status') + op.add_column('takeoff_landing', sa.Column('duration', sa.Interval)) diff --git a/ogn/collect/logbook.py b/ogn/collect/logbook.py index 753b693..2b7f282 100644 --- a/ogn/collect/logbook.py +++ b/ogn/collect/logbook.py @@ -51,8 +51,7 @@ def compute_logbook_entries(session=None): sq.c.timestamp.label('reftime'), sq.c.device_id.label('device_id'), sq.c.timestamp.label('takeoff_timestamp'), sq.c.track.label('takeoff_track'), sq.c.airport_id.label('takeoff_airport_id'), - sq.c.timestamp_next.label('landing_timestamp'), sq.c.track_next.label('landing_track'), sq.c.airport_id_next.label('landing_airport_id'), - label('duration', sq.c.timestamp_next - sq.c.timestamp)) \ + sq.c.timestamp_next.label('landing_timestamp'), sq.c.track_next.label('landing_track'), sq.c.airport_id_next.label('landing_airport_id')) \ .filter(and_(sq.c.is_takeoff == true(), sq.c.is_takeoff_next == false())) \ .filter(sq.c.device_id == sq.c.device_id_next) \ .filter(func.date(sq.c.timestamp_next) == func.date(sq.c.timestamp)) @@ -62,8 +61,7 @@ def compute_logbook_entries(session=None): sq.c.timestamp.label('reftime'), sq.c.device_id.label('device_id'), sq.c.timestamp.label('takeoff_timestamp'), sq.c.track.label('takeoff_track'), sq.c.airport_id.label('takeoff_airport_id'), - null().label('landing_timestamp'), null().label('landing_track'), null().label('landing_airport_id'), - null().label('duration')) \ + null().label('landing_timestamp'), null().label('landing_track'), null().label('landing_airport_id')) \ .filter(and_(sq.c.is_takeoff == true(), sq.c.is_takeoff_next == false())) \ .filter(sq.c.device_id == sq.c.device_id_next) \ .filter(func.date(sq.c.timestamp_next) != func.date(sq.c.timestamp)) @@ -72,8 +70,7 @@ def compute_logbook_entries(session=None): sq.c.timestamp_next.label('reftime'), sq.c.device_id.label('device_id'), null().label('takeoff_timestamp'), null().label('takeoff_track'), null().label('takeoff_airport_id'), - sq.c.timestamp_next.label('landing_timestamp'), sq.c.track_next.label('landing_track'), sq.c.airport_id_next.label('landing_airport_id'), - null().label('duration')) \ + sq.c.timestamp_next.label('landing_timestamp'), sq.c.track_next.label('landing_track'), sq.c.airport_id_next.label('landing_airport_id')) \ .filter(and_(sq.c.is_takeoff == true(), sq.c.is_takeoff_next == false())) \ .filter(sq.c.device_id == sq.c.device_id_next) \ .filter(func.date(sq.c.timestamp_next) != func.date(sq.c.timestamp)) @@ -83,8 +80,7 @@ def compute_logbook_entries(session=None): sq.c.timestamp.label('reftime'), sq.c.device_id.label('device_id'), null().label('takeoff_timestamp'), null().label('takeoff_track'), null().label('takeoff_airport_id'), - sq.c.timestamp.label('landing_timestamp'), sq.c.track.label('landing_track'), sq.c.airport_id.label('landing_airport_id'), - null().label('duration')) \ + sq.c.timestamp.label('landing_timestamp'), sq.c.track.label('landing_track'), sq.c.airport_id.label('landing_airport_id')) \ .filter(sq.c.is_takeoff == false()) \ .filter(or_(sq.c.device_id != sq.c.device_id_prev, sq.c.is_takeoff_prev == false(), @@ -95,8 +91,7 @@ def compute_logbook_entries(session=None): sq.c.timestamp.label('reftime'), sq.c.device_id.label('device_id'), sq.c.timestamp.label('takeoff_timestamp'), sq.c.track.label('takeoff_track'), sq.c.airport_id.label('takeoff_airport_id'), - null().label('landing_timestamp'), null().label('landing_track'), null().label('landing_airport_id'), - null().label('duration')) \ + null().label('landing_timestamp'), null().label('landing_track'), null().label('landing_airport_id')) \ .filter(sq.c.is_takeoff == true()) \ .filter(or_(sq.c.device_id != sq.c.device_id_next, sq.c.is_takeoff_next == true(), @@ -126,8 +121,7 @@ def compute_logbook_entries(session=None): "takeoff_airport_id": union_query.c.takeoff_airport_id, "landing_timestamp": union_query.c.landing_timestamp, "landing_track": union_query.c.landing_track, - "landing_airport_id": union_query.c.landing_airport_id, - "duration": union_query.c.duration}) + "landing_airport_id": union_query.c.landing_airport_id}) result = session.execute(upd) update_counter = result.rowcount @@ -154,8 +148,7 @@ def compute_logbook_entries(session=None): Logbook.takeoff_airport_id, Logbook.landing_timestamp, Logbook.landing_track, - Logbook.landing_airport_id, - Logbook.duration), + Logbook.landing_airport_id), new_logbook_entries) result = session.execute(ins) diff --git a/ogn/model/aircraft_beacon.py b/ogn/model/aircraft_beacon.py index c3740b1..2e86ee1 100644 --- a/ogn/model/aircraft_beacon.py +++ b/ogn/model/aircraft_beacon.py @@ -22,11 +22,11 @@ class AircraftBeacon(Beacon): software_version = Column(Float) hardware_version = Column(SmallInteger) real_address = Column(String(6)) - flightlevel = Column(Float) - signal_power = Column(Float) + status = Column(SmallInteger) + # Relations receiver_id = Column(Integer, ForeignKey('receiver.id', ondelete='SET NULL'), index=True) receiver = relationship('Receiver', foreign_keys=[receiver_id]) @@ -46,7 +46,7 @@ class AircraftBeacon(Beacon): self.address, self.climb_rate, self.turn_rate, - self.signal_strength, + self.signal_power, self.error_count, self.frequency_offset, self.gps_status) diff --git a/ogn/model/logbook.py b/ogn/model/logbook.py index 4902dcf..2a85977 100644 --- a/ogn/model/logbook.py +++ b/ogn/model/logbook.py @@ -1,7 +1,8 @@ -from sqlalchemy import Integer, DateTime, Interval, Column, ForeignKey +from sqlalchemy import Integer, DateTime, Interval, Column, ForeignKey, case, null from sqlalchemy.orm import relationship from .base import Base +from sqlalchemy.ext.hybrid import hybrid_property class Logbook(Base): @@ -14,7 +15,6 @@ class Logbook(Base): takeoff_track = Column(Integer) landing_timestamp = Column(DateTime) landing_track = Column(Integer) - duration = Column(Interval) max_altitude = Column(Integer) # Relations @@ -26,3 +26,11 @@ class Logbook(Base): device_id = Column(Integer, ForeignKey('device.id', ondelete='CASCADE'), index=True) device = relationship('Device', foreign_keys=[device_id]) + + @hybrid_property + def duration(self): + return None if (self.landing_timestamp is None or self.takeoff_timestamp is None) else self.landing_timestamp - self.takeoff_timestamp + + @duration.expression + def duration(cls): + return case({False: None, True: cls.landing_timestamp - cls.takeoff_timestamp}, cls.landing_timestamp != null() and cls.takeoff_timestamp != null())