Skip to content

Commit 7cab902

Browse files
committed
Revert "Revert "Feature tickets" (#377)"
This reverts commit 5d6d103.
1 parent 0926c32 commit 7cab902

File tree

10 files changed

+199
-0
lines changed

10 files changed

+199
-0
lines changed

stregsystem.log

Whitespace-only changes.

stregsystem/admin.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
Room,
1515
Sale,
1616
MobilePayment,
17+
Event,
1718
NamedProduct,
1819
)
1920
from stregsystem.templatetags.stregsystem_extras import money
@@ -341,6 +342,18 @@ def has_delete_permission(self, request, obj=None):
341342
return False
342343

343344

345+
class EventEntryAdmin(admin.ModelAdmin):
346+
search_fields = ('name', 'id')
347+
list_display = (
348+
'activated',
349+
'id',
350+
'name',
351+
)
352+
353+
def activated(self, event):
354+
return event.is_active()
355+
356+
344357
admin.site.register(LogEntry, LogEntryAdmin)
345358
admin.site.register(Sale, SaleAdmin)
346359
admin.site.register(Member, MemberAdmin)
@@ -351,3 +364,4 @@ def has_delete_permission(self, request, obj=None):
351364
admin.site.register(Category, CategoryAdmin)
352365
admin.site.register(Room)
353366
admin.site.register(MobilePayment, MobilePaymentAdmin)
367+
admin.site.register(Event, EventEntryAdmin)
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
# Generated by Django 2.2.24 on 2022-04-12 17:47
2+
3+
from django.db import migrations, models
4+
import django.db.models.deletion
5+
6+
7+
class Migration(migrations.Migration):
8+
9+
dependencies = [
10+
('stregsystem', '0015_product_caffeine_content_mg'),
11+
]
12+
13+
operations = [
14+
migrations.CreateModel(
15+
name='Event',
16+
fields=[
17+
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
18+
('name', models.CharField(max_length=32)),
19+
('active', models.BooleanField()),
20+
('time', models.DateTimeField()),
21+
('ticket_start_threshold', models.DateTimeField()),
22+
('ticket_end_threshold', models.DateTimeField()),
23+
('product', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='stregsystem.Product')),
24+
],
25+
),
26+
]

stregsystem/models.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -617,6 +617,22 @@ def __str__(self):
617617
return self.product.name + ": " + money(self.price) + " (" + str(self.changed_on) + ")"
618618

619619

620+
# A model to link certain products to events, to facilitate showing of active tickets
621+
class Event(models.Model):
622+
name = models.CharField(max_length=32)
623+
active = models.BooleanField()
624+
product = models.ForeignKey(Product, on_delete=models.CASCADE)
625+
time = models.DateTimeField(null=False, blank=False)
626+
ticket_start_threshold = models.DateTimeField(null=False, blank=False)
627+
ticket_end_threshold = models.DateTimeField(null=False, blank=False)
628+
629+
def is_active(self):
630+
is_after_start = self.ticket_start_threshold <= timezone.now()
631+
is_before_end = self.ticket_end_threshold >= timezone.now()
632+
633+
return self.active and is_after_start and is_before_end
634+
635+
620636
class Sale(models.Model):
621637
member = models.ForeignKey(Member, on_delete=models.CASCADE)
622638
product = models.ForeignKey(Product, on_delete=models.CASCADE)

stregsystem/templates/stregsystem/menu.html

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,9 @@
2525
</th>
2626
<th>
2727
<a href="/{{room.id}}/user/{{member.id}}/pay">Indsæt penge</a>
28+
</th>
29+
<th>
30+
<a href="/{{room.id}}/user/{{member.id}}/tickets">Mine billetter</a>
2831
</th>
2932
<th>
3033
<a href="/{{room.id}}/user/{{member.id}}/rank">Rangliste</a>
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
{% extends "stregsystem/base.html" %}
2+
3+
{% load stregsystem_extras %}
4+
5+
{% block title %}Treoens stregsystem : Brugerinfo {% endblock %}
6+
7+
{% block content %}
8+
<center><h3>{{member.firstname}} {{member.lastname}} ({{member.email}})</h3></center>
9+
10+
<center><h2><a href="/{{room.id}}/sale/{{member.id}}">Tilbage til produktmenu</a></h2></center>
11+
12+
<center>
13+
<b>Aktive billeter</b>
14+
<table border=1 width="60%">
15+
<tr>
16+
<th align=left>Event</th>
17+
<th align=left>Produkt</th>
18+
<th align=left>Pris</th>
19+
<th align=left>Start Tidspunkt</th>
20+
</tr>
21+
{% autoescape off %}
22+
{% for event in bought_events_list %}
23+
<tr>
24+
<td>{{event.name}}</td>
25+
<td>{{event.product.name}}</td>
26+
<td>{{event.product.price|money}}</td>
27+
<td>{{event.time}}</td>
28+
</tr>
29+
{% endfor %}
30+
{% endautoescape %}
31+
</table>
32+
</center>
33+
34+
{% endblock %}

stregsystem/templates/stregsystem/menu_userinfo.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,5 +90,6 @@
9090
</tr>
9191
</table>
9292

93+
9394
{% endblock %}
9495

stregsystem/tests.py

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -852,6 +852,100 @@ def test_is_active_deactive_in_stock(self):
852852
self.assertFalse(product.is_active())
853853

854854

855+
class EventTests(TestCase):
856+
def setUp(self):
857+
self.jeff = Member.objects.create(
858+
username="Jeff",
859+
)
860+
861+
def test_is_active_active_not_expired(self):
862+
product = Product.objects.create(
863+
active=True,
864+
price=100,
865+
)
866+
event = Event.objects.create(
867+
name="testEvent",
868+
active=True,
869+
product=product,
870+
time=timezone.now() + datetime.timedelta(hours=1),
871+
ticket_start_threshold=timezone.now() - datetime.timedelta(hours=1),
872+
ticket_end_threshold=timezone.now() + datetime.timedelta(hours=1),
873+
)
874+
875+
self.assertTrue(event.is_active())
876+
877+
def test_is_active_active_expired_after(self):
878+
product = Product.objects.create(
879+
active=True,
880+
price=100,
881+
)
882+
event = Event.objects.create(
883+
name="testEvent",
884+
active=True,
885+
product=product,
886+
time=timezone.now() + datetime.timedelta(hours=1),
887+
ticket_start_threshold=timezone.now() - datetime.timedelta(hours=10),
888+
ticket_end_threshold=timezone.now() - datetime.timedelta(hours=1),
889+
)
890+
891+
self.assertFalse(event.is_active())
892+
893+
def test_is_active_active_before_active(self):
894+
product = Product.objects.create(
895+
active=True,
896+
price=100,
897+
)
898+
event = Event.objects.create(
899+
name="testEvent",
900+
active=True,
901+
product=product,
902+
time=timezone.now() + datetime.timedelta(hours=1),
903+
ticket_start_threshold=timezone.now() + datetime.timedelta(hours=2),
904+
ticket_end_threshold=timezone.now() + datetime.timedelta(hours=5),
905+
)
906+
907+
self.assertFalse(event.is_active())
908+
909+
def test_is_active_inactive(self):
910+
product = Product.objects.create(
911+
active=True,
912+
price=100,
913+
)
914+
event = Event.objects.create(
915+
name="testEvent",
916+
active=False,
917+
product=product,
918+
time=timezone.now() + datetime.timedelta(hours=1),
919+
ticket_start_threshold=timezone.now() - datetime.timedelta(hours=10),
920+
ticket_end_threshold=timezone.now() - datetime.timedelta(hours=1),
921+
)
922+
923+
self.assertFalse(event.is_active())
924+
925+
def test_is_active_inactive_expired(self):
926+
product = Product.objects.create(
927+
active=False, price=100, deactivate_date=(timezone.now() - datetime.timedelta(hours=1))
928+
)
929+
930+
self.assertFalse(product.is_active())
931+
932+
def test_is_active_deactive_out_of_stock(self):
933+
product = Product.objects.create(
934+
active=False, price=100, quantity=1, start_date=datetime.date(year=2017, month=12, day=1)
935+
)
936+
product.sale_set.create(price=100, member=self.jeff)
937+
938+
self.assertFalse(product.is_active())
939+
940+
def test_is_active_deactive_in_stock(self):
941+
product = Product.objects.create(
942+
active=False, price=100, quantity=2, start_date=datetime.date(year=2017, month=12, day=1)
943+
)
944+
product.sale_set.create(price=100, member=self.jeff)
945+
946+
self.assertFalse(product.is_active())
947+
948+
855949
class SaleTests(TestCase):
856950
def setUp(self):
857951
self.member = Member.objects.create(username="jon", balance=100)

stregsystem/urls.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
re_path(r'^(?P<room_id>\d+)/sale/\d+/\d+/$', lambda request, room_id: redirect('menu_index', room_id=room_id), name="menu_sale"),
2929
re_path(r'^(?P<room_id>\d+)/user/(?P<member_id>\d+)/$', views.menu_userinfo, name="userinfo"),
3030
re_path(r'^(?P<room_id>\d+)/user/(?P<member_id>\d+)/pay$', views.menu_userpay, name="userpay"),
31+
re_path(r'^(?P<room_id>\d+)/user/(?P<member_id>\d+)/tickets$', views.menu_ticketsview, name="usertickets"),
3132
re_path(r'^(?P<room_id>\d+)/user/(?P<member_id>\d+)/rank$', views.menu_userrank, name="userrank"),
3233
re_path(r'^api/member/payment/qr$', views.qr_payment, name="payment_qr"),
3334
re_path(r'^api/member/active$', views.check_user_active, name="active_member"),

stregsystem/views.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
Product,
3434
Room,
3535
Sale,
36+
Event,
3637
StregForbudError,
3738
MobilePayment,
3839
Category,
@@ -242,6 +243,15 @@ def menu_userinfo(request, room_id, member_id):
242243
return render(request, 'stregsystem/menu_userinfo.html', locals())
243244

244245

246+
# Used to see active tickets
247+
def menu_ticketsview(request, room_id, member_id):
248+
room = Room.objects.get(pk=room_id)
249+
member = Member.objects.get(pk=member_id, active=True)
250+
bought_events_list = Event.objects.filter(product__in=member.sale_set.values('product'))
251+
252+
return render(request, 'stregsystem/menu_ticketsview.html', locals())
253+
254+
245255
def menu_userpay(request, room_id, member_id):
246256
room = Room.objects.get(pk=room_id)
247257
member = Member.objects.get(pk=member_id, active=True)

0 commit comments

Comments
 (0)