def upload(request): if request.method != 'POST': return redirect(main_map) context = {} errs = [] context['errors'] = errs # Get either external or file pic if request.POST.get('external'): url = request.POST.get('url') img_temp = NamedTemporaryFile() try: img_temp.write(urlopen(url).read()) img_temp.flush() pic = File(img_temp) except URLError as e: # Error reading file pic = None else: pic = request.FILES.get('pic') # Get lat/lng/caption data lat = request.POST.get('lat') lng = request.POST.get('lng') caption = request.POST.get('caption', '') user = request.user albums_str = request.POST.get('upload-album') # Parse albums string into array of ints try: albums = [int(s) for s in albums_str.split(',')] except: albums = [] # Try to create the image image,errors = Image.create(username=user.username, image=pic, lat=lat, lng=lng, caption=caption, albums=albums) context['image'] = image if errors: print(errors) errs.extend(errors) else: context['message'] = "Image successfully uploaded!" return render(request, 'json/upload_response.json', context, content_type="application/json")
def post_image(request): try: data = json.loads(request.body.decode('utf-8')).get('data') except: return JsonResponse(bad_format_errors(["Could not parse JSON body"]), status=400) if not data: return JsonResponse(bad_format_errors(["Missing 'data' component of request"]), status=400) api_key = request.GET.get('api_key') # Does this api key exist? try: profile = Profile.objects.get(api_key=api_key) except: return JsonResponse(bad_api_key_error, status=403) attributes = data.get('attributes') try: src = attributes.get('src') lat = attributes.get('lat') lng = attributes.get('lng') caption = attributes.get('caption') except: return JsonResponse(bad_format_errors(["Missing 'attributes' component of request data"]), status=400) relationships = data.get('relationships') if relationships: album_objects = relationships.get('albums', []) try: album_ids = [a.get('id') for a in album_objects] except: return JsonResponse(bad_format_errors(["Malformed 'album' relationship objects"]), status=400) else: album_ids = [] src_type = data.get('src_type') if src_type == 'url': img_temp = NamedTemporaryFile() try: img_temp.write(urlopen(src).read()) except URLError as e: # Thrown if there's a network error return JsonResponse(bad_format_errors(["Error with image source: %s" % (e.reason)]), status=400) img_temp.flush() pic = File(img_temp) else: return JsonResponse(bad_format_errors(["Invalid src_type parameter"]), status=400) image,errs = Image.create(profile.user.username, pic, lat, lng, caption, album_ids) if errs: return JsonResponse(bad_format_errors(errs), status=400) # Create response object context = { 'data': image.as_dict(True,True) } return JsonResponse(context, status=201)
def test_create_bad_lat(self): i,err = Image.create(username='******', image=self.file_mock, lat="foo", lng=15.0, caption='hey') self.assertEqual(i, None)
def test_create_no_lng(self): i,err = Image.create(username='******', image=self.file_mock, lat=10.0, lng=None, caption='hey') self.assertEqual(i, None)
def test_create_no_file(self): i,err = Image.create(username='******', image=None, lat=15.0, lng=10.0, caption='hey') self.assertEqual(i, None)
def test_create_username_no_exist(self): i,err = Image.create(username='******', image=self.file_mock, lat=15.0, lng=10.0, caption='hey') self.assertEqual(i, None)