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

Wyświetl plik

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

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 .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())