From c1aeb29dea003d4b760688422b777c3b26493c36 Mon Sep 17 00:00:00 2001
From: Nicolas Joyard <joyard.nicolas@gmail.com>
Date: Sun, 12 Jun 2016 10:30:28 +0200
Subject: [PATCH] Fix encoding bug in social links

Error was:
  UnicodeEncodeError at /legislature/representative/michele-alliot-marie/
  'ascii' codec can't encode character u'\xe8' in position 35: ordinal not in range(128)
  in  /home/niko/dev/memopol/political_memory/memopol/templatetags/memopol_tags.py in facebook_link
                    label=re.sub(r'.*/([^/]+)', '\\1', re.sub(r'/$', '', url.strip()))))
---
 memopol/templatetags/memopol_tags.py | 87 +++++++++++++++++++++++++++-
 1 file changed, 86 insertions(+), 1 deletion(-)

diff --git a/memopol/templatetags/memopol_tags.py b/memopol/templatetags/memopol_tags.py
index 840124ba..20bb316a 100644
--- a/memopol/templatetags/memopol_tags.py
+++ b/memopol/templatetags/memopol_tags.py
@@ -3,12 +3,17 @@
 import re
 
 from django import template
+from django.contrib.humanize.templatetags.humanize import naturalday
 from django.core.urlresolvers import reverse
 from django.utils.safestring import mark_safe
 from django.utils.html import escape
 
 register = template.Library()
-link = '<a class="{network}-link" href="{url}" target="_blank">{label}</a>'
+link = u'<a class="{network}-link" href="{url}" target="_blank">{label}</a>'
+
+
+def cssify(string):
+    return re.sub('[^a-z_-]', '', string.lower())
 
 
 @register.filter
@@ -65,3 +70,83 @@ def country_url(country):
         'group_kind': 'country',
         'group': country.name
     }))
+
+
+@register.filter
+def country_flag(country):
+    # Enable using groups instead of countries
+    code = country.code if hasattr(country, 'code') else country.abbreviation
+    return mark_safe(
+        '<span class="flag-icon flag-icon-{code}"></span> {name}'.format(
+            name=country.name,
+            code=code.lower()))
+
+
+@register.filter
+def chamber_icon(chamber):
+    return mark_safe(
+        u'<span class="chamber-icon ' +
+        u'chamber-icon-{abbr}"></span> {name}'.format(
+            name=chamber.name,
+            abbr=cssify(chamber.abbreviation)))
+
+
+@register.filter
+def mandate_icon(main_mandate):
+    return mark_safe(
+        u'<span class="group-icon ' +
+        u'group-icon-{abbr}"></span> {role} of {name}'.format(
+            role=main_mandate.role,
+            name=main_mandate.group.name,
+            abbr=cssify(main_mandate.group.abbreviation)))
+
+
+@register.filter
+def group_icon(group):
+    return mark_safe(
+        u'<span class="group-icon ' +
+        u'group-icon-{abbr}"></span> {name}'.format(
+            abbr=cssify(group.abbreviation),
+            name=group.abbreviation))
+
+
+@register.filter
+def group_long_icon(group):
+    return mark_safe(
+        u'<span class="group-icon ' +
+        u'group-icon-{abbr}"></span> {name}'.format(
+            abbr=cssify(group.abbreviation),
+            name=group.name))
+
+
+@register.filter
+def mandate_date(date, arg=None):
+    if date is None or date.year == 9999:
+        return 'present'
+    else:
+        return naturalday(date, arg)
+
+
+@register.filter
+def position_icon(position):
+    if position == 'for':
+        return mark_safe(
+            '<i \
+            aria-label="for" \
+            class="fa fa-thumbs-up vote_positive" \
+            title="for" \
+            ></i>')
+    elif position == 'against':
+        return mark_safe(
+            '<i \
+            aria-label="against" \
+            class="fa fa-thumbs-down vote_negative" \
+            title="against" \
+            ></i>')
+    else:
+        return mark_safe(
+            '<i \
+            aria-label="abstain" \
+            class="fa fa-circle-o vote_abstain" \
+            title="abstain" \
+            ></i>')
-- 
GitLab