diff --git a/aleksis/apps/paweljong/forms.py b/aleksis/apps/paweljong/forms.py index 2c24b5eb7884838304a31a1afb0c566d7ad3deca..0d129596686104cc8b5dc0f40928d90471a2d8c8 100644 --- a/aleksis/apps/paweljong/forms.py +++ b/aleksis/apps/paweljong/forms.py @@ -61,7 +61,10 @@ class EditEventForm(ExtensibleForm): "linked_group", Row("display_name", "slug", "description"), Row("place", "published"), - Fieldset(_("Date data"), Row("date_event", "date_registration", "date_retraction")), + Fieldset( + _("Date data"), + Row("date_start", "date_end", "date_registration", "date_retraction"), + ), Fieldset( _("Event details"), Row("cost", "min_cost", "max_cost", "max_participants"), @@ -83,7 +86,8 @@ class EditEventForm(ExtensibleForm): "slug", "place", "published", - "date_event", + "date_start", + "date_end", "date_registration", "date_retraction", "cost", diff --git a/aleksis/apps/paweljong/frontend/components/event_registration/EventRegistrationForm.vue b/aleksis/apps/paweljong/frontend/components/event_registration/EventRegistrationForm.vue index 558164c883fb8621df0ed2219773f9002deab26a..5fe372da20b645b8d693d094e6d4a03953a5fefa 100644 --- a/aleksis/apps/paweljong/frontend/components/event_registration/EventRegistrationForm.vue +++ b/aleksis/apps/paweljong/frontend/components/event_registration/EventRegistrationForm.vue @@ -320,7 +320,12 @@ import EventRegistrationHelpTextCards from "./EventRegistrationHelpTextCards.vue ) " required - :rules="$rules().required.build([ ...usernameRules.usernameAllowed, ...usernameRules.usernameASCII ])" + :rules=" + $rules().required.build([ + ...usernameRules.usernameAllowed, + ...usernameRules.usernameASCII, + ]) + " prepend-icon="mdi-account-outline" ></v-text-field> </div> @@ -702,8 +707,13 @@ import EventRegistrationHelpTextCards from "./EventRegistrationHelpTextCards.vue </v-col> </v-row> </v-card-text> - <v-card-actions v-if="index > 0 && !Object.hasOwn(guardian, 'id')"> - <cancel-button i18n-key="paweljong.event_registration.form.steps.guardians.remove" @click="removeGuardian(index)" /> + <v-card-actions + v-if="index > 0 && !Object.hasOwn(guardian, 'id')" + > + <cancel-button + i18n-key="paweljong.event_registration.form.steps.guardians.remove" + @click="removeGuardian(index)" + /> </v-card-actions> </v-card> </v-form> @@ -1046,13 +1056,8 @@ export default { query: whoAmI, result({ data }) { if (data && data.whoAmI && data.whoAmI.person) { - const { - id, - __typename, - addresses, - guardians, - ...filteredPerson - } = data.whoAmI.person; + const { id, __typename, addresses, guardians, ...filteredPerson } = + data.whoAmI.person; this.data.person = filteredPerson; const filteredGuardians = guardians.map( @@ -1071,7 +1076,9 @@ export default { ]; } - const defaultAddress = addresses.find((a) => a.addressTypes.some((at) => at.name === "default")); + const defaultAddress = addresses.find((a) => + a.addressTypes.some((at) => at.name === "default"), + ); if (defaultAddress) { this.data.person.address = { street: defaultAddress.street, @@ -1080,7 +1087,7 @@ export default { place: defaultAddress.place, country: defaultAddress.country, }; - } else { + } else { this.data.person.address = { street: "", housenumber: "", @@ -1088,7 +1095,7 @@ export default { place: "", country: "", }; - } + } } }, skip() { diff --git a/aleksis/apps/paweljong/migrations/0033_migrate_event.py b/aleksis/apps/paweljong/migrations/0033_migrate_event.py new file mode 100644 index 0000000000000000000000000000000000000000..2a8e8faf220fb99d4672be094b54626cd57d02da --- /dev/null +++ b/aleksis/apps/paweljong/migrations/0033_migrate_event.py @@ -0,0 +1,73 @@ +# Generated by Django 5.1.7 on 2025-04-03 11:42 + +import aleksis.core.mixins +import django.db.models.deletion +from django.conf import settings +from django.contrib.contenttypes.models import ContentType +from django.db import migrations, models + + +def migrate_events(apps, schema_editor): + CalendarEvent = apps.get_model("core", "CalendarEvent") + Event = apps.get_model("paweljong", "Event") + event_ctype = ContentType.objects.get_for_model(Event) + + db_alias = schema_editor.connection.alias + + for event in Event.objects.using(db_alias).all(): + calendar_event = CalendarEvent.objects.create( + date_start=event.date_event, + date_end=event.date_event, + polymorphic_ctype_id=event_ctype.pk, + extended_data=event.extended_data, + managed_by_app_label=event.managed_by_app_label, + ) + + for registration in event.registrations.all(): + registration.event_id = calendar_event.pk + registration.save() + + for term in event.terms.all(): + term.event_id = calendar_event.pk + term.save() + + for info_mailing in event.info_mailings.all(): + info_mailing.event_id = calendar_event.pk + info_mailing.save() + + for additional_field in event.additional_fields.all(): + additional_field.event_id = calendar_event.pk + additional_field.save() + + for voucher in event.vouchers.all(): + voucher.event_id = calendar_event.pk + voucher.save() + + for checkpoint in event.checkpoints.all(): + checkpoint.event_id = calendar_event.pk + checkpoint.save() + + event.calendarevent_ptr_id = calendar_event.pk + event.save() + + +class Migration(migrations.Migration): + + dependencies = [ + ('paweljong', '0032_alter_event_contact_information_visible_fields'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.AddField( + model_name='event', + name='calendarevent_ptr', + field=models.OneToOneField(auto_created=True, null=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, serialize=False, to='core.calendarevent'), + ), + migrations.AlterField( + model_name='eventregistration', + name='event', + field=models.ForeignKey(db_constraint=False, db_index=False, on_delete=django.db.models.deletion.CASCADE, related_name='registrations', to='paweljong.event', verbose_name='Event'), + ), + migrations.RunPython(migrate_events), + ] diff --git a/aleksis/apps/paweljong/migrations/0034_event_remove_fields.py b/aleksis/apps/paweljong/migrations/0034_event_remove_fields.py new file mode 100644 index 0000000000000000000000000000000000000000..a1f5c6727a2ad600943fba832b3ba80335842fd6 --- /dev/null +++ b/aleksis/apps/paweljong/migrations/0034_event_remove_fields.py @@ -0,0 +1,43 @@ +# Generated by Django 5.1.7 on 2025-04-03 11:42 + +import aleksis.core.mixins +import django.db.models.deletion +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('paweljong', '0033_migrate_event'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.RemoveField( + model_name='event', + name='id', + ), + migrations.AlterField( + model_name='event', + name='calendarevent_ptr', + field=models.OneToOneField(auto_created=True, null=False, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='core.calendarevent'), + ), + migrations.RemoveField( + model_name='event', + name='extended_data', + ), + migrations.RemoveField( + model_name='event', + name='managed_by_app_label', + ), + migrations.RemoveField( + model_name='event', + name='date_event', + ), + migrations.AlterField( + model_name='eventregistration', + name='event', + field=models.ForeignKey(db_constraint=False, db_index=False, on_delete=django.db.models.deletion.CASCADE, related_name='registrations', to='paweljong.event', verbose_name='Event'), + ), + ] diff --git a/aleksis/apps/paweljong/migrations/0035_add_uuid.py b/aleksis/apps/paweljong/migrations/0035_add_uuid.py new file mode 100644 index 0000000000000000000000000000000000000000..8f901f643296ed6e0999c2a92c1594ccd1e3f274 --- /dev/null +++ b/aleksis/apps/paweljong/migrations/0035_add_uuid.py @@ -0,0 +1,53 @@ +# Generated by Django 5.2.1 on 2025-05-17 15:43 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('paweljong', '0034_event_remove_fields'), + ] + + operations = [ + migrations.AddField( + model_name='checkpoint', + name='uuid', + field=models.UUIDField(db_default=models.Func(function='gen_random_uuid'), editable=False, unique=True), + ), + migrations.AddField( + model_name='eventadditionalfield', + name='uuid', + field=models.UUIDField(db_default=models.Func(function='gen_random_uuid'), editable=False, unique=True), + ), + migrations.AddField( + model_name='eventinfomailingthrough', + name='uuid', + field=models.UUIDField(db_default=models.Func(function='gen_random_uuid'), editable=False, unique=True), + ), + migrations.AddField( + model_name='eventregistration', + name='uuid', + field=models.UUIDField(db_default=models.Func(function='gen_random_uuid'), editable=False, unique=True), + ), + migrations.AddField( + model_name='infomailing', + name='uuid', + field=models.UUIDField(db_default=models.Func(function='gen_random_uuid'), editable=False, unique=True), + ), + migrations.AddField( + model_name='registrationstate', + name='uuid', + field=models.UUIDField(db_default=models.Func(function='gen_random_uuid'), editable=False, unique=True), + ), + migrations.AddField( + model_name='terms', + name='uuid', + field=models.UUIDField(db_default=models.Func(function='gen_random_uuid'), editable=False, unique=True), + ), + migrations.AddField( + model_name='voucher', + name='uuid', + field=models.UUIDField(db_default=models.Func(function='gen_random_uuid'), editable=False, unique=True), + ), + ] diff --git a/aleksis/apps/paweljong/models.py b/aleksis/apps/paweljong/models.py index 35deb2be22ccca5176d1b0b80c71beaaa5bd2af6..833e0372e2248e59706a2819025d04ee57463f62 100644 --- a/aleksis/apps/paweljong/models.py +++ b/aleksis/apps/paweljong/models.py @@ -1,10 +1,13 @@ from datetime import datetime, timedelta from decimal import Decimal +from typing import Optional from django.contrib.contenttypes.models import ContentType from django.contrib.postgres.fields import ArrayField from django.core.exceptions import ValidationError from django.db import models +from django.db.models import Q, QuerySet +from django.http import HttpRequest from django.urls import reverse from django.utils.text import slugify from django.utils.timezone import now @@ -12,11 +15,12 @@ from django.utils.translation import gettext_lazy as _ from ckeditor.fields import RichTextField from colorfield.fields import ColorField +from icalendar import vCalAddress from aleksis.apps.tezor.models.base import Client from aleksis.apps.tezor.models.invoice import CustomPurchasedItem, Invoice, InvoiceGroup from aleksis.core.mixins import ExtensibleModel, GlobalPermissionModel -from aleksis.core.models import Group, Person, PersonRelationship +from aleksis.core.models import CalendarEvent, Group, Person, PersonRelationship from aleksis.core.util.core_helpers import generate_random_code, get_site_preferences from aleksis.core.util.email import send_email @@ -151,7 +155,10 @@ class EventAdditionalField(ExtensibleModel): verbose_name_plural = _("Addtitional fields for events") -class Event(ExtensibleModel): +class Event(CalendarEvent): + _class_name = "paweljong_event" + dav_verbose_name = _("Event registrations") + data_checks = [EventMembersSyncDataCheck] # Event details @@ -165,7 +172,6 @@ class Event(ExtensibleModel): slug = models.SlugField(max_length=255, verbose_name=_("Slug"), blank=True) # Date details - date_event = models.DateField(verbose_name=_("Date of event")) date_registration = models.DateField(verbose_name=_("Registration deadline")) date_retraction = models.DateField(verbose_name=_("Retraction deadline")) @@ -211,6 +217,92 @@ class Event(ExtensibleModel): default=[], ) + @classmethod + def value_title(cls, reference_object: "Event", request: HttpRequest | None = None) -> str: + """Return the title of the event.""" + return reference_object.display_name + + @classmethod + def value_description( + cls, reference_object: "Event", request: HttpRequest | None = None + ) -> str: + """Return the description of the event.""" + return reference_object.description + + @classmethod + def value_attendee( + cls, reference_object: "Event", request: HttpRequest | None = None + ) -> list[vCalAddress]: + """Return the attendees of the event.""" + if request is None: + return [] + is_owner = reference_object.linked_group.owners.filter(user_id=request.user.pk).exists() + if not is_owner: + return [] + owners = Person.objects.filter(owner_of=reference_object.linked_group) + participants = Person.objects.filter( + pk__in=reference_object.registrations.filter(retracted=False).values_list( + "person__id", flat=True + ) + ) + + owner_attendees = [p.get_vcal_address(request=request) for p in owners] + participant_attendees = [ + p.get_vcal_address(role="OPT-PARTICIPANT", request=request) for p in participants + ] + + return owner_attendees + participant_attendees + + @classmethod + def value_status(cls, reference_object: "Event", request: HttpRequest | None = None) -> str: + """Return the status of the event.""" + if request is None: + return "CONFIRMED" + try: + registration = EventRegistration.objects.get( + event=reference_object, + person=request.user.person, + ) + except EventRegistration.DoesNotExist: + return "CONFIRMED" + return "CANCELLED" if registration.retracted else "CONFIRMED" + + @classmethod + def get_objects( + cls, + request: HttpRequest | None = None, + params: dict[str, any] | None = None, + start: Optional[datetime] = None, + end: Optional[datetime] = None, + start_qs: QuerySet | None = None, + additional_filter: Q | None = None, + **kwargs, + ) -> QuerySet: + q = additional_filter if additional_filter is not None else Q() + if request: + q = q & ( + Q( + id__in=EventRegistration.objects.filter(person=request.user.person) + .values_list("event_id", flat=True) + .union( + Group.objects.filter( + linked_event__isnull=False, owners=request.user.person + ).values_list("linked_event__id", flat=True) + ) + ) + ) + + qs = super().get_objects( + request=request, + params=params, + start=start, + end=end, + start_qs=start_qs, + additional_filter=q, + **kwargs, + ) + return qs + def save(self, *args, **kwargs): if not self.slug: if self.linked_group.short_name: @@ -250,7 +342,7 @@ class Event(ExtensibleModel): if self.date_registration: return self.date_registration >= now - return self.date_event > now + return self.date_start > now def get_absolute_url(self): return reverse("event_by_name", kwargs={"slug": self.slug}) @@ -281,7 +373,7 @@ class Event(ExtensibleModel): @classmethod def upcoming_published_events(cls): - return Event.objects.filter(published=True, date_event__gte=now()) + return Event.objects.filter(published=True, date_start__gte=now()) class EventInfoMailingThrough(ExtensibleModel): @@ -424,7 +516,6 @@ class EventRegistration(ExtensibleModel): }, ) - address = self.person.addresses.first() street = address.street if address is not None else "" housenumber = address.housenumber if address is not None else "" diff --git a/aleksis/apps/paweljong/schema/event.py b/aleksis/apps/paweljong/schema/event.py index 539969c098b44d87295caa4091ee052eb2b07212..33ea77204da04e2a0bd92015bdee753c24364d31 100644 --- a/aleksis/apps/paweljong/schema/event.py +++ b/aleksis/apps/paweljong/schema/event.py @@ -8,3 +8,24 @@ from ..models import Event class EventType(PermissionsTypeMixin, DjangoObjectType): class Meta: model = Event + fields = [ + "id", + "uuid", + "date_start", + "date_end", + "display_name", + "description", + "published", + "place", + "slug", + "cost", + "min_cost", + "max_cost", + "max_participants", + "date_registration", + "date_retraction", + "terms", + "information", + "additional_fields", + "contact_information_visible_fields", + ] diff --git a/aleksis/apps/paweljong/schema/event_registration.py b/aleksis/apps/paweljong/schema/event_registration.py index 3c2d6659b20e4ce5f8874d0a9e2e360bd1c0d31e..493cf1226c38fde288ca34dfd1c9f47b16477979 100644 --- a/aleksis/apps/paweljong/schema/event_registration.py +++ b/aleksis/apps/paweljong/schema/event_registration.py @@ -14,7 +14,11 @@ from aleksis.apps.postbuero.models import MailAddress, MailDomain from aleksis.apps.postbuero.schema import MailAddressInputType from aleksis.core.models import Activity, Person from aleksis.core.schema.base import PermissionsTypeMixin -from aleksis.core.schema.person import PersonAddressMutationMixin, PersonGuardianMutationMixin, PersonInputType +from aleksis.core.schema.person import ( + PersonAddressMutationMixin, + PersonGuardianMutationMixin, + PersonInputType, +) from aleksis.core.schema.user import UserInputType from aleksis.core.util.auth_helpers import custom_username_validators from aleksis.core.util.core_helpers import get_site_preferences @@ -50,7 +54,9 @@ class EventRegistrationInputType(graphene.InputObjectType): retraction_consent = graphene.Boolean(required=True) -class SendEventRegistrationMutation(PersonAddressMutationMixin, PersonGuardianMutationMixin, graphene.Mutation): +class SendEventRegistrationMutation( + PersonAddressMutationMixin, PersonGuardianMutationMixin, graphene.Mutation +): class Arguments: event = graphene.ID(required=True) event_registration = EventRegistrationInputType(required=True) @@ -75,7 +81,13 @@ class SendEventRegistrationMutation(PersonAddressMutationMixin, PersonGuardianMu email = None - if event_registration["email"] is not None and event_registration["email"]["domain"] is not None and event_registration["email"]["domain"] != "" and event_registration["email"]["local_part"] is not None and event_registration["email"]["local_part"] != "": + if ( + event_registration["email"] is not None + and event_registration["email"]["domain"] is not None + and event_registration["email"]["domain"] != "" + and event_registration["email"]["local_part"] is not None + and event_registration["email"]["local_part"] != "" + ): try: domain = MailDomain.objects.get(pk=event_registration["email"]["domain"]) except IntegrityError: @@ -89,7 +101,11 @@ class SendEventRegistrationMutation(PersonAddressMutationMixin, PersonGuardianMu raise ValidationError(_("Mail address already in use.")) email = str(_mail_address) - elif event_registration["user"] is not None and event_registration["user"]["email"] is not None and event_registration["user"]["email"] != "": + elif ( + event_registration["user"] is not None + and event_registration["user"]["email"] is not None + and event_registration["user"]["email"] != "" + ): validate_email(event_registration["user"]["email"]) email = event_registration["user"]["email"] elif not info.context.user.is_authenticated: @@ -99,7 +115,10 @@ class SendEventRegistrationMutation(PersonAddressMutationMixin, PersonGuardianMu if info.context.user.is_authenticated: user = info.context.user elif event_registration["user"] is not None: - if event_registration["user"]["username"] is not None and event_registration["user"]["username"] != "": + if ( + event_registration["user"]["username"] is not None + and event_registration["user"]["username"] != "" + ): for validator in custom_username_validators: validator(event_registration["user"]["username"]) try: @@ -112,7 +131,10 @@ class SendEventRegistrationMutation(PersonAddressMutationMixin, PersonGuardianMu else: raise ValidationError(_("Username is required")) - if event_registration["user"]["password"] is not None and event_registration["user"]["password"] != "": + if ( + event_registration["user"]["password"] is not None + and event_registration["user"]["password"] != "" + ): user.set_password(event_registration["user"]["password"]) else: raise ValidationError(_("Password is required")) @@ -147,7 +169,10 @@ class SendEventRegistrationMutation(PersonAddressMutationMixin, PersonGuardianMu guardian_pks = [] # Store address information - if event_registration["person"] is not None and event_registration["person"]["address"] is not None: + if ( + event_registration["person"] is not None + and event_registration["person"]["address"] is not None + ): cls._handle_address(root, info, event_registration["person"]["address"], person) if event_registration["person"] is not None: diff --git a/aleksis/apps/paweljong/tables.py b/aleksis/apps/paweljong/tables.py index 98e870e612238bb159356a7a0c860e5523414408..0643a4699274697e93cfc38bccbd7fed03ad5b98 100644 --- a/aleksis/apps/paweljong/tables.py +++ b/aleksis/apps/paweljong/tables.py @@ -10,7 +10,7 @@ class ManageEventsTable(tables.Table): attrs = {"class": "responsive-table highlight"} display_name = tables.Column(verbose_name=_("Event")) - date_event = tables.Column(verbose_name=_("Date")) + date_start = tables.Column(verbose_name=_("Date")) max_participants = tables.Column(verbose_name=_("Max. participants")) date_registration = tables.Column(verbose_name=_("Registration until")) diff --git a/aleksis/apps/paweljong/templates/paweljong/event/detail.html b/aleksis/apps/paweljong/templates/paweljong/event/detail.html index 433537a2b160a073e542d4e870e9bffe0d60ccb2..1482b7721737301bdfd76732356062396fba670f 100644 --- a/aleksis/apps/paweljong/templates/paweljong/event/detail.html +++ b/aleksis/apps/paweljong/templates/paweljong/event/detail.html @@ -38,7 +38,7 @@ <table id="event-detail-table"> <tr> <td><i class="material-icons small">event</i></td> - <td>{{ event.date_event }}</td> + <td>{{ event.date_start }}</td> <td><i class="material-icons small">location_on</i></td> <td>{{ event.place }}</td> </tr> diff --git a/aleksis/apps/paweljong/templates/paweljong/event/full.html b/aleksis/apps/paweljong/templates/paweljong/event/full.html index 06b637b381a41d4d2418acd01d11ab6cb8d8dbe9..28ccab4d9210ee23e1d48fd9d8c20f9a834881bc 100644 --- a/aleksis/apps/paweljong/templates/paweljong/event/full.html +++ b/aleksis/apps/paweljong/templates/paweljong/event/full.html @@ -22,7 +22,7 @@ <table> <tr> <td><i class="material-icons small">event</i></td> - <td>{{ event.date_event }}</td> + <td>{{ event.date_start }}</td> <td><i class="material-icons small">location_on</i></td> <td>{{ event.place }}</td> </tr> diff --git a/aleksis/apps/paweljong/templates/paweljong/print/voucher.html b/aleksis/apps/paweljong/templates/paweljong/print/voucher.html index 5648732feea5b7dd7edae60fe2765cfdfa21b3f3..8500d1b8ebace107e5756d713ac6cf46b6f8561b 100644 --- a/aleksis/apps/paweljong/templates/paweljong/print/voucher.html +++ b/aleksis/apps/paweljong/templates/paweljong/print/voucher.html @@ -17,7 +17,7 @@ <img src="{% firstof request.site.preferences.theme__logo.url aleksis_banner %}" alt="Logo" class="max-size-600 center"> <h3>{{ voucher.event }}<h3> <h4>{{ voucher.code }}</h4> - <p>{% trans "Voucher for" %} {{ voucher.person.first_name }} {{ voucher.person.last_name }} {% trans "to visit event" %} {{ voucher.event }} {% trans "on" %} {{ voucher.event.date_event }} {% trans "at" %} {{ voucher.event.place }}!</p> + <p>{% trans "Voucher for" %} {{ voucher.person.first_name }} {{ voucher.person.last_name }} {% trans "to visit event" %} {{ voucher.event }} {% trans "on" %} {{ voucher.event.date_start }} {% trans "at" %} {{ voucher.event.place }}!</p> <p>{% trans "To use the voucher, register for the event " %} <a href="{% url 'register_event_by_slug' voucher.event.pk %}">{% trans "here" %}</a></p> </div> diff --git a/aleksis/apps/paweljong/templates/templated_email/event_created.email b/aleksis/apps/paweljong/templates/templated_email/event_created.email index 30ac030c82099682266c94c9eb6aa14b6e8e39b3..77d97d2d6f6818be0f4806bff8bb7c01f18a5880 100644 --- a/aleksis/apps/paweljong/templates/templated_email/event_created.email +++ b/aleksis/apps/paweljong/templates/templated_email/event_created.email @@ -9,7 +9,7 @@ * {% trans "Description" %}: {{ new_event.description }} * {% trans "Published" %}: {{ new_event.published }} * {% trans "Place" %}: {{ new_event.place }} - * {% trans "Date of event" %}: {{ new_event.date_event }} + * {% trans "Date of event" %}: {{ new_event.date_start }} * {% trans "Registration deadline" %}: {{ new_event.date_registration }} * {% trans "Retraction deadline" %}: {{ new_event.date_retraction }} * {% trans "Fees" %}: {{ new_event.cost }} @@ -39,7 +39,7 @@ <li> {% trans "Description" %}: {{ new_event.description }}</li> <li> {% trans "Published" %}: {{ new_event.published }}</li> <li> {% trans "Place" %}: {{ new_event.place }}</li> - <li> {% trans "Date of event" %}: {{ new_event.date_event }}</li> + <li> {% trans "Date of event" %}: {{ new_event.date_start }}</li> <li> {% trans "Registration deadline" %}: {{ new_event.date_registration }}</li> <li> {% trans "Retraction deadline" %}: {{ new_event.date_retraction }}</li> <li> {% trans "Fees" %}: {{ new_event.cost }}</li> diff --git a/aleksis/apps/paweljong/views.py b/aleksis/apps/paweljong/views.py index 353a0abbb820429118a168a280f972b15acbaee1..cee8533812452f6c0ac3a2ab57b4313fa4452f54 100644 --- a/aleksis/apps/paweljong/views.py +++ b/aleksis/apps/paweljong/views.py @@ -1,11 +1,11 @@ from typing import Optional -from django.db.models import Avg from django.conf import settings from django.contrib.auth import get_user_model from django.contrib.contenttypes.models import ContentType from django.contrib.syndication.views import Feed from django.core.exceptions import ValidationError +from django.db.models import Avg from django.http import HttpRequest, HttpResponse from django.shortcuts import redirect, render from django.urls import reverse, reverse_lazy @@ -823,10 +823,10 @@ class UpcomingEventsRSSFeed(Feed): return _("Announcement feed of all upcoming events") def ttl(self): - date_event = Event.upcoming_published_events().order_by("-date_event").first().date_event + date_start = Event.upcoming_published_events().order_by("-date_start").first().date_start date_now = timezone.now().date() - return (date_event - date_now).seconds + return (date_start - date_now).seconds def items(self): return Event.upcoming_published_events() @@ -1014,7 +1014,7 @@ class EventDetailView(PermissionRequiredMixin, DetailView): average_amount_paid = Invoice.objects.filter( for_content_type=ContentType.objects.get_for_model(EventRegistration), - for_object_id__in=active_registrations.values_list("id", flat=True) + for_object_id__in=active_registrations.values_list("id", flat=True), ).aggregate(Avg("total", default=0))["total__avg"] context["average_amount_paid"] = round(average_amount_paid, 2) context["average_amount_paid_percent"] = (