randy/randy/views.py

32 lines
1017 B
Python

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"