Skip to content

Commit 61959fa

Browse files
authored
Merge branch 'main' into enhancements/1403-update-booking-confirmation-design
2 parents 8f77bd7 + c1937e3 commit 61959fa

File tree

15 files changed

+524
-587
lines changed

15 files changed

+524
-587
lines changed

backend/src/appointment/routes/auth.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -653,9 +653,15 @@ def oidc_token(
653653
raise HTTPException(status_code=403, detail=l10n('invalid-credentials'))
654654

655655
oidc_id = token_data.get('sub')
656-
username = email = token_data.get('preferred_username', token_data.get('username'))
657656
name = token_data.get('name')
658657

658+
# preferred_username is the thundermail address (@thundermail.com)
659+
email = token_data.get('preferred_username', token_data.get('username'))
660+
661+
# the local part of the email should already be unique
662+
# so we can strip out the domain portion for a better Booking Link URL
663+
username = email.split('@')[0] if email else email
664+
659665
subscriber = repo.external_connection.get_subscriber_by_oidc_id(db, oidc_id)
660666

661667
# If we can't find the subscriber by oidc_id, try to find them by email

backend/test/integration/test_auth.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -934,3 +934,31 @@ def test_oidc_token_fallback_match_by_email(self, with_db, with_client, make_pro
934934
assert oidc_connection is not None
935935
assert len(oidc_connection) == 1
936936
assert oidc_connection[0].type_id == oidc_id
937+
938+
def test_oidc_token_strips_domain_from_username(self, with_db, with_client, faker):
939+
"""Ensure usernames derived from emails drop the domain portion"""
940+
os.environ['AUTH_SCHEME'] = 'oidc'
941+
942+
email = faker.email()
943+
expected_username = email.split('@')[0]
944+
oidc_id = 'new-oidc-id-strip-domain'
945+
946+
with patch('appointment.controller.apis.oidc_client.OIDCClient.introspect_token') as mock_introspect:
947+
mock_introspect.return_value = {
948+
'sub': oidc_id,
949+
'email': email,
950+
'preferred_username': email, # preferred_username is the thundermail address
951+
'name': 'OIDC User',
952+
}
953+
954+
response = with_client.post(
955+
'/oidc/token', json={'access_token': 'valid_token', 'timezone': 'America/Vancouver'}
956+
)
957+
958+
assert response.status_code == 200, response.text
959+
assert response.json() is True
960+
961+
with with_db() as db:
962+
subscriber = repo.subscriber.get_by_email(db, email)
963+
assert subscriber is not None
964+
assert subscriber.username == expected_username

backend/test/unit/test_calendar_tools.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -265,9 +265,8 @@ def test_for_host(self):
265265
assert ttl
266266

267267
def test_for_txt_record(self):
268-
"""This domain is used with permission from the owner (me, melissa autumn!)"""
269-
host, ttl = Tools.dns_caldav_lookup('melissaautumn.com')
270-
assert host == 'https://caldav.fastmail.com:443/dav/'
268+
host, ttl = Tools.dns_caldav_lookup('thundermail.com')
269+
assert host == 'https://mail.thundermail.com:443/dav/cal/'
271270
assert ttl
272271

273272
def test_no_records(self):

frontend/src/components/ConfirmationModal.vue

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,17 +33,16 @@ const emit = defineEmits(['close', 'confirm', 'error']);
3333
class="position-center fixed z-50 flex w-full max-w-lg flex-col items-center gap-6 rounded-xl bg-white p-12 dark:bg-gray-700"
3434
>
3535
<div class="btn-close absolute right-8 top-8 cursor-pointer" @click="emit('close')" :title="t('label.close')">
36-
<ph-x class="size-6 fill-transparent stroke-gray-700 stroke-1 dark:stroke-gray-400" />
36+
<ph-x class="size-6" />
3737
</div>
38-
<div class="text-2xl font-semibold text-teal-500">
38+
<div class="text-2xl font-semibold title-color">
3939
{{ title }}
4040
</div>
4141
<div class="max-w-sm text-center">
4242
{{ message }}
4343
</div>
4444
<div class="flex gap-4">
4545
<primary-button
46-
class="btn-close"
4746
variant="outline"
4847
@click="emit('close')"
4948
:title="cancelLabel"
@@ -69,3 +68,17 @@ const emit = defineEmits(['close', 'confirm', 'error']);
6968
</div>
7069
</div>
7170
</template>
71+
72+
<style scoped>
73+
.title-color {
74+
color: var(--colour-ti-highlight);
75+
}
76+
77+
.btn-close {
78+
color: var(--colour-ti-muted);
79+
80+
&:hover {
81+
color: var(--colour-ti-secondary);
82+
}
83+
}
84+
</style>

frontend/src/components/RadioGroupPill.vue

Lines changed: 0 additions & 93 deletions
This file was deleted.

frontend/src/locales/de.json

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@
7474
"googleCalendarLogo": "Google Kalender Logo",
7575
"createBookingPage": "Buchungsseite erstellen",
7676
"bookingPageTitle": "Buchungsseite Titel",
77+
"bookingPageInitialValue": "{name}'s Verfügbarkeit",
7778
"bookingPagePlaceholder": "[Vor- und Nachname]'s Verfügbarkeit",
7879
"bookingPageTitleHelp": "Dies kann später in der Verfügbarkeit geändert werden.",
7980
"calendarForNewAppointments": "Kalender für neue Termine",
@@ -101,13 +102,13 @@
101102
"calendarSettings": "Kalender-Einstellungen",
102103
"calendarsConnected": "Verbundene Kalender",
103104
"calendarsUnconnected": "Verfügbare Kalender",
104-
"cancelAppointmentService": "Termin-Service abbrechen?",
105105
"connectedAccounts": "Verbundene Konten",
106106
"connectedAccountsSettings": "Verbundene Konten Einstellungen",
107107
"connectedApplications": "Verbundene Anwendungen",
108108
"contactRequest": "Kontaktanfrage",
109109
"createNewAppointment": "Neuen Termin erstellen",
110110
"dateAndTimeFormatting": "Datums- und Zeitformat",
111+
"deleteAppointmentData": "Termin-Daten löschen",
111112
"discoverCaldavcalendars": "CalDAV-Kalender abfragen",
112113
"displayInformation": "Anzeige-Informationen",
113114
"eventBooked": "Event gebucht!",
@@ -154,10 +155,8 @@
154155
"bookingSuccessfullyDenied": "Buchung erfolgreich abgelehnt!",
155156
"bookingSuccessfullyRequested": "Buchung erfolgreich angefragt!",
156157
"bookingWillBeCanceled": "Booking will be canceled. An update will be sent to the booker.",
157-
"cancelServiceInfo": "Um deinen Appointment Service abzubrechen, klicke hier:\n Hinweis: Dies hat keinen Einfluss auf dein TB Pro Konto oder Abonnement.",
158158
"connectionEstablished": "Verbindung hergestellt",
159159
"copiedToClipboard": "In Zwischenablage kopiert",
160-
"downloadAccountData": "Um alle Daten herunterzuladen, die vom Appointment Service verwendet werden, klicken Sie hier:",
161160
"eventWasCreated": "Das Event wurde in deinem Kalender erstellt.",
162161
"invitationGenerated": "Die Einladungscodes wurden erfolgreich generiert.",
163162
"invitationWasSent": "Eine Einladung wurde an deine E-Mail-Adresse gesendet.",
@@ -169,8 +168,8 @@
169168
"slotIsAvailableAgain": "Das Zeitfenster ist jetzt wieder buchbar."
170169
},
171170
"label": {
172-
"12hAmPm": "12-hour AM/PM",
173-
"24h": "24-hour",
171+
"12hAmPm": "12:00 Uhr (12-Stunden-Format)",
172+
"24h": "24:00 (24-Stunden-Format)",
174173
"DDMMYYYY": "TT/MM/YYYY",
175174
"MMDDYYYY": "MM/TT/YYYY",
176175
"accepted": "Akzeptiert",
@@ -226,8 +225,7 @@
226225
"bookingDetails": "Buchungsdetails",
227226
"bookingLink": "Buchungslink",
228227
"bookingSlot": "Gebuchtes Zeitfenster",
229-
"bookingPageURL": "Buchungsseite URL",
230-
"bookingPageSettings": "Buchungsseite Einstellungen",
228+
"bookingPageLinkLabel": "Buchungsseite Link",
231229
"bookings": "Buchungen",
232230
"bookingPageLink": "Dein Buchungsseiten-Link",
233231
"bookingPageDetails": "Buchungsseite Details",
@@ -242,7 +240,6 @@
242240
"cancelled": "Storniert",
243241
"cancelBooking": "Buchung absagen",
244242
"cancelReason": "Grund für die Absage",
245-
"cancelService": "Service abbrechen",
246243
"changeMyAvailability": "Verfügbarkeit ändern",
247244
"changesNotSaved": "Änderungen wurden nicht gespeichert",
248245
"checkAvailableSlots": "Verfügbare Zeiten anzeigen",
@@ -259,7 +256,7 @@
259256
"connect": "Verbinden",
260257
"connectCalendar": "Kalender verbinden",
261258
"connectGoogleCalendar": "Google Kalender verbinden",
262-
"connectedAs": "Verbunden als {name}",
259+
"connectedAs": "Verbunden als",
263260
"contact": "Kontakt",
264261
"continue": "Weiter",
265262
"contributeToThisSite": "Dieser Seite beitragen",
@@ -287,6 +284,8 @@
287284
"defaultTimeZone": "Standard Zeitzone",
288285
"delete": "Löschen",
289286
"deleteBooking": "Buchung löschen",
287+
"deleteAllAppointmentData": "Alle Appointment-Daten löschen",
288+
"deleteAllAppointmentDataInfo": "Dein TB Pro-Abonnement bleibt davon unberührt.",
290289
"deny": "Ablehnen",
291290
"denyBooking": "Buchung ablehnen",
292291
"disable": "Deaktivieren",
@@ -298,7 +297,7 @@
298297
"downloadICS": "Download ICS",
299298
"downloadInvitation": "Termineinladung herunterladen",
300299
"downloadTheIcsFile": "Zu Kalender hinzufügen",
301-
"downloadMyData": "Meine Daten herunterladen",
300+
"downloadMyData": "Alle deine Daten von Appointment herunterladen",
302301
"earliestBooking": "Früheste Buchung",
303302
"edit": "Bearbeiten",
304303
"editCalendar": "Kalender bearbeiten",
@@ -344,6 +343,7 @@
344343
"logIn": "Anmelden",
345344
"logOut": "Abmelden",
346345
"loginToContinue": "Anmelden, um fortzufahren",
346+
"manageBookingLink": "Buchungsseite verwalten",
347347
"meetingDuration": "Meeting-Dauer",
348348
"meetingTitle": "Meeting Titel",
349349
"meetingDate": "Meeting-Datum",
@@ -435,7 +435,7 @@
435435
"sortBy": "Sortieren nach",
436436
"start": "Start",
437437
"startDate": "Startdatum",
438-
"startOfWeek": "Wochenbeginn",
438+
"startOfWeek": "Wochentag als Wochenbeginn",
439439
"startTime": "Startzeit",
440440
"startUsingTba": "Starte mit TBA",
441441
"status": "Status",
@@ -540,7 +540,6 @@
540540
"zoomCom": "zoom.com …"
541541
},
542542
"text": {
543-
"accountCancelWarning": "Du wirst keinen Zugriff mehr auf Thunderbird Appointment haben. Alle Buchungs-Kalender werden auf \"Inaktiv\" gesetzt und alle zukünftigen Buchungen werden storniert.\nAndere Termin-Daten werden 30 Tage lang beibehalten, entsprechend der TB Pro Datenschutzrichtlinie.",
544543
"admin": {
545544
"completelyRemoveUser": "Hier wird ein Benutzer vollständig aus Thunderbird Appointment entfernt, einschließlich aller Benutzerdaten. Diese Funktion bitte nicht ausführen, wenn es keine Aufforderung dafür gab.",
546545
"disableAccountFirst": "Das Konto muss zunächst deaktiviert sein."
@@ -550,6 +549,7 @@
550549
"chooseDateAndTime": "Wähle Tag und Zeit für ein Treffen.",
551550
"connectZoom": "Du kannst dein Zoom-Konto verbinden, um Besprechungen direkt mit einer Zoom-Einladung zu erstellen.",
552551
"contactRequestForm": "Bitte verwende das nachstehende Kontaktformular, um Feedback, Fragen oder Anliegen an unser Support-Team zu senden. Wir werden ggf. versuchen, so schnell wie möglich zu antworten.",
552+
"deleteAppointmentDataWarning": "Du wirst keinen Zugriff mehr auf Thunderbird Appointment haben. Alle Buchungs-Kalender werden auf \"Inaktiv\" gesetzt und alle zukünftigen Buchungen werden storniert.\nAndere Termin-Daten werden 30 Tage lang beibehalten, entsprechend der TB Pro Datenschutzrichtlinie.",
553553
"defineDaysAndTimeSlots": "Definiere Tage und Zeitfenster, damit Teilnehmer die Zeit des Events auswählen können …",
554554
"denialSentToAddress": "Die Informationen über die Ablehnung der Anfrage wurde per E-Mail an {address} geschickt.",
555555
"disclaimerGABooking": "Bitte beachten: Der Eigentümer muss die Buchung bestätigen.",

0 commit comments

Comments
 (0)