Skip to main content

stapel-classified

CI coverage pypi downloads python license llms.txt

Composite preset for location-bound classified ads: the stapel-shop composite (categories + listings + reviews) plus stapel-geo, stapel-search and stapel-moderation. Carries the cross-domain declarations no member is allowed to write: the listing search source (listings.search_documents/search_export -> SearchDocumentInput, invalidated by listing.*) and the listing/review moderation target policies, plus the shop composite's ListingReviewSummaryProjection. Listing coordinates are the listing's own fields, not a projection. Mounts no urls of its own.

Part of the Stapel framework — composable Django apps that deploy as a monolith or as microservices without changing module code.

Install

pip install stapel-classified

At a glance

Fact Value
Version 0.1.7
Python >=3.11 (3.11, 3.12, 3.13, 3.14)
Fleet dependencies stapel-attributes · stapel-categories · stapel-geo · stapel-listings · stapel-moderation · stapel-notifications (optional) · stapel-reviews · stapel-search

Documentation

capabilities.json · llms.txt (for agents)

Assemble (one line)

pip install stapel-tools
stapel-assemble myads --libs classified
cd myads && make test

That expands classified through the STAPEL_LIBS requires closure and wires every member module into INSTALLED_APPS, requirements.txt, urls.py and CONFIG.MD, then runs the verify gates.

Manual wiring (no scaffold)

# settings.py
from stapel_classified import preset

INSTALLED_APPS = [
    # ... django/stapel-core baseline (incl. stapel_core.django.projections)
    *preset.INSTALLED_APPS,
]
for _k, _v in preset.SETTINGS_DEFAULTS.items():
    globals().setdefault(_k, _v)

# urls.py
from django.urls import include, path

from stapel_classified import preset

urlpatterns = [
    path(prefix, include(module)) for prefix, module in preset.URL_INCLUDES
]

Mount from preset.URL_INCLUDES rather than by hand: stapel-categories and stapel-listings contribute only the v1/ segment and belong under <mod>/api/, while reviews, geo, search and moderation bake api/v1/ in themselves. Both end at /<mod>/api/v1/..., and getting it wrong is a stapel_core.mounts.E004 refusal to boot, not a cosmetic difference.

Config checklist (fill these, in the generated project's CONFIG.MD too)

Key Note
STAPEL_REVIEWS["TARGET_TYPES"] prefilled by the preset (targets listing)
STAPEL_SEARCH["SOURCES"] prefilled by the preset (the listing source)
STAPEL_MODERATION["TARGET_TYPES"] prefilled by the preset (listing pre-publication, review post)
STAPEL_ACCESS["ROLES"] yours — the moderation console is staff-only; preset.RECOMMENDED_ACCESS_ROLES shows the shape
STAPEL_GDPR["DATA_OWNERS"] yours — must list "moderation", or erasure never closes over complaint data
STAPEL_MODERATION["APPEAL_URL_TEMPLATE"] yours — an empty appeal link is what DSA Art. 17 notices
STAPEL_SEARCH["BACKEND"] defaults to Postgres; name naive or meili if that is not your engine
STAPEL_LISTINGS["BASE_CURRENCY"] default USD — set your currency
STAPEL_GEO[...] geocoder provider/keys — see stapel-geo CONFIG.MD
listing coordinates lat/lon are LISTING fields (no projection needed) — see stapel-listings

Glue

Two members ship deliberately empty registries, because neither may know what a listing is. This package is the one place that knows both sides:

  • STAPEL_SEARCH["SOURCES"]["listing"]stapel_classified.search_sources.listing_source. Pulls documents through listings.search_documents / listings.search_export, invalidated by listing.published / listing.updated / listing.removed. Registering it is also what wires the subscribers — you write no signal handler. Facets are built from listings' features_search (stapel-search's declared lossy fallback: attribute range filters do not work until listings serves DAOs).
  • STAPEL_MODERATION["TARGET_TYPES"]listing (pre-publication: listing.submitted opens the case and nothing is public until the verdict) and review (post: live on arrival, a verdict is a takedown).

Coordinates need no glue at all: they are the listing's OWN fields (lat/lon on the listing), not a foreign aggregate.

License

MIT — see LICENSE.


This page is assembled by stapel-readme from docs/readme.md plus the contract artifacts in docs/. Edit the prose in docs/readme.md; the badges, facts and links above and below it are generated — do not hand-edit README.md.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

stapel_classified-0.1.7.tar.gz (31.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

stapel_classified-0.1.7-py3-none-any.whl (36.8 kB view details)

Uploaded Python 3

File details

Details for the file stapel_classified-0.1.7.tar.gz.

File metadata

  • Download URL: stapel_classified-0.1.7.tar.gz
  • Upload date:
  • Size: 31.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for stapel_classified-0.1.7.tar.gz
Algorithm Hash digest
SHA256 ce87e5ce2d5c70f16c8d5240643c94ae201ba62a6e87c4843abb0cb8b0c92929
MD5 31b78b6644404c4f7fe398a2cc7fb3a3
BLAKE2b-256 52266ca94ee7333d8745c25de56a84b8841ae2b28d2bda29ae9f599c6f77c36e

See more details on using hashes here.

Provenance

The following attestation bundles were made for stapel_classified-0.1.7.tar.gz:

Publisher: publish.yml on usestapel/stapel-classified

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file stapel_classified-0.1.7-py3-none-any.whl.

File metadata

File hashes

Hashes for stapel_classified-0.1.7-py3-none-any.whl
Algorithm Hash digest
SHA256 786ea07d3ca2318691589d0c435b22c733feab605aa941eef7dc0ea9db1f8058
MD5 4ca908bffd4a2e36906049bd70eca02d
BLAKE2b-256 7f2a312c1fc1e34bcb9051f13c4d5880d7b3c28894a885dfdc01e7da2f793b2c

See more details on using hashes here.

Provenance

The following attestation bundles were made for stapel_classified-0.1.7-py3-none-any.whl:

Publisher: publish.yml on usestapel/stapel-classified

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

0.10.19

2 files

0.10.18

2 files

0.10.17

2 files

0.10.16

2 files

0.10.15

2 files

0.10.14

2 files

0.10.13

2 files

0.10.11

2 files

0.10.10

2 files

0.10.9

2 files

0.10.8

2 files

0.10.7

2 files

0.10.6

2 files

0.10.5

2 files

0.10.4

2 files

0.10.3

2 files

0.10.2

2 files

0.10.1

2 files

0.10.0

2 files

0.9.5

2 files

0.9.4

2 files

0.9.3

2 files

0.9.1

2 files

0.9.0

2 files

0.8.7

2 files

0.8.6

2 files

0.8.5

2 files

0.8.4

2 files

0.8.3

2 files

0.8.1

2 files

0.8.0

2 files

0.7.2

2 files

0.7.1

2 files

0.7.0

2 files

0.6.2

2 files

0.6.0

2 files

0.5.4

2 files

0.4.3

2 files

0.4.2

2 files

0.4.1

2 files

0.4.0

2 files

0.3.3

2 files

0.2.1

2 files

0.2.0

2 files

0.1.8

2 files

This release

0.1.7 This release

2 files

0.1.5

2 files

0.1.4

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page