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 %}
{% 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 %}
-
- Datos personales
-
-
+
+
+
+
Username {{ member.user.username }}
Nombre {{ member.user.first_name }}
Apellidos {{ member.user.last_name }}
Email {{ member.user.email }}
-
+
-
- Socio/a: #{{ member.pk }}
-
-
+
+
+
+
+ Número de socio {{ member.pk }}
+
+ Socio desde
+ {{ member.active_since|as_date }}
+
+
+ Activo hasta
+ {{ member.active_until }}
+
+ Abonar anualidad
+
+
+
+
+
+ Puedes abonar la anualidad en cualquier momento, el périodo
+ se añadirá siempre a continuación del último día del periodo
+ anterior
+
+
+
+
+
+
+
+
+
+
{% 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