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}