{% extends "admin/base.html" %} {% block title %}Listings | Admin{% endblock %} {% block content %}

Inventory

Listings

Create Listing

Showing {{ shown_count }} of {{ total_count }} listings

Import from crawler DB

Two ways: (A) paste a server path to a .zip, a .sqlite3, or a folder containing both vehicles.sqlite3 + images/ — use this for big imports (SFTP the files over with WinSCP, which can resume broken transfers, then point the import here). (B) upload a .sqlite3 or .zip via the browser (smaller imports). If a server path is given, the file upload is ignored.

Keep "Copy images" checked — unchecked, photos are linked as remote URLs that public galleries cannot display.

Repair images only fixes photos for existing listings whose images are missing (empty galleries / placeholder cards) by re-copying them from the crawler source. It never changes titles, descriptions, prices, status, publish state, translations, or inspection reports, and it skips archived listings — the other checkboxes don't apply to it. Use this after an import that came in without photos instead of re-importing.

Reset

Bulk Location & Inspection

Choose one action. Only the fields required for that action are shown.

Scope: selected rows

{% for key in ['q','category','make','model','status','published','year'] %}{% endfor %}

Selected 0 listings

{% for listing in listings %} {% else %} {% endfor %}
Image Stock / Reference Title Odometer Price AI Desc Insp Status Published Location / Inspection Translations Action
{% set thumb = get_listing_primary_image(listing.id) %}{% if thumb %}{{ listing.title_en }}{% else %}
{% endif %}
{{ listing.stock_number }} {{ listing.public_stock_number or "No public ref" }} {{ listing.title_en }}

{{ listing.slug }}

{% if listing.odometer %}{{ "{:,}".format(listing.odometer) }} km{% else %}N/A{% endif %} {{ format_price_for_language(listing.price, settings.default_language or 'en', settings) }} {% if listing.ai_description_status %}AI{% else %}—{% endif %} {% set ist = inspection_statuses.get(listing.id) %} {% if ist == 'approved' %}✓ {% elif ist == 'pending' %}● {% elif ist == 'changes_requested' %}● {% elif ist == 'revoked' %}■ {% else %}—{% endif %} {{ listing.status }} {{ 'Yes' if listing.is_published else 'No' }}

Location: {{ public_location_text(listing) or 'Not assigned / hidden' }}

Inspection: {{ listing.inspection_status or 'not checked' }}{% if listing.inspection_date %} · {{ format_canadian_date(listing.inspection_date) }}{% endif %}

Condition: {{ listing.condition_check_status or 'not checked' }}

Collection: {{ 'Yes' if listing.collection_available else 'No' }} · Delivery: {{ 'Yes' if listing.delivery_available else 'No' }}

{% for item in listing_translation_summary(listing) %} {{ item.label }} {{ item.status }} {% endfor %}
Edit {% if listing.is_published %} View {% endif %}
No listings match those filters.
{% endblock %}