Replace duration with hybrid_property and add status to AircraftBeacon

pull/68/head
Konstantin Gründger 2016-10-31 20:39:07 +01:00
rodzic 51ea4e2fad
commit 98db7fc5b3
4 zmienionych plików z 47 dodań i 19 usunięć

Wyświetl plik

@ -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))

Wyświetl plik

@ -51,8 +51,7 @@ def compute_logbook_entries(session=None):
sq.c.timestamp.label('reftime'), sq.c.timestamp.label('reftime'),
sq.c.device_id.label('device_id'), 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.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'), 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)) \
.filter(and_(sq.c.is_takeoff == true(), sq.c.is_takeoff_next == false())) \ .filter(and_(sq.c.is_takeoff == true(), sq.c.is_takeoff_next == false())) \
.filter(sq.c.device_id == sq.c.device_id_next) \ .filter(sq.c.device_id == sq.c.device_id_next) \
.filter(func.date(sq.c.timestamp_next) == func.date(sq.c.timestamp)) .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.timestamp.label('reftime'),
sq.c.device_id.label('device_id'), 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.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('landing_timestamp'), null().label('landing_track'), null().label('landing_airport_id')) \
null().label('duration')) \
.filter(and_(sq.c.is_takeoff == true(), sq.c.is_takeoff_next == false())) \ .filter(and_(sq.c.is_takeoff == true(), sq.c.is_takeoff_next == false())) \
.filter(sq.c.device_id == sq.c.device_id_next) \ .filter(sq.c.device_id == sq.c.device_id_next) \
.filter(func.date(sq.c.timestamp_next) != func.date(sq.c.timestamp)) .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.timestamp_next.label('reftime'),
sq.c.device_id.label('device_id'), sq.c.device_id.label('device_id'),
null().label('takeoff_timestamp'), null().label('takeoff_track'), null().label('takeoff_airport_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'), 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')) \
.filter(and_(sq.c.is_takeoff == true(), sq.c.is_takeoff_next == false())) \ .filter(and_(sq.c.is_takeoff == true(), sq.c.is_takeoff_next == false())) \
.filter(sq.c.device_id == sq.c.device_id_next) \ .filter(sq.c.device_id == sq.c.device_id_next) \
.filter(func.date(sq.c.timestamp_next) != func.date(sq.c.timestamp)) .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.timestamp.label('reftime'),
sq.c.device_id.label('device_id'), sq.c.device_id.label('device_id'),
null().label('takeoff_timestamp'), null().label('takeoff_track'), null().label('takeoff_airport_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'), sq.c.timestamp.label('landing_timestamp'), sq.c.track.label('landing_track'), sq.c.airport_id.label('landing_airport_id')) \
null().label('duration')) \
.filter(sq.c.is_takeoff == false()) \ .filter(sq.c.is_takeoff == false()) \
.filter(or_(sq.c.device_id != sq.c.device_id_prev, .filter(or_(sq.c.device_id != sq.c.device_id_prev,
sq.c.is_takeoff_prev == false(), sq.c.is_takeoff_prev == false(),
@ -95,8 +91,7 @@ def compute_logbook_entries(session=None):
sq.c.timestamp.label('reftime'), sq.c.timestamp.label('reftime'),
sq.c.device_id.label('device_id'), 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.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('landing_timestamp'), null().label('landing_track'), null().label('landing_airport_id')) \
null().label('duration')) \
.filter(sq.c.is_takeoff == true()) \ .filter(sq.c.is_takeoff == true()) \
.filter(or_(sq.c.device_id != sq.c.device_id_next, .filter(or_(sq.c.device_id != sq.c.device_id_next,
sq.c.is_takeoff_next == true(), 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, "takeoff_airport_id": union_query.c.takeoff_airport_id,
"landing_timestamp": union_query.c.landing_timestamp, "landing_timestamp": union_query.c.landing_timestamp,
"landing_track": union_query.c.landing_track, "landing_track": union_query.c.landing_track,
"landing_airport_id": union_query.c.landing_airport_id, "landing_airport_id": union_query.c.landing_airport_id})
"duration": union_query.c.duration})
result = session.execute(upd) result = session.execute(upd)
update_counter = result.rowcount update_counter = result.rowcount
@ -154,8 +148,7 @@ def compute_logbook_entries(session=None):
Logbook.takeoff_airport_id, Logbook.takeoff_airport_id,
Logbook.landing_timestamp, Logbook.landing_timestamp,
Logbook.landing_track, Logbook.landing_track,
Logbook.landing_airport_id, Logbook.landing_airport_id),
Logbook.duration),
new_logbook_entries) new_logbook_entries)
result = session.execute(ins) result = session.execute(ins)

Wyświetl plik

@ -22,11 +22,11 @@ class AircraftBeacon(Beacon):
software_version = Column(Float) software_version = Column(Float)
hardware_version = Column(SmallInteger) hardware_version = Column(SmallInteger)
real_address = Column(String(6)) real_address = Column(String(6))
flightlevel = Column(Float) flightlevel = Column(Float)
signal_power = Column(Float) signal_power = Column(Float)
status = Column(SmallInteger)
# Relations # Relations
receiver_id = Column(Integer, ForeignKey('receiver.id', ondelete='SET NULL'), index=True) receiver_id = Column(Integer, ForeignKey('receiver.id', ondelete='SET NULL'), index=True)
receiver = relationship('Receiver', foreign_keys=[receiver_id]) receiver = relationship('Receiver', foreign_keys=[receiver_id])
@ -46,7 +46,7 @@ class AircraftBeacon(Beacon):
self.address, self.address,
self.climb_rate, self.climb_rate,
self.turn_rate, self.turn_rate,
self.signal_strength, self.signal_power,
self.error_count, self.error_count,
self.frequency_offset, self.frequency_offset,
self.gps_status) self.gps_status)

Wyświetl plik

@ -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 sqlalchemy.orm import relationship
from .base import Base from .base import Base
from sqlalchemy.ext.hybrid import hybrid_property
class Logbook(Base): class Logbook(Base):
@ -14,7 +15,6 @@ class Logbook(Base):
takeoff_track = Column(Integer) takeoff_track = Column(Integer)
landing_timestamp = Column(DateTime) landing_timestamp = Column(DateTime)
landing_track = Column(Integer) landing_track = Column(Integer)
duration = Column(Interval)
max_altitude = Column(Integer) max_altitude = Column(Integer)
# Relations # Relations
@ -26,3 +26,11 @@ class Logbook(Base):
device_id = Column(Integer, ForeignKey('device.id', ondelete='CASCADE'), index=True) device_id = Column(Integer, ForeignKey('device.id', ondelete='CASCADE'), index=True)
device = relationship('Device', foreign_keys=[device_id]) 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())