Skip to content
Snippets Groups Projects
Commit 33884ee3 authored by jan.bednarik's avatar jan.bednarik
Browse files

donate: Show donated amounts

parent 492de66a
No related branches found
No related tags found
No related merge requests found
......@@ -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
......
# 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"
),
),
]
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"] = (
......
{% 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 }}&nbsp;</strong>
z <strong>{{ page.expected_amount|intcomma }}&nbsp;</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">
......
{% 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 }}&nbsp;</strong>
z <strong>{{ project.expected_amount|intcomma }}&nbsp;</strong>
</p>
</div>
{% endcomment %}
{% endif %}
{% if project.is_new %}
<ul class="project__flags">
<li class="project__flag new">Nový projekt</li>
......
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
......@@ -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
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment