1
0
Fork 0
mirror of https://github.com/seanmorley15/AdventureLog.git synced 2025-07-19 12:59:36 +02:00

Compare commits

...

1199 commits
v0.4.1 ... main

Author SHA1 Message Date
Sean Morley
4e96e529f4
fix(adventure): enhance collection ownership validation in AdventureSerializer (#723) 2025-07-09 23:03:48 -04:00
Sean Morley
cadea118d3
Merge pull request #680 from seanmorley15/development
Date and Timezone fixes (lots of them!!)
2025-06-19 11:54:41 -04:00
Sean Morley
7a17e0e1d8 feat(calendar): add markdown rendering for event descriptions in modal 2025-06-19 11:53:24 -04:00
Sean Morley
6516bc56ef refactor(lodging): remove unused icon imports and add comment for check-out date logic 2025-06-19 11:40:04 -04:00
Sean Morley
a6b39f64d6 feat(calendar): add adventure detail link in event modal 2025-06-19 11:37:08 -04:00
Sean Morley
36f9022872 fix(lodging): remove console log and improve all-day event checks in lodging modal 2025-06-19 11:33:04 -04:00
Sean Morley
3b0ccdb6d3 feat(DateRangeCollapse): auto-detect all-day setting for transportation and lodging types 2025-06-18 22:29:37 -04:00
Sean Morley
9964398e25 feat(lodging): add check-in and check-out labels and enhance date handling for lodging events 2025-06-18 22:21:34 -04:00
Sean Morley
df24316837 feat(lodging): improve lodging date handling with all-day event support and timezone adjustments 2025-06-18 21:10:10 -04:00
Sean Morley
63e8e96d52 feat(collections): enhance lodging date handling with timezone support and all-day event formatting 2025-06-18 19:57:23 -04:00
Sean Morley
08cd3912c7 fix(config): correct appVersion string formatting 2025-06-18 19:24:51 -04:00
Sean Morley
eef8c92e82 feat(calendar): enhance event handling with timezone support and filtering capabilities 2025-06-18 19:03:32 -04:00
Sean Morley
3306b799df
Merge pull request #678 from seanmorley15/development
feat: add CollectionAllView component for unified display of adventur…
2025-06-18 14:29:01 -04:00
Sean Morley
8b108c5797 refactor(CollectionAllView): enhance mobile responsiveness and clean up unused imports 2025-06-18 14:28:03 -04:00
Sean Morley
93a489a778 feat: add CollectionAllView component for unified display of adventures, transportations, lodging, notes, and checklists with filtering and sorting capabilities
i18n: update translations for collection contents and sorting options in multiple languages

refactor: replace individual sections for adventures, transportations, lodging, notes, and checklists in the collection page with the new CollectionAllView component
2025-06-18 14:05:39 -04:00
Sean Morley
44ea7dff0c
Merge pull request #677 from seanmorley15/development
fix(adventure): add collection ID to adventure when creating a new ad…
2025-06-18 10:23:02 -04:00
Sean Morley
7ec4e5d0f5 fix(adventure): add collection ID to adventure when creating a new adventure 2025-06-18 10:20:30 -04:00
Sean Morley
380fe1364f
Merge pull request #676 from blitzdose/main
Fixed frontend returning corrupt binary data
2025-06-17 18:05:20 -04:00
Christian Zäske
69631848cf
Fixed frontend returning corrupt binary data 2025-06-18 00:00:51 +02:00
Sean Morley
7f285f2b1d
Merge pull request #675 from seanmorley15/development
fix(integration): update image entry retrieval to handle multiple col…
2025-06-17 16:11:12 -04:00
Sean Morley
4f7d408460
Merge pull request #674 from nordtektiger/patch-1
update readme to reflect username changes (sorry sean!)
2025-06-17 16:03:44 -04:00
Sean Morley
aed76a5689 fix(integration): update image entry retrieval to handle multiple collections and improve access control logic 2025-06-17 15:49:27 -04:00
Jacob
a556c49147
chore: update readme to reflect username changes (sorry sean!) 2025-06-17 18:59:13 +00:00
Sean Morley
ea4b6bd715
Add Adventures to Multiple Collections 2025-06-16 18:19:43 -04:00
Sean Morley
2fb1548f9f fix(recommendations): update Google Places API integration to new endpoint and response structure 2025-06-16 17:35:38 -04:00
Sean Morley
be8ac67161 fix(geocoding): update search_google function to use new Places API and improve response handling 2025-06-16 17:31:17 -04:00
Sean Morley
0636f0ec8c docs: update maintainer information and add testimonial from Open Source Daily 2025-06-16 14:00:58 -04:00
Sean Morley
09ffb6cdff fix(docker.md): update frontend configuration table for clarity and consistency 2025-06-16 12:12:37 -04:00
Sean Morley
930c98a607 fix(geocoding): improve error handling and response validation in search_google function 2025-06-16 11:47:36 -04:00
Sean Morley
cee9345bf1 feat: Enhance CollectionLink component with search functionality and statistics display
- Implemented search functionality to filter collections based on user input.
- Added statistics display for linked collections and total collections.
- Updated modal layout for better user experience, including a search bar and clear filters option.
- Improved accessibility and visual design of the modal and its components.

refactor: Update localization files for multiple languages

- Removed outdated delete collection warning messages.
- Added new keys for adventures available, collections linked, and other relevant phrases in various languages.
- Ensured consistency across localization files for better user experience.

fix: Adjust styles in worldtravel and collections pages

- Updated styles for quick stats section in worldtravel page for improved visibility.
- Ensured proper handling of sorting parameters in collections page navigation.
2025-06-15 18:28:48 -04:00
Sean Morley
ced1f94473 fix(adventure_view): restrict queryset to user-owned adventures only 2025-06-15 17:40:43 -04:00
Sean Morley
da65235277 Update screenshots for adventures, countries, dashboard, details, edit, itinerary, map, and regions 2025-06-15 13:24:18 -04:00
Sean Morley
ab5082317e Add "invalid_credentials" message to multiple language files
- Updated Spanish (es.json) to include "invalid_credentials": "Credenciales no válidas"
- Updated French (fr.json) to include "invalid_credentials": "Des références non valides"
- Updated Italian (it.json) to include "invalid_credentials": "Credenziali non valide"
- Updated Korean (ko.json) to include "invalid_credentials": "잘못된 자격 증명"
- Updated Dutch (nl.json) to include "invalid_credentials": "Ongeldige referenties"
- Updated Norwegian (no.json) to include "invalid_credentials": "Ugyldig legitimasjon"
- Updated Russian (ru.json) to include "invalid_credentials": "Неверные полномочия"
- Updated Swedish (sv.json) to include "invalid_credentials": "Ogiltiga referenser"
- Updated Chinese (zh.json) to include "invalid_credentials": "无效的凭据"
2025-06-15 12:56:53 -04:00
Sean Morley
c2074c1581 fix(collections): ensure linked collections are sorted correctly after fetching 2025-06-14 22:16:39 -04:00
Sean Morley
977843cbc6 fix(collections): remove debug log for API URL fetching 2025-06-14 22:01:56 -04:00
Sean Morley
b0e8000cf8 Refactor UI components for improved localization and styling
- Updated various headings and text elements to utilize localization functions for better internationalization support.
- Simplified gradient styles in headings to enhance readability.
- Adjusted adventure and travel statistics sections to reflect localized titles and descriptions.
- Enhanced filter options and buttons with localized text for clarity.
- Modified Tailwind CSS configuration to include a new color 'dim' for future styling needs.
2025-06-14 18:55:59 -04:00
Sean Morley
b5931c6c23 refactor(worldtravel): remove insert_id fields from city, country, and region models; update related migration
feat(search): enhance search results display with total results count and improved layout
fix(profile): update achievement levels based on adventure count; remove unused quick actions
refactor(shared): delete unused shared collections route and related components
feat(worldtravel): improve interactive map functionality and layout in world travel detail view
2025-06-14 14:05:30 -04:00
Sean Morley
151c76dbd1 Enhance user profile and world travel pages with improved UI and functionality
- Updated user profile page to include achievement calculations and enhanced styling for user information and statistics.
- Added icons for better visual representation of user stats and achievements.
- Improved layout for displaying adventures and collections with conditional rendering for empty states.
- Refactored world travel page to include search and filter functionality for cities, with a sidebar for progress and stats.
- Implemented completion percentage and progress bars for visited cities.
- Enhanced map integration with markers for visited and not visited cities, including toggle options for map labels.
2025-06-14 11:10:59 -04:00
Sean Morley
d4c76f8718 feat(map): implement dynamic basemap URL based on theme; update map styles across components 2025-06-13 23:49:14 -04:00
Sean Morley
badeac867d fix(worldtravel): remove unnecessary hover scale effect on country cards 2025-06-13 21:48:35 -04:00
Sean Morley
a99553ba0d refactor: remove archived collections page and related components; enhance world travel pages with improved UI and filtering options 2025-06-13 21:41:10 -04:00
Sean Morley
14eb4ca802 feat(collections): enhance collections page with sorting, filtering, and pagination features
- Updated the collections loading logic to include sorting and pagination parameters from the URL.
- Refactored the collections page to manage owned, shared, and archived collections with a tabbed interface.
- Added sorting functionality to allow users to sort collections by different attributes.
- Implemented a sidebar for filtering and sorting options.
- Improved the UI for better user experience, including a floating action button for creating new collections.
- Added a not found page for collections that do not exist, enhancing error handling.
2025-06-13 12:11:42 -04:00
Sean Morley
7eb96bcc2a
Merge pull request #663 from seanmorley15/dependabot/npm_and_yarn/frontend/npm_and_yarn-6ea9762674
chore(deps): bump brace-expansion from 1.1.11 to 1.1.12 in /frontend in the npm_and_yarn group across 1 directory
2025-06-13 09:50:39 -04:00
Sean Morley
24cf3f844d
Merge pull request #665 from DesarrolloAntonio/fix-spanish-translations
fix: correct Spanish translations
2025-06-13 09:49:35 -04:00
Sean Morley
c60ced09c4
Merge branch 'development' into fix-spanish-translations 2025-06-13 09:48:18 -04:00
Antonio Corrales
05db98f968 fix: correct Spanish translations
- Fix incorrect translations and typos
- Fix inconsistent capitalization
- Keep proper names untranslated (Immich)
- Improve consistency in technical terms translation
- Correct 'Campo de golf' to 'Enlaces' (links)
- Change 'Ahorrar' to 'Guardar' (save)
- Fix various grammatical errors
2025-06-13 09:14:28 +02:00
Sean Morley
3f9a6767bd feat: Enhance Adventure and Collection Management
- Added support for multiple collections in AdventureSerializer, allowing adventures to be linked to multiple collections.
- Implemented validation to ensure collections belong to the current user during adventure creation and updates.
- Introduced a signal to update adventure publicity based on the public status of linked collections.
- Updated file permission checks to consider multiple collections when determining access rights.
- Modified AdventureImageViewSet and AttachmentViewSet to check access against collections instead of a single collection.
- Enhanced AdventureViewSet to support filtering and sorting adventures based on collections.
- Updated frontend components to manage collections more effectively, including linking and unlinking adventures from collections.
- Adjusted API endpoints and data structures to accommodate the new collections feature.
- Improved user experience with appropriate notifications for collection actions.
2025-06-12 15:54:01 -04:00
dependabot[bot]
f6b9802ba7
chore(deps): bump brace-expansion
Bumps the npm_and_yarn group with 1 update in the /frontend directory: [brace-expansion](https://github.com/juliangruber/brace-expansion).


Updates `brace-expansion` from 1.1.11 to 1.1.12
- [Release notes](https://github.com/juliangruber/brace-expansion/releases)
- [Commits](https://github.com/juliangruber/brace-expansion/compare/1.1.11...v1.1.12)

---
updated-dependencies:
- dependency-name: brace-expansion
  dependency-version: 1.1.12
  dependency-type: indirect
  dependency-group: npm_and_yarn
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-06-12 05:57:26 +00:00
Sean Morley
71ff217323
Delete documentation/public/funding.json 2025-06-11 19:45:30 -04:00
Sean Morley
ef5dca79e5
Create funding.json 2025-06-11 19:42:45 -04:00
Sean Morley
d9070e68bb
Merge pull request #660 from ShalunBdk/patch-1
Added Russian translation
2025-06-11 19:12:42 -04:00
Sean Morley
f72fb50eb0
Update ru.json 2025-06-11 19:11:23 -04:00
Sean Morley
b59dcade3b
Merge pull request #661 from jlcs-es/patch-1
Update es.json with more contextual translations
2025-06-11 12:53:43 -04:00
José Luis Cánovas
164627b35b
Update es.json
Modified some translations with more contextual ones.
2025-06-11 17:17:47 +02:00
Александр
3f89fad67f
Update +layout.svelte 2025-06-11 14:59:41 +07:00
Александр
871e265001
Update Navbar.svelte 2025-06-11 14:58:55 +07:00
Александр
2cab28e921
Create ru.json 2025-06-11 14:49:55 +07:00
Sean Morley
8a46bd7ed3
Bug fixes, UI enhancements, Google Maps, Immich Integration Improvements 2025-06-09 09:18:47 -04:00
Sean Morley
f36de76501 fix: clarify instruction in PUBLIC_SERVER_URL comment in .env.example 2025-06-08 21:05:31 -04:00
Sean Morley
55f501d939 fix: handle user_id correctly in ChecklistItem creation and updates to avoid constraint issues 2025-06-08 13:15:43 -04:00
Sean Morley
0037d037cf fix: add Authelia to the list of supported social authentication services 2025-06-07 11:16:17 -04:00
Sean Morley
19baf6ab35 chore: update version to v0.10.0 across Dockerfiles, package.json, and configuration files; add changelog for v0.10.0 release 2025-06-07 11:14:27 -04:00
Sean Morley
20cdc2405f feat: add alert message in AdventureModal for GPX file tips 2025-06-07 10:58:02 -04:00
Sean Morley
297eb2916a fix: improve Docker installation documentation for clarity and completeness 2025-06-06 19:07:47 -04:00
Sean Morley
27a27545ca fix: update button styles in CategoryModal for improved UI consistency 2025-06-06 18:39:46 -04:00
Sean Morley
06a5bb06b3 feat: enhance CategoryModal with add/edit functionality and improve localization support 2025-06-06 14:20:37 -04:00
Sean Morley
c0f2d060db fix: update marker colors based on visit status for countries, regions, and cities 2025-06-06 11:00:46 -04:00
Sean Morley
2d7b6c85c9 fix: enhance Navbar component with scroll effect and improve layout responsiveness 2025-06-06 10:21:53 -04:00
Sean Morley
5d0132a2a8 fix: pin setuptools version and update docker-compose to use images 2025-06-06 09:44:01 -04:00
Sean Morley
39c664ab1a fix: update Dockerfiles with metadata labels and improve build process 2025-06-05 23:29:39 -04:00
Sean Morley
d91a4fbe98 fix: update link to installation options in quick start guide 2025-06-05 16:40:37 -04:00
Sean Morley
90624664f4 fix: ensure interactive terminal requirement for installation script 2025-06-05 16:33:34 -04:00
Sean Morley
5f9d0cd207 chore: update dependencies and improve script execution condition
- Updated vitepress from version 1.5.0 to 1.6.3 in package.json and pnpm-lock.yaml.
- Updated various dependencies in pnpm-lock.yaml including @docsearch/css, @docsearch/js, @iconify-json/simple-icons, @shikijs/core, and others to their latest versions.
- Modified install_adventurelog.sh to improve script execution condition by allowing it to run when piped input is detected.
2025-06-05 16:24:43 -04:00
Sean Morley
36a2e59d52 fix: add logging import to integrations views 2025-06-05 15:12:40 -04:00
Sean Morley
af5be0bc8f
Potential fix for code scanning alert no. 21: Information exposure through an exception
Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>
2025-06-05 15:10:41 -04:00
Sean Morley
16840a6040 fix: update support button link in Navbar component 2025-06-05 15:02:01 -04:00
Sean Morley
ebee6f52e8 fix: update request data handling in AdventureImageViewSet and improve error handling in RecommendationsViewSet 2025-06-05 14:53:08 -04:00
Sean Morley
9d817a5ce9 feat: add Immich server connection validation and error handling in integration settings 2025-06-05 14:28:37 -04:00
Sean Morley
6fdfb86297 fix: update Docker images to use beta tags for frontend and backend services 2025-06-04 17:08:38 -04:00
Sean Morley
c0c91c8472 fix: update environment configuration and improve installer output messages 2025-06-04 16:59:41 -04:00
Sean Morley
d6ab4e9f64 feat: add auto-generation for item name in LocationDropdown and improve theme handling in Navbar 2025-06-04 14:41:29 -04:00
Sean Morley
4f342425ab
Update FUNDING.yml 2025-06-04 10:12:40 -04:00
Sean Morley
6c338b8c0f chore: update screenshots for adventures, countries, dashboard, details, edit, itinerary, map, and regions 2025-06-03 19:50:37 -04:00
Sean Morley
2f7103f5f3 fix: clear album selection when switching search categories in ImmichSelect 2025-06-03 19:16:44 -04:00
Sean Morley
d0c1ecd394 feat: enhance ImmichIntegrationView to support date range filtering and improve error handling for invalid date formats 2025-06-03 19:12:38 -04:00
Sean Morley
cf108ecd3a fix: update CollectionCard to use adventures from collection instead of a separate prop 2025-06-03 19:03:36 -04:00
Sean Morley
50a80a8116 fix: improve error handling for Immich image fetching and processing 2025-06-03 18:11:29 -04:00
Sean Morley
442a7724a0 feat: enhance Immich integration to support image downloading for shared users and improve access control for adventure images 2025-06-03 17:59:29 -04:00
Sean Morley
b336a24401 feat: enhance AdventureImageSerializer to support Immich integration and improve image URL handling 2025-06-03 17:16:28 -04:00
Sean Morley
45e195a84e feat: update Immich integration to use dynamic image URLs and enhance image retrieval logic 2025-06-02 21:25:07 -04:00
Sean Morley
937db00226 feat: add Google Maps integration with description and display status in settings 2025-06-01 23:09:48 -04:00
Sean Morley
0838a41156 feat: add unique constraint for immich_id per user in AdventureImage model and enhance Immich integration image retrieval 2025-06-01 22:50:26 -04:00
Sean Morley
06787bccf6 feat: enhance Immich integration with local copy option and validation for image handling 2025-06-01 19:55:12 -04:00
Sean Morley
f95afdc35c fix: update location blocks for protected media in nginx configuration 2025-06-01 12:47:08 -04:00
Sean Morley
c159e176b3 refactor: improve formatting and organization in nginx configuration 2025-05-31 21:54:45 -04:00
Sean Morley
b50447b1a2 refactor: clean up comments and improve readability in nginx configuration 2025-05-31 21:36:23 -04:00
Sean Morley
92f9bf6908 fix: standardize quotes in language object and improve dropdown z-index 2025-05-31 21:10:42 -04:00
Sean Morley
48df9ee56d
Update backend/server/main/settings.py
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-05-31 21:08:33 -04:00
Sean Morley
64bfda6bf0
Update backend/nginx.conf
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-05-31 21:08:20 -04:00
Sean Morley
8f1c60a440
Update backend/server/users/backends.py
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-05-31 21:08:09 -04:00
Sean Morley
806efd71bf feat: secure CSRF cookie based on frontend URL protocol 2025-05-31 17:30:33 -04:00
Sean Morley
e89f2a947e feat: enhance image navigation in adventure view with improved controls and indicators 2025-05-31 16:20:24 -04:00
Sean Morley
724aec1f3a feat: update get_num_visits method to improve user visit count retrieval 2025-05-31 15:46:15 -04:00
Sean Morley
514ee85767 feat: add distance calculation to Transportation model and update TransportationCard to display distance in km and miles 2025-05-30 12:33:30 -04:00
Sean Morley
53d370297e feat: enhance adventure save method to support skipping geocode threading 2025-05-29 21:04:07 -04:00
Sean Morley
ae16c12251 feat: update Docker Compose and environment configuration for dynamic port handling 2025-05-29 20:21:13 -04:00
Sean Morley
4e8024051c feat: implement background geocoding for adventure locations on save 2025-05-29 18:17:15 -04:00
Sean Morley
9d69935f22
Update backend/nginx.conf
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-05-29 18:02:05 -04:00
Sean Morley
787ac4a8b3 feat: add new translations for 'joined' and 'view_profile' in German locale 2025-05-29 17:48:02 -04:00
Sean Morley
81006af027 refactor: enhance UI components with improved styling and layout
- Updated CollectionCard, CountryCard, LodgingCard, NoteCard, RegionCard, TransportationCard, UserCard, and ShareModal components for better visual consistency and responsiveness.
- Introduced hover effects and transitions for a more interactive experience.
- Improved accessibility by ensuring proper alt text for images and using semantic HTML elements.
- Refactored date formatting logic into a utility function for reuse across components.
- Added new translations for profile viewing and joined date in the localization files.
2025-05-29 17:47:58 -04:00
Sean Morley
3acfc9f228 Fix banner formatting in AdventureLog installer script for improved aesthetics 2025-05-29 09:52:41 -04:00
Sean Morley
8be723b9ad Refactor authentication backends to enhance NoPasswordAuthBackend functionality; integrate Allauth for email login and improve password handling logic. 2025-05-28 12:21:43 -04:00
Sean Morley
a7128756bd Reorder authentication backends to prioritize NoPasswordAuthBackend while retaining Allauth and ModelBackend 2025-05-28 11:54:21 -04:00
Sean Morley
d41d46f15d Remove commented-out logging statements in login handling for cleaner code 2025-05-28 11:52:53 -04:00
Sean Morley
0adfdfa62f Refactor login cookie handling to improve parsing and error handling; ensure multiple Set-Cookie headers are processed correctly. 2025-05-28 11:43:03 -04:00
Sean Morley
fa52af8ad1 Add detailed logging for login process and cookie handling 2025-05-28 11:31:38 -04:00
Sean Morley
6be4acb196 Add authentication backends for Allauth and Django's ModelBackend 2025-05-28 11:06:21 -04:00
Sean Morley
9df0338c3d Add new translations for distance, itinerary, and linked items in multiple languages; update UI to reflect new localization keys. 2025-05-28 10:51:26 -04:00
Sean Morley
069bcfb58a Enhance dynamic port handling in installer and configuration files; update .env.example and docker-compose.yml to use environment variables for frontend and backend ports. 2025-05-27 22:42:08 -04:00
Sean Morley
1551fba9ab Refactor migration to set end_date only if start_date is present; improve data integrity during migration process. 2025-05-27 12:43:29 -04:00
Sean Morley
56b8b55b84 Refactor deleteCollection function to use DELETE method for API call; update endpoint to match new API structure. 2025-05-27 12:39:38 -04:00
Sean Morley
57aa2c9916 Enhance download-countries command with temporary SQLite database for efficient data processing; add batch size argument for improved performance and memory management. 2025-05-27 10:12:33 -04:00
Sean Morley
37866660d3 Adjust batch size in download-countries command for improved processing efficiency; update installer banner for better visual alignment. 2025-05-27 09:59:15 -04:00
Sean Morley
d34a9001c0 Enhance AdventureLog installer with Docker container check; improve service readiness feedback and success message formatting. 2025-05-26 21:09:00 -04:00
Sean Morley
bcd1f02131 Enhance download-countries command with batch processing feedback; improve logging for countries, regions, and cities processing. 2025-05-26 20:43:11 -04:00
Sean Morley
f2246921d4 Refactor download-countries command for improved memory efficiency and batch processing; enhance data import logic for countries, regions, and cities. 2025-05-26 20:39:24 -04:00
Sean Morley
575669aedf Refactor batch processing in download-countries command for clarity and safety; enhance service wait function in installer script by removing unnecessary whitespace. 2025-05-26 18:06:06 -04:00
Sean Morley
9eaaadc0f2 Enhance entrypoint script with a helper function for environment variable retrieval; improve PostgreSQL connection logic. Update installer script to add spacing for readability in service wait function. 2025-05-26 17:36:22 -04:00
Sean Morley
3f6aa67b3f Refactor database configuration to use a helper function for environment variables, improving compatibility with legacy setups. 2025-05-26 17:18:30 -04:00
Sean Morley
5e6d5305cc Update docker-compose to use beta images for frontend and backend services; clean up install script 2025-05-26 17:14:12 -04:00
Sean Morley
4fb25f63fd Update .env.example with additional optional configurations and change docker-compose to use development images for frontend and backend services 2025-05-26 17:07:52 -04:00
Sean Morley
40f54529a4 Refactor environment variable names in .env.example and settings.py for consistency; add install script for streamlined setup 2025-05-26 16:55:00 -04:00
Sean Morley
7707ac7769 Add .env.example and update docker-compose to use env_file for configuration 2025-05-26 14:11:31 -04:00
Sean Morley
b25bf4af27 Add Google Maps integration documentation and update docker-compose for API key 2025-05-26 13:59:18 -04:00
Sean Morley
f355ba48e2 Fix condition for Google Maps integration check in IntegrationView 2025-05-25 22:25:36 -04:00
Sean Morley
e56335d30f Refactor geocoding and integration handling: remove debug print, streamline reverse geocoding logic, and enhance integration response structure 2025-05-25 22:13:18 -04:00
Sean Morley
c123231bab Optimize country data import process: increase batch size, implement memory management, and streamline record creation and updates 2025-05-24 19:05:16 -04:00
Sean Morley
9e304f81fe Fix date display logic to handle undefined visit dates in DateRangeCollapse and adventure page 2025-05-24 18:56:59 -04:00
Sean Morley
1997f164b8 Handle exceptions in search method with a generic error message 2025-05-24 18:08:58 -04:00
Sean Morley
c0b9013576 Remove OpenStreetMap button from recommendations in collections page 2025-05-24 18:06:25 -04:00
Sean Morley
ce9faa28f8 Refactor recommendations feature: add RecommendationsViewSet, update routing, and remove OverpassViewSet 2025-05-24 18:00:05 -04:00
Sean Morley
68ba3c4b4d Add Google Maps API integration for geocoding and reverse geocoding functionality 2025-05-24 14:59:58 -04:00
Sean Morley
042d034594 Implement reverse geocoding search functionality and update type definitions 2025-05-24 14:12:06 -04:00
Sean Morley
ec2b285d50 Remove logging for error handling in reverse_geocode function 2025-05-23 23:17:47 -04:00
Sean Morley
03c76adc6d Merge branch 'development' of github.com:seanmorley15/AdventureLog into development 2025-05-23 23:15:41 -04:00
Sean Morley
4404064263 Adjust heading margin for improved layout on adventures page 2025-05-23 23:15:39 -04:00
Sean Morley
7fddca6fb0
Potential fix for code scanning alert no. 16: Information exposure through an exception
Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>
2025-05-23 23:13:31 -04:00
Sean Morley
809cf98169 Enhance AdventureCard component with activity type display and rating system; update CardCarousel gradient fallback for no images 2025-05-23 23:00:15 -04:00
Sean Morley
d3d74f9f35 Add localization support for adventure and settings pages; enhance UI elements
- Updated Chinese translations in zh.json for various UI components including coordinates, sun times, and authentication settings.
- Refactored adventure page to utilize localization for visit counts, descriptions, and other text elements.
- Improved settings page by integrating localization for profile, security, email management, and integration sections.
- Enhanced visual consistency by updating card backgrounds and adding localized text for buttons and labels.
2025-05-23 17:22:28 -04:00
Sean Morley
e856a57498 Refactor code structure for improved readability and maintainability 2025-05-23 12:15:44 -04:00
Sean Morley
0d5792a99a Refactor adventure page layout and enhance UI components
- Updated the layout of the adventure page to improve visual hierarchy and user experience.
- Reorganized the structure of the hero section, including image navigation and quick info cards.
- Enhanced the display of adventure details, including user info, visit history, and sun times.
- Improved the handling of attachments and external links with better styling and accessibility.
- Added functionality for copying coordinates and links to the clipboard.
- Refined the map section to provide clearer location information and improved marker display.
- Cleaned up unused imports and optimized the code for better readability.
2025-05-23 11:23:24 -04:00
Sean Morley
2ccb8f5e0b Enhance geocoding functionality with host resolution and improved error handling; update AdventureModal for loading state management; refine LocationDropdown toast display logic; adjust world travel page for better documentation link visibility. 2025-05-23 10:46:37 -04:00
Sean Morley
0d800e8986
Merge pull request #587 from lkiesow/bool-case-sensitivity
Make boolean settings case insensitive
2025-05-22 21:22:36 -04:00
Sean Morley
3d9f4545a1
Merge branch 'development' into bool-case-sensitivity 2025-05-22 21:22:27 -04:00
Sean Morley
0a7db8985d
Merge pull request #608 from seanmorley15/dependabot/npm_and_yarn/documentation/npm_and_yarn-1b547a5c31
chore(deps): bump the npm_and_yarn group across 2 directories with 1 update
2025-05-22 21:19:41 -04:00
Sean Morley
c828f86570
Change note preview to render markdown content 2025-05-22 21:17:21 -04:00
Sean Morley
a1062e72cf Enhance Adventure model and serializers with visited status logic and toast notifications for marking visits 2025-05-22 21:13:31 -04:00
Sean Morley
84cd136401 Add bulk geocoding command and trigger geocoding action in admin 2025-05-22 20:29:05 -04:00
Sean Morley
ac32f9ac5b Add country field to AdventureSerializer with country code retrieval 2025-05-22 20:13:36 -04:00
Sean Morley
d52e302e9b Add geocoding functionality and enhance Adventure model with location fields 2025-05-22 20:05:13 -04:00
Sean Morley
14e71626f6 Enhance Nginx configuration for protected media files with PDF handling 2025-05-22 16:26:50 -04:00
Sean Morley
f96b6f5f65
Merge pull request #556 from janausis/oicd_login_fix
Frontend OICD Login Fix
2025-05-22 11:07:43 -04:00
Sean Morley
5dfe39468a
Add link to Mastodon profile in VitePress config 2025-05-21 14:14:59 -04:00
Sean Morley
a991f54d0a Add link to Mastodon profile in VitePress config 2025-05-21 14:14:39 -04:00
Florian Meinicke
274dafc47d Change note preview to render markdown content
in the Collection/Itinerary view

Closes #627
2025-05-21 07:33:20 +00:00
Sean Morley
5f19670ed9
Fixes [BUG] Cannot change a adventure from Private to Public #617 2025-05-19 11:52:51 -04:00
Sean Morley
bd9f3fc494
Update backend/server/adventures/views/adventure_view.py
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-05-19 11:28:04 -04:00
Sean Morley
d87d0e807f Fixes [BUG] Cannot change a adventure from Private to Public #617 2025-05-19 11:21:40 -04:00
Sean Morley
8b41a0f5a4
Update date validation to use UTC comparison and enhance documentation 2025-05-13 12:55:06 -04:00
Sean Morley
9435ccfa5a Add arrival and departure date labels to localization files 2025-05-13 12:54:06 -04:00
Sean Morley
890332f4b6 Update date validation to use UTC comparison and enhance documentation 2025-05-13 12:50:43 -04:00
Sean Morley
049c229799
Merge pull request #614 from seanmorley15/development
Development
2025-05-12 10:46:02 -04:00
Sean Morley
f15d7bfd1e Remove debug print statements from DisableCSRFForMobileLoginSignup middleware 2025-05-12 10:42:50 -04:00
Sean Morley
7c3c139e61 Add DisableCSRFForMobileLoginSignup middleware to handle CSRF checks for mobile login/signup requests 2025-05-12 10:42:26 -04:00
Sean Morley
1ff116ed00
Merge pull request #611 from seanmorley15/development
Adjust CollectionCard styles: remove overflow-hidden and increase dro…
2025-05-11 12:44:05 -04:00
Sean Morley
b0e8c025fc Adjust CollectionCard styles: remove overflow-hidden and increase dropdown width 2025-05-11 12:43:31 -04:00
Sean Morley
feeb682e14
Merge pull request #610 from seanmorley15/development
Replace crypto.randomUUID with a unique ID generation method for visi…
2025-05-11 11:50:58 -04:00
Sean Morley
6de737bbf8 Replace crypto.randomUUID with a unique ID generation method for visit objects and timezone selector instance 2025-05-11 11:50:29 -04:00
dependabot[bot]
6ca674ff7e
chore(deps): bump the npm_and_yarn group across 2 directories with 1 update
Bumps the npm_and_yarn group with 1 update in the /documentation directory: [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite).
Bumps the npm_and_yarn group with 1 update in the /frontend directory: [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite).


Updates `vite` from 5.4.14 to 5.4.19
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/v5.4.19/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v5.4.19/packages/vite)

Updates `vite` from 5.4.18 to 5.4.19
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/v5.4.19/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v5.4.19/packages/vite)

---
updated-dependencies:
- dependency-name: vite
  dependency-version: 5.4.19
  dependency-type: indirect
  dependency-group: npm_and_yarn
- dependency-name: vite
  dependency-version: 5.4.19
  dependency-type: direct:development
  dependency-group: npm_and_yarn
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-05-11 02:21:09 +00:00
Sean Morley
908d31a4a3
Adventure Times, Collection Ordering, Trip Maps 2025-05-10 22:19:43 -04:00
Sean Morley
4af80eb584 Add arrival and departure timezone translations in multiple languages 2025-05-10 22:10:55 -04:00
Sean Morley
d9d754a87c Fix date handling in DateRangeCollapse and TransportationModal; improve hash change handling in +page.svelte 2025-05-10 22:03:31 -04:00
Sean Morley
abc2d86dcf Enhance visit date display with timezone support and improved formatting 2025-05-10 21:40:18 -04:00
Sean Morley
330fabb3e0 Fix validation in Lodging model to check check-in and check-out dates; update LodgingCard to conditionally display timezone 2025-05-10 13:17:01 -04:00
Sean Morley
8538aa0b7c Validate ISO date in toLocalDatetime function and return empty string for invalid dates 2025-05-10 13:02:44 -04:00
Sean Morley
c9fa1d55f7 Refactor toLocalDatetime function to improve ISO date handling and return format 2025-05-10 13:02:06 -04:00
Sean Morley
ab189c8aff Improve UTC date formatting by adding validation for ISO date strings in formatUTCDate function 2025-05-10 12:49:43 -04:00
Sean Morley
1323d91e32 Add timezone support for visits, transportation, and lodging
- Introduced TIMEZONES constant in models.py to store valid timezone options.
- Updated Visit, Transportation, and Lodging models to include timezone fields.
- Modified serializers to include timezone fields in VisitSerializer, TransportationSerializer, and LodgingSerializer.
- Enhanced DateRangeCollapse component to handle timezone selection and formatting.
- Implemented timezone formatting functions in LodgingCard and TransportationCard components.
- Updated LodgingModal and TransportationModal to bind timezone data.
- Added VALID_TIMEZONES to dateUtils for consistent timezone management across the application.
2025-05-10 11:59:56 -04:00
Sean Morley
b30d6df964 Enhance timezone handling in AdventureModal and DateRangeCollapse components; add support for departure and arrival timezones in the TimezoneSelector and update localization for new timezone labels. 2025-05-10 10:47:00 -04:00
Sean Morley
89c4f1058a Fix date formatting for constraint dates in DateRangeCollapse component 2025-05-09 23:33:58 -04:00
Sean Morley
13bc748d0d Merge branch 'development' of github.com:seanmorley15/AdventureLog into development 2025-05-09 23:27:54 -04:00
Sean Morley
c6177c5a05 Refactor DateRangeCollapse component layout and improve styling 2025-05-09 23:27:53 -04:00
Sean Morley
e9c333642f
Merge pull request #589 from lkiesow/sm-hide-al
Move hiding AdventureLog to first Tailwind breakpoint
2025-05-09 23:13:08 -04:00
Sean Morley
07c0c36ab8
Potential fix for code scanning alert no. 14: Workflow does not contain permissions
Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>
2025-05-09 21:35:33 -04:00
Sean Morley
b712d10d7e
Potential fix for code scanning alert no. 13: Workflow does not contain permissions
Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>
2025-05-09 21:35:16 -04:00
Sean Morley
a5e44d29e6
Merge pull request #594 from lkiesow/mobile-map-full-width
Full width map on mobile
2025-05-09 21:33:29 -04:00
Sean Morley
a91018d792
Merge pull request #572 from lkiesow/theme-picker
Harmonize language and theme picker interface
2025-05-09 21:32:47 -04:00
Sean Morley
9f86688fe9 Merge branch 'development' of github.com:seanmorley15/AdventureLog into development 2025-05-09 21:31:39 -04:00
Sean Morley
4ce7ed7045 Improve layout by wrapping map link text in a paragraph element 2025-05-09 21:31:37 -04:00
Sean Morley
b74fe90512
Merge pull request #586 from lkiesow/collection-dropdown
Collection view selection on mobile devices
2025-05-09 21:30:54 -04:00
Sean Morley
73c664e549
Merge pull request #569 from lkiesow/note-preview
Show Note Preview on Card
2025-05-09 21:29:51 -04:00
Sean Morley
5e1f17fe2e
Merge pull request #591 from lkiesow/menu-text-size
Adjust main menu font size
2025-05-09 21:27:44 -04:00
Sean Morley
f3f75368df
Merge pull request #593 from lkiesow/google-maps
Open in Apple Maps or Google Maps
2025-05-09 21:19:58 -04:00
Sean Morley
ab12a2e7d8
Merge pull request #588 from lkiesow/collection-card-width
Unify collection card width
2025-05-09 21:19:20 -04:00
Sean Morley
cbb8c6283b
Merge pull request #600 from theshaun/patch-1
Update en.json - Correct spelling of Search
2025-05-09 21:18:28 -04:00
Sean Morley
0af0218a34
Merge branch 'development' into patch-1 2025-05-09 21:18:13 -04:00
Sean Morley
04f9227ae6 Add default category icon and improve visit display:
- Set default icon for empty category in AdventureModal
- Enhance layout for visit buttons and validation messages in DateRangeCollapse
- Update localization files to include "no visits" strings in multiple languages
2025-05-09 21:17:11 -04:00
Sean Morley
3caebd37dd Add additional localization strings for itinerary features in Polish, Swedish, and Chinese
- Added "additional_info", "invalid_date_range", "sunrise_sunset", and "timezone" keys to pl.json, sv.json, and zh.json.
- Updated existing strings for consistency across languages.
2025-05-09 15:59:48 -04:00
Sean Morley
311e2847cb Enhance visit display: Improve layout and formatting of visit dates and notes 2025-05-09 15:19:17 -04:00
Sean Morley
2c50ca0b1a Refactor date handling components: Replace DateRangeDropdown with DateRangeCollapse
- Introduced DateRangeCollapse.svelte to manage date range selection with timezone support.
- Removed DateRangeDropdown.svelte as it was redundant.
- Updated LodgingModal and TransportationModal to utilize DateRangeCollapse for date selection.
- Enhanced date conversion utilities to handle all-day events correctly.
- Adjusted TimezoneSelector for improved accessibility and focus management.
- Updated date handling logic in dateUtils.ts to support all-day events.
- Modified test page to reflect changes in date range component usage.
2025-05-09 10:24:29 -04:00
Lars Kiesow
bbad7b890c
Add support for OpenStreetMap
This patch adds an option to open an item in OpenStreetMap as well as in
Google Maps and Apple Maps.
2025-05-07 21:11:42 +02:00
Sean Morley
5c109bbbaf
Update config.mts 2025-05-06 19:40:36 -04:00
Sean Morley
c93d4865ce
Update config.mts 2025-05-06 16:57:32 -04:00
Sean Morley
8d0490fd81 fix: Update pageData check to use 'index.md' for JSON-LD transformation 2025-05-06 14:50:39 -04:00
Sean Morley
77be046f19 feat: Add JSON-LD structured data for homepage SEO enhancement 2025-05-06 14:47:03 -04:00
Sean Morley
827b150965 Merge branch 'development' of github.com:seanmorley15/AdventureLog into development 2025-05-06 14:38:33 -04:00
Sean Morley
7442bd70cd Update version to 0.9.0, add DateRangeDropdown component, enhance LodgingModal with price step, and add invalid date range message 2025-05-06 14:38:31 -04:00
Shaun Walker
645cc9728b
Update en.json - Correct spelling of Search 2025-05-03 20:50:06 +10:00
Sean Morley
d99ca18e1c
Merge pull request #590 from lkiesow/remove-invisible-mapmarker
Remove Invisible MapMarker
2025-04-30 22:29:27 -04:00
Sean Morley
39104b3fef
Merge pull request #595 from lesensei/development
Update fr.json
2025-04-27 12:14:31 -04:00
lesensei
5bdadd0f88
Merge pull request #1 from lesensei/fr-translations-update-1
Update fr.json
2025-04-27 18:07:26 +02:00
lesensei
f1f1cda799
Update fr.json 2025-04-27 18:05:27 +02:00
Lars Kiesow
f31db982ce
Full width map on mobile
This patch lets the map in the adventure details use the full screen
width on mobile instead of having one sixth of the screen empty.
2025-04-27 17:49:31 +02:00
Lars Kiesow
f6097a2d60
Open in Apple Maps or Google Maps
This patch provides the additional option to open a location in Google
maps as an alternative to Apple Maps.
2025-04-27 17:42:51 +02:00
Lars Kiesow
5f7bf52758
Adjust main menu font size
This patch slightly adjusts the font size of list items in the main
menu. I probably wouldn't mind making it even a bit bigger, but that's
probably worth a separate discussion.

Reasons for this adjustment:

1. Don't use different font sizes in the same lement.
   While the buttons rendered at 14px, the search text rendered at 16px.
   They should have the same font-size.

2. The buttons were below the base text size controlled by Tailwind CSS.
   This means, it also puts the font size below the recommended
   font-size for mobile devices (Google/Apple guidelines). This patch
   puts them at the base level.
2025-04-27 16:08:03 +02:00
Lars Kiesow
911ce67d9f
Remove Invisible MapMarker
This patch removes the map marker from the adventures list item of the
main menu dropdown. It is not being rendered and given that all other
elements do not have an icon, it is probably a remnant of old code and
left by accident.
2025-04-27 16:03:16 +02:00
Lars Kiesow
932036bc8b
Move hiding AdventureLog to first Tailwind breakpoint
This is a slight improvement to pull request #576. I noticed that on a
tablet, the AdventureLog in the navigation bar would not render, even
though there would be enpugh free space. This patch moves the breakpoint
for hiding the text one step further towards smaller devices.
2025-04-27 15:41:43 +02:00
Lars Kiesow
cd494fefee Unify collection card width
The width of collection cards can vary quite a bit. Additionally, the
cards look different than the cards within a collection. It would be
nice if the design would be more or leyy the same for all of them.

This patch adjusts the collection card design by adapting the classes
from the cards within the collection (I literally just copied the
classes from ChecklistCard). This is another step in making the user
interface more homogeneous.
2025-04-27 15:30:12 +02:00
Lars Kiesow
5136122ed9
Make boolean settings case insensitive
Having to use the Python syntax when it comes to case sensitivity for
booleans in environment variables can be unexpected and doesn't really
provide any benefit.

This patch makes all boolean settings case-insensitive. This means that,
for example, both `True` and `true` evaluate to `True` in Python.

This fixes #559
2025-04-26 23:27:25 +02:00
Lars Kiesow
e40ea028d0
Collection view selection on mobile devices
The tab-based selection of views in a collection doesn't really work on
mobile devices since it needs too much horizontal space. This leads to
text overflowing buttons as well as half of the tab bar disappearing
behind the right edge of the phone screen.

This patch modifies the navigation by keeping the current tabs in
desktop mode, but switching to a very compact dropdown on mobile
devices.

The functionality of both elements is identical.
2025-04-26 22:53:45 +02:00
Sean Morley
56bbbb0ffb Implement code changes to enhance functionality and improve performance 2025-04-26 11:22:17 -04:00
Sean Morley
228f79dbc3
Merge pull request #585 from lkiesow/node22
Upgrade Node.js to Version 22
2025-04-25 10:02:52 -04:00
Sean Morley
e44c153f9b
Merge pull request #576 from lkiesow/mobile-navbar
Improve overlapping on navbar on mobile devices
2025-04-25 10:00:49 -04:00
Lars Kiesow
3a8776c000
Show AdventureLog icon instead of text in mobile mode
This patch makes AdventureLog hide the text but show the app icon in
the navigation bar when in mobile mode.
2025-04-25 15:56:30 +02:00
Lars Kiesow
b8aa96b5b3
Improve overlapping on navbar on mobile devices
This patch makes it less likely for elements of the navigation bar to
overlap each other on mobile devices. It also makes spacing a bit more
homogeneous.

The patch basically just adjust some spacing as and hides the map icon
on mobile devices.
2025-04-25 15:56:20 +02:00
Lars Kiesow
be0e56728a
Upgrade Node.js to Version 22
This patch updates the Dockerfile to use Node.js 22 for running the
frontend. Given that the security support of Node.js 18 ends in 6 days
(30 Apr 2025), upgrading definitely makes sense.

Additionally, this also seems to fix the broken JSON generated by the
recently upgrraded version of @sveltejs/kit, thus fixing #584.
2025-04-25 14:19:07 +02:00
Sean Morley
85b4db87ec refactor: Simplify date handling by replacing updateLocalDates and updateUTCDates with updateLocalDate and updateUTCDate functions 2025-04-19 21:53:17 -04:00
Sean Morley
c12f94855d feat: Refactor date handling in TransportationModal and add utility functions for date conversion and validation 2025-04-19 21:44:40 -04:00
Sean Morley
6942f5e1bb feat: Add TimezoneSelector component and integrate Luxon for date handling 2025-04-18 23:06:36 -04:00
Sean Morley
7499722867 feat: Add server error handling and SVG asset for 500 error page 2025-04-18 21:55:30 -04:00
Sean Morley
1ea4022e80 Merge branch 'development' of github.com:seanmorley15/AdventureLog into development 2025-04-18 15:04:10 -04:00
Sean Morley
a8502884dc feat: Add tutorial video section to usage documentation 2025-04-18 15:04:04 -04:00
Sean Morley
b29461f29d
Merge pull request #575 from lkiesow/frontend-build-test
Simple Frontend Build Test
2025-04-18 11:51:49 -04:00
Sean Morley
983a038420
Update frontend-test.yml 2025-04-18 11:50:33 -04:00
Sean Morley
233d2be63f
Merge pull request #574 from lkiesow/transportation-card-badges
Prevent UI overlaps in transportation card
2025-04-18 11:49:52 -04:00
Sean Morley
64377c0300
Merge pull request #566 from lkiesow/dropdown-size
Fix rendering issue in adventure dropdown
2025-04-18 11:48:39 -04:00
Lars Kiesow
0f36f34bfb
Simple Frontend Build Test
This patch adds a simple test for checking if the frontend builds
properly. This is similar to the recently added backend check and will
be run automatically on pushes and pull requests.
2025-04-18 00:48:53 +02:00
Lars Kiesow
ea85c5fc5a Prevent UI overlaps in transportation card
Similar to #552 (658764f) the card title and badges of the
transportation card can overlap. This patch adjusts the transportation
card to list the badges below the title similar to the other cards.
2025-04-18 00:22:50 +02:00
Lars Kiesow
9a825e56e4 Harmonize language and theme picker interface
This patch adjusts the theme picker to more look and feel like the
language picker right next to it.
2025-04-16 00:45:29 +02:00
Sean Morley
9043ee9565
Merge pull request #570 from seanmorley15/dependabot/npm_and_yarn/frontend/npm_and_yarn-d34ec6d50c
chore(deps-dev): bump @sveltejs/kit from 2.8.3 to 2.20.6 in /frontend in the npm_and_yarn group across 1 directory
2025-04-15 09:33:39 -04:00
dependabot[bot]
a11400fa98
chore(deps-dev): bump @sveltejs/kit
Bumps the npm_and_yarn group with 1 update in the /frontend directory: [@sveltejs/kit](https://github.com/sveltejs/kit/tree/HEAD/packages/kit).


Updates `@sveltejs/kit` from 2.8.3 to 2.20.6
- [Release notes](https://github.com/sveltejs/kit/releases)
- [Changelog](https://github.com/sveltejs/kit/blob/main/packages/kit/CHANGELOG.md)
- [Commits](https://github.com/sveltejs/kit/commits/@sveltejs/kit@2.20.6/packages/kit)

---
updated-dependencies:
- dependency-name: "@sveltejs/kit"
  dependency-version: 2.20.6
  dependency-type: direct:development
  dependency-group: npm_and_yarn
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-04-14 23:21:27 +00:00
Lars Kiesow
44a260b5b6 Show Note preview on Card
Often, you end up having short notes or even just a simple link and it
is somewhat tedious to go into the details to retrieve the additional
information.

This patch displays a preview of the note content and a maximum of three
links on the notes card directly. This makes accessing information much
faster.

This fixes #562.
2025-04-15 01:05:02 +02:00
Lars Kiesow
49f7bf27e8 Fix rendering issue in adventure dropdown
This is a very simple patch fixing the rendering issue of the “Remove
from collection” option in the adventure dropdown.-

Together with #552, this should fix #539.
2025-04-14 18:44:15 +02:00
Sean Morley
dd01ada61e
Update docker.md
Fixes #560
2025-04-14 11:22:20 -04:00
Sean Morley
a974c8c275
Merge pull request #558 from lkiesow/test
Basic Integration Test for backend
2025-04-14 11:12:59 -04:00
Sean Morley
988cdc12e6
Merge pull request #557 from lkiesow/python-syntax-error
Fix Python Syntax Error
2025-04-14 11:11:48 -04:00
Lars Kiesow
548d43b563 Basic Integration Test for backend
This patch implements a very basic test for commits and pull requests to
be run on GitHub Actions. This does not yet check much, but would have
caught something like the recent syntax error.
2025-04-12 01:07:28 +02:00
Lars Kiesow
23426012af Fix Python Syntax Error
Commit 937c3c6a68 introduced a Python
syntax error, breaking the server. This fixes the issue by restoring the
probably accidental removal of one line of code.
2025-04-11 20:18:14 +02:00
Jannis Martensen
2b031f51ac fixed oicd not working on frontend login page 2025-04-11 12:35:05 +02:00
Sean Morley
d7496df100
Merge pull request #554 from andreatitolo/development
Adjusted Italian translation
2025-04-08 15:32:44 -04:00
Andrea Titolo
6f489b2734
Consistency in translating collections 2025-04-08 20:49:49 +02:00
Andrea Titolo
a09b3f379f
Update italian translation and terms 2025-04-08 19:26:11 +02:00
Sean Morley
937c3c6a68
Update backend/server/adventures/views/collection_view.py
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-04-07 19:17:26 -04:00
Sean Morley
43b8275fc1
Update documentation/docs/install/caddy.md
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-04-07 19:16:58 -04:00
Sean Morley
3b5240dffe
Update documentation/docs/troubleshooting/login_unresponsive.md
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-04-07 19:14:55 -04:00
Sean Morley
d2933854ff
Update documentation/docs/usage/usage.md
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-04-07 19:14:04 -04:00
Sean Morley
0ce101594f
Merge pull request #550 from lkiesow/collection-browser-navigation
Enable Browser Navigation in Collections
2025-04-06 20:27:25 -04:00
Sean Morley
b166058d36
Merge pull request #551 from larsl-net/dual-stack
fix: Reenable IPv6 for Backend
2025-04-06 20:26:36 -04:00
Sean Morley
15d34c88dc
Merge pull request #552 from lkiesow/lodging-card
Prevent UI overlaps in lodging card
2025-04-06 20:25:11 -04:00
Sean Morley
af2778ff61
Merge pull request #548 from lkiesow/users-reedirect
Prevent unnecessary redirect when requesting users
2025-04-06 20:23:53 -04:00
Sean Morley
2982a4044d
Merge pull request #547 from lkiesow/caddy
Document deployment using Caddy
2025-04-06 20:22:53 -04:00
Lars Kiesow
658764fb58
Prevent UI overlaps in lodging card
This patch prevents overlapping UI eelements in the ledging card. It
adjusts the UI to be more like the adventure cards when it comes to font
size and element placing.

This partly fixes #539
2025-04-07 01:42:12 +02:00
Lars Lehmann
847193a0ae
fix: Reenable IPv6 for Backend 2025-04-06 22:55:13 +02:00
Lars Kiesow
8531855f46 Enable Browser Navigation in Collections
If you are in a collection – e.g on “All Linked Items” – and go into an
adventure, going back will cause you to end up on the itinerary. This is
quite annoying if you have a number of options for a trip linked already
but whenever you go back, you have to scroll up again, click on “All
Linked Items”, and scroll down again to get to the next adventure in
line.

This patch makes AdventureLog remember the tab you were in and going
back and forth in the browser history will actually work.
2025-04-06 21:09:27 +02:00
Lars Kiesow
af8a9acbae
Prevent unnecessary redirect when requesting users
Opening the share dialog, the frontend is requesting `/auth/users/`
which is always redirected to `/auth/users`. That's an unnecessary extra
step.

This patch makes the front-end request `/auth/users` in the first place.
2025-04-06 14:37:37 +02:00
Lars Kiesow
8041f67ba1
Document deployment using Caddy
This patch adds documentation on how to run AdventureLog with Caddy as a
reverse proxy.

Signed-off-by: Lars Kiesow <lkiesow@uos.de>
2025-04-06 12:32:19 +02:00
Sean Morley
cd833884e8
Merge pull request #546 from eidsheim98/nb-locale
Norwegian translations
2025-04-01 16:41:26 -04:00
Nikolai Eidsheim
47c219affd Added Norwegian translation 2025-04-01 22:35:03 +02:00
Nikolai Eidsheim
cde293c4bd Merge remote-tracking branch 'origin/main' into nb-locale
Updating nb-locale branch
2025-04-01 21:03:47 +02:00
Sean Morley
04c3402e14 fix: Remove duplicate file extension validation for md and pdf formats 2025-03-23 16:40:55 -04:00
Sean Morley
b4c5e22662 fix: Correct file extension validation for gpx, md, and pdf formats 2025-03-23 16:40:08 -04:00
Sean Morley
7d5750049b Merge branch 'development' of github.com:seanmorley15/AdventureLog into development 2025-03-22 12:25:55 -04:00
Sean Morley
16a7772003 feat: Add additional adventure type and endpoint for sunrise/sunset information 2025-03-22 12:25:53 -04:00
Sean Morley
731b7e9db1
chore(docker): Fix supervisor logging to stdout 2025-03-22 10:21:26 -04:00
ClumsyAdmin
ca4ef79837 fix supervisor logging 2025-03-21 20:51:58 -04:00
Sean Morley
13d3b24ec2 chore: Reduce Gunicorn worker count from 4 to 2 for optimized resource usage 2025-03-21 20:27:46 -04:00
ClumsyAdmin
113d41ca30 Merge branch 'main' of github.com:ClumsyAdmin/AdventureLog 2025-03-21 20:25:40 -04:00
ClumsyAdmin
b71109fd09 potential fix: set Supervisor priorities to ensure Gunicorn starts before nginx to prevent 502 errors 2025-03-21 20:25:25 -04:00
Sean Morley
a3cd940065 feat: Pass collection data to adventure, transportation, lodging, and checklist components 2025-03-21 17:35:58 -04:00
Sean Morley
6eebd5b70a
chore(docker): Refactor service startup to use supervisord and foreground processes 2025-03-21 17:34:23 -04:00
Sean Morley
44ede92b92
Merge branch 'development' into main 2025-03-21 17:34:03 -04:00
Sean Morley
fe25f8e2c8 feat: Add start_date to collection ordering and enhance localization for itinerary features 2025-03-21 17:31:33 -04:00
Sean Morley
794df82ec6 feat: Enhance AdventureModal date handling for all-day events and improve localization in collections page 2025-03-21 16:30:03 -04:00
Sean Morley
db63b6e7d8 feat: Add usage guide for AdventureLog and enhance overview with personal message from the maintainer 2025-03-21 13:35:29 -04:00
ClumsyAdmin
4ccfa6e42c refactor docker startup to use supervisord 2025-03-21 12:02:23 -04:00
Sean Morley
f79b06f6b3 feat: Add troubleshooting guide for unresponsive login and registration, enhance collection modal alerts, and improve localization for itinerary features 2025-03-20 22:28:23 -04:00
Sean Morley
1042a3edcc refactor: Remove debug print statement from NoPasswordAuthBackend authentication method 2025-03-20 22:08:22 -04:00
Sean Morley
771579ef3d feat: Improve adventure date grouping to handle all-day events and enhance date formatting 2025-03-20 10:26:41 -04:00
Sean Morley
dbd417ca87
fix: Pass collection prop to various card components in the collections page 2025-03-19 13:50:32 -04:00
Sean Morley
6e1fbbfc3a feat: Pass collection prop to various card components in the collections page 2025-03-19 13:49:46 -04:00
Sean Morley
76ee4c73e0 feat: Add changelog for v0.9.0 and update configuration to include it in the documentation 2025-03-19 09:58:53 -04:00
Sean Morley
c402dff9a7 chore: Bump app version to v0.9.0 and update changelog link 2025-03-19 09:29:35 -04:00
Sean Morley
f554bb8777 feat: Enhance date handling in AdventureModal and related components for improved localization and all-day event support 2025-03-18 21:07:34 -04:00
Sean Morley
876c5e83b4 feat: Implement chronological itinerary path visualization with GeoJSON for adventures, transportation, and lodging 2025-03-18 18:16:25 -04:00
Sean Morley
1dc8e10758 feat: Add "all day" localization strings for multiple languages and enhance transportation date handling 2025-03-18 17:40:32 -04:00
Sean Morley
9fd2a142cb feat: Update Visit model to use DateTimeField for start and end dates, and enhance AdventureModal with datetime-local inputs 2025-03-18 14:04:31 -04:00
Sean Morley
6eb57d1d6e
Add Lodging to Map, Sanitize MD, Optional Password Disable 2025-03-17 15:20:44 -04:00
Sean Morley
6f720a154f feat: Add password disable functionality and update localization files 2025-03-17 14:40:33 -04:00
Sean Morley
585f050a30 feat: Add disable_password field to CustomUserDetailsSerializer and update PublicUserListView 2025-03-17 14:38:10 -04:00
Sean Morley
3b6d437f29 feat: Add search functionality for regions and cities in World Travel pages 2025-03-17 14:31:22 -04:00
Sean Morley
b82e4b6f0d feat: Add country name to Region serializer and update RegionCard component 2025-03-17 14:23:10 -04:00
Sean Morley
4e543fad55 feat: Enhance City and Lodging components with region and country names, and improve password disable functionality 2025-03-17 10:38:41 -04:00
Sean Morley
eb541225bd Merge branch 'development' of github.com:seanmorley15/AdventureLog into development 2025-03-16 21:49:02 -04:00
Sean Morley
a38828eb45 feat: Implement disable password authentication for users with social accounts 2025-03-16 21:49:00 -04:00
Sean Morley
9adf1d158a
Improved German translation 2025-03-16 13:30:42 -04:00
Marc Schumacher
ea61b5e67a
Update translation to German 2025-03-16 18:17:30 +01:00
Sean Morley
189cd0ee69 feat: Add origin and destination markers with connecting line for transportation routes 2025-03-16 12:35:42 -04:00
Sean Morley
c2fc249c92 feat: Add lodging types icons and update related components 2025-03-15 23:55:53 -04:00
Sean Morley
a640934370 [REQUEST] Add Lodgings to Map #509 2025-03-15 23:44:22 -04:00
Sean Morley
7fbcf170d0 feat: Add file type validation and sanitize markdown input in adventure components 2025-03-15 12:29:12 -04:00
Sean Morley
d26d3a2128
GPX file fixes, improved translations, and fixed itinerary view elements 2025-03-13 17:37:02 -04:00
Sean Morley
50a732b4d7 refactor: Optimize GPX file processing with concurrent fetching and improved error handling 2025-03-13 17:26:42 -04:00
Sean Morley
d9a88b644f
Merge pull request #514 from jyyyeung/fix/zh-translation
Improve Simplified Chinese Translations
2025-03-03 23:43:53 -05:00
Sean Morley
b7d6d6af56
Merge branch 'development' into fix/zh-translation 2025-03-03 23:37:56 -05:00
Sean Morley
4db72d9719 refactor: Remove duplicated notes display from collection page 2025-03-03 08:50:09 -05:00
Sean Morley
eaab1f8a7c refactor: Remove duplicate checklist display in collection page 2025-03-01 23:18:31 -05:00
Sean Morley
ed76c1426e
Open Locations in Maps and new API Routes 2025-02-28 15:50:49 -05:00
Sean Morley
a16df1640d Merge branch 'development' of github.com:seanmorley15/AdventureLog into development 2025-02-28 15:50:26 -05:00
Sean Morley
fee6c66eab feat: Add "Open in Maps" translations for multiple languages 2025-02-28 15:50:25 -05:00
Sean Morley
6d3b4c1e8e
Merge branch 'main' into development 2025-02-28 15:47:56 -05:00
Sean Morley
4759ff71a1 fix: Update URL path for user stats counts and remove email from response 2025-02-28 14:50:32 -05:00
JYYYeung
7a63e1227f fix: fixing Chinese translation with context 2025-02-26 09:28:30 +00:00
JYYYeung
689d2af21c fix: updated zh translations 2025-02-26 08:44:17 +00:00
Sean Morley
3e0639e6f7 fix: Update URL path regex in StatsViewSet for username counts action 2025-02-25 10:55:08 -05:00
Sean Morley
3c9aec4bfb refactor: Simplify location name assignment logic in LocationDropdown component 2025-02-23 17:15:37 -05:00
Sean Morley
b1068d27b0 refactor: Update API endpoint paths from "_allauth" to "auth" for consistency 2025-02-23 17:04:20 -05:00
Sean Morley
d5311bb71e feat: Add "Open in Maps" button for adventures with location coordinates 2025-02-22 20:36:25 -05:00
Sean Morley
00e4ec64ae
Hotel tracking, new profile system, UI improvements and lots of bug fixes 2025-02-22 17:22:31 -05:00
Sean Morley
b61083f7df refactor: Remove initial and key achievement migrations for cleanup 2025-02-22 17:06:40 -05:00
Sean Morley
d80805a181 feat: Add current timezone and airport description fields to localization files 2025-02-22 17:00:40 -05:00
Sean Morley
ea36b104b6 feat: Add Transportation and Lodging models to AdventureViewSet; update Avatar and TransportationModal components for improved user experience 2025-02-22 10:37:22 -05:00
Sean Morley
232e01bf8f fix: Correct button closing tags in Navbar component for proper rendering 2025-02-20 14:53:05 -05:00
Sean Morley
1c15e85986 feat: Enhance session cookie domain handling for IP addresses and single-label hostnames 2025-02-20 10:21:48 -05:00
Sean Morley
7cea432353
Merge pull request #493 from Cathnan/Modified-german-translation
Modified translation to make it more natural und understandable
2025-02-17 10:35:08 -05:00
Sean Morley
a7513d6c06
Merge pull request #495 from Cathnan/main
Modified german translation
2025-02-17 10:34:26 -05:00
Sean Morley
b4496508dd
Korean i18n (#503)
* Update email.md

Removing the single quotes allow SMTP to work -- it did not work otherwise. Also, [Google recommends TLS over SSL](https://support.google.com/a/answer/2520500?sjid=7564827219172741277-NA)

* Update immich_integration.md

Added the /api to the example URL for the Immich server.

* Add Korean language support to Navbar and layout

* chore: Korean translation (#502)

* correct ko translation at Navbar.svelte

* correct ko.json

correct ko.json::adventures

auto commit

auto commit

auto commit

auto commit

auto commit

adventures

collection

dashboard

home

immich

immich

map

navbar

auto commit

notes

profile

recommendations

settings

share

transportations

auto commit

worldtravel

polishing

auto commit

auto commit

auto commit

auto commit

auto commit

auto commit

auto commit

auto commit

auto commit

auto commit

auto commit

auto commit

---------

Co-authored-by: Patrick McGuire <60325264+mcguirepr89@users.noreply.github.com>
Co-authored-by: motox986 <49492476+motox986@users.noreply.github.com>
Co-authored-by: Seongjun Ji <metalg0su@gmail.com>
2025-02-17 10:32:18 -05:00
Sean Morley
2713b3640f feat: Set SESSION_COOKIE_SAMESITE to 'Lax' for improved security 2025-02-16 15:35:10 -05:00
Sean Morley
670e499d8f feat: Localize text in calendar and adventure pages, and update CountryCard component 2025-02-16 13:57:46 -05:00
Sean Morley
16fc9bc70e feat: Fetch categories and check for Immich integration on modal mount 2025-02-16 13:45:08 -05:00
Sean Morley
577eb9cceb feat: Improve is_visited parameter handling in AdventureViewSet 2025-02-16 13:11:35 -05:00
Sean Morley
af33acec66 feat: Add session cookie to API requests in profile page server load 2025-02-16 12:53:58 -05:00
Sean Morley
00f0fc9acf feat: Remove locations API call and implement random background image in stats view 2025-02-16 12:27:49 -05:00
Sean Morley
d31b95289d feat: Add reservation number and price fields to lodging information across multiple languages 2025-02-16 09:35:07 -05:00
Sean Morley
b5d6788c11 feat: Add location_name to ReverseGeocode type and implement location fetching in stats view 2025-02-15 19:44:11 -05:00
Cathnan
9e5e2456fa
Modified german translation 2025-02-10 13:31:54 +01:00
Sean Morley
60b5bbb3c8 feat: Enhance Navbar with new icons and improved button layout 2025-02-09 15:42:46 -05:00
Cathnan
299b190f69
Modified translation to make it more natural und understandable 2025-02-09 18:47:16 +01:00
Sean Morley
cf4691beaf Merge branch 'development' of github.com:seanmorley15/AdventureLog into development 2025-02-08 16:10:03 -05:00
Sean Morley
68924d7ecc feat: Refactor hotel terminology to lodging and update related components 2025-02-08 16:10:01 -05:00
Sean Morley
1351f26ba0
Merge pull request #489 from ThomasDetemmerman/main
Improved translation for Dutch
2025-02-08 10:15:24 -05:00
Sean Morley
57db1e088f
Merge branch 'development' into main 2025-02-08 10:14:11 -05:00
Thomas
cbcf2a70d7
improved locals for dutch 2025-02-08 08:04:01 +01:00
Thomas
d4f9abd158
Improved dutch language 2025-02-08 07:58:25 +01:00
Nikolai Eidsheim
a899579a02 Started work on norwegian translations 2025-02-06 21:33:17 +00:00
Sean Morley
d2cb862103 feat: Add favicon link to CDN index.html 2025-02-06 10:49:58 -05:00
Sean Morley
d1f50dfa17 feat: Add hotel management functionality with serializer and UI integration 2025-02-05 19:38:04 -05:00
Sean Morley
271cba9abc feat: Add GitHub Actions workflows for uploading CDN images to GHCR and Docker Hub 2025-02-05 16:55:07 -05:00
Sean Morley
921e756aef feat: Enhance CDN management with entrypoint script and update country data handling 2025-02-05 16:50:05 -05:00
Sean Morley
f7ff8f30b0 feat: Add CODEOWNERS file to define repository ownership 2025-02-04 18:06:03 -05:00
Sean Morley
9b54af8d40 feat: Update country data management to use AdventureLog CDN for fetching flags and JSON files 2025-02-04 17:43:41 -05:00
Sean Morley
5f344cad83 feat: Implement CDN update process with country data download and flag management 2025-02-04 17:19:58 -05:00
Sean Morley
a00d2abe0d feat: Add achievements app with models, admin, and management command for seeding data 2025-02-04 10:37:15 -05:00
Sean Morley
e93909e7ea
Merge pull request #487 from seanmorley15/cdn
feat: Add CDN generation scripts and Docker setup; include Nginx conf…
2025-02-04 10:36:59 -05:00
Sean Morley
8ea8043beb feat: Update stats API endpoint to include username for personalized user statistics 2025-02-03 19:57:22 -05:00
Sean Morley
9c3a52ae85 feat: Refactor user detail view and enhance localization strings for multiple languages 2025-02-03 19:56:25 -05:00
Sean Morley
ad5fb02ebb feat: Enhance AdventureViewSet to filter adventures based on visit status with improved boolean handling 2025-02-03 19:38:24 -05:00
Sean Morley
ed1e24252c feat: Enhance HotelModal with geocoding, custom location handling, and improved hotel initialization 2025-02-03 19:18:46 -05:00
Sean Morley
df60184f23 feat: Implement Hotel model with CRUD operations and integrate into views and serializers 2025-02-03 12:28:42 -05:00
Sean Morley
da9c2ba80a feat: Add linking instructions for existing accounts in Authentik and GitHub documentation 2025-02-03 11:10:14 -05:00
Sean Morley
5b42e8b372
Merge pull request #469 from mcguirepr89/patch-1
Update email.md
2025-02-03 09:23:40 -05:00
Sean Morley
28b2a918e8
Merge pull request #486 from motox986/patch-1
Update immich_integration.md
2025-02-03 09:05:25 -05:00
motox986
4da34032e9
Update immich_integration.md
Added the /api to the example URL for the Immich server.
2025-02-02 21:42:23 -08:00
Sean Morley
dc169d1046 feat: Add CDN generation scripts and Docker setup; include Nginx configuration 2025-02-02 20:31:28 -05:00
Sean Morley
659c56f02d feat: Add Hotel model and integrate into admin panel; update related components 2025-02-02 10:36:47 -05:00
Sean Morley
bdb17a3177
Merge pull request #478 from Thiesjoo/immich-improvements
Immich image selection improvements
2025-02-01 15:28:15 -05:00
Sean Morley
7d71c84fd2 feat: Remove email field from user details response and enhance frontend user display 2025-02-01 15:10:25 -05:00
Sean Morley
c1807826d0 feat: Add server-side redirection to admin page based on public URL fetch 2025-01-31 16:43:09 -05:00
Sean Morley
341de6daea
Merge pull request #480 from evertyang/patch-1
Update unraid.md
2025-01-31 07:25:51 -05:00
evertyang
9cdd502264
Update unraid.md
Variable appears to be in bytes not kilobytes. I got the following error assuming kilobytes:

SvelteKitError: Content-length of 4870507 exceeds limit of 30000 bytes.
    at Object.start (file:///app/build/handler.js:984:19)
    at setupReadableStreamDefaultController (node:internal/webstreams/readablestream:2333:23)
    at setupReadableStreamDefaultControllerFromSource (node:internal/webstreams/readablestream:2366:3)
    at new ReadableStream (node:internal/webstreams/readablestream:289:7)
    at get_raw_body (file:///app/build/handler.js:973:9)
    at getRequest (file:///app/build/handler.js:1054:7)
    at Array.ssr (file:///app/build/handler.js:1248:19)
    at handle (file:///app/build/handler.js:1318:23)
    at file:///app/build/handler.js:1318:40
    at Array.<anonymous> (file:///app/build/handler.js:1237:4) {
  status: 413,
  text: 'Payload Too Large'
}
2025-01-31 05:02:00 -06:00
Thies
cc6a98d23b
Convert indentation to tabs, as my vscode did not want to cooperate 2025-01-30 13:07:08 +01:00
Thies
94fca45af0
immich: Show dates of images next to the results 2025-01-30 13:06:17 +01:00
Thies
c7d34f6c48
immich: Add a loading indicator 2025-01-30 13:06:17 +01:00
Thies
08bfeac837
immich: Automatically select the date of the last visit for the photos 2025-01-30 13:06:10 +01:00
Thies
aaacacbd60
immich: Now able to show images by date! 2025-01-30 12:57:38 +01:00
Thies
bc08362a4c
navbar: Allow the typing of slash in input/textarea fields 2025-01-30 12:16:19 +01:00
Sean Morley
85b55660f9 feat: Update user profile handling and enhance public user details response 2025-01-29 22:50:53 -05:00
Sean Morley
6d80969fdc
Merge pull request #476 from ThunderLord956/main
Documentation Update/Spell-Checks
2025-01-29 08:04:41 -05:00
Thunder
defd97fc02 Mass documentation spelling check, as well as improving the unraid installation guide, and some small changes to the docker installation guide. 2025-01-28 23:23:47 -06:00
Sean Morley
afdc894f23
Merge pull request #472 from ThunderLord956/patch-1
Update unraid.md
2025-01-28 17:20:38 -05:00
ThunderLord956
41cc47d631
Update unraid.md
Separate 2 lines in Installation Configuration
2025-01-28 15:13:10 -06:00
ThunderLord956
145627b1eb
Update unraid.md
Try to fix tables
2025-01-28 15:11:33 -06:00
ThunderLord956
896c537791
Update unraid.md
Update the unraid wiki page to be more precise and easier to understand
2025-01-28 14:04:41 -06:00
Sean Morley
b68e2dedaa feat: Add new background image entry for adventurelog showcase 2025-01-27 20:19:33 -05:00
Sean Morley
db077b5fd7
Merge pull request #460 from seanmorley15/development
Attachments, GPX Maps, Global Search, Security
2025-01-27 09:50:00 -05:00
Patrick McGuire
697851e210
Update email.md
Removing the single quotes allow SMTP to work -- it did not work otherwise. Also, [Google recommends TLS over SSL](https://support.google.com/a/answer/2520500?sjid=7564827219172741277-NA)
2025-01-27 09:38:59 -05:00
Sean Morley
3468e82b04 feat: Sanitize FRONTEND_URL by removing quotes for improved URL parsing 2025-01-27 09:23:48 -05:00
Sean Morley
680a2378d9
Merge pull request #458 from larsl-net/basic-pwa
Basic PWA support
2025-01-26 20:20:47 -05:00
Sean Morley
f5dc0ceb0a feat: Refactor session cookie domain handling to use psl for improved domain parsing 2025-01-26 20:18:50 -05:00
Sean Morley
d326d38329 feat: Update session cookie domain handling using publicsuffix2 and psl libraries 2025-01-26 20:06:47 -05:00
Sean Morley
6a5bfbda2d feat: Enhance adventure marker popup with image carousel and visit details 2025-01-23 17:51:56 -05:00
Sean Morley
37fca9ba1d Merge branch 'development' of github.com:seanmorley15/AdventureLog into development 2025-01-23 17:49:03 -05:00
Sean Morley
abaee8c9c4 feat: Add attachments array to recommendation object and update options with collection start date 2025-01-23 17:48:55 -05:00
Sean Morley
6b090096d6
Merge pull request #465 from larsl-net/collection-map-icons
Display adventure category icon also on collection maps
2025-01-23 17:46:05 -05:00
Sean Morley
8fef53fd24
Merge pull request #466 from larsl-net/calendar-collection-range
Calendar collection range
2025-01-23 17:44:00 -05:00
Lars Lehmann
8fee537d8b
feat: Open collection calendar on start date 2025-01-23 21:56:19 +01:00
Lars Lehmann
69967b759f
fix: Error loading calender when transport has no date 2025-01-23 21:29:49 +01:00
Lars Lehmann
f04a6e30a7
Remove package-lock.json 2025-01-23 20:14:10 +01:00
Lars Lehmann
9e66c67c62
fix: Display adventure category icon also on collection maps 2025-01-23 20:07:16 +01:00
Sean Morley
12a6429812 Merge branch 'development' of github.com:seanmorley15/AdventureLog into development 2025-01-22 08:36:03 -05:00
Sean Morley
0eb4bc706a feat: enhance adventure handling with user ID support in serializers and attachment view; refactor saveEdit function and clean up Avatar component 2025-01-22 08:36:02 -05:00
Sean Morley
6ea0e07775
Merge pull request #462 from seanmorley15/dependabot/npm_and_yarn/documentation/npm_and_yarn-1d5806dca3
build(deps): bump the npm_and_yarn group across 2 directories with 1 update
2025-01-21 23:53:13 -05:00
dependabot[bot]
d5fe7eeff8
build(deps): bump the npm_and_yarn group across 2 directories with 1 update
Bumps the npm_and_yarn group with 1 update in the /documentation directory: [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite).
Bumps the npm_and_yarn group with 1 update in the /frontend directory: [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite).


Updates `vite` from 5.4.11 to 5.4.14
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/v5.4.14/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v5.4.14/packages/vite)

Updates `vite` from 5.3.6 to 5.4.12
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/v5.4.14/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v5.4.14/packages/vite)

---
updated-dependencies:
- dependency-name: vite
  dependency-type: indirect
  dependency-group: npm_and_yarn
- dependency-name: vite
  dependency-type: direct:development
  dependency-group: npm_and_yarn
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-01-22 04:51:56 +00:00
Sean Morley
1447a948c2
Merge pull request #461 from seanmorley15/dependabot/npm_and_yarn/frontend/npm_and_yarn-f25c717a0f
build(deps-dev): bump vite from 5.3.6 to 5.4.12 in /frontend in the npm_and_yarn group across 1 directory
2025-01-21 22:51:01 -05:00
dependabot[bot]
10230e926c
build(deps-dev): bump vite
Bumps the npm_and_yarn group with 1 update in the /frontend directory: [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite).


Updates `vite` from 5.3.6 to 5.4.12
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/v5.4.12/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v5.4.12/packages/vite)

---
updated-dependencies:
- dependency-name: vite
  dependency-type: direct:development
  dependency-group: npm_and_yarn
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-01-22 03:28:49 +00:00
Sean Morley
3f30819d25 feat: add GPX file support in AdventureModal and improve map marker handling 2025-01-21 19:40:56 -05:00
Sean Morley
6e28e5234e feat: enhance attachment handling with new localization strings and GPX upload tips 2025-01-21 19:33:48 -05:00
Sean Morley
1b3cf6ab39 feat: add keyboard shortcut to focus search input in Navbar and clean up dashboard animations 2025-01-21 19:17:51 -05:00
Sean Morley
f9cf92041d feat: enhance CategoryModal with loading state and remove unused activities route 2025-01-21 19:01:45 -05:00
Sean Morley
64d2bdebce feat: add GPX file handling and GeoJSON integration in adventure page; update dependencies and AttachmentCard component 2025-01-20 20:03:00 -05:00
Sean Morley
30c58ca118 feat: refactor AttachmentCard component to handle delete action locally and simplify adventure page logic 2025-01-20 09:01:11 -05:00
Sean Morley
25edec460b feat: enhance search page with reactive data updates and simplify component usage 2025-01-19 23:09:28 -05:00
Sean Morley
1f3abf7f32 feat: replace placeholder image with gradient background and text for no image available state in CardCarousel component 2025-01-19 22:33:35 -05:00
Sean Morley
94c3e3d363 feat: implement attachment management with upload, delete, and permission checks; update serializers and models 2025-01-19 22:22:03 -05:00
Lars Lehmann
a88e59869e
Fix service worker 2025-01-19 22:43:31 +01:00
Lars Lehmann
3ccd078508
Add Service Worker 2025-01-19 11:51:04 +01:00
Lars Lehmann
e9538b707f
Add basic PWA 2025-01-19 11:36:28 +01:00
Sean Morley
e0fa62c1ea feat: add GSAP animations to signup, login, and dashboard pages; include Attachment serializer in backend 2025-01-19 00:05:08 -05:00
Sean Morley
aa216f5688 feat: add Attachment model and implement file permission checks for media access 2025-01-18 20:06:12 -05:00
Sean Morley
433599dc20 feat: implement protected media serving and permission checks for adventure images 2025-01-18 17:03:03 -05:00
Sean Morley
f7e183f9a3
Update README.md 2025-01-18 14:30:05 -05:00
Sean Morley
f10e171a8e fix: update RegionCard component to handle undefined visited state and refactor global search API to return structured results 2025-01-18 12:57:56 -05:00
Sean Morley
d60945d5b7 feat: implement global search functionality for adventures, collections, users, and locations 2025-01-18 12:28:14 -05:00
Sean Morley
9132ef39ec fix: add 'finding_recommendations' key and update 'no_adventures_to_recommendations' in multiple locale files 2025-01-18 09:19:21 -05:00
Sean Morley
8f6e655378
AdventureLog Smart Recommendations 2025-01-17 21:09:04 -05:00
Sean Morley
1a7643b8a7 fix: include Referer header in user-related API requests 2025-01-17 20:20:56 -05:00
Sean Morley
fcec4a420c
Update README.md 2025-01-17 19:38:18 -05:00
Sean Morley
75162bbf7b fix: improve error handling for Overpass API connection failures 2025-01-17 18:22:03 -05:00
Sean Morley
ae8617a9fb fix: update formatting in Authentik documentation for clarity 2025-01-17 18:15:26 -05:00
Sean Morley
8af53f8f01
Merge pull request #455 from UndyingSoul/main
Fixes gap in docker-compose example/docs with working oidc implementation
2025-01-17 18:13:53 -05:00
Corbin Whitton
a508dd8d96 update documentation for authentik 2025-01-17 15:55:31 -07:00
Corbin Whitton
8f1f2e139a updated traefik config to work with oidc 2025-01-17 15:47:48 -07:00
Sean Morley
e9084db832 fix: remove default adventure type and streamline image upload form 2025-01-17 17:33:16 -05:00
Sean Morley
6289c7e305
Merge pull request #454 from seanmorley15/csrf_error
Csrf error
2025-01-17 17:15:42 -05:00
Sean Morley
0cee4c386d fix: update deleteAdventure function to use DELETE method for API call 2025-01-17 17:15:18 -05:00
Sean Morley
f4450b6a38 fix: include Referer header in API requests 2025-01-17 16:58:08 -05:00
Sean Morley
5b4092ba6c feat: implement pagination, add activity types and stats views; update category management and localization 2025-01-17 16:50:01 -05:00
Sean Morley
2b78021155 feat: update localization files and add adventure creation messages; refine adventure filtering logic 2025-01-16 21:15:22 -05:00
Sean Morley
9ceee13edc
Merge pull request #453 from bucherfa/main
fix: container relations
2025-01-16 19:38:51 -05:00
Fabian Bucher
f56abd2312
fix: container relations 2025-01-16 22:24:31 +01:00
Sean Morley
62efa2478e feat: add OverpassViewSet and implement osmTagToEmoji function; update requirements and aria-labels 2025-01-15 15:39:21 -05:00
Sean Morley
0588555707 feat: update toast messages and add city updates; enhance geocoding checks and localizations 2025-01-15 11:53:04 -05:00
Sean Morley
bcbe7657ad
Merge pull request #450 from larsl-net/city-stats-api
fix: add cities to /stats/countes
2025-01-15 11:34:43 -05:00
Lars Lehmann
5f1a611671
fix: add cities to /stats/countes 2025-01-15 14:46:12 +01:00
Sean Morley
21345e0971 build(deps): upgrade Django from 5.0.10 to 5.0.11; remove debug print statements in user tests 2025-01-14 22:05:43 -05:00
Sean Morley
b4c9cd1f27
Merge pull request #449 from seanmorley15/dependabot/pip/backend/server/pip-607b783c7d
build(deps): bump django from 5.0.8 to 5.0.11 in /backend/server in the pip group across 1 directory
2025-01-14 22:02:38 -05:00
Sean Morley
92a52d65f2
Merge branch 'development' into dependabot/pip/backend/server/pip-607b783c7d 2025-01-14 22:02:30 -05:00
Sean Morley
2c1b540c20 refactor: change visit ordering to use latest visit date; remove unused signup form 2025-01-14 20:46:33 -05:00
dependabot[bot]
743774dbca
build(deps): bump django
Bumps the pip group with 1 update in the /backend/server directory: [django](https://github.com/django/django).


Updates `django` from 5.0.8 to 5.0.11
- [Commits](https://github.com/django/django/compare/5.0.8...5.0.11)

---
updated-dependencies:
- dependency-name: django
  dependency-type: direct:production
  dependency-group: pip
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-01-14 22:37:24 +00:00
Sean Morley
5cce76274a
Merge pull request #448 from larsl-net/visited-cities
fix: mark visited cities based on locations
2025-01-14 16:54:49 -05:00
Sean Morley
16cdda2b82
Merge branch 'development' into visited-cities 2025-01-14 16:54:42 -05:00
Sean Morley
611509a289
Merge pull request #447 from larsl-net/development
fix small python errors
2025-01-14 16:53:50 -05:00
Lars Lehmann
af4026300b
fix: mark visited cities based on locations 2025-01-14 21:44:10 +01:00
Lars Lehmann
ab2ad829f2
fix: visited_city not assigned 2025-01-14 20:58:25 +01:00
Lars Lehmann
ce87afeeb9
fix: key error 2025-01-14 20:33:25 +01:00
Sean Morley
5965b82780
Merge pull request #444 from seanmorley15/dependabot/pip/backend/server/pip-59524fe9f2
build(deps): bump django from 5.0.8 to 5.0.10 in /backend/server in the pip group across 1 directory
2025-01-14 13:12:40 -05:00
Sean Morley
4a1e51e12a fix: update TOTP input type and attributes for better user experience 2025-01-14 13:10:14 -05:00
Sean Morley
7be21fcace fix: update image paths in Unraid installation documentation 2025-01-14 12:23:36 -05:00
Sean Morley
c084a40cab
Dual stack Backend 2025-01-14 12:19:03 -05:00
Sean Morley
b16b1a1e44
Merge pull request #445 from larsl-net/development
fix: make backend dual-stack ready
2025-01-14 11:52:36 -05:00
Lars Lehmann
69673fb5ef
fix: make backend dual stack ready 2025-01-14 17:38:31 +01:00
dependabot[bot]
b023078e04
build(deps): bump django
Bumps the pip group with 1 update in the /backend/server directory: [django](https://github.com/django/django).


Updates `django` from 5.0.8 to 5.0.10
- [Commits](https://github.com/django/django/compare/5.0.8...5.0.10)

---
updated-dependencies:
- dependency-name: django
  dependency-type: direct:production
  dependency-group: pip
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-01-14 16:36:26 +00:00
Sean Morley
f6605bc1bf
fix: update session cookie domain handling for IP addresses 2025-01-14 09:49:24 -05:00
Sean Morley
e8f2c7ea81 fix: update session cookie domain handling for IP addresses and improve frontend URL configuration 2025-01-14 09:38:38 -05:00
Sean Morley
187f4c0a4f
Merge pull request #442 from seanmorley15/development
Development
2025-01-13 19:55:15 -05:00
Sean Morley
ef44836328 fix: remove unused console log import from page server file 2025-01-13 19:55:00 -05:00
Sean Morley
96ff727b57 fix: include Referer header and ensure CSRF token is set in request headers 2025-01-13 19:47:19 -05:00
Sean Morley
a8e84be28e docs: update known issues for Redirect URI and authorization callback URL in Authentik and GitHub configurations
fix: enhance session cookie deletion logic with dynamic domain handling
2025-01-13 19:34:19 -05:00
Sean Morley
4c84ac0979 fix: enhance middleware to set HTTP_X_FORWARDED_PROTO and secure proxy SSL header 2025-01-13 19:21:35 -05:00
Sean Morley
62d2fd7c6a docs: add warnings for known issues with Redirect URI and authorization callback URL in Authentik and GitHub configurations 2025-01-13 18:50:54 -05:00
Sean Morley
609f68b10d
Merge pull request #441 from seanmorley15/development
fix: dynamically set session cookie domain based on request hostname
2025-01-13 18:15:56 -05:00
Sean Morley
4a36fbb4c1 fix: dynamically set session cookie domain based on request hostname 2025-01-13 18:06:16 -05:00
Sean Morley
145a3f00c5
Merge pull request #440 from seanmorley15/development
fix: configure secure session cookies and dynamic domain for frontend…
2025-01-13 17:53:07 -05:00
Sean Morley
062111d7fe fix: configure secure session cookies and dynamic domain for frontend URL 2025-01-13 17:52:25 -05:00
Sean Morley
ec3ada986d
OIDC Auth and City Visits Data 2025-01-13 17:21:32 -05:00
Sean Morley
a010afcc43 fix: replace psutil with tqdm for progress tracking in country download command 2025-01-13 17:07:52 -05:00
Sean Morley
563373dd54 fix: implement memory limit and adjust batch size for country downloads 2025-01-13 14:42:48 -05:00
Sean Morley
a766a07ea1 fix: add warning for interrupted download-countries command due to memory issues 2025-01-13 14:12:05 -05:00
Sean Morley
f27453824a fix: add psutil dependency for system resource management 2025-01-13 13:03:19 -05:00
Sean Morley
ac37bc98c4 fix: add insert_id field to City, Country, and Region models 2025-01-13 13:01:36 -05:00
Sean Morley
53d500b7d5 fix: add ijson dependency for improved data processing 2025-01-13 11:34:56 -05:00
Sean Morley
9a7667fd62 fix: increase batch size for country downloads from 10 to 250 2025-01-13 11:24:25 -05:00
Sean Morley
7f2c3c33a5 fix: switch from json to ijson for efficient country data processing 2025-01-13 11:23:57 -05:00
Sean Morley
6252f3cf14 fix: reduce batch size for country downloads from 100 to 10 2025-01-13 11:19:45 -05:00
Sean Morley
6413b9a985 fix: reduce batch size for country downloads from 250 to 100 2025-01-13 11:07:59 -05:00
Sean Morley
3b5b5d83b9 docs: update download-countries command in documentation to include --force option 2025-01-13 10:54:46 -05:00
Sean Morley
0f828dd0bf fix: update conditionals in AdventureModal and CategoryDropdown for improved logic 2025-01-13 10:51:33 -05:00
Sean Morley
32125efed4 feat: adjust batch size for country updates and include longitude/latitude in bulk update 2025-01-12 22:09:55 -05:00
Sean Morley
1f7d75acfc feat: implement batch processing for country, region, and city creation and updates in download command 2025-01-12 21:53:16 -05:00
Sean Morley
30f1eaef1c feat: enhance download command with success and warning messages; update Authentik documentation for clarity 2025-01-12 20:28:27 -05:00
Sean Morley
af1d43ddf3
Update docker.md 2025-01-12 09:32:08 -05:00
Sean Morley
b04a8b8a9e feat: implement multiple image upload functionality in AdventureModal 2025-01-11 21:25:29 -05:00
Sean Morley
fa60db1d93
Update unraid.md 2025-01-11 16:11:37 -05:00
Sean Morley
e8f3674101
Update unraid.md 2025-01-11 15:49:25 -05:00
Sean Morley
cd06f838b0
Update unraid.md 2025-01-11 15:37:38 -05:00
Sean Morley
377420226e
Update unraid.md 2025-01-11 15:36:39 -05:00
Sean Morley
5cccadad15 fix: correct typo in Unraid installation documentation 2025-01-11 10:53:01 -05:00
Sean Morley
3bde752234 fix: update documentation link in README for accuracy 2025-01-11 10:28:01 -05:00
Sean Morley
2cd60adc8c docs: update Discord link in README for improved accessibility 2025-01-11 10:27:27 -05:00
Sean Morley
2221b1dad9 docs: new README add ARM compatibility note for PostGIS image in Docker installation guide 2025-01-11 10:26:22 -05:00
Sean Morley
88d62eb869 feat: add GitHub and OIDC social authentication documentation, update Authentik references for clarity 2025-01-11 09:51:31 -05:00
Sean Morley
76ee4a7290
feat: add Unraid installation documentation and update links 2025-01-10 20:17:50 -05:00
Sean Morley
a50f051079 feat: add Unraid installation documentation and update links 2025-01-10 20:16:09 -05:00
Sean Morley
ef996cd302 Merge branch 'main' of github.com:seanmorley15/AdventureLog 2025-01-10 19:41:06 -05:00
Sean Morley
ae3c43f7c8 Update NGINX configuration and docker-compose for improved service references 2025-01-10 19:41:03 -05:00
Sean Morley
b1a3379604 fix: update NGINX configuration and docker-compose for improved service referencing and clarity 2025-01-10 19:40:06 -05:00
Sean Morley
1e48152e1a fix: update NGINX configuration for improved backend service referencing and enhance docker-compose environment variable clarity 2025-01-10 19:36:38 -05:00
Sean Morley
de8764499b feat: enhance city and region visit tracking, update AdventureModal and serializers for improved data handling 2025-01-09 19:40:23 -05:00
Sean Morley
013a2cc751 feat: add password validation and error messages, enhance CityCard styling, and update localization for email and password prompts 2025-01-09 18:25:51 -05:00
Sean Morley
22790ae7c0 feat: add num_cities field to RegionSerializer, update RegionCard to display city count, and enhance CSRF token handling 2025-01-09 14:58:45 -05:00
Sean Morley
abe870506f feat: enhance region visit tracking with improved toast messages, update localization, and modify page titles 2025-01-09 13:53:16 -05:00
Sean Morley
80cec30fda feat: add VisitedCity model and serializer, update admin interface, and enhance city visit tracking functionality 2025-01-09 12:38:29 -05:00
Sean Morley
44810e6343 feat: add City model and serializer, update RegionCard and create CityCard component, enhance admin interface for City management 2025-01-09 11:11:02 -05:00
Sean Morley
a883d4104d feat: enhance adventure sorting by adding date and rating filters, update admin settings localization for OIDC 2025-01-08 17:08:53 -05:00
Sean Morley
f670fbc93a feat: enhance superuser creation with email verification and update settings for two-factor authentication 2025-01-07 10:27:11 -05:00
Sean Morley
548702890d feat: update NGINX configuration for improved proxy handling and enable social account login on GET requests 2025-01-07 09:58:39 -05:00
Sean Morley
a5aa09ed7b feat: add OverrideHostMiddleware to set HTTP_HOST from PUBLIC_URL environment variable and update nginx configuration 2025-01-06 20:44:37 -05:00
Sean Morley
e19781d7ac feat: add public URL endpoint and update user type to include password status 2025-01-06 18:53:08 -05:00
Sean Morley
59b41c01df feat: enhance CSRF token handling and add format=json to API requests 2025-01-06 14:49:23 -05:00
Sean Morley
128c33d9a1 feat: add social authentication support with enabled providers endpoint and UI integration 2025-01-06 14:25:57 -05:00
Sean Morley
a9c2af9649
Immich Integration 2025-01-05 19:08:37 -05:00
Sean Morley
4fdc16da58 feat: update locale info for immich integration text 2025-01-03 19:28:18 -05:00
Sean Morley
604cfa05b3 feat: adds banner image to brand folder 2025-01-03 19:24:10 -05:00
Sean Morley
3d22621a26 fix: update screenshot paths and descriptions in README.md 2025-01-03 19:04:17 -05:00
Sean Morley
9e4846a66a feat: enhance Immich integration documentation and add warnings for localhost usage 2025-01-03 18:46:45 -05:00
Sean Morley
a4df852744 feat: update .env.example for demo database setup and add image search functionality in AdventureModal 2025-01-03 16:42:27 -05:00
Sean Morley
56244329f5 feat: configure REST framework renderers based on DEBUG setting 2025-01-03 16:29:39 -05:00
Sean Morley
230a786d6e docs: add instructions for customizing email subject in admin site 2025-01-03 15:58:52 -05:00
Sean Morley
259f2e75c2 feat: version bump for release v0.8.0 2025-01-03 12:24:17 -05:00
Sean Morley
82a1134019 fix: prevent marking adventure as visited if the place is already visited 2025-01-03 12:15:39 -05:00
Sean Morley
50e0d4a34e feat: add localization for adventure visit confirmation message in multiple languages 2025-01-03 12:12:09 -05:00
Sean Morley
3a024e1e18 feat: implement logic to determine if an adventure will be marked as visited based on visit dates 2025-01-03 12:05:02 -05:00
Sean Morley
57e367d112 refactor: update AdventureSerializer to handle visits data more gracefully and remove visits from request body in AdventureCard 2025-01-03 09:53:23 -05:00
Sean Morley
6651557738 feat: include adventure visits in collection update requests 2025-01-03 09:47:05 -05:00
Sean Morley
c6fa603a93 feat: add primary image functionality to AdventureImage model and update related components 2025-01-02 23:25:58 -05:00
Sean Morley
991efa8d08 docs: add Immich integration documentation and update configuration menu 2025-01-02 19:00:11 -05:00
Sean Morley
73036dcef8 fix: put languages in locale selection dropdown into native language 2025-01-02 18:38:29 -05:00
Sean Morley
eea87e59a5 feat: update Immich integration migrations and enhance localization strings for user feedback 2025-01-02 18:34:13 -05:00
Sean Morley
386014db92 feat: add Immich album retrieval functionality and implement album selection component 2025-01-02 17:56:47 -05:00
Sean Morley
81b60d6021 feat: enhance settings page with text-neutral styling for labels and messages 2025-01-02 13:40:02 -05:00
Sean Morley
cee9f16cf5 feat: implement Immich integration with CRUD API, add serializer, and enhance frontend components 2025-01-02 13:34:51 -05:00
Sean Morley
5d12d103fc feat: enhance AdventureImage model with custom upload path and add latitude/longitude fields to Country model 2025-01-01 19:27:33 -05:00
Sean Morley
67f6af8ca3 feat: add Immich integration view and API documentation, enhance error handling, and include SVG asset 2025-01-01 16:24:44 -05:00
Sean Morley
15fd15ba40 feat: update Immich integration to use OneToOneField for user and enhance image retrieval functionality 2025-01-01 11:00:11 -05:00
Sean Morley
dc89743569 feat: add Immich integration module with API endpoints and admin interface 2024-12-31 10:38:15 -05:00
Sean Morley
66ce80226e
Merge pull request #422 from seanmorley15/development
Fix 'secure' cookie on http
2024-12-29 20:47:50 -05:00
Sean Morley
79db20a903
Merge pull request #418 from nordtechtiger/development
Improve swedish locale
2024-12-29 20:46:55 -05:00
RedTechTiger
d5ff2fc6b7 fix: slightly improve swedish locale 2024-12-29 15:50:21 -05:00
Sean Morley
fd7f285c57 Update session cookie deletion to conditionally use secure flag based on HTTPS protocol 2024-12-29 12:55:45 -05:00
Sean Morley
b5ac66a1cc Update secure cookie setting to conditionally use HTTPS protocol in authentication flows 2024-12-29 12:38:54 -05:00
Sean Morley
bc6cf42b8e
Markdown, New Transportation Modals/Card and Collection Improvements 2024-12-28 15:10:50 -05:00
Sean Morley
8716efb613 Increase Gunicorn timeout and worker count in entrypoint script for improved performance 2024-12-28 15:06:29 -05:00
Sean Morley
7cf634def8 Fix date handling in CollectionModal to set null values for missing start and end dates; update localization files to add new confirmation messages and labels. 2024-12-28 14:48:30 -05:00
Sean Morley
697c40fca0 Enhance TransportationCard unlinked state logic and improve date handling; update TransportationModal for conditional rendering and add new background image in JSON. 2024-12-28 10:56:25 -05:00
Sean Morley
5d3ec181a0 Fix date validation logic in CollectionModal to ensure start date is before end date and handle missing start date 2024-12-27 22:27:17 -05:00
Sean Morley
46e3e91679 Enhance unlinked state logic in TransportationCard to account for missing dates 2024-12-26 22:10:03 -05:00
Sean Morley
8f7551f4be Enhance unlinked state logic for checklists and notes; update button layout in modals 2024-12-26 22:09:17 -05:00
Sean Morley
df2ce01910 Update note and checklist modals as well as add an unlinked state in the collection page for better organization 2024-12-26 21:56:14 -05:00
Sean Morley
f7c998ab58 UI changes and updates, collection page refresh 2024-12-26 11:07:59 -05:00
Sean Morley
c3782cc9d7
Merge pull request #413 from PascalBru/feature_traefik
fix Django Admin with traefik
2024-12-23 20:16:42 -05:00
Pascal Bruckert
c11395cbd6
fix Django Admin with traefik 2024-12-23 22:06:35 +01:00
Sean Morley
c9dd5fe33d Add region map to worldtravel region page 2024-12-20 15:55:30 -05:00
Sean Morley
d6eb4edddd Refactor map component styles and update transportation location formatting 2024-12-19 21:44:31 -05:00
Sean Morley
c3fddb1889 Add delete confirmation modals for notes, checklists, and transportation 2024-12-19 19:07:23 -05:00
Sean Morley
7c68dc839a Add geographic coordinates to Transportation model and update related components 2024-12-19 18:46:52 -05:00
Sean Morley
57f2bdb8ba
Merge pull request #407 from seanmorley15/dependabot/npm_and_yarn/documentation/npm_and_yarn-36c5dcd58e
Bump the npm_and_yarn group across 2 directories with 2 updates
2024-12-17 19:03:51 -05:00
Sean Morley
dd08a6fe24 Add Markdown editor component and integrate it into AdventureModal 2024-12-17 18:58:38 -05:00
Sean Morley
4de6fa675f
Add check for missing start dates in calendar event loading 2024-12-15 13:29:08 -05:00
Sean Morley
7d609d01ea Add check for missing start dates in calendar event loading 2024-12-15 13:28:33 -05:00
Sean Morley
e0296543b6
Improve ICS calendar generation by handling missing and invalid dates 2024-12-15 13:05:40 -05:00
Sean Morley
edc5fdf1cc Improve ICS calendar generation by handling missing and invalid start dates 2024-12-15 13:04:52 -05:00
Sean Morley
f3c3e19d51
Enhance styling for no recent adventures message in dashboard 2024-12-15 12:34:58 -05:00
Sean Morley
54c859b2a8 Enhance styling for no recent adventures message in dashboard 2024-12-15 12:34:35 -05:00
Sean Morley
6cf17ce56e
Replace SVG icons with corresponding icon components in dashboard stats 2024-12-15 12:32:35 -05:00
Sean Morley
c77b3573d4 Replace SVG icons with corresponding icon components in dashboard stats 2024-12-15 12:31:55 -05:00
dependabot[bot]
febbdfa252
Bump the npm_and_yarn group across 2 directories with 2 updates
Bumps the npm_and_yarn group with 1 update in the /documentation directory: [nanoid](https://github.com/ai/nanoid).
Bumps the npm_and_yarn group with 2 updates in the /frontend directory: [nanoid](https://github.com/ai/nanoid) and [cross-spawn](https://github.com/moxystudio/node-cross-spawn).


Updates `nanoid` from 3.3.7 to 3.3.8
- [Release notes](https://github.com/ai/nanoid/releases)
- [Changelog](https://github.com/ai/nanoid/blob/main/CHANGELOG.md)
- [Commits](https://github.com/ai/nanoid/compare/3.3.7...3.3.8)

Updates `nanoid` from 3.3.7 to 3.3.8
- [Release notes](https://github.com/ai/nanoid/releases)
- [Changelog](https://github.com/ai/nanoid/blob/main/CHANGELOG.md)
- [Commits](https://github.com/ai/nanoid/compare/3.3.7...3.3.8)

Updates `cross-spawn` from 7.0.3 to 7.0.6
- [Changelog](https://github.com/moxystudio/node-cross-spawn/blob/master/CHANGELOG.md)
- [Commits](https://github.com/moxystudio/node-cross-spawn/compare/v7.0.3...v7.0.6)

---
updated-dependencies:
- dependency-name: nanoid
  dependency-type: indirect
  dependency-group: npm_and_yarn
- dependency-name: nanoid
  dependency-type: indirect
  dependency-group: npm_and_yarn
- dependency-name: cross-spawn
  dependency-type: indirect
  dependency-group: npm_and_yarn
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-12-15 17:15:18 +00:00
Sean Morley
148568fca4
Auth Migration, Calendar and Other Misc. Fixes 2024-12-15 12:13:56 -05:00
Sean Morley
10dbafd1ee Update button label in NewTransportation component to Create 2024-12-14 17:27:10 -05:00
Sean Morley
c966b73eba Fix formatting in README.md for better readability 2024-12-14 17:18:38 -05:00
Sean Morley
0c27f4b8a4 Add download adventures as ICS calendar 2024-12-14 14:37:16 -05:00
Sean Morley
4839edde7b Update password reset form and add more localization for error messages 2024-12-14 13:36:15 -05:00
Sean Morley
c0fd91ef8d Add emoji picker to category dropdown; implement toggle functionality and handle emoji selection 2024-12-14 11:30:34 -05:00
Sean Morley
0376709325 Enhance localization support; update error messages and add translations for adventure calendar 2024-12-14 09:56:12 -05:00
Sean Morley
9bf0849b92 Add multi-factor authentication (MFA) support; update localization and error handling 2024-12-13 20:21:44 -05:00
Sean Morley
1b54f8ed69 Implement TOTP 2FA modal; add QR code generation and recovery codes management 2024-12-13 10:48:18 -05:00
Sean Morley
7b7db1c530 Refactor email management and localization; update requirements and settings for MFA support 2024-12-12 19:20:58 -05:00
Sean Morley
673a56c6a0 Add MFA to login screen 2024-12-12 15:45:19 -05:00
Sean Morley
54d7a1a229 Update forgot password link to point to user reset-password route 2024-12-12 15:22:23 -05:00
Sean Morley
2ccbf4be83 Update email verification and password reset flows; refactor Docker Compose and enhance email management 2024-12-12 11:01:09 -05:00
Sean Morley
0272c6b076 Refactor user admin settings and enhance email management functionality 2024-12-11 20:46:20 -05:00
Sean Morley
f7742ca37d Filter visited regions by user ID in ReverseGeocodeViewSet 2024-12-07 20:10:24 -05:00
Sean Morley
2f321517a6
Update getting_started.md 2024-12-07 17:45:26 -05:00
Sean Morley
57f3be0938
Merge pull request #398 from MaximUltimatum/adding-kustomize-documentation
Adding kustomize documentation
2024-12-07 16:27:46 -05:00
Sean Morley
914028ea2f Update Kubernetes and Kustomize documentation 2024-12-07 16:25:31 -05:00
Sean Morley
6a00a2ed55 Refactor Docker Compose configuration and enhance email management in settings 2024-12-07 16:15:41 -05:00
MaximUltimatum
91a51515dd
Removing extraneous env variable info that is externally linked 2024-12-07 14:31:13 -05:00
MaximUltimatum
56a4292f4f
Adding kustomize documentation 2024-12-07 14:26:18 -05:00
Sean Morley
64105808b5 Add calendar route and integrate calendar component in Navbar 2024-12-04 18:11:57 -05:00
Sean Morley
ca66b85838 Add Admin Panel guide to documentation 2024-12-04 12:43:26 -05:00
Sean Morley
d44cb06e31 Refactor AdventureCard usage and integrate event calendar components 2024-12-04 12:38:01 -05:00
Sean Morley
f0603f7dbd
Update README.md 2024-12-03 15:44:38 -05:00
Sean Morley
0616fe19f3 Remove printing in backend 2024-12-03 14:02:01 -05:00
Sean Morley
a39e22b0a8 Add new dashboard 2024-12-03 14:00:48 -05:00
Sean Morley
82040d5c85
Update README.md 2024-12-03 13:23:17 -05:00
Sean Morley
88dbd41b92
Merge pull request #375 from seanmorley15/dependabot/npm_and_yarn/frontend/npm_and_yarn-330f789f30
Bump @sveltejs/kit from 2.5.17 to 2.8.3 in /frontend in the npm_and_yarn group across 1 directory
2024-12-02 19:50:29 -05:00
Sean Morley
21d8b376b3
Merge pull request #395 from seanmorley15/update-nl
Update nl.json
2024-12-02 15:47:37 -05:00
Sean Morley
dc29f48ab2 Add 'Northern Lights' theme and update localization and Tailwind configuration 2024-12-02 15:47:09 -05:00
Sean Morley
4ecad7f46d Update nl.json 2024-12-02 13:16:48 -05:00
Sean Morley
0a2b172405
Merge pull request #393 from seanmorley15/fix-nginx-upload
Increase client_max_body_size to 100M in nginx configuration
2024-12-01 09:53:04 -05:00
Sean Morley
6ba047d2a5 Increase client_max_body_size to 100M in nginx configuration 2024-12-01 09:52:34 -05:00
Sean Morley
50dc0424a9 Refactor user serializers, update Docker configurations, and remove unused Nginx files 2024-12-01 09:52:04 -05:00
Sean Morley
84566b8ec1 User profile settings API and remove old Dj-Rest-Auth code 2024-11-30 10:24:27 -05:00
Sean Morley
c65fcc2558 Migrate to session based auth 2024-11-29 18:20:51 -05:00
Sean Morley
b86c7258e7 Enhance admin security by integrating secure_admin_login from AllAuth and updating settings for new dependencies 2024-11-29 17:51:32 -05:00
Sean Morley
1f4a02467b
Merge pull request #392 from seanmorley15/fix-390
Update adventure display to show category name and icon
2024-11-29 17:12:49 -05:00
Sean Morley
aecb3ca70e Update adventure display to show category name and icon 2024-11-29 17:08:52 -05:00
Sean Morley
2d24cb8aba Merge branch 'main' of github.com:seanmorley15/AdventureLog 2024-11-29 17:03:23 -05:00
Sean Morley
0d9c063c58 Update .gitignore to exclude .vscode/settings.json 2024-11-29 17:03:20 -05:00
Sean Morley
f119e6fdc2 Refactor settings.py to remove unused authentication configurations and clean up middleware 2024-11-29 16:55:28 -05:00
Sean Morley
53dc57453c
Update README.md 2024-11-29 15:29:50 -05:00
Sean Morley
9bc20be70e Initial migration to new session based auth system with AllAuth 2024-11-29 14:41:13 -05:00
Sean Morley
bde2e6a82d
Merge pull request #389 from seanmorley15/development
Add Polish Localization and Update Docs
2024-11-27 18:07:18 -05:00
Sean Morley
7defdac3a8 Update documentation and add Polish locale support 2024-11-27 18:06:16 -05:00
Sean Morley
0878008a05
Merge pull request #378 from dymek37/patch-11
Update de.json
2024-11-27 18:01:58 -05:00
Sean Morley
0b08dfbab9
Merge pull request #379 from dymek37/patch-12
Update en.json
2024-11-27 18:01:49 -05:00
Sean Morley
888bde042e
Merge pull request #380 from dymek37/patch-13
Update es.json
2024-11-27 18:01:35 -05:00
Sean Morley
335b5c2498
Merge pull request #381 from dymek37/patch-14
Update fr.json
2024-11-27 18:01:21 -05:00
Sean Morley
9f9e4fd12e
Merge pull request #382 from dymek37/patch-15
Update it.json
2024-11-27 18:01:13 -05:00
Sean Morley
30e2606a2f
Merge pull request #383 from dymek37/patch-16
Update nl.json
2024-11-27 18:01:05 -05:00
Sean Morley
df0d49298f
Merge pull request #384 from dymek37/patch-17
Update sv.json
2024-11-27 18:00:56 -05:00
Sean Morley
2ea3637c4b
Merge pull request #386 from dymek37/patch-18
Update zh.json
2024-11-27 18:00:45 -05:00
Sean Morley
84c013fa11
Merge pull request #377 from dymek37/patch-10
Create pl.json
2024-11-27 18:00:35 -05:00
Sean Morley
f618c24a7b
Update README.md 2024-11-27 12:34:56 -05:00
Sean Morley
39991c1877
Merge pull request #388 from seanmorley15/development
Add Umami analytics script to VitePress
2024-11-27 12:19:24 -05:00
Sean Morley
483c297af8 Add Umami analytics script to VitePress config for enhanced tracking 2024-11-27 12:18:29 -05:00
Sean Morley
66713ea76d
Merge pull request #387 from seanmorley15/development
Enhance documentation: update VitePress config to ignore localhost li…
2024-11-27 12:07:50 -05:00
Sean Morley
ec4935ecdd Update VitePress config: set ignoreDeadLinks to 'localhostLinks' for improved link management 2024-11-27 12:01:53 -05:00
Sean Morley
173c6183b3 Simplify VitePress config: set ignoreDeadLinks to true for streamlined link management 2024-11-27 11:59:24 -05:00
Sean Morley
f5a0f388b7 Enhance documentation: update VitePress config to ignore localhost links with any port and correct docker-compose.yml formatting for Nginx Proxy Manager 2024-11-27 11:58:25 -05:00
Sean Morley
9d2f83d4b6
Implement Custom Categories
Implement Custom Categories and other bug fixes
2024-11-27 11:28:02 -05:00
Sean Morley
7a3ec33fa7 Fix locale fallback logic: ensure valid fallback locale from navigator language or default to 'en' 2024-11-27 11:27:18 -05:00
Sean Morley
958e9de84e Enhance cookie management: set SameSite attribute for locale and theme cookies, and add comments for clarity 2024-11-27 11:25:33 -05:00
dymek37
06f0b93dd5
Update zh.json 2024-11-27 17:09:05 +01:00
dymek37
734208d869
Update sv.json 2024-11-27 17:06:12 +01:00
dymek37
fd3c30f540
Update nl.json 2024-11-27 17:04:04 +01:00
dymek37
6963fd858e
Update it.json 2024-11-27 17:00:11 +01:00
dymek37
74ff1b0b7f
Update fr.json 2024-11-27 16:58:22 +01:00
dymek37
4dbcd96581
Update es.json 2024-11-27 16:55:06 +01:00
dymek37
def642960c
Update en.json 2024-11-27 16:54:03 +01:00
dymek37
d20de4aeed
Update de.json 2024-11-27 16:52:03 +01:00
dymek37
a0aae8c237
Create pl.json
Addition of Polish language.
2024-11-27 16:50:15 +01:00
Sean Morley
02f534662b
Merge branch 'main' into development 2024-11-26 22:11:40 -05:00
Sean Morley
477e76a0af Fix user identification in adventure filtering: update user primary key reference from 'pk' to 'uuid' in search page logic 2024-11-26 21:59:15 -05:00
Sean Morley
f878167a36 Enhance category management: update adventure category assignment logic, improve category display in UI components, and add dynamic sorting for category dropdown 2024-11-26 20:06:52 -05:00
Sean Morley
adf45ff557 Fix general category handling 2024-11-26 17:39:10 -05:00
Sean Morley
ce0b82acb7 Fix custom default category 2024-11-26 15:10:17 -05:00
Sean Morley
17d8784d8c Migration to new documentation and information site 2024-11-26 10:31:25 -05:00
dependabot[bot]
d7baf6961e
Bump @sveltejs/kit
Bumps the npm_and_yarn group with 1 update in the /frontend directory: [@sveltejs/kit](https://github.com/sveltejs/kit/tree/HEAD/packages/kit).


Updates `@sveltejs/kit` from 2.5.17 to 2.8.3
- [Release notes](https://github.com/sveltejs/kit/releases)
- [Changelog](https://github.com/sveltejs/kit/blob/main/packages/kit/CHANGELOG.md)
- [Commits](https://github.com/sveltejs/kit/commits/@sveltejs/kit@2.8.3/packages/kit)

---
updated-dependencies:
- dependency-name: "@sveltejs/kit"
  dependency-type: direct:development
  dependency-group: npm_and_yarn
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-11-25 16:06:57 +00:00
Sean Morley
b1ec7dc815
Update docker-compose-traefik.yaml
As described in #345
2024-11-23 13:55:48 -05:00
Sean Morley
8e5a20ec62 Refactor adventure category handling: update type definitions, enhance category management in UI components, and implement user-specific category deletion logic in the backend 2024-11-23 13:42:41 -05:00
Sean Morley
736ede2417 Enhance adventure management: add error handling for category fetch, implement unique email constraint in user model, and update adventure save logic to ensure category assignment 2024-11-22 17:03:02 -05:00
Sean Morley
a6630b7de2
Update issue templates 2024-11-22 10:02:43 -05:00
Sean Morley
9b28d9a315
Update issue templates 2024-11-22 10:01:53 -05:00
Sean Morley
86d213bb8b Refactor user ID handling to use UUIDs; update related components and serializers for consistency 2024-11-17 16:34:46 -05:00
Sean Morley
129c76078e Fetch and display categories in CategoryFilterDropdown; update adventure details to include category information 2024-11-16 23:32:23 -05:00
Sean Morley
42f07dc2fb Implement user-specific category filtering in AdventureViewSet and update AdventureCard to display category details 2024-11-16 22:31:39 -05:00
Sean Morley
ae92fc2027 Fix bug where num_visits was not user specific 2024-11-16 16:47:21 -05:00
Sean Morley
4a7f720773 Initial framework for custom categories 2024-11-14 09:37:35 -05:00
Sean Morley
0ea948c62c
Merge pull request #356 from seanmorley15/development
AdventureLog v0.7.1
2024-11-13 09:06:32 -05:00
Sean Morley
c3f37b66d0 Fix detection of custom locations in AdventureModal 2024-11-12 23:12:08 -05:00
Sean Morley
954c154add Add Umami Analytics documentation for configuration 2024-11-12 09:23:23 -05:00
Sean Morley
10a0963a1e Update motivational message in adventurelog.txt 2024-11-12 00:02:49 -05:00
Sean Morley
f16a7f1e94 Add adventurelog.txt with motivational message and display it on entrypoint 2024-11-11 23:56:16 -05:00
Sean Morley
39fce5ace7 Add guides category to documentation and rename nginx migration guide 2024-11-11 23:46:22 -05:00
Sean Morley
0a7704aade Add support link to documentation and format sidebar configuration 2024-11-11 23:38:35 -05:00
Sean Morley
adb92a1d41 Remove redundant validation checks in Adventure model 2024-11-11 09:38:22 -05:00
Sean Morley
bde33260fa Show tabs in description box 2024-11-09 22:25:47 -05:00
Sean Morley
3dc193d098 Update nginx migration documentation and change package name to adventurelog-docs 2024-11-09 22:09:58 -05:00
Sean Morley
742cb9dd94 Fix formatting in README.md for backend container configuration options 2024-11-08 17:53:46 -05:00
Sean Morley
6132b1c0d6 Update nginx migration documentation and enhance AdventureModal component functionality 2024-11-08 17:15:53 -05:00
Sean Morley
efd19da10b Add custom location handling in AdventureModal component 2024-11-08 09:39:03 -05:00
Sean Morley
98e545be6f Add 'set_to_pin' translation to multiple language files 2024-11-07 20:03:54 -05:00
Sean Morley
add691b678 Update outline style for adventure markers on map 2024-11-07 19:58:36 -05:00
Sean Morley
b32c780266 Fix issues determined from testing series 2024-11-07 19:48:44 -05:00
Sean Morley
c7207ccf52 Add internationalization support for profile and shared collections; update translations in multiple languages 2024-11-05 14:40:32 -05:00
Sean Morley
bcba4f4425 Remove unused command from Dockerfile 2024-11-05 14:07:12 -05:00
Sean Morley
2c3fb41e5c Add staticfiles directory to Dockerfile 2024-11-05 11:24:42 -05:00
Sean Morley
04b332e031 Add creation command to dockerfile 2024-11-05 11:15:57 -05:00
Sean Morley
de45296dc1 Refactor media and static file paths; update countries JSON download URL to use COUNTRY_REGION_JSON_VERSION 2024-11-05 10:55:06 -05:00
Sean Morley
c27bf4baba Update COUNTRY_REGION_JSON_VERSION to v2.4 and adjust download URL in management command 2024-11-05 10:41:01 -05:00
Sean Morley
87928932c2 Update download URL for countries JSON to use tagged version 2024-11-05 10:27:06 -05:00
Sean Morley
6eff9f6456 Update STATIC_ROOT path to use 'staticfiles' directory 2024-11-05 10:15:38 -05:00
Sean Morley
44c0ffc1d7 Refactor static file path and update theme selection text in Navbar; change localization keys for login and signup buttons 2024-11-05 10:13:30 -05:00
Sean Morley
40cb5daa07 Add i18n support for ImageInfoModal and update localization strings 2024-11-04 19:56:54 -05:00
Sean Morley
9c6e11b16d Add language selection and share localization for multiple languages 2024-11-04 19:41:25 -05:00
Sean Morley
9ac4a8f4e9 Update localization for activities and adventures; change links and placeholders 2024-11-04 19:25:07 -05:00
Sean Morley
7cd869a507
Merge pull request #354 from seanmorley15/dependabot/npm_and_yarn/documentation/npm_and_yarn-b2e09fc846
Bump http-proxy-middleware from 2.0.6 to 2.0.7 in /documentation in the npm_and_yarn group across 1 directory
2024-11-03 23:12:13 -05:00
Sean Morley
7988ba4d68 Remove unused GeoJSONView and related URL path; clean up README links 2024-11-03 22:57:07 -05:00
Sean Morley
3df124b250 Add i18n support for transportation, notes, checklist, and collection components 2024-11-03 22:55:38 -05:00
Sean Morley
c0aaec1436 More settings localization 2024-11-03 15:45:29 -05:00
Sean Morley
4bbbc10097 Bump version to 0.7.1, update COUNTRY_REGION_JSON_VERSION, and add nginx migration guide 2024-11-03 15:12:28 -05:00
Sean Morley
172f07acca Add popup toggle and card carousel for adventure details in map view 2024-11-02 21:45:23 -04:00
Sean Morley
6137411b84 Update adventure type label handling and improve map marker display 2024-11-02 21:29:42 -04:00
Sean Morley
07263c5697 Refactor map page 2024-11-02 21:18:52 -04:00
Sean Morley
e6c5bc9ca8 Add localization strings for visited regions feature and update UI components 2024-11-01 20:12:43 -04:00
Sean Morley
b60455b50a Add mark_visited_region action to ReverseGeocodeViewSet and update AdventureModal for region tracking 2024-11-01 20:08:23 -04:00
Sean Morley
a7a49227c4 Add display_name to ReverseGeocode response and update AdventureModal 2024-10-31 23:47:02 -04:00
Sean Morley
25ed72afbc Add is_visited filtering to AdventureViewSet and update frontend components 2024-10-31 09:59:56 -04:00
Sean Morley
727daf0cfd is visited 2024-10-31 09:51:04 -04:00
Sean Morley
9d42dbac98 Add functionality to mark regions as visited in AdventureModal 2024-10-30 18:40:49 -04:00
Sean Morley
83d06fc0a4 Remove AUTHORS and MANIFEST.in files; add ReverseGeocodeViewSet and localization updates 2024-10-30 15:11:00 -04:00
Sean Morley
05076a6732 Refactor localization strings and add missing translations 2024-10-29 10:29:03 -04:00
Sean Morley
fcd2d27221 more localization 2024-10-28 19:59:44 -04:00
Sean Morley
5011829e6e Refactor frontend configuration and add optional Umami Analytics integration 2024-10-28 19:10:40 -04:00
Sean Morley
4f40d0de63 Add Italian and Dutch localization files 2024-10-28 15:28:49 -04:00
Sean Morley
8068fe93f7 more localization 2024-10-28 15:10:14 -04:00
Sean Morley
91c0ec8c07 localization v2 2024-10-28 13:56:57 -04:00
Sean Morley
6cf62cfb82 localization v1 2024-10-26 23:03:35 -04:00
Sean Morley
6f8864a13d Refactor Docker Compose configuration and add email backend documentation 2024-10-26 19:43:27 -04:00
Sean Morley
6daacabc1b Refactor Docker Compose configuration and update environment variables 2024-10-26 10:57:52 -04:00
Sean Morley
ae70c96ddc Trigger workflows 2024-10-26 09:47:46 -04:00
dependabot[bot]
5435208d3e
Bump http-proxy-middleware
Bumps the npm_and_yarn group with 1 update in the /documentation directory: [http-proxy-middleware](https://github.com/chimurai/http-proxy-middleware).


Updates `http-proxy-middleware` from 2.0.6 to 2.0.7
- [Release notes](https://github.com/chimurai/http-proxy-middleware/releases)
- [Changelog](https://github.com/chimurai/http-proxy-middleware/blob/v2.0.7/CHANGELOG.md)
- [Commits](https://github.com/chimurai/http-proxy-middleware/compare/v2.0.6...v2.0.7)

---
updated-dependencies:
- dependency-name: http-proxy-middleware
  dependency-type: indirect
  dependency-group: npm_and_yarn
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-26 13:47:41 +00:00
Sean Morley
f03c74cd74 Add workflows for uploading beta backend and frontend images to GHCR and Docker Hub 2024-10-26 09:46:14 -04:00
Sean Morley
de873c9eb5 Add backend and frontend beta deployment workflows 2024-10-26 09:44:36 -04:00
Sean Morley
ef3f2aee10 Fast. Easy. Fun. Deployment 🚀 2024-10-25 22:57:10 -04:00
Sean Morley
78ab387055 Refactor Docusaurus configuration and frontend components
- Update the title and logo in Docusaurus configuration
- Add Discord and Support links to the navbar
- Update the label and href for the GitHub link in the footer
- Remove redundant code and comments in ImageInfoModal component
- Update the text and link in ImageInfoModal component
- Update the conditional statement in +page.svelte file
- Comment out the unused code in settings page
2024-10-25 14:20:51 -04:00
Sean Morley
874a384477 Migrate Django server to guicorn 2024-10-21 19:59:01 -04:00
Sean Morley
075257c846 Refactor login and signup pages to improve code readability and remove unused imports 2024-10-21 19:42:46 -04:00
Sean Morley
1e67de6e14 Add type to map tag 2024-10-21 15:58:39 -04:00
Sean Morley
0a8ff18560
Merge pull request #348 from seanmorley15/fix-sorting-by-date
Update `apply_sorting` and `get_queryset` methods in `adventures/view…
2024-10-21 15:55:30 -04:00
Sean Morley
e22e175ae5
Merge pull request #347 from seanmorley15/ghcw-session-58ae
Add dates to map
2024-10-21 15:55:05 -04:00
Sean Morley
53cfd276f2 Refactor adventure and map pages to display visit dates 2024-10-21 15:52:57 -04:00
Sean Morley
fdf4f07156 Update apply_sorting and get_queryset methods in adventures/views.py
* Change `apply_sorting` method to reference `start_date` field instead of `date` field
* Remove references to `date` field in `get_queryset` method
2024-10-21 15:28:45 -04:00
Sean Morley
f34d533dc6 Load background from server page 2024-10-20 21:56:16 -04:00
Sean Morley
c084f348d9 New login screen with featured images 2024-10-17 21:35:55 -04:00
Sean Morley
792d9bcda2 Change over to Voyager map styles 2024-10-17 15:14:15 -04:00
Sean Morley
a9b42439cc Filter worldtravel by subregion 2024-10-16 22:37:37 -04:00
Sean Morley
8175daf773 Filter countries by visit status 2024-10-16 22:23:59 -04:00
Sean Morley
3a66a433ca Conditional rendering to the country card to show visited status as a badge 2024-10-16 20:02:28 -04:00
Sean Morley
ca0d54034f
Merge pull request #341 from seanmorley15/development
Version bump
2024-10-15 23:54:31 -04:00
Sean Morley
aa8d456e41 Version bump 2024-10-15 23:47:02 -04:00
Sean Morley
c7653e59a5
Merge pull request #340 from seanmorley15/development
Add funding information for buy me a coffee
2024-10-15 23:44:07 -04:00
Sean Morley
daa05c1fc7 Add funding information for buy me a coffee 2024-10-15 23:43:46 -04:00
Sean Morley
cb94c2ece8
Merge pull request #339 from seanmorley15/development
Add funding information for buy me a coffee
2024-10-15 23:41:30 -04:00
Sean Morley
8acc781bcf Add funding information for buy me a coffee 2024-10-15 23:41:05 -04:00
Sean Morley
3508b3b04f
Merge pull request #338 from seanmorley15/development
Development
2024-10-14 10:12:13 -04:00
Sean Morley
2601b07b5f Refactor AdventureCard and CardCarousel components 2024-10-14 08:58:23 -04:00
Sean Morley
3ee9625fe8 Refactor AdventureCard component and add CardCarousel
- Refactor AdventureCard component to remove unused variable and add meta tags for shared collections page
- Add CardCarousel component to display a carousel of adventure images in AdventureCard
2024-10-13 23:23:32 -04:00
Sean Morley
5b7aaa6aad Fix profile stats 2024-10-09 14:48:59 -04:00
Sean Morley
7621c55896 new screenshots 2024-10-08 19:52:43 -04:00
Sean Morley
01797bdeb9
Merge pull request #329 from seanmorley15/dependabot/npm_and_yarn/documentation/npm_and_yarn-57f830caa6
Bump the npm_and_yarn group across 2 directories with 8 updates
2024-10-08 11:20:21 -04:00
dependabot[bot]
63fe90070e
Bump the npm_and_yarn group across 2 directories with 8 updates
Bumps the npm_and_yarn group with 3 updates in the /documentation directory: [express](https://github.com/expressjs/express), [micromatch](https://github.com/micromatch/micromatch) and [webpack](https://github.com/webpack/webpack).
Bumps the npm_and_yarn group with 3 updates in the /frontend directory: [micromatch](https://github.com/micromatch/micromatch), [svelte](https://github.com/sveltejs/svelte/tree/HEAD/packages/svelte) and [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite).


Updates `express` from 4.19.2 to 4.21.0
- [Release notes](https://github.com/expressjs/express/releases)
- [Changelog](https://github.com/expressjs/express/blob/4.21.0/History.md)
- [Commits](https://github.com/expressjs/express/compare/4.19.2...4.21.0)

Updates `micromatch` from 4.0.7 to 4.0.8
- [Release notes](https://github.com/micromatch/micromatch/releases)
- [Changelog](https://github.com/micromatch/micromatch/blob/master/CHANGELOG.md)
- [Commits](https://github.com/micromatch/micromatch/compare/4.0.7...4.0.8)

Updates `path-to-regexp` from 0.1.7 to 0.1.10
- [Release notes](https://github.com/pillarjs/path-to-regexp/releases)
- [Changelog](https://github.com/pillarjs/path-to-regexp/blob/master/History.md)
- [Commits](https://github.com/pillarjs/path-to-regexp/compare/v0.1.7...v0.1.10)

Updates `send` from 0.18.0 to 0.19.0
- [Release notes](https://github.com/pillarjs/send/releases)
- [Changelog](https://github.com/pillarjs/send/blob/master/HISTORY.md)
- [Commits](https://github.com/pillarjs/send/compare/0.18.0...0.19.0)

Updates `serve-static` from 1.15.0 to 1.16.2
- [Release notes](https://github.com/expressjs/serve-static/releases)
- [Changelog](https://github.com/expressjs/serve-static/blob/v1.16.2/HISTORY.md)
- [Commits](https://github.com/expressjs/serve-static/compare/v1.15.0...v1.16.2)

Updates `webpack` from 5.92.1 to 5.95.0
- [Release notes](https://github.com/webpack/webpack/releases)
- [Commits](https://github.com/webpack/webpack/compare/v5.92.1...v5.95.0)

Updates `micromatch` from 4.0.7 to 4.0.8
- [Release notes](https://github.com/micromatch/micromatch/releases)
- [Changelog](https://github.com/micromatch/micromatch/blob/master/CHANGELOG.md)
- [Commits](https://github.com/micromatch/micromatch/compare/4.0.7...4.0.8)

Updates `svelte` from 4.2.18 to 4.2.19
- [Release notes](https://github.com/sveltejs/svelte/releases)
- [Changelog](https://github.com/sveltejs/svelte/blob/svelte@4.2.19/packages/svelte/CHANGELOG.md)
- [Commits](https://github.com/sveltejs/svelte/commits/svelte@4.2.19/packages/svelte)

Updates `vite` from 5.3.1 to 5.3.6
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/v5.3.6/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v5.3.6/packages/vite)

---
updated-dependencies:
- dependency-name: express
  dependency-type: indirect
  dependency-group: npm_and_yarn
- dependency-name: micromatch
  dependency-type: indirect
  dependency-group: npm_and_yarn
- dependency-name: path-to-regexp
  dependency-type: indirect
  dependency-group: npm_and_yarn
- dependency-name: send
  dependency-type: indirect
  dependency-group: npm_and_yarn
- dependency-name: serve-static
  dependency-type: indirect
  dependency-group: npm_and_yarn
- dependency-name: webpack
  dependency-type: indirect
  dependency-group: npm_and_yarn
- dependency-name: micromatch
  dependency-type: indirect
  dependency-group: npm_and_yarn
- dependency-name: svelte
  dependency-type: direct:development
  dependency-group: npm_and_yarn
- dependency-name: vite
  dependency-type: direct:development
  dependency-group: npm_and_yarn
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-08 15:17:25 +00:00
Sean Morley
3856b4840f
Merge pull request #328 from seanmorley15/dependabot/npm_and_yarn/frontend/rollup-4.24.0
Bump rollup from 4.18.0 to 4.24.0 in /frontend
2024-10-08 11:13:33 -04:00
dependabot[bot]
17ecf20cdf
Bump rollup from 4.18.0 to 4.24.0 in /frontend
Bumps [rollup](https://github.com/rollup/rollup) from 4.18.0 to 4.24.0.
- [Release notes](https://github.com/rollup/rollup/releases)
- [Changelog](https://github.com/rollup/rollup/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rollup/rollup/compare/v4.18.0...v4.24.0)

---
updated-dependencies:
- dependency-name: rollup
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-08 15:13:10 +00:00
Sean Morley
70c78635fc Refactor code to remove unused variable and add meta tags for shared collections page 2024-10-07 23:39:05 -04:00
Sean Morley
1e61032692 Add link field to collection and fix the visited counter in collection page 2024-10-07 23:16:27 -04:00
Sean Morley
eaeff3c42a
Merge pull request #327 from seanmorley15/development
fixed
2024-10-07 19:52:01 -04:00
Sean Morley
7d9bc16588 fixed 2024-10-07 19:51:45 -04:00
Sean Morley
30d1bd14c0
Merge pull request #326 from seanmorley15/development
fix
2024-10-07 19:43:41 -04:00
Sean Morley
8a1acb5d04 fix 2024-10-07 19:43:25 -04:00
Sean Morley
670d27921a
Merge pull request #325 from seanmorley15/development
Fix
2024-10-07 19:39:38 -04:00
Sean Morley
81998d5e84 Fix 2024-10-07 19:39:18 -04:00
Sean Morley
01cdcf67a2
Merge pull request #324 from seanmorley15/development
Multi Visit
2024-10-07 19:27:46 -04:00
Sean Morley
fd9ddc1872
Merge branch 'main' into development 2024-10-07 19:27:36 -04:00
Sean Morley
413aa69ac5 Hide end_date when start and end dates are the same 2024-10-07 19:25:49 -04:00
Sean Morley
ed37ad45e4 Being back /all view for map AdventureLink 2024-10-04 21:56:43 -04:00
Sean Morley
f354cd1ffe Refactor release workflow to use "released" event type 2024-10-04 21:33:02 -04:00
Sean Morley
d0791faad5 Update map filtering 2024-10-04 09:49:35 -04:00
Sean Morley
5ff4f66fdb Filter in sidebar of adventures list page! 2024-10-01 21:15:27 -04:00
Sean Morley
b9cae8a687 Fix adventure grouping in collections 2024-10-01 09:32:02 -04:00
Sean Morley
1eadac90f1 Refactor input and button layout in ActivityComplete component 2024-09-30 18:16:08 -04:00
Sean Morley
6cb31aa125 New AdventureModal Accordian 2024-09-30 18:03:10 -04:00
Sean Morley
c6ecfca91d Refactor adventure type field in migrations 2024-09-29 20:42:52 -04:00
Sean Morley
44db008f02
Merge pull request #322 from seanmorley15/sharing_fix
Sharing fix
2024-09-29 18:25:43 -04:00
Sean Morley
e41d9382ab Fix for all other collection types 2024-09-27 22:21:36 -04:00
Sean Morley
7e110d8670 Fix multiple adventures when shared with multiple users! 2024-09-27 22:16:56 -04:00
Sean Morley
c1664e82bf Fix multiple adventures when shared with multiple users! 2024-09-27 22:14:34 -04:00
Sean Morley
ad195911ff Fix admin page for adventure image 2024-09-24 17:05:16 -04:00
Sean Morley
86cefc8b2f Category frontend fixes 2024-09-23 18:46:04 -04:00
Sean Morley
9a672e51cd Valid types fixing 2024-09-23 18:19:25 -04:00
Sean Morley
0fdc119028 Fix migrations 2024-09-23 14:12:19 -04:00
Sean Morley
0911826501 Migrate to visits 2024-09-22 14:12:41 -04:00
Sean Morley
6dec37d3b9 Add new adventure types to the model 2024-09-22 10:29:23 -04:00
Sean Morley
7c5b448c64 Revert "Add new model fields and remove old ones"
This reverts commit eab312e94e.
2024-09-22 10:26:55 -04:00
Sean Morley
eab312e94e Add new model fields and remove old ones 2024-09-22 00:07:45 -04:00
Sean Morley
78f56a3a5f Fix max url length, adds line breaks to display, truncates long urls. Remove old seed command. 2024-09-17 10:34:31 -04:00
Sean Morley
0fd9e04599 Merge branch 'main' of github.com:seanmorley15/AdventureLog 2024-09-16 20:02:18 -04:00
Sean Morley
0b808401d9 Daylight Saving Time fix 2024-09-16 20:02:17 -04:00
Sean Morley
18a4fb95e1
Update bug_report.md 2024-09-16 15:12:55 -04:00
Sean Morley
47cc1cce10
Update issue templates 2024-09-16 15:12:10 -04:00
Sean Morley
f12f9c06e5 Venv Setup 2024-09-16 13:24:35 -04:00
Sean Morley
1ced1b8b1d Multi Arch image generation on release 2024-09-15 11:47:55 -04:00
Sean Morley
6defb19e46
Merge pull request #315 from seanmorley15/self-hosting-easier
Make comments clearer for self hosting
2024-09-15 11:11:31 -04:00
Sean Morley
3c353fed14 Make comments clearer for self hosting 2024-09-15 11:10:34 -04:00
Sean Morley
3c43f3cfad
Merge pull request #314 from seanmorley15/worldtravel-v2
WorldTravel v2
2024-09-13 20:57:34 -04:00
Sean Morley
9e4a3111b9 Dataset attribution 2024-09-13 20:56:38 -04:00
Sean Morley
4648ae7798 Finalize world travel V2 2024-09-13 20:53:48 -04:00
Sean Morley
cc7c04b0ec Redownload when region data version changes 2024-09-13 20:33:44 -04:00
Sean Morley
6ac3f0541f Add capital to countries 2024-09-11 16:08:10 -04:00
Sean Morley
4dc11db21d Add region markers to the map 2024-09-11 14:56:52 -04:00
Sean Morley
2f01232144 Lowercase flag urls 2024-09-11 10:01:36 -04:00
Sean Morley
abee735aae Fix login issue with different case usernames 2024-09-11 09:42:53 -04:00
Sean Morley
bd6d60d24d Update entrypoint 2024-09-11 09:31:25 -04:00
Sean Morley
9ba5b25ab5 Update existing regions 2024-09-10 23:12:01 -04:00
Sean Morley
6e9724979a Region dataset 2024-09-10 23:00:13 -04:00
Sean Morley
5df1c4cba9 Hide link adventure when the user is not the owner 2024-09-10 20:50:16 -04:00
Sean Morley
4a293798eb
Allow for Sharing of Collections to other Public Users 2024-09-10 17:16:05 -04:00
Sean Morley
3a2f095ab6 Sharing modal fixes and redact email for privacy 2024-09-10 09:59:59 -04:00
Sean Morley
4c858ab8b5 Fix adding to collection to change value of is_public first try 2024-09-10 09:30:09 -04:00
Sean Morley
f7c440c364 Add more to user page 2024-09-09 23:59:45 -04:00
Sean Morley
eab2369352 Fix is_public mismatching 2024-09-09 23:47:09 -04:00
Sean Morley
45cc925451 Country search 2024-09-09 16:18:06 -04:00
Sean Morley
2f78411a49
Merge pull request #309 from dymek37/patch-9
Administrative subdivisions for 31 countries
2024-09-09 16:07:23 -04:00
Sean Morley
5f8ea0040d Indenting fixes 2024-09-09 16:07:00 -04:00
dymek37
e1c25fcdfa
Administrative subdivisions for 31 countries
Added administrative subdivisions for 31 countries:
Namibia
Nauru
Nepal
Netherlands
New Caledonia
Nicaragua
Niger
Nigeria
Niue
Norfolk Island (NF)
North Macedonia
Northern Mariana Islands
Norway
Oman
Pakistan
Palau
Palestine, State of
Panama
Papua New Guinea
Paraguay
Peru
Philippines
Pitcairn
Poland
Portugal
Puerto Rico
Qatar
Réunion
Romania
Russian Federation
Rwanda
2024-09-09 20:30:43 +02:00
Sean Morley
dd17e24f44 Fix is_public bugs 2024-09-09 14:29:50 -04:00
Sean Morley
fe8a41f51b Shared with tab 2024-09-09 13:44:42 -04:00
Sean Morley
ba89f90e53 Shared with collaborative editing 2024-09-09 13:31:00 -04:00
Sean Morley
f150423c1e Add follow command to the deploy script 2024-09-08 15:13:57 -04:00
Sean Morley
a9c7cdb1cb
Merge pull request #307 from dymek37/patch-7
Administrative divisions have been added for 23 countries.
2024-09-08 14:47:43 -04:00
Sean Morley
2c280b24d6 Formatting and minor fixes 2024-09-08 14:46:29 -04:00
dymek37
2d45be3ab1
Administrative divisions have been added for 23 countries.
Administrative divisions have been added for 23 countries:
Lithuania 
Luxembourg
Macao
Madagascar
Malawi
Malaysia
Maldives
Mali 
Malta
Marshall Islands
Martinique
Mauritania
Mauritius
Mayotte
Micronesia (Federated States of)
Moldova (Republic of)
Monaco
Mongolia
Montenegro
Montserrat
Morocco
Mozambique
Myanmar
2024-09-08 20:31:46 +02:00
Sean Morley
4ea7ef69a6 Share via modal 2024-09-08 14:29:27 -04:00
Sean Morley
4d17484f86 Toggle public profile from settings page. 2024-09-08 13:53:50 -04:00
Sean Morley
9b1ce529e9
Merge pull request #303 from dymek37/patch-6
Administrative subdivisions for 13 countries
2024-09-08 01:05:36 -04:00
Sean Morley
6380fd3abe Formatting and minor fixes 2024-09-08 01:05:18 -04:00
Sean Morley
c867494a17 User profile viewing - need to add more to the details view 2024-09-08 00:59:07 -04:00
Sean Morley
7d228b302b User profile viewing - need to add more to the details view 2024-09-08 00:56:52 -04:00
Sean Morley
a70b1f2818 Fix contrast issues 2024-09-07 17:39:47 -04:00
Sean Morley
1c9c74958b Update the user model 2024-09-07 17:12:28 -04:00
dymek37
7375ad223d
Administrative subdivisions for 13 countries
Added administrative subdivisions for 13 countries:
Kazakhstan
Kenya
Kiribati
Korea (Democratic People's Republic of)
Korea (Republic of)
Kuwait
Kyrgyzstan
Lao People's Democratic Republic (Laos)
Latvia
Lebanon
Lesotho
Liberia
Libya
2024-09-07 16:18:47 +02:00
Sean Morley
2d7fe56086 Add continent code to the country cards 2024-09-06 23:58:06 -04:00
Sean Morley
bdb37c5ca1 Fix the 3 dot button 2024-09-06 23:47:40 -04:00
Sean Morley
6b778dea79 Fix card colors in light modes 2024-09-06 23:39:37 -04:00
Sean Morley
5ca5e1f69c Change card colors and add aestheticDark theme. 2024-09-06 23:35:48 -04:00
Sean Morley
ee249fd682 Add users get and list views 2024-09-06 23:19:44 -04:00
Sean Morley
711b974add Add public profile to user model 2024-09-06 19:50:19 -04:00
Sean Morley
ac0e917208 Add logo design attribution and update GEOJSON sources 2024-09-06 19:08:28 -04:00
Sean Morley
5784eec38b
Merge pull request #302 from seanmorley15/new_icon
Migrate to new icon!
2024-09-06 19:07:00 -04:00
Sean Morley
524b7fca0e Migrate to new icon! 2024-09-06 19:06:24 -04:00
Sean Morley
3d3111c46e
Merge pull request #300 from dymek37/patch-5
Adding and updating administrative subdivisions
2024-09-06 15:24:39 -04:00
Sean Morley
1c8c6fe40a Formatting and minor fixes 2024-09-06 15:24:02 -04:00
dymek37
e09ca2333a
Adding and updating administrative subdivisions
Administrative subdivisions have been added for 26 countries:
Ghana
Gibraltar
Greece
Greenland
Grenada
Guadeloupe
Guam
Guatemala
Guernsey
Guinea
Guinea-Bissau
Guyan
Hait
Heard Island and McDonald Islands
Holy See
Honduras
Hong Kong
Hungary
Indonesia
Iran
Iraq
Isle of Man
Israel
Jamaica
Jersey
Jordan

Updates have been made for 3 countries:
India
Ireland
Italy
2024-09-06 21:07:05 +02:00
Sean Morley
9c95022b0a
Merge pull request #297 from dymek37/patch-4
Administrative divisions for 21 countries
2024-09-06 11:13:22 -04:00
Sean Morley
4558c30d74 Formatting and minor fixes 2024-09-06 11:12:48 -04:00
dymek37
04c358a72e
Administrative divisions for 21 countries
Administrative divisions for 21 countries have been added:
Denmark
Djibouti
Dominica
Dominican Republic
Ecuador
El Salvador
Equatorial Guinea
Eritrea
Estonia
Eswatini
Ethiopia
Falkland Islands (Malvinas)
Faroe Islands
Fiji
Finland
French Guiana
French Polynesia
French Southern Territories
Gabon
Georgia
Gambia
2024-09-06 16:58:07 +02:00
Sean Morley
1344625bd7
Merge pull request #295 from dymek37/patch-3
Update worldtravel-seed.py
2024-09-06 08:54:23 -04:00
Sean Morley
70c812daca Formatting and minor fixes 2024-09-06 08:53:56 -04:00
dymek37
acb3bc838d
Update worldtravel-seed.py
The list of regions for 37 countries has been updated:
Azerbaijan
Bahamas 
Bahrain 
Bangladesh 
Barbados 
Belarus 
Belgium
Belize
Benin
Bermuda
Bhutan
Bolivia
Bonaire, Sint Eustatius and Saba
Bosnia and Herzegovina
Botswana
Bouvet Island
British Indian Ocean Territory
Brunei Darussalam
Bulgaria
Burkina Faso
Burundi
Cape Verde
Cambodia
Cameroon
 Christmas Island
Cocos Islands (Keelinga)
Colombia
Comoros
Congo
Democratic Republic of the Congo
Cook Islands
Costa Rica
Croatia
Cuba
Curaçao
Cyprus
Ivory Coast 

1 capital city has been added for the Czech Republic.
2024-09-06 12:24:45 +02:00
Sean Morley
c12693bed9
Merge pull request #293 from dymek37/patch-2
Update worldtravel-seed.py
2024-09-06 00:40:18 -04:00
Sean Morley
dcae936738 Formatting and minor fixes 2024-09-06 00:39:48 -04:00
dymek37
011e291d23
Update worldtravel-seed.py
Regions have been added to the following countries: 
Afghanistan (AF), 
Åland Islands (AX), 
Albania (AL), 
Algeria (DZ), 
American Samoa (AS), 
Andorra (AD), 
Angola (AO), 
Anguilla (AI), 
Antarctica (AQ), 
Armenia (AM), 
Aruba (AW), 
Antigua and Barbuda (AG).
2024-09-05 20:52:47 +02:00
Sean Morley
12ad8db047 update seeding 2024-09-05 12:29:57 -04:00
Sean Morley
c58e2e537a
Merge pull request #286 from dymek37/patch-1
Update worldtravel-seed.py
2024-09-05 12:22:20 -04:00
Sean Morley
c83ef1e904 Add trnasportations, checklists, and notes 2024-09-03 10:24:11 -04:00
Sean Morley
3915afbc22 more permission fixing 2024-09-02 22:27:07 -04:00
Sean Morley
d340934376 Fix adding and editing adventures in collections when shared 2024-09-02 17:18:18 -04:00
Sean Morley
0664d9434c More sharing feartures and permissions 2024-09-02 10:29:51 -04:00
dymek37
347f6f6913
Update worldtravel-seed.py 2024-08-31 16:19:52 +02:00
Sean Morley
f2ba479c8e
Merge pull request #283 from seanmorley15/development
Development
2024-08-27 08:02:26 -04:00
Sean Morley
3ce3866114 fix geojson 2024-08-25 15:28:33 -04:00
Sean Morley
15755c5252 Add Louisiana 2024-08-25 15:24:39 -04:00
Sean Morley
52264a2895 Update image on Traefik compose file to PostGIS 2024-08-25 15:18:50 -04:00
Sean Morley
4b93312600
Merge pull request #278 from seanmorley15/development
Custom registration disable message
2024-08-24 23:24:02 -04:00
Sean Morley
f237f480df Custom registration disable message 2024-08-24 23:20:50 -04:00
Sean Morley
17f36e90b7
Merge pull request #276 from seanmorley15/development
Update config
2024-08-24 16:36:24 -04:00
Sean Morley
824fbcb42f Update config 2024-08-24 16:36:15 -04:00
Sean Morley
030cacf4b1
Merge pull request #275 from seanmorley15/development
Merge for v0.6.0 update
2024-08-24 16:30:22 -04:00
Sean Morley
bed96b1a9b Add container names 2024-08-24 16:29:50 -04:00
Sean Morley
c197c074bc Fix docker compose 2024-08-24 16:22:03 -04:00
Sean Morley
8a77cd98bb Fix map filtering 2024-08-24 08:27:30 -04:00
Sean Morley
ffde90e6f5 Clean up files after postgis migration 2024-08-23 23:56:56 -04:00
Sean Morley
e489a70980 PostGIS migration for docker 2024-08-23 23:49:05 -04:00
Sean Morley
dab6efbe32 Region check - frontend 2024-08-23 18:41:59 -04:00
Sean Morley
c13d6f4f21 Region check - api 2024-08-23 18:34:11 -04:00
Sean Morley
afe83bb03e Add better support in adventure modal for the region search 2024-08-23 18:24:41 -04:00
Sean Morley
43c134bf2b Add clear map function 2024-08-23 14:26:43 -04:00
Sean Morley
f75c650a20 Add clear map function 2024-08-23 14:24:30 -04:00
Sean Morley
b11c3de461 Auto mark regions 2024-08-23 14:08:04 -04:00
Sean Morley
45196f9823 GEO Point checker! 2024-08-23 13:56:27 -04:00
Sean Morley
283431085f Fully remove cron jobs for new system 2024-08-21 18:59:18 -04:00
Sean Morley
eaab74057e
Merge pull request #273 from seanmorley15/development
Development
2024-08-21 18:57:15 -04:00
Sean Morley
528811d0d3 Add Liechtenstein 2024-08-21 18:56:51 -04:00
Sean Morley
9dfc5fc809
Merge pull request #272 from lovwyr/main
add SK to Worldtravel seed
2024-08-21 18:53:03 -04:00
Jens
8431809d77 add SK to Worldtravel seed 2024-08-21 22:15:42 +02:00
Sean Morley
254844923b Refresh world travel data each restart 2024-08-21 13:14:38 -04:00
Sean Morley
f32a3393d9 chore: Update region name_en field to allow null and blank values 2024-08-21 10:33:57 -04:00
Sean Morley
4cdbb75791 remove scheduler for now 2024-08-21 10:26:35 -04:00
Sean Morley
02d2d62f47 remove scheduler for now 2024-08-21 10:26:17 -04:00
Sean Morley
d1c194dc3a Autostart 2024-08-21 10:16:21 -04:00
Sean Morley
be384bd990 Autostart 2024-08-21 10:14:31 -04:00
Sean Morley
425b7b4b3d Fix compose file 2024-08-21 10:08:46 -04:00
Sean Morley
704d26f867 Fix scheduler 2024-08-21 10:06:09 -04:00
Sean Morley
2ef4917adf Merge branch 'development' of github.com:seanmorley15/AdventureLog into development 2024-08-21 10:05:13 -04:00
Sean Morley
256efc6304 Fix scheduler 2024-08-21 10:05:09 -04:00
Sean Morley
91ef71da7a Fix scheduler 2024-08-21 10:00:58 -04:00
Sean Morley
4241a1024e Merge branch 'main' of github.com:seanmorley15/AdventureLog into development
Development
2024-08-21 09:53:57 -04:00
Sean Morley
590fa9edc0 Auto schedule Django APScheduler 2024-08-21 09:48:47 -04:00
Sean Morley
dce04fd6c4
Merge pull request #265 from seanmorley15/development
Add Austria
2024-08-20 19:00:46 -04:00
Sean Morley
f5e721cd82 Add Austria 2024-08-20 18:57:33 -04:00
Sean Morley
ede5f19f8a
Merge pull request #264 from seanmorley15/development
fix region card
2024-08-20 18:08:41 -04:00
Sean Morley
fcb2fe3788 fix region card 2024-08-20 18:05:41 -04:00
Sean Morley
0943b99dfe
Merge pull request #263 from seanmorley15/development
fix deploy bug
2024-08-20 17:57:16 -04:00
Sean Morley
f15fbbea68 fix region card 2024-08-20 17:57:02 -04:00
Sean Morley
e3479ae491 fix deploy bug 2024-08-20 17:53:37 -04:00
Sean Morley
c038dce654
Merge pull request #262 from seanmorley15/development
Translate some regions into English
2024-08-20 17:48:26 -04:00
Sean Morley
53272a58f8 Translate some regions into english 2024-08-20 17:47:37 -04:00
Sean Morley
0f4cf33a1a
Merge pull request #261 from seanmorley15/development
chron and CZ
2024-08-20 14:42:14 -04:00
Sean Morley
027956a015
Merge pull request #260 from lovwyr/main
add CZ to Worldtravel seed
2024-08-20 14:41:48 -04:00
Sean Morley
df1fda4ce6 Add CZ and CRON for worldtravel seed 2024-08-20 14:37:18 -04:00
Jens
02fe21c723 add CZ to Worldtravel seed 2024-08-20 19:55:00 +02:00
Sean Morley
3b936f7eac
Merge pull request #259 from seanmorley15/development
Fix special adventure types
2024-08-20 12:40:27 -04:00
Sean Morley
aada13ca40 Fix special adventure types 2024-08-20 12:39:15 -04:00
Sean Morley
e1cff9cf68
Merge pull request #256 from seanmorley15/development
chore: Fix null values for adventure date and end date in Transportat…
2024-08-19 18:41:22 -04:00
Sean Morley
d5814fe6df chore: Fix null values for adventure date and end date in Transportation model 2024-08-19 18:41:05 -04:00
Sean Morley
2beb5819c8
Merge pull request #255 from seanmorley15/development
chore: Add validation for start and end dates in collection forms
2024-08-19 16:52:35 -04:00
Sean Morley
6fea57d773 chore: Add validation for start and end dates in collection forms 2024-08-19 16:49:27 -04:00
Sean Morley
4e422d527a
Merge pull request #254 from seanmorley15/development
chore: Fix null values for adventure date and end date in AdventureMo…
2024-08-19 16:45:01 -04:00
Sean Morley
a7d84c0a60 chore: Fix null values for adventure date and end date in AdventureModal and EditTransportation 2024-08-19 16:44:33 -04:00
Sean Morley
7728be707e
Merge pull request #253 from seanmorley15/development
Transportation card improvements
2024-08-19 16:43:24 -04:00
Sean Morley
a9f2ff63b7 chore: Fix null values for adventure date and end date in AdventureModal and EditTransportation 2024-08-19 16:40:47 -04:00
Sean Morley
dd8999a45f Transportation changes 2024-08-19 16:32:08 -04:00
Sean Morley
1d65ecb761
Merge pull request #250 from seanmorley15/development
Improve image display modal
2024-08-19 14:00:41 -04:00
Sean Morley
2d4d98393c
Merge pull request #249 from PhiCoderX/ImageDisplayModal
ImageDisplayModal
2024-08-19 13:59:43 -04:00
Sean Morley
14b2ba2ae3 Change close button design 2024-08-19 13:58:14 -04:00
PhiCoderX
c7959350c4
ImageDisplayModal
- restrain vertical height
- change close button to cross at top right
- close view when clicking outside
2024-08-19 18:48:05 +02:00
Sean Morley
8fa5801e00 Add detailed image view to the detail view 2024-08-19 12:05:29 -04:00
Sean Morley
7e04c9bf75
Merge pull request #247 from seanmorley15/development
Make image modal not reset scroll
2024-08-19 08:54:04 -04:00
Sean Morley
b7c406ec0c Make image modal not reset scroll 2024-08-19 08:53:37 -04:00
Sean Morley
45a9045739
Merge pull request #246 from seanmorley15/development
Add larger image display on click
2024-08-19 08:45:41 -04:00
Sean Morley
39fb4ad1ca Image display modal 2024-08-19 08:44:00 -04:00
Sean Morley
de759e1b58 Image display modal 2024-08-19 08:43:43 -04:00
Sean Morley
ad4c0b37b8
Merge pull request #245 from seanmorley15/development
Fix compose file image error
2024-08-18 13:38:46 -04:00
Sean Morley
e1e750f424 fix compose file 2024-08-18 13:38:24 -04:00
Sean Morley
f78c901ed4 chore: Update backup script and signup page layout 2024-08-18 12:48:37 -04:00
Sean Morley
b434e218a0
Merge pull request #242 from seanmorley15/development
Adds support for an end date to adventures
2024-08-18 12:31:32 -04:00
Sean Morley
03e0530e90 Add support for end date to adventure 2024-08-18 12:30:12 -04:00
Sean Morley
276ea42138 Docker compose comments for clarity 2024-08-18 12:04:46 -04:00
Sean Morley
7c446666ae
Merge pull request #241 from seanmorley15/development
share fix
2024-08-18 09:16:14 -04:00
Sean Morley
2dc3ac3aa3 share fix 2024-08-18 09:15:59 -04:00
Sean Morley
b8d73635f3
Merge pull request #240 from seanmorley15/development
Multiple images and new creation modal
2024-08-18 08:52:16 -04:00
Sean Morley
d1a49b7dd9 Fixed image generation in serializer 2024-08-18 08:43:49 -04:00
Sean Morley
add2e2bafa Wikipedia description fetch 2024-08-17 22:48:57 -04:00
Sean Morley
cfe14b3708
Merge pull request #239 from seanmorley15/new_images
New images
2024-08-17 22:43:40 -04:00
Sean Morley
987b228b7d
Delete frontend/src/lib/components/NewAdventure.svelte 2024-08-17 22:43:32 -04:00
Sean Morley
c87a0d2a41
Delete frontend/src/lib/components/EditAdventure.svelte 2024-08-17 22:43:27 -04:00
Sean Morley
f0efdaa933 new adventure modal 2024-08-17 22:40:27 -04:00
Sean Morley
b14cf9ccd9
Merge pull request #238 from seanmorley15/development
Traefik docker compose
2024-08-17 18:07:38 -04:00
Sean Morley
1ab375e6b4
Merge pull request #234 from tedski/tedski/chore/docker-compose-traefik
Adds docker-compose with traefik support.
2024-08-17 18:06:35 -04:00
Sean Morley
c35795144e chore: Refactor CollectionCard component and improve dropdown menu styling 2024-08-17 17:34:52 -04:00
Sean Morley
d552c50349 adventure view 2024-08-17 17:22:01 -04:00
Sean Morley
620c7298a9 better error managment 2024-08-17 16:28:56 -04:00
Sean Morley
d7db09693a autofetch features 2024-08-17 15:18:43 -04:00
Sean Morley
48ac320238 image card 2024-08-17 14:38:24 -04:00
Sean Morley
254a0d9498 image card 2024-08-17 14:34:14 -04:00
Sean Morley
167154bed4 chore: Refactor adventure form components and improve image handling 2024-08-17 14:21:55 -04:00
Sean Morley
b9ebbafd76 remove image 2024-08-17 14:13:23 -04:00
Sean Morley
6b9cd48603 remove image 2024-08-17 13:59:49 -04:00
Sean Morley
9c75af5b7f Edit modal 2024-08-17 13:30:00 -04:00
Sean Morley
0479026b11 Edit modal 2024-08-17 11:12:15 -04:00
Ted Strzalkowski
d4d6b4855b Adds docker-compose with traefik support.
Configures the stack (frontend, backend, db, and static content) but
adds a traefik reverse proxy instead of exposing the containers
themselves.  The traefik proxy uses letsencrypt for certificate
management.
2024-08-17 07:21:57 -07:00
Sean Morley
1f3a3a5be6
Merge pull request #233 from seanmorley15/development
trigger multi arch workflows
2024-08-17 09:09:20 -04:00
Sean Morley
b6348d9b73 trigger multi arch workflows 2024-08-17 09:08:56 -04:00
Sean Morley
68c52821fa
Merge pull request #232 from seanmorley15/development
Development
2024-08-17 09:07:54 -04:00
Sean Morley
63eb996b31
Merge pull request #225 from MnAppsNet/patch-2
Update frontend-latest.yml
2024-08-17 09:07:08 -04:00
Sean Morley
e2fed8763b
Merge pull request #226 from MnAppsNet/patch-1
Update backend-latest.yml
2024-08-17 09:06:38 -04:00
Sean Morley
06cd6a6c2e
Merge pull request #231 from seanmorley15/development
config for v0.5.2
2024-08-17 08:50:04 -04:00
Sean Morley
84facd073e config for v0.5.2 2024-08-17 08:49:45 -04:00
Sean Morley
0214861857
Merge pull request #230 from seanmorley15/development
chore: Update time zone handling in code
2024-08-17 08:31:06 -04:00
Sean Morley
2b16712496 chore: Update time zone handling in code 2024-08-17 08:30:24 -04:00
Sean Morley
ff27ff31c5
Merge pull request #229 from seanmorley15/development
Duplicate visited regions
2024-08-17 08:11:31 -04:00
Sean Morley
4d193bc44d Fix duplicate visited regions 2024-08-17 08:08:46 -04:00
Sean Morley
96663bb17b Fix duplicate visited regions 2024-08-17 08:07:50 -04:00
Sean Morley
816e0c08fd
Merge pull request #228 from seanmorley15/development
chore: Improve superuser creation logic
2024-08-17 08:00:20 -04:00
Sean Morley
175a2371b1 chore: Improve superuser creation logic 2024-08-17 08:00:01 -04:00
Sean Morley
a264da39f5 feat: Add location and activity type to Point type
chore: Update adventure image upload logic
2024-08-17 07:58:07 -04:00
Kalyvas Emmanouil
af0088da10
Update frontend-latest.yml
Multi-Platform docker images frontend
2024-08-17 11:10:55 +03:00
Kalyvas Emmanouil
53c9d482ef
Update backend-latest.yml
Multi-Platform docker images backend
2024-08-17 11:09:12 +03:00
Sean Morley
03927a2394 upload 2024-08-16 20:31:39 -04:00
Sean Morley
1fcb82188a
Merge pull request #222 from seanmorley15/development
Development
2024-08-16 20:01:10 -04:00
Sean Morley
f8338c6754 Wikipedia error handling 2024-08-16 20:00:42 -04:00
Sean Morley
15cca42675 Text wrap 2024-08-16 19:53:52 -04:00
Sean Morley
28ad207896 chore: Update terms and privacy policy documentation 2024-08-16 19:42:08 -04:00
Sean Morley
d585f30dfa
Merge pull request #219 from seanmorley15/development
better signup disable
2024-08-16 12:22:05 -04:00
Sean Morley
9f574c8505 better signup disable 2024-08-16 12:21:43 -04:00
Sean Morley
e9ebd7da7e
Merge pull request #217 from seanmorley15/development
retrigger workflows
2024-08-16 11:54:40 -04:00
Sean Morley
80883202bc retrigger workflows 2024-08-16 11:54:22 -04:00
Sean Morley
fc3f318110
Update frontend-latest.yml 2024-08-16 11:53:34 -04:00
Sean Morley
8ff054fbc1
Update backend-latest.yml 2024-08-16 11:53:14 -04:00
Sean Morley
3fb4a67e3c
Merge pull request #216 from seanmorley15/development
Fix password reset issue
2024-08-16 11:48:14 -04:00
Sean Morley
3b586b7bee Fix password reset issue 2024-08-16 11:47:53 -04:00
Sean Morley
963a0d3185
Merge pull request #215 from MnAppsNet/main
Multi-Platform images
2024-08-16 11:30:09 -04:00
Kalyvas Emmanouil
7f41ac74eb
Update frontend-latest.yml 2024-08-16 18:17:15 +03:00
Kalyvas Emmanouil
4c85f8601e
Update backend-latest.yml
Add multi-build support
2024-08-16 18:16:37 +03:00
Kalyvas Emmanouil
56f16ad254
Update frontend-latest.yml
Add multi-platform build
2024-08-16 18:14:13 +03:00
Sean Morley
241d4a1344
Merge pull request #211 from seanmorley15/development
Disable registration
2024-08-16 11:00:50 -04:00
Sean Morley
fa35526cd1 Disable registration 2024-08-16 10:59:31 -04:00
Sean Morley
281f337dc1
Merge pull request #208 from seanmorley15/development
Add world travel regions initially
2024-08-16 10:40:55 -04:00
Sean Morley
a48b2bf752 Add world travel regions initially 2024-08-16 10:40:23 -04:00
Sean Morley
e4de8a39a4 textfield for description 2024-08-15 21:36:21 -04:00
Sean Morley
2f51f88f00 Add rating stars 2024-08-15 21:29:36 -04:00
Sean Morley
6e39a9784d carousel 2024-08-15 21:16:02 -04:00
Sean Morley
5621e90665 new image features 2024-08-15 19:36:42 -04:00
Sean Morley
5e22abc3f4
Merge pull request #199 from seanmorley15/development
About modal fix
2024-08-15 16:45:51 -04:00
Sean Morley
54d16e27b1 About modal fix 2024-08-15 16:45:37 -04:00
Sean Morley
0109aefc6c
Merge pull request #198 from seanmorley15/development
Fix typo
2024-08-15 16:42:49 -04:00
Sean Morley
2f0eba993a Fix typo 2024-08-15 16:42:31 -04:00
Sean Morley
36609c4da8
Merge pull request #195 from seanmorley15/development
Make public from creation modal
2024-08-15 16:03:58 -04:00
Sean Morley
132ad44c08 Make public from creation modal 2024-08-15 16:03:06 -04:00
Sean Morley
f846f46283
Merge pull request #192 from seanmorley15/development
Docker Hub
2024-08-15 11:46:26 -04:00
Sean Morley
28b68afb12 Docker Hub 2024-08-15 11:45:30 -04:00
Sean Morley
83e907a9c6
Merge pull request #191 from seanmorley15/development
fix dockerfile
2024-08-15 10:47:57 -04:00
Sean Morley
9a7d85d544 fix dockerfile 2024-08-15 10:47:45 -04:00
Sean Morley
54ff856036
Merge pull request #190 from seanmorley15/development
Development
2024-08-14 22:18:39 -04:00
Sean Morley
a1094f805a chore: Update app version to v0.5.1 and fix toast component styling 2024-08-14 22:17:43 -04:00
Sean Morley
25c6d3fce3 Edit adventure from detail view 2024-08-13 15:25:04 -04:00
Sean Morley
a3f1dc7471
Merge pull request #189 from seanmorley15/development
Development
2024-08-13 15:10:11 -04:00
Sean Morley
2a072f22cb Activity type fixes 2024-08-13 15:09:45 -04:00
Sean Morley
70a2fc45fd Type conversion to string for UUID 2024-08-13 12:03:18 -04:00
Sean Morley
fc9e755b00
Merge pull request #188 from seanmorley15/development
Fix adventure cards and serializers
2024-08-13 11:10:23 -04:00
Sean Morley
ffe9d6fe97 Fix adventure cards and serializers 2024-08-13 11:09:49 -04:00
Sean Morley
0a6a4019b9
Merge pull request #187 from seanmorley15/development
Fix collection link
2024-08-11 13:35:04 -04:00
Sean Morley
5aef1eb8bd Fix collection link 2024-08-11 13:34:32 -04:00
Sean Morley
8ea07245ab
Merge pull request #186 from seanmorley15/development
change name
2024-08-11 09:45:32 -04:00
Sean Morley
cd55437f91 change name 2024-08-11 09:37:12 -04:00
Sean Morley
3da15264bd
Merge pull request #185 from seanmorley15/development
Development
2024-08-11 09:08:11 -04:00
Sean Morley
b88cd5df8d users 2024-08-11 09:07:57 -04:00
Sean Morley
d12a396626 Refactor database field names for adventures and users 2024-08-11 09:06:53 -04:00
Sean Morley
a656889905
Merge pull request #184 from seanmorley15/development
Development
2024-08-11 08:59:43 -04:00
Sean Morley
2425107090 Refactor database field names for adventures and users 2024-08-11 08:59:26 -04:00
Sean Morley
78c5331117 temp id 2024-08-11 08:58:23 -04:00
Sean Morley
a6041ec654
Merge pull request #183 from seanmorley15/development
temp id
2024-08-11 08:44:13 -04:00
Sean Morley
b5e2211123 temp id 2024-08-11 08:43:58 -04:00
Sean Morley
6220e5905d
Merge pull request #182 from seanmorley15/development
temp id
2024-08-11 08:39:06 -04:00
Sean Morley
cc0e50076f temp id 2024-08-11 08:38:46 -04:00
Sean Morley
303eeab113
Merge pull request #181 from seanmorley15/development
Development
2024-08-11 08:27:08 -04:00
Sean Morley
a08a91388d Add UUID for user model 2024-08-11 08:26:42 -04:00
Sean Morley
96eb73a224 Migrate to UUIDs for id PK for adventures 2024-08-10 22:40:57 -04:00
Sean Morley
f40714ac2c Fix map filtering bug 2024-08-09 09:31:39 -04:00
Sean Morley
58d53f784f Add links to cards 2024-08-08 22:12:06 -04:00
Sean Morley
e51e072722 Add hover to adventure card 2024-08-08 13:52:55 -04:00
Sean Morley
a5b7377b2f
Merge pull request #177 from seanmorley15/development
Update license
2024-08-07 18:14:02 -04:00
Sean Morley
1fb4c0a642 Update license 2024-08-07 18:13:45 -04:00
Sean Morley
03771538f0
Merge pull request #176 from seanmorley15/development
Update CollectionCard component and home page content
2024-08-07 17:58:37 -04:00
Sean Morley
844dd0c797 Update home page content 2024-08-07 17:56:53 -04:00
Sean Morley
879b182e56 chore: Update CollectionCard component to display correct toast message when archiving/unarchiving a collection 2024-08-07 17:36:25 -04:00
Sean Morley
14e4a5c86d
Merge pull request #175 from seanmorley15/development
Fixes
2024-08-07 16:34:20 -04:00
Sean Morley
4f3edec9f1 Fixes 2024-08-07 16:34:03 -04:00
Sean Morley
8b72641a31
Merge pull request #174 from seanmorley15/dependabot/pip/backend/server/django-5.0.8
chore(deps): Bump django from 5.0.7 to 5.0.8 in /backend/server
2024-08-07 16:33:08 -04:00
dependabot[bot]
584b40d42b
chore(deps): Bump django from 5.0.7 to 5.0.8 in /backend/server
Bumps [django](https://github.com/django/django) from 5.0.7 to 5.0.8.
- [Commits](https://github.com/django/django/compare/5.0.7...5.0.8)

---
updated-dependencies:
- dependency-name: django
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-08-07 20:32:42 +00:00
Sean Morley
48dbe1b60c
Merge pull request #173 from seanmorley15/development
Collection Archive Update
2024-08-07 13:16:56 -04:00
Sean Morley
a87797f6af Warning modal 2024-08-07 13:09:20 -04:00
Sean Morley
1858790308 Archive Collections 2024-08-07 13:01:12 -04:00
Sean Morley
1efa19b60e
Merge pull request #172 from seanmorley15/development
fix serializer issues for world travel
2024-08-06 12:35:54 -04:00
Sean Morley
493c25018c fix serializer issues for world travel 2024-08-06 12:35:30 -04:00
Sean Morley
290505d4c0
Merge pull request #171 from seanmorley15/development
Mobile Optimization and Security Fixes
2024-08-06 12:12:28 -04:00
Sean Morley
304097fb9d Mobile optimization from #170 2024-08-06 12:11:50 -04:00
Sean Morley
3b002c0c50 Security improvments 2024-08-06 09:35:18 -04:00
Sean Morley
5288439934
Merge pull request #169 from seanmorley15/development
fix workflow error
2024-08-06 09:11:53 -04:00
Sean Morley
8453be8003 fix workflow error 2024-08-06 09:11:37 -04:00
Sean Morley
82e69ca56a
Merge pull request #168 from seanmorley15/development
Development
2024-08-06 09:04:25 -04:00
Sean Morley
1f2699ed21 Update version information 2024-08-06 09:04:08 -04:00
Sean Morley
967a125b2f Release workflows 2024-08-06 09:02:55 -04:00
Sean Morley
5386ffa582
Merge pull request #167 from seanmorley15/development
SEO Optimization
2024-08-06 08:51:28 -04:00
Sean Morley
143f84e910 SEO Optimization 2024-08-06 08:50:15 -04:00
Sean Morley
fd096940da
Merge pull request #166 from seanmorley15/development
Checklist Update
2024-08-05 21:48:07 -04:00
Sean Morley
b6628fe2b3 refactor: Simplify ChecklistModal component code 2024-08-05 21:46:26 -04:00
Sean Morley
18ef919a11 checklists ui 2024-08-05 21:36:38 -04:00
Sean Morley
d5f93c5d9d checklists ui beta 2024-08-05 18:48:11 -04:00
Sean Morley
f2888f26fe checklists api beta 2024-08-05 16:09:57 -04:00
Sean Morley
62f33c7b0a
Merge pull request #163 from seanmorley15/development
feat: Fix flag URL in CountrySerializer
2024-08-05 14:30:15 -04:00
Sean Morley
7d5324a8bc feat: Fix flag URL in CountrySerializer 2024-08-05 14:29:53 -04:00
Sean Morley
f522e478a6
Merge pull request #162 from seanmorley15/development
feat: Add flag URL to Country type and update CountryCard component
2024-08-05 14:17:58 -04:00
Sean Morley
d9e554ad42 feat: Add flag URL to Country type and update CountryCard component 2024-08-05 14:17:41 -04:00
Sean Morley
b944c6e8e0
Merge pull request #161 from seanmorley15/development
Development
2024-08-05 10:01:13 -04:00
Sean Morley
77c11fefea better filters 2024-08-05 09:59:34 -04:00
Sean Morley
44cad30528 better filters 2024-08-05 09:33:21 -04:00
Sean Morley
32f5c1a806 chore: Increase page size to 25 for adventures and collections views 2024-08-04 22:19:09 -04:00
Sean Morley
885112f168
Merge pull request #160 from seanmorley15/development
Development
2024-08-04 22:00:04 -04:00
Sean Morley
7c61fa3363 chore: Disable email verification for new users, update search functionality, and improve note card display 2024-08-04 21:50:15 -04:00
Sean Morley
10466f5913 feat: Add public/private badge to CollectionCard and fix delete button in NoteCard 2024-08-04 21:30:11 -04:00
Sean Morley
c01b0b43df
Merge pull request #159 from seanmorley15/development
bug fix url
2024-08-04 19:00:26 -04:00
Sean Morley
64dec7fe5f bug fix url 2024-08-04 19:00:06 -04:00
Sean Morley
e066ed7be6
Merge pull request #158 from seanmorley15/development
Development
2024-08-04 18:09:19 -04:00
Sean Morley
e753d023ad email providers 2024-08-04 18:05:19 -04:00
Sean Morley
fd94f03008 password reset email 2024-08-04 17:30:43 -04:00
Sean Morley
12595483fc feat: Update NoteModal component to allow editing and submitting notes 2024-08-04 13:57:33 -04:00
Sean Morley
c150eee1c6
Merge pull request #157 from seanmorley15/development
Development
2024-08-04 13:40:42 -04:00
Sean Morley
8dd44e23a6 chore: Update adventure statistics display in collection page 2024-08-04 13:40:07 -04:00
Sean Morley
4bbb9f10f6 notes 2024-08-04 13:33:49 -04:00
Sean Morley
860e6d4034 notes 2024-08-04 13:27:05 -04:00
Sean Morley
0c3664acf3 feat: Add links functionality to NoteModal component 2024-08-04 12:45:37 -04:00
Sean Morley
89bf310340 chore: Add delete functionality to NoteCard component 2024-08-04 12:37:04 -04:00
Sean Morley
7c2b0e927d notes beta 2024-08-04 09:56:58 -04:00
Sean Morley
3f900bc41a notes beta 2024-08-03 22:03:27 -04:00
Sean Morley
4f1ad09470 notes beta 2024-08-03 21:09:49 -04:00
Sean Morley
b8994a531f feat: Improve UI layout and functionality for adventure search 2024-08-03 20:23:42 -04:00
Sean Morley
2bb1d80a77 refactor: Handle authentication cookies in authHook 2024-08-03 18:56:51 -04:00
Sean Morley
0e44b1cd6c
Merge pull request #156 from seanmorley15/development
Development
2024-08-01 21:07:34 -04:00
Sean Morley
48b70b5bec Add screenshots and better documentation 2024-08-01 21:06:50 -04:00
Sean Morley
ad1799b79e Add update documentation. 2024-08-01 18:41:27 -04:00
Sean Morley
1c0d29f5b7
Merge pull request #155 from seanmorley15/development
refactor: Update API request in ActivityComplete.svelte and add adven…
2024-08-01 18:18:35 -04:00
Sean Morley
db9e771310 refactor: Update API request in ActivityComplete.svelte and add adventure search button in +page.svelte 2024-08-01 18:18:07 -04:00
Sean Morley
331f25ebab
Merge pull request #154 from seanmorley15/development
Development
2024-08-01 11:02:56 -04:00
Sean Morley
9c6fcea589 refactor: Remove unused toast functionality and map marker code 2024-08-01 11:02:43 -04:00
Sean Morley
c5cbea1c20 refactor: Improve adventure card UI and collection functionality 2024-08-01 11:01:27 -04:00
Sean Morley
bb286a56cd
Merge pull request #153 from seanmorley15/development
Development
2024-08-01 10:26:04 -04:00
Sean Morley
b2ceda819c refactor: Update adventure search filter UI layout 2024-08-01 10:25:40 -04:00
Sean Morley
b380b55942 refactor: Add property filter to adventure search functionality 2024-08-01 10:02:00 -04:00
Sean Morley
0685065bf6 refactor: Add additional attributions to AboutModal and filter adventures based on user ID in +page.svelte 2024-08-01 09:38:02 -04:00
Sean Morley
e0162ff69a
Merge pull request #152 from seanmorley15/development
fixes #151
2024-07-31 18:30:48 -04:00
Sean Morley
06df5d370d fixes #151 2024-07-31 18:27:06 -04:00
Sean Morley
8ead67a265
Merge pull request #150 from seanmorley15/development
Development
2024-07-31 11:02:21 -04:00
Sean Morley
17498121a3 refactor: Update date input fields with min and max values 2024-07-31 11:01:41 -04:00
Sean Morley
4e44203239 Add Iceland GEOJSON for map visualization 2024-07-31 09:39:33 -04:00
Sean Morley
1293b43976 Add Switzerland GEOJSON for map visualization 2024-07-30 11:43:43 -04:00
Sean Morley
999440ff79 refactor: Add Sweden GEOJSON for map visualization 2024-07-30 11:34:17 -04:00
Sean Morley
0392bf3da9
Merge pull request #149 from seanmorley15/development
refactor: Add umami event tracking to adventure card buttons
2024-07-30 08:34:47 -04:00
Sean Morley
42f6c84633 refactor: Add umami event tracking to adventure card buttons 2024-07-30 08:34:26 -04:00
Sean Morley
31aefff74e
Merge pull request #148 from seanmorley15/development
Development
2024-07-30 08:26:22 -04:00
Sean Morley
053c1ff681 feat: Enable analytics configuration in docker-compose.yml 2024-07-30 08:26:05 -04:00
Sean Morley
30c8bea112 refactor: Add analytics script to layout for tracking website usage 2024-07-30 08:24:22 -04:00
Sean Morley
3a01178acb refactor: Improve performance and fix conditional rendering issue in +page.svelte 2024-07-30 07:10:41 -04:00
Sean Morley
bef9eb199f
Merge pull request #147 from seanmorley15/development
Development
2024-07-29 22:15:07 -04:00
Sean Morley
f98ca62aad Fix critical error 2024-07-29 22:14:42 -04:00
Sean Morley
103500b5e1 refactor: Add user prop to TransportationCard component for conditional rendering of actions 2024-07-29 19:19:24 -04:00
Sean Morley
d5c5551ce1 Ireland GEOJSON 2024-07-28 12:57:17 -04:00
Sean Morley
03ca0770df
Merge pull request #146 from seanmorley15/development
Trip Planner for Collections
2024-07-28 12:45:49 -04:00
Sean Morley
589eb094d5 refactor: Update +page.svelte to improve rendering performance and fix conditional rendering issue 2024-07-28 12:45:00 -04:00
Sean Morley
54ef1677e8 add transportation 2024-07-28 09:44:25 -04:00
Sean Morley
6155d531ab add transportation 2024-07-28 09:10:59 -04:00
Sean Morley
61c3d23efa refactor: Update transportation form with hidden input for is_public field 2024-07-27 22:23:23 -04:00
Sean Morley
2e2932a030 edit transportation 2024-07-27 22:18:52 -04:00
Sean Morley
581e5548d5 refactor: Update validation error message in Transportation model clean method 2024-07-27 21:18:15 -04:00
Sean Morley
7c9afd8931 transportation 2024-07-27 19:22:01 -04:00
Sean Morley
ae9a7f5479 transportation 2024-07-27 19:04:55 -04:00
Sean Morley
66a2e30711 lodging beta 2024-07-27 18:42:52 -04:00
Sean Morley
acb7470fbb feat: Add functionality to change a non-adventure to an adventure in AdventureCard component 2024-07-27 15:49:57 -04:00
Sean Morley
87a804dbc2 lodging beta 2024-07-27 15:41:26 -04:00
Sean Morley
0ea9f1d73e refactor: Update date formatting in CollectionCard and CollectionPage components 2024-07-27 14:44:15 -04:00
Sean Morley
dbe2f01b8d refactor: Update adventure and collection page headers and date formatting 2024-07-27 14:40:33 -04:00
Sean Morley
59a3a2d72a chore: Update date formatting in AdventureCard and CollectionCard components 2024-07-27 14:38:43 -04:00
Sean Morley
c94a4379c7 collection days 2024-07-27 14:26:15 -04:00
Sean Morley
055290ce3f feat: Update map page to fetch GeoJSON data from new endpoint 2024-07-27 12:50:36 -04:00
Sean Morley
57eee7bb5d chore: Add GeoJSON endpoint to retrieve combined GeoJSON data from static files 2024-07-27 12:46:50 -04:00
Sean Morley
9221e4bf45
Merge pull request #145 from seanmorley15/development
Development
2024-07-27 09:30:37 -04:00
Sean Morley
70d08eff8a Fix location saving 2024-07-27 09:29:47 -04:00
Sean Morley
a38887a602 auto point selection 2024-07-27 09:11:21 -04:00
Sean Morley
03ee6606fd
Merge pull request #144 from seanmorley15/development
Development
2024-07-26 09:33:21 -04:00
Sean Morley
7d931c7a97 Japan 2024-07-26 09:06:37 -04:00
Sean Morley
65ad5348e2 fix germany geojson 2024-07-25 22:24:19 -04:00
Sean Morley
9884b2bdee
Merge pull request #143 from seanmorley15/development
Development
2024-07-25 19:13:10 -04:00
Sean Morley
e1a9602481 Autoadd 2024-07-25 18:53:55 -04:00
Sean Morley
ea5329cf34 Mexico 2024-07-25 10:17:07 -04:00
Sean Morley
d37ae6842a Mexico 2024-07-25 10:16:33 -04:00
Sean Morley
c10aa873de
Merge pull request #142 from seanmorley15/development
Development
2024-07-24 19:03:28 -04:00
Sean Morley
13590c5c3c Add location from map 2024-07-24 18:55:40 -04:00
Sean Morley
3e328f408a feat: Add latitude and longitude to NewAdventure component 2024-07-24 18:45:49 -04:00
Sean Morley
31063c92cb feat: Import world travel data with option to force import 2024-07-24 18:20:57 -04:00
Sean Morley
efa13d85cc
Merge pull request #141 from seanmorley15/development
Development
2024-07-24 14:34:51 -04:00
Sean Morley
d2f4379998 AU and DE 2024-07-24 14:33:57 -04:00
Sean Morley
0887579129 France 2024-07-24 14:16:25 -04:00
Sean Morley
0720481937 feat: Fetch and merge multiple country GeoJSON files 2024-07-24 11:52:39 -04:00
Sean Morley
f6aa5f089f
Merge pull request #140 from seanmorley15/development
Development
2024-07-24 11:02:17 -04:00
Sean Morley
6a5e8ba1ec GEOJSON! 2024-07-24 11:01:59 -04:00
Sean Morley
dad42c4a3a GEOJSON! 2024-07-24 10:40:48 -04:00
Sean Morley
f1748a2cf0
Merge pull request #139 from seanmorley15/development
chore: Update VisitedRegionViewSet to set user_id in create method
2024-07-23 12:09:49 -04:00
Sean Morley
9e610c250c chore: Update VisitedRegionViewSet to set user_id in create method 2024-07-23 12:09:24 -04:00
Sean Morley
dd18837358
Merge pull request #138 from seanmorley15/development
Development
2024-07-23 12:00:33 -04:00
Sean Morley
b9c9021627 feat: Filter visits by user in visits_by_country view 2024-07-23 12:00:15 -04:00
Sean Morley
70615a6a16 chore: Update router registration in urls.py 2024-07-23 11:56:33 -04:00
Sean Morley
43c392963e chore: Add Open Source Attributions to AboutModal.svelte 2024-07-22 11:06:48 -04:00
Sean Morley
8d61a7ddce
Merge pull request #137 from seanmorley15/development
User agent config
2024-07-22 10:56:39 -04:00
Sean Morley
c8ce0e06e6 User agent config 2024-07-22 10:56:18 -04:00
Sean Morley
58a40f1d09
Merge pull request #136 from seanmorley15/development
Development
2024-07-22 10:46:44 -04:00
Sean Morley
fe05e5c6cf feat: Add type change functionality to AdventureCard component 2024-07-22 10:45:25 -04:00
Sean Morley
e093be31af search ui fixes 2024-07-22 10:08:42 -04:00
Sean Morley
fc782d9354 chore: Register CollectionAdmin in admin.py 2024-07-21 09:03:25 -04:00
Sean Morley
b3c76b054c chore: Update Navbar component with search form 2024-07-20 21:39:33 -04:00
Sean Morley
f44a6a2dfd chore: Update Navbar component with search form 2024-07-20 08:39:32 -04:00
447 changed files with 44078 additions and 19341 deletions

47
.env.example Normal file
View file

@ -0,0 +1,47 @@
# 🌐 Frontend
PUBLIC_SERVER_URL=http://server:8000 # PLEASE DON'T CHANGE :) - Should be the service name of the backend with port 8000, even if you change the port in the backend service. Only change if you are using a custom more complex setup.
ORIGIN=http://localhost:8015
BODY_SIZE_LIMIT=Infinity
FRONTEND_PORT=8015
# 🐘 PostgreSQL Database
PGHOST=db
POSTGRES_DB=database
POSTGRES_USER=adventure
POSTGRES_PASSWORD=changeme123
# 🔒 Django Backend
SECRET_KEY=changeme123
DJANGO_ADMIN_USERNAME=admin
DJANGO_ADMIN_PASSWORD=admin
DJANGO_ADMIN_EMAIL=admin@example.com
PUBLIC_URL=http://localhost:8016 # Match the outward port, used for the creation of image urls
CSRF_TRUSTED_ORIGINS=http://localhost:8016,http://localhost:8015
DEBUG=False
FRONTEND_URL=http://localhost:8015 # Used for email generation. This should be the url of the frontend
BACKEND_PORT=8016
# Optional: use Google Maps integration
# https://adventurelog.app/docs/configuration/google_maps_integration.html
# GOOGLE_MAPS_API_KEY=your_google_maps_api_key
# Optional: disable registration
# https://adventurelog.app/docs/configuration/disable_registration.html
DISABLE_REGISTRATION=False
# DISABLE_REGISTRATION_MESSAGE=Registration is disabled for this instance of AdventureLog.
# Optional: Use email
# https://adventurelog.app/docs/configuration/email.html
# EMAIL_BACKEND=email
# EMAIL_HOST=smtp.gmail.com
# EMAIL_USE_TLS=True
# EMAIL_PORT=587
# EMAIL_USE_SSL=False
# EMAIL_HOST_USER=user
# EMAIL_HOST_PASSWORD=password
# DEFAULT_FROM_EMAIL=user@example.com
# Optional: Use Umami for analytics
# https://adventurelog.app/docs/configuration/analytics.html
# PUBLIC_UMAMI_SRC=https://cloud.umami.is/script.js # If you are using the hosted version of Umami
# PUBLIC_UMAMI_WEBSITE_ID=

16
.github/.docker-compose-database.yml vendored Normal file
View file

@ -0,0 +1,16 @@
services:
db:
image: postgis/postgis:15-3.3
container_name: adventurelog-db
restart: unless-stopped
ports:
- "127.0.0.1:5432:5432"
environment:
POSTGRES_DB: database
POSTGRES_USER: adventure
POSTGRES_PASSWORD: changeme123
volumes:
- postgres_data:/var/lib/postgresql/data/
volumes:
postgres_data:

1
.github/CODEOWNERS vendored Normal file
View file

@ -0,0 +1 @@
* @seanmorley15

2
.github/FUNDING.yml vendored Normal file
View file

@ -0,0 +1,2 @@
github: seanmorley15
buy_me_a_coffee: seanmorley15

27
.github/ISSUE_TEMPLATE/bug_report.md vendored Normal file
View file

@ -0,0 +1,27 @@
---
name: Bug report
about: Detailed bug reports help me diagnose and fix bugs quicker! Thanks!
title: "[BUG]"
labels: bug
assignees: ''
---
**Describe the bug**
A clear and concise description of what the bug is.
**To Reproduce**
Steps to reproduce the behavior:
1.
**Expected behavior**
A clear and concise description of what you expected to happen.
**Screenshots**
If applicable, add screenshots to help explain your problem.
**Docker Compose**
If the issue is related to deployment and docker, please post an **obfuscated** (remove secrets and confidential information) version of your compose file.
**Additional context**
Add any other context about the problem here.

View file

@ -0,0 +1,15 @@
---
name: Deployment Issue
about: Request help deploying AdventureLog on your machine. The more details, the
better I can help!
title: "[DEPLOYMENT]"
labels: deployment
assignees: ''
---
## Explain your issue
## Provide an **obfuscated** `docker-compose.yml`
## Provide any necessary logs from the containers and browser

View file

@ -0,0 +1,20 @@
---
name: Feature request
about: Suggest an idea for AdventureLog
title: "[REQUEST]"
labels: enhancement
assignees: ''
---
**Is your feature request related to a problem? Please describe.**
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
**Describe the solution you'd like**
A clear and concise description of what you want to happen.
**Describe alternatives you've considered**
A clear and concise description of any alternative solutions or features you've considered.
**Additional context**
Add any other context or screenshots about the feature request here.

46
.github/workflows/backend-beta.yml vendored Normal file
View file

@ -0,0 +1,46 @@
name: Upload beta backend image to GHCR and Docker Hub
on:
push:
branches:
- development
paths:
- "backend/**"
env:
IMAGE_NAME: "adventurelog-backend"
jobs:
upload:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v2
- name: Login to GitHub Container Registry
uses: docker/login-action@v1
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.ACCESS_TOKEN }}
- name: Login to Docker Hub
uses: docker/login-action@v1
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Set up QEMU
uses: docker/setup-qemu-action@v3
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: set lower case owner name
run: |
echo "REPO_OWNER=${OWNER,,}" >>${GITHUB_ENV}
env:
OWNER: "${{ github.repository_owner }}"
- name: Build Docker images
run: docker buildx build --platform linux/amd64,linux/arm64 --push -t ghcr.io/$REPO_OWNER/$IMAGE_NAME:beta -t ${{ secrets.DOCKERHUB_USERNAME }}/$IMAGE_NAME:beta ./backend

46
.github/workflows/backend-latest.yml vendored Normal file
View file

@ -0,0 +1,46 @@
name: Upload latest backend image to GHCR and Docker Hub
on:
push:
branches:
- main
paths:
- "backend/**"
env:
IMAGE_NAME: "adventurelog-backend"
jobs:
upload:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v2
- name: Login to GitHub Container Registry
uses: docker/login-action@v1
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.ACCESS_TOKEN }}
- name: Login to Docker Hub
uses: docker/login-action@v1
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Set up QEMU
uses: docker/setup-qemu-action@v3
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: set lower case owner name
run: |
echo "REPO_OWNER=${OWNER,,}" >>${GITHUB_ENV}
env:
OWNER: '${{ github.repository_owner }}'
- name: Build Docker images
run: docker buildx build --platform linux/amd64,linux/arm64 --push -t ghcr.io/$REPO_OWNER/$IMAGE_NAME:latest -t ${{ secrets.DOCKERHUB_USERNAME }}/$IMAGE_NAME:latest ./backend

43
.github/workflows/backend-release.yml vendored Normal file
View file

@ -0,0 +1,43 @@
name: Upload the tagged release backend image to GHCR and Docker Hub
on:
release:
types: [released]
env:
IMAGE_NAME: "adventurelog-backend"
jobs:
upload:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v2
- name: Login to GitHub Container Registry
uses: docker/login-action@v1
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.ACCESS_TOKEN }}
- name: Login to Docker Hub
uses: docker/login-action@v1
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Set up QEMU
uses: docker/setup-qemu-action@v3
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: set lower case owner name
run: |
echo "REPO_OWNER=${OWNER,,}" >>${GITHUB_ENV}
env:
OWNER: "${{ github.repository_owner }}"
- name: Build Docker images
run: docker buildx build --platform linux/amd64,linux/arm64 --push -t ghcr.io/$REPO_OWNER/$IMAGE_NAME:${{ github.event.release.tag_name }} -t ${{ secrets.DOCKERHUB_USERNAME }}/$IMAGE_NAME:${{ github.event.release.tag_name }} ./backend

64
.github/workflows/backend-test.yml vendored Normal file
View file

@ -0,0 +1,64 @@
name: Test Backend
permissions:
contents: read
on:
pull_request:
paths:
- 'backend/server/**'
- '.github/workflows/backend-test.yml'
push:
paths:
- 'backend/server/**'
- '.github/workflows/backend-test.yml'
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: set up python 3.12
uses: actions/setup-python@v5
with:
python-version: '3.12'
- name: install dependencies
run: |
sudo apt update -q
sudo apt install -y -q \
python3-gdal
- name: start database
run: |
docker compose -f .github/.docker-compose-database.yml up -d
- name: install python libreries
working-directory: backend/server
run: |
pip install -r requirements.txt
- name: run server
working-directory: backend/server
env:
PGHOST: "127.0.0.1"
PGDATABASE: "database"
PGUSER: "adventure"
PGPASSWORD: "changeme123"
SECRET_KEY: "changeme123"
DJANGO_ADMIN_USERNAME: "admin"
DJANGO_ADMIN_PASSWORD: "admin"
DJANGO_ADMIN_EMAIL: "admin@example.com"
PUBLIC_URL: "http://localhost:8000"
CSRF_TRUSTED_ORIGINS: "http://localhost:5173,http://localhost:8000"
DEBUG: "True"
FRONTEND_URL: "http://localhost:5173"
run: |
python manage.py migrate
python manage.py runserver &
- name: wait for backend to boot
run: >
curl -fisS --retry 60 --retry-delay 1 --retry-all-errors
http://localhost:8000/

46
.github/workflows/cdn-beta.yml vendored Normal file
View file

@ -0,0 +1,46 @@
name: Upload beta CDN image to GHCR and Docker Hub
on:
push:
branches:
- development
paths:
- "cdn/**"
env:
IMAGE_NAME: "adventurelog-cdn"
jobs:
upload:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v2
- name: Login to GitHub Container Registry
uses: docker/login-action@v1
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.ACCESS_TOKEN }}
- name: Login to Docker Hub
uses: docker/login-action@v1
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Set up QEMU
uses: docker/setup-qemu-action@v3
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: set lower case owner name
run: |
echo "REPO_OWNER=${OWNER,,}" >>${GITHUB_ENV}
env:
OWNER: "${{ github.repository_owner }}"
- name: Build Docker images
run: docker buildx build --platform linux/amd64,linux/arm64 --push -t ghcr.io/$REPO_OWNER/$IMAGE_NAME:beta -t ${{ secrets.DOCKERHUB_USERNAME }}/$IMAGE_NAME:beta ./cdn

46
.github/workflows/cdn-latest.yml vendored Normal file
View file

@ -0,0 +1,46 @@
name: Upload latest CDN image to GHCR and Docker Hub
on:
push:
branches:
- main
paths:
- "cdn/**"
env:
IMAGE_NAME: "adventurelog-cdn"
jobs:
upload:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v2
- name: Login to GitHub Container Registry
uses: docker/login-action@v1
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.ACCESS_TOKEN }}
- name: Login to Docker Hub
uses: docker/login-action@v1
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Set up QEMU
uses: docker/setup-qemu-action@v3
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: set lower case owner name
run: |
echo "REPO_OWNER=${OWNER,,}" >>${GITHUB_ENV}
env:
OWNER: "${{ github.repository_owner }}"
- name: Build Docker images
run: docker buildx build --platform linux/amd64,linux/arm64 --push -t ghcr.io/$REPO_OWNER/$IMAGE_NAME:latest -t ${{ secrets.DOCKERHUB_USERNAME }}/$IMAGE_NAME:latest ./cdn

43
.github/workflows/cdn-release.yml vendored Normal file
View file

@ -0,0 +1,43 @@
name: Upload the tagged release CDN image to GHCR and Docker Hub
on:
release:
types: [released]
env:
IMAGE_NAME: "adventurelog-cdn"
jobs:
upload:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v2
- name: Login to GitHub Container Registry
uses: docker/login-action@v1
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.ACCESS_TOKEN }}
- name: Login to Docker Hub
uses: docker/login-action@v1
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Set up QEMU
uses: docker/setup-qemu-action@v3
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: set lower case owner name
run: |
echo "REPO_OWNER=${OWNER,,}" >>${GITHUB_ENV}
env:
OWNER: "${{ github.repository_owner }}"
- name: Build Docker images
run: docker buildx build --platform linux/amd64,linux/arm64 --push -t ghcr.io/$REPO_OWNER/$IMAGE_NAME:${{ github.event.release.tag_name }} -t ${{ secrets.DOCKERHUB_USERNAME }}/$IMAGE_NAME:${{ github.event.release.tag_name }} ./cdn

View file

@ -1,34 +0,0 @@
name: Upload Docker image to GHCR
on:
push:
branches:
- main
paths:
- "backend/**"
env:
IMAGE_NAME: "adventurelog-backend"
jobs:
upload:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v2
- name: Login to GitHub Container Registry
uses: docker/login-action@v1
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.ACCESS_TOKEN }}
- name: Build Docker image
run: docker build -t $IMAGE_NAME:latest ./backend
- name: Tag Docker image
run: docker tag $IMAGE_NAME:latest ghcr.io/${{ github.repository_owner }}/$IMAGE_NAME:latest
- name: Push Docker image to GHCR
run: docker push ghcr.io/${{ github.repository_owner }}/$IMAGE_NAME:latest

46
.github/workflows/frontend-beta.yml vendored Normal file
View file

@ -0,0 +1,46 @@
name: Upload beta frontend image to GHCR and Docker Hub
on:
push:
branches:
- development
paths:
- "frontend/**"
env:
IMAGE_NAME: "adventurelog-frontend"
jobs:
upload:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v2
- name: Login to GitHub Container Registry
uses: docker/login-action@v1
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.ACCESS_TOKEN }}
- name: Login to Docker Hub
uses: docker/login-action@v1
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Set up QEMU
uses: docker/setup-qemu-action@v3
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: set lower case owner name
run: |
echo "REPO_OWNER=${OWNER,,}" >>${GITHUB_ENV}
env:
OWNER: "${{ github.repository_owner }}"
- name: Build Docker images
run: docker buildx build --platform linux/amd64,linux/arm64 --push -t ghcr.io/$REPO_OWNER/$IMAGE_NAME:beta -t ${{ secrets.DOCKERHUB_USERNAME }}/$IMAGE_NAME:beta ./frontend

View file

@ -1,11 +1,11 @@
name: Upload Docker image to GHCR
name: Upload latest frontend image to GHCR and Docker Hub
on:
push:
branches:
- main
paths:
- 'frontend/**'
- "frontend/**"
env:
IMAGE_NAME: "adventurelog-frontend"
@ -24,11 +24,23 @@ jobs:
username: ${{ github.actor }}
password: ${{ secrets.ACCESS_TOKEN }}
- name: Build Docker image
run: docker build -t $IMAGE_NAME:latest ./frontend
- name: Login to Docker Hub
uses: docker/login-action@v1
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Tag Docker image
run: docker tag $IMAGE_NAME:latest ghcr.io/${{ github.repository_owner }}/$IMAGE_NAME:latest
- name: Set up QEMU
uses: docker/setup-qemu-action@v3
- name: Push Docker image to GHCR
run: docker push ghcr.io/${{ github.repository_owner }}/$IMAGE_NAME:latest
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: set lower case owner name
run: |
echo "REPO_OWNER=${OWNER,,}" >>${GITHUB_ENV}
env:
OWNER: '${{ github.repository_owner }}'
- name: Build Docker images
run: docker buildx build --platform linux/amd64,linux/arm64 --push -t ghcr.io/$REPO_OWNER/$IMAGE_NAME:latest -t ${{ secrets.DOCKERHUB_USERNAME }}/$IMAGE_NAME:latest ./frontend

43
.github/workflows/frontend-release.yml vendored Normal file
View file

@ -0,0 +1,43 @@
name: Upload tagged release frontend image to GHCR and Docker Hub
on:
release:
types: [released]
env:
IMAGE_NAME: "adventurelog-frontend"
jobs:
upload:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v2
- name: Login to GitHub Container Registry
uses: docker/login-action@v1
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.ACCESS_TOKEN }}
- name: Login to Docker Hub
uses: docker/login-action@v1
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Set up QEMU
uses: docker/setup-qemu-action@v3
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: set lower case owner name
run: |
echo "REPO_OWNER=${OWNER,,}" >>${GITHUB_ENV}
env:
OWNER: "${{ github.repository_owner }}"
- name: Build Docker images
run: docker buildx build --platform linux/amd64,linux/arm64 --push -t ghcr.io/$REPO_OWNER/$IMAGE_NAME:${{ github.event.release.tag_name }} -t ${{ secrets.DOCKERHUB_USERNAME }}/$IMAGE_NAME:${{ github.event.release.tag_name }} ./frontend

32
.github/workflows/frontend-test.yml vendored Normal file
View file

@ -0,0 +1,32 @@
name: Test Frontend
permissions:
contents: read
on:
pull_request:
paths:
- "frontend/**"
- ".github/workflows/frontend-test.yml"
push:
paths:
- "frontend/**"
- ".github/workflows/frontend-test.yml"
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 20
- name: install dependencies
working-directory: frontend
run: npm i
- name: build frontend
working-directory: frontend
run: npm run build

5
.gitignore vendored Normal file
View file

@ -0,0 +1,5 @@
# Ignore everything in the .venv folder
.venv/
.vscode/settings.json
.pnpm-store/
.env

6
.vscode/extensions.json vendored Normal file
View file

@ -0,0 +1,6 @@
{
"recommendations": [
"lokalise.i18n-ally",
"svelte.svelte-vscode"
]
}

40
.vscode/settings.json vendored Normal file
View file

@ -0,0 +1,40 @@
{
"git.ignoreLimitWarning": true,
"i18n-ally.localesPaths": [
"frontend/src/locales",
"backend/server/backend/lib/python3.12/site-packages/allauth/locale",
"backend/server/backend/lib/python3.12/site-packages/dj_rest_auth/locale",
"backend/server/backend/lib/python3.12/site-packages/rest_framework/locale",
"backend/server/backend/lib/python3.12/site-packages/rest_framework_simplejwt/locale",
"backend/server/backend/lib/python3.12/site-packages/django/conf/locale",
"backend/server/backend/lib/python3.12/site-packages/django/contrib/messages",
"backend/server/backend/lib/python3.12/site-packages/allauth/templates/account/messages",
"backend/server/backend/lib/python3.12/site-packages/allauth/templates/mfa/messages",
"backend/server/backend/lib/python3.12/site-packages/allauth/templates/socialaccount/messages",
"backend/server/backend/lib/python3.12/site-packages/allauth/templates/usersessions/messages",
"backend/server/backend/lib/python3.12/site-packages/django/contrib/admindocs/locale",
"backend/server/backend/lib/python3.12/site-packages/django/contrib/auth/locale",
"backend/server/backend/lib/python3.12/site-packages/django/contrib/admin/locale",
"backend/server/backend/lib/python3.12/site-packages/django/contrib/contenttypes/locale",
"backend/server/backend/lib/python3.12/site-packages/django/contrib/flatpages/locale",
"backend/server/backend/lib/python3.12/site-packages/django/contrib/humanize/locale",
"backend/server/backend/lib/python3.12/site-packages/django/contrib/gis/locale",
"backend/server/backend/lib/python3.12/site-packages/django/contrib/redirects/locale",
"backend/server/backend/lib/python3.12/site-packages/django/contrib/postgres/locale",
"backend/server/backend/lib/python3.12/site-packages/django/contrib/sessions/locale",
"backend/server/backend/lib/python3.12/site-packages/django/contrib/sites/locale",
"backend/server/backend/lib/python3.12/site-packages/rest_framework/templates/rest_framework/docs/langs"
],
"i18n-ally.keystyle": "nested",
"i18n-ally.keysInUse": [
"navbar.themes.dim",
"navbar.themes.northernLights",
"navbar.themes.aqua",
"navbar.themes.aestheticDark",
"navbar.themes.aestheticLight",
"navbar.themes.forest",
"navbar.themes.night",
"navbar.themes.dark",
"navbar.themes.light"
]
}

View file

@ -1,91 +1,50 @@
# Contributing to AdventureLog
When contributing to this repository, please first discuss the change you wish to make via issue,
email, or any other method with the owners of this repository before making a change.
Please note we have a code of conduct, please follow it in all your interactions with the project.
Were excited to have you contribute to AdventureLog! To ensure that this community remains welcoming and productive for all users and developers, please follow this simple Code of Conduct.
## Pull Request Process
1. Please make sure you create an issue first for your change so you can link any pull requests to this issue. There should be a clear relationship between pull requests and issues.
2. Update the README.md with details of changes to the interface, this includes new environment
variables, exposed ports, useful file locations and container parameters.
3. Increase the version numbers in any examples files and the README.md to the new version that this
Pull Request would represent. The versioning scheme we use is [SemVer](http://semver.org/).
4. You may merge the Pull Request in once you have the sign-off of two other developers, or if you
do not have permission to do that, you may request the second reviewer to merge it for you.
1. **Open an Issue First**: Discuss any changes or features you plan to implement by opening an issue. This helps to clarify your idea and ensures theres a shared understanding.
2. **Document Changes**: If your changes impact the user interface, add new environment variables, or introduce new container configurations, make sure to update the documentation accordingly. The documentation is located in the `documentation` folder.
3. **Pull Request**: Submit a pull request with your changes. Make sure to reference the issue you opened in the description.
## Code of Conduct
### Our Pledge
In the interest of fostering an open and welcoming environment, we as
contributors and maintainers pledge to making participation in our project and
our community a harassment-free experience for everyone, regardless of age, body
size, disability, ethnicity, gender identity and expression, level of experience,
nationality, personal appearance, race, religion, or sexual identity and
orientation.
At AdventureLog, we are committed to creating a community that fosters adventure, exploration, and innovation. We encourage diverse participation and strive to maintain a space where everyone feels welcome to contribute, regardless of their background or experience level. We ask that you contribute with respect and kindness, making sure to prioritize collaboration and mutual growth.
### Our Standards
Examples of behavior that contributes to creating a positive environment
include:
In order to maintain a positive environment, we encourage the following behaviors:
- Using welcoming and inclusive language
- Being respectful of differing viewpoints and experiences
- Gracefully accepting constructive criticism
- Focusing on what is best for the community
- Showing empathy towards other community members
- **Inclusivity**: Use welcoming and inclusive language that fosters collaboration across all perspectives and experiences.
- **Respect**: Respect differing opinions and engage with empathy, understanding that each persons perspective is valuable.
- **Constructive Feedback**: Offer feedback that helps improve the project and allows contributors to grow from it.
- **Adventure Spirit**: Bring the same sense of curiosity, discovery, and positivity that drives AdventureLog into all interactions with the community.
Examples of unacceptable behavior by participants include:
Examples of unacceptable behavior include:
- The use of sexualized language or imagery and unwelcome sexual attention or
advances
- Trolling, insulting/derogatory comments, and personal or political attacks
- Public or private harassment
- Publishing others' private information, such as a physical or electronic
address, without explicit permission
- Other conduct which could reasonably be considered inappropriate in a
professional setting
- Personal attacks, trolling, or any form of harassment.
- Insensitive or discriminatory language, including sexualized comments or imagery.
- Spamming or misusing project spaces for personal gain.
- Publishing or using others private information without permission.
- Anything else that could be seen as disrespectful or unprofessional in a collaborative environment.
### Our Responsibilities
Project maintainers are responsible for clarifying the standards of acceptable
behavior and are expected to take appropriate and fair corrective action in
response to any instances of unacceptable behavior.
As maintainers of AdventureLog, we are committed to enforcing this Code of Conduct and taking corrective action when necessary. This may involve moderating comments, pulling code, or banning users who engage in harmful behaviors.
Project maintainers have the right and responsibility to remove, edit, or
reject comments, commits, code, wiki edits, issues, and other contributions
that are not aligned to this Code of Conduct, or to ban temporarily or
permanently any contributor for other behaviors that they deem inappropriate,
threatening, offensive, or harmful.
We strive to foster a community that balances open collaboration with respect for all contributors.
### Scope
This Code of Conduct applies both within project spaces and in public spaces
when an individual is representing the project or its community. Examples of
representing a project or community include using an official project e-mail
address, posting via an official social media account, or acting as an appointed
representative at an online or offline event. Representation of a project may be
further defined and clarified by project maintainers.
This Code of Conduct applies in all spaces related to AdventureLog. This includes our GitHub repository, discussions, documentation, social media accounts, and events—both online and in person.
### Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported by contacting the project team at [INSERT EMAIL ADDRESS]. All
complaints will be reviewed and investigated and will result in a response that
is deemed necessary and appropriate to the circumstances. The project team is
obligated to maintain confidentiality with regard to the reporter of an incident.
Further details of specific enforcement policies may be posted separately.
Project maintainers who do not follow or enforce the Code of Conduct in good
faith may face temporary or permanent repercussions as determined by other
members of the project's leadership.
If you experience or witness unacceptable behavior, please report it to the project team at `contact@adventurelog.app`. All reports will be confidential and handled swiftly. The maintainers will investigate the issue and take appropriate action as needed.
### Attribution
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
available at [http://contributor-covenant.org/version/1/4][version]
[homepage]: http://contributor-covenant.org
[version]: http://contributor-covenant.org/version/1/4/
This Code of Conduct is inspired by the [Contributor Covenant](http://contributor-covenant.org), version 1.4, and adapted to fit the unique spirit of AdventureLog.

254
LICENSE
View file

@ -1,16 +1,33 @@
AdventureLog: Self-hostable travel tracker and trip planner.
Copyright (C) 2023-2025 Sean Morley
Contact: contact@seanmorley.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
GNU GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The GNU General Public License is a free, copyleft license for
The GNU General Public License is a free, copyleft license for
software and other kinds of works.
The licenses for most software and other practical works are designed
The licenses for most software and other practical works are designed
to take away your freedom to share and change the works. By contrast,
the GNU General Public License is intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
@ -19,35 +36,35 @@ GNU General Public License for most of our software; it applies also to
any other work released this way by its authors. You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.
To protect your rights, we need to prevent others from denying you
To protect your rights, we need to prevent others from denying you
these rights or asking you to surrender the rights. Therefore, you have
certain responsibilities if you distribute copies of the software, or if
you modify it: responsibilities to respect the freedom of others.
For example, if you distribute copies of such a program, whether
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must pass on to the recipients the same
freedoms that you received. You must make sure that they, too, receive
or can get the source code. And you must show them these terms so they
know their rights.
Developers that use the GNU GPL protect your rights with two steps:
Developers that use the GNU GPL protect your rights with two steps:
(1) assert copyright on the software, and (2) offer you this License
giving you legal permission to copy, distribute and/or modify it.
For the developers' and authors' protection, the GPL clearly explains
For the developers' and authors' protection, the GPL clearly explains
that there is no warranty for this free software. For both users' and
authors' sake, the GPL requires that modified versions be marked as
changed, so that their problems will not be attributed erroneously to
authors of previous versions.
Some devices are designed to deny users access to install or run
Some devices are designed to deny users access to install or run
modified versions of the software inside them, although the manufacturer
can do so. This is fundamentally incompatible with the aim of
protecting users' freedom to change the software. The systematic
@ -58,49 +75,49 @@ products. If such problems arise substantially in other domains, we
stand ready to extend this provision to those domains in future versions
of the GPL, as needed to protect the freedom of users.
Finally, every program is threatened constantly by software patents.
Finally, every program is threatened constantly by software patents.
States should not allow patents to restrict development and use of
software on general-purpose computers, but in those that do, we wish to
avoid the special danger that patents applied to a free program could
make it effectively proprietary. To prevent this, the GPL assures that
patents cannot be used to render the program non-free.
The precise terms and conditions for copying, distribution and
The precise terms and conditions for copying, distribution and
modification follow.
TERMS AND CONDITIONS
0. Definitions.
0. Definitions.
"This License" refers to version 3 of the GNU General Public License.
"This License" refers to version 3 of the GNU General Public License.
"Copyright" also means copyright-like laws that apply to other kinds of
"Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.
"The Program" refers to any copyrightable work licensed under this
"The Program" refers to any copyrightable work licensed under this
License. Each licensee is addressed as "you". "Licensees" and
"recipients" may be individuals or organizations.
To "modify" a work means to copy from or adapt all or part of the work
To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy. The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.
A "covered work" means either the unmodified Program or a work based
A "covered work" means either the unmodified Program or a work based
on the Program.
To "propagate" a work means to do anything with it that, without
To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy. Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.
To "convey" a work means any kind of propagation that enables other
To "convey" a work means any kind of propagation that enables other
parties to make or receive copies. Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.
An interactive user interface displays "Appropriate Legal Notices"
An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
@ -109,18 +126,18 @@ work under this License, and how to view a copy of this License. If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.
1. Source Code.
1. Source Code.
The "source code" for a work means the preferred form of the work
The "source code" for a work means the preferred form of the work
for making modifications to it. "Object code" means any non-source
form of a work.
A "Standard Interface" means an interface that either is an official
A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.
The "System Libraries" of an executable work include anything, other
The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
@ -131,7 +148,7 @@ implementation is available to the public in source code form. A
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.
The "Corresponding Source" for a work in object code form means all
The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities. However, it does not include the work's
@ -144,16 +161,16 @@ linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.
The Corresponding Source need not include anything that users
The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.
The Corresponding Source for a work in source code form is that
The Corresponding Source for a work in source code form is that
same work.
2. Basic Permissions.
2. Basic Permissions.
All rights granted under this License are granted for the term of
All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met. This License explicitly affirms your unlimited
permission to run the unmodified Program. The output from running a
@ -161,7 +178,7 @@ covered work is covered by this License only if the output, given its
content, constitutes a covered work. This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.
You may make, run and propagate covered works that you do not
You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force. You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
@ -172,19 +189,19 @@ for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.
Conveying under any other circumstances is permitted solely under
Conveying under any other circumstances is permitted solely under
the conditions stated below. Sublicensing is not allowed; section 10
makes it unnecessary.
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
No covered work shall be deemed part of an effective technological
No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.
When you convey a covered work, you waive any legal power to forbid
When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
@ -192,9 +209,9 @@ modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.
4. Conveying Verbatim Copies.
4. Conveying Verbatim Copies.
You may convey verbatim copies of the Program's source code as you
You may convey verbatim copies of the Program's source code as you
receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice;
keep intact all notices stating that this License and any
@ -202,12 +219,12 @@ non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.
You may charge any price or no price for each copy that you convey,
You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.
5. Conveying Modified Source Versions.
5. Conveying Modified Source Versions.
You may convey a work based on the Program, or the modifications to
You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:
@ -232,7 +249,7 @@ terms of section 4, provided that you also meet all of these conditions:
interfaces that do not display Appropriate Legal Notices, your
work need not make them do so.
A compilation of a covered work with other separate and independent
A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
@ -242,9 +259,9 @@ beyond what the individual works permit. Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.
6. Conveying Non-Source Forms.
6. Conveying Non-Source Forms.
You may convey a covered work in object code form under the terms
You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:
@ -290,11 +307,11 @@ in one of these ways:
Source of the work are being offered to the general public at no
charge under subsection 6d.
A separable portion of the object code, whose source code is excluded
A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.
A "User Product" is either (1) a "consumer product", which means any
A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling. In determining whether a product is a consumer product,
@ -307,7 +324,7 @@ is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.
"Installation Information" for a User Product means any methods,
"Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source. The information must
@ -315,7 +332,7 @@ suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.
If you convey an object code work under this section in, or with, or
If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
@ -326,7 +343,7 @@ if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).
The requirement to provide Installation Information does not include a
The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed. Access to a
@ -334,15 +351,15 @@ network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.
Corresponding Source conveyed, and Installation Information provided,
Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.
7. Additional Terms.
7. Additional Terms.
"Additional permissions" are terms that supplement the terms of this
"Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
@ -351,14 +368,14 @@ apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.
When you convey a copy of a covered work, you may at your option
When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it. (Additional permissions may be written to require their own
removal in certain cases when you modify the work.) You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.
Notwithstanding any other provision of this License, for material you
Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:
@ -385,7 +402,7 @@ that material) supplement the terms of this License with terms:
any liability that these contractual assumptions directly impose on
those licensors and authors.
All other non-permissive additional terms are considered "further
All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10. If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
@ -395,46 +412,46 @@ License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.
If you add terms to a covered work in accord with this section, you
If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.
Additional terms, permissive or non-permissive, may be stated in the
Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.
8. Termination.
8. Termination.
You may not propagate or modify a covered work except as expressly
You may not propagate or modify a covered work except as expressly
provided under this License. Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).
However, if you cease all violation of this License, then your
However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.
Moreover, your license from a particular copyright holder is
Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.
Termination of your rights under this section does not terminate the
Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License. If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.
9. Acceptance Not Required for Having Copies.
9. Acceptance Not Required for Having Copies.
You are not required to accept this License in order to receive or
You are not required to accept this License in order to receive or
run a copy of the Program. Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance. However,
@ -443,14 +460,14 @@ modify any covered work. These actions infringe copyright if you do
not accept this License. Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.
10. Automatic Licensing of Downstream Recipients.
10. Automatic Licensing of Downstream Recipients.
Each time you convey a covered work, the recipient automatically
Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License. You are not responsible
for enforcing compliance by third parties with this License.
An "entity transaction" is a transaction transferring control of an
An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations. If propagation of a covered
work results from an entity transaction, each party to that
@ -460,7 +477,7 @@ give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.
You may not impose any further restrictions on the exercise of the
You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License. For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
@ -468,13 +485,13 @@ rights granted under this License, and you may not initiate litigation
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.
11. Patents.
11. Patents.
A "contributor" is a copyright holder who authorizes use under this
A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based. The
work thus licensed is called the contributor's "contributor version".
A contributor's "essential patent claims" are all patent claims
A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
@ -484,19 +501,19 @@ purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.
Each contributor grants you a non-exclusive, worldwide, royalty-free
Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.
In the following three paragraphs, a "patent license" is any express
In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement). To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.
If you convey a covered work, knowingly relying on a patent license,
If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
@ -510,7 +527,7 @@ covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.
If, pursuant to or in connection with a single transaction or
If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
@ -518,7 +535,7 @@ or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.
A patent license is "discriminatory" if it does not include within
A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License. You may not convey a covered
@ -533,13 +550,13 @@ for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.
Nothing in this License shall be construed as excluding or limiting
Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.
12. No Surrender of Others' Freedom.
12. No Surrender of Others' Freedom.
If conditions are imposed on you (whether by court order, agreement or
If conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot convey a
covered work so as to satisfy simultaneously your obligations under this
@ -549,9 +566,9 @@ to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.
13. Use with the GNU Affero General Public License.
13. Use with the GNU Affero General Public License.
Notwithstanding any other provision of this License, you have
Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU Affero General Public License into a single
combined work, and to convey the resulting work. The terms of this
@ -560,14 +577,14 @@ but the special requirements of the GNU Affero General Public License,
section 13, concerning interaction through a network will apply to the
combination as such.
14. Revised Versions of this License.
14. Revised Versions of this License.
The Free Software Foundation may publish revised and/or new versions of
The Free Software Foundation may publish revised and/or new versions of
the GNU General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the
Each version is given a distinguishing version number. If the
Program specifies that a certain numbered version of the GNU General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
@ -576,19 +593,19 @@ Foundation. If the Program does not specify a version number of the
GNU General Public License, you may choose any version ever published
by the Free Software Foundation.
If the Program specifies that a proxy can decide which future
If the Program specifies that a proxy can decide which future
versions of the GNU General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.
Later license versions may give you additional or different
Later license versions may give you additional or different
permissions. However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.
15. Disclaimer of Warranty.
15. Disclaimer of Warranty.
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
@ -597,9 +614,9 @@ PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. Limitation of Liability.
16. Limitation of Liability.
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
@ -609,9 +626,9 @@ PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.
17. Interpretation of Sections 15 and 16.
17. Interpretation of Sections 15 and 16.
If the disclaimer of warranty and limitation of liability provided
If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
@ -619,56 +636,3 @@ Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
Also add information on how to contact you by electronic and paper mail.
If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:
<program> Copyright (C) <year> <name of author>
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, your program's commands
might be different; for a GUI interface, you would use an "about box".
You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU GPL, see
<https://www.gnu.org/licenses/>.
The GNU General Public License does not permit incorporating your program
into proprietary programs. If your program is a subroutine library, you
may consider it more useful to permit linking proprietary applications with
the library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License. But first, please read
<https://www.gnu.org/licenses/why-not-lgpl.html>.

188
README.md
View file

@ -1,110 +1,150 @@
# AdventureLog: Embark, Explore, Remember. 🌍
<div align="center">
_**⚠️ AdventureLog is in early development and is not recommended for production use until version 1.0!**_
<img src="brand/adventurelog.png" alt="logo" width="200" height="auto" />
<h1>AdventureLog</h1>
### _"Never forget an adventure with AdventureLog - Your ultimate travel companion!"_
<p>
The ultimate travel companion for the modern-day explorer.
</p>
---
<h4>
<a href="https://demo.adventurelog.app">View Demo</a>
<span> · </span>
<a href="https://adventurelog.app">Documentation</a>
<span> · </span>
<a href="https://discord.gg/wRbQ9Egr8C">Discord</a>
<span> · </span>
<a href="https://buymeacoffee.com/seanmorley15">Support 💖</a>
</h4>
</div>
# Installation
<br />
# Docker 🐋
<!-- Table of Contents -->
Docker is the preferred way to run AdventureLog on your local machine. It is a lightweight containerization technology that allows you to run applications in isolated environments called containers.
**Note**: This guide mainly focuses on installation with a linux based host machine, but the steps are similar for other operating systems.
# Table of Contents
## Prerequisites
- [About the Project](#-about-the-project)
- [Screenshots](#-screenshots)
- [Tech Stack](#-tech-stack)
- [Features](#-features)
- [Roadmap](#-roadmap)
- [Contributing](#-contributing)
- [License](#-license)
- [Contact](#-contact)
- [Acknowledgements](#-acknowledgements)
- Docker installed on your machine/server. You can learn how to download it [here](https://docs.docker.com/engine/install/).
<!-- About the Project -->
## Getting Started
## ⭐ About the Project
Get the `docker-compose.yml` file from the AdventureLog repository. You can download it from [here](https://github.com/seanmorley15/AdventureLog/blob/main/docker-compose.yml) or run this command to download it directly to your machine:
Starting from a simple idea of tracking travel locations (called adventures), AdventureLog has grown into a full-fledged travel companion. With AdventureLog, you can log your adventures, keep track of where you've been on the world map, plan your next trip collaboratively, and share your experiences with friends and family.
```bash
wget https://raw.githubusercontent.com/seanmorley15/AdventureLog/main/docker-compose.yml
```
AdventureLog was created to solve a problem: the lack of a modern, open-source, user-friendly travel companion. Many existing travel apps are either too complex, too expensive, or too closed-off to be useful for the average traveler. AdventureLog aims to be the opposite: simple, beautiful, and open to everyone.
## Configuration
<!-- Screenshots -->
Here is a summary of the configuration options available in the `docker-compose.yml` file:
### 📷 Screenshots
<!-- make a table with colum name, is required, other -->
<div align="center">
<img src="./brand/screenshots/adventures.png" alt="Adventures" />
<p>Displays the adventures you have visited and the ones you plan to embark on. You can also filter and sort the adventures.</p>
<img src="./brand/screenshots/details.png" alt="Adventure Details" />
<p>Shows specific details about an adventure, including the name, date, location, description, and rating.</p>
<img src="./brand/screenshots/edit.png" alt="Edit Modal" />
<img src="./brand/screenshots/map.png" alt="Adventure Details" />
<p>View all of your adventures on a map, with the ability to filter by visit status and add new ones by click on the map</p>
<img src="./brand/screenshots/dashboard.png" alt="Dashboard" />
<p>Displays a summary of your adventures, including your world travel stats.</p>
<img src="./brand/screenshots/itinerary.png" alt="Itinerary" />
<p>Plan your adventures and travel itinerary with a list of activities and a map view. View your trip in a variety of ways, including an itinerary list, a map view, and a calendar view.</p>
<img src="./brand/screenshots/countries.png" alt="Countries" />
<p>Lists all the countries you have visited and plan to visit, with the ability to filter by visit status.</p>
<img src="./brand/screenshots/regions.png" alt="Regions" />
<p>Displays the regions for a specific country, includes a map view to visually select regions.</p>
</div>
### Frontend Container (web)
<!-- TechStack -->
| Name | Required | Description | Default Value |
| ------------------- | --------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------- |
| `PUBLIC_SERVER_URL` | Yes | What the frontend SSR server uses to connect to the backend. | http://server:8000 |
| `ORIGIN` | Sometimes | Not needed if using HTTPS. If not, set it to the domain of what you will acess the app from. | http://localhost:8080 |
| `BODY_SIZE_LIMIT` | Yes | Used to set the maximum upload size to the server. Should be changed to prevent someone from uploading too much! Custom values must be set in **kiliobytes**. | Infinity |
### 🚀 Tech Stack
### Backend Container (server)
<details>
<summary>Client</summary>
<ul>
<li><a href="https://svelte.dev/">SvelteKit</a></li>
<li><a href="https://tailwindcss.com/">TailwindCSS</a></li>
<li><a href="https://daisyui.com/">DaisyUI</a></li>
<li><a href="https://github.com/dimfeld/svelte-maplibre/">Svelte MapLibre</a></li>
</ul>
</details>
| Name | Required | Description | Default Value |
| ----------------------- | -------- | -------------------------------------------------------------------------------------------------------------------------------------------- | -------------------- |
| `PGHOST` | Yes | Databse host. | db |
| `PGDATABASE` | Yes | Database. | database |
| `PGUSER` | Yes | Database user. | adventure |
| `PGPASSWORD` | Yes | Database password. | changeme123 |
| `DJANGO_ADMIN_USERNAME` | Yes | Default username. | admin |
| `DJANGO_ADMIN_PASSWORD` | Yes | Default password, change after inital login. | admin |
| `DJANGO_ADMIN_EMAIL` | Yes | Default user's email. | admin@example.com |
| `PUBLIC_URL` | Yes | This is the publically accessible url to the **nginx** container. You should be able to acess nginx from this url where you access your app. | http://127.0.0.1:81 |
| `CSRF_TRUSTED_ORIGINS` | Yes | Need to be changed to the orgins where you use your backend server and frontend. These values are comma seperated. | Needs to be changed. |
<details>
<summary>Server</summary>
<ul>
<li><a href="https://www.djangoproject.com/">Django</a></li>
<li><a href="https://postgis.net/">PostGIS</a></li>
<li><a href="https://www.django-rest-framework.org/">Django REST Framework</a></li>
<li><a href="https://allauth.org/">AllAuth</a></li>
</ul>
</details>
<!-- Features -->
### Proxy Container (nginx) Configuration
### 🎯 Features
In order to use media files in a production environment, you need to configure the `nginx` container to serve the media files. The container is already in the docker compose file but you need to do a few things to make it work.
- **Track Your Adventures** 🌍: Log your adventures and keep track of where you've been on the world map.
- Adventures can store a variety of information, including the location, date, and description.
- Adventures can be sorted into custom categories for easy organization.
- Adventures can be marked as private or public, allowing you to share your adventures with friends and family.
- Keep track of the countries and regions you've visited with the world travel book.
- **Plan Your Next Trip** 📃: Take the guesswork out of planning your next adventure with an easy-to-use itinerary planner.
- Itineraries can be created for any number of days and can include multiple destinations.
- Itineraries include many planning features like flight information, notes, checklists, and links to external resources.
- Itineraries can be shared with friends and family for collaborative planning.
- **Share Your Experiences** 📸: Share your adventures with friends and family and collaborate on trips together.
- Adventures and itineraries can be shared via a public link or directly with other AdventureLog users.
- Collaborators can view and edit shared itineraries (collections), making planning a breeze.
1. Create a directory called `proxy` in the same directory as the `docker-compose.yml` file.
2. Create a file called `nginx.conf` in the `proxy` directory.
3. Add the following configuration to the `nginx.conf` file:
<!-- Roadmap -->
```nginx
server {
listen 80;
server_name localhost;
## 🧭 Roadmap
location /media/ {
alias /app/media/;
}
}
```
The AdventureLog Roadmap can be found [here](https://github.com/users/seanmorley15/projects/5)
## Running the Containers
<!-- Contributing -->
To start the containers, run the following command:
## 👋 Contributing
```bash
docker compose up -d
```
<a href="https://github.com/seanmorley15/AdventureLog/graphs/contributors">
<img src="https://contrib.rocks/image?repo=seanmorley15/AdventureLog" />
</a>
Enjoy AdventureLog! 🎉
Contributions are always welcome!
# About AdventureLog
See `contributing.md` for ways to get started.
AdventureLog is a Svelte Kit and Django application that utilizes a PostgreSQL database. Users can log the adventures they have experienced, as well as plan future ones. Key features include:
<!-- License -->
- Logging past adventures with fields like name, date, location, description, and rating.
- Planning future adventures with similar fields.
- Tagging different activity types for better organization.
- Viewing countries, regions, and marking visited regions.
## 📃 License
AdventureLog aims to be your ultimate travel companion, helping you document your adventures and plan new ones effortlessly.
Distributed under the GNU General Public License v3.0. See `LICENSE` for more information.
AdventureLog is licensed under the GNU General Public License v3.0.
<!-- Contact -->
<!-- ## Screenshots 🖼️
## 🤝 Contact
![Visited Log](https://github.com/seanmorley15/AdventureLog/blob/main/brand/screenshots/visited.png?raw=true)
![Planner Log](https://github.com/seanmorley15/AdventureLog/blob/main/brand/screenshots/ideas.png?raw=true)
![Country List](https://github.com/seanmorley15/AdventureLog/blob/main/brand/screenshots/countrylist.png?raw=true)
![Region List for the United States](https://github.com/seanmorley15/AdventureLog/blob/main/brand/screenshots/regions.png?raw=true)
Sean Morley - [website](https://seanmorley.com)
## Roadmap 🛣️
Hi! I'm Sean, the creator of AdventureLog. I'm a college student and software developer with a passion for travel and adventure. I created AdventureLog to help people like me document their adventures and plan new ones effortlessly. As a student, I am always looking for more opportunities to learn and grow, so feel free to reach out via the contact on my website if you would like to collaborate or chat!
- Improved mobile device support
- Password reset functionality
- Improved error handling
- Handling of adventure cards with variable width -->
<!-- Acknowledgments -->
## 💎 Acknowledgements
- Logo Design by [nordtektiger](https://github.com/nordtektiger)
- WorldTravel Dataset [dr5hn/countries-states-cities-database](https://github.com/dr5hn/countries-states-cities-database)
### Top Supporters 💖
- [Veymax](https://x.com/veymax)
- [nebriv](https://github.com/nebriv)
- [Victor Butler](https://x.com/victor_butler)

View file

@ -1 +0,0 @@
http://github.com/iMerica/dj-rest-auth/contributors

View file

@ -1,32 +1,60 @@
# Dockerfile
# Use the official Python slim image as the base image
FROM python:3.13-slim
FROM python:3.10-slim
LABEL Developers="Sean Morley"
# Metadata labels for the AdventureLog image
LABEL maintainer="Sean Morley" \
version="v0.10.0" \
description="AdventureLog — the ultimate self-hosted travel companion." \
org.opencontainers.image.title="AdventureLog" \
org.opencontainers.image.description="AdventureLog is a self-hosted travel companion that helps you plan, track, and share your adventures." \
org.opencontainers.image.version="v0.10.0" \
org.opencontainers.image.authors="Sean Morley" \
org.opencontainers.image.url="https://raw.githubusercontent.com/seanmorley15/AdventureLog/refs/heads/main/brand/banner.png" \
org.opencontainers.image.source="https://github.com/seanmorley15/AdventureLog" \
org.opencontainers.image.vendor="Sean Morley" \
org.opencontainers.image.created="$(date -u +'%Y-%m-%dT%H:%M:%SZ')" \
org.opencontainers.image.licenses="GPL-3.0"
# Set environment variables
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1
ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1
# Set the working directory
WORKDIR /code
# Install system dependencies
# Install system dependencies (Nginx included)
RUN apt-get update \
&& apt-get install -y git postgresql-client \
&& apt-get clean
&& apt-get install -y git postgresql-client gdal-bin libgdal-dev nginx supervisor \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*
# Install Python dependencies
COPY ./server/requirements.txt /code/
RUN pip install --upgrade pip
RUN pip install -r requirements.txt
RUN pip install --upgrade pip \
&& pip install -r requirements.txt
# Create necessary directories
RUN mkdir -p /code/static /code/media
# RUN mkdir -p /code/staticfiles /code/media
# Copy the Django project code into the Docker image
COPY ./server /code/
RUN python3 manage.py collectstatic --verbosity 2
# Copy Nginx configuration
COPY ./nginx.conf /etc/nginx/nginx.conf
# Copy Supervisor configuration
COPY ./supervisord.conf /etc/supervisor/conf.d/supervisord.conf
# Collect static files
RUN python3 manage.py collectstatic --noinput --verbosity 2
# Set the entrypoint script
COPY ./entrypoint.sh /code/entrypoint.sh
RUN chmod +x /code/entrypoint.sh
ENTRYPOINT ["/code/entrypoint.sh"]
# Expose ports for NGINX and Gunicorn
EXPOSE 80 8000
# Command to start Supervisor (which starts Nginx and Gunicorn)
CMD ["supervisord", "-c", "/etc/supervisor/conf.d/supervisord.conf"]

View file

@ -1,21 +0,0 @@
The MIT License (MIT)
Copyright (c) 2014 iMerica https://github.com/iMerica/
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

View file

@ -1,5 +0,0 @@
include AUTHORS
include LICENSE
include MANIFEST.in
include README.md
graft dj_rest_auth

View file

@ -1,4 +0,0 @@
# AdventureLog Django Backend
A demo of a possible AdventureLog 2.0 version using Django as the backend with a REST API.
Based of django-rest-framework and dj-rest-auth.

View file

@ -1,10 +1,32 @@
#!/bin/bash
# Function to check PostgreSQL availability
check_postgres() {
PGPASSWORD=$PGPASSWORD psql -h "$PGHOST" -U "$PGUSER" -d "$PGDATABASE" -c '\q' >/dev/null 2>&1
# Helper to get the first non-empty environment variable
get_env() {
for var in "$@"; do
value="${!var}"
if [ -n "$value" ]; then
echo "$value"
return
fi
done
}
check_postgres() {
local db_host
local db_user
local db_name
local db_pass
db_host=$(get_env PGHOST)
db_user=$(get_env PGUSER POSTGRES_USER)
db_name=$(get_env PGDATABASE POSTGRES_DB)
db_pass=$(get_env PGPASSWORD POSTGRES_PASSWORD)
PGPASSWORD="$db_pass" psql -h "$db_host" -U "$db_user" -d "$db_name" -c '\q' >/dev/null 2>&1
}
# Wait for PostgreSQL to become available
until check_postgres; do
>&2 echo "PostgreSQL is unavailable - sleeping"
@ -13,25 +35,57 @@ done
>&2 echo "PostgreSQL is up - continuing..."
# run sql commands
# psql -h "$PGHOST" -U "$PGUSER" -d "$PGDATABASE" -f /app/backend/init-postgis.sql
# Apply Django migrations
python manage.py migrate
# Check for default data
python manage.py worldtravel-seed
# Create superuser if environment variables are set
if [ -n "$DJANGO_ADMIN_USERNAME" ] && [ -n "$DJANGO_ADMIN_PASSWORD" ]; then
# Create superuser if environment variables are set and there are no users present at all.
if [ -n "$DJANGO_ADMIN_USERNAME" ] && [ -n "$DJANGO_ADMIN_PASSWORD" ] && [ -n "$DJANGO_ADMIN_EMAIL" ]; then
echo "Creating superuser..."
python manage.py shell << EOF
from django.contrib.auth import get_user_model
from allauth.account.models import EmailAddress
User = get_user_model()
# Check if the user already exists
if not User.objects.filter(username='$DJANGO_ADMIN_USERNAME').exists():
User.objects.create_superuser('$DJANGO_ADMIN_USERNAME', '$DJANGO_ADMIN_EMAIL', '$DJANGO_ADMIN_PASSWORD')
# Create the superuser
superuser = User.objects.create_superuser(
username='$DJANGO_ADMIN_USERNAME',
email='$DJANGO_ADMIN_EMAIL',
password='$DJANGO_ADMIN_PASSWORD'
)
print("Superuser created successfully.")
# Create the EmailAddress object for AllAuth
EmailAddress.objects.create(
user=superuser,
email='$DJANGO_ADMIN_EMAIL',
verified=True,
primary=True
)
print("EmailAddress object created successfully for AllAuth.")
else:
print("Superuser already exists.")
EOF
fi
# Start Django server
python manage.py runserver 0.0.0.0:8000
# Sync the countries and world travel regions
# Sync the countries and world travel regions
python manage.py download-countries
if [ $? -eq 137 ]; then
>&2 echo "WARNING: The download-countries command was interrupted. This is likely due to lack of memory allocated to the container or the host. Please try again with more memory."
exit 1
fi
cat /code/adventurelog.txt
# Start Gunicorn in foreground
exec gunicorn main.wsgi:application \
--bind [::]:8000 \
--workers 2 \
--timeout 120

42
backend/nginx.conf Normal file
View file

@ -0,0 +1,42 @@
worker_processes 1;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
client_max_body_size 100M;
# The backend is running in the same container, so reference localhost
upstream django {
server 127.0.0.1:8000; # Use localhost to point to Gunicorn running internally
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://django; # Forward to the upstream block
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
location /static/ {
alias /code/staticfiles/; # Serve static files directly
}
# Serve protected media files with X-Accel-Redirect
location /protectedMedia/ {
internal; # Only internal requests are allowed
alias /code/media/; # This should match Django MEDIA_ROOT
try_files $uri =404; # Return a 404 if the file doesn't exist
# Security headers for all protected files
add_header Content-Security-Policy "default-src 'self'; script-src 'none'; object-src 'none'; base-uri 'none'" always;
add_header X-Content-Type-Options nosniff always;
add_header X-Frame-Options SAMEORIGIN always;
add_header X-XSS-Protection "1; mode=block" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
}
}
}

View file

@ -8,3 +8,29 @@ SECRET_KEY='pleasechangethisbecauseifyoudontitwillbeverybadandyouwillgethackedin
PUBLIC_URL='http://127.0.0.1:8000'
DEBUG=True
FRONTEND_URL='http://localhost:3000'
EMAIL_BACKEND='console'
# EMAIL_BACKEND='email'
# EMAIL_HOST='smtp.gmail.com'
# EMAIL_USE_TLS=False
# EMAIL_PORT=587
# EMAIL_USE_SSL=True
# EMAIL_HOST_USER='user'
# EMAIL_HOST_PASSWORD='password'
# DEFAULT_FROM_EMAIL='user@example.com'
# GOOGLE_MAPS_API_KEY='key'
# ------------------- #
# For Developers to start a Demo Database
# docker run --name adventurelog-development -e POSTGRES_USER=admin -e POSTGRES_PASSWORD=admin -e POSTGRES_DB=adventurelog -p 5432:5432 -d postgis/postgis:15-3.3
# PGHOST='localhost'
# PGDATABASE='adventurelog'
# PGUSER='admin'
# PGPASSWORD='admin'
# ------------------- #

View file

@ -0,0 +1,9 @@
from django.contrib import admin
from allauth.account.decorators import secure_admin_login
from achievements.models import Achievement, UserAchievement
admin.autodiscover()
admin.site.login = secure_admin_login(admin.site.login)
admin.site.register(Achievement)
admin.site.register(UserAchievement)

View file

@ -0,0 +1,6 @@
from django.apps import AppConfig
class AchievementsConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'achievements'

View file

@ -0,0 +1,66 @@
import json
from django.core.management.base import BaseCommand
from achievements.models import Achievement
US_STATE_CODES = [
'US-AL', 'US-AK', 'US-AZ', 'US-AR', 'US-CA', 'US-CO', 'US-CT', 'US-DE',
'US-FL', 'US-GA', 'US-HI', 'US-ID', 'US-IL', 'US-IN', 'US-IA', 'US-KS',
'US-KY', 'US-LA', 'US-ME', 'US-MD', 'US-MA', 'US-MI', 'US-MN', 'US-MS',
'US-MO', 'US-MT', 'US-NE', 'US-NV', 'US-NH', 'US-NJ', 'US-NM', 'US-NY',
'US-NC', 'US-ND', 'US-OH', 'US-OK', 'US-OR', 'US-PA', 'US-RI', 'US-SC',
'US-SD', 'US-TN', 'US-TX', 'US-UT', 'US-VT', 'US-VA', 'US-WA', 'US-WV',
'US-WI', 'US-WY'
]
ACHIEVEMENTS = [
{
"name": "First Adventure",
"key": "achievements.first_adventure",
"type": "adventure_count",
"description": "Log your first adventure!",
"condition": {"type": "adventure_count", "value": 1},
},
{
"name": "Explorer",
"key": "achievements.explorer",
"type": "adventure_count",
"description": "Log 10 adventures.",
"condition": {"type": "adventure_count", "value": 10},
},
{
"name": "Globetrotter",
"key": "achievements.globetrotter",
"type": "country_count",
"description": "Visit 5 different countries.",
"condition": {"type": "country_count", "value": 5},
},
{
"name": "American Dream",
"key": "achievements.american_dream",
"type": "country_count",
"description": "Visit all 50 states in the USA.",
"condition": {"type": "country_count", "items": US_STATE_CODES},
}
]
class Command(BaseCommand):
help = "Seeds the database with predefined achievements"
def handle(self, *args, **kwargs):
for achievement_data in ACHIEVEMENTS:
achievement, created = Achievement.objects.update_or_create(
name=achievement_data["name"],
defaults={
"description": achievement_data["description"],
"condition": json.dumps(achievement_data["condition"]),
"type": achievement_data["type"],
"key": achievement_data["key"],
},
)
if created:
self.stdout.write(self.style.SUCCESS(f"✅ Created: {achievement.name}"))
else:
self.stdout.write(self.style.WARNING(f"🔄 Updated: {achievement.name}"))

View file

@ -0,0 +1,34 @@
import uuid
from django.db import models
from django.contrib.auth import get_user_model
User = get_user_model()
VALID_ACHIEVEMENT_TYPES = [
"adventure_count",
"country_count",
]
class Achievement(models.Model):
"""Stores all possible achievements"""
name = models.CharField(max_length=255, unique=True)
key = models.CharField(max_length=255, unique=True, default='achievements.other') # Used for frontend lookups, e.g. "achievements.first_adventure"
type = models.CharField(max_length=255, choices=[(tag, tag) for tag in VALID_ACHIEVEMENT_TYPES], default='adventure_count') # adventure_count, country_count, etc.
description = models.TextField()
icon = models.ImageField(upload_to="achievements/", null=True, blank=True)
condition = models.JSONField() # Stores rules like {"type": "adventure_count", "value": 10}
def __str__(self):
return self.name
class UserAchievement(models.Model):
"""Tracks which achievements a user has earned"""
user = models.ForeignKey(User, on_delete=models.CASCADE)
achievement = models.ForeignKey(Achievement, on_delete=models.CASCADE)
earned_at = models.DateTimeField(auto_now_add=True)
class Meta:
unique_together = ("user", "achievement") # Prevent duplicates
def __str__(self):
return f"{self.user.username} - {self.achievement.name}"

View file

@ -0,0 +1,3 @@
from django.test import TestCase
# Create your tests here.

View file

@ -0,0 +1,3 @@
from django.shortcuts import render
# Create your views here.

View file

@ -0,0 +1,7 @@
█████╗ ██████╗ ██╗ ██╗███████╗███╗ ██╗████████╗██╗ ██╗██████╗ ███████╗██╗ ██████╗ ██████╗
██╔══██╗██╔══██╗██║ ██║██╔════╝████╗ ██║╚══██╔══╝██║ ██║██╔══██╗██╔════╝██║ ██╔═══██╗██╔════╝
███████║██║ ██║██║ ██║█████╗ ██╔██╗ ██║ ██║ ██║ ██║██████╔╝█████╗ ██║ ██║ ██║██║ ███╗
██╔══██║██║ ██║╚██╗ ██╔╝██╔══╝ ██║╚██╗██║ ██║ ██║ ██║██╔══██╗██╔══╝ ██║ ██║ ██║██║ ██║
██║ ██║██████╔╝ ╚████╔╝ ███████╗██║ ╚████║ ██║ ╚██████╔╝██║ ██║███████╗███████╗╚██████╔╝╚██████╔╝
╚═╝ ╚═╝╚═════╝ ╚═══╝ ╚══════╝╚═╝ ╚═══╝ ╚═╝ ╚═════╝ ╚═╝ ╚═╝╚══════╝╚══════╝ ╚═════╝ ╚═════╝
“The world is full of wonderful things you haven't seen yet. Don't ever give up on the chance of seeing them.” - J.K. Rowling

View file

@ -1,28 +1,53 @@
import os
from django.contrib import admin
from django.utils.html import mark_safe
from .models import Adventure, Collection
from worldtravel.models import Country, Region, VisitedRegion
from .models import Adventure, Checklist, ChecklistItem, Collection, Transportation, Note, AdventureImage, Visit, Category, Attachment, Lodging
from worldtravel.models import Country, Region, VisitedRegion, City, VisitedCity
from allauth.account.decorators import secure_admin_login
admin.autodiscover()
admin.site.login = secure_admin_login(admin.site.login)
@admin.action(description="Trigger geocoding")
def trigger_geocoding(modeladmin, request, queryset):
count = 0
for adventure in queryset:
try:
adventure.save() # Triggers geocoding logic in your model
count += 1
except Exception as e:
modeladmin.message_user(request, f"Error geocoding {adventure}: {e}", level='error')
modeladmin.message_user(request, f"Geocoding triggered for {count} adventures.", level='success')
class AdventureAdmin(admin.ModelAdmin):
list_display = ('name', 'type', 'user_id', 'date', 'is_public', 'image_display')
list_filter = ('type', 'user_id', 'is_public')
list_display = ('name', 'get_category', 'get_visit_count', 'user_id', 'is_public')
list_filter = ( 'user_id', 'is_public')
search_fields = ('name',)
readonly_fields = ('city', 'region', 'country')
actions = [trigger_geocoding]
def image_display(self, obj):
if obj.image:
public_url = os.environ.get('PUBLIC_URL', 'http://127.0.0.1:8000').rstrip('/')
public_url = public_url.replace("'", "")
return mark_safe(f'<img src="{public_url}/media/{obj.image.name}" width="100px" height="100px"')
def get_category(self, obj):
if obj.category and obj.category.display_name and obj.category.icon:
return obj.category.display_name + ' ' + obj.category.icon
elif obj.category and obj.category.name:
return obj.category.name
else:
return
return 'No Category'
image_display.short_description = 'Image Preview'
get_category.short_description = 'Category'
def get_visit_count(self, obj):
return obj.visits.count()
get_visit_count.short_description = 'Visit Count'
class CountryAdmin(admin.ModelAdmin):
list_display = ('name', 'country_code', 'continent', 'number_of_regions')
list_filter = ('continent', 'country_code')
list_display = ('name', 'country_code', 'number_of_regions')
list_filter = ('subregion',)
search_fields = ('name', 'country_code')
def number_of_regions(self, obj):
return Region.objects.filter(country=obj).count()
@ -32,6 +57,8 @@ class CountryAdmin(admin.ModelAdmin):
class RegionAdmin(admin.ModelAdmin):
list_display = ('name', 'country', 'number_of_visits')
list_filter = ('country',)
search_fields = ('name', 'country__name')
# list_filter = ('country', 'number_of_visits')
def number_of_visits(self, obj):
@ -39,15 +66,27 @@ class RegionAdmin(admin.ModelAdmin):
number_of_visits.short_description = 'Number of Visits'
class CityAdmin(admin.ModelAdmin):
list_display = ('name', 'region', 'country')
list_filter = ('region', 'region__country')
search_fields = ('name', 'region__name', 'region__country__name')
def country(self, obj):
return obj.region.country.name
country.short_description = 'Country'
from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from users.models import CustomUser
class CustomUserAdmin(UserAdmin):
model = CustomUser
list_display = ['username', 'email', 'is_staff', 'is_active', 'image_display']
list_display = ['username', 'is_staff', 'is_active', 'image_display']
readonly_fields = ('uuid',)
search_fields = ('username',)
fieldsets = UserAdmin.fieldsets + (
(None, {'fields': ('profile_pic',)}),
(None, {'fields': ('profile_pic', 'uuid', 'public_profile', 'disable_password')}),
)
def image_display(self, obj):
if obj.profile_pic:
@ -57,15 +96,63 @@ class CustomUserAdmin(UserAdmin):
else:
return
class AdventureImageAdmin(admin.ModelAdmin):
list_display = ('user_id', 'image_display')
def image_display(self, obj):
if obj.image:
public_url = os.environ.get('PUBLIC_URL', 'http://127.0.0.1:8000').rstrip('/')
public_url = public_url.replace("'", "")
return mark_safe(f'<img src="{public_url}/media/{obj.image.name}" width="100px" height="100px"')
else:
return
class VisitAdmin(admin.ModelAdmin):
list_display = ('adventure', 'start_date', 'end_date', 'notes')
list_filter = ('start_date', 'end_date')
search_fields = ('notes',)
def image_display(self, obj):
if obj.image: # Ensure this field matches your model's image field
public_url = os.environ.get('PUBLIC_URL', 'http://127.0.0.1:8000').rstrip('/')
public_url = public_url.replace("'", "")
return mark_safe(f'<img src="{public_url}/media/{obj.image.name}" width="100px" height="100px"')
else:
return
image_display.short_description = 'Image Preview'
class CategoryAdmin(admin.ModelAdmin):
list_display = ('name', 'user_id', 'display_name', 'icon')
search_fields = ('name', 'display_name')
class CollectionAdmin(admin.ModelAdmin):
list_display = ('name', 'user_id', 'is_public')
admin.site.register(CustomUser, CustomUserAdmin)
admin.site.register(Adventure, AdventureAdmin)
admin.site.register(Collection, CollectionAdmin)
admin.site.register(Visit, VisitAdmin)
admin.site.register(Country, CountryAdmin)
admin.site.register(Region, RegionAdmin)
admin.site.register(VisitedRegion)
admin.site.register(Collection)
admin.site.register(Transportation)
admin.site.register(Note)
admin.site.register(Checklist)
admin.site.register(ChecklistItem)
admin.site.register(AdventureImage, AdventureImageAdmin)
admin.site.register(Category, CategoryAdmin)
admin.site.register(City, CityAdmin)
admin.site.register(VisitedCity)
admin.site.register(Attachment)
admin.site.register(Lodging)
admin.site.site_header = 'AdventureLog Admin'
admin.site.site_title = 'AdventureLog Admin Site'

View file

@ -1,6 +1,8 @@
from django.apps import AppConfig
class AdventuresConfig(AppConfig):
default_auto_field = "django.db.models.BigAutoField"
name = "adventures"
default_auto_field = 'django.db.models.BigAutoField'
name = 'adventures'
def ready(self):
import adventures.signals # Import signals when the app is ready

View file

@ -0,0 +1,273 @@
import requests
import time
import socket
from worldtravel.models import Region, City, VisitedRegion, VisitedCity
from django.conf import settings
# -----------------
# SEARCHING
def search_google(query):
try:
api_key = settings.GOOGLE_MAPS_API_KEY
if not api_key:
return {"error": "Missing Google Maps API key"}
# Updated to use the new Places API (New) endpoint
url = "https://places.googleapis.com/v1/places:searchText"
headers = {
'Content-Type': 'application/json',
'X-Goog-Api-Key': api_key,
'X-Goog-FieldMask': 'places.displayName.text,places.formattedAddress,places.location,places.types,places.rating,places.userRatingCount'
}
payload = {
"textQuery": query,
"maxResultCount": 20 # Adjust as needed
}
response = requests.post(url, json=payload, headers=headers, timeout=(2, 5))
response.raise_for_status()
data = response.json()
# Check if we have places in the response
places = data.get("places", [])
if not places:
return {"error": "No results found"}
results = []
for place in places:
location = place.get("location", {})
types = place.get("types", [])
primary_type = types[0] if types else None
category = _extract_google_category(types)
addresstype = _infer_addresstype(primary_type)
importance = None
rating = place.get("rating")
ratings_total = place.get("userRatingCount")
if rating is not None and ratings_total:
importance = round(float(rating) * ratings_total / 100, 2)
# Extract display name from the new API structure
display_name_obj = place.get("displayName", {})
name = display_name_obj.get("text") if display_name_obj else None
results.append({
"lat": location.get("latitude"),
"lon": location.get("longitude"),
"name": name,
"display_name": place.get("formattedAddress"),
"type": primary_type,
"category": category,
"importance": importance,
"addresstype": addresstype,
"powered_by": "google",
})
if results:
results.sort(key=lambda r: r["importance"] if r["importance"] is not None else 0, reverse=True)
return results
except requests.exceptions.RequestException as e:
return {"error": "Network error while contacting Google Maps", "details": str(e)}
except Exception as e:
return {"error": "Unexpected error during Google search", "details": str(e)}
def _extract_google_category(types):
# Basic category inference based on common place types
if not types:
return None
if "restaurant" in types:
return "food"
if "lodging" in types:
return "accommodation"
if "park" in types or "natural_feature" in types:
return "nature"
if "museum" in types or "tourist_attraction" in types:
return "attraction"
if "locality" in types or "administrative_area_level_1" in types:
return "region"
return types[0] # fallback to first type
def _infer_addresstype(type_):
# Rough mapping of Google place types to OSM-style addresstypes
mapping = {
"locality": "city",
"sublocality": "neighborhood",
"administrative_area_level_1": "region",
"administrative_area_level_2": "county",
"country": "country",
"premise": "building",
"point_of_interest": "poi",
"route": "road",
"street_address": "address",
}
return mapping.get(type_, None)
def search_osm(query):
url = f"https://nominatim.openstreetmap.org/search?q={query}&format=jsonv2"
headers = {'User-Agent': 'AdventureLog Server'}
response = requests.get(url, headers=headers)
data = response.json()
return [{
"lat": item.get("lat"),
"lon": item.get("lon"),
"name": item.get("name"),
"display_name": item.get("display_name"),
"type": item.get("type"),
"category": item.get("category"),
"importance": item.get("importance"),
"addresstype": item.get("addresstype"),
"powered_by": "nominatim",
} for item in data]
# -----------------
# REVERSE GEOCODING
# -----------------
def extractIsoCode(user, data):
"""
Extract the ISO code from the response data.
Returns a dictionary containing the region name, country name, and ISO code if found.
"""
iso_code = None
town_city_or_county = None
display_name = None
country_code = None
city = None
visited_city = None
location_name = None
# town = None
# city = None
# county = None
if 'name' in data.keys():
location_name = data['name']
if 'address' in data.keys():
keys = data['address'].keys()
for key in keys:
if key.find("ISO") != -1:
iso_code = data['address'][key]
if 'town' in keys:
town_city_or_county = data['address']['town']
if 'county' in keys:
town_city_or_county = data['address']['county']
if 'city' in keys:
town_city_or_county = data['address']['city']
if not iso_code:
return {"error": "No region found"}
region = Region.objects.filter(id=iso_code).first()
visited_region = VisitedRegion.objects.filter(region=region, user_id=user).first()
region_visited = False
city_visited = False
country_code = iso_code[:2]
if region:
if town_city_or_county:
display_name = f"{town_city_or_county}, {region.name}, {country_code}"
city = City.objects.filter(name__contains=town_city_or_county, region=region).first()
visited_city = VisitedCity.objects.filter(city=city, user_id=user).first()
if visited_region:
region_visited = True
if visited_city:
city_visited = True
if region:
return {"region_id": iso_code, "region": region.name, "country": region.country.name, "country_id": region.country.country_code, "region_visited": region_visited, "display_name": display_name, "city": city.name if city else None, "city_id": city.id if city else None, "city_visited": city_visited, 'location_name': location_name}
return {"error": "No region found"}
def is_host_resolvable(hostname: str) -> bool:
try:
socket.gethostbyname(hostname)
return True
except socket.error:
return False
def reverse_geocode(lat, lon, user):
if getattr(settings, 'GOOGLE_MAPS_API_KEY', None):
return reverse_geocode_google(lat, lon, user)
return reverse_geocode_osm(lat, lon, user)
def reverse_geocode_osm(lat, lon, user):
url = f"https://nominatim.openstreetmap.org/reverse?format=jsonv2&lat={lat}&lon={lon}"
headers = {'User-Agent': 'AdventureLog Server'}
connect_timeout = 1
read_timeout = 5
if not is_host_resolvable("nominatim.openstreetmap.org"):
return {"error": "DNS resolution failed"}
try:
response = requests.get(url, headers=headers, timeout=(connect_timeout, read_timeout))
response.raise_for_status()
data = response.json()
return extractIsoCode(user, data)
except Exception:
return {"error": "An internal error occurred while processing the request"}
def reverse_geocode_google(lat, lon, user):
api_key = settings.GOOGLE_MAPS_API_KEY
# Updated to use the new Geocoding API endpoint (this one is still supported)
# The Geocoding API is separate from Places API and still uses the old format
url = "https://maps.googleapis.com/maps/api/geocode/json"
params = {"latlng": f"{lat},{lon}", "key": api_key}
try:
response = requests.get(url, params=params)
response.raise_for_status()
data = response.json()
if data.get("status") != "OK":
return {"error": "Geocoding failed"}
# Convert Google schema to Nominatim-style for extractIsoCode
first_result = data.get("results", [])[0]
result_data = {
"name": first_result.get("formatted_address"),
"address": _parse_google_address_components(first_result.get("address_components", []))
}
return extractIsoCode(user, result_data)
except Exception:
return {"error": "An internal error occurred while processing the request"}
def _parse_google_address_components(components):
parsed = {}
country_code = None
state_code = None
for comp in components:
types = comp.get("types", [])
long_name = comp.get("long_name")
short_name = comp.get("short_name")
if "country" in types:
parsed["country"] = long_name
country_code = short_name
parsed["ISO3166-1"] = short_name
if "administrative_area_level_1" in types:
parsed["state"] = long_name
state_code = short_name
if "administrative_area_level_2" in types:
parsed["county"] = long_name
if "locality" in types:
parsed["city"] = long_name
if "sublocality" in types:
parsed["town"] = long_name
# Build composite ISO 3166-2 code like US-ME
if country_code and state_code:
parsed["ISO3166-2-lvl1"] = f"{country_code}-{state_code}"
return parsed

View file

@ -0,0 +1,17 @@
from django.db import models
from django.db.models import Q
class AdventureManager(models.Manager):
def retrieve_adventures(self, user, include_owned=False, include_shared=False, include_public=False):
query = Q()
if include_owned:
query |= Q(user_id=user)
if include_shared:
query |= Q(collections__shared_with=user)
if include_public:
query |= Q(is_public=True)
return self.filter(query).distinct()

View file

@ -1,13 +1,40 @@
class AppVersionMiddleware:
from django.conf import settings
from django.utils.deprecation import MiddlewareMixin
import os
class OverrideHostMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
# Process request (if needed)
public_url = os.getenv('PUBLIC_URL', None)
if public_url:
# Extract host and scheme
scheme, host = public_url.split("://")
request.META['HTTP_HOST'] = host
request.META['wsgi.url_scheme'] = scheme
# Set X-Forwarded-Proto for Django
request.META['HTTP_X_FORWARDED_PROTO'] = scheme
response = self.get_response(request)
# Add custom header to response
# Replace with your app version
response['X-AdventureLog-Version'] = '1.0.0'
return response
class XSessionTokenMiddleware(MiddlewareMixin):
def process_request(self, request):
session_token = request.headers.get('X-Session-Token')
if session_token:
request.COOKIES[settings.SESSION_COOKIE_NAME] = session_token
class DisableCSRFForSessionTokenMiddleware(MiddlewareMixin):
def process_request(self, request):
if 'X-Session-Token' in request.headers:
setattr(request, '_dont_enforce_csrf_checks', True)
class DisableCSRFForMobileLoginSignup(MiddlewareMixin):
def process_request(self, request):
is_mobile = request.headers.get('X-Is-Mobile', '').lower() == 'true'
is_login_or_signup = request.path in ['/auth/browser/v1/auth/login', '/auth/browser/v1/auth/signup']
if is_mobile and is_login_or_signup:
setattr(request, '_dont_enforce_csrf_checks', True)

View file

@ -1,4 +1,4 @@
# Generated by Django 5.0.6 on 2024-07-18 15:06
# Generated by Django 5.0.8 on 2024-08-15 23:20
import django_resized.forms
from django.db import migrations
@ -7,11 +7,11 @@ from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('adventures', '0008_collection_description'),
('adventures', 'migrate_images'),
]
operations = [
migrations.AlterField(
migrations.AddField(
model_name='adventure',
name='image',
field=django_resized.forms.ResizedImageField(blank=True, crop=None, force_format='WEBP', keep_meta=True, null=True, quality=75, scale=None, size=[1920, 1080], upload_to='images/'),

View file

@ -1,6 +1,10 @@
# Generated by Django 5.0.6 on 2024-06-28 01:01
# Generated by Django 5.0.8 on 2024-08-11 13:37
import django.contrib.postgres.fields
import django.db.models.deletion
import django_resized.forms
import uuid
from django.conf import settings
from django.db import migrations, models
@ -9,23 +13,109 @@ class Migration(migrations.Migration):
initial = True
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]
operations = [
migrations.CreateModel(
name='Checklist',
fields=[
('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False, unique=True)),
('name', models.CharField(max_length=200)),
('date', models.DateField(blank=True, null=True)),
('is_public', models.BooleanField(default=False)),
('created_at', models.DateTimeField(auto_now_add=True)),
('updated_at', models.DateTimeField(auto_now=True)),
('user_id', models.ForeignKey(default=1, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
],
),
migrations.CreateModel(
name='ChecklistItem',
fields=[
('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False, unique=True)),
('name', models.CharField(max_length=200)),
('is_checked', models.BooleanField(default=False)),
('created_at', models.DateTimeField(auto_now_add=True)),
('updated_at', models.DateTimeField(auto_now=True)),
('checklist', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='adventures.checklist')),
('user_id', models.ForeignKey(default=1, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
],
),
migrations.CreateModel(
name='Collection',
fields=[
('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False, unique=True)),
('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)),
('start_date', models.DateField(blank=True, null=True)),
('end_date', models.DateField(blank=True, null=True)),
('updated_at', models.DateTimeField(auto_now=True)),
('is_archived', models.BooleanField(default=False)),
('user_id', models.ForeignKey(default=1, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
],
),
migrations.AddField(
model_name='checklist',
name='collection',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='adventures.collection'),
),
migrations.CreateModel(
name='Adventure',
fields=[
('id', models.AutoField(primary_key=True, serialize=False)),
('type', models.CharField(max_length=100)),
('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False, unique=True)),
('type', models.CharField(choices=[('visited', 'Visited'), ('planned', 'Planned'), ('lodging', 'Lodging'), ('dining', 'Dining')], max_length=100)),
('name', models.CharField(max_length=200)),
('location', models.CharField(blank=True, max_length=200, null=True)),
('activity_types', django.contrib.postgres.fields.ArrayField(base_field=models.CharField(max_length=100), blank=True, null=True, size=None)),
('description', models.TextField(blank=True, null=True)),
('rating', models.FloatField(blank=True, null=True)),
('link', models.URLField(blank=True, null=True)),
('image', models.ImageField(blank=True, null=True, upload_to='images/')),
('image', django_resized.forms.ResizedImageField(blank=True, crop=None, force_format='WEBP', keep_meta=True, null=True, quality=75, scale=None, size=[1920, 1080], upload_to='images/')),
('date', models.DateField(blank=True, null=True)),
('trip_id', models.IntegerField(blank=True, null=True)),
('is_public', models.BooleanField(default=False)),
('longitude', models.DecimalField(blank=True, decimal_places=6, max_digits=9, null=True)),
('latitude', models.DecimalField(blank=True, decimal_places=6, max_digits=9, null=True)),
('created_at', models.DateTimeField(auto_now_add=True)),
('updated_at', models.DateTimeField(auto_now=True)),
('user_id', models.ForeignKey(default=1, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
('collection', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='adventures.collection')),
],
),
migrations.CreateModel(
name='Note',
fields=[
('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False, unique=True)),
('name', models.CharField(max_length=200)),
('content', models.TextField(blank=True, null=True)),
('links', django.contrib.postgres.fields.ArrayField(base_field=models.URLField(), blank=True, null=True, size=None)),
('date', models.DateField(blank=True, null=True)),
('is_public', models.BooleanField(default=False)),
('created_at', models.DateTimeField(auto_now_add=True)),
('updated_at', models.DateTimeField(auto_now=True)),
('collection', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='adventures.collection')),
('user_id', models.ForeignKey(default=1, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
],
),
migrations.CreateModel(
name='Transportation',
fields=[
('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False, unique=True)),
('type', models.CharField(choices=[('car', 'Car'), ('plane', 'Plane'), ('train', 'Train'), ('bus', 'Bus'), ('boat', 'Boat'), ('bike', 'Bike'), ('walking', 'Walking'), ('other', 'Other')], max_length=100)),
('name', models.CharField(max_length=200)),
('description', models.TextField(blank=True, null=True)),
('rating', models.FloatField(blank=True, null=True)),
('link', models.URLField(blank=True, null=True)),
('date', models.DateTimeField(blank=True, null=True)),
('flight_number', models.CharField(blank=True, max_length=100, null=True)),
('from_location', models.CharField(blank=True, max_length=200, null=True)),
('to_location', models.CharField(blank=True, max_length=200, null=True)),
('is_public', models.BooleanField(default=False)),
('created_at', models.DateTimeField(auto_now_add=True)),
('updated_at', models.DateTimeField(auto_now=True)),
('collection', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='adventures.collection')),
('user_id', models.ForeignKey(default=1, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
],
),
]

View file

@ -0,0 +1,27 @@
# Generated by Django 5.0.8 on 2024-08-15 23:17
import django.db.models.deletion
import django_resized.forms
import uuid
from django.conf import settings
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('adventures', '0001_initial'),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]
operations = [
migrations.CreateModel(
name='AdventureImage',
fields=[
('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False, unique=True)),
('image', django_resized.forms.ResizedImageField(crop=None, force_format='WEBP', keep_meta=True, quality=75, scale=None, size=[1920, 1080], upload_to='images/')),
('adventure', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='adventures.adventure')),
('user_id', models.ForeignKey(default=1, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
],
),
]

View file

@ -0,0 +1,19 @@
# Generated by Django 5.0.8 on 2024-08-15 23:31
import django.db.models.deletion
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('adventures', '0001_adventure_image'),
]
operations = [
migrations.AlterField(
model_name='adventureimage',
name='adventure',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='images', to='adventures.adventure'),
),
]

View file

@ -1,23 +0,0 @@
# Generated by Django 5.0.6 on 2024-06-28 01:01
import django.db.models.deletion
from django.conf import settings
from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = [
('adventures', '0001_initial'),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]
operations = [
migrations.AddField(
model_name='adventure',
name='user_id',
field=models.ForeignKey(default=1, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL),
),
]

View file

@ -1,4 +1,4 @@
# Generated by Django 5.0.6 on 2024-07-19 12:55
# Generated by Django 5.0.8 on 2024-08-18 16:16
from django.db import migrations, models
@ -6,13 +6,13 @@ from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('adventures', '0010_adventure_created_at_collection_created_at'),
('adventures', '0002_alter_adventureimage_adventure'),
]
operations = [
migrations.AddField(
model_name='adventure',
name='updated_at',
field=models.DateTimeField(auto_now=True),
name='end_date',
field=models.DateField(blank=True, null=True),
),
]

View file

@ -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),
),
]

View file

@ -0,0 +1,20 @@
# Generated by Django 5.0.8 on 2024-09-02 13:21
from django.conf import settings
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('adventures', '0004_transportation_end_date'),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]
operations = [
migrations.AddField(
model_name='collection',
name='shared_with',
field=models.ManyToManyField(blank=True, related_name='shared_with', to=settings.AUTH_USER_MODEL),
),
]

View file

@ -1,37 +0,0 @@
# Generated by Django 5.0.6 on 2024-07-09 16:49
import django.db.models.deletion
from django.conf import settings
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('adventures', '0004_adventure_latitude_adventure_longitude'),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]
operations = [
migrations.RemoveField(
model_name='adventure',
name='trip_id',
),
migrations.CreateModel(
name='Trip',
fields=[
('id', models.AutoField(primary_key=True, serialize=False)),
('name', models.CharField(max_length=200)),
('type', models.CharField(max_length=100)),
('location', models.CharField(blank=True, max_length=200, null=True)),
('date', models.DateField(blank=True, null=True)),
('is_public', models.BooleanField(default=False)),
('user_id', models.ForeignKey(default=1, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
],
),
migrations.AddField(
model_name='adventure',
name='trip',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='adventures.trip'),
),
]

View file

@ -0,0 +1,18 @@
# Generated by Django 5.0.8 on 2024-09-17 14:18
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('adventures', '0005_collection_shared_with'),
]
operations = [
migrations.AlterField(
model_name='adventure',
name='link',
field=models.URLField(blank=True, max_length=2083, null=True),
),
]

View file

@ -1,23 +0,0 @@
# Generated by Django 5.0.6 on 2024-07-09 16:58
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('adventures', '0005_remove_adventure_trip_id_trip_adventure_trip'),
]
operations = [
migrations.AlterField(
model_name='adventure',
name='type',
field=models.CharField(choices=[('visited', 'Visited'), ('planned', 'Planned'), ('featured', 'Featured')], max_length=100),
),
migrations.AlterField(
model_name='trip',
name='type',
field=models.CharField(choices=[('visited', 'Visited'), ('planned', 'Planned'), ('featured', 'Featured')], max_length=100),
),
]

View file

@ -1,42 +0,0 @@
# Generated by Django 5.0.6 on 2024-07-15 12:57
import django.db.models.deletion
from django.conf import settings
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('adventures', '0006_alter_adventure_type_alter_trip_type'),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]
operations = [
migrations.RemoveField(
model_name='adventure',
name='trip',
),
migrations.AlterField(
model_name='adventure',
name='type',
field=models.CharField(choices=[('visited', 'Visited'), ('planned', 'Planned')], max_length=100),
),
migrations.CreateModel(
name='Collection',
fields=[
('id', models.AutoField(primary_key=True, serialize=False)),
('name', models.CharField(max_length=200)),
('is_public', models.BooleanField(default=False)),
('user_id', models.ForeignKey(default=1, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
],
),
migrations.AddField(
model_name='adventure',
name='collection',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='adventures.collection'),
),
migrations.DeleteModel(
name='Trip',
),
]

View file

@ -0,0 +1,32 @@
# Generated by Django 5.0.8 on 2024-09-23 18:06
import django.db.models.deletion
import uuid
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('adventures', '0006_alter_adventure_link'),
]
operations = [
migrations.AlterField(
model_name='adventure',
name='type',
field=models.CharField(choices=[('general', 'General 🌍'), ('Outdoor', 'Outdoor 🏞️'), ('lodging', 'Lodging 🛌'), ('dining', 'Dining 🍽️'), ('activity', 'Activity 🏄'), ('attraction', 'Attraction 🎢'), ('shopping', 'Shopping 🛍️'), ('nightlife', 'Nightlife 🌃'), ('event', 'Event 🎉'), ('transportation', 'Transportation 🚗'), ('culture', 'Culture 🎭'), ('water_sports', 'Water Sports 🚤'), ('hiking', 'Hiking 🥾'), ('wildlife', 'Wildlife 🦒'), ('historical_sites', 'Historical Sites 🏛️'), ('music_concerts', 'Music & Concerts 🎶'), ('fitness', 'Fitness 🏋️'), ('art_museums', 'Art & Museums 🎨'), ('festivals', 'Festivals 🎪'), ('spiritual_journeys', 'Spiritual Journeys 🧘\u200d♀️'), ('volunteer_work', 'Volunteer Work 🤝'), ('other', 'Other')], default='general', max_length=100),
),
migrations.CreateModel(
name='Visit',
fields=[
('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False, unique=True)),
('start_date', models.DateField(blank=True, null=True)),
('end_date', models.DateField(blank=True, null=True)),
('notes', models.TextField(blank=True, null=True)),
('created_at', models.DateTimeField(auto_now_add=True)),
('updated_at', models.DateTimeField(auto_now=True)),
('adventure', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='visits', to='adventures.adventure')),
],
),
]

View file

@ -1,18 +0,0 @@
# Generated by Django 5.0.6 on 2024-07-15 13:05
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('adventures', '0007_remove_adventure_trip_alter_adventure_type_and_more'),
]
operations = [
migrations.AddField(
model_name='collection',
name='description',
field=models.TextField(blank=True, null=True),
),
]

View file

@ -0,0 +1,28 @@
# Generated by Django 5.0.8 on 2024-09-23 18:06
import django.db.models.deletion
import uuid
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('adventures', 'migrate_visits_categories'),
('adventures', 'migrate_images'),
]
operations = [
migrations.RemoveField(
model_name='adventure',
name='date',
),
migrations.RemoveField(
model_name='adventure',
name='end_date',
),
migrations.RemoveField(
model_name='adventure',
name='image',
),
]

View file

@ -0,0 +1,18 @@
# Generated by Django 5.0.8 on 2024-09-30 00:33
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('adventures', '0008_remove_date_field'),
]
operations = [
migrations.AlterField(
model_name='adventure',
name='type',
field=models.CharField(choices=[('general', 'General 🌍'), ('outdoor', 'Outdoor 🏞️'), ('lodging', 'Lodging 🛌'), ('dining', 'Dining 🍽️'), ('activity', 'Activity 🏄'), ('attraction', 'Attraction 🎢'), ('shopping', 'Shopping 🛍️'), ('nightlife', 'Nightlife 🌃'), ('event', 'Event 🎉'), ('transportation', 'Transportation 🚗'), ('culture', 'Culture 🎭'), ('water_sports', 'Water Sports 🚤'), ('hiking', 'Hiking 🥾'), ('wildlife', 'Wildlife 🦒'), ('historical_sites', 'Historical Sites 🏛️'), ('music_concerts', 'Music & Concerts 🎶'), ('fitness', 'Fitness 🏋️'), ('art_museums', 'Art & Museums 🎨'), ('festivals', 'Festivals 🎪'), ('spiritual_journeys', 'Spiritual Journeys 🧘\u200d♀️'), ('volunteer_work', 'Volunteer Work 🤝'), ('other', 'Other')], default='general', max_length=100),
),
]

View file

@ -1,26 +0,0 @@
# 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,
),
]

View file

@ -0,0 +1,18 @@
# Generated by Django 5.0.8 on 2024-10-08 03:05
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('adventures', '0009_alter_adventure_type'),
]
operations = [
migrations.AddField(
model_name='collection',
name='link',
field=models.URLField(blank=True, max_length=2083, null=True),
),
]

View file

@ -0,0 +1,34 @@
# Generated by Django 5.0.8 on 2024-11-14 04:30
from django.conf import settings
import django.db.models.deletion
import uuid
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('adventures', '0010_collection_link'),
]
operations = [
migrations.CreateModel(
name='Category',
fields=[
('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False, unique=True)),
('name', models.CharField(max_length=200)),
('display_name', models.CharField(max_length=200)),
('icon', models.CharField(default='🌍', max_length=200)),
('user_id', models.ForeignKey(default=1, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
],
options={
'verbose_name_plural': 'Categories',
},
),
migrations.AddField(
model_name='adventure',
name='category',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='adventures.category'),
),
]

View file

@ -0,0 +1,59 @@
from django.db import migrations
def migrate_categories(apps, schema_editor):
# Use the historical models
Adventure = apps.get_model('adventures', 'Adventure')
Category = apps.get_model('adventures', 'Category')
ADVENTURE_TYPES = {
'general': ('General', '🌍'),
'outdoor': ('Outdoor', '🏞️'),
'lodging': ('Lodging', '🛌'),
'dining': ('Dining', '🍽️'),
'activity': ('Activity', '🏄'),
'attraction': ('Attraction', '🎢'),
'shopping': ('Shopping', '🛍️'),
'nightlife': ('Nightlife', '🌃'),
'event': ('Event', '🎉'),
'transportation': ('Transportation', '🚗'),
'culture': ('Culture', '🎭'),
'water_sports': ('Water Sports', '🚤'),
'hiking': ('Hiking', '🥾'),
'wildlife': ('Wildlife', '🦒'),
'historical_sites': ('Historical Sites', '🏛️'),
'music_concerts': ('Music & Concerts', '🎶'),
'fitness': ('Fitness', '🏋️'),
'art_museums': ('Art & Museums', '🎨'),
'festivals': ('Festivals', '🎪'),
'spiritual_journeys': ('Spiritual Journeys', '🧘‍♀️'),
'volunteer_work': ('Volunteer Work', '🤝'),
'other': ('Other', ''),
}
adventures = Adventure.objects.all()
for adventure in adventures:
# Access the old 'type' field using __dict__ because it's not in the model anymore
old_type = adventure.__dict__.get('type')
if old_type in ADVENTURE_TYPES:
category, created = Category.objects.get_or_create(
name=old_type,
user_id=adventure.user_id,
defaults={
'display_name': ADVENTURE_TYPES[old_type][0],
'icon': ADVENTURE_TYPES[old_type][1],
}
)
adventure.category = category
adventure.save()
else:
print(f"Unknown type: {old_type}")
class Migration(migrations.Migration):
dependencies = [
('adventures', '0011_category_adventure_category'),
]
operations = [
migrations.RunPython(migrate_categories),
]

View file

@ -0,0 +1,23 @@
# Generated by Django 5.0.8 on 2024-11-14 04:51
import django.db.models.deletion
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('adventures', '0012_migrate_types_to_categories'),
]
operations = [
migrations.RemoveField(
model_name='adventure',
name='type',
),
migrations.AlterField(
model_name='adventure',
name='category',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='adventures.category'),
),
]

View file

@ -0,0 +1,19 @@
# Generated by Django 5.0.8 on 2024-11-17 21:43
from django.conf import settings
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('adventures', '0013_remove_adventure_type_alter_adventure_category'),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]
operations = [
migrations.AlterUniqueTogether(
name='category',
unique_together={('name', 'user_id')},
),
]

View file

@ -0,0 +1,33 @@
# Generated by Django 5.0.8 on 2024-12-19 17:16
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('adventures', '0014_alter_category_unique_together'),
]
operations = [
migrations.AddField(
model_name='transportation',
name='destination_latitude',
field=models.DecimalField(blank=True, decimal_places=6, max_digits=9, null=True),
),
migrations.AddField(
model_name='transportation',
name='destination_longitude',
field=models.DecimalField(blank=True, decimal_places=6, max_digits=9, null=True),
),
migrations.AddField(
model_name='transportation',
name='origin_latitude',
field=models.DecimalField(blank=True, decimal_places=6, max_digits=9, null=True),
),
migrations.AddField(
model_name='transportation',
name='origin_longitude',
field=models.DecimalField(blank=True, decimal_places=6, max_digits=9, null=True),
),
]

View file

@ -0,0 +1,20 @@
# Generated by Django 5.0.8 on 2025-01-01 21:40
import adventures.models
import django_resized.forms
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('adventures', '0015_transportation_destination_latitude_and_more'),
]
operations = [
migrations.AlterField(
model_name='adventureimage',
name='image',
field=django_resized.forms.ResizedImageField(crop=None, force_format='WEBP', keep_meta=True, quality=75, scale=None, size=[1920, 1080], upload_to=adventures.models.PathAndRename('images/')),
),
]

View file

@ -0,0 +1,18 @@
# Generated by Django 5.0.8 on 2025-01-03 04:05
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('adventures', '0016_alter_adventureimage_image'),
]
operations = [
migrations.AddField(
model_name='adventureimage',
name='is_primary',
field=models.BooleanField(default=False),
),
]

View file

@ -0,0 +1,26 @@
# Generated by Django 5.0.8 on 2025-01-19 00:39
import django.db.models.deletion
import uuid
from django.conf import settings
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('adventures', '0017_adventureimage_is_primary'),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]
operations = [
migrations.CreateModel(
name='Attachment',
fields=[
('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False, unique=True)),
('file', models.FileField(upload_to='attachments/')),
('adventure', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='attachments', to='adventures.adventure')),
('user_id', models.ForeignKey(default=1, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
],
),
]

View file

@ -0,0 +1,19 @@
# Generated by Django 5.0.8 on 2025-01-19 22:17
import adventures.models
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('adventures', '0018_attachment'),
]
operations = [
migrations.AlterField(
model_name='attachment',
name='file',
field=models.FileField(upload_to=adventures.models.PathAndRename('attachments/')),
),
]

View file

@ -0,0 +1,19 @@
# Generated by Django 5.0.8 on 2025-01-19 22:32
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('adventures', '0019_alter_attachment_file'),
]
operations = [
migrations.AddField(
model_name='attachment',
name='name',
field=models.CharField(default='', max_length=200),
preserve_default=False,
),
]

View file

@ -0,0 +1,18 @@
# Generated by Django 5.0.8 on 2025-01-19 22:32
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('adventures', '0020_attachment_name'),
]
operations = [
migrations.AlterField(
model_name='attachment',
name='name',
field=models.CharField(blank=True, max_length=200, null=True),
),
]

View file

@ -0,0 +1,39 @@
# Generated by Django 5.0.8 on 2025-02-02 15:36
import django.db.models.deletion
import uuid
from django.conf import settings
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('adventures', '0021_alter_attachment_name'),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]
operations = [
migrations.CreateModel(
name='Hotel',
fields=[
('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False, unique=True)),
('name', models.CharField(max_length=200)),
('description', models.TextField(blank=True, null=True)),
('rating', models.FloatField(blank=True, null=True)),
('link', models.URLField(blank=True, max_length=2083, null=True)),
('check_in', models.DateTimeField(blank=True, null=True)),
('check_out', models.DateTimeField(blank=True, null=True)),
('reservation_number', models.CharField(blank=True, max_length=100, null=True)),
('price', models.DecimalField(blank=True, decimal_places=2, max_digits=9, null=True)),
('latitude', models.DecimalField(blank=True, decimal_places=6, max_digits=9, null=True)),
('longitude', models.DecimalField(blank=True, decimal_places=6, max_digits=9, null=True)),
('location', models.CharField(blank=True, max_length=200, null=True)),
('is_public', models.BooleanField(default=False)),
('created_at', models.DateTimeField(auto_now_add=True)),
('updated_at', models.DateTimeField(auto_now=True)),
('collection', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='adventures.collection')),
('user_id', models.ForeignKey(default=1, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
],
),
]

View file

@ -0,0 +1,43 @@
# Generated by Django 5.0.8 on 2025-02-08 01:50
import django.db.models.deletion
import uuid
from django.conf import settings
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('adventures', '0022_hotel'),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]
operations = [
migrations.CreateModel(
name='Lodging',
fields=[
('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False, unique=True)),
('name', models.CharField(max_length=200)),
('type', models.CharField(choices=[('hotel', 'Hotel'), ('hostel', 'Hostel'), ('resort', 'Resort'), ('bnb', 'Bed & Breakfast'), ('campground', 'Campground'), ('cabin', 'Cabin'), ('apartment', 'Apartment'), ('house', 'House'), ('villa', 'Villa'), ('motel', 'Motel'), ('other', 'Other')], default='other', max_length=100)),
('description', models.TextField(blank=True, null=True)),
('rating', models.FloatField(blank=True, null=True)),
('link', models.URLField(blank=True, max_length=2083, null=True)),
('check_in', models.DateTimeField(blank=True, null=True)),
('check_out', models.DateTimeField(blank=True, null=True)),
('reservation_number', models.CharField(blank=True, max_length=100, null=True)),
('price', models.DecimalField(blank=True, decimal_places=2, max_digits=9, null=True)),
('latitude', models.DecimalField(blank=True, decimal_places=6, max_digits=9, null=True)),
('longitude', models.DecimalField(blank=True, decimal_places=6, max_digits=9, null=True)),
('location', models.CharField(blank=True, max_length=200, null=True)),
('is_public', models.BooleanField(default=False)),
('created_at', models.DateTimeField(auto_now_add=True)),
('updated_at', models.DateTimeField(auto_now=True)),
('collection', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='adventures.collection')),
('user_id', models.ForeignKey(default=1, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
],
),
migrations.DeleteModel(
name='Hotel',
),
]

View file

@ -0,0 +1,19 @@
# Generated by Django 5.0.8 on 2025-03-17 01:15
import adventures.models
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('adventures', '0023_lodging_delete_hotel'),
]
operations = [
migrations.AlterField(
model_name='attachment',
name='file',
field=models.FileField(upload_to=adventures.models.PathAndRename('attachments/'), validators=[adventures.models.validate_file_extension]),
),
]

View file

@ -0,0 +1,23 @@
# Generated by Django 5.0.8 on 2025-03-17 21:41
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('adventures', '0024_alter_attachment_file'),
]
operations = [
migrations.AlterField(
model_name='visit',
name='end_date',
field=models.DateTimeField(blank=True, null=True),
),
migrations.AlterField(
model_name='visit',
name='start_date',
field=models.DateTimeField(blank=True, null=True),
),
]

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,30 @@
# Generated by Django 5.0.11 on 2025-05-22 22:48
import django.db.models.deletion
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('adventures', '0028_lodging_timezone'),
('worldtravel', '0015_city_insert_id_country_insert_id_region_insert_id'),
]
operations = [
migrations.AddField(
model_name='adventure',
name='city',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='worldtravel.city'),
),
migrations.AddField(
model_name='adventure',
name='country',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='worldtravel.country'),
),
migrations.AddField(
model_name='adventure',
name='region',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='worldtravel.region'),
),
]

View file

@ -0,0 +1,18 @@
from django.db import migrations
def set_end_date_equal_to_start(apps, schema_editor):
Visit = apps.get_model('adventures', 'Visit')
for visit in Visit.objects.filter(end_date__isnull=True):
if visit.start_date:
visit.end_date = visit.start_date
visit.save()
class Migration(migrations.Migration):
dependencies = [
('adventures', '0029_adventure_city_adventure_country_adventure_region'),
]
operations = [
migrations.RunPython(set_end_date_equal_to_start),
]

View file

@ -0,0 +1,31 @@
# Generated by Django 5.2.1 on 2025-06-01 16:57
import adventures.models
import django_resized.forms
from django.conf import settings
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('adventures', '0030_set_end_date_equal_start'),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]
operations = [
migrations.AddField(
model_name='adventureimage',
name='immich_id',
field=models.CharField(blank=True, max_length=200, null=True),
),
migrations.AlterField(
model_name='adventureimage',
name='image',
field=django_resized.forms.ResizedImageField(blank=True, crop=None, force_format='WEBP', keep_meta=True, null=True, quality=75, scale=None, size=[1920, 1080], upload_to=adventures.models.PathAndRename('images/')),
),
migrations.AddConstraint(
model_name='adventureimage',
constraint=models.CheckConstraint(condition=models.Q(models.Q(('image__isnull', False), ('immich_id__isnull', True)), models.Q(('image__isnull', True), ('immich_id__isnull', False)), _connector='OR'), name='image_xor_immich_id'),
),
]

View file

@ -0,0 +1,17 @@
# Generated by Django 5.2.1 on 2025-06-01 17:18
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('adventures', '0031_adventureimage_immich_id_alter_adventureimage_image_and_more'),
]
operations = [
migrations.RemoveConstraint(
model_name='adventureimage',
name='image_xor_immich_id',
),
]

View file

@ -0,0 +1,19 @@
# Generated by Django 5.2.1 on 2025-06-02 02:31
from django.conf import settings
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('adventures', '0032_remove_adventureimage_image_xor_immich_id'),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]
operations = [
migrations.AddConstraint(
model_name='adventureimage',
constraint=models.UniqueConstraint(fields=('immich_id', 'user_id'), name='unique_immich_id_per_user'),
),
]

View file

@ -0,0 +1,17 @@
# Generated by Django 5.2.1 on 2025-06-02 02:44
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('adventures', '0033_adventureimage_unique_immich_id_per_user'),
]
operations = [
migrations.RemoveConstraint(
model_name='adventureimage',
name='unique_immich_id_per_user',
),
]

View file

@ -0,0 +1,59 @@
# Generated by Django 5.2.1 on 2025-06-10 03:04
from django.db import migrations, models
def migrate_collection_relationships(apps, schema_editor):
"""
Migrate existing ForeignKey relationships to ManyToMany relationships
"""
Adventure = apps.get_model('adventures', 'Adventure')
# Get all adventures that have a collection assigned
adventures_with_collections = Adventure.objects.filter(collection__isnull=False)
for adventure in adventures_with_collections:
# Add the existing collection to the new many-to-many field
adventure.collections.add(adventure.collection_id)
def reverse_migrate_collection_relationships(apps, schema_editor):
"""
Reverse migration - convert first collection back to ForeignKey
Note: This will only preserve the first collection if an adventure has multiple
"""
Adventure = apps.get_model('adventures', 'Adventure')
for adventure in Adventure.objects.all():
first_collection = adventure.collections.first()
if first_collection:
adventure.collection = first_collection
adventure.save()
class Migration(migrations.Migration):
dependencies = [
('adventures', '0034_remove_adventureimage_unique_immich_id_per_user'),
]
operations = [
# First, add the new ManyToMany field
migrations.AddField(
model_name='adventure',
name='collections',
field=models.ManyToManyField(blank=True, related_name='adventures', to='adventures.collection'),
),
# Migrate existing data from old field to new field
migrations.RunPython(
migrate_collection_relationships,
reverse_migrate_collection_relationships
),
# Finally, remove the old ForeignKey field
migrations.RemoveField(
model_name='adventure',
name='collection',
),
]

View file

@ -0,0 +1,29 @@
from django.db import migrations
def move_images_to_new_model(apps, schema_editor):
Adventure = apps.get_model('adventures', 'Adventure')
AdventureImage = apps.get_model('adventures', 'AdventureImage')
for adventure in Adventure.objects.all():
if adventure.image:
AdventureImage.objects.create(
adventure=adventure,
image=adventure.image,
user_id=adventure.user_id,
)
class Migration(migrations.Migration):
dependencies = [
('adventures', '0001_initial'),
('adventures', '0002_adventureimage'),
]
operations = [
migrations.RunPython(move_images_to_new_model),
migrations.RemoveField(
model_name='Adventure',
name='image',
),
]

View file

@ -0,0 +1,31 @@
from django.db import migrations
from django.db import migrations, models
def move_images_to_new_model(apps, schema_editor):
Adventure = apps.get_model('adventures', 'Adventure')
Visit = apps.get_model('adventures', 'Visit')
for adventure in Adventure.objects.all():
# if the type is visited and there is no date, set note to 'No date provided.'
note = 'No date provided.' if adventure.type == 'visited' and not adventure.date else ''
if adventure.date or adventure.type == 'visited':
Visit.objects.create(
adventure=adventure,
start_date=adventure.date,
end_date=adventure.end_date,
notes=note,
)
if adventure.type == 'visited' or adventure.type == 'planned':
adventure.type = 'general'
adventure.save()
class Migration(migrations.Migration):
dependencies = [
('adventures', '0007_visit_model'),
]
operations = [
migrations.RunPython(move_images_to_new_model),
]

View file

@ -1,39 +1,741 @@
from django.core.exceptions import ValidationError
import os
from typing import Iterable
import uuid
from django.db import models
from django.utils.deconstruct import deconstructible
from adventures.managers import AdventureManager
import threading
from django.contrib.auth import get_user_model
from django.contrib.postgres.fields import ArrayField
from django.forms import ValidationError
from django_resized import ResizedImageField
from worldtravel.models import City, Country, Region, VisitedCity, VisitedRegion
from django.core.exceptions import ValidationError
from django.utils import timezone
def background_geocode_and_assign(adventure_id: str):
print(f"[Adventure Geocode Thread] Starting geocode for adventure {adventure_id}")
try:
adventure = Adventure.objects.get(id=adventure_id)
if not (adventure.latitude and adventure.longitude):
return
from adventures.geocoding import reverse_geocode # or wherever you defined it
is_visited = adventure.is_visited_status()
result = reverse_geocode(adventure.latitude, adventure.longitude, adventure.user_id)
if 'region_id' in result:
region = Region.objects.filter(id=result['region_id']).first()
if region:
adventure.region = region
if is_visited:
VisitedRegion.objects.get_or_create(user_id=adventure.user_id, region=region)
if 'city_id' in result:
city = City.objects.filter(id=result['city_id']).first()
if city:
adventure.city = city
if is_visited:
VisitedCity.objects.get_or_create(user_id=adventure.user_id, city=city)
if 'country_id' in result:
country = Country.objects.filter(country_code=result['country_id']).first()
if country:
adventure.country = country
# Save updated location info
# Save updated location info, skip geocode threading
adventure.save(update_fields=["region", "city", "country"], _skip_geocode=True)
# print(f"[Adventure Geocode Thread] Successfully processed {adventure_id}: {adventure.name} - {adventure.latitude}, {adventure.longitude}")
except Exception as e:
# Optional: log or print the error
print(f"[Adventure Geocode Thread] Error processing {adventure_id}: {e}")
def validate_file_extension(value):
import os
from django.core.exceptions import ValidationError
ext = os.path.splitext(value.name)[1] # [0] returns path+filename
valid_extensions = ['.pdf', '.doc', '.docx', '.xls', '.xlsx', '.ppt', '.pptx', '.txt', '.png', '.jpg', '.jpeg', '.gif', '.webp', '.mp4', '.mov', '.avi', '.mkv', '.mp3', '.wav', '.flac', '.ogg', '.m4a', '.wma', '.aac', '.opus', '.zip', '.rar', '.7z', '.tar', '.gz', '.bz2', '.xz', '.zst', '.lz4', '.lzma', '.lzo', '.z', '.tar.gz', '.tar.bz2', '.tar.xz', '.tar.zst', '.tar.lz4', '.tar.lzma', '.tar.lzo', '.tar.z', '.gpx', '.md']
if not ext.lower() in valid_extensions:
raise ValidationError('Unsupported file extension.')
ADVENTURE_TYPES = [
('visited', 'Visited'),
('planned', 'Planned'),
('general', 'General 🌍'),
('outdoor', 'Outdoor 🏞️'),
('lodging', 'Lodging 🛌'),
('dining', 'Dining 🍽️'),
('activity', 'Activity 🏄'),
('attraction', 'Attraction 🎢'),
('shopping', 'Shopping 🛍️'),
('nightlife', 'Nightlife 🌃'),
('event', 'Event 🎉'),
('transportation', 'Transportation 🚗'),
('culture', 'Culture 🎭'),
('water_sports', 'Water Sports 🚤'),
('hiking', 'Hiking 🥾'),
('wildlife', 'Wildlife 🦒'),
('historical_sites', 'Historical Sites 🏛️'),
('music_concerts', 'Music & Concerts 🎶'),
('fitness', 'Fitness 🏋️'),
('art_museums', 'Art & Museums 🎨'),
('festivals', 'Festivals 🎪'),
('spiritual_journeys', 'Spiritual Journeys 🧘‍♀️'),
('volunteer_work', 'Volunteer Work 🤝'),
('other', 'Other')
]
TIMEZONES = [
"Africa/Abidjan",
"Africa/Accra",
"Africa/Addis_Ababa",
"Africa/Algiers",
"Africa/Asmera",
"Africa/Bamako",
"Africa/Bangui",
"Africa/Banjul",
"Africa/Bissau",
"Africa/Blantyre",
"Africa/Brazzaville",
"Africa/Bujumbura",
"Africa/Cairo",
"Africa/Casablanca",
"Africa/Ceuta",
"Africa/Conakry",
"Africa/Dakar",
"Africa/Dar_es_Salaam",
"Africa/Djibouti",
"Africa/Douala",
"Africa/El_Aaiun",
"Africa/Freetown",
"Africa/Gaborone",
"Africa/Harare",
"Africa/Johannesburg",
"Africa/Juba",
"Africa/Kampala",
"Africa/Khartoum",
"Africa/Kigali",
"Africa/Kinshasa",
"Africa/Lagos",
"Africa/Libreville",
"Africa/Lome",
"Africa/Luanda",
"Africa/Lubumbashi",
"Africa/Lusaka",
"Africa/Malabo",
"Africa/Maputo",
"Africa/Maseru",
"Africa/Mbabane",
"Africa/Mogadishu",
"Africa/Monrovia",
"Africa/Nairobi",
"Africa/Ndjamena",
"Africa/Niamey",
"Africa/Nouakchott",
"Africa/Ouagadougou",
"Africa/Porto-Novo",
"Africa/Sao_Tome",
"Africa/Tripoli",
"Africa/Tunis",
"Africa/Windhoek",
"America/Adak",
"America/Anchorage",
"America/Anguilla",
"America/Antigua",
"America/Araguaina",
"America/Argentina/La_Rioja",
"America/Argentina/Rio_Gallegos",
"America/Argentina/Salta",
"America/Argentina/San_Juan",
"America/Argentina/San_Luis",
"America/Argentina/Tucuman",
"America/Argentina/Ushuaia",
"America/Aruba",
"America/Asuncion",
"America/Bahia",
"America/Bahia_Banderas",
"America/Barbados",
"America/Belem",
"America/Belize",
"America/Blanc-Sablon",
"America/Boa_Vista",
"America/Bogota",
"America/Boise",
"America/Buenos_Aires",
"America/Cambridge_Bay",
"America/Campo_Grande",
"America/Cancun",
"America/Caracas",
"America/Catamarca",
"America/Cayenne",
"America/Cayman",
"America/Chicago",
"America/Chihuahua",
"America/Ciudad_Juarez",
"America/Coral_Harbour",
"America/Cordoba",
"America/Costa_Rica",
"America/Creston",
"America/Cuiaba",
"America/Curacao",
"America/Danmarkshavn",
"America/Dawson",
"America/Dawson_Creek",
"America/Denver",
"America/Detroit",
"America/Dominica",
"America/Edmonton",
"America/Eirunepe",
"America/El_Salvador",
"America/Fort_Nelson",
"America/Fortaleza",
"America/Glace_Bay",
"America/Godthab",
"America/Goose_Bay",
"America/Grand_Turk",
"America/Grenada",
"America/Guadeloupe",
"America/Guatemala",
"America/Guayaquil",
"America/Guyana",
"America/Halifax",
"America/Havana",
"America/Hermosillo",
"America/Indiana/Knox",
"America/Indiana/Marengo",
"America/Indiana/Petersburg",
"America/Indiana/Tell_City",
"America/Indiana/Vevay",
"America/Indiana/Vincennes",
"America/Indiana/Winamac",
"America/Indianapolis",
"America/Inuvik",
"America/Iqaluit",
"America/Jamaica",
"America/Jujuy",
"America/Juneau",
"America/Kentucky/Monticello",
"America/Kralendijk",
"America/La_Paz",
"America/Lima",
"America/Los_Angeles",
"America/Louisville",
"America/Lower_Princes",
"America/Maceio",
"America/Managua",
"America/Manaus",
"America/Marigot",
"America/Martinique",
"America/Matamoros",
"America/Mazatlan",
"America/Mendoza",
"America/Menominee",
"America/Merida",
"America/Metlakatla",
"America/Mexico_City",
"America/Miquelon",
"America/Moncton",
"America/Monterrey",
"America/Montevideo",
"America/Montserrat",
"America/Nassau",
"America/New_York",
"America/Nome",
"America/Noronha",
"America/North_Dakota/Beulah",
"America/North_Dakota/Center",
"America/North_Dakota/New_Salem",
"America/Ojinaga",
"America/Panama",
"America/Paramaribo",
"America/Phoenix",
"America/Port-au-Prince",
"America/Port_of_Spain",
"America/Porto_Velho",
"America/Puerto_Rico",
"America/Punta_Arenas",
"America/Rankin_Inlet",
"America/Recife",
"America/Regina",
"America/Resolute",
"America/Rio_Branco",
"America/Santarem",
"America/Santiago",
"America/Santo_Domingo",
"America/Sao_Paulo",
"America/Scoresbysund",
"America/Sitka",
"America/St_Barthelemy",
"America/St_Johns",
"America/St_Kitts",
"America/St_Lucia",
"America/St_Thomas",
"America/St_Vincent",
"America/Swift_Current",
"America/Tegucigalpa",
"America/Thule",
"America/Tijuana",
"America/Toronto",
"America/Tortola",
"America/Vancouver",
"America/Whitehorse",
"America/Winnipeg",
"America/Yakutat",
"Antarctica/Casey",
"Antarctica/Davis",
"Antarctica/DumontDUrville",
"Antarctica/Macquarie",
"Antarctica/Mawson",
"Antarctica/McMurdo",
"Antarctica/Palmer",
"Antarctica/Rothera",
"Antarctica/Syowa",
"Antarctica/Troll",
"Antarctica/Vostok",
"Arctic/Longyearbyen",
"Asia/Aden",
"Asia/Almaty",
"Asia/Amman",
"Asia/Anadyr",
"Asia/Aqtau",
"Asia/Aqtobe",
"Asia/Ashgabat",
"Asia/Atyrau",
"Asia/Baghdad",
"Asia/Bahrain",
"Asia/Baku",
"Asia/Bangkok",
"Asia/Barnaul",
"Asia/Beirut",
"Asia/Bishkek",
"Asia/Brunei",
"Asia/Calcutta",
"Asia/Chita",
"Asia/Colombo",
"Asia/Damascus",
"Asia/Dhaka",
"Asia/Dili",
"Asia/Dubai",
"Asia/Dushanbe",
"Asia/Famagusta",
"Asia/Gaza",
"Asia/Hebron",
"Asia/Hong_Kong",
"Asia/Hovd",
"Asia/Irkutsk",
"Asia/Jakarta",
"Asia/Jayapura",
"Asia/Jerusalem",
"Asia/Kabul",
"Asia/Kamchatka",
"Asia/Karachi",
"Asia/Katmandu",
"Asia/Khandyga",
"Asia/Krasnoyarsk",
"Asia/Kuala_Lumpur",
"Asia/Kuching",
"Asia/Kuwait",
"Asia/Macau",
"Asia/Magadan",
"Asia/Makassar",
"Asia/Manila",
"Asia/Muscat",
"Asia/Nicosia",
"Asia/Novokuznetsk",
"Asia/Novosibirsk",
"Asia/Omsk",
"Asia/Oral",
"Asia/Phnom_Penh",
"Asia/Pontianak",
"Asia/Pyongyang",
"Asia/Qatar",
"Asia/Qostanay",
"Asia/Qyzylorda",
"Asia/Rangoon",
"Asia/Riyadh",
"Asia/Saigon",
"Asia/Sakhalin",
"Asia/Samarkand",
"Asia/Seoul",
"Asia/Shanghai",
"Asia/Singapore",
"Asia/Srednekolymsk",
"Asia/Taipei",
"Asia/Tashkent",
"Asia/Tbilisi",
"Asia/Tehran",
"Asia/Thimphu",
"Asia/Tokyo",
"Asia/Tomsk",
"Asia/Ulaanbaatar",
"Asia/Urumqi",
"Asia/Ust-Nera",
"Asia/Vientiane",
"Asia/Vladivostok",
"Asia/Yakutsk",
"Asia/Yekaterinburg",
"Asia/Yerevan",
"Atlantic/Azores",
"Atlantic/Bermuda",
"Atlantic/Canary",
"Atlantic/Cape_Verde",
"Atlantic/Faeroe",
"Atlantic/Madeira",
"Atlantic/Reykjavik",
"Atlantic/South_Georgia",
"Atlantic/St_Helena",
"Atlantic/Stanley",
"Australia/Adelaide",
"Australia/Brisbane",
"Australia/Broken_Hill",
"Australia/Darwin",
"Australia/Eucla",
"Australia/Hobart",
"Australia/Lindeman",
"Australia/Lord_Howe",
"Australia/Melbourne",
"Australia/Perth",
"Australia/Sydney",
"Europe/Amsterdam",
"Europe/Andorra",
"Europe/Astrakhan",
"Europe/Athens",
"Europe/Belgrade",
"Europe/Berlin",
"Europe/Bratislava",
"Europe/Brussels",
"Europe/Bucharest",
"Europe/Budapest",
"Europe/Busingen",
"Europe/Chisinau",
"Europe/Copenhagen",
"Europe/Dublin",
"Europe/Gibraltar",
"Europe/Guernsey",
"Europe/Helsinki",
"Europe/Isle_of_Man",
"Europe/Istanbul",
"Europe/Jersey",
"Europe/Kaliningrad",
"Europe/Kiev",
"Europe/Kirov",
"Europe/Lisbon",
"Europe/Ljubljana",
"Europe/London",
"Europe/Luxembourg",
"Europe/Madrid",
"Europe/Malta",
"Europe/Mariehamn",
"Europe/Minsk",
"Europe/Monaco",
"Europe/Moscow",
"Europe/Oslo",
"Europe/Paris",
"Europe/Podgorica",
"Europe/Prague",
"Europe/Riga",
"Europe/Rome",
"Europe/Samara",
"Europe/San_Marino",
"Europe/Sarajevo",
"Europe/Saratov",
"Europe/Simferopol",
"Europe/Skopje",
"Europe/Sofia",
"Europe/Stockholm",
"Europe/Tallinn",
"Europe/Tirane",
"Europe/Ulyanovsk",
"Europe/Vaduz",
"Europe/Vatican",
"Europe/Vienna",
"Europe/Vilnius",
"Europe/Volgograd",
"Europe/Warsaw",
"Europe/Zagreb",
"Europe/Zurich",
"Indian/Antananarivo",
"Indian/Chagos",
"Indian/Christmas",
"Indian/Cocos",
"Indian/Comoro",
"Indian/Kerguelen",
"Indian/Mahe",
"Indian/Maldives",
"Indian/Mauritius",
"Indian/Mayotte",
"Indian/Reunion",
"Pacific/Apia",
"Pacific/Auckland",
"Pacific/Bougainville",
"Pacific/Chatham",
"Pacific/Easter",
"Pacific/Efate",
"Pacific/Enderbury",
"Pacific/Fakaofo",
"Pacific/Fiji",
"Pacific/Funafuti",
"Pacific/Galapagos",
"Pacific/Gambier",
"Pacific/Guadalcanal",
"Pacific/Guam",
"Pacific/Honolulu",
"Pacific/Kiritimati",
"Pacific/Kosrae",
"Pacific/Kwajalein",
"Pacific/Majuro",
"Pacific/Marquesas",
"Pacific/Midway",
"Pacific/Nauru",
"Pacific/Niue",
"Pacific/Norfolk",
"Pacific/Noumea",
"Pacific/Pago_Pago",
"Pacific/Palau",
"Pacific/Pitcairn",
"Pacific/Ponape",
"Pacific/Port_Moresby",
"Pacific/Rarotonga",
"Pacific/Saipan",
"Pacific/Tahiti",
"Pacific/Tarawa",
"Pacific/Tongatapu",
"Pacific/Truk",
"Pacific/Wake",
"Pacific/Wallis"
]
LODGING_TYPES = [
('hotel', 'Hotel'),
('hostel', 'Hostel'),
('resort', 'Resort'),
('bnb', 'Bed & Breakfast'),
('campground', 'Campground'),
('cabin', 'Cabin'),
('apartment', 'Apartment'),
('house', 'House'),
('villa', 'Villa'),
('motel', 'Motel'),
('other', 'Other')
]
TRANSPORTATION_TYPES = [
('car', 'Car'),
('plane', 'Plane'),
('train', 'Train'),
('bus', 'Bus'),
('boat', 'Boat'),
('bike', 'Bike'),
('walking', 'Walking'),
('other', 'Other')
]
# Assuming you have a default user ID you want to use
default_user_id = 1 # Replace with an actual user ID
User = get_user_model()
class Visit(models.Model):
id = models.UUIDField(default=uuid.uuid4, editable=False, unique=True, primary_key=True)
adventure = models.ForeignKey('Adventure', on_delete=models.CASCADE, related_name='visits')
start_date = models.DateTimeField(null=True, blank=True)
end_date = models.DateTimeField(null=True, blank=True)
timezone = models.CharField(max_length=50, choices=[(tz, tz) for tz in TIMEZONES], null=True, blank=True)
notes = models.TextField(blank=True, null=True)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
def clean(self):
if self.start_date > self.end_date:
raise ValidationError('The start date must be before or equal to the end date.')
def __str__(self):
return f"{self.adventure.name} - {self.start_date} to {self.end_date}"
class Adventure(models.Model):
id = models.AutoField(primary_key=True)
#id = models.AutoField(primary_key=True)
id = models.UUIDField(default=uuid.uuid4, editable=False, unique=True, primary_key=True)
user_id = models.ForeignKey(
User, on_delete=models.CASCADE, default=default_user_id)
type = models.CharField(max_length=100, choices=ADVENTURE_TYPES)
category = models.ForeignKey('Category', on_delete=models.SET_NULL, blank=True, null=True)
name = models.CharField(max_length=200)
location = models.CharField(max_length=200, blank=True, null=True)
activity_types = ArrayField(models.CharField(
max_length=100), blank=True, null=True)
description = models.TextField(blank=True, null=True)
rating = models.FloatField(blank=True, null=True)
link = models.URLField(blank=True, null=True)
image = ResizedImageField(force_format="WEBP", quality=75, null=True, blank=True, upload_to='images/')
date = models.DateField(blank=True, null=True)
link = models.URLField(blank=True, null=True, max_length=2083)
is_public = models.BooleanField(default=False)
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)
city = models.ForeignKey(City, on_delete=models.SET_NULL, blank=True, null=True)
region = models.ForeignKey(Region, on_delete=models.SET_NULL, blank=True, null=True)
country = models.ForeignKey(Country, on_delete=models.SET_NULL, blank=True, null=True)
# Changed from ForeignKey to ManyToManyField
collections = models.ManyToManyField('Collection', blank=True, related_name='adventures')
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
objects = AdventureManager()
def is_visited_status(self):
current_date = timezone.now().date()
for visit in self.visits.all():
start_date = visit.start_date.date() if isinstance(visit.start_date, timezone.datetime) else visit.start_date
end_date = visit.end_date.date() if isinstance(visit.end_date, timezone.datetime) else visit.end_date
if start_date and end_date and (start_date <= current_date):
return True
elif start_date and not end_date and (start_date <= current_date):
return True
return False
def clean(self, skip_shared_validation=False):
"""
Validate model constraints.
skip_shared_validation: Skip validation when called by shared users
"""
# Skip validation if this is a shared user update
if skip_shared_validation:
return
# Check collections after the instance is saved (in save method or separate validation)
if self.pk: # Only check if the instance has been saved
for collection in self.collections.all():
if collection.is_public and not self.is_public:
raise ValidationError(f'Adventures associated with a public collection must be public. Collection: {collection.name} Adventure: {self.name}')
# Only enforce same-user constraint for non-shared collections
if self.user_id != collection.user_id:
# Check if this is a shared collection scenario
# Allow if the adventure owner has access to the collection through sharing
if not collection.shared_with.filter(uuid=self.user_id.uuid).exists():
raise ValidationError(f'Adventures must be associated with collections owned by the same user or shared collections. Collection owner: {collection.user_id.username} Adventure owner: {self.user_id.username}')
if self.category:
if self.user_id != self.category.user_id:
raise ValidationError(f'Adventures must be associated with categories owned by the same user. Category owner: {self.category.user_id.username} Adventure owner: {self.user_id.username}')
def save(self, force_insert=False, force_update=False, using=None, update_fields=None, _skip_geocode=False, _skip_shared_validation=False):
if force_insert and force_update:
raise ValueError("Cannot force both insert and updating in model saving.")
if not self.category:
category, _ = Category.objects.get_or_create(
user_id=self.user_id,
name='general',
defaults={'display_name': 'General', 'icon': '🌍'}
)
self.category = category
result = super().save(force_insert, force_update, using, update_fields)
# Validate collections after saving (since M2M relationships require saved instance)
if self.pk:
try:
self.clean(skip_shared_validation=_skip_shared_validation)
except ValidationError as e:
# If validation fails, you might want to handle this differently
# For now, we'll re-raise the error
raise e
# ⛔ Skip threading if called from geocode background thread
if _skip_geocode:
return result
if self.latitude and self.longitude:
thread = threading.Thread(target=background_geocode_and_assign, args=(str(self.id),))
thread.daemon = True # Allows the thread to exit when the main program ends
thread.start()
return result
def __str__(self):
return self.name
class Collection(models.Model):
#id = models.AutoField(primary_key=True)
id = models.UUIDField(default=uuid.uuid4, editable=False, unique=True, primary_key=True)
user_id = models.ForeignKey(
User, on_delete=models.CASCADE, default=default_user_id)
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)
start_date = models.DateField(blank=True, null=True)
end_date = models.DateField(blank=True, null=True)
updated_at = models.DateTimeField(auto_now=True)
is_archived = models.BooleanField(default=False)
shared_with = models.ManyToManyField(User, related_name='shared_with', blank=True)
link = models.URLField(blank=True, null=True, max_length=2083)
# if connected adventures are private and collection is public, raise an error
def clean(self):
if self.is_public and self.pk: # Only check if the instance has a primary key
# Updated to use the new related_name 'adventures'
for adventure in self.adventures.all():
if not adventure.is_public:
raise ValidationError(f'Public collections cannot be associated with private adventures. Collection: {self.name} Adventure: {adventure.name}')
def __str__(self):
return self.name
class Transportation(models.Model):
#id = models.AutoField(primary_key=True)
id = models.UUIDField(default=uuid.uuid4, editable=False, unique=True, primary_key=True)
user_id = models.ForeignKey(
User, on_delete=models.CASCADE, default=default_user_id)
type = models.CharField(max_length=100, choices=TRANSPORTATION_TYPES)
name = models.CharField(max_length=200)
description = models.TextField(blank=True, null=True)
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)
start_timezone = models.CharField(max_length=50, choices=[(tz, tz) for tz in TIMEZONES], null=True, blank=True)
end_timezone = models.CharField(max_length=50, choices=[(tz, tz) for tz in TIMEZONES], null=True, blank=True)
flight_number = models.CharField(max_length=100, blank=True, null=True)
from_location = models.CharField(max_length=200, blank=True, null=True)
origin_latitude = models.DecimalField(max_digits=9, decimal_places=6, null=True, blank=True)
origin_longitude = models.DecimalField(max_digits=9, decimal_places=6, null=True, blank=True)
destination_latitude = models.DecimalField(max_digits=9, decimal_places=6, null=True, blank=True)
destination_longitude = models.DecimalField(max_digits=9, decimal_places=6, null=True, blank=True)
to_location = models.CharField(max_length=200, blank=True, null=True)
is_public = models.BooleanField(default=False)
collection = models.ForeignKey('Collection', on_delete=models.CASCADE, blank=True, null=True)
created_at = models.DateTimeField(auto_now_add=True)
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.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)
if self.user_id != self.collection.user_id:
raise ValidationError('Transportations must be associated with collections owned by the same user. Collection owner: ' + self.collection.user_id.username + ' Transportation owner: ' + self.user_id.username)
def __str__(self):
return self.name
class Note(models.Model):
#id = models.AutoField(primary_key=True)
id = models.UUIDField(default=uuid.uuid4, editable=False, unique=True, primary_key=True)
user_id = models.ForeignKey(
User, on_delete=models.CASCADE, default=default_user_id)
name = models.CharField(max_length=200)
content = models.TextField(blank=True, null=True)
links = ArrayField(models.URLField(), blank=True, null=True)
date = models.DateField(blank=True, null=True)
is_public = models.BooleanField(default=False)
collection = models.ForeignKey('Collection', on_delete=models.CASCADE, blank=True, null=True)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
@ -41,28 +743,167 @@ class Adventure(models.Model):
def clean(self):
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)
raise ValidationError('Notes associated with a public collection must be public. Collection: ' + self.collection.name + ' Transportation: ' + self.name)
if self.user_id != self.collection.user_id:
raise ValidationError('Adventures must be associated with collections owned by the same user. Collection owner: ' + self.collection.user_id.username + ' Adventure owner: ' + self.user_id.username)
raise ValidationError('Notes must be associated with collections owned by the same user. Collection owner: ' + self.collection.user_id.username + ' Transportation owner: ' + self.user_id.username)
def __str__(self):
return self.name
class Collection(models.Model):
id = models.AutoField(primary_key=True)
class Checklist(models.Model):
# id = models.AutoField(primary_key=True)
id = models.UUIDField(default=uuid.uuid4, editable=False, unique=True, primary_key=True)
user_id = models.ForeignKey(
User, on_delete=models.CASCADE, default=default_user_id)
name = models.CharField(max_length=200)
description = models.TextField(blank=True, null=True)
date = models.DateField(blank=True, null=True)
is_public = models.BooleanField(default=False)
collection = models.ForeignKey('Collection', on_delete=models.CASCADE, blank=True, null=True)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
# if connected adventures are private and collection is public, raise an error
def clean(self):
if self.is_public and self.pk: # Only check if the instance has a primary key
for adventure in self.adventure_set.all():
if not adventure.is_public:
raise ValidationError('Public collections cannot be associated with private adventures. Collection: ' + self.name + ' Adventure: ' + adventure.name)
if self.collection:
if self.collection.is_public and not self.is_public:
raise ValidationError('Checklists associated with a public collection must be public. Collection: ' + self.collection.name + ' Checklist: ' + self.name)
if self.user_id != self.collection.user_id:
raise ValidationError('Checklists must be associated with collections owned by the same user. Collection owner: ' + self.collection.user_id.username + ' Checklist owner: ' + self.user_id.username)
def __str__(self):
return self.name
class ChecklistItem(models.Model):
#id = models.AutoField(primary_key=True)
id = models.UUIDField(default=uuid.uuid4, editable=False, unique=True, primary_key=True)
user_id = models.ForeignKey(
User, on_delete=models.CASCADE, default=default_user_id)
name = models.CharField(max_length=200)
is_checked = models.BooleanField(default=False)
checklist = models.ForeignKey('Checklist', on_delete=models.CASCADE)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
def clean(self):
if self.checklist.is_public and not self.checklist.is_public:
raise ValidationError('Checklist items associated with a public checklist must be public. Checklist: ' + self.checklist.name + ' Checklist item: ' + self.name)
if self.user_id != self.checklist.user_id:
raise ValidationError('Checklist items must be associated with checklists owned by the same user. Checklist owner: ' + self.checklist.user_id.username + ' Checklist item owner: ' + self.user_id.username)
def __str__(self):
return self.name
@deconstructible
class PathAndRename:
def __init__(self, path):
self.path = path
def __call__(self, instance, filename):
ext = filename.split('.')[-1]
# Generate a new UUID for the filename
filename = f"{uuid.uuid4()}.{ext}"
return os.path.join(self.path, filename)
class AdventureImage(models.Model):
id = models.UUIDField(default=uuid.uuid4, editable=False, unique=True, primary_key=True)
user_id = models.ForeignKey(User, on_delete=models.CASCADE, default=default_user_id)
image = ResizedImageField(
force_format="WEBP",
quality=75,
upload_to=PathAndRename('images/'),
blank=True,
null=True,
)
immich_id = models.CharField(max_length=200, null=True, blank=True)
adventure = models.ForeignKey(Adventure, related_name='images', on_delete=models.CASCADE)
is_primary = models.BooleanField(default=False)
def clean(self):
# One of image or immich_id must be set, but not both
has_image = bool(self.image and str(self.image).strip())
has_immich_id = bool(self.immich_id and str(self.immich_id).strip())
if has_image and has_immich_id:
raise ValidationError("Cannot have both image file and Immich ID. Please provide only one.")
if not has_image and not has_immich_id:
raise ValidationError("Must provide either an image file or an Immich ID.")
def save(self, *args, **kwargs):
# Clean empty strings to None for proper database storage
if not self.image:
self.image = None
if not self.immich_id or not str(self.immich_id).strip():
self.immich_id = None
self.full_clean() # This calls clean() method
super().save(*args, **kwargs)
def __str__(self):
return self.image.url if self.image else f"Immich ID: {self.immich_id or 'No image'}"
class Attachment(models.Model):
id = models.UUIDField(default=uuid.uuid4, editable=False, unique=True, primary_key=True)
user_id = models.ForeignKey(
User, on_delete=models.CASCADE, default=default_user_id)
file = models.FileField(upload_to=PathAndRename('attachments/'),validators=[validate_file_extension])
adventure = models.ForeignKey(Adventure, related_name='attachments', on_delete=models.CASCADE)
name = models.CharField(max_length=200, null=True, blank=True)
def __str__(self):
return self.file.url
class Category(models.Model):
id = models.UUIDField(default=uuid.uuid4, editable=False, unique=True, primary_key=True)
user_id = models.ForeignKey(
User, on_delete=models.CASCADE, default=default_user_id)
name = models.CharField(max_length=200)
display_name = models.CharField(max_length=200)
icon = models.CharField(max_length=200, default='🌍')
class Meta:
verbose_name_plural = 'Categories'
unique_together = ['name', 'user_id']
def clean(self) -> None:
self.name = self.name.lower().strip()
return super().clean()
def __str__(self):
return self.name + ' - ' + self.display_name + ' - ' + self.icon
class Lodging(models.Model):
id = models.UUIDField(default=uuid.uuid4, editable=False, unique=True, primary_key=True)
user_id = models.ForeignKey(
User, on_delete=models.CASCADE, default=default_user_id)
name = models.CharField(max_length=200)
type = models.CharField(max_length=100, choices=LODGING_TYPES, default='other')
description = models.TextField(blank=True, null=True)
rating = models.FloatField(blank=True, null=True)
link = models.URLField(blank=True, null=True, max_length=2083)
check_in = models.DateTimeField(blank=True, null=True)
check_out = models.DateTimeField(blank=True, null=True)
timezone = models.CharField(max_length=50, choices=[(tz, tz) for tz in TIMEZONES], null=True, blank=True)
reservation_number = models.CharField(max_length=100, blank=True, null=True)
price = models.DecimalField(max_digits=9, decimal_places=2, blank=True, null=True)
latitude = models.DecimalField(max_digits=9, decimal_places=6, null=True, blank=True)
longitude = models.DecimalField(max_digits=9, decimal_places=6, null=True, blank=True)
location = models.CharField(max_length=200, blank=True, null=True)
is_public = models.BooleanField(default=False)
collection = models.ForeignKey('Collection', on_delete=models.CASCADE, blank=True, null=True)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
def clean(self):
if self.check_in and self.check_out and self.check_in > self.check_out:
raise ValidationError('The start date must be before the end date. Start date: ' + str(self.check_in) + ' End date: ' + str(self.check_out))
if self.collection:
if self.collection.is_public and not self.is_public:
raise ValidationError('Lodging associated with a public collection must be public. Collection: ' + self.collection.name + ' Loging: ' + self.name)
if self.user_id != self.collection.user_id:
raise ValidationError('Lodging must be associated with collections owned by the same user. Collection owner: ' + self.collection.user_id.username + ' Lodging owner: ' + self.user_id.username)
def __str__(self):
return self.name

View file

@ -2,29 +2,99 @@ from rest_framework import permissions
class IsOwnerOrReadOnly(permissions.BasePermission):
"""
Custom permission to only allow owners of an object to edit it.
Owners can edit, others have read-only access.
"""
def has_object_permission(self, request, view, obj):
# Read permissions are allowed to any request,
# so we'll always allow GET, HEAD or OPTIONS requests.
if request.method in permissions.SAFE_METHODS:
return True
# Write permissions are only allowed to the owner of the object.
# obj.user_id is FK to User, compare with request.user
return obj.user_id == request.user
class IsPublicReadOnly(permissions.BasePermission):
"""
Custom permission to only allow read-only access to public objects,
and write access to the owner of the object.
Read-only if public or owner, write only for owner.
"""
def has_object_permission(self, request, view, obj):
# Read permissions are allowed if the object is public
if request.method in permissions.SAFE_METHODS:
return obj.is_public or obj.user_id == request.user
# Write permissions are only allowed to the owner of the object
return obj.user_id == request.user
class CollectionShared(permissions.BasePermission):
"""
Allow full access if user is in shared_with of collection(s) or owner,
read-only if public or shared_with,
write only if owner or shared_with.
"""
def has_object_permission(self, request, view, obj):
user = request.user
if not user or not user.is_authenticated:
# Anonymous: only read public
return request.method in permissions.SAFE_METHODS and obj.is_public
# Check if user is in shared_with of any collections related to the obj
# If obj is a Collection itself:
if hasattr(obj, 'shared_with'):
if obj.shared_with.filter(id=user.id).exists():
return True
# If obj is an Adventure (has collections M2M)
if hasattr(obj, 'collections'):
# Check if user is in shared_with of any related collection
shared_collections = obj.collections.filter(shared_with=user)
if shared_collections.exists():
return True
# Read permission if public or owner
if request.method in permissions.SAFE_METHODS:
return obj.is_public or obj.user_id == user
# Write permission only if owner or shared user via collections
if obj.user_id == user:
return True
if hasattr(obj, 'collections'):
if obj.collections.filter(shared_with=user).exists():
return True
# Default deny
return False
class IsOwnerOrSharedWithFullAccess(permissions.BasePermission):
"""
Full access for owners and users shared via collections,
read-only for others if public.
"""
def has_object_permission(self, request, view, obj):
user = request.user
if not user or not user.is_authenticated:
return request.method in permissions.SAFE_METHODS and obj.is_public
# If safe method (read), allow if:
if request.method in permissions.SAFE_METHODS:
if obj.is_public:
return True
if obj.user_id == user:
return True
# If user in shared_with of any collection related to obj
if hasattr(obj, 'collections') and obj.collections.filter(shared_with=user).exists():
return True
if hasattr(obj, 'collection') and obj.collection and obj.collection.shared_with.filter(id=user.id).exists():
return True
if hasattr(obj, 'shared_with') and obj.shared_with.filter(id=user.id).exists():
return True
return False
# For write methods, allow if owner or shared user
if obj.user_id == user:
return True
if hasattr(obj, 'collections') and obj.collections.filter(shared_with=user).exists():
return True
if hasattr(obj, 'collection') and obj.collection and obj.collection.shared_with.filter(id=user.id).exists():
return True
if hasattr(obj, 'shared_with') and obj.shared_with.filter(id=user.id).exists():
return True
return False

View file

@ -1,35 +1,412 @@
from django.utils import timezone
import os
from .models import Adventure, Collection
from .models import Adventure, AdventureImage, ChecklistItem, Collection, Note, Transportation, Checklist, Visit, Category, Attachment, Lodging
from rest_framework import serializers
from main.utils import CustomModelSerializer
from users.serializers import CustomUserDetailsSerializer
from worldtravel.serializers import CountrySerializer, RegionSerializer, CitySerializer
from geopy.distance import geodesic
from integrations.models import ImmichIntegration
class AdventureSerializer(serializers.ModelSerializer):
class AdventureImageSerializer(CustomModelSerializer):
class Meta:
model = Adventure
fields = '__all__'
model = AdventureImage
fields = ['id', 'image', 'adventure', 'is_primary', 'user_id', 'immich_id']
read_only_fields = ['id', 'user_id']
def to_representation(self, instance):
# If immich_id is set, check for user integration once
integration = None
if instance.immich_id:
integration = ImmichIntegration.objects.filter(user=instance.user_id).first()
if not integration:
return None # Skip if Immich image but no integration
# Base representation
representation = super().to_representation(instance)
# Prepare public URL once
public_url = os.environ.get('PUBLIC_URL', 'http://127.0.0.1:8000').rstrip('/').replace("'", "")
if instance.immich_id:
# Use Immich integration URL
representation['image'] = f"{public_url}/api/integrations/immich/{integration.id}/get/{instance.immich_id}"
elif instance.image:
# Use local image URL
representation['image'] = f"{public_url}/media/{instance.image.name}"
return representation
class AttachmentSerializer(CustomModelSerializer):
extension = serializers.SerializerMethodField()
class Meta:
model = Attachment
fields = ['id', 'file', 'adventure', 'extension', 'name', 'user_id']
read_only_fields = ['id', 'user_id']
def get_extension(self, obj):
return obj.file.name.split('.')[-1]
def to_representation(self, instance):
representation = super().to_representation(instance)
if instance.image:
if instance.file:
public_url = os.environ.get('PUBLIC_URL', 'http://127.0.0.1:8000').rstrip('/')
print(public_url)
#print(public_url)
# remove any ' from the url
public_url = public_url.replace("'", "")
representation['image'] = f"{public_url}/media/{instance.image.name}"
representation['file'] = f"{public_url}/media/{instance.file.name}"
return representation
def validate_activity_types(self, value):
if value:
return [activity.lower() for activity in value]
return value
class CategorySerializer(serializers.ModelSerializer):
num_adventures = serializers.SerializerMethodField()
class Meta:
model = Category
fields = ['id', 'name', 'display_name', 'icon', 'num_adventures']
read_only_fields = ['id', 'num_adventures']
class CollectionSerializer(serializers.ModelSerializer):
adventures = AdventureSerializer(many=True, read_only=True, source='adventure_set')
def validate_name(self, value):
return value.lower()
def create(self, validated_data):
user = self.context['request'].user
validated_data['name'] = validated_data['name'].lower()
return Category.objects.create(user_id=user, **validated_data)
def update(self, instance, validated_data):
for attr, value in validated_data.items():
setattr(instance, attr, value)
if 'name' in validated_data:
instance.name = validated_data['name'].lower()
instance.save()
return instance
def get_num_adventures(self, obj):
return Adventure.objects.filter(category=obj, user_id=obj.user_id).count()
class VisitSerializer(serializers.ModelSerializer):
class Meta:
model = Visit
fields = ['id', 'start_date', 'end_date', 'timezone', 'notes']
read_only_fields = ['id']
class AdventureSerializer(CustomModelSerializer):
images = serializers.SerializerMethodField()
visits = VisitSerializer(many=True, read_only=False, required=False)
attachments = AttachmentSerializer(many=True, read_only=True)
category = CategorySerializer(read_only=False, required=False)
is_visited = serializers.SerializerMethodField()
user = serializers.SerializerMethodField()
country = CountrySerializer(read_only=True)
region = RegionSerializer(read_only=True)
city = CitySerializer(read_only=True)
collections = serializers.PrimaryKeyRelatedField(
many=True,
queryset=Collection.objects.all(),
required=False
)
class Meta:
model = Adventure
fields = [
'id', 'user_id', 'name', 'description', 'rating', 'activity_types', 'location',
'is_public', 'collections', 'created_at', 'updated_at', 'images', 'link', 'longitude',
'latitude', 'visits', 'is_visited', 'category', 'attachments', 'user', 'city', 'country', 'region'
]
read_only_fields = ['id', 'created_at', 'updated_at', 'user_id', 'is_visited', 'user']
def get_images(self, obj):
serializer = AdventureImageSerializer(obj.images.all(), many=True, context=self.context)
# Filter out None values from the serialized data
return [image for image in serializer.data if image is not None]
def validate_collections(self, collections):
"""Validate that collections belong to the same user"""
if not collections:
return collections
user = self.context['request'].user
for collection in collections:
if collection.user_id != user and not collection.shared_with.filter(id=user.id).exists():
raise serializers.ValidationError(
f"Collection '{collection.name}' does not belong to the current user."
)
return collections
def validate_category(self, category_data):
if isinstance(category_data, Category):
return category_data
if category_data:
user = self.context['request'].user
name = category_data.get('name', '').lower()
existing_category = Category.objects.filter(user_id=user, name=name).first()
if existing_category:
return existing_category
category_data['name'] = name
return category_data
def get_or_create_category(self, category_data):
user = self.context['request'].user
if isinstance(category_data, Category):
return category_data
if isinstance(category_data, dict):
name = category_data.get('name', '').lower()
display_name = category_data.get('display_name', name)
icon = category_data.get('icon', '🌍')
else:
name = category_data.name.lower()
display_name = category_data.display_name
icon = category_data.icon
category, created = Category.objects.get_or_create(
user_id=user,
name=name,
defaults={
'display_name': display_name,
'icon': icon
}
)
return category
def get_user(self, obj):
user = obj.user_id
return CustomUserDetailsSerializer(user).data
def get_is_visited(self, obj):
return obj.is_visited_status()
def create(self, validated_data):
visits_data = validated_data.pop('visits', None)
category_data = validated_data.pop('category', None)
collections_data = validated_data.pop('collections', [])
print(category_data)
adventure = Adventure.objects.create(**validated_data)
# Handle visits
for visit_data in visits_data:
Visit.objects.create(adventure=adventure, **visit_data)
# Handle category
if category_data:
category = self.get_or_create_category(category_data)
adventure.category = category
# Handle collections - set after adventure is saved
if collections_data:
adventure.collections.set(collections_data)
adventure.save()
return adventure
def update(self, instance, validated_data):
has_visits = 'visits' in validated_data
visits_data = validated_data.pop('visits', [])
category_data = validated_data.pop('category', None)
collections_data = validated_data.pop('collections', None)
# Update regular fields
for attr, value in validated_data.items():
setattr(instance, attr, value)
# Handle category - ONLY allow the adventure owner to change categories
user = self.context['request'].user
if category_data and instance.user_id == user:
# Only the owner can set categories
category = self.get_or_create_category(category_data)
instance.category = category
# If not the owner, ignore category changes
# Handle collections - only update if collections were provided
if collections_data is not None:
instance.collections.set(collections_data)
# Handle visits
if has_visits:
current_visits = instance.visits.all()
current_visit_ids = set(current_visits.values_list('id', flat=True))
updated_visit_ids = set()
for visit_data in visits_data:
visit_id = visit_data.get('id')
if visit_id and visit_id in current_visit_ids:
visit = current_visits.get(id=visit_id)
for attr, value in visit_data.items():
setattr(visit, attr, value)
visit.save()
updated_visit_ids.add(visit_id)
else:
new_visit = Visit.objects.create(adventure=instance, **visit_data)
updated_visit_ids.add(new_visit.id)
visits_to_delete = current_visit_ids - updated_visit_ids
instance.visits.filter(id__in=visits_to_delete).delete()
# call save on the adventure to update the updated_at field and trigger any geocoding
instance.save()
return instance
class TransportationSerializer(CustomModelSerializer):
distance = serializers.SerializerMethodField()
class Meta:
model = Transportation
fields = [
'id', 'user_id', 'type', 'name', 'description', 'rating',
'link', 'date', 'flight_number', 'from_location', 'to_location',
'is_public', 'collection', 'created_at', 'updated_at', 'end_date',
'origin_latitude', 'origin_longitude', 'destination_latitude', 'destination_longitude',
'start_timezone', 'end_timezone', 'distance' # ✅ Add distance here
]
read_only_fields = ['id', 'created_at', 'updated_at', 'user_id', 'distance']
def get_distance(self, obj):
if (
obj.origin_latitude and obj.origin_longitude and
obj.destination_latitude and obj.destination_longitude
):
try:
origin = (float(obj.origin_latitude), float(obj.origin_longitude))
destination = (float(obj.destination_latitude), float(obj.destination_longitude))
return round(geodesic(origin, destination).km, 2)
except ValueError:
return None
return None
class LodgingSerializer(CustomModelSerializer):
class Meta:
model = Lodging
fields = [
'id', 'user_id', 'name', 'description', 'rating', 'link', 'check_in', 'check_out',
'reservation_number', 'price', 'latitude', 'longitude', 'location', 'is_public',
'collection', 'created_at', 'updated_at', 'type', 'timezone'
]
read_only_fields = ['id', 'created_at', 'updated_at', 'user_id']
class NoteSerializer(CustomModelSerializer):
class Meta:
model = Note
fields = [
'id', 'user_id', 'name', 'content', 'date', 'links',
'is_public', 'collection', 'created_at', 'updated_at'
]
read_only_fields = ['id', 'created_at', 'updated_at', 'user_id']
class ChecklistItemSerializer(CustomModelSerializer):
class Meta:
model = ChecklistItem
fields = [
'id', 'user_id', 'name', 'is_checked', 'checklist', 'created_at', 'updated_at'
]
read_only_fields = ['id', 'created_at', 'updated_at', 'user_id', 'checklist']
class ChecklistSerializer(CustomModelSerializer):
items = ChecklistItemSerializer(many=True, source='checklistitem_set')
class Meta:
model = Checklist
fields = [
'id', 'user_id', 'name', 'date', 'is_public', 'collection', 'created_at', 'updated_at', 'items'
]
read_only_fields = ['id', 'created_at', 'updated_at', 'user_id']
def create(self, validated_data):
items_data = validated_data.pop('checklistitem_set')
checklist = Checklist.objects.create(**validated_data)
for item_data in items_data:
# Remove user_id from item_data to avoid constraint issues
item_data.pop('user_id', None)
# Set user_id from the parent checklist
ChecklistItem.objects.create(
checklist=checklist,
user_id=checklist.user_id,
**item_data
)
return checklist
def update(self, instance, validated_data):
items_data = validated_data.pop('checklistitem_set', [])
# Update Checklist fields
for attr, value in validated_data.items():
setattr(instance, attr, value)
instance.save()
# Get current items
current_items = instance.checklistitem_set.all()
current_item_ids = set(current_items.values_list('id', flat=True))
# Update or create items
updated_item_ids = set()
for item_data in items_data:
# Remove user_id from item_data to avoid constraint issues
item_data.pop('user_id', None)
item_id = item_data.get('id')
if item_id:
if item_id in current_item_ids:
item = current_items.get(id=item_id)
for attr, value in item_data.items():
setattr(item, attr, value)
item.save()
updated_item_ids.add(item_id)
else:
# If ID is provided but doesn't exist, create new item
ChecklistItem.objects.create(
checklist=instance,
user_id=instance.user_id,
**item_data
)
else:
# If no ID is provided, create new item
ChecklistItem.objects.create(
checklist=instance,
user_id=instance.user_id,
**item_data
)
# Delete items that are not in the updated data
items_to_delete = current_item_ids - updated_item_ids
instance.checklistitem_set.filter(id__in=items_to_delete).delete()
return instance
def validate(self, data):
# Check if the collection is public and the checklist is not
collection = data.get('collection')
is_public = data.get('is_public', False)
if collection and collection.is_public and not is_public:
raise serializers.ValidationError(
'Checklists associated with a public collection must be public.'
)
return data
class CollectionSerializer(CustomModelSerializer):
adventures = AdventureSerializer(many=True, read_only=True)
transportations = TransportationSerializer(many=True, read_only=True, source='transportation_set')
notes = NoteSerializer(many=True, read_only=True, source='note_set')
checklists = ChecklistSerializer(many=True, read_only=True, source='checklist_set')
lodging = LodgingSerializer(many=True, read_only=True, source='lodging_set')
class Meta:
model = Collection
# fields are all plus the adventures field
fields = ['id', 'description', 'user_id', 'name', 'is_public', 'adventures']
fields = ['id', 'description', 'user_id', 'name', 'is_public', 'adventures', 'created_at', 'start_date', 'end_date', 'transportations', 'notes', 'updated_at', 'checklists', 'is_archived', 'shared_with', 'link', 'lodging']
read_only_fields = ['id', 'created_at', 'updated_at', 'user_id']
def to_representation(self, instance):
representation = super().to_representation(instance)
# Make it display the user uuid for the shared users instead of the PK
shared_uuids = []
for user in instance.shared_with.all():
shared_uuids.append(str(user.uuid))
representation['shared_with'] = shared_uuids
return representation

View file

@ -0,0 +1,23 @@
from django.db.models.signals import m2m_changed
from django.dispatch import receiver
from adventures.models import Adventure
@receiver(m2m_changed, sender=Adventure.collections.through)
def update_adventure_publicity(sender, instance, action, **kwargs):
"""
Signal handler to update adventure publicity when collections are added/removed
"""
# Only process when collections are added or removed
if action in ('post_add', 'post_remove', 'post_clear'):
collections = instance.collections.all()
if collections.exists():
# If any collection is public, make the adventure public
has_public_collection = collections.filter(is_public=True).exists()
if has_public_collection and not instance.is_public:
instance.is_public = True
instance.save(update_fields=['is_public'])
elif not has_public_collection and instance.is_public:
instance.is_public = False
instance.save(update_fields=['is_public'])

View file

@ -1,6 +1,6 @@
from django.urls import include, path
from rest_framework.routers import DefaultRouter
from .views import AdventureViewSet, CollectionViewSet, StatsViewSet, GenerateDescription, ActivityTypesView
from adventures.views import *
router = DefaultRouter()
router.register(r'adventures', AdventureViewSet, basename='adventures')
@ -8,7 +8,17 @@ router.register(r'collections', CollectionViewSet, basename='collections')
router.register(r'stats', StatsViewSet, basename='stats')
router.register(r'generate', GenerateDescription, basename='generate')
router.register(r'activity-types', ActivityTypesView, basename='activity-types')
router.register(r'transportations', TransportationViewSet, basename='transportations')
router.register(r'notes', NoteViewSet, basename='notes')
router.register(r'checklists', ChecklistViewSet, basename='checklists')
router.register(r'images', AdventureImageViewSet, basename='images')
router.register(r'reverse-geocode', ReverseGeocodeViewSet, basename='reverse-geocode')
router.register(r'categories', CategoryViewSet, basename='categories')
router.register(r'ics-calendar', IcsCalendarGeneratorViewSet, basename='ics-calendar')
router.register(r'search', GlobalSearchView, basename='search')
router.register(r'attachments', AttachmentViewSet, basename='attachments')
router.register(r'lodging', LodgingViewSet, basename='lodging')
router.register(r'recommendations', RecommendationsViewSet, basename='recommendations')
urlpatterns = [
# Include the router under the 'api/' prefix

View file

@ -0,0 +1,48 @@
from adventures.models import AdventureImage, Attachment
protected_paths = ['images/', 'attachments/']
def checkFilePermission(fileId, user, mediaType):
if mediaType not in protected_paths:
return True
if mediaType == 'images/':
try:
# Construct the full relative path to match the database field
image_path = f"images/{fileId}"
# Fetch the AdventureImage object
adventure = AdventureImage.objects.get(image=image_path).adventure
if adventure.is_public:
return True
elif adventure.user_id == user:
return True
elif adventure.collections.exists():
# Check if the user is in any collection's shared_with list
for collection in adventure.collections.all():
if collection.shared_with.filter(id=user.id).exists():
return True
return False
else:
return False
except AdventureImage.DoesNotExist:
return False
elif mediaType == 'attachments/':
try:
# Construct the full relative path to match the database field
attachment_path = f"attachments/{fileId}"
# Fetch the Attachment object
attachment = Attachment.objects.get(file=attachment_path)
adventure = attachment.adventure
if adventure.is_public:
return True
elif adventure.user_id == user:
return True
elif adventure.collections.exists():
# Check if the user is in any collection's shared_with list
for collection in adventure.collections.all():
if collection.shared_with.filter(id=user.id).exists():
return True
return False
else:
return False
except Attachment.DoesNotExist:
return False

View file

@ -0,0 +1,6 @@
from rest_framework.pagination import PageNumberPagination
class StandardResultsSetPagination(PageNumberPagination):
page_size = 25
page_size_query_param = 'page_size'
max_page_size = 1000

Some files were not shown because too many files have changed in this diff Show more