Command / Reservations / Reservation Board
Reservation Board¶
Reserve and release coordinates under the selected board’s policy.
At a glance¶
Route: /workspaces/{workspace_id}/reservations/{board_id}.
Who can open this page: collection. The workspace must have enabled entitlement and an active, verified membership; ownership does not bypass verification. Sign in with Discord. A current linked Travian account is additionally required to open this board. Sidebar visibility is separate from endpoint permission. This documentation never submits workspace requests.
What you see¶
The board heading shows its name, duration or no-expiry policy and parallel cap. Your active reservations shows your count / limit. Rows show Village, Player, Coordinates, Reserved by, Expires and eligible Release controls. Reserve village opens separate required X and Y numeric inputs. Creation time is not printed. The self-delete setting governs Release but is not a separate detail control.
Who fills in each field¶
| Field or data | What it means | Who fills it in | Can it be changed here? | When it updates |
|---|---|---|---|---|
| Coordinates | Member reserves x/y from -400 to 400; roster name is optional and unknown coordinates can still be reserved. | signed-in-member, roster-ingest |
Member with collection and linked account | Successful reserve transaction |
| Reserved by and expiry | Linked account name and expiry are shown; stored creation time is not displayed. User ID governs ownership. | signed-in-member, backend-derived |
Read-only | Page reload after reserve/release or expiry cleanup |
| Board policy | Read-only name, duration, parallel cap and self-deletion policy from board creator. | workspace-manager |
Read-only | Page load from latest recorded values |
| Your active reservations | Current signed-in user active claim count compared with this board parallel cap. | signed-in-member, backend-derived |
Read-only | Page load after expired rows are removed |
Calculations¶
Reservation expiration¶
reservation.expiry — Board policy determines active reservation lifetime.
Rule: expires_at=None for unlimited; otherwise creation now+timedelta(minutes=board.reservation_limit_minutes). Active if expiry absent or>now; expired if<=now. Board lock, expired cleanup, per-user parallel cap and unique board coordinate are enforced before creation.
| Input | Who fills it in | Unit | Optional | Fallback |
|---|---|---|---|---|
| reservation_limit_minutes | workspace-manager |
minutes | Yes | None =>unlimited |
| parallel_limit | workspace-manager |
active reservations per user/board | No | Required; no fallback |
| Current time | backend-derived |
UTC timestamp | Yes | datetime.now(UTC) |
Output unit: timestamp or unlimited. Precision: Datetime timedelta precision. Rounding: No rounding. Clamp: No output clamp. Timezone: UTC.
Expiry equality is expired, not active. Time-limited board requires1..525600minutes; parallel cap1..100. Roster village missing is allowed for coordinates; board lock/unique coordinate still apply. Self-delete is independent board policy; managers and own allowed deletions use separate gates.
Canonical implementation and dependencies: reviewed source symbols. Non-canonical mirrors: none registered.
Used on: Reservations, Reservation Board
Freshness and updates¶
Page load removes expired rows and refreshes roster-derived labels and your usage. Reserve and Release successes reload the page. A previously open page can become stale; server checks run again on submission. The board retains the selected roster village reference when present, while unknown coordinates retain no roster association.
Actions and permissions¶
Who can perform each action / Who can take action: each actor below needs the exact grant and conditions, independently of page visibility. All writes retain workspace scoping; same-origin checks apply as listed.
| Action | Actor | Permission |
|---|---|---|
| Reserve coordinate | signed-in-member | collection, current linked account, same origin, board parallel cap and unique active coordinate |
| Delete reservation | signed-in-member or workspace-manager | collection plus current linked account and same origin; manage_members OR own reservation with allow_self_delete |
In Trapitan, choose Reserve village, enter X and Y, then Reserve. The button is disabled when your active count reaches the cap. Each component must be an integer from −400 through 400; a missing roster village is allowed. Same coordinates can be claimed once per board, across all users, and can exist on another board. Release has no confirmation dialog and is offered to managers or permitted owners of their own claim.
States and edge cases¶
No villages reserved is the empty state. Missing roster labels appear as Unknown village / Unknown player, while coordinates remain a game-map link. Unlimited expiry prints Never; finite expiry prints YYYY-MM-DD HH:MM UTC. Conflicts show You can reserve up to … villages at once or This village is already reserved. Missing boards/claims return 404. Reserve errors appear in the form; release failure re-enables the button and replaces its text with the error. Managers still need collection and a current linked account to delete.
Related pages¶
Reservations, Villages, Push Calls.
Source references¶
Source reviewed: 2026-10-07
Source references
Stable page ID: command.reservation-board.
src/trapitan/api/routes/web.pysrc/trapitan/web/templates/reservation_detail.htmlsrc/trapitan/web/static/js/reservations.jssrc/trapitan/reservations/service.pysrc/trapitan/authorization/dependencies.pysrc/trapitan/authorization/policy.pysrc/trapitan/api/routes/guards.pysrc/trapitan/authorization/current_account.py
Calculation reservation.expiry:
- Canonical implementation:
src/trapitan/reservations/service.py—_active_reservation_clause. - Dependency:
src/trapitan/reservations/service.py—_remove_expired_for_board. - Dependency:
src/trapitan/reservations/service.py—create_coordinate_reservation. - Dependency:
src/trapitan/reservations/service.py—list_reservation_choices. - Dependency:
src/trapitan/api/routes/web.py—_remove_expired_reservations. - Dependency:
src/trapitan/api/routes/web.py—reservation_boards_page. - Dependency:
src/trapitan/api/routes/web.py—reservation_board_detail_page. - Dependency:
src/trapitan/api/routes/web.py—create_reservation_board.