Skip to content
Skip to documentation content

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.

Reservations, Villages, Push Calls.

Source references

Source reviewed: 2026-10-07

Source references

Stable page ID: command.reservation-board.

  • src/trapitan/api/routes/web.py
  • src/trapitan/web/templates/reservation_detail.html
  • src/trapitan/web/static/js/reservations.js
  • src/trapitan/reservations/service.py
  • src/trapitan/authorization/dependencies.py
  • src/trapitan/authorization/policy.py
  • src/trapitan/api/routes/guards.py
  • src/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.