memopol_tags.py 5.35 KB
Newer Older
Nicolas Joyard's avatar
Nicolas Joyard committed
1
# coding: utf-8
2
3
4

import re

Nicolas Joyard's avatar
Nicolas Joyard committed
5
from django import template
6
from django.contrib.humanize.templatetags.humanize import naturalday
7
from django.contrib.staticfiles.templatetags.staticfiles import static
8
from django.core.urlresolvers import reverse
Nicolas Joyard's avatar
Nicolas Joyard committed
9
from django.utils.safestring import mark_safe
10
from django.utils.html import escape
Nicolas Joyard's avatar
Nicolas Joyard committed
11
12

register = template.Library()
13
14
15
16
17
link = u'<a class="{network}-link" href="{url}" target="_blank">{label}</a>'


def cssify(string):
    return re.sub('[^a-z_-]', '', string.lower())
Nicolas Joyard's avatar
Nicolas Joyard committed
18
19


20
21
22
23
24
def fix_url(url):
    # Ensure we have a usable URL
    return re.sub('^(https?://)?', 'https://', url.strip())


Nicolas Joyard's avatar
Nicolas Joyard committed
25
26
@register.filter
def twitter_link(url):
27
28
29
    furl = fix_url(url)
    return mark_safe(link.format(network='twitter', url=furl,
        label=re.sub(r'.*/@?([^/]+)', '@\\1', re.sub(r'/$', '', furl))))
Nicolas Joyard's avatar
Nicolas Joyard committed
30
31
32
33


@register.filter
def facebook_link(url):
34
35
36
37
38
    furl = fix_url(url)
    clean_url = re.sub(r'/$', '', re.sub(r'\?.*', '', furl))
    m = re.search(r'/pages/([^/]+)', clean_url, re.I)
    return mark_safe(link.format(network='facebook', url=furl,
        label=m.group(1) if m else re.sub(r'.*/([^/]+)', '\\1', clean_url)))
Nicolas Joyard's avatar
Nicolas Joyard committed
39

Nicolas Joyard's avatar
Nicolas Joyard committed
40
41
42

@register.filter
def website_link(url):
43
44
45
    furl = fix_url(url)
    short_url = re.sub(r'^https?://([^/]+).*', '\\1', furl)
    return mark_safe(link.format(network='website', url=furl,
46
        label=short_url))
Nicolas Joyard's avatar
Nicolas Joyard committed
47
48
49
50
51


@register.filter
def email_link(address):
    return mark_safe(link.format(network='email', url='mailto:%s' % address,
52
        label=address))
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83


@register.simple_tag
def group_url(group):
    if group.kind == 'chamber' or group.chamber is None:
        return escape(reverse('representative-list', kwargs={
            'group_kind': group.kind,
            'group': group.name
        }))
    else:
        return escape(reverse('representative-list', kwargs={
            'group_kind': group.kind,
            'chamber': group.chamber.name,
            'group': group.name
        }))


@register.simple_tag
def chamber_url(chamber):
    return escape(reverse('representative-list', kwargs={
        'group_kind': 'chamber',
        'group': chamber.name
    }))


@register.simple_tag
def country_url(country):
    return escape(reverse('representative-list', kwargs={
        'group_kind': 'country',
        'group': country.name
    }))
84
85
86
87
88
89
90
91
92
93
94
95
96
97


@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):
98
    url = static('images/chamber-%s.png' % cssify(chamber.abbreviation))
99
    return mark_safe(
100
101
        u'<span class="chamber-icon" style="background-image: url({url})">'
        u'</span> {name}'.format(name=chamber.name, url=url))
102
103


104
105
@register.filter
def chamber_small_icon(chamber):
106
    url = static('images/chamber-%s.png' % cssify(chamber.abbreviation))
107
    return mark_safe(
108
109
        u'<span class="chamber-icon" style="background-image: url({url})" '
        u'title="{name}"></span>'.format(name=chamber.name, url=url))
110
111


112
113
114
115
116
117
118
119
120
121
@register.simple_tag
def chamber_page_link(site, name):
    icon_url = static('images/chamber-%s.png' % cssify(site.kind))
    site_url = fix_url(site.url)
    return mark_safe(
        u'<span class="chamber-icon" style="background-image: url({icon})" '
        u'></span> <a href="{site}" target="_blank">{name}</a>'
        .format(name=name, site=site_url, icon=icon_url))


122
123
@register.filter
def mandate_icon(main_mandate):
124
125
126
    group = main_mandate.group
    url = static('images/group-%s.png' % cssify('%s-%s' % (
        group.chamber.abbreviation, group.abbreviation)))
127
    return mark_safe(
128
129
        u'<span class="group-icon" style="background-image: url({url})">'
        u'</span> {role} of {name}'.format(
130
131
            role=main_mandate.role,
            name=main_mandate.group.name,
132
            url=url))
133
134
135
136


@register.filter
def group_icon(group):
137
138
    url = static('images/group-%s.png' % cssify('%s-%s' % (
        group.chamber.abbreviation, group.abbreviation)))
139
    return mark_safe(
140
141
        u'<span class="group-icon" style="background-image: url({url})">'
        u'</span> {name}'.format(url=url, name=group.abbreviation))
142
143
144
145


@register.filter
def group_long_icon(group):
146
147
    url = static('images/group-%s.png' % cssify('%s-%s' % (
        group.chamber.abbreviation, group.abbreviation)))
148
    return mark_safe(
149
150
        u'<span class="group-icon" style="background-image: url({url})">'
        u'</span> {name}'.format(url=url, name=group.name))
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183


@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>')