Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
16 changes: 8 additions & 8 deletions backend/core/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,8 @@
from labour.admin import InlineLabourEventMetaAdmin
from membership.admin import InlineMembershipOrganizationMetaAdmin
from payments.admin import InlinePaymentsOrganizationMetaAdmin
from programme.admin import InlineProgrammeEventMetaAdmin
from tickets.admin import InlineTicketsEventMetaAdmin
from program_v2.admin import InlineProgramV2EventMetaAdmin
from tickets_v2.admin import InlineTicketsV2EventMetaAdmin

from .models import CarouselSlide, Event, Organization, Person, Venue

Expand Down Expand Up @@ -62,8 +62,8 @@ class EventAdmin(admin.ModelAdmin):

inlines = (
InlineLabourEventMetaAdmin,
InlineProgrammeEventMetaAdmin,
InlineTicketsEventMetaAdmin,
InlineProgramV2EventMetaAdmin,
InlineTicketsV2EventMetaAdmin,
InlineBadgesEventMetaAdmin,
InlineEnrollmentEventMetaAdmin,
InlineIntraEventMetaAdmin,
Expand All @@ -90,7 +90,7 @@ class EventAdmin(admin.ModelAdmin):
),
) # type: ignore

def get_readonly_fields(self, request, obj=None) -> tuple[str]:
def get_readonly_fields(self, request, obj=None) -> tuple[str, ...]:
# slug may be edited when creating but not when modifying existing event
# (breaks urls and kills puppies)
if obj:
Expand All @@ -105,14 +105,14 @@ class GroupForm(forms.ModelForm):
label="Users",
queryset=User.objects.all().order_by("username"),
required=False,
widget=admin.widgets.FilteredSelectMultiple("users", is_stacked=False),
widget=admin.widgets.FilteredSelectMultiple("users", is_stacked=False), # type: ignore
)

class Meta:
model = Group
exclude = ()
widgets = {
"permissions": admin.widgets.FilteredSelectMultiple("permissions", is_stacked=False),
"permissions": admin.widgets.FilteredSelectMultiple("permissions", is_stacked=False), # type: ignore
}


Expand All @@ -123,7 +123,7 @@ class MyGroupAdmin(GroupAdmin):
def save_model(self, request, obj, form, change):
# save first to obtain id
super(GroupAdmin, self).save_model(request, obj, form, change)
obj.user_set.set(form.cleaned_data["users"], clear=True)
obj.user_set.set(form.cleaned_data["users"], clear=True) # type: ignore

def get_form(self, request, obj=None, **kwargs):
if obj:
Expand Down
1 change: 1 addition & 0 deletions backend/dimensions/graphql/dimension.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ class Meta:
title = graphene.String(lang=graphene.String())
resolve_title = resolve_localized_field_getattr("title")

# TODO Slow when called once for each dimension of Ropecon
@staticmethod
def resolve_can_remove(dimension: Dimension, info):
request: HttpRequest = info.context
Expand Down
1 change: 1 addition & 0 deletions backend/dimensions/graphql/dimension_value.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ class DimensionValueType(DjangoObjectType):
title = graphene.String(lang=graphene.String())
resolve_title = resolve_localized_field_getattr("title")

# TODO Slow when called once for each dimension value of Ropecon
@staticmethod
def resolve_can_remove(value: DimensionValue, info):
request: HttpRequest = info.context
Expand Down
2 changes: 1 addition & 1 deletion backend/dimensions/graphql/mutations/delete_dimension.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,4 +35,4 @@ def mutate(

dimension.delete()

return DeleteDimension(slug=input.survey_slug) # type: ignore
return DeleteDimension(slug=input.dimension_slug) # type: ignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
# Generated by Django 5.1.5 on 2025-04-09 06:40

from django.db import migrations, models


class Migration(migrations.Migration):
dependencies = [
("tracon2025", "0003_remove_signupextra_certificate_delivery_address_and_more"),
]

operations = [
migrations.AlterField(
model_name="signupextra",
name="shirt_size",
field=models.CharField(
choices=[
("NO_SHIRT", "Ei paitaa"),
("XS", "XS Unisex"),
("S", "S Unisex"),
("M", "M Unisex"),
("L", "L Unisex"),
("XL", "XL Unisex"),
("XXL", "2XL Unisex"),
("3XL", "3XL Unisex"),
("4XL", "4XL Unisex"),
("5XL", "5XL Unisex"),
("LF_XS", "XS Ladyfit"),
("LF_S", "S Ladyfit"),
("LF_M", "M Ladyfit"),
("LF_L", "L Ladyfit"),
("LF_XL", "XL Ladyfit"),
("LF_XXL", "2XL Ladyfit"),
("LF_3XL", "3XL Ladyfit"),
("BAG", "Kangaskassi"),
],
default="NO_SHIRT",
help_text='Ajoissa ilmoittautuneet vänkärit saavat maksuttoman työvoimapaidan tai kangaskassin. Valitse tässä haluatko paidan vai kangaskassin, sekä paidan koko. <a href="/static/tracon2022/tracon2022_shirt_sizes.png" target="_blank" rel="noopener noreferrer">Kokotaulukko</a>',
max_length=8,
verbose_name="Swag-valinta",
),
),
]
34 changes: 33 additions & 1 deletion backend/program_v2/admin.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,16 @@
"""
NOTE: Generally V2 apps should not rely on taka-admin to do basic administrative tasks.
This should be thought of an escape hatch and most admin functions provided in etuadmin.
"""

from django import forms
from django.contrib import admin

from .models import Program, ScheduleItem
from dimensions.models.dimension import Dimension

from .models.meta import ProgramV2EventMeta
from .models.program import Program
from .models.schedule import ScheduleItem


class ScheduleItemInline(admin.TabularInline):
Expand All @@ -25,3 +35,25 @@ class ProgramAdmin(admin.ModelAdmin):
"cached_location",
"cached_color",
)


class ProgramV2EventMetaForm(forms.ModelForm):
class Meta:
model = ProgramV2EventMeta
fields = (
"location_dimension",
"is_accepting_feedback",
)

def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)

if self.instance.pk is not None:
self.fields["location_dimension"].queryset = Dimension.objects.filter( # type: ignore
universe=self.instance.event.program_universe
)


class InlineProgramV2EventMetaAdmin(admin.StackedInline):
model = ProgramV2EventMeta
form = ProgramV2EventMetaForm
19 changes: 18 additions & 1 deletion backend/program_v2/graphql/meta.py
Original file line number Diff line number Diff line change
Expand Up @@ -109,28 +109,45 @@ def resolve_annotations(meta: ProgramV2EventMeta, info, lang: str = DEFAULT_LANG
def resolve_dimensions(
meta: ProgramV2EventMeta,
info,
# TODO unify naming
is_list_filter: bool = False,
is_shown_in_detail: bool = False,
public_only: bool = True,
key_dimensions_only: bool = False,
):
"""
`is_list_filter` - only return dimensions that are shown in the list filter.
`is_shown_in_detail` - only return dimensions that are shown in the detail view.
If you supply both, you only get their intersection.
"""
dimensions = meta.universe.dimensions.all()
if public_only:
dimensions = meta.universe.dimensions.filter(is_public=True)
else:
graphql_check_instance(
meta.universe, # type: ignore
info,
field="dimensions",
app="program_v2",
)
dimensions = meta.universe.dimensions.all()

if is_list_filter:
dimensions = dimensions.filter(is_list_filter=True)

if is_shown_in_detail:
dimensions = dimensions.filter(is_shown_in_detail=True)

if key_dimensions_only:
dimensions = dimensions.filter(is_key_dimension=True)

return dimensions.order_by("order")

dimensions = graphene.NonNull(
graphene.List(graphene.NonNull(FullDimensionType)),
is_list_filter=graphene.Boolean(),
is_shown_in_detail=graphene.Boolean(),
public_only=graphene.Boolean(),
key_dimensions_only=graphene.Boolean(),
description=normalize_whitespace(resolve_dimensions.__doc__ or ""),
)

Expand Down
3 changes: 3 additions & 0 deletions backend/program_v2/models/meta.py
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,9 @@ class ProgramV2EventMeta(EventMetaBase):

use_cbac = True

def __str__(self):
return str(self.event)

@property
def importer_class(self):
from ..importers.default import DefaultImporter
Expand Down
6 changes: 0 additions & 6 deletions backend/programme/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@
AlternativeProgrammeForm,
Category,
Programme,
ProgrammeEventMeta,
ProgrammeFeedback,
Role,
Room,
Expand All @@ -32,11 +31,6 @@ def activate_selected_items(modeladmin, request, queryset):
queryset.update(active=False)


class InlineProgrammeEventMetaAdmin(admin.StackedInline):
model = ProgrammeEventMeta
raw_id_fields = ("admin_group",)


class ProgrammeRoleInline(admin.TabularInline):
model = Programme.organizers.through
verbose_name = "organizer"
Expand Down
6 changes: 0 additions & 6 deletions backend/tickets/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,15 +6,9 @@
Order,
OrderProduct,
Product,
TicketsEventMeta,
)


class InlineTicketsEventMetaAdmin(admin.StackedInline):
model = TicketsEventMeta
raw_id_fields = ("admin_group", "pos_access_group")


@admin.register(Product)
class ProductAdmin(admin.ModelAdmin):
model = Product
Expand Down
31 changes: 31 additions & 0 deletions backend/tickets_v2/admin.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
"""
NOTE: Generally V2 apps should not rely on taka-admin to do basic administrative tasks.
This should be thought of an escape hatch and most admin functions provided in etuadmin.
"""

from django import forms
from django.contrib import admin

from .models.meta import TicketsV2EventMeta


class TicketsV2EventMetaForm(forms.ModelForm):
class Meta:
model = TicketsV2EventMeta
fields = (
"provider_id",
# NOTE SUPPORTED_LANGUAGES
"terms_and_conditions_url_en",
"terms_and_conditions_url_fi",
"terms_and_conditions_url_sv",
)
widgets = dict(
terms_and_conditions_url_en=forms.TextInput,
terms_and_conditions_url_fi=forms.TextInput,
terms_and_conditions_url_sv=forms.TextInput,
)


class InlineTicketsV2EventMetaAdmin(admin.StackedInline):
model = TicketsV2EventMeta
form = TicketsV2EventMetaForm
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
# Generated by Django 5.1.5 on 2025-04-09 06:40

from django.db import migrations, models

import tickets_v2.optimized_server.models.enums


class Migration(migrations.Migration):
dependencies = [
("tickets_v2", "0003_ticketsv2eventmeta_terms_and_conditions_url_en_and_more"),
]

operations = [
migrations.AlterField(
model_name="ticketsv2eventmeta",
name="provider_id",
field=models.SmallIntegerField(
choices=[(0, "NONE"), (1, "PAYTRAIL"), (2, "STRIPE")],
default=tickets_v2.optimized_server.models.enums.PaymentProvider["NONE"],
verbose_name="Payment provider",
),
),
migrations.AlterField(
model_name="ticketsv2eventmeta",
name="terms_and_conditions_url_en",
field=models.TextField(blank=True, default=""),
),
migrations.AlterField(
model_name="ticketsv2eventmeta",
name="terms_and_conditions_url_fi",
field=models.TextField(blank=True, default=""),
),
migrations.AlterField(
model_name="ticketsv2eventmeta",
name="terms_and_conditions_url_sv",
field=models.TextField(blank=True, default=""),
),
]
10 changes: 7 additions & 3 deletions backend/tickets_v2/models/meta.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,15 +19,19 @@ class TicketsV2EventMeta(EventMetaBase):
provider_id = models.SmallIntegerField(
choices=[(x.value, x.name) for x in PaymentProvider],
default=PaymentProvider.NONE,
verbose_name="Payment provider",
)

# NOTE SUPPORTED_LANGUAGES
terms_and_conditions_url_en = models.TextField(default="")
terms_and_conditions_url_fi = models.TextField(default="")
terms_and_conditions_url_sv = models.TextField(default="")
terms_and_conditions_url_en = models.TextField(default="", blank=True)
terms_and_conditions_url_fi = models.TextField(default="", blank=True)
terms_and_conditions_url_sv = models.TextField(default="", blank=True)

use_cbac = True

def __str__(self):
return str(self.event)

def ensure_partitions(self):
from .order import Order
from .payment_stamp import PaymentStamp
Expand Down
Loading