products#

Core content platform powering blog posts, travel itineraries, categories, favourites, and user preferences. Supports multi-language translation and tier-based access control.

Models#

Model

Description

Category

Content category with image, ordering, homepage toggle

BlogPost

Markdown articles — neighbourhood guides, travel tips, analyses

TravelPreference

User travel preference data (JSON blob)

StayPreference

User accommodation preference choice

TravelMode

Travel mode option (walking, driving, cycling)

Itinerary

Multi-day itinerary with PDF export and Google Maps link

Favorite

User’s saved blog post or itinerary bookmark

URL Routes#

Key routes (the full products URL set is extensive):

Path

View

Description

/blog/

blog listing

Paginated blog post index

/blog/<slug>/

blog detail

Single blog post with comments

/itineraries/

itinerary listing

Browse itineraries

/itineraries/<id>/

itinerary detail

Single itinerary with map

/search/

search

Full-text search across posts and itineraries

Management Commands#

Command

Description

fix_duplicate_schemas

One-off data cleanup for duplicate schema records

Access Control#

Blog posts and itineraries use a three-level access field:

Level

Meaning

all

Publicly visible

subscriber

Requires any active subscription tier

premium

Requires the premium subscription tier

Key Design Decisions#

  • MarkdownX is used for the blog post body, providing a rich editor in the admin.

  • TaggableManager (django-taggit) enables flexible tagging for filtering and search.

  • Favourites use a generic FK pattern — a Favorite can reference either a BlogPost or an Itinerary (both nullable FKs, one must be set).

  • Series support: series_number / series_total fields let posts form ordered series.