Skip to content

Commit 787c7d3

Browse files
author
kip
committed
Добавлено поле регистрации - телефон
1 parent 0af24a3 commit 787c7d3

File tree

9 files changed

+65
-4
lines changed

9 files changed

+65
-4
lines changed

config/settings.py

+3
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@
5959
'allauth',
6060
'allauth.account',
6161
'allauth.socialaccount',
62+
'phonenumber_field',
6263
]
6364

6465
MIDDLEWARE = [
@@ -247,3 +248,5 @@
247248
EMAIL_USE_TLS = True
248249

249250
INPUT_DATE_FORMATS = ['%m/%d/%Y']
251+
252+
PHONENUMBER_DEFAULT_REGION = 'RU'

events/forms.py

+7
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
from events.models import Participant, Event, ACCENT_TYPE, Route, PromoCode, Wallet
99
from tinymce.widgets import TinyMCE
10+
from phonenumber_field.formfields import PhoneNumberField
1011

1112

1213
class ParticipantRegistrationForm(forms.ModelForm):
@@ -45,6 +46,10 @@ def __init__(self, *args, **kwargs):
4546
if Event.FIELD_EMAIL in registration_fields:
4647
self.fields[Event.FIELD_EMAIL] = forms.EmailField(label='Email',
4748
required=Event.FIELD_EMAIL in required_fields)
49+
if Event.FIELD_PHONE in registration_fields:
50+
self.fields[Event.FIELD_PHONE] = PhoneNumberField(label='Телефон',
51+
required=Event.FIELD_PHONE in required_fields,
52+
region='RU')
4853

4954
if group_list != ['']:
5055
self.fields['group_index'] = forms.ChoiceField(choices=tuple([(name, name) for name in group_list]),
@@ -368,6 +373,7 @@ class Meta:
368373
Event.FIELD_TEAM,
369374
Event.FIELD_GRADE,
370375
Event.FIELD_EMAIL,
376+
Event.FIELD_PHONE,
371377
'paid',
372378
]
373379
labels = {
@@ -380,6 +386,7 @@ class Meta:
380386
Event.FIELD_TEAM: 'Команда',
381387
Event.FIELD_GRADE: 'Спортивный разряд',
382388
Event.FIELD_EMAIL: 'E-mail',
389+
Event.FIELD_PHONE: 'Телефон',
383390
'paid': 'Оплата произведена',
384391
}
385392

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
# Generated by Django 4.0.8 on 2023-03-29 07:39
2+
3+
from django.db import migrations
4+
import multiselectfield.db.fields
5+
import phonenumber_field.modelfields
6+
7+
8+
class Migration(migrations.Migration):
9+
10+
dependencies = [
11+
('events', '0019_event_price_list'),
12+
]
13+
14+
operations = [
15+
migrations.AddField(
16+
model_name='participant',
17+
name='phone_number',
18+
field=phonenumber_field.modelfields.PhoneNumberField(blank=True, max_length=128, region=None),
19+
),
20+
migrations.AlterField(
21+
model_name='event',
22+
name='registration_fields',
23+
field=multiselectfield.db.fields.MultiSelectField(blank=True, choices=[('gender', 'Пол'), ('birth_year', 'Год рождения'), ('city', 'Город'), ('team', 'Команда'), ('grade', 'Разряд'), ('email', 'Email'), ('phone_number', 'Телефон')], default='gender,birth_year,city,team', max_length=52, null=True),
24+
),
25+
migrations.AlterField(
26+
model_name='event',
27+
name='required_fields',
28+
field=multiselectfield.db.fields.MultiSelectField(blank=True, choices=[('birth_year', 'Год рождения'), ('city', 'Город'), ('team', 'Команда'), ('email', 'Email'), ('phone_number', 'Телефон')], default=None, max_length=39, null=True),
29+
),
30+
]

events/models.py

+8-1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
from django.db import models
55
from multiselectfield import MultiSelectField
66
from django.contrib.postgres.fields import ArrayField
7+
from phonenumber_field.modelfields import PhoneNumberField
78

89
from config import settings
910

@@ -130,27 +131,31 @@ class Event(models.Model):
130131
FIELD_GENDER = 'gender'
131132
FIELD_GRADE = 'grade'
132133
FIELD_EMAIL = 'email'
134+
FIELD_PHONE = 'phone_number'
133135
OPTIONAL_FIELDS = [
134136
FIELD_BIRTH_YEAR,
135137
FIELD_CITY,
136138
FIELD_TEAM,
137139
FIELD_GENDER,
138140
FIELD_GRADE,
139141
FIELD_EMAIL,
142+
FIELD_PHONE,
140143
]
141144
REQUIRED_FIELDS = [
142145
(FIELD_BIRTH_YEAR, 'Год рождения'),
143146
(FIELD_CITY, 'Город'),
144147
(FIELD_TEAM, 'Команда'),
145148
(FIELD_EMAIL, 'Email'),
149+
(FIELD_PHONE, 'Телефон'),
146150
]
147151
REGISTRATION_FIELDS = [
148152
(FIELD_GENDER, 'Пол'),
149153
(FIELD_BIRTH_YEAR, 'Год рождения'),
150154
(FIELD_CITY, 'Город'),
151155
(FIELD_TEAM, 'Команда'),
152156
(FIELD_GRADE, 'Разряд'),
153-
(FIELD_EMAIL, 'Email')
157+
(FIELD_EMAIL, 'Email'),
158+
(FIELD_PHONE, 'Телефон'),
154159
]
155160
registration_fields = MultiSelectField(choices=REGISTRATION_FIELDS,
156161
default=f'{FIELD_GENDER},{FIELD_BIRTH_YEAR},{FIELD_CITY},{FIELD_TEAM}',
@@ -227,6 +232,8 @@ class Participant(models.Model):
227232
scores = models.JSONField(default=_get_blank_json)
228233
counted_routes = ArrayField(models.IntegerField(), blank=True, null=True)
229234

235+
phone_number = PhoneNumberField(blank=True)
236+
230237
def __str__(self):
231238
return f'<Part-t: Name={self.last_name}, PIN={self.pin}, Score={self.score}, set={self.set_index}>'
232239

events/services.py

+4
Original file line numberDiff line numberDiff line change
@@ -247,6 +247,7 @@ def update_participant(event: Event, participant: Participant, cd: dict) -> Part
247247
participant.paid = cd['paid'] if 'paid' in cd else False
248248
participant.email = cd['email'] if 'email' in cd else ''
249249
participant.reg_type_index = cd['reg_type_index'] if 'reg_type_index' in cd else 0
250+
participant.phone_number = cd['phone_number'] if 'phone_number' in cd else ''
250251
participant.save()
251252

252253
if need_update_results:
@@ -270,6 +271,7 @@ def _create_participant(event: Event, first_name: str, last_name: str,
270271
set_index: int = 0,
271272
email: str = '',
272273
reg_type_index: int = 0,
274+
phone_number: str = '',
273275
) -> Participant or None:
274276
if 0 < event.set_max_participants <= event.participant.filter(set_index=set_index).count():
275277
return None
@@ -290,6 +292,7 @@ def _create_participant(event: Event, first_name: str, last_name: str,
290292
set_index=set_index,
291293
email=email,
292294
reg_type_index=reg_type_index,
295+
phone_number=phone_number,
293296
)
294297
return participant
295298

@@ -312,6 +315,7 @@ def register_participant(event: Event, cd: dict) -> Participant:
312315
set_index=get_set_list(event=event).index(cd['set_index']) if 'set_index' in cd else 0,
313316
email=cd[Event.FIELD_EMAIL] if Event.FIELD_EMAIL in cd else '',
314317
reg_type_index=cd['reg_type_index'] if 'reg_type_index' in cd else 0,
318+
phone_number = cd['phone_number'] if 'phone_number' in cd else '',
315319
)
316320
_check_participants_number_to_close_registration(event=event)
317321
return participant
Binary file not shown.

events/templates/events/event/participants.html

+7-1
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,9 @@
4040
{% if user == event.owner or user.is_superuser %}
4141
<th>Pin</th>
4242
{% endif %}
43+
{% if user == event.owner or user.is_superuser %}
44+
<th>Телефон</th>
45+
{% endif %}
4346
{% if 'gender' in fields %}
4447
<th data-field="gender" data-sortable="true">Пол</th>
4548
{% endif %}
@@ -86,9 +89,12 @@
8689
{% endif %}
8790
</td>
8891
{% endif %}
89-
{% if user.is_superuser %}
92+
{% if user == event.owner or user.is_superuser %}
9093
<td>{{ participant.pin }}</td>
9194
{% endif %}
95+
{% if user == event.owner or user.is_superuser %}
96+
<td>{{ participant.phone_number }}</td>
97+
{% endif %}
9298
{% if 'gender' in fields %}
9399
<td>{{ participant.get_gender_display }}</td>
94100
{% endif %}

events/xl_tools.py

+4-2
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,10 @@ def export_participants_to_start_list(event: Event):
4545
sheet.cell(row=ROW_OFFSET + index, column=7).value = p.team
4646
sheet.cell(row=ROW_OFFSET + index, column=8).value = group_list[p.group_index] if group_list != [] else ''
4747
sheet.cell(row=ROW_OFFSET + index, column=9).value = p.pin
48-
sheet.cell(row=ROW_OFFSET + index, column=10).value = "Да" if p.paid else "-"
49-
sheet.cell(row=ROW_OFFSET + index, column=11).value = reg_type_list[p.reg_type_index].strip() if reg_type_list != [] else ''
48+
sheet.cell(row=ROW_OFFSET + index, column=10).value = str(p.phone_number)
49+
sheet.cell(row=ROW_OFFSET + index, column=11).value = p.email
50+
sheet.cell(row=ROW_OFFSET + index, column=12).value = "Да" if p.paid else "-"
51+
sheet.cell(row=ROW_OFFSET + index, column=13).value = reg_type_list[p.reg_type_index].strip() if reg_type_list != [] else ''
5052
book.remove(book.worksheets[0])
5153
book.close()
5254

requirements.txt

+2
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ django-extensions==3.2.1
2323
django-heroku==0.3.1
2424
django-maintenance-mode==0.16.3
2525
django-multiselectfield==0.1.12
26+
django-phonenumber-field==7.0.2
2627
django-queryset-csv==1.1.0
2728
django-tinymce==3.5.0
2829
et-xmlfile==1.1.0
@@ -38,6 +39,7 @@ oauthlib==3.2.2
3839
openpyxl==3.0.10
3940
packaging==21.3
4041
pathspec==0.10.1
42+
phonenumberslite==8.13.8
4143
Pillow==9.2.0
4244
pip-review==1.2.0
4345
platformdirs==2.5.2

0 commit comments

Comments
 (0)