papiez_ipsum/papiezator/pope_utils.py

51 lines
1.4 KiB
Python

from papiezator.models import Pope, PerfectPope, decimal_places
from PIL import Image
import decimal
PREFIX = "popes"
class ENOPopeException(Exception): pass
def select_best_pope(aspect_ratio):
aspect_ratio = decimal.Decimal(
round(aspect_ratio, decimal_places)
)
pp = PerfectPope.objects.filter(aspect_ratio=aspect_ratio)
if pp:
return pp[0].pope.path
lte = Pope.objects.filter(aspect_ratio__lte=aspect_ratio).order_by('-aspect_ratio')
gte = Pope.objects.filter(aspect_ratio__gte=aspect_ratio).order_by('aspect_ratio')
if not gte and not lte:
raise ENOPopeException
elif not gte:
return lte[0].path
elif not lte:
return gte[0].path
else:
r_lte = abs(aspect_ratio - lte[0].aspect_ratio)
r_gte = abs(aspect_ratio - gte[0].aspect_ratio)
if r_lte >= r_gte:
return _select_pope(aspect_ratio, gte[0])
else:
return _select_pope(aspect_ratio, lte[0])
def _select_pope(aspect_ratio, pope):
#pp = PerfectPope(aspect_ratio=aspect_ratio, pope=pope)
#pp.save() # FIXME:
return pope.path
class PopeMaster:
def __init__(self):
pass
def parse_pope(self, pope):
im = Image.open(pope)
width, height = im.size
aspect_ratio = round(width/height, decimal_places)
return Pope(path=pope, width=width, height=height, aspect_ratio=aspect_ratio)