Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
85 commits
Select commit Hold shift + click to select a range
c281164
new site
ThomasBow Nov 19, 2025
b55de77
Change models, make migration, add url
ThomasBow Nov 21, 2025
bf845ff
Merge tag 'v2.6.5' into tickets
ThomasBow Nov 21, 2025
04616b4
changes to the models, ticket site and admin site
ThomasBow Nov 21, 2025
71435da
new migration
ThomasBow Nov 21, 2025
ec6880a
model changes
ThomasBow Nov 21, 2025
6e2f814
fix
ThomasBow Nov 21, 2025
9749fdc
new migration
ThomasBow Nov 25, 2025
9d89a4d
forgot to remove
ThomasBow Nov 25, 2025
4d5a42b
Black
krestenlaust Jan 8, 2026
5e4a3c9
new ticket record model relations
ThomasBow Jan 10, 2026
222071e
black and missing from previous
ThomasBow Jan 10, 2026
2634386
Merge branch 'next' into tickets
ThomasBow Jan 10, 2026
3bcb9ea
chmod +x migrate fixture script
ThomasBow Jan 11, 2026
d8c2838
Add new migration and function for ticket creation on purchase
ThomasBow Feb 11, 2026
ca4e6f6
updates testdata fixture
ThomasBow Feb 11, 2026
57fbbc3
moves refund information from ticket to sale and simplifies ticket_re…
ThomasBow Feb 11, 2026
40c6649
migrations
ThomasBow Feb 11, 2026
2ea2ecc
updates testdata fixture
ThomasBow Feb 11, 2026
2a98431
updates testdata fixture
ThomasBow Feb 11, 2026
2360ce7
fixes some models
ThomasBow Feb 11, 2026
c356ad3
redos migrations
ThomasBow Feb 11, 2026
7e65aad
Adds ability to refund your own tickets, and fixes some models
ThomasBow Feb 11, 2026
a8d9fc3
fixes some models and adds some new functionality
ThomasBow Feb 11, 2026
b50ae9d
redos migrations
ThomasBow Feb 11, 2026
da2a45a
adds info to ticket menu and new data to testdata.json
ThomasBow Feb 11, 2026
35a468c
first iteration of tickets /fl
ThomasBow Feb 11, 2026
23f08bc
updates fixtures
ThomasBow Feb 11, 2026
f503b36
adds some tests
ThomasBow Feb 12, 2026
e639d4f
implements tests for all but one method
ThomasBow Feb 17, 2026
7761859
black formatter
ThomasBow Feb 17, 2026
26823e4
Merge branch 'next' into tickets
ThomasBow Feb 17, 2026
d86dcff
introduces safer validation
ThomasBow Feb 17, 2026
f274f67
adds a missing sale test for refund process method
ThomasBow Feb 17, 2026
fe52161
black formatter
ThomasBow Feb 17, 2026
995a141
updates fixture testdata
ThomasBow Feb 18, 2026
452581c
updates fixture testdata-heatmap
ThomasBow Feb 18, 2026
2cb1b08
updates fixture testdata-mobilepay
ThomasBow Feb 18, 2026
9798174
updates fixture testdata-themes
ThomasBow Feb 18, 2026
9f786f4
Migrate fixtures
krestenlaust Mar 3, 2026
92c2847
uv files
ThomasBow Mar 10, 2026
0d3aae6
Merge branch 'next' into tickets
krestenlaust Mar 14, 2026
d3eed03
Update stregsystem/templates/stregsystem/menu_user_tickets.html
ThomasBow Mar 15, 2026
e99f693
Update manage.py
ThomasBow Mar 15, 2026
d57bae0
Update stregsystem/templates/stregsystem/menu_user_tickets.html
ThomasBow Mar 15, 2026
4afed33
Resolves some comment in the thread
ThomasBow Mar 15, 2026
a9b3c6b
Fixed a test and errors caused by ticket owner changes
ThomasBow Mar 15, 2026
7bca231
Started preparing for refundable final time
ThomasBow Mar 15, 2026
121775e
migrations
ThomasBow Mar 15, 2026
312d80e
uv script
ThomasBow Mar 15, 2026
27ae686
fixture
ThomasBow Mar 15, 2026
eef76db
fixture
ThomasBow Mar 15, 2026
c4b4452
fixture
ThomasBow Mar 15, 2026
9705ed1
fixture
ThomasBow Mar 15, 2026
d2e64a3
fixture
ThomasBow Mar 15, 2026
d120a2e
fixture
ThomasBow Mar 15, 2026
b60d179
updates fixture
ThomasBow Mar 16, 2026
f169a13
updates fixture
ThomasBow Mar 16, 2026
014652f
updates fixture
ThomasBow Mar 16, 2026
4b7c3a6
updates fixture
ThomasBow Mar 16, 2026
80f799e
updates fixture
ThomasBow Mar 16, 2026
e3b085f
updates fixture
ThomasBow Mar 16, 2026
2b64ead
updates fixture
ThomasBow Mar 16, 2026
8d07bbf
fix test and migrate errors
ThomasBow Mar 16, 2026
064dc73
black formatter
ThomasBow Mar 16, 2026
d416dc3
Merge branch 'next' into tickets
ThomasBow Mar 19, 2026
2f8db43
Adds final refund time functionality
ThomasBow Mar 18, 2026
1c59b11
remove old migration
ThomasBow Apr 16, 2026
d2da7e3
fixes new productListBuilding
ThomasBow May 18, 2026
b626bec
Merge remote-tracking branch 'origin/next' into tickets
ThomasBow May 18, 2026
039e883
Move 'refund_ticket' under /user directory
krestenlaust May 18, 2026
e4e9a5e
fixed tests and added concrete class to replace tuple usage
ThomasBow May 19, 2026
68964ec
missing from previous
ThomasBow May 19, 2026
214021a
readded pillow dependency
ThomasBow May 19, 2026
d3e0e20
merge next into tickets
ThomasBow May 19, 2026
e6b2257
fix api errors
ThomasBow May 19, 2026
a35309a
Separate into 'events'-app
krestenlaust May 23, 2026
a304db6
fixup! Separate into 'events'-app
krestenlaust May 23, 2026
a4f1ad6
Move error classes
krestenlaust May 23, 2026
28b68c1
Removes Ticket logic from Sale model
ThomasBow May 25, 2026
ae527fc
black
ThomasBow May 25, 2026
28174eb
Adjust admin list views of models
krestenlaust May 25, 2026
e85f852
Correct type and make property
krestenlaust May 25, 2026
bf5e0e0
fixup! Adjust admin list views of models
krestenlaust May 25, 2026
491f75a
Adjust more attributes
krestenlaust May 25, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/black.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,4 +15,4 @@ jobs:
- name: Black Code Formatter
uses: lgeiger/black-action@v1.0.1
with:
args: --check --target-version py311 --line-length 120 --skip-string-normalization --exclude '(migrations|urls\.py)' stregsystem stregreport kiosk razzia
args: --check --target-version py311 --line-length 120 --skip-string-normalization --exclude '(migrations|urls\.py)' stregsystem stregreport kiosk razzia events
Empty file added events/__init__.py
Empty file.
101 changes: 101 additions & 0 deletions events/admin.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
from django.contrib import admin

from events.models import EventInstance, TicketRecord, Event, Ticket


class EventAdmin(admin.ModelAdmin):
list_display = (
'name',
'description',
)


@admin.action(description="Refunder valgte event instances")
def refund_event_instances(modeladmin, request, queryset):
for event_instance in queryset:
if not isinstance(event_instance, EventInstance):
raise ValueError("queryset must be of EventInstance")
event_instance.refund_all_tickets(request.user)


@admin.action(description="Refunder KUN STAND-BY på valgte event instances")
def refund_stand_by_event_instances(modeladmin, request, queryset):
for event_instance in queryset:
if not isinstance(event_instance, EventInstance):
raise ValueError("queryset must be of EventInstance")
event_instance.refund_all_stand_by_tickets(request.user)


class EventInstanceAdmin(admin.ModelAdmin):
list_display = (
'get_name',
'get_issue_count',
'get_stand_by_count',
'capacity',
'start_time',
'end_time',
'final_refund_time',
'location',
)
readonly_fields = (
'get_issue_count',
'get_stand_by_count',
)

actions = [refund_event_instances, refund_stand_by_event_instances]

@admin.display(description="Event name")
def get_name(self, obj):
if not isinstance(obj, EventInstance):
raise ValueError("obj must be an EventInstance")
return obj.get_name()

@admin.display(description="Tickets issued")
def get_issue_count(self, obj):
if not isinstance(obj, EventInstance):
raise ValueError("obj must be an EventInstance")
return obj.get_issued_ticket_records().count()

@admin.display(description="Tickets on Stand-by")
def get_stand_by_count(self, obj):
if not isinstance(obj, EventInstance):
raise ValueError("obj must be an EventInstance")
return obj.get_stand_by_ticket_records().count()


class TicketAdmin(admin.ModelAdmin):
list_display = (
'name',
"quantity",
'event_instance',
'product',
)


@admin.action(description="Refunder valgte ticket records")
def refund_tickets(modeladmin, request, queryset):
for ticket_record in queryset:
if not isinstance(ticket_record, TicketRecord):
raise ValueError("queryset must be of TicketRecord")
ticket_record.process_refund(request.user)


class TicketRecordAdmin(admin.ModelAdmin):
readonly_fields = ("sale",)
list_display = (
'ticket',
'sale',
'has_attended',
'is_stand_by',
'admin_issued_to',
'admin_issued_by',
'get_ticket_owner',
)

actions = [refund_tickets]


admin.site.register(Event, EventAdmin)
admin.site.register(EventInstance, EventInstanceAdmin)
admin.site.register(Ticket, TicketAdmin)
admin.site.register(TicketRecord, TicketRecordAdmin)
9 changes: 9 additions & 0 deletions events/apps.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
from django.apps import AppConfig


class EventsConfig(AppConfig):
default_auto_field = "django.db.models.BigAutoField"
name = "events"

def ready(self):
import events.signals # noqa: F401 — triggers @receiver registration
158 changes: 158 additions & 0 deletions events/migrations/0001_initial.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,158 @@
# Generated by Django 4.1.13 on 2026-05-23 17:24

from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion


class Migration(migrations.Migration):

initial = True

dependencies = [
("stregsystem", "0025_sale_refunded_at_sale_refunded_by"),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]

operations = [
migrations.CreateModel(
name="Event",
fields=[
(
"id",
models.BigAutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
("name", models.CharField(max_length=50)),
("description", models.TextField()),
(
"image",
models.ImageField(blank=True, null=True, upload_to="event_images/"),
),
],
),
migrations.CreateModel(
name="EventInstance",
fields=[
(
"id",
models.BigAutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
("name_overwrite", models.CharField(blank=True, max_length=50)),
("description_overwrite", models.TextField(blank=True)),
(
"image_overwrite",
models.ImageField(
blank=True, null=True, upload_to="event_instance_images/"
),
),
("capacity", models.IntegerField()),
("start_time", models.DateTimeField()),
("end_time", models.DateTimeField()),
("final_refund_time", models.DateTimeField()),
("location", models.CharField(max_length=100)),
(
"event",
models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
related_name="instances",
to="events.event",
),
),
],
),
migrations.CreateModel(
name="Ticket",
fields=[
(
"id",
models.BigAutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
("name", models.CharField(max_length=50)),
("description", models.TextField()),
("quantity", models.IntegerField()),
(
"event_instance",
models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
related_name="tickets",
to="events.eventinstance",
),
),
(
"product",
models.OneToOneField(
on_delete=django.db.models.deletion.CASCADE,
related_name="tickets",
to="stregsystem.product",
),
),
],
),
migrations.CreateModel(
name="TicketRecord",
fields=[
(
"id",
models.BigAutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
("has_attended", models.BooleanField(blank=True, null=True)),
("is_stand_by", models.BooleanField(default=False)),
(
"admin_issued_by",
models.ForeignKey(
null=True,
on_delete=django.db.models.deletion.CASCADE,
related_name="issued_tickets",
to=settings.AUTH_USER_MODEL,
),
),
(
"admin_issued_to",
models.ForeignKey(
null=True,
on_delete=django.db.models.deletion.CASCADE,
related_name="tickets",
to="stregsystem.member",
),
),
(
"sale",
models.OneToOneField(
blank=True,
null=True,
on_delete=django.db.models.deletion.CASCADE,
related_name="ticket_record",
to="stregsystem.sale",
),
),
(
"ticket",
models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
related_name="purchases",
to="events.ticket",
),
),
],
),
]
Empty file added events/migrations/__init__.py
Empty file.
Loading
Loading