Skip to content

Trips and kit

A trip is a plan over a run of days. It points at locations already in the catalogue; it does not copy them. Kit Bag is the equipment the account owns. A trip's packing list points at those items.

Fields are on Trip, TripEntry, KitItem, and TripKitItem in catalogue/models.py. Categories and specifications are the registry in catalogue/kit.py, which the sync validators, the shell, and the assistants all read. Adding a category there does not need a migration.

Items still unbuilt (a ZIP of one trip, sunrise and sunset beyond the three-day forecast, kit prices, kit inside the catalogue ZIP) are listed in future-features.md and are not repeated here.

Trip

A trip has a name, a start date, an end date, notes, the folders whose locations the itinerary offers, and an optional basecamp. The basecamp is a name plus an optional position, entered the same way as a parking position: an OS grid reference, a UK postcode, or latitude and longitude. The end date is on or after the start. The span is at most 31 days (TRIP_MAX_DAYS).

Each day has three slots: sunrise, daytime, and sunset. Each slot holds one ordered list of entries. Rank orders them. The first entry that is not marked No-go is the current plan. The entries under it are alternatives. Marking No-go does not reorder the list.

An entry is a saved location or an activity. Activities are rest, travel, and scouting, each with a title and notes. A scouting activity may also have a position for somewhere that is not a saved location yet. A location entry has a decision of undecided, go, or no-go, and can be marked as scouting. A scouting location shows a Scouting badge, has no forecast chip, and takes no decision. The same location may appear in several slots, and only once in the same slot.

Notes can be kept on the trip, on a day (day_notes), and on an entry.

Shortening the dates does not delete entries. An entry whose date is empty or falls outside the trip is shown in an Unscheduled tray, and it returns to its day if the trip is lengthened to cover that date. Deleting a location or a folder does not remove trip entries. An entry whose location is in Trash stays, shown as in Trash, and shows the location again if that location is restored. Deleting a trip sends the trip, its entries, its kit rows, and its assistant conversation to Trash together (catalogue/trash.py).

Duplicate copies the trip onto dates the photographer chooses: the name, folders, basecamp, notes, day notes, every entry, and the kit list. Every decision on the copy is undecided, and nothing on the copy is marked packed. This is done on the device (static/tempest/js/ui/tripform.js), so it works offline.

Trips is in the sidebar, not on the iPhone bottom bar. On a wide screen the locations sit in a panel on the left and the days stack on the right, with the three slots side by side. A location or an entry can be dragged onto a slot. On a phone there is no side panel: Add asks for the day and the slot, and each entry has a menu for the same moves. Removing an entry sends it to Trash, with Undo.

Routes: /app/trips, /app/trips/new, /app/trips/:id, /app/trips/:id/edit, /app/trips/:id/entries/:entryId, /app/trips/:id/kit, and /app/trips/:id/assistant.

Forecast chips

Opening a trip loads a forecast for each location entry that is dated today or one of the next two days in Europe/London, is not marked scouting, and is not an activity. It reuses a forecast saved less than an hour ago. Two locations are fetched at a time (fillForecasts in static/tempest/js/ui/trip.js). The chip shows weather suitability, the rating, the top reason, cloud and, for sunrise and sunset, sky colour and the terrain sentence. Daytime names the chosen two-hour session. Specialist lines are not on the chip. A saved forecast that is old or could not be refreshed is shown with the time it was fetched. A date before today is Passed. A later date says when the three-day window will first include it. The day heading shows sunrise and sunset from the first forecast that has that day. A forecast never changes an entry or a decision.

The trip map shows the trip's locations, scouting positions, and the basecamp. It uses the same map as the catalogue. See catalogue.md and forecasting.md.

Kit Bag

My Kit belongs to the account. A trip does not keep its own copy of an item. Kit Bag is in the sidebar, after Trips, and on the phone it is in that same menu.

An item has a category, and at least a custom name, a manufacturer, or a model. Quantity starts at 1. Specifications are optional and follow the category. A blank specification stays unknown. Notes are optional. The categories, in order, are camera bodies, lenses, filters, tripods and support, drones, camera bags, batteries and power, memory cards and storage, accessories, and other equipment. The keys for each one are CATEGORIES and SPECS in catalogue/kit.py.

Archiving hides the item when choosing what to take, and leaves it on trips that already include it, with an Archived badge. Deleting an item sends it to Trash for 30 days. A trip that uses it keeps the row and shows In Trash. Restoring the item puts it back on those trips. When Trash is emptied, the trip still shows the name (item_label is filled in when the kit item is purged) and marks it Deleted from My Kit.

Trip kit is the packing list for one trip, at /app/trips/:id/kit. The trip header has a Kit button with the progress, such as Kit 7/12. The photographer adds items from My Kit, several at a time, or adds a new item and places it on the trip. Removing an item from the trip sets removed and does not delete it from My Kit. Undo puts that row back. One item is a checkbox. Several of the same item show how many are packed, such as 2 of 4. Packed means packed_quantity has reached quantity. The page shows how many rows are packed and how many are still to pack, and it can hide the ones already packed. Each row can keep a note for that trip.

The same item is one row on a trip (catalogue_tripkit_trip_item). Two devices that add it while offline end up with that one row. A field both of them changed becomes a conflict, in the same way as any other record.

The trip assistant and the general assistant may suggest equipment. The photographer applies any change. See assistants.md.

Where a change lands

Change Place
Trip and entry fields, the 31-day limit catalogue/models.py (TRIP_MAX_DAYS)
Dates, slots, decisions, unscheduled tray static/tempest/js/tripplan.js
Trip page, drag and drop, forecast chips static/tempest/js/ui/trip.js
Create, edit, duplicate static/tempest/js/ui/tripform.js
Kit categories and specifications catalogue/kit.py
My Kit and a single item static/tempest/js/ui/kitbag.js, kititem.js
Packing list static/tempest/js/ui/tripkit.js
Trash of a trip, including its kit and conversation catalogue/trash.py
Sync of trips and kit syncapi/engine.py, syncapi/schema.py