diff --git a/dronken/context_processors.py b/dronken/context_processors.py index aba4c30..5e64e5b 100644 --- a/dronken/context_processors.py +++ b/dronken/context_processors.py @@ -6,3 +6,9 @@ def environment(request): return { 'debug': settings.DEBUG } + +def base_url(request): + """ Template context processor adding a base URL variable to the context. """ + return { + 'base_url': settings.BASE_URL + } diff --git a/dronken/urls.py b/dronken/urls.py index 8ad326a..ae33e32 100644 --- a/dronken/urls.py +++ b/dronken/urls.py @@ -8,4 +8,5 @@ urlpatterns = [ path('', CityList.as_view(), name='city_list'), path('/', AssociationList.as_view(), name='association_list'), path('//', AssociationDetail.as_view(), name='association'), + path('//badge.svg', AssociationBadgeView.as_view(), name='association_badge'), ] diff --git a/dronken/views.py b/dronken/views.py index 7a93c1f..9d75f4c 100644 --- a/dronken/views.py +++ b/dronken/views.py @@ -1,8 +1,13 @@ +import lxml.html from django import forms +from django.http import Http404, HttpResponse from django.urls import reverse_lazy +from django.views import View from django.views.generic import ListView, UpdateView -from dronken.models import City, Association, ExtraState +import anybadge + +from dronken.models import City, Association class CityList(ListView): @@ -55,3 +60,36 @@ class AssociationDetail(UpdateView): def get_success_url(self): return reverse_lazy('dronken:association_list', kwargs={'city': self.get_object().city.slug}) + + +class AssociationBadgeView(View): + def get(self, *args, **kwargs): + city = kwargs['city'] + slug = kwargs['slug'] + + try: + city_obj = City.objects.get(slug=city) + except City.DoesNotExist: + raise Http404 + + try: + association = Association.objects.get(city=city_obj, slug=slug) + except Association.DoesNotExist: + raise Http404 + + image = self.generate_badge(association) + + return HttpResponse(image, content_type="image/svg+xml") + + STATE_TO_COLOR = { + 'nuchter': 'lightgrey', + 'dronken': 'green', + 'brak': 'yellowgreen', + } + + def generate_badge(self, association): + badge = anybadge.Badge(lxml.html.fromstring(association.short_name).text_content(), + association.get_state_display(), + default_color=AssociationBadgeView.STATE_TO_COLOR.get(association.state, 'yellow')) + + return badge.badge_svg_text diff --git a/isonzeinterndronken/settings.py b/isonzeinterndronken/settings.py index a974a95..2e214b6 100644 --- a/isonzeinterndronken/settings.py +++ b/isonzeinterndronken/settings.py @@ -65,6 +65,7 @@ TEMPLATES = [ 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', 'dronken.context_processors.environment', + 'dronken.context_processors.base_url', ], }, }, @@ -121,3 +122,6 @@ USE_TZ = True # https://docs.djangoproject.com/en/2.0/howto/static-files/ STATIC_URL = '/static/' + +# Base URL +BASE_URL = 'https://isonzeinterndronken.nl' diff --git a/requirements.txt b/requirements.txt index e72874d..dca35de 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1 +1,3 @@ Django==2.0 +anybadge==1.1.1 +lxml==4.2.5 diff --git a/templates/association.html b/templates/association.html index e163454..d48c326 100644 --- a/templates/association.html +++ b/templates/association.html @@ -65,6 +65,11 @@ margin-bottom: 2em; } + + .badge img { + position: relative; + top: 4px; + } @@ -85,6 +90,8 @@ {% else %}

{{ association.short_name }} heeft helemaal geen intern!

{% endif %} + +

Deel een badge!

- \ No newline at end of file +