def get_flight_path2(pilot, last_update=None): query = DBSession.query(TrackingFix) query = query.filter(and_(TrackingFix.pilot == pilot, TrackingFix.location != None, TrackingFix.altitude != None, TrackingFix.max_age_filter(12))) if pilot.tracking_delay > 0 and not pilot.is_readable(request.identity): query = query.filter(TrackingFix.delay_filter(pilot.tracking_delay)) query = query.order_by(TrackingFix.time) start_fix = query.first() if not start_fix: return None start_time = start_fix.time.hour * 3600 + start_fix.time.minute * 60 + start_fix.time.second if last_update: query = query.filter(TrackingFix.time >= start_fix.time + timedelta(seconds=(last_update - start_time))) result = [] for fix in query: location = fix.location if location is None: continue time_delta = fix.time - start_fix.time time = start_time + time_delta.days * 86400 + time_delta.seconds result.append((time, location.latitude, location.longitude, fix.altitude, fix.engine_noise_level)) return result
def _get_flight_path2(pilot, last_update=None): query = TrackingFix.query() \ .filter(and_(TrackingFix.pilot == pilot, TrackingFix.location != None, TrackingFix.altitude != None, TrackingFix.max_age_filter(12))) if pilot.tracking_delay > 0 and not pilot.is_readable(g.current_user): query = query.filter(TrackingFix.delay_filter(pilot.tracking_delay)) query = query.order_by(TrackingFix.time) start_fix = query.first() if not start_fix: return None start_time = start_fix.time.hour * 3600 + start_fix.time.minute * 60 + start_fix.time.second if last_update: query = query.filter(TrackingFix.time >= start_fix.time + timedelta(seconds=(last_update - start_time))) result = [] for fix in query: location = fix.location if location is None: continue time_delta = fix.time - start_fix.time time = start_time + time_delta.days * 86400 + time_delta.seconds result.append((time, location.latitude, location.longitude, fix.altitude, fix.engine_noise_level, fix.elevation)) return result
def _get_flight_path2(pilot, last_update=None): query = TrackingFix.query().filter( and_( TrackingFix.pilot == pilot, TrackingFix.location != None, TrackingFix.altitude != None, TrackingFix.max_age_filter(12), TrackingFix.time_visible <= datetime.utcnow(), ) ) query = query.order_by(TrackingFix.time) start_fix = query.first() if not start_fix: return None start_time = ( start_fix.time.hour * 3600 + start_fix.time.minute * 60 + start_fix.time.second ) if last_update: query = query.filter( TrackingFix.time >= start_fix.time + timedelta(seconds=(last_update - start_time)) ) result = [] for fix in query: location = fix.location if location is None: continue time_delta = fix.time - start_fix.time time = start_time + time_delta.days * 86400 + time_delta.seconds result.append( FlightPathFix( datetime=fix.time, seconds_of_day=time, location={ "latitude": location.latitude, "longitude": location.longitude, }, gps_altitude=fix.altitude, enl=fix.engine_noise_level, track=fix.track, groundspeed=fix.ground_speed, tas=fix.airspeed, elevation=fix.elevation, ) ) return result
def _get_flight_path2(pilot, last_update=None): query = TrackingFix.query().filter( and_( TrackingFix.pilot == pilot, TrackingFix.location != None, TrackingFix.altitude != None, TrackingFix.max_age_filter(12), TrackingFix.time_visible <= datetime.utcnow(), )) query = query.order_by(TrackingFix.time) start_fix = query.first() if not start_fix: return None start_time = (start_fix.time.hour * 3600 + start_fix.time.minute * 60 + start_fix.time.second) if last_update: query = query.filter(TrackingFix.time >= start_fix.time + timedelta(seconds=(last_update - start_time))) result = [] for fix in query: location = fix.location if location is None: continue time_delta = fix.time - start_fix.time time = start_time + time_delta.days * 86400 + time_delta.seconds result.append( FlightPathFix( datetime=fix.time, seconds_of_day=time, location={ "latitude": location.latitude, "longitude": location.longitude, }, gps_altitude=fix.altitude, enl=fix.engine_noise_level, track=fix.track, groundspeed=fix.ground_speed, tas=fix.airspeed, elevation=fix.elevation, )) return result
def _get_flight_path2(pilot, last_update=None): query = TrackingFix.query() \ .filter(and_(TrackingFix.pilot == pilot, TrackingFix.location != None, TrackingFix.altitude != None, TrackingFix.max_age_filter(12))) if pilot.tracking_delay > 0 and not pilot.is_readable(g.current_user): query = query.filter(TrackingFix.delay_filter(pilot.tracking_delay)) query = query.order_by(TrackingFix.time) start_fix = query.first() if not start_fix: return None start_time = start_fix.time.hour * 3600 + start_fix.time.minute * 60 + start_fix.time.second if last_update: query = query.filter(TrackingFix.time >= start_fix.time + timedelta(seconds=(last_update - start_time))) result = [] for fix in query: location = fix.location if location is None: continue time_delta = fix.time - start_fix.time time = start_time + time_delta.days * 86400 + time_delta.seconds result.append(FlightPathFix(datetime=fix.time, seconds_of_day=time, location={'latitude': location.latitude, 'longitude': location.longitude}, gps_altitude=fix.altitude, enl=fix.engine_noise_level, track=fix.track, groundspeed=fix.ground_speed, tas=fix.airspeed, elevation=fix.elevation)) return result
def trafficRequestReceived(self, host, port, key, payload): if len(payload) != 8: return pilot = User.by_tracking_key(key) if pilot is None: log("%s TRAFFIC_REQUEST unknown pilot (key: %x)" % (host, key)) return data = struct.unpack('!II', payload) or_filters = [] flags = data[0] if flags & TRAFFIC_FLAG_FOLLOWEES: subq = db.session \ .query(Follower.destination_id) \ .filter(Follower.source_id == pilot.id) \ .subquery() or_filters.append(TrackingFix.pilot_id.in_(subq)) if flags & TRAFFIC_FLAG_CLUB: subq = db.session \ .query(User.id) \ .filter(User.club_id == pilot.club_id) \ .subquery() or_filters.append(TrackingFix.pilot_id.in_(subq)) if len(or_filters) == 0: return # Add a db.Column to the inner query with # numbers ordered by time for each pilot row_number = db.over(db.func.row_number(), partition_by=TrackingFix.pilot_id, order_by=TrackingFix.time.desc()) # Create inner query subq = db.session \ .query(TrackingFix.id, row_number.label('row_number')) \ .join(TrackingFix.pilot) \ .filter(TrackingFix.pilot_id != pilot.id) \ .filter(TrackingFix.max_age_filter(2)) \ .filter(TrackingFix.delay_filter(User.tracking_delay_interval())) \ .filter(TrackingFix.location_wkt != None) \ .filter(TrackingFix.altitude != None) \ .filter(or_(*or_filters)) \ .subquery() # Create outer query that orders by time and # only selects the latest fix query = TrackingFix.query() \ .filter(TrackingFix.id == subq.c.id) \ .filter(subq.c.row_number == 1) \ .order_by(TrackingFix.time.desc()) \ .limit(32) response = '' count = 0 for fix in query: location = fix.location if location is None: continue t = fix.time t = t.hour * 3600000 + t.minute * 60000 + t.second * 1000 + t.microsecond / 1000 response += struct.pack('!IIiihHI', fix.pilot_id, t, int(location.latitude * 1000000), int(location.longitude * 1000000), int(fix.altitude), 0, 0) count += 1 response = struct.pack('!HBBI', 0, 0, count, 0) + response response = struct.pack('!IHHQ', MAGIC, 0, TYPE_TRAFFIC_RESPONSE, 0) + response response = set_crc(response) self.socket.sendto(response, (host, port)) log("%s TRAFFIC_REQUEST %s -> %d locations" % (host, unicode(pilot).encode('utf8', 'ignore'), count))
def trafficRequestReceived(self, host, port, key, payload): if len(payload) != 8: return pilot = User.by_tracking_key(key) if pilot is None: log("%s TRAFFIC_REQUEST unknown pilot (key: %x)" % (host, key)) return data = struct.unpack('!II', payload) or_filters = [] flags = data[0] if flags & TRAFFIC_FLAG_FOLLOWEES: subq = db.session \ .query(Follower.destination_id) \ .filter(Follower.source_id == pilot.id) \ .subquery() or_filters.append(TrackingFix.pilot_id.in_(subq)) if flags & TRAFFIC_FLAG_CLUB: subq = db.session \ .query(User.id) \ .filter(User.club_id == pilot.club_id) \ .subquery() or_filters.append(TrackingFix.pilot_id.in_(subq)) if len(or_filters) == 0: return # Add a db.Column to the inner query with # numbers ordered by time for each pilot row_number = db.over(db.func.row_number(), partition_by=TrackingFix.pilot_id, order_by=TrackingFix.time.desc()) # Create inner query subq = db.session \ .query(TrackingFix.id, row_number.label('row_number')) \ .join(TrackingFix.pilot) \ .filter(TrackingFix.pilot_id != pilot.id) \ .filter(TrackingFix.max_age_filter(2)) \ .filter(TrackingFix.delay_filter(User.tracking_delay_interval())) \ .filter(TrackingFix.location_wkt != None) \ .filter(TrackingFix.altitude != None) \ .filter(or_(*or_filters)) \ .subquery() # Create outer query that orders by time and # only selects the latest fix query = TrackingFix.query() \ .filter(TrackingFix.id == subq.c.id) \ .filter(subq.c.row_number == 1) \ .order_by(TrackingFix.time.desc()) \ .limit(32) response = '' count = 0 for fix in query: location = fix.location if location is None: continue t = fix.time t = t.hour * 3600000 + t.minute * 60000 + t.second * 1000 + t.microsecond / 1000 response += struct.pack('!IIiihHI', fix.pilot_id, t, int(location.latitude * 1000000), int(location.longitude * 1000000), int(fix.altitude), 0, 0) count += 1 response = struct.pack('!HBBI', 0, 0, count, 0) + response response = struct.pack('!IHHQ', MAGIC, 0, TYPE_TRAFFIC_RESPONSE, 0) + response response = set_crc(response) self.socket.sendto(response, (host, port)) log("%s TRAFFIC_REQUEST %s -> %d locations" % (host, unicode(pilot).encode('utf8', 'ignore'), count))