diff --git a/website/events/helpers/sponsoring_pending.py b/website/events/helpers/sponsoring_pending.py new file mode 100644 index 0000000..6ecb1b7 --- /dev/null +++ b/website/events/helpers/sponsoring_pending.py @@ -0,0 +1,49 @@ +"""Sponsoring helper. +This module is to help on construct the list of pending sponsoring. + Organizer Tasks: + * calculate_sponsoring_pending_by_organizer + + Superuser Tasks: + * calculate_all_sponsoring_pending +""" +from collections import namedtuple +from operator import attrgetter + +from django.urls import reverse +from events.constants import SPONSOR_STATE_CHECKED, SPONSOR_STATE_PARTIALLY_PAID +from events.models import Organizer, Sponsoring + + +PendingSponsoring = namedtuple('PendingSponsoring', 'description, amount, url') + + +def pending_sponsoring(sponsoring): + description = f"{sponsoring} - {sponsoring.state.upper()}" + amount = sponsoring.sponsorcategory.amount + url = reverse('sponsoring_detail', kwargs={'pk': sponsoring.pk}) + return PendingSponsoring(description, amount, url) + + +def calculate_sponsoring_pending(organizer_user=False): + """Calculates all pending sponsoring. + + Returns: + list(PendingSponsoring): List of all pending sponsoring + """ + pending = [] + if organizer_user: + organizer = Organizer.objects.get(user=organizer_user) + sponsorings = Sponsoring.objects.filter( + sponsorcategory__event__in=organizer.get_associate_events()) + else: + sponsorings = Sponsoring.objects.all() + + open_sponsorings = ( + SPONSOR_STATE_PARTIALLY_PAID, + SPONSOR_STATE_CHECKED, + ) + + for sponsoring in sponsorings: + if sponsoring.state in open_sponsorings: + pending.append(pending_sponsoring(sponsoring)) + return sorted(pending, key=attrgetter('amount'), reverse=True) diff --git a/website/events/templates/events_home.html b/website/events/templates/events_home.html index 8c1de0a..2a47030 100644 --- a/website/events/templates/events_home.html +++ b/website/events/templates/events_home.html @@ -90,6 +90,32 @@ {% endif %} + +
+

Patrocinios Pendientes {{sponsoring_pending|length}}

+
+ {% for pending in sponsoring_pending %} +
+
+
+ {{ pending.description }} +
+
+ {{ pending.amount }} +
+
+ Ir +
+
+
+ {% empty %} + + {% endfor %} +
+
+

Tareas {{tasks|length}}

diff --git a/website/events/tests.py b/website/events/tests.py index 632f2c7..f077604 100644 --- a/website/events/tests.py +++ b/website/events/tests.py @@ -38,6 +38,11 @@ calculate_super_user_task, Task ) +from events.helpers.sponsoring_pending import ( + PendingSponsoring, + pending_sponsoring, + calculate_sponsoring_pending, +) from events.helpers.tests import ( associate_events_organizers, CustomAssertMethods, @@ -1056,3 +1061,34 @@ def test_organizer_refund_switch_state(self): response = self.client.post(url) refund.refresh_from_db() self.assertEqual(refund.is_cancelled, False) + + +class PendindSponsoringTest(TestCase, CustomAssertMethods): + + def setUp(self): + create_organizer_set(auto_create_user_set=True) + self.user = User.objects.first() + create_event_set(self.user) + associate_events_organizers() + self.invoice = create_sponsoring_invoice(auto_create_sponsoring_and_sponsor=True) + create_invoice_affect_set(self.invoice, total_amount=False) + self.invoice.invoice_ok = True + self.invoice.partial_payment = True + self.invoice.save() + + def test_pending_sponsoring_method(self): + sponsoring = Sponsoring.objects.first() + sponsoring_namedtuple = pending_sponsoring(sponsoring) + self.assertIsInstance(sponsoring_namedtuple, PendingSponsoring) + + def test_calculate_all_sponsoring_pending(self): + sponsoring = calculate_sponsoring_pending() + self.assertEqual(len(sponsoring), 1) + + def test_calculate_all_sponsoring_pending_by_organizer(self): + user = User.objects.get(username="organizer01") + sponsoring = calculate_sponsoring_pending(user) + self.assertEqual(len(sponsoring), 1) + user = User.objects.get(username="organizer03") + sponsoring = calculate_sponsoring_pending(user) + self.assertEqual(len(sponsoring), 0) diff --git a/website/events/views.py b/website/events/views.py index a1a4a76..ae7eaee 100644 --- a/website/events/views.py +++ b/website/events/views.py @@ -71,6 +71,9 @@ SponsorCategory, Sponsoring ) +from events.helpers.sponsoring_pending import ( + calculate_sponsoring_pending, +) from pyar_auth.forms import PasswordResetForm @@ -78,13 +81,19 @@ def events_home(request): user = request.user tasks = [] + sponsoring_pending = [] if Organizer.objects.filter(user=user).exists(): tasks = calculate_organizer_task(user) + sponsoring_pending = calculate_sponsoring_pending(user) else: if user.is_superuser: tasks = calculate_super_user_task() + sponsoring_pending = calculate_sponsoring_pending() - return render(request, 'events_home.html', {'tasks': tasks}) + return render(request, 'events_home.html', { + 'tasks': tasks, + 'sponsoring_pending': sponsoring_pending, + }) @permission_required('events.add_organizer')