stapel-classified
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
listingsearch source (listings.search_documents/search_export -> SearchDocumentInput, invalidated by listing.*) and thelisting/reviewmoderation 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.8 |
| 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 throughlistings.search_documents/listings.search_export, invalidated bylisting.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.submittedopens the case and nothing is public until the verdict) andreview(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
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file stapel_classified-0.1.8.tar.gz.
File metadata
- Download URL: stapel_classified-0.1.8.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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8f50efbce19d74b73bfbe78193b91132cf446734bed541c2b65c00e11c35deb5
|
|
| MD5 |
d8e19bca3eaa398497c45848eaee890c
|
|
| BLAKE2b-256 |
06163813f486196093007a5cdc1a277e9b5a04b26eec293b9bc3d32e2d35be47
|
Provenance
The following attestation bundles were made for stapel_classified-0.1.8.tar.gz:
Publisher:
publish.yml on usestapel/stapel-classified
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
stapel_classified-0.1.8.tar.gz -
Subject digest:
8f50efbce19d74b73bfbe78193b91132cf446734bed541c2b65c00e11c35deb5 - Sigstore transparency entry: 2579434694
- Sigstore integration time:
-
Permalink:
usestapel/stapel-classified@3d1fb1da529a12a707b4bad0baec5241393ddc33 -
Branch / Tag:
refs/tags/v0.1.8 - Owner: https://github.com/usestapel
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@3d1fb1da529a12a707b4bad0baec5241393ddc33 -
Trigger Event:
push
-
Statement type:
File details
Details for the file stapel_classified-0.1.8-py3-none-any.whl.
File metadata
- Download URL: stapel_classified-0.1.8-py3-none-any.whl
- Upload date:
- Size: 36.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3658a8f98e76ff401fa5f5e48c66470374e663e6e4bc8105b466e89690b67f69
|
|
| MD5 |
50f54927186d4a2bb21a22d52c18099b
|
|
| BLAKE2b-256 |
4f46e77018faeeaccfa0f7561b4a6c356c154164759f48c35ce0d66c37717adb
|
Provenance
The following attestation bundles were made for stapel_classified-0.1.8-py3-none-any.whl:
Publisher:
publish.yml on usestapel/stapel-classified
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
stapel_classified-0.1.8-py3-none-any.whl -
Subject digest:
3658a8f98e76ff401fa5f5e48c66470374e663e6e4bc8105b466e89690b67f69 - Sigstore transparency entry: 2579434728
- Sigstore integration time:
-
Permalink:
usestapel/stapel-classified@3d1fb1da529a12a707b4bad0baec5241393ddc33 -
Branch / Tag:
refs/tags/v0.1.8 - Owner: https://github.com/usestapel
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@3d1fb1da529a12a707b4bad0baec5241393ddc33 -
Trigger Event:
push
-
Statement type: