From dd8999a45f7e9f8f00c873ba6214f37b8461c401 Mon Sep 17 00:00:00 2001 From: Sean Morley Date: Mon, 19 Aug 2024 16:32:08 -0400 Subject: [PATCH] Transportation changes --- .../0004_transportation_end_date.py | 18 +++++++ backend/server/adventures/models.py | 10 ++++ backend/server/adventures/serializers.py | 2 +- .../src/lib/components/AdventureModal.svelte | 28 +++++----- .../lib/components/EditTransportation.svelte | 37 ++++++++++++- .../lib/components/NewTransportation.svelte | 23 +++++++- .../lib/components/TransportationCard.svelte | 30 +++++++---- frontend/src/lib/index.ts | 53 +++++++++---------- frontend/src/lib/types.ts | 1 + 9 files changed, 150 insertions(+), 52 deletions(-) create mode 100644 backend/server/adventures/migrations/0004_transportation_end_date.py diff --git a/backend/server/adventures/migrations/0004_transportation_end_date.py b/backend/server/adventures/migrations/0004_transportation_end_date.py new file mode 100644 index 0000000..04f3b57 --- /dev/null +++ b/backend/server/adventures/migrations/0004_transportation_end_date.py @@ -0,0 +1,18 @@ +# Generated by Django 5.0.8 on 2024-08-19 20:04 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('adventures', '0003_adventure_end_date'), + ] + + operations = [ + migrations.AddField( + model_name='transportation', + name='end_date', + field=models.DateTimeField(blank=True, null=True), + ), + ] diff --git a/backend/server/adventures/models.py b/backend/server/adventures/models.py index fbc94db..7df214f 100644 --- a/backend/server/adventures/models.py +++ b/backend/server/adventures/models.py @@ -55,6 +55,10 @@ class Adventure(models.Model): updated_at = models.DateTimeField(auto_now=True) def clean(self): + if self.date and self.end_date and self.date > self.end_date: + raise ValidationError('The start date must be before the end date. Start date: ' + str(self.date) + ' End date: ' + str(self.end_date)) + if self.end_date and not self.date: + raise ValidationError('Adventures must have an end date. Adventure: ' + self.name) if self.collection: if self.collection.is_public and not self.is_public: raise ValidationError('Adventures associated with a public collection must be public. Collection: ' + self.trip.name + ' Adventure: ' + self.name) @@ -100,6 +104,7 @@ class Transportation(models.Model): rating = models.FloatField(blank=True, null=True) link = models.URLField(blank=True, null=True) date = models.DateTimeField(blank=True, null=True) + end_date = models.DateTimeField(blank=True, null=True) flight_number = models.CharField(max_length=100, blank=True, null=True) from_location = models.CharField(max_length=200, blank=True, null=True) to_location = models.CharField(max_length=200, blank=True, null=True) @@ -109,6 +114,11 @@ class Transportation(models.Model): updated_at = models.DateTimeField(auto_now=True) def clean(self): + print(self.date) + if self.date and self.end_date and self.date > self.end_date: + raise ValidationError('The start date must be before the end date. Start date: ' + str(self.date) + ' End date: ' + str(self.end_date)) + if self.end_date and self.date is 'null': + raise ValidationError('Transportations must have an end date. Transportation: ' + self.name) if self.collection: if self.collection.is_public and not self.is_public: raise ValidationError('Transportations associated with a public collection must be public. Collection: ' + self.collection.name + ' Transportation: ' + self.name) diff --git a/backend/server/adventures/serializers.py b/backend/server/adventures/serializers.py index 620f659..9acd0b2 100644 --- a/backend/server/adventures/serializers.py +++ b/backend/server/adventures/serializers.py @@ -51,7 +51,7 @@ class TransportationSerializer(serializers.ModelSerializer): fields = [ 'id', 'user_id', 'type', 'name', 'description', 'rating', 'link', 'date', 'flight_number', 'from_location', 'to_location', - 'is_public', 'collection', 'created_at', 'updated_at' + 'is_public', 'collection', 'created_at', 'updated_at', 'end_date' ] read_only_fields = ['id', 'created_at', 'updated_at', 'user_id'] diff --git a/frontend/src/lib/components/AdventureModal.svelte b/frontend/src/lib/components/AdventureModal.svelte index 1af13d8..405bab3 100644 --- a/frontend/src/lib/components/AdventureModal.svelte +++ b/frontend/src/lib/components/AdventureModal.svelte @@ -383,7 +383,7 @@
-
+
-
-
- -
+ {#if adventure.date} +
+
+ +
+ {/if}
diff --git a/frontend/src/lib/components/EditTransportation.svelte b/frontend/src/lib/components/EditTransportation.svelte index d304d4b..289f165 100644 --- a/frontend/src/lib/components/EditTransportation.svelte +++ b/frontend/src/lib/components/EditTransportation.svelte @@ -40,6 +40,9 @@ if (transportationToEdit.date) { transportationToEdit.date = transportationToEdit.date.slice(0, 19); } + if (transportationToEdit.end_date) { + transportationToEdit.end_date = transportationToEdit.end_date.slice(0, 19); + } function close() { dispatch('close'); @@ -53,6 +56,20 @@ async function handleSubmit(event: Event) { event.preventDefault(); + // make sure end_date is not before start_date + if ( + transportationToEdit.end_date && + transportationToEdit.date && + transportationToEdit.date > transportationToEdit.end_date + ) { + addToast('error', 'End date cannot be before start date'); + return; + } + // make sure end_date has a start_date + if (transportationToEdit.end_date && !transportationToEdit.date) { + addToast('error', 'Please provide a start date'); + return; + } const form = event.target as HTMLFormElement; const formData = new FormData(form); @@ -147,7 +164,9 @@
{transportationToEdit.date ? 'Start' : ''}Date & Time
+ {#if transportationToEdit.date} +
+
+ +
+ {/if}

Start Date & Time
+ +
+
+ +
+

{transportation.name}

{transportation.type}
- {#if transportation.from_location && transportation.to_location} -

- {transportation.from_location} to {transportation.to_location} -

- {/if} - {#if transportation.date} - {new Date(transportation.date).toLocaleString(undefined, { timeZone: 'UTC' })} - {/if} +
+ {#if transportation.from_location} +

{transportation.from_location}

+ {/if} + {#if transportation.to_location} + +

{transportation.to_location}

+ {/if} +
+
+ {#if transportation.date} +

{new Date(transportation.date).toLocaleString(undefined, { timeZone: 'UTC' })}

+ {/if} + {#if transportation.end_date} + +

{new Date(transportation.end_date).toLocaleString(undefined, { timeZone: 'UTC' })}

+ {/if} +
+ {#if user?.pk === transportation.user_id}