Skip to content

Commit

Permalink
Make the avatar function independant
Browse files Browse the repository at this point in the history
Signed-off-by: Aurélien Bompard <[email protected]>
  • Loading branch information
abompard committed Apr 18, 2024
1 parent c0390bb commit 3d4587b
Show file tree
Hide file tree
Showing 4 changed files with 52 additions and 58 deletions.
13 changes: 1 addition & 12 deletions tahrir/__init__.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,6 @@
import os
from configparser import ConfigParser

import dogpile.cache
import dogpile.cache.util
import tahrir_api.model
from pyramid.authentication import AuthTktAuthenticationPolicy
from pyramid.authorization import ACLAuthorizationPolicy
from pyramid.config import Configurator
Expand All @@ -15,20 +12,12 @@

from . import notifications
from .app import get_root
from .utils import (
make_avatar_method,
str_to_bytes,
)
from .utils import cache


def main(global_config, **settings):
"""This function returns a Pyramid WSGI application."""

cache = dogpile.cache.make_region(
key_mangler=lambda x: dogpile.cache.util.sha1_mangle_key(str_to_bytes(x))
)
tahrir_api.model.Person.avatar_url = make_avatar_method(cache)

session_cls = scoped_session(
sessionmaker(
bind=create_engine(settings["sqlalchemy.url"]),
Expand Down
9 changes: 8 additions & 1 deletion tahrir/templates/functions.mak
Original file line number Diff line number Diff line change
@@ -1,11 +1,18 @@
<%!
import functools
from tahrir.utils import get_avatar
def as_avatar(size):
return functools.partial(get_avatar, size=size)
%>

<%def name="avatar_thumbnail(person, size, cell_width, tooltip=True)">
<div class="grid-${cell_width} thumbnail-container">
<div class="thumbnail thumbnail-${size}">
% if tooltip:
<span class="tooltip tooltip-${size}" data-tooltip="${person.nickname}">
% endif
<a href="${request.route_url('user', id=person.nickname or person.id)}">
<img property="foaf:img schema:image" src="${person.avatar_url(size)}" />
<img property="foaf:img schema:image" src="${person.email | as_avatar(size)}" />
</a>
% if tooltip:
</span>
Expand Down
82 changes: 40 additions & 42 deletions tahrir/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@
from hashlib import sha256

import dateutil.relativedelta
import dogpile.cache
import dogpile.cache.util
import pyramid.threadlocal

libravatar = None
Expand All @@ -13,6 +15,11 @@
pass


cache = dogpile.cache.make_region(
key_mangler=lambda x: dogpile.cache.util.sha1_mangle_key(str_to_bytes(x))
)


def generate_badge_yaml(postdict):
return (
"%YAML 1.2\n"
Expand Down Expand Up @@ -45,55 +52,46 @@ def generate_badge_yaml(postdict):
)


def make_avatar_method(cache):

@cache.cache_on_arguments()
def _avatar_function(email: bytes, size):
request = pyramid.threadlocal.get_current_request()
theme_name = request.registry.settings.get("tahrir.theme_name", "tahrir")
absolute_default = request.registry.settings.get(
"tahrir.default_avatar",
request.static_url(f"{theme_name}:static/img/badger_avatar.png"),
)

query = {
"s": size,
"d": absolute_default,
}

if size == "responsive":
# Make it big so we can downscale it as we please
query["s"] = 312
@cache.cache_on_arguments()
def get_avatar(email: str, size):
request = pyramid.threadlocal.get_current_request()
theme_name = request.registry.settings.get("tahrir.theme_name", "tahrir")
absolute_default = request.registry.settings.get(
"tahrir.default_avatar",
request.static_url(f"{theme_name}:static/img/badger_avatar.png"),
)

query = urllib.parse.urlencode(query)
query = {
"s": size,
"d": absolute_default,
}

# Use md5 for emails, and sha256 for openids.
# We're really using openids, so...
# hash = md5(email).hexdigest()
hash = sha256(email).hexdigest()
if size == "responsive":
# Make it big so we can downscale it as we please
query["s"] = 312

# TODO This next line is temporary and can be removed. We do
# libravatar ourselves here by hand to avoid pyDNS issues on epel6.
# Once those are resolved we can use pylibravatar again.
return f"https://seccdn.libravatar.org/avatar/{hash}?{query}"
query = urllib.parse.urlencode(query)

gravatar_url = f"https://secure.gravatar.com/avatar/{hash}?{query}"
# Use md5 for emails, and sha256 for openids.
# We're really using openids, so...
# hash = md5(email).hexdigest()
hash = sha256(email.encode("utf-8")).hexdigest()

if libravatar:
return libravatar.libravatar_url(
email=email,
size=size,
default=gravatar_url,
)
else:
return gravatar_url
# TODO This next line is temporary and can be removed. We do
# libravatar ourselves here by hand to avoid pyDNS issues on epel6.
# Once those are resolved we can use pylibravatar again.
return f"https://seccdn.libravatar.org/avatar/{hash}?{query}"

def avatar_method(self, size):
# dogpile.cache can barf on unicode, so do this ourselves.
# Call the cached workhorse function
return _avatar_function(self.email.encode("utf-8"), size)
gravatar_url = f"https://secure.gravatar.com/avatar/{hash}?{query}"

return avatar_method
if libravatar:
return libravatar.libravatar_url(
email=email,
size=size,
default=gravatar_url,
)
else:
return gravatar_url


def singularize(term, value):
Expand Down
6 changes: 3 additions & 3 deletions tahrir/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@
from pyramid.view import view_config
from tahrir_api.utils import convert_name_to_id

from tahrir.utils import generate_badge_yaml
from tahrir.utils import generate_badge_yaml, get_avatar


def _get_user(request, id_or_nickname):
Expand Down Expand Up @@ -915,7 +915,7 @@ def badge_rss(request):
entry.description(
description_template
% (
assertion.person.avatar_url(128),
get_avatar(assertion.person.email, 128),
assertion.person.nickname,
assertion.person.nickname,
)
Expand Down Expand Up @@ -1070,7 +1070,7 @@ def _user_json_generator(request, user):

return {
"user": user.nickname,
"avatar": user.avatar_url(int(request.GET.get("size", 100))),
"avatar": get_avatar(user.email, int(request.GET.get("size", 100))),
"percent_earned": user_info["percent_earned"],
"assertions": assertions,
"percentile": str(user_info["percentile"]),
Expand Down

0 comments on commit 3d4587b

Please sign in to comment.