diff --git a/backend/server/adventures/migrations/0010_adventure_created_at_collection_created_at.py b/backend/server/adventures/migrations/0010_adventure_created_at_collection_created_at.py new file mode 100644 index 0000000..949ad10 --- /dev/null +++ b/backend/server/adventures/migrations/0010_adventure_created_at_collection_created_at.py @@ -0,0 +1,26 @@ +# Generated by Django 5.0.6 on 2024-07-18 19:27 + +import django.utils.timezone +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('adventures', '0009_alter_adventure_image'), + ] + + operations = [ + migrations.AddField( + model_name='adventure', + name='created_at', + field=models.DateTimeField(auto_now_add=True, default=django.utils.timezone.now), + preserve_default=False, + ), + migrations.AddField( + model_name='collection', + name='created_at', + field=models.DateTimeField(auto_now_add=True, default=django.utils.timezone.now), + preserve_default=False, + ), + ] diff --git a/backend/server/adventures/models.py b/backend/server/adventures/models.py index a7f41bf..14a1da8 100644 --- a/backend/server/adventures/models.py +++ b/backend/server/adventures/models.py @@ -35,6 +35,7 @@ class Adventure(models.Model): longitude = models.DecimalField(max_digits=9, decimal_places=6, null=True, blank=True) latitude = models.DecimalField(max_digits=9, decimal_places=6, null=True, blank=True) collection = models.ForeignKey('Collection', on_delete=models.CASCADE, blank=True, null=True) + created_at = models.DateTimeField(auto_now_add=True) def clean(self): if self.collection: @@ -53,6 +54,7 @@ class Collection(models.Model): name = models.CharField(max_length=200) description = models.TextField(blank=True, null=True) is_public = models.BooleanField(default=False) + created_at = models.DateTimeField(auto_now_add=True) # if connected adventures are private and collection is public, raise an error def clean(self): diff --git a/backend/server/adventures/views.py b/backend/server/adventures/views.py index 5ad6697..917fd53 100644 --- a/backend/server/adventures/views.py +++ b/backend/server/adventures/views.py @@ -31,11 +31,11 @@ class AdventureViewSet(viewsets.ModelViewSet): pagination_class = StandardResultsSetPagination def apply_sorting(self, queryset): - order_by = self.request.query_params.get('order_by', 'name') + order_by = self.request.query_params.get('order_by', 'created_at') order_direction = self.request.query_params.get('order_direction', 'asc') include_collections = self.request.query_params.get('include_collections', 'true') - valid_order_by = ['name', 'type', 'date', 'rating'] + valid_order_by = ['name', 'type', 'date', 'rating', 'created_at'] if order_by not in valid_order_by: order_by = 'name' @@ -52,6 +52,13 @@ class AdventureViewSet(viewsets.ModelViewSet): if order_direction == 'desc': ordering = f'-{ordering}' + # reverse ordering for created_at field + if order_by == 'created_at': + if order_direction == 'asc': + ordering = '-created_at' + else: + ordering = 'created_at' + print(f"Ordering by: {ordering}") # For debugging if include_collections == 'false': diff --git a/frontend/src/lib/types.ts b/frontend/src/lib/types.ts index 5b7709f..978f0f7 100644 --- a/frontend/src/lib/types.ts +++ b/frontend/src/lib/types.ts @@ -25,6 +25,7 @@ export type Adventure = { latitude: number | null; longitude: number | null; is_public: boolean; + created_at?: string; }; export type Country = { @@ -61,6 +62,7 @@ export type Collection = { description: string; is_public: boolean; adventures: Adventure[]; + created_at?: string; }; export type OpenStreetMapPlace = { diff --git a/frontend/src/routes/adventures/+page.svelte b/frontend/src/routes/adventures/+page.svelte index ef6a11d..4eb087e 100644 --- a/frontend/src/routes/adventures/+page.svelte +++ b/frontend/src/routes/adventures/+page.svelte @@ -300,6 +300,15 @@ />

Order By

+ + import AdventureCard from '$lib/components/AdventureCard.svelte'; import NotFound from '$lib/components/NotFound.svelte'; - import type { Adventure } from '$lib/types'; + import type { Adventure, OpenStreetMapPlace } from '$lib/types'; + import { onMount } from 'svelte'; import type { PageData } from './$types'; + import { page } from '$app/stores'; export let data: PageData; @@ -10,6 +12,29 @@ adventures = adventures.filter((adventure) => adventure.id !== event.detail); } + let osmResults: OpenStreetMapPlace[] = []; + + let query: string | null = ''; + + onMount(() => { + const urlParams = new URLSearchParams(window.location.search); + query = urlParams.get('query'); + + fetchData(); + }); + + async function fetchData() { + let res = await fetch(`https://nominatim.openstreetmap.org/search?q=${query}&format=jsonv2`); + const data = await res.json(); + osmResults = data; + } + + onMount(async () => { + let res = await fetch(`https://nominatim.openstreetmap.org/search?q=${query}&format=jsonv2`); + const data = await res.json(); + osmResults = data; + }); + console.log(data); let adventures: Adventure[] = []; if (data.props) { @@ -17,12 +42,24 @@ } -{#if adventures.length === 0} +{#if adventures.length === 0 && osmResults.length === 0} {:else} +

AdventureLog Results

{#each adventures as adventure} {/each}
+
+

Online Results

+
+ {#each osmResults as result} +
+

{result.display_name}

+

{result.type}

+

{result.lat}, {result.lon}

+
+ {/each} +
{/if}