Skip to main content

Target-generic reviews and ratings for the Stapel framework

Project description

stapel-reviews

CI codecov PyPI

Target-generic reviews and ratings for the Stapel framework — composable Django apps that deploy as a monolith or as microservices without changing module code.

A generic review core — Review (author + rating + body about an opaque target) and Response (the target owner's reply) — driven entirely by a per-target-type policy registry. The module ships knowing nothing about what gets reviewed: a host registers its target types (a seller, a listing, a driver, a course), each with a policy, and answers the domain questions — "may this author review?", "who owns this target?" — through comm Function callbacks, so the module never imports a host model.

Install

pip install stapel-reviews
INSTALLED_APPS = [
    # ...
    "stapel_reviews",
]

# urls.py
path("reviews/", include("stapel_reviews.urls"))

Concepts

  • Target — opaque: target_type (a key the host registered) + target_key (an opaque host string — a UUID, a slug, a composite). No FK to any host model; the module is domain-blind.
  • Policy — per target type: who may review (can_review comm callback), pre/post moderation, one-review-per-author, whether owner responses are allowed (allow_response), who may moderate/respond (can_moderate comm callback).
  • Aggregate — the module owns avg/count over published reviews per target, and emits a generic fact carrying it on every visibility change, so a host catalog maintains its own rating projection (§10) without calling back.
STAPEL_REVIEWS = {
    "TARGET_TYPES": {
        "seller": {
            "can_review": "marketplace.buyer_of_seller",   # host comm Function
            "can_moderate": "marketplace.is_seller_owner",
            "moderation": "post",
            "one_per_author": True,
            "allow_response": True,
        },
        "listing": {"moderation": "pre"},
    },
}
from stapel_reviews import services

review = services.create_review(
    target_type="seller", target_key="s-42", author=user, rating=5, body="great",
)
services.moderate_review(review, actor=owner, action="hide", reason="spam")
services.respond(review, author=owner, body="thanks for the feedback")
agg = services.aggregate("seller", "s-42")   # Aggregate(avg=..., count=...)

Settings

All configuration lives in the STAPEL_REVIEWS namespace (dict setting, flat setting, or env var — resolved lazily):

Key Default Meaning
TARGET_TYPES {} The target-type registry {type: policy}, merged over the (empty) built-ins; None removes a type
MODERATION_DEFAULT "post" Default moderation mode (post/pre) for types that don't override it
RESPONSES True Whether owner responses are allowed by default
RATING_MIN 1 Inclusive minimum rating
RATING_MAX 5 Inclusive maximum rating

comm surface

Kind Name Contract
Emit reviews.review.published A review became visible — carries {aggregate: {avg, count}} for the host projection
Emit reviews.review.hidden A review left the visible set — carries the updated aggregate
Function reviews.aggregate {target_type, target_key} -> {avg, count}
Callback (host) policy can_review {author_id, target_type, target_key} -> bool — the host answers
Callback (host) policy can_moderate {actor_id, target_type, target_key} -> bool — the host answers

Extension points

See MODULE.md — the agent-facing map of every fork-free seam (the TARGET_TYPES registry and its policy callbacks, the projection emits, the aggregate Function, serializer seams, settings).

Development

pip install -e . && pip install pytest pytest-django ruff
./setup-hooks.sh
pytest tests/

License

MIT

Project details


Download files

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

Source Distribution

stapel_reviews-0.1.1.tar.gz (36.0 kB view details)

Uploaded Source

Built Distribution

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

stapel_reviews-0.1.1-py3-none-any.whl (35.0 kB view details)

Uploaded Python 3

File details

Details for the file stapel_reviews-0.1.1.tar.gz.

File metadata

  • Download URL: stapel_reviews-0.1.1.tar.gz
  • Upload date:
  • Size: 36.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for stapel_reviews-0.1.1.tar.gz
Algorithm Hash digest
SHA256 221de9913ecacf1e58d27a9b8619c834635685fda8e7e06794a9efa109d9a4fe
MD5 83d5403f43a3b062b566e40447d2bf32
BLAKE2b-256 345facc7a525afa399431c5e3950cb94595cb2ef08fff81a9ed1c3c202aca5c0

See more details on using hashes here.

Provenance

The following attestation bundles were made for stapel_reviews-0.1.1.tar.gz:

Publisher: publish.yml on usestapel/stapel-reviews

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_reviews-0.1.1-py3-none-any.whl.

File metadata

  • Download URL: stapel_reviews-0.1.1-py3-none-any.whl
  • Upload date:
  • Size: 35.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for stapel_reviews-0.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 f42d724d3e264a0dd9c344ea453b58f610f5f1f7fbdd4f5d2cfd0eaea31eb827
MD5 fe78e2a18fd8cb56550a7b13a8729561
BLAKE2b-256 e02526e892874cf00339ce6e9fc252a4460d86c00e13ad7d5d408aa81426c8ab

See more details on using hashes here.

Provenance

The following attestation bundles were made for stapel_reviews-0.1.1-py3-none-any.whl:

Publisher: publish.yml on usestapel/stapel-reviews

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

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page