32 lines
1017 B
Python
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"
|