Releases: Null-Pointers2-0/JoinProject
Release list
v1.3.0
What's Changed
- fix(footer): added mailto to the footer email by @Bogdan2005-19 in #183
- 180 fixdashboard rename chart labels to reflect view counts by @gery25 in #185
- 176 styleprofile add colored borders and visual hierarchy to settings cards by @gery25 in #184
- 177 refactorsidebar remove non functional search input by @NorbertAguilera in #186
- feat(history): add viewing history display #182 by @Karu174 in #188
- feat(recommendations): fix duplicates and implement carousel in series details by @Karu174 in #189
- feat(admin): add system logs tab and restrict platform tracking to logged-in users by @Karu174 in #193
- 181 featprofile add complete user profile display with demographic data by @gery25 in #190
- 181 featprofile add complete user profile display with demographic data by @gery25 in #194
- 181 featprofile add complete user profile display with demographic data by @gery25 in #195
- Dev by @gery25 in #196
Full Changelog: v1.2.0...v1.3.0
v1.2.0
✨ Highlights
📊 Analytics Dashboard
- Interactive dashboard with dynamic charts for data visualization.
- Date and platform filtering for view segmentation.
- CSV data export with downloadable reports.
🖼️ Catalog with Posters
- Movies and series display posters fetched from the API.
- Poster path editing from the staff admin panel.
- Intelligent content merging to eliminate duplicates.
- Platform filtering to see which services offer each title.
👥 Permission & Role Management
- Complete role CRUD (Admin, Staff, Consumer).
- Session invalidation in under 1 second on permission changes.
- Double validation for critical administrative actions.
- Immutable audit log (#135) for all permission changes.
💬 Social System
- Community reviews and ratings for each title.
- Aggregated average scores per content.
- Genre-based content recommendations.
🔄 Redirect & Tracking
- Internal click tracking for streaming platforms (#24).
- Redirect without leaving the application domain.
📋 Reports & GDPR
- Autonomous generation of segmented and anonymized market reports.
- Automatic anonymization of personal data in CSV exports.
- GDPR-compliant data exports for external platforms.
🔐 Administration
- Credential emailing when creating users.
- User creation with role assignment from the admin panel.
- Role-based intelligent redirect after login.
- Staff Admin panel for managing users and platforms.
🌍 Internationalization
- Full translations for Catalan (ca), Spanish (es), and English (en).
- Updated all text in HTML templates and .py files.
🗄️ Infrastructure
- Migration to PostgreSQL with Neon support.
- Database cloning to local SQLite for development.
- Automated DB backup.
- Comparison between DB and API to update outdated content.
- Stable deployment on Render with Docker.
🛠️ Tech Stack
| Layer | Technology |
|---|---|
| Framework | Django 6.0.3 |
| Language | Python 3.13 |
| Database | PostgreSQL (SQLite in dev) |
| Task Scheduler | APScheduler 3.11.2 |
| Static Files | WhiteNoise 6.4.0 |
| HTTP Client | requests 2.32.5 |
| Images | Pillow 12.2.0 |
| Environment | python-dotenv 1.2.2 |
| Containers | Docker + Docker Compose |
| CI/CD | GitHub Actions → Render |
🐛 Bug Fixes
- Duplicate contents in catalog search
- Incorrect platform filtering
- Test failures with the new database
- Merge conflicts in Content Management and CriticalRefactors
- User profile: incorrect admin login
- Star rating visuals
- Render deployment failures
📦 How to Deploy
git checkout main
git pull origin main
docker compose up --buildMake sure your .env has the required variables:
API_KEY_8080=<your_key>
API_KEY_8081=<your_key>
API_KEY_8082=<your_key>
DATABASE_URL=postgres://user:pass@db:5432/joinproject_db
DJANGO_DEBUG=False
THEMOVIEDB_API_KEY=<your_key>
Full Changelog: v1.1.0...v1.2.0 (1.1.0...v1.2.0)
Contributors
- @Karu174 — User permission management (#132-#135), audit log, social reviews, redirect tracking
- @NorbertAguilera — Posters, DB clone, content merge, translations, tests, DB comparison
- @gery25 — Dashboard, analytics, CSV export, login-redirect, security restrictions, reports, GDPR
- @Bogdan2005-19 — DB refactor, Docker/Render deployment, admin features, credential emails, CI/CD
What's Changed
- Html refactor branch by @Bogdan2005-19 in #108
- 23 featcontent UI display movieseries details and available platforms by @Bogdan2005-19 in #110
- fix(home): Search catlog does not show duplicates by @Bogdan2005-19 in #111
- 21 featcontent implement search system and detailed content view by @NorbertAguilera in #112
- Quality metrics TEST by @Bogdan2005-19 in #113
- fix(profile-api): resolve AttributeError in profile API and include favorite series by @Karu174 in #115
- 104 featdatabase actualize the database as the uml by @NorbertAguilera in #116
- fix: Localy fixed db work + testing render PR prewiew by @Bogdan2005-19 in #118
- feat(data-base): add the visualitzations table by @gery25 in #137
- Merge pull request #137 from Null-Pointers2-0/19-featexport-generate-… by @gery25 in #138
- 19 featexport generate and download csv reports by @gery25 in #139
- 17 featanalytics implement admin dashboard and csv data export by @gery25 in #140
- 20 featadmin UI implement data filtering by date and platform by @gery25 in #141
- fix: Changed settings to use sqlite on debug by @Bogdan2005-19 in #143
- 18 featadmin UI create interactive analytics dashboard by @gery25 in #144
- 20 featadmin UI implement data filtering by date and platform by @gery25 in #145
- 17 featanalytics implement admin dashboard and csv data export by @gery25 in #146
- fix(render): Making dynamic port asignment and use unicorn by @Bogdan2005-19 in #148
- feat(social): implement community reviews, ratings and movie recommendations #25 (#34, #35, #36) by @Karu174 in #149
- Fix/star rating visuals by @Karu174 in #150
- feat(reports): automatic anonymization of personal data in CSV export and here tests by @gery25 in #162
- feat(legal): GDPR compliant anonymization for external platform exports by @gery25 in #163
- feature(admin): Implemented admin users creation and deletion by @Bogdan2005-19 in #151
- feat(DB_backup): added the db backup with instructions comented by @NorbertAguilera in #153
- Redirect role Implemented to restrict staff and admin access (First merge PR151) by @Bogdan2005-19 in #155
- 120 featreports autonomous generation of segmented and anonymized market reports by @gery25 in #164
- feat(redirect): implement internal tracking for platform clicks without external redirection #24 by @Karu174 in #165
- Critical refactors by @Bogdan2005-19 in #161
- 124 featcatalog content poster selection and merging by @NorbertAguilera in #167
- Feat/user permission management by @Karu174 in #169
- fix (translations): actualized all the translations from the html files by @NorbertAguilera in #171
- 172 fixtranslations update translations from py by @NorbertAguilera in #174
- Dev by @gery25 in #175
Full Changelog: 1.1.0...v1.2.0
v1.1.0
What's Changed
- fix (isikawatools) :Update issues_histogram.yml by @NorbertAguilera in #93
- 11 featautomatize integrate the ishikawatools by @gery25 in #94
- feat(profile): subscription platform management UI by @gery25 in #95
- feat(followed-ui): add Followed page with movies & series view by @gery25 in #96
- 97 featfooter privacity add privacity info on footer by @gery25 in #98
- 23 featcontent UI display movieseries details and available platforms by @Bogdan2005-19 in #99
- fix(profile): Followed series in profile page now redirect correctly by @Bogdan2005-19 in #106
- Dev by @NorbertAguilera in #103
Full Changelog: v1.0.0...1.1.0
v1.0.0
🎬 JoinProject v1.0.0 — First Official Release
JoinProject is a multi-platform streaming content aggregator. It connects to multiple independent streaming service APIs, consolidates their catalogs (movies & series) into a unified database, and presents users with a single interface to browse, filter and discover content across platforms.
Caution
The streaming APIs are not yet publicly deployed. The three backend API instances (ports 8080, 8081, 8082) that power the catalog synchronisation are part of a separate service repository (Models-de-proc-s-26) which has not been published or hosted publicly at the time of this release. As a result, the automatic catalog sync on startup will not work unless you run the API containers locally yourself. See the Setup & Run section for instructions.
✨ What's included in this release
🏠 Home Page
- Paginated movie catalog (10 items per page) powered by Django's
Paginator. - Real-time filtering by genre, director and age rating directly from the home page.
- Full-text search by title (
icontainsquery). - Fully responsive card-based layout following the project Style Guide.
📚 Content Catalog
- Dedicated
/catalog/route with the same search and multi-filter capabilities as the home page. - Separate detail page (
/movie/<id>/) for each movie, including genre-based content recommendations (up to 5 similar titles).
🔄 API Integration & Automatic Synchronisation
- On server startup, the application automatically fetches and stores the full catalog from 3 independent streaming API instances (ports 8080, 8081, 8082) using API key authentication (
X-API-KEYheader). - Synced data includes: Directors, Genres, Age Ratings, Movies and Series — all stored locally in the application's database.
- A background cron job (APScheduler) re-syncs the catalog every night at 03:00 AM without requiring any manual intervention.
- Each API instance is tracked independently in the database (
APImodel, keyed by port), so per-source data provenance is preserved.
🎞️ Movies & Series Models
- Movie: title, synopsis, year, rating, expiry date, director, genre, age rating, source API.
- Series: title, synopsis, start/end year, total seasons, rating, expiry date, director, genre, age rating, country, language, source API.
- Genre-based similarity engine for movie recommendations (
get_similar_by_genre()).
👤 User System
- Registration & Login/Logout with Django's built-in authentication system and a custom
CustomUsermodel. - Avatar upload: users can set a profile picture (stored under
/media/avatars/). - User Profile dashboard with watchlist grid, subscription section and history view.
- Secure profile API endpoint (
/api/user/profile/) — login required — returning personal info and followed content IDs in JSON format. - User settings page for profile management.
🌍 Internationalisation (i18n)
- Full multi-language support out of the box: Spanish (
es, default), English (en) and Catalan (ca). - Translation files compiled and ready for all three locales.
🐳 Docker & Deployment
Dockerfilewithcollectstaticbaked into the build step — no manual asset compilation required on deploy.docker-compose.ymlto run the Django application on port8000.- WhiteNoise middleware configured for serving compressed static files in production without a separate web server.
- Continuous Deployment to Render via GitHub Actions, including automatic database migrations on each deploy.
ALLOWED_HOSTSandCSRF_TRUSTED_ORIGINSpre-configured for the Render deployment URL.
🔐 Admin & Sync Logging
- Django Admin interface available with the
SyncLogmodel to inspect each synchronisation run (status, timing, records created/updated).
🛠️ Tech Stack
| Layer | Technology |
|---|---|
| Framework | Django 6.0.3 |
| Language | Python 3.13 |
| Database | SQLite (dev) |
| Task Scheduler | APScheduler 3.11.2 + django-apscheduler 0.7.0 |
| Static Files | WhiteNoise 6.4.0 |
| HTTP Client | requests 2.32.5 |
| Image Handling | Pillow 12.2.0 |
| Environment Config | python-dotenv 1.2.2 |
| Containerisation | Docker + Docker Compose |
| CI/CD | GitHub Actions → Render |
| Streaming APIs | Node.js (external, via Git submodule) |
⚙️ Setup & Run
Prerequisites
- Python 3.13+
- Docker & Docker Compose (optional, for containerised run)
- The three streaming API containers running on ports 8080, 8081 and 8082
Local setup
# 1. Clone the repository (with submodule)
git clone --recurse-submodules <repo-url>
cd JoinProject
# 2. Create and activate a virtual environment
python -m venv .venv
source .venv/bin/activate
# 3. Install dependencies
pip install -r requirements.txt
# 4. Configure environment variables
cp .env.example .env
# Edit .env and fill in your API keys:
# API_KEY_8080=<your_key>
# API_KEY_8081=<your_key>
# API_KEY_8082=<your_key>
# 5. Apply migrations
python manage.py migrate
# 6. Run the development server
python manage.py runserverOn startup, the catalog is fetched automatically. Visit http://127.0.0.1:8000.
Docker setup
docker compose up --buildVisit http://localhost:8000.
🔑 Environment Variables
| Variable | Description |
|---|---|
API_KEY_8080 |
API key for the streaming API instance on port 8080 |
API_KEY_8081 |
API key for the streaming API instance on port 8081 |
API_KEY_8082 |
API key for the streaming API instance on port 8082 |
DJANGO_DEBUG |
Set to False in production (default: True) |
Important: API keys must be active and not expired in each API instance's database. Expired keys will cause
403 API invalidresponses and no data will be synced.
⚠️ Known Limitations
- ⚡ Streaming APIs not publicly available: The backend API service (
Models-de-proc-s-26) has not been deployed publicly. Catalog synchronisation (movies, series, directors, genres, age ratings) will fail with connection errors unless the API containers are running locally. To use the full application, clone and run the API project separately following its own README. - The application uses SQLite as its database. For production workloads, migration to PostgreSQL is recommended.
- The
SECRET_KEYinsettings.pymust be replaced with a strong, randomly generated key before any public deployment. DEBUG = Trueis the default. Always setDJANGO_DEBUG=Falsein production environments.- User watchlist and subscription features are partially implemented (UI scaffolding is in place, but the underlying platform-linking model is pending).
- The movie detail page template (
movie_detail.html) is referenced inviews.pybut the full template design is a work in progress.
🐛 Bug Fixes included since initial development
- Fixed
TypeError: Cannot read properties of undefined (reading 'length')in the Node.js API middleware (token_validator.js) caused by incorrect array destructuring — was causing all API calls to return500instead of proper401/403responses. - Fixed CSRF verification failures in production (Render deployment).
- Fixed static files not being served in production (WhiteNoise integration).
- Fixed "Clear Filters" button on the home page redirecting to the wrong URL.
- Restored missing views (
home,catalog_view,movie_detail,user_setting,api_user_profile) that had been accidentally removed during a merge.