diff --git a/backend/server/worldtravel/serializers.py b/backend/server/worldtravel/serializers.py index cccf754..99c7379 100644 --- a/backend/server/worldtravel/serializers.py +++ b/backend/server/worldtravel/serializers.py @@ -33,10 +33,14 @@ class CountrySerializer(serializers.ModelSerializer): class RegionSerializer(serializers.ModelSerializer): + num_cities = serializers.SerializerMethodField() class Meta: model = Region fields = '__all__' - read_only_fields = ['id', 'name', 'country', 'longitude', 'latitude'] + read_only_fields = ['id', 'name', 'country', 'longitude', 'latitude', 'num_cities'] + + def get_num_cities(self, obj): + return City.objects.filter(region=obj).count() class CitySerializer(serializers.ModelSerializer): class Meta: diff --git a/frontend/src/hooks.server.ts b/frontend/src/hooks.server.ts index 91e1b60..12cd017 100644 --- a/frontend/src/hooks.server.ts +++ b/frontend/src/hooks.server.ts @@ -3,6 +3,7 @@ import { sequence } from '@sveltejs/kit/hooks'; const PUBLIC_SERVER_URL = process.env['PUBLIC_SERVER_URL']; export const authHook: Handle = async ({ event, resolve }) => { + event.cookies.delete('csrftoken', { path: '/' }); try { let sessionid = event.cookies.get('sessionid'); diff --git a/frontend/src/lib/components/RegionCard.svelte b/frontend/src/lib/components/RegionCard.svelte index 536427b..5acd3a9 100644 --- a/frontend/src/lib/components/RegionCard.svelte +++ b/frontend/src/lib/components/RegionCard.svelte @@ -54,7 +54,14 @@ >

{region.name}

-

{region.id}

+
+
+

{region.id}

+
+
+

{region.num_cities} {$t('worldtravel.cities')}

+
+
{#if !visited} @@ -65,9 +72,11 @@ {#if visited} {/if} - + {#if region.num_cities > 0} + + {/if}
diff --git a/frontend/src/lib/types.ts b/frontend/src/lib/types.ts index ac153ca..e1e7627 100644 --- a/frontend/src/lib/types.ts +++ b/frontend/src/lib/types.ts @@ -62,6 +62,7 @@ export type Region = { country: string; latitude: number; longitude: number; + num_cities: number; }; export type City = { diff --git a/frontend/src/locales/en.json b/frontend/src/locales/en.json index 5ac5367..f3f8b49 100644 --- a/frontend/src/locales/en.json +++ b/frontend/src/locales/en.json @@ -287,7 +287,8 @@ "marked_visited": "marked as visited", "regions_in": "Regions in", "region_stats": "Region Stats", - "all_visited": "You've visited all regions in" + "all_visited": "You've visited all regions in", + "cities": "cities" }, "auth": { "username": "Username", diff --git a/frontend/src/routes/_allauth/[...path]/+server.ts b/frontend/src/routes/_allauth/[...path]/+server.ts index 681a3fa..9b09205 100644 --- a/frontend/src/routes/_allauth/[...path]/+server.ts +++ b/frontend/src/routes/_allauth/[...path]/+server.ts @@ -53,18 +53,25 @@ async function handleRequest( const headers = new Headers(request.headers); + // Delete existing csrf cookie by setting an expired date + cookies.delete('csrftoken', { path: '/' }); + + // Generate a new csrf token (using your existing fetchCSRFToken function) const csrfToken = await fetchCSRFToken(); if (!csrfToken) { return json({ error: 'CSRF token is missing or invalid' }, { status: 400 }); } + // Set the new csrf token in both headers and cookies + const cookieHeader = `csrftoken=${csrfToken}; Path=/; HttpOnly; SameSite=Lax`; + try { const response = await fetch(targetUrl, { method: request.method, headers: { ...Object.fromEntries(headers), 'X-CSRFToken': csrfToken, - Cookie: `csrftoken=${csrfToken}` + Cookie: cookieHeader }, body: request.method !== 'GET' && request.method !== 'HEAD' ? await request.text() : undefined,