Files
ivatar/ivatar/utils.py

106 lines
2.8 KiB
Python

'''
Simple module providing reusable random_string function
'''
import random
import string
from PIL import Image, ImageDraw
def random_string(length=10):
'''
Return some random string with default length 10
'''
return ''.join(random.SystemRandom().choice(
string.ascii_lowercase + string.digits) for _ in range(length))
def openid_variations(openid):
'''
Return the various OpenID variations, ALWAYS in the same order:
- http w/ trailing slash
- http w/o trailing slash
- https w/ trailing slash
- https w/o trailing slash
'''
# Make the 'base' version: http w/ trailing slash
if openid.startswith('https://'):
openid = openid.replace('https://', 'http://')
if openid[-1] != '/':
openid = openid + '/'
# http w/o trailing slash
var1 = openid[0:-1]
var2 = openid.replace('http://', 'https://')
var3 = var2[0:-1]
return (openid, var1, var2, var3)
def mm_ng(idhash, size=80, add_red=0, add_green=0, add_blue=0): #pylint: disable=too-many-locals
'''
Return an MM (mystery man) image, based on a given hash
add some red, green or blue, if specified
'''
# Make sure the lightest bg color we paint is e0, else
# we do not see the MM any more
if idhash[0] == 'f':
idhash = 'e0'
# How large is the circle?
circlesize = size*0.6
# Coordinates for the circle
start_x = int(size*0.2)
end_x = start_x+circlesize
start_y = int(size*0.05)
end_y = start_y+circlesize
# All are the same, based on the input hash
# this should always result in a "gray-ish" background
red = idhash[0:2]
green = idhash[0:2]
blue = idhash[0:2]
# Add some red (i/a) and make sure it's not over 255
red = hex(int(red, 16)+add_red).replace('0x', '')
if int(red, 16) > 255:
red = 'ff'
if len(red) == 1:
red = '0%s' % red
# Add some green (i/a) and make sure it's not over 255
green = hex(int(green, 16)+add_green).replace('0x', '')
if int(green, 16) > 255:
green = 'ff'
if len(green) == 1:
green = '0%s' % green
# Add some blue (i/a) and make sure it's not over 255
blue = hex(int(blue, 16)+add_blue).replace('0x', '')
if int(blue, 16) > 255:
blue = 'ff'
if len(blue) == 1:
blue = '0%s' % blue
# Assemable the bg color "string" in webnotation. Eg. '#d3d3d3'
bg_color = '#' + red + green + blue
# Image
image = Image.new('RGB', (size, size))
draw = ImageDraw.Draw(image)
# Draw background
draw.rectangle(((0, 0), (size, size)), fill=bg_color)
# Draw MMs head
draw.ellipse((start_x, start_y, end_x, end_y), fill='white')
# Draw MMs 'body'
draw.polygon((
(start_x+circlesize/2, size/2.5),
(size*0.15, size),
(size-size*0.15, size)),
fill='white')
return image