def get_achievement_photo(achievement_id):
    try:
        from Tools import rescale
        from Models import Achievement
        import cloudstorage as gcs
        from search import nearby_search
        if achievement_id == 'nearby':
            print 'nearby'
            lon = request.query['lon']
            lat = request.query['lat']
            place_documents = nearby_search(lon, lat, 500000)
            print place_documents
            if place_documents is None:
                return json.dumps({'status_code': 204})
            achievement_id = place_documents[0]['achievement_id']
            print achievement_id
        achievement = Achievement.get_by_id(int(achievement_id))
        pictures = list(achievement.pictures)
        picture_id = pictures[0]
        size = [int(request.query['x']), int(request.query['y'])]
        gcs_filename = '/thebucket/picture/' + picture_id + '/photo'
        gcs_file = gcs.open(gcs_filename)
        data = gcs_file.read()
        return rescale.rescale(data, *size)
    except BaseException, ex:
        logging.exception("Exception: %s" % ex)
        print(str(ex))
        return json.dumps({"status_code": 400})
def update():
    try:
        from Models import Achievement, UserDetails
        from UserManagement import add_achievement
        user_id = request.json['user_id']
        print user_id
        user_details = UserDetails.get_by_id(int(user_id))
        if user_details is None:
            return json.dumps(dict(status_code=204, error_message="user_id not found"))
        lon = request.json["lon"]
        lat = request.json["lat"]
        from search import nearby_search
        nearby_places = nearby_search(lon, lat, 4500)
        achievement_ids = []
        for result in nearby_places:
            if int(result['radius']) >= int(result['distance']):
                achievement_id = result['achievement_id']
                added_id = add_achievement(int(achievement_id), int(user_id))
                if added_id is not None:
                    achievement_ids.append(int(added_id))
        if not achievement_ids:
            return json.dumps(dict(status_code=204))
        else:
            return json.dumps(dict(status_code=200, achievements=achievement_ids))
    except BaseException, ex:
        logging.exception("Uh Oh - %s" % ex)
        return json.dumps({"status_code": 400, "Exception": str(ex)})
def maps_nearby():
    from Models import UserDetails
    from google.appengine.api import search
    lon = request.query['lon']
    lat = request.query['lat']
    index = search.Index(name="places_index")
    from search import nearby_search
    nearby_places = nearby_search(lon, lat, 500000)
    places_of_interest = []
    for scored_document in nearby_places:
        place = {}
        _id = scored_document['achievement_id']
        location = scored_document['location']
        place['id'] = _id
        location = dict(lon=location.longitude, lat=location.latitude)
        place['location'] = location
        places_of_interest.append(place)
        print place
    return json.dumps(dict(places_of_interest=places_of_interest))