parent
6fb289727c
commit
43348a89da
@ -0,0 +1,24 @@
|
||||
# Generated by Django 2.0.3 on 2018-03-23 01:00
|
||||
|
||||
import computed_property.fields
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('users', '0012_auto_20180129_1614'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='user',
|
||||
name='email_md5',
|
||||
field=computed_property.fields.ComputedCharField(compute_from='calc_email_md5', default='', editable=False, max_length=32, unique=True),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='user',
|
||||
name='email_sha256',
|
||||
field=computed_property.fields.ComputedCharField(compute_from='calc_email_sha256', default='', editable=False, max_length=64, unique=True),
|
||||
),
|
||||
]
|
@ -0,0 +1,8 @@
|
||||
from django.conf.urls import url
|
||||
|
||||
from .views import libravatar
|
||||
|
||||
app_name = 'users'
|
||||
urlpatterns = (
|
||||
url('^avatar/(?P<hash>[a-z0-9]+)$', libravatar, name='libravatar'),
|
||||
)
|
@ -0,0 +1,49 @@
|
||||
from django.http import HttpResponse, HttpResponseRedirect
|
||||
from PIL import Image
|
||||
|
||||
from lemoncurry import utils
|
||||
from .models import User
|
||||
|
||||
|
||||
def try_libravatar_org(hash, get):
|
||||
url = 'https://seccdn.libravatar.org/avatar/' + hash
|
||||
if get:
|
||||
url += '?' + get.urlencode()
|
||||
return HttpResponseRedirect(url)
|
||||
|
||||
|
||||
def libravatar(request, hash):
|
||||
g = request.GET
|
||||
size = g.get('s', g.get('size', 80))
|
||||
try:
|
||||
size = int(size)
|
||||
except ValueError:
|
||||
return utils.bad_req('size parameter must be an integer')
|
||||
if not 1 <= size <= 128:
|
||||
return utils.bad_req('size parameter must be between 1 and 128')
|
||||
|
||||
if len(hash) == 32:
|
||||
where = {'email_md5': hash}
|
||||
elif len(hash) == 64:
|
||||
where = {'email_sha256': hash}
|
||||
else:
|
||||
return utils.bad_req('hash must be either md5 or sha256')
|
||||
|
||||
# If the user doesn't exist or lacks an avatar, see if libravatar.org has
|
||||
# one for them - libravatar.org falls back to Gravatar when possible (only
|
||||
# for MD5 hashes, since Gravatar doesn't support SHA-256), so this ensures
|
||||
# all the most likely places are checked.
|
||||
try:
|
||||
user = User.objects.get(**where)
|
||||
except User.DoesNotExist:
|
||||
return try_libravatar_org(hash, g)
|
||||
|
||||
if not user.avatar:
|
||||
return try_libravatar_org(hash, g)
|
||||
|
||||
im = Image.open(user.avatar)
|
||||
im_resized = im.resize((size, size))
|
||||
|
||||
response = HttpResponse(content_type='image/'+im.format.lower())
|
||||
im_resized.save(response, im.format)
|
||||
return response
|
Loading…
Reference in new issue