Skip to content

Commit 93b54ab

Browse files
authored
Merge pull request #439 from pythoncanarias/cfp
Add CFP form and notifications for events
2 parents 56c1822 + 24c4b18 commit 93b54ab

59 files changed

Lines changed: 1430 additions & 339 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

Dockerfile

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,9 @@ RUN apt-get update \
1919
ca-certificates \
2020
postgresql-client \
2121
libpq-dev \
22+
binutils \
23+
libproj-dev \
24+
gdal-bin \
2225
&& rm -rf /var/lib/apt/lists/*
2326

2427

apps/about/apps.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,4 @@
22

33

44
class AboutConfig(AppConfig):
5-
name = 'about'
5+
name = 'apps.about'
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
# Generated by Django 3.2.13 on 2022-05-10 22:36
2+
3+
from django.db import migrations, models
4+
5+
6+
class Migration(migrations.Migration):
7+
8+
dependencies = [
9+
('about', '0003_faqitem'),
10+
]
11+
12+
operations = [
13+
migrations.AlterField(
14+
model_name='ally',
15+
name='id',
16+
field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
17+
),
18+
migrations.AlterField(
19+
model_name='faqitem',
20+
name='id',
21+
field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
22+
),
23+
]

apps/api/apps.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,4 @@
22

33

44
class ApiConfig(AppConfig):
5-
name = 'api'
5+
name = 'apps.api'

apps/certificates/apps.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,4 @@
22

33

44
class CertificatesConfig(AppConfig):
5-
name = 'certificates'
5+
name = 'apps.certificates'

apps/commons/apps.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,4 @@
22

33

44
class CommonsConfig(AppConfig):
5-
name = 'commons'
5+
name = 'apps.commons'

apps/events/admin.py

Lines changed: 48 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,21 @@
11
from django.contrib import admin, messages
22

3-
from .models import Badge, Event, Refund, WaitingList
3+
from .models import (
4+
Badge,
5+
Event,
6+
Proposal,
7+
Refund,
8+
WaitingList,
9+
)
410

511

612
def render_event_badges(modeladmin, request, queryset):
713
prints = []
814
for event in queryset:
915
prints.append(request.get_host() + event.render_all_badges())
10-
messages.add_message(request, messages.INFO,
11-
f"Generated PDFs in -> {' '.join(prints)} ")
16+
messages.add_message(
17+
request, messages.INFO, f"Generated PDFs in -> {' '.join(prints)} "
18+
)
1219

1320

1421
render_event_badges.short_description = "Generate a PDF with all the badges"
@@ -21,42 +28,57 @@ class BadgeInline(admin.ModelAdmin):
2128

2229
@admin.register(Event)
2330
class EventAdmin(admin.ModelAdmin):
24-
date_hierarchy = 'start_date'
31+
date_hierarchy = "start_date"
2532
list_filter = [
26-
'active',
27-
'venue',
28-
'closed_schedule',
29-
]
30-
prepopulated_fields = {'hashtag': ('name', ), }
33+
"active",
34+
"venue",
35+
"closed_schedule",
36+
]
37+
prepopulated_fields = {
38+
"hashtag": ("name",),
39+
}
3140
actions = [render_event_badges]
32-
list_display = ('name', 'hashtag', 'active',
33-
'opened_ticket_sales', 'start_date')
41+
list_display = ("name", "hashtag", "active", "opened_ticket_sales", "start_date")
3442

3543

3644
@admin.register(WaitingList)
3745
class WaitingListAdmin(admin.ModelAdmin):
3846
list_display = (
39-
'full_name',
40-
'email',
41-
'phone',
42-
'created_at',
43-
'fixed_at',
44-
'buy_code',
45-
)
47+
"full_name",
48+
"email",
49+
"phone",
50+
"created_at",
51+
"fixed_at",
52+
"buy_code",
53+
)
4654

4755
def full_name(self, obj):
48-
return '{}, {}'.format(
56+
return "{}, {}".format(
4957
obj.surname,
5058
obj.name,
51-
)
59+
)
5260

5361

5462
@admin.register(Refund)
5563
class RefundAdmin(admin.ModelAdmin):
5664
list_display = (
57-
'pk',
58-
'ticket',
59-
'event',
60-
'created_at',
61-
'fixed_at',
62-
)
65+
"pk",
66+
"ticket",
67+
"event",
68+
"created_at",
69+
"fixed_at",
70+
)
71+
72+
73+
@admin.register(Proposal)
74+
class ProposalAdmin(admin.ModelAdmin):
75+
list_display = (
76+
"pk",
77+
"name",
78+
"surname",
79+
"email",
80+
"title",
81+
)
82+
list_filter = [
83+
"event",
84+
]

apps/events/apps.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,4 @@
22

33

44
class EventsConfig(AppConfig):
5-
name = 'events'
5+
name = 'apps.events'

apps/events/converters.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
#!/usr/bin/env python
2+
# -*- coding: utf-8 -*-
3+
4+
from apps.events.models import Event
5+
6+
7+
class EventConverter:
8+
regex = r'[A-Za-z0-9_\-]+'
9+
10+
def to_python(self, value):
11+
event = Event.get_by_slug(value)
12+
if not event:
13+
raise ValueError("El identificador del evento es incorrecto")
14+
return event
15+
16+
def to_url(self, value):
17+
if not isinstance(value, Event):
18+
raise ValueError(
19+
"Se necesita una instancia de la clase Event, pero"
20+
" es una instancia de {value.__class__.__name__}."
21+
)
22+
return value.slug

apps/events/forms.py

Lines changed: 83 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -2,57 +2,120 @@
22

33
from django import forms
44

5-
from .models import Refund
5+
from .models import Proposal, Refund
66

77
UUID_LAST_DIGITS = 12
88

99

10+
class ProposalForm(forms.ModelForm):
11+
class Meta:
12+
model = Proposal
13+
fields = [
14+
"name",
15+
"surname",
16+
"email",
17+
"title",
18+
"description",
19+
]
20+
21+
def __init__(self, event, *args, **kwargs):
22+
super().__init__(*args, **kwargs)
23+
self.fields["name"].widget.attrs.update(
24+
{
25+
"id": "cfp-name",
26+
"size": "20",
27+
"placeholder": "Tu nombre",
28+
"class": "input is-rounded",
29+
}
30+
)
31+
self.fields["surname"].widget.attrs.update(
32+
{
33+
"id": "cfp-surname",
34+
"size": "40",
35+
"placeholder": "Tus apellidos",
36+
"class": "input is-rounded",
37+
}
38+
)
39+
self.fields["email"].widget.attrs.update(
40+
{
41+
"id": "cfp-email",
42+
"size": "40",
43+
"placeholder": "Tu email",
44+
"class": "input is-rounded",
45+
}
46+
)
47+
self.fields["title"].widget.attrs.update(
48+
{
49+
"id": "cfp-title",
50+
"size": "60",
51+
"placeholder": "El título de tu maravillosa charla",
52+
"class": "input is-rounded",
53+
}
54+
)
55+
self.fields["description"].widget.attrs.update(
56+
{
57+
"id": "cfp-title",
58+
"cols": "60",
59+
"rows": "20",
60+
"placeholder": ("El texto de tu maravillosa charla. "
61+
"¿Aceptamos markdown? ¡Por supuesto!"),
62+
"class": "textarea",
63+
}
64+
)
65+
self.event = event
66+
67+
def save(self):
68+
proposal = super().save(commit=False)
69+
proposal.event = self.event
70+
proposal.save()
71+
return proposal
72+
73+
1074
class EmailForm(forms.Form):
11-
email = forms.EmailField(label='Tu email', max_length=192)
75+
email = forms.EmailField(label="Tu email", max_length=192)
1276

1377

1478
class WaitingListForm(forms.Form):
15-
email = forms.EmailField(label='Tu email', max_length=192)
16-
name = forms.CharField(label='Nombre', max_length=256)
17-
surname = forms.CharField(label='Apellidos', max_length=256)
18-
phone = forms.CharField(label='Teléfono', max_length=32)
79+
email = forms.EmailField(label="Tu email", max_length=192)
80+
name = forms.CharField(label="Nombre", max_length=256)
81+
surname = forms.CharField(label="Apellidos", max_length=256)
82+
phone = forms.CharField(label="Teléfono", max_length=32)
1983

2084

2185
class RefundForm(forms.Form):
22-
email = forms.EmailField(label='Tu email', max_length=192)
86+
email = forms.EmailField(label="Tu email", max_length=192)
2387
uuid = forms.CharField()
2488

2589
def __init__(self, event, *args, **kwargs):
26-
logging.error('Llamada al metodo __init__ de RefundForm')
90+
logging.error("Llamada al metodo __init__ de RefundForm")
2791
super().__init__(*args, **kwargs)
2892
self.event = event
2993

3094
def clean_uuid(self):
3195
email = self.cleaned_data["email"]
3296
uuid = self.cleaned_data["uuid"]
33-
if uuid == 'tu puta madre':
34-
raise forms.ValidationError('Cuida ese vocabulario')
97+
if uuid == "tu puta madre":
98+
raise forms.ValidationError("Cuida ese vocabulario")
3599

36100
if len(uuid) < UUID_LAST_DIGITS:
37101
raise forms.ValidationError(
38-
'Necesito los últimos () letras o dígitos '
39-
'del código'.format(UUID_LAST_DIGITS)
40-
)
102+
"Necesito los últimos () letras o dígitos "
103+
"del código".format(UUID_LAST_DIGITS)
104+
)
41105
uuid = uuid[-UUID_LAST_DIGITS:]
42106
tickets = list(
43107
self.event.all_tickets()
44108
.filter(customer_email=email)
45109
.filter(keycode__iendswith=uuid)
46-
)
110+
)
47111
if len(tickets) != 1:
48112
raise forms.ValidationError(
49-
'El correo o las últimos {} letras o dígitos del'
50-
' codigo están mal.'.format(UUID_LAST_DIGITS)
51-
)
113+
"El correo o las últimos {} letras o dígitos del"
114+
" codigo están mal.".format(UUID_LAST_DIGITS)
115+
)
52116
self.ticket = tickets[0]
53117
if Refund.exists(self.event, self.ticket):
54118
raise forms.ValidationError(
55-
'Ya se ha solicitado una devolución del'
56-
' importe para ese ticket'
57-
)
119+
"Ya se ha solicitado una devolución del" " importe para ese ticket"
120+
)
58121
return uuid

0 commit comments

Comments
 (0)