Skip to main content

portfolio-package

A portfolio site package for the Core boilerplate: projects (with an image gallery), skills, education, certifications, services, social links, and a Profile (the About/hero content — headline, tagline, bio, stat-box numbers). It depends on core-package for auth, RBAC, and the shared User model — it never defines its own user/account model; every record here is owned by a Core User via settings.AUTH_USER_MODEL. A user's name and profile picture live on Core's own User model (first_name/last_name/avatar), not here.

Also depends on blog-package — this site's About/portfolio pages include a blog section, so installing portfolio installs blog too (see "Installing into a Core-based project" below).

Project.title/summary/description and Profile.headline/tagline/ bio are translatable via apps.core.models.TranslatableModel — a single translations JSON field per row ({"fa": {"title": "...", ...}, "de": {...}}), not a title_en/title_fa column per language. Add a language by calling PUT /projects/{id}/translations/{language} or PUT /profile/me/translations/{language}, no migration required.

See Core's AGENT.md §10 ("Package architecture") for the full contract this package follows.

Installation

pip install portfolio-package

Requires Python 3.10+ and Django 5.2 (via core-package). This also installs blog-package.

Local development

python -m venv .venv
source .venv/bin/activate
pip install -e /path/to/Core/Core   # core-package, editable
pip install -e ".[dev]"
pytest

Installing into a Core-based project

  1. Install it into the host repo's venv:
    pip install portfolio-package
    
    This also pulls in blog-package. You still need to do steps 2-4 for both portfolio and blog — Core's "no auto-discovery, explicit wiring" convention (§10) means the pip install is automatic, but INSTALLED_APPS/router-mounting/migrate are not; see blog's own README for its exact INSTALLED_APPS/router lines. For local development of either package, install it editable instead (pip install -e ../Packages/portfolio-package).
  2. Add it to INSTALLED_APPS in the host's config/settings/base.py, under the # site packages comment (after the local apps block):
    # site packages
    "blog",
    "portfolio",
    
  3. Mount its router in the host's config/api.py:
    from blog.api import router as blog_router
    from portfolio.api import router as portfolio_router
    ...
    api.add_router("/blog", blog_router)
    api.add_router("/portfolio", portfolio_router)
    
    Since both are wildcard-free routers, order relative to the other add_router calls doesn't matter.
  4. Migrate:
    python manage.py migrate
    
  5. Optional — add a nav entry under UNFOLD["SIDEBAR"]["navigation"] in the host's config/settings/base.py for its admin models (Project, Profile, Skill, etc., and blog's Post, Comment, etc.).

Endpoints

Mounted at whatever prefix the host chooses (/portfolio in the example above):

  • GET /projects — paginated list of published projects (public), optional ?user_id= and ?lang=
  • GET /projects/by-slug/{slug} — published project detail (public), optional ?lang=
  • GET /profile?user_id= — a user's About/hero content (public), optional ?lang=
  • GET /skills, /services, /education, /certifications, /social-links — public read-only lists, optionally filtered by ?user_id=
  • POST /projects, GET /projects/{project_id}, PATCH /projects/{project_id}, DELETE /projects/{project_id} — admin-only (require_role("admin"), from Core)
  • PUT /projects/{project_id}/translations/{language} — admin-only; sets the translated title/summary/description for that language
  • PATCH /profile/me — admin-only; create/update the caller's own Profile
  • PUT /profile/me/translations/{language} — admin-only; sets the translated headline/tagline/bio for that language

Skills/education/certifications/services/social-links/project images are managed through the Django admin (no write API for them yet — deliberately, to avoid building endpoints nothing needs yet).

Metadata

Release files for portfolio-package 0.1.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for portfolio-package 0.1.0
File Size Uploaded
portfolio_package-0.1.0.tar.gz 16.9 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for portfolio-package 0.1.0
File Interpreter ABI Platform
portfolio_package-0.1.0-py3-none-any.whl Python 3 none any Details

Total release size: 35.8 kB

Release files / portfolio_package-0.1.0.tar.gz

Download URL portfolio_package-0.1.0.tar.gz
Size 16.9 kB
Tags Source
SHA-256 checksum
How to use checksums
9814cb51ce710bae08b062d860aaff664cd888aa94582df62a0eacec2041450c
BLAKE2b-256 checksum
How to use checksums
0e560cae764350e62cf10722d7214588dce9a858ee8e3109478c506f8923b67c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 7, 2026.

Transparency log

Release files / portfolio_package-0.1.0-py3-none-any.whl

Download URL portfolio_package-0.1.0-py3-none-any.whl
Size 18.9 kB
Tags Python 3
SHA-256 checksum
How to use checksums
bf7794358d15c316641cf4304acea4a0a71409b85cd87d42685981ac2a268591
BLAKE2b-256 checksum
How to use checksums
bcb3e218c6a1059c61f9a9d1c425f548bec0ba4be5c60dbd429a12aef0cc0737
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 7, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

0.1.0 This release

2 release 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