diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 2a491e10..023c6db6 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,4 +1,4 @@ -## Como contribuir a este proyecto +## Cómo contribuir a este proyecto Si quieres contribuir a este proyecto, hay muchas cosas que puedes hacer. Tenemos una etiqueta en los _issues_ del [repositorio de este @@ -81,5 +81,3 @@ En general, recomendamos usar funciones para las vistas, mejor que vistas basadas en clases. En ningún caso debe entenderse esta recomendación como una prohibición de usar _CBV_, Es solo que preferimos usarlas para casos sencillos y/o triviales, y usar funciones para todo lo demás. - - diff --git a/Makefile b/Makefile index c2877762..c6e32532 100644 --- a/Makefile +++ b/Makefile @@ -26,6 +26,9 @@ static: run: check static python manage.py runserver +shell: + python manage.py shell + rundev: static DEBUG=yes python manage.py runserver_plus diff --git a/apps/commons/templates/base.html b/apps/commons/templates/base.html index aef0f3c4..a31052d5 100644 --- a/apps/commons/templates/base.html +++ b/apps/commons/templates/base.html @@ -1,7 +1,4 @@ -{% load static %} -{% load utils %} - - +{% load static utils %} @@ -17,6 +14,7 @@ {% block style %}{% endblock %} + {% block libs %} {% endblock %} @@ -35,12 +33,8 @@ {% endif %} -
{% if menu %} - is-wide - {% endif %} - "> - {% if menu %}
{% block menu %}{% endblock menu %} @@ -54,11 +48,8 @@ {% endif %}
{% endblock container %} - {% include "footer.html" %} - {% block js %}{% endblock %} - diff --git a/apps/members/menu.py b/apps/members/menu.py index e238463c..b7e32092 100644 --- a/apps/members/menu.py +++ b/apps/members/menu.py @@ -7,6 +7,7 @@ .add_menu_item("Permanencia", "members:membership") .finished() .add_section('ops', 'Operaciones') + .add_menu_item("Abonar anualidad", "members:renew") .add_menu_item("Cambiar contraseña", "members:password_change") .add_menu_item("Cambiar dirección", "members:address_change") .add_menu_item("Salir (Logout)", "members:logout") diff --git a/apps/members/models.py b/apps/members/models.py index 2d482134..a58455b1 100644 --- a/apps/members/models.py +++ b/apps/members/models.py @@ -1,5 +1,6 @@ import datetime +from django.utils import timezone from django.contrib.auth.models import User from django.db import models @@ -12,6 +13,10 @@ ) +def today(): + return timezone.localdate() + + class Member(models.Model): class Meta: @@ -53,13 +58,20 @@ def member_id(self): def __str__(self): return self.full_name + def active_since(self): + first_membership = self.membership_set.first() + return None if first_membership is None else first_membership.valid_from + + def active_until(self): + last_membership = self.membership_set.last() + return None if last_membership is None else last_membership.valid_until + @property def active(self): - last_membership = self.membership_set.last() - if last_membership is None: - return False - valid_until = last_membership.valid_until - return valid_until is None or datetime.date.today() <= valid_until + valid_until = self.active_until() + if valid_until: + return valid_until >= today() + return False class Position(models.Model): @@ -90,7 +102,7 @@ class Meta: @property def active(self): - return self.until is None or datetime.date.today() <= self.until + return self.until is None or today() <= self.until class Membership(models.Model): diff --git a/apps/members/templates/members/profile.html b/apps/members/templates/members/profile.html index af81ad46..9e67ab01 100644 --- a/apps/members/templates/members/profile.html +++ b/apps/members/templates/members/profile.html @@ -1,26 +1,63 @@ -{% extends 'members/base.html' %} +{% extends 'members/base.html' %}{% load utils %} {% block title %}Perfil de socio/a - {{ block.super }}{% endblock %} {% block content %}
- +
-
+ + + +
+
+

Dirección

+
+
+
Dirección {{ member.address|default:"No disponible" }} @@ -43,9 +80,11 @@

Socio/a: #{{ member.pk }}

- Actualizar datos +

+ Actualizar datos

- +
+
{% endblock content %} diff --git a/apps/members/urls.py b/apps/members/urls.py index cbf4ac79..d4f2b941 100644 --- a/apps/members/urls.py +++ b/apps/members/urls.py @@ -8,9 +8,12 @@ path('', views.homepage, name='homepage'), path("profile/", views.profile, name="profile"), path("membership/", views.view_membership, name="membership"), + path("renew/", views.renew, name="renew"), path("password/change/", views.password_change, name="password_change"), path( - "address/change/", views.ChangeAddress.as_view(), name="address_change" + "address/change/", + views.ChangeAddress.as_view(), + name="address_change", ), path("login/", views.member_login, name="login"), path("logout/", views.member_logout, name="logout"), diff --git a/apps/members/views.py b/apps/members/views.py index f0a8431a..774ae625 100644 --- a/apps/members/views.py +++ b/apps/members/views.py @@ -1,11 +1,14 @@ import logging +import stripe + from django.contrib import messages from django.contrib.auth import login, logout from django.contrib.auth.decorators import login_required from django.core.exceptions import PermissionDenied from django.http import HttpRequest, HttpResponse from django.shortcuts import redirect, render +from django.conf import settings from django.urls import reverse, reverse_lazy from django.views.generic import UpdateView @@ -14,11 +17,30 @@ logger = logging.getLogger(__name__) +stripe.api_key = settings.STRIPE_SECRET_KEY def homepage(request): return redirect('members:profile') +@login_required +def renew(request, *args, **kwargs): + member = request.user.member + intent = stripe.PaymentIntent.create( + amount=2000, + currency='eur', + description=f"PyThonCanarias Abono anual socio {member.pk}", + metadata={ + 'integration_check': 'accept_a_payment' + }, + ) + return render(request, 'members/renew.html', { + "titulo": "Renovar membresia anual", + "stripe_public_key": settings.STRIPE_PUBLIC_KEY, + "client_secret": intent.client_secret, + }) + + def member_login(request: HttpRequest) -> HttpResponse: """Allows a user to identify himself/herself with the system.""" if request.user.is_authenticated: diff --git a/main/settings.py b/main/settings.py index 68e361ea..f23f2a7c 100644 --- a/main/settings.py +++ b/main/settings.py @@ -58,6 +58,7 @@ 'django.contrib.staticfiles', 'django.contrib.sites', 'django.contrib.flatpages', + 'django.contrib.humanize', 'django_rq', 'colorfield', 'leaflet', diff --git a/requirements.txt b/requirements.txt index a320f7d6..47e8fa99 100644 --- a/requirements.txt +++ b/requirements.txt @@ -19,7 +19,7 @@ redis==3.5.3 reportlab==3.5.32 rq==1.8.1 sendgrid==5.6.0 -stripe==2.41.0 +stripe==2.60.0 tabulate==0.8.9 uWSGI==2.0.18 xlrd==1.2.0