Skip to content

Commit

Permalink
Merge development into master (#773)
Browse files Browse the repository at this point in the history
* pls fix

* migration for total payment

* * Added total payment to ticket class
    - Displays total payment in ticket view
    - Calculated and stored upon confirmation that participant is ready to pay

* Calculate cost with chosen amount of given item

* add a search and select widget using django-select2 package

* add django-select2 to requirements.txt

---------

Co-authored-by: blyvil <[email protected]>
Co-authored-by: Marmingen <[email protected]>
Co-authored-by: Oskar Rick <[email protected]>
  • Loading branch information
4 people committed Aug 3, 2023
1 parent 574aa7a commit c34435c
Show file tree
Hide file tree
Showing 7 changed files with 47 additions and 17 deletions.
3 changes: 3 additions & 0 deletions requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -38,3 +38,6 @@ django-jsonschema-form==1.0.3

# Improved environment variable handling
python-decouple==3.7

# Search and select widget
django-select2==8.1.1
18 changes: 18 additions & 0 deletions src/events/migrations/0007_ticket_total_payment.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# Generated by Django 3.2.17 on 2023-03-29 17:32

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('events', '0006_alter_event_raffle_has_been_held'),
]

operations = [
migrations.AddField(
model_name='ticket',
name='total_payment',
field=models.FloatField(default=0, help_text='Price to be paid by participant(s)', verbose_name='Total payment'),
),
]
13 changes: 10 additions & 3 deletions src/events/models/participant.py
Original file line number Diff line number Diff line change
Expand Up @@ -48,10 +48,17 @@ def calculate_order_cost(self):
cost += self.ticket.event.price_per_participant_nonmember

for orderable in price_list.fields:
if self.order.get(orderable['Name']):
order = self.order.get(orderable['Name'])
if order:
if is_member:
cost += orderable.get('Price', 0)
if isinstance(order, int):
cost += order * orderable.get('Non-member price', 0)
else:
cost += orderable.get('Price', 0)
else:
cost += orderable.get('Non-member price', 0)
if isinstance(order, int):
cost += order * orderable.get('Non-member price', 0)
else:
cost += orderable.get('Non-member price', 0)

return cost
24 changes: 11 additions & 13 deletions src/events/models/ticket.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,7 @@
import events.models as event_models
from members.models import Member


class OwnerFieldPanel(FieldPanel):
def on_form_bound(self):
choices = self.model.get_owner_choices(self.model)
self.form.fields['owner'].queryset = choices
self.form.fields['owner'].empty_label = None
super().on_form_bound()

from django_select2.forms import Select2Widget

class Ticket(models.Model):
"""A ticket type determines what allows a user entry to an event"""
Expand All @@ -41,7 +34,8 @@ class Ticket(models.Model):
help_text=_(
'Dictates the number of participants '
'in the ticket besides the ticket owner.'),
default=0)
default=0
)

locked = models.BooleanField(
default=False,
Expand All @@ -63,6 +57,12 @@ class Ticket(models.Model):
default='unpaid',
)

total_payment = models.FloatField(
verbose_name=('Total payment'),
help_text=('Price to be paid by participant(s)'),
default=0,
)

class Meta:
verbose_name = _('Ticket')
verbose_name_plural = _('Tickets')
Expand All @@ -81,15 +81,13 @@ def __str__(self) -> str:
str(self.event),
)

def get_owner_choices(self):
return Member.objects.all().order_by('email')

# ------ Administrator settings ------
panels = [
OwnerFieldPanel('owner'),
FieldPanel('owner', widget=Select2Widget),
FieldPanel('event'),
FieldPanel('ticket_number'),
FieldPanel('locked'),
FieldPanel('total_payment'),
FieldPanel('payment_status'),
]

Expand Down
3 changes: 3 additions & 0 deletions src/events/views/ticket_page.py
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,9 @@ def my_ticket(request, event_pk):
instance.delete()
elif 'lock_for_payment' in request.POST:
ticket.locked = True
ticket.total_payment = event.base_price + \
sum([participant.calculate_order_cost()
for participant in queryset])
instance.save()
else:
cleaned_data = form.cleaned_data
Expand Down
2 changes: 1 addition & 1 deletion src/events/wagtail_hooks.py
Original file line number Diff line number Diff line change
Expand Up @@ -148,7 +148,7 @@ class TicketAdmin(ModelAdmin):
menu_label = _('Tickets')
menu_icon = 'fa-ticket'
menu_order = 300
list_display = ['owner_person_nr', 'owner_email', 'event', 'ticket_number']
list_display = ['owner_person_nr', 'owner_email', 'event', 'ticket_number', 'total_payment']
list_filter = ('event', 'payment_status')
list_export = ('event', 'owner_person_nr', 'owner_email',
'ticket_number', 'payment_status')
Expand Down
1 change: 1 addition & 0 deletions src/moore/settings/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,7 @@
'wagtailcaptcha',
'captcha',
'jsonschemaform',
'django_select2', # Custom select2 widget

'django.contrib.admin', # Used for wagtail admin filters
'django.contrib.auth',
Expand Down

0 comments on commit c34435c

Please sign in to comment.