From 33884ee3696bc45c05a7ab2d05d5c9a9dea22593 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Bedna=C5=99=C3=ADk?= <jan.bednarik@gmail.com> Date: Wed, 26 Aug 2020 01:38:20 +0200 Subject: [PATCH] donate: Show donated amounts --- README.md | 1 + donate/migrations/0008_auto_20200826_0021.py | 27 ++++++++++++++++++ donate/models.py | 28 ++++++++++++++++++- .../templates/donate/donate_project_page.html | 13 ++++++--- donate/templates/donate/project_snippet.html | 13 +++++---- donate/utils.py | 28 +++++++++++++++++++ majak/settings/base.py | 3 ++ 7 files changed, 103 insertions(+), 10 deletions(-) create mode 100644 donate/migrations/0008_auto_20200826_0021.py create mode 100644 donate/utils.py diff --git a/README.md b/README.md index 6a6bdb53..39f7d32c 100644 --- a/README.md +++ b/README.md @@ -91,6 +91,7 @@ Settings pro appky na weby: | --- | --- | --- | | `DONATE_PORTAL_REDIRECT_URL` | "" | URL pro přesměrování z darovacího formuláře | | `DONATE_PORTAL_REDIRECT_SOURCE` | dary.pirati.cz | identifikátor zdroje pro přesměrování na darovací portál | +| `DONATE_PORTAL_API_URL` | "" | URL s API darovacího portálu | ### Management commands diff --git a/donate/migrations/0008_auto_20200826_0021.py b/donate/migrations/0008_auto_20200826_0021.py new file mode 100644 index 00000000..7ef77b85 --- /dev/null +++ b/donate/migrations/0008_auto_20200826_0021.py @@ -0,0 +1,27 @@ +# Generated by Django 3.0.8 on 2020-08-25 22:21 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("donate", "0007_auto_20200724_1658"), + ] + + operations = [ + migrations.AddField( + model_name="donateprojectpage", + name="donated_amount", + field=models.IntegerField( + blank=True, null=True, verbose_name="vybraná částka" + ), + ), + migrations.AddField( + model_name="donateprojectpage", + name="expected_amount", + field=models.IntegerField( + blank=True, null=True, verbose_name="očekávaná částka" + ), + ), + ] diff --git a/donate/models.py b/donate/models.py index 7313d891..6fd35769 100644 --- a/donate/models.py +++ b/donate/models.py @@ -1,3 +1,4 @@ +from django.core.cache import cache from django.core.paginator import EmptyPage, PageNotAnInteger, Paginator from django.db import models from django.shortcuts import redirect @@ -18,6 +19,7 @@ from wagtailmetadata.models import MetadataPageMixin from tuning import help from .forms import DonateForm +from .utils import get_donated_amount_from_api class SubpageMixin: @@ -361,6 +363,8 @@ class DonateProjectPage(DonateFormMixin, Page, SubpageMixin, MetadataPageMixin): verbose_name="galerie fotek", blank=True, ) + expected_amount = models.IntegerField("očekávaná částka", blank=True, null=True) + donated_amount = models.IntegerField("vybraná částka", blank=True, null=True) # we will use photo as search image search_image = None @@ -372,6 +376,7 @@ class DonateProjectPage(DonateFormMixin, Page, SubpageMixin, MetadataPageMixin): "info do přehledu projektů", ), FieldPanel("date"), + FieldPanel("expected_amount"), FieldPanel("body", classname="full"), StreamFieldPanel("gallery"), ] @@ -395,7 +400,9 @@ class DonateProjectPage(DonateFormMixin, Page, SubpageMixin, MetadataPageMixin): ), ] - settings_panels = Page.settings_panels + [FieldPanel("portal_project_id")] + settings_panels = Page.settings_panels + [ + FieldPanel("portal_project_id"), + ] ### RELATIONS @@ -420,6 +427,25 @@ class DonateProjectPage(DonateFormMixin, Page, SubpageMixin, MetadataPageMixin): return str(self.perex)[:150] + "..." return self.perex + def get_donated_amount(self): + key = f"donated_amount_{self.portal_project_id}" + amount = cache.get(key) + if amount is None: + amount = get_donated_amount_from_api(self.portal_project_id) + if amount is not None: + self.donated_amount = amount + self.save() + cache.set(key, amount) + return self.donated_amount + + @property + def donated_percentage(self): + if not self.expected_amount: + return 0 + if self.get_donated_amount() >= self.expected_amount: + return 100 + return round(self.get_donated_amount() / self.expected_amount * 100) + def get_context(self, request): context = super().get_context(request) context["other_projects"] = ( diff --git a/donate/templates/donate/donate_project_page.html b/donate/templates/donate/donate_project_page.html index 2338358b..b6e88d85 100644 --- a/donate/templates/donate/donate_project_page.html +++ b/donate/templates/donate/donate_project_page.html @@ -1,5 +1,5 @@ {% extends "donate/base.html" %} -{% load static wagtailcore_tags wagtailimages_tags %} +{% load static wagtailcore_tags wagtailimages_tags humanize %} {% block content %} @@ -57,16 +57,21 @@ </div><!-- /project-donate-form__left --> <div class="project-donate-form__right"> - {% comment %} {# TODO #} - <h5>Vybráno <strong>4 963 Kč</strong> z <strong>250 000 Kč</strong></h5> + {% if page.expected_amount %} + <h5> + Vybráno <strong>{{ page.get_donated_amount|intcomma }} Kč</strong> + z <strong>{{ page.expected_amount|intcomma }} Kč</strong> + </h5> <div class="progress"> - <div class="progress-bar" role="progressbar" style="width: 25%" aria-valuenow="25" aria-valuemin="0" aria-valuemax="100"></div> + <div class="progress-bar" role="progressbar" style="width: {{ page.donated_percentage }}%" aria-valuenow="{{ page.donated_percentage }}" aria-valuemin="0" aria-valuemax="100"></div> </div> <hr> + {% comment %} <h5><strong>24 lidí</strong> přispělo</h5> <h5><strong>40 dní</strong> do konce</h5> <hr> {% endcomment %} + {% endif %} {% if page.show_donate_form %} <form id="js-donate-form" method="post"> diff --git a/donate/templates/donate/project_snippet.html b/donate/templates/donate/project_snippet.html index 91806e55..c2e3c90d 100644 --- a/donate/templates/donate/project_snippet.html +++ b/donate/templates/donate/project_snippet.html @@ -1,4 +1,4 @@ -{% load wagtailcore_tags wagtailimages_tags %} +{% load wagtailcore_tags wagtailimages_tags humanize %} <div class="col-12 col-md-4 mb-4"> <a class="card project" href="{% pageurl project %}"> @@ -8,14 +8,17 @@ <h5>{{ project.title }}</h5> <p>{{ project.perex }}</p> </div> - {% comment %} {# TODO #} + {% if project.expected_amount %} <div class="card-footer"> <div class="progress"> - <div class="progress-bar" role="progressbar" style="width: 90%" aria-valuenow="90" aria-valuemin="0" aria-valuemax="100"></div> + <div class="progress-bar" role="progressbar" style="width: {{ project.donated_percentage }}%" aria-valuenow="{{ project.donated_percentage }}" aria-valuemin="0" aria-valuemax="100"></div> </div> - <p>Vybráno <strong>4 963 Kč</strong> z <strong>250 000 Kč</strong></p> + <p> + Vybráno <strong>{{ project.get_donated_amount|intcomma }} Kč</strong> + z <strong>{{ project.expected_amount|intcomma }} Kč</strong> + </p> </div> - {% endcomment %} + {% endif %} {% if project.is_new %} <ul class="project__flags"> <li class="project__flag new">Nový projekt</li> diff --git a/donate/utils.py b/donate/utils.py new file mode 100644 index 00000000..a83f6a7f --- /dev/null +++ b/donate/utils.py @@ -0,0 +1,28 @@ +import logging +import os.path + +import requests +from django.conf import settings + +logger = logging.getLogger(__name__) + + +def get_donated_amount_from_api(portal_project_id): + url = os.path.join( + settings.DONATE_PORTAL_API_URL, "donate/bar", str(portal_project_id) + ) + + try: + response = requests.get(url, timeout=settings.DONATE_PORTAL_API_TIMEOUT) + response.raise_for_status() + _, amount = response.json() + return amount + + except requests.exceptions.Timeout: + logger.warning("Donate portal API call timed out for %s", url) + + except requests.exceptions.RequestException: + logger.warning("Donate portal API call failed for %s", url) + raise + + return None diff --git a/majak/settings/base.py b/majak/settings/base.py index 24035e1f..55eb0234 100644 --- a/majak/settings/base.py +++ b/majak/settings/base.py @@ -66,6 +66,7 @@ INSTALLED_APPS = [ "django.contrib.sessions", "django.contrib.messages", "django.contrib.staticfiles", + "django.contrib.humanize", ] # AUTHENTICATION @@ -218,3 +219,5 @@ DONATE_PORTAL_REDIRECT_URL = env.str("DONATE_PORTAL_REDIRECT_URL", default="") DONATE_PORTAL_REDIRECT_SOURCE = env.str( "DONATE_PORTAL_REDIRECT_SOURCE", default="dary.pirati.cz" ) +DONATE_PORTAL_API_URL = env.str("DONATE_PORTAL_API_URL", default="") +DONATE_PORTAL_API_TIMEOUT = 5 -- GitLab