From 31063c92cb4e638de307224cc547b3548f0c21e2 Mon Sep 17 00:00:00 2001 From: Sean Morley Date: Wed, 24 Jul 2024 18:20:57 -0400 Subject: [PATCH 1/3] feat: Import world travel data with option to force import --- .../management/commands/worldtravel-seed.py | 106 +++++++++++++----- 1 file changed, 75 insertions(+), 31 deletions(-) diff --git a/backend/server/worldtravel/management/commands/worldtravel-seed.py b/backend/server/worldtravel/management/commands/worldtravel-seed.py index 41da9e3..91cfd4f 100644 --- a/backend/server/worldtravel/management/commands/worldtravel-seed.py +++ b/backend/server/worldtravel/management/commands/worldtravel-seed.py @@ -3,19 +3,22 @@ from django.core.management.base import BaseCommand from django.contrib.auth import get_user_model from worldtravel.models import Country, Region +from django.db import transaction class Command(BaseCommand): help = 'Imports the world travel data' - def handle(self, *args, **kwargs): - - # if the country or regions tables are not empty, do not insert data - if Country.objects.exists() or Region.objects.exists(): - self.stdout.write(self.style.NOTICE( - 'Countries or regions already exist in the database!')) - return + def add_arguments(self, parser): + parser.add_argument( + '-f', '--force', + action='store_true', + help='Force import even if data already exists' + ) + def handle(self, *args, **options): + force = options['force'] + countries = [ ('United States', 'us', 'NA'), ('Canada', 'ca', 'NA'), @@ -38,21 +41,6 @@ class Command(BaseCommand): ('Switzerland', 'ch', 'EU'), ('Italy', 'it', 'EU'), ] - - for name, country_code, continent in countries: - country, created = Country.objects.get_or_create( - name=name, - country_code=country_code, - defaults={'continent': continent} - ) - if created: - print(f'Inserted {name} into worldtravel countries') - else: - print(f'{name} already exists in worldtravel countries') - - self.stdout.write(self.style.SUCCESS( - 'Successfully inserted worldtravel countries!' - )) regions = [ ('US-AL', 'Alabama', 'us'), @@ -136,7 +124,7 @@ class Command(BaseCommand): ('DE-TH', 'Thüringen', 'de'), ('FR-ARA', 'Auvergne-Rhône-Alpes', 'fr'), ('FR-BFC', 'Bourgogne-Franche-Comté', 'fr'), - ('FR-BRE', 'Brittany', 'fr'), + ('FR-BRE', 'Bretagne', 'fr'), ('FR-CVL', 'Centre-Val de Loire', 'fr'), ('FR-GES', 'Grand Est', 'fr'), ('FR-HDF', 'Hauts-de-France', 'fr'), @@ -501,17 +489,73 @@ class Command(BaseCommand): ('IT-34', 'Veneto', 'it'), ] - for code, name, country_code in regions: + if not force and (Country.objects.exists() or Region.objects.exists()): + self.stdout.write(self.style.WARNING( + 'Countries or regions already exist in the database. Use --force to override.' + )) + return + + try: + with transaction.atomic(): + if force: + self.sync_countries(countries) + self.sync_regions(regions) + else: + self.insert_countries(countries) + self.insert_regions(regions) + + self.stdout.write(self.style.SUCCESS('Successfully imported world travel data')) + except Exception as e: + self.stdout.write(self.style.ERROR(f'Error importing data: {str(e)}')) + + def sync_countries(self, countries): + country_codes = [code for _, code, _ in countries] + Country.objects.exclude(country_code__in=country_codes).delete() + + for name, country_code, continent in countries: + country, created = Country.objects.update_or_create( + country_code=country_code, + defaults={'name': name, 'continent': continent} + ) + if created: + self.stdout.write(f'Inserted {name} into worldtravel countries') + else: + self.stdout.write(f'Updated {name} in worldtravel countries') + + def sync_regions(self, regions): + region_ids = [id for id, _, _ in regions] + Region.objects.exclude(id__in=region_ids).delete() + + for id, name, country_code in regions: country = Country.objects.get(country_code=country_code) - region, created = Region.objects.get_or_create( - id=code, + region, created = Region.objects.update_or_create( + id=id, defaults={'name': name, 'country': country} ) if created: - print(f'Inserted region: {name} ({code})') + self.stdout.write(f'Inserted {name} into worldtravel regions') else: - print(f'Region already exists: {name} ({code})') + self.stdout.write(f'Updated {name} in worldtravel regions') - self.stdout.write(self.style.SUCCESS( - 'Successfully inserted worldtravel regions!' - )) \ No newline at end of file + def insert_countries(self, countries): + for name, country_code, continent in countries: + country, created = Country.objects.get_or_create( + country_code=country_code, + defaults={'name': name, 'continent': continent} + ) + if created: + self.stdout.write(f'Inserted {name} into worldtravel countries') + else: + self.stdout.write(f'{name} already exists in worldtravel countries') + + def insert_regions(self, regions): + for id, name, country_code in regions: + country = Country.objects.get(country_code=country_code) + region, created = Region.objects.get_or_create( + id=id, + defaults={'name': name, 'country': country} + ) + if created: + self.stdout.write(f'Inserted {name} into worldtravel regions') + else: + self.stdout.write(f'{name} already exists in worldtravel regions') \ No newline at end of file From 3e328f408a6177864d6a4323f808a8335df8c442 Mon Sep 17 00:00:00 2001 From: Sean Morley Date: Wed, 24 Jul 2024 18:45:49 -0400 Subject: [PATCH 2/3] feat: Add latitude and longitude to NewAdventure component --- .../src/lib/components/NewAdventure.svelte | 30 ++++++++++++++++ frontend/src/routes/map/+page.svelte | 34 +++++++++++++++++++ 2 files changed, 64 insertions(+) diff --git a/frontend/src/lib/components/NewAdventure.svelte b/frontend/src/lib/components/NewAdventure.svelte index 0875bb3..2656409 100644 --- a/frontend/src/lib/components/NewAdventure.svelte +++ b/frontend/src/lib/components/NewAdventure.svelte @@ -9,6 +9,9 @@ export let type: string = 'visited'; + export let longitude: number | undefined = undefined; + export let latitude: number | undefined = undefined; + import Wikipedia from '~icons/mdi/wikipedia'; import ClipboardList from '~icons/mdi/clipboard-list'; import ActivityComplete from './ActivityComplete.svelte'; @@ -31,6 +34,11 @@ collection: null }; + if (longitude && latitude) { + newAdventure.latitude = latitude; + newAdventure.longitude = longitude; + } + let image: File; let fileInput: HTMLInputElement; @@ -164,6 +172,28 @@ on:submit={handleSubmit} action="/adventures?/create" > +
+ (type = 'visited')} + /> + (type = 'planned')} + /> +
+ // @ts-nocheck + import NewAdventure from '$lib/components/NewAdventure.svelte'; import { DefaultMarker, MapEvents, @@ -16,6 +17,19 @@ let clickedName = ''; + let newMarker = []; + + let newLongitude = null; + let newLatitude = null; + + function addMarker(e) { + newMarker = []; + newMarker = [...newMarker, { lngLat: e.detail.lngLat, name: 'Marker 1' }]; + console.log(newMarker); + newLongitude = e.detail.lngLat.lng; + newLatitude = e.detail.lngLat.lat; + } + let markers = data.props.markers; let visitedRegions = data.props.visitedRegions; @@ -31,8 +45,24 @@ // mapped to the checkbox let showGEO = true; + + let createModalOpen = false; +{#if newMarker.length > 0} + +{/if} + +{#if createModalOpen} + (createModalOpen = false)} + longitude={newLongitude} + latitude={newLatitude} + /> +{/if} + @@ -109,6 +139,10 @@ /> --> {/if} + + {#each newMarker as marker} + + {/each}