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" && (
-
-
- {[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,
});
};