def put(self, request, pk): """PUT allows updating status.""" try: user = User.objects.get(pk=int(pk)) except User.DoesNotExist: return HttpResponseBadRequest('Unknown team %s' % pk) try: data = json.loads(request.body) except ValueError: return HttpResponseBadRequest('Invalid JSON: %s' % request.body) # Potential events to update. takeoff_event = None clock_event = None # Update whether UAS is in air. if 'in_air' in data: in_air = data['in_air'] if not isinstance(in_air, bool): return HttpResponseBadRequest('in_air must be boolean') currently_in_air = TakeoffOrLandingEvent.user_in_air(user) # New event only necessary if changing status if currently_in_air != in_air: takeoff_event = TakeoffOrLandingEvent(user=user, uas_in_air=in_air) # Request was valid. Save updates. if takeoff_event: takeoff_event.save() if clock_event: clock_event.save() return HttpResponse(json.dumps(user_json(user)), content_type="application/json")
def test_user_in_air_second_flight(self): """In-air during second flight.""" self.create_event(self.year2000, True) self.create_event(self.year2000 + self.ten_minutes, False) self.create_event(self.year2001, True) self.assertTrue(TakeoffOrLandingEvent.user_in_air(self.user1))
def test_user_in_air_second_flight(self): """In-air during second flight.""" self.create_event(self.year2000, True) self.create_event(self.year2000 + self.ten_minutes, False) self.create_event(self.year2001, True) self.assertTrue(TakeoffOrLandingEvent.user_in_air(self.user1))
def test_user_in_air_time(self): """In-air base time check.""" self.create_event(self.year2000, True) self.create_event(self.year2000 + 2 * self.ten_minutes, False) time = self.year2000 + self.ten_minutes self.assertTrue(TakeoffOrLandingEvent.user_in_air(self.user1, time=time))
def user_json(user): """Generate JSON-style dict for user.""" telemetry = UasTelemetry.last_for_user(user) return { 'name': user.username, 'id': user.pk, 'in_air': TakeoffOrLandingEvent.user_in_air(user), 'telemetry': telemetry.json() if telemetry else None }
def test_user_in_air_time(self): """In-air base time check.""" self.create_event(self.year2000, True) self.create_event(self.year2000 + 2 * self.ten_minutes, False) time = self.year2000 + self.ten_minutes self.assertTrue( TakeoffOrLandingEvent.user_in_air(self.user1, time=time))
def put(self, request, pk): """PUT allows updating status.""" try: user = User.objects.get(pk=int(pk)) except User.DoesNotExist: return HttpResponseBadRequest('Unknown team %s' % pk) try: data = json.loads(request.body) except ValueError: return HttpResponseBadRequest('Invalid JSON: %s' % request.body) # Potential events to update. takeoff_event = None clock_event = None # Update whether UAS is in air. if 'in_air' in data: in_air = data['in_air'] if not isinstance(in_air, bool): return HttpResponseBadRequest('in_air must be boolean') currently_in_air = TakeoffOrLandingEvent.user_in_air(user) # New event only necessary if changing status if currently_in_air != in_air: takeoff_event = TakeoffOrLandingEvent( user=user, uas_in_air=in_air) # Update whether UAS in on clock or timeout. if 'on_clock' in data or 'on_timeout' in data: currently_on_clock = MissionClockEvent.user_on_clock(user) currently_on_timeout = MissionClockEvent.user_on_timeout(user) on_clock = data.get('on_clock', currently_on_clock) on_timeout = data.get('on_timeout', currently_on_timeout) if (not isinstance(on_clock, bool) or not isinstance(on_timeout, bool)): return HttpResponseBadRequest( 'on_clock and on_timeout must be boolean.') if on_clock and on_timeout: return HttpResponseBadRequest( 'Cannot be on mission clock and on timeout.') # New event only necessary if changing status if (on_clock != currently_on_clock or on_timeout != currently_on_timeout): clock_event = MissionClockEvent( user=user, team_on_clock=on_clock, team_on_timeout=on_timeout) # Request was valid. Save updates. if takeoff_event: takeoff_event.save() if clock_event: clock_event.save() return HttpResponse( json.dumps(user_json(user)), content_type="application/json")
def put(self, request, pk): """PUT allows updating status.""" try: user = User.objects.get(pk=int(pk)) except User.DoesNotExist: return HttpResponseBadRequest('Unknown team %s' % pk) try: data = json.loads(request.body) except ValueError: return HttpResponseBadRequest('Invalid JSON: %s' % request.body) # Potential events to update. takeoff_event = None clock_event = None # Update whether UAS is in air. if 'in_air' in data: in_air = data['in_air'] if not isinstance(in_air, bool): return HttpResponseBadRequest('in_air must be boolean') currently_in_air = TakeoffOrLandingEvent.user_in_air(user) # New event only necessary if changing status if currently_in_air != in_air: takeoff_event = TakeoffOrLandingEvent(user=user, uas_in_air=in_air) # Update whether UAS in on clock or timeout. if 'on_clock' in data or 'on_timeout' in data: currently_on_clock = MissionClockEvent.user_on_clock(user) currently_on_timeout = MissionClockEvent.user_on_timeout(user) on_clock = data.get('on_clock', currently_on_clock) on_timeout = data.get('on_timeout', currently_on_timeout) if (not isinstance(on_clock, bool) or not isinstance(on_timeout, bool)): return HttpResponseBadRequest( 'on_clock and on_timeout must be boolean.') if on_clock and on_timeout: return HttpResponseBadRequest( 'Cannot be on mission clock and on timeout.') # New event only necessary if changing status if (on_clock != currently_on_clock or on_timeout != currently_on_timeout): clock_event = MissionClockEvent(user=user, team_on_clock=on_clock, team_on_timeout=on_timeout) # Request was valid. Save updates. if takeoff_event: takeoff_event.save() if clock_event: clock_event.save() return HttpResponse( json.dumps(user_json(user)), content_type="application/json")
def user_json(user): """Generate JSON-style dict for user.""" telemetry = UasTelemetry.last_for_user(user) return { 'name': user.username, 'id': user.pk, 'on_clock': MissionClockEvent.user_on_clock(user), 'on_timeout': MissionClockEvent.user_on_timeout(user), 'in_air': TakeoffOrLandingEvent.user_in_air(user), 'telemetry': telemetry.json() if telemetry else None }
def team_proto(user): """Generate TeamStatus proto for team.""" team_status_proto = interop_admin_api_pb2.TeamStatus() team_status_proto.team = user.username team_status_proto.in_air = TakeoffOrLandingEvent.user_in_air(user) telemetry = UasTelemetry.last_for_user(user) if telemetry is not None: apos = telemetry.uas_position gpos = apos.gps_position telemetry_proto = team_status_proto.telemetry telemetry_proto.latitude = gpos.latitude telemetry_proto.longitude = gpos.longitude telemetry_proto.altitude = apos.altitude_msl telemetry_proto.heading = telemetry.uas_heading team_status_proto.telemetry_timestamp = telemetry.timestamp.isoformat() return team_status_proto
def team_proto(user): """Generate TeamStatus proto for team.""" team_status_proto = interop_admin_api_pb2.TeamStatus() team_status_proto.id = user.pk team_status_proto.team.username = user.username team_status_proto.team.name = user.first_name team_status_proto.team.university = user.last_name team_status_proto.in_air = TakeoffOrLandingEvent.user_in_air(user) telemetry = UasTelemetry.last_for_user(user) if telemetry is not None: telemetry_proto = team_status_proto.telemetry telemetry_proto.latitude = telemetry.latitude telemetry_proto.longitude = telemetry.longitude telemetry_proto.altitude = telemetry.altitude_msl telemetry_proto.heading = telemetry.uas_heading team_status_proto.telemetry_timestamp = telemetry.timestamp.isoformat() return team_status_proto
def test_user_in_air_after_landing(self): """Not in-air after landing.""" self.create_event(self.year2000, True) self.create_event(self.year2000 + self.ten_minutes, False) self.assertFalse(TakeoffOrLandingEvent.user_in_air(self.user1))
def test_user_in_air_after_landing(self): """Not in-air after landing.""" self.create_event(self.year2000, True) self.create_event(self.year2000 + self.ten_minutes, False) self.assertFalse(TakeoffOrLandingEvent.user_in_air(self.user1))
def test_user_in_air_before_landing(self): """In-air before landing.""" self.create_event(self.year2000, True) self.assertTrue(TakeoffOrLandingEvent.user_in_air(self.user1))
def test_user_in_air_no_logs(self): """Not in-air without logs.""" self.assertFalse(TakeoffOrLandingEvent.user_in_air(self.user1))
def test_user_in_air_no_logs(self): """Not in-air without logs.""" self.assertFalse(TakeoffOrLandingEvent.user_in_air(self.user1))
def test_user_in_air_before_landing(self): """In-air before landing.""" self.create_event(self.year2000, True) self.assertTrue(TakeoffOrLandingEvent.user_in_air(self.user1))