diff --git a/README.md b/README.md index 6a6bdb533a023458f8ece3c0dbc1a0127cac75e3..39f7d32c8d48e9cd38ef0343bc9a8335a14809da 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 0000000000000000000000000000000000000000..7ef77b85c62269f23df5e4a8b3c36666e49c6d55 --- /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 7313d891482508f93489333ec9ba9983c1a3443e..6fd35769ac10786147b0641245dc8960d9abae5c 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 2338358b708d6bd834de751e75b73c73471295a6..b6e88d854230000b3920e6f6ab562ee793dd5d8e 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 91806e5556dc9fff236b40bc0f24cd557de4c5e6..c2e3c90dbc00337f78d8e27f287ce96916d18177 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 0000000000000000000000000000000000000000..a83f6a7f447dff00fc35255a0ebe40ded4ecfd60 --- /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 24035e1f7cd0e60079540d11d12430426b3d969c..55eb023477bd04710a30e27c1c032fa114b38dbf 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