import random from pyramid.response import Response, FileResponse from pyramid.view import view_config from sqlalchemy.exc import DBAPIError from .models import Picture @view_config(route_name='random') def random_view(request): try: chosen = weighted_choice(request.dbsession.query(Picture.id, Picture.weight).all()) item = request.dbsession.query(Picture).filter(Picture.id == chosen).first() except DBAPIError: return Response("", content_type='text/plain', status=500) directories = request.registry.settings['directories'].splitlines() repo, path = item.uri.split(':', 1) location = [i for i in directories if i.startswith(repo)][0] file = location[len(repo) + 1:] + path return FileResponse(file, request=request) def weighted_choice(choices): total = sum(w for c, w in choices) r = random.uniform(0, total) upto = 0 for c, w in choices: upto += w if upto >= r: return c assert False, "Shouldn't get here"