diff --git a/backend/conferences/migrations/0050_alter_deadline_type.py b/backend/conferences/migrations/0050_alter_deadline_type.py new file mode 100644 index 0000000000..7003ae5b92 --- /dev/null +++ b/backend/conferences/migrations/0050_alter_deadline_type.py @@ -0,0 +1,18 @@ +# Generated by Django 5.1.1 on 2024-11-09 21:21 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('conferences', '0049_remove_conference_pretix_hotel_bed_layout_question_id_and_more'), + ] + + operations = [ + migrations.AlterField( + model_name='deadline', + name='type', + field=models.CharField(choices=[('cfp', 'Call for proposal'), ('voting', 'Voting'), ('refund', 'Ticket refund'), ('grants', 'Grants'), ('badge_preview', 'Badge preview'), ('custom', 'Custom deadline')], max_length=256, verbose_name='type'), + ), + ] diff --git a/backend/conferences/models/deadline.py b/backend/conferences/models/deadline.py index d9dbbfe8d5..289d8f7711 100644 --- a/backend/conferences/models/deadline.py +++ b/backend/conferences/models/deadline.py @@ -21,6 +21,7 @@ class Deadline(TimeFramedModel): ("voting", _("Voting")), ("refund", _("Ticket refund")), ("grants", _("Grants")), + ("badge_preview", _("Badge preview")), ("custom", _("Custom deadline")), ) @@ -33,7 +34,7 @@ class Deadline(TimeFramedModel): name = I18nCharField(_("name"), max_length=100) description = I18nTextField(_("description"), blank=True, null=True) - type = models.CharField(_("type"), choices=TYPES, max_length=10) + type = models.CharField(_("type"), choices=TYPES, max_length=256) def __str__(self): return f"{self.type} ({self.name}) <{self.conference.code}>" diff --git a/frontend/src/components/badge/index.tsx b/frontend/src/components/badge/index.tsx index d6d57d69ab..ad9f9451e1 100644 --- a/frontend/src/components/badge/index.tsx +++ b/frontend/src/components/badge/index.tsx @@ -95,7 +95,7 @@ export const Badge = ({ marginBottom: "20px", marginTop: "40px", }} - src="https://pythonit-email-assets.s3.eu-central-1.amazonaws.com/logo-pycon-2024.png" + src="https://cdn.pycon.it/conferences/pycon2025/pycon-italia-2025-logo.png" />
- {side === "front" && ( -
-
-
- L
u
n
c
h -
-
- {[23, 24, 25].map((number) => ( -
- - {number} - -
- ))} -
- )} {!empty && side === "front" && (
{ export type CustomizeTicketModalProps = { ticket: MyProfileWithTicketsQuery["me"]["tickets"][0]; + showBadgePreview: boolean; }; type Form = { @@ -50,6 +51,7 @@ type Form = { export const CustomizeTicketModal = ({ onClose, ticket, + showBadgePreview, }: Props & CustomizeTicketModalProps) => { const language = useCurrentLanguage(); const [updateTicket, { loading: updatingTicket, error: updateTicketError }] = @@ -204,7 +206,7 @@ export const CustomizeTicketModal = ({
} > - + )} - -
- -
-
- - - - - - - - + {showBadgePreview && ( + +
+ +
+
+ + + - -
-
+ + + + + + +
+
+ )}
); diff --git a/frontend/src/components/my-tickets-profile-page-handler/index.tsx b/frontend/src/components/my-tickets-profile-page-handler/index.tsx index ec98409419..9444d0c1e3 100644 --- a/frontend/src/components/my-tickets-profile-page-handler/index.tsx +++ b/frontend/src/components/my-tickets-profile-page-handler/index.tsx @@ -3,16 +3,22 @@ import React from "react"; import { FormattedMessage } from "react-intl"; import { useCurrentLanguage } from "~/locale/context"; -import { useMyProfileWithTicketsQuery } from "~/types"; +import { DeadlineStatus, useMyProfileWithTicketsQuery } from "~/types"; import { MetaTags } from "../meta-tags"; import { NoTickets } from "./no-tickets"; import { TicketCard } from "./ticket-card"; +const VISIBLE_BADGE_PREVIEW_DEADLINES = [ + DeadlineStatus.InThePast, + DeadlineStatus.HappeningNow, +]; + export const MyTicketsProfilePageHandler = () => { const language = useCurrentLanguage(); const { data: { + conference: { badgePreviewDeadline }, me: { tickets, email }, }, } = useMyProfileWithTicketsQuery({ @@ -37,7 +43,14 @@ export const MyTicketsProfilePageHandler = () => {
{tickets.map((ticket) => ( - + ))}
diff --git a/frontend/src/components/my-tickets-profile-page-handler/profile-with-tickets.graphql b/frontend/src/components/my-tickets-profile-page-handler/profile-with-tickets.graphql index 953c773f1e..3a5dea24b4 100644 --- a/frontend/src/components/my-tickets-profile-page-handler/profile-with-tickets.graphql +++ b/frontend/src/components/my-tickets-profile-page-handler/profile-with-tickets.graphql @@ -1,4 +1,12 @@ query MyProfileWithTickets($conference: String!, $language: String!) { + conference(code: $conference) { + id + badgePreviewDeadline: deadline(type: "badge_preview") { + id + status + } + } + me { id name diff --git a/frontend/src/components/my-tickets-profile-page-handler/ticket-card.tsx b/frontend/src/components/my-tickets-profile-page-handler/ticket-card.tsx index 9438683668..3c40fb3646 100644 --- a/frontend/src/components/my-tickets-profile-page-handler/ticket-card.tsx +++ b/frontend/src/components/my-tickets-profile-page-handler/ticket-card.tsx @@ -25,9 +25,10 @@ import { useSetCurrentModal } from "../modal/context"; type Props = { ticket: MyProfileWithTicketsQuery["me"]["tickets"][0]; userEmail: string; + showBadgePreview: boolean; }; -export const TicketCard = ({ ticket, userEmail }: Props) => { +export const TicketCard = ({ ticket, userEmail, showBadgePreview }: Props) => { const setCurrentModal = useSetCurrentModal(); const taglineQuestion = ticket.item.questions.find( @@ -52,6 +53,7 @@ export const TicketCard = ({ ticket, userEmail }: Props) => { const openEditTicketModal = () => { setCurrentModal("customize-ticket", { ticket, + showBadgePreview, }); };