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
- Install it into the host repo's venv:
pip install portfolio-package
This also pulls inblog-package. You still need to do steps 2-4 for bothportfolioandblog— Core's "no auto-discovery, explicit wiring" convention (§10) means the pip install is automatic, butINSTALLED_APPS/router-mounting/migrateare not; seeblog's own README for its exactINSTALLED_APPS/router lines. For local development of either package, install it editable instead (pip install -e ../Packages/portfolio-package). - Add it to
INSTALLED_APPSin the host'sconfig/settings/base.py, under the# site packagescomment (after the local apps block):# site packages "blog", "portfolio",
- 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 otheradd_routercalls doesn't matter. - Migrate:
python manage.py migrate
- Optional — add a nav entry under
UNFOLD["SIDEBAR"]["navigation"]in the host'sconfig/settings/base.pyfor its admin models (Project,Profile,Skill, etc., andblog'sPost,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 translatedtitle/summary/descriptionfor that languagePATCH /profile/me— admin-only; create/update the caller's ownProfilePUT /profile/me/translations/{language}— admin-only; sets the translatedheadline/tagline/biofor 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)
| File | Size | Uploaded | |
|---|---|---|---|
| portfolio_package-0.1.0.tar.gz | 16.9 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| 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 logRelease 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