def post(self, request): # Attempt authentication try: username = request.POST['username'] password = request.POST['password'] except KeyError: # Failed to get POST parameters, invalid request logger.warning( 'Did not specify username & password in login request.') return HttpResponseBadRequest( 'Login must be POST request with ' '"username" and "password" parameters.') # Use credentials to authenticate user = authenticate(username=username, password=password) if user is not None and user.is_active: # Successful authentication with active user, login login(request, user) logger.info('User logged in: %s.' % user.username) return HttpResponse('Login Successful.') else: # Invalid user credentials, invalid request logger.warning('Invalid credentials in login request.') logger.debug(request) return HttpResponseBadRequest('Invalid Credentials.')
def get(self, request): logger.info('Admin downloading team evaluation.') # Get the mission to evaluate a team for. mission, error = mission_for_request(request.GET) if error: logger.warning('Could not get mission to evaluate teams.') return error # Get the optional team to eval. users = None if 'team' in request.GET: try: team = int(request.GET['team']) users = [User.objects.get(pk=team)] except TypeError: return HttpResponseBadRequest('Team not an ID.') except User.DoesNotExist: return HttpResponseNotFound('Team not found.') # Get the eval data for the teams user_eval_data = mission.evaluate_teams(users) if not user_eval_data: logger.warning('No data for team evaluation.') return HttpResponseServerError( 'Could not get user evaluation data.') # Convert to username key-d map. user_eval_data = {u.username: d for u, d in user_eval_data.iteritems()} return self.format_response(user_eval_data)
def get(self, request): logger.info('Admin downloaded team evaluation.') # Get the mission to evaluate a team for. mission, error = mission_for_request(request.GET) if error: logger.warning('Could not get mission to evaluate teams.') return error # Get the eval data for the teams user_eval_data = mission.evaluate_teams() if not user_eval_data: logger.warning('No data for team evaluation.') return HttpResponseServerError( 'Could not get user evaluation data.') # Reformat to column oriented user_col_data = {} for (user, eval_data) in user_eval_data.iteritems(): col_data = user_col_data.setdefault(user, {}) col_data['username'] = user.username work_queue = [([], eval_data)] while len(work_queue) > 0: (cur_prefixes, cur_map) = work_queue.pop() for (key, val) in cur_map.iteritems(): new_prefixes = copy.copy(cur_prefixes) new_prefixes.append(str(key)) if isinstance(val, dict): work_queue.append((new_prefixes, val)) else: column_key = '.'.join(new_prefixes) if isinstance(val, list): col_data[column_key] = ','.join(val) else: col_data[column_key] = val # Get column headers col_headers = set() for col_data in user_col_data.values(): for header in col_data.keys(): col_headers.add(header) col_headers = sorted(col_headers) # Write output csv_output = cStringIO.StringIO() writer = csv.DictWriter(csv_output, fieldnames=col_headers) writer.writeheader() for col_data in user_col_data.values(): writer.writerow(col_data) output = csv_output.getvalue() csv_output.close() return HttpResponse(output)
def get(self, request): logger.info('Admin downloaded team evaluation.') # Get the mission to evaluate a team for. mission, error = mission_for_request(request.GET) if error: logger.warning('Could not get mission to evaluate teams.') return error # Get the eval data for the teams user_eval_data = mission.evaluate_teams() if not user_eval_data: logger.warning('No data for team evaluation.') return HttpResponseServerError( 'Could not get user evaluation data.') # Reformat to column oriented user_col_data = {} for (user, eval_data) in user_eval_data.iteritems(): col_data = user_col_data.setdefault(user, {}) col_data['username'] = user.username work_queue = [([], eval_data)] while len(work_queue) > 0: (cur_prefixes, cur_map) = work_queue.pop() for (key, val) in cur_map.iteritems(): new_prefixes = copy.copy(cur_prefixes) new_prefixes.append(str(key)) if isinstance(val, dict): work_queue.append((new_prefixes, val)) else: column_key = '.'.join(new_prefixes) if isinstance(val, list): col_data[column_key] = ','.join(val) else: col_data[column_key] = val # Get column headers col_headers = set() for col_data in user_col_data.values(): for header in col_data.keys(): col_headers.add(header) col_headers = sorted(col_headers) # Write output csv_output = cStringIO.StringIO() writer = csv.DictWriter(csv_output, fieldnames=col_headers) writer.writeheader() for col_data in user_col_data.values(): writer.writerow(col_data) output = csv_output.getvalue() csv_output.close() return HttpResponse(output, content_type='text/csv')
def get(self, request): logger.info('Admin downloading team evaluation.') # Get the mission to evaluate a team for. mission, error = mission_for_request(request.GET) if error: logger.warning('Could not get mission to evaluate teams.') return error # Get the optional team to eval. users = None if 'team' in request.GET: try: team = int(request.GET['team']) users = [User.objects.get(pk=team)] except TypeError: return HttpResponseBadRequest('Team not an ID.') except User.DoesNotExist: return HttpResponseNotFound('Team not found.') # Get the eval data for the teams. mission_eval = mission_evaluation.evaluate_teams(mission, users) if not mission_eval: logger.warning('No data for team evaluation.') return HttpResponseServerError( 'Could not get user evaluation data.') # Form Zip file. zip_io = cStringIO.StringIO() with zipfile.ZipFile(zip_io, 'w') as zip_file: zip_file.writestr( '/evaluate_teams/all.json', self.pretty_json(json_format.MessageToJson(mission_eval))) team_jsons = [] for team_eval in mission_eval.teams: team_json = self.pretty_json( json_format.MessageToJson(team_eval)) zip_file.writestr( '/evaluate_teams/teams/%s.json' % team_eval.team, team_json) team_jsons.append(team_json) zip_file.writestr('/evaluate_teams/all.csv', self.csv_from_json(team_jsons)) zip_output = zip_io.getvalue() zip_io.close() return HttpResponse(zip_output, content_type='application/zip')
def get(self, request): logger.info('Admin downloading team evaluation.') # Get the mission to evaluate a team for. mission, error = mission_for_request(request.GET) if error: logger.warning('Could not get mission to evaluate teams.') return error # Get the optional team to eval. users = None if 'team' in request.GET: try: team = int(request.GET['team']) users = [User.objects.get(pk=team)] except TypeError: return HttpResponseBadRequest('Team not an ID.') except User.DoesNotExist: return HttpResponseNotFound('Team not found.') # Get the eval data for the teams. mission_eval = mission_evaluation.evaluate_teams(mission, users) if not mission_eval: logger.warning('No data for team evaluation.') return HttpResponseServerError( 'Could not get user evaluation data.') # Form Zip file. zip_io = cStringIO.StringIO() with zipfile.ZipFile(zip_io, 'w') as zip_file: zip_file.writestr( '/evaluate_teams/all.json', self.pretty_json(json_format.MessageToJson(mission_eval))) team_jsons = [] for team_eval in mission_eval.teams: team_json = self.pretty_json(json_format.MessageToJson( team_eval)) zip_file.writestr('/evaluate_teams/teams/%s.json' % team_eval.team, team_json) team_jsons.append(team_json) zip_file.writestr('/evaluate_teams/all.csv', self.csv_from_json(team_jsons)) zip_output = zip_io.getvalue() zip_io.close() return HttpResponse(zip_output, content_type='application/zip')
def delete(self, request, pk): try: target = find_target(request, int(pk)) except Target.DoesNotExist: return HttpResponseNotFound('Target %s not found' % pk) except ValueError as e: return HttpResponseForbidden(str(e)) # Remember the thumbnail path so we can delete it from disk. thumbnail = target.thumbnail.path if target.thumbnail else None target.delete() if thumbnail: try: os.remove(thumbnail) except OSError as e: logger.warning("Unable to delete thumbnail: %s", e) return HttpResponse("Target deleted.")
def delete(self, request, pk): try: target = find_target(request, int(pk)) except Target.DoesNotExist: return HttpResponseNotFound('Target %s not found' % pk) except ValueError as e: return HttpResponseForbidden(str(e)) if not target.thumbnail or not target.thumbnail.path: return HttpResponseNotFound('Target %s has no image' % pk) path = target.thumbnail.path # Remove the thumbnail from the target. # Note that this does not delete it from disk! target.thumbnail.delete() try: os.remove(path) except OSError as e: logger.warning("Unable to delete thumbnail: %s", e) return HttpResponse("Image deleted.")
def post(self, request, pk): try: target = find_target(request, int(pk)) except Target.DoesNotExist: return HttpResponseNotFound('Target %s not found' % pk) except ValueError as e: return HttpResponseForbidden(str(e)) # Request body is the file f = io.BytesIO(request.body) # Verify that this is a valid image try: i = Image.open(f) i.verify() except IOError as e: return HttpResponseBadRequest(str(e)) if i.format not in ['JPEG', 'PNG']: return HttpResponseBadRequest( 'Invalid image format %s, only JPEG and PNG allowed' % i.format) old_path = target.thumbnail.path if target.thumbnail else None target.thumbnail.save('%d.%s' % (target.pk, i.format), ImageFile(f)) if old_path and target.thumbnail.path != old_path: # We didn't overwrite the old thumbnail, we should delete it, # but ignore deletion errors. try: os.remove(old_path) except OSError as e: logger.warning("Unable to delete old thumbnail: %s", e) return HttpResponse("Image uploaded.")
def post(self, request): """Posts the UAS position with a POST request. User must send a POST request with the following paramters: latitude: A latitude in decimal degrees. longitude: A logitude in decimal degrees. altitude_msl: An MSL altitude in decimal feet. uas_heading: The UAS (true north) heading in decimal degrees. """ try: # Get the parameters latitude = float(request.POST['latitude']) longitude = float(request.POST['longitude']) altitude_msl = float(request.POST['altitude_msl']) uas_heading = float(request.POST['uas_heading']) except KeyError: # Failed to get POST parameters logger.warning( 'User did not specify all params for uas telemetry request.') logger.debug(request) return HttpResponseBadRequest( 'Posting UAS position must contain POST parameters "latitude", ' '"longitude", "altitude_msl", and "uas_heading".') except ValueError: # Failed to convert parameters logger.warning( 'User specified a param which could not converted to an ' + 'appropriate type.') logger.debug(request) return HttpResponseBadRequest( 'Failed to convert provided POST parameters to correct form.') else: # Check the values make sense if latitude < -90 or latitude > 90: logger.warning('User specified latitude out of valid range.') logger.debug(request) return HttpResponseBadRequest( 'Must provide latitude between -90 and 90 degrees.') if longitude < -180 or longitude > 180: logger.warning('User specified longitude out of valid range.') logger.debug(request) return HttpResponseBadRequest( 'Must provide longitude between -180 and 180 degrees.') if uas_heading < 0 or uas_heading > 360: logger.warning('User specified altitude out of valid range.') logger.debug(request) return HttpResponseBadRequest( 'Must provide heading between 0 and 360 degrees.') # Store telemetry logger.info('User uploaded telemetry: %s' % request.user.username) gpos = GpsPosition(latitude=latitude, longitude=longitude) gpos.save() apos = AerialPosition(gps_position=gpos, altitude_msl=altitude_msl) apos.save() telemetry = UasTelemetry(user=request.user, uas_position=apos, uas_heading=uas_heading) telemetry.save() return HttpResponse('UAS Telemetry Successfully Posted.')
def post(self, request): """Posts the UAS position with a POST request. User must send a POST request with the following paramters: latitude: A latitude in decimal degrees. longitude: A logitude in decimal degrees. altitude_msl: An MSL altitude in decimal feet. uas_heading: The UAS (true north) heading in decimal degrees. """ try: # Get the parameters latitude = float(request.POST['latitude']) longitude = float(request.POST['longitude']) altitude_msl = float(request.POST['altitude_msl']) uas_heading = float(request.POST['uas_heading']) except KeyError: # Failed to get POST parameters logger.warning( 'User did not specify all params for uas telemetry request.') logger.debug(request) return HttpResponseBadRequest( 'Posting UAS position must contain POST parameters "latitude", ' '"longitude", "altitude_msl", and "uas_heading".') except ValueError: # Failed to convert parameters logger.warning( 'User specified a param which could not converted to an ' + 'appropriate type.') logger.debug(request) return HttpResponseBadRequest( 'Failed to convert provided POST parameters to correct form.') else: # Check the values make sense if latitude < -90 or latitude > 90: logger.warning('User specified latitude out of valid range.') logger.debug(request) return HttpResponseBadRequest( 'Must provide latitude between -90 and 90 degrees.') if longitude < -180 or longitude > 180: logger.warning('User specified longitude out of valid range.') logger.debug(request) return HttpResponseBadRequest( 'Must provide longitude between -180 and 180 degrees.') if uas_heading < 0 or uas_heading > 360: logger.warning('User specified altitude out of valid range.') logger.debug(request) return HttpResponseBadRequest( 'Must provide heading between 0 and 360 degrees.') # Store telemetry logger.info('User uploaded telemetry: %s' % request.user.username) gpos = GpsPosition(latitude=latitude, longitude=longitude) gpos.save() apos = AerialPosition(gps_position=gpos, altitude_msl=altitude_msl) apos.save() telemetry = UasTelemetry( user=request.user, uas_position=apos, uas_heading=uas_heading) telemetry.save() return HttpResponse('UAS Telemetry Successfully Posted.')