Shayan Azadi 7e71d922d3 Add multi-image compositions, docker setup, tests, and docs
- Add CompositionImage model with multi-image upload and main image flag
- Add composition endpoints: add-images, set-main-image, delete image, by-created-at filter
- Make contact-us by_category public
- Add 24 API tests covering all endpoints
- Add Dockerfile, docker-compose, entrypoint and docker docs
- Add Persian API docs and update README and Postman collection

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-24 13:43:34 +03:30

Zoneco ORG Backend API

A Django REST Framework backend for Zoneco ORG with PostgreSQL database.


Test Status

Ran 24 tests in ~12s — OK (0 failures)
Group Tests Status
Contact Us 6 All pass
Compositions 11 All pass
Campaigns 7 All pass

Run tests at any time:

cd backend
python manage.py test api -v 2

Features

  • Contact Us API — Contact form submissions with category filter
  • Composition API — Multi-image upload, main image flag, date-range filter
  • Campaign API — Campaigns with active / upcoming / ended filters
  • Admin Panel — Full Django admin at /admin/
  • Image Upload — JPEG, PNG, WebP, GIF, max 5 MB, stored in media/
  • CORS Enabled — Configured for frontend integration
  • Pagination — 20 items per page

Quick Start

1. Install dependencies

pip install -r requirements.txt

2. Create PostgreSQL database

CREATE DATABASE "Zoneco_ORG";

3. Apply migrations

python manage.py migrate

4. Run development server

python manage.py runserver

API available at {{base_url}}/api/


Admin Credentials

Field Value
URL {{base_url}}/admin/
Username Zoneco_@1405
Password Fun_@_zone2026

API Endpoints

Authentication

Action Access
GET (list, retrieve, custom filters) Public — no login required
POST (create) Public — no login required
PUT / PATCH / DELETE Admin only — Basic Auth required

Contact Us — /api/contact-us/

Method Endpoint Access Description
GET /api/contact-us/ Public List all submissions
POST /api/contact-us/ Public Submit a contact form
GET /api/contact-us/{id}/ Public Get one submission
GET /api/contact-us/by_category/?category=... Public Filter by category
PATCH /api/contact-us/{id}/ Admin Partial update
PUT /api/contact-us/{id}/ Admin Full update
DELETE /api/contact-us/{id}/ Admin Delete

Category choices: همکاری · فروش · پشتیبانی · درخواست مشاور · سایر

Fields:

Field Type Required
name string Yes
email_or_phone string Yes
description string Yes
category string Yes

Compositions — /api/compositions/

Each composition can have multiple images. One image can be flagged as the main image (is_main: true).

Method Endpoint Access Description
GET /api/compositions/ Public List all compositions
POST /api/compositions/ Public Create composition (with optional images)
GET /api/compositions/{id}/ Public Get one composition
GET /api/compositions/by-created-at/?from=...&to=... Public Filter by creation date range
POST /api/compositions/{id}/add-images/ Admin Add images to existing composition
POST /api/compositions/{id}/set-main-image/ Admin Set main image
DELETE /api/compositions/{id}/images/{image_id}/ Admin Delete a single image
PATCH /api/compositions/{id}/ Admin Partial update
PUT /api/compositions/{id}/ Admin Full update
DELETE /api/compositions/{id}/ Admin Delete composition

Fields:

Field Type Required Notes
name string Yes
description string Yes
uploaded_images file[] No One or more image files (multipart)
main_image_index integer No 0-based index of main image in uploaded_images. Defaults to 0.

Image constraints: JPEG, PNG, WebP, GIF — max 5 MB each — stored at media/compositions/

by-created-at query params:

Param Required Format
from At least one ISO 8601 e.g. 2026-06-01T00:00:00Z
to At least one ISO 8601 e.g. 2026-06-30T23:59:59Z

Campaigns — /api/campaigns/

Method Endpoint Access Description
GET /api/campaigns/ Public List all campaigns
POST /api/campaigns/ Public Create campaign
GET /api/campaigns/{id}/ Public Get one campaign
GET /api/campaigns/active/ Public Currently active campaigns
GET /api/campaigns/upcoming/ Public Not started yet
GET /api/campaigns/ended/ Public Already finished
PATCH /api/campaigns/{id}/ Admin Partial update
PUT /api/campaigns/{id}/ Admin Full update
DELETE /api/campaigns/{id}/ Admin Delete

Fields:

Field Type Required Notes
name string Yes
description string Yes
start_time datetime Yes ISO 8601
end_time datetime Yes Must be after start_time
image file No Campaign image (multipart)

Read-only computed fields: is_active, is_upcoming, is_ended


Models

ContactUs

Field Type
name CharField
email_or_phone CharField
description TextField
category CharField (choices)
created_at DateTimeField (auto)
updated_at DateTimeField (auto)

Composition

Field Type
name CharField
description TextField
image ImageField (legacy)
created_at DateTimeField (auto)
updated_at DateTimeField (auto)

CompositionImage

Field Type
composition ForeignKey → Composition
image ImageField
is_main BooleanField
created_at DateTimeField (auto)

DB constraint: only one is_main=True per composition.

Campaign

Field Type
name CharField
description TextField
start_time DateTimeField
end_time DateTimeField
image ImageField
created_at DateTimeField (auto)
updated_at DateTimeField (auto)

Media Files

Content Path
Composition images media/compositions/
Campaign images media/campaigns/

Postman Collection

Import backend/Zoneco_ORG_API.postman_collection.json into Postman.

Set the base_url collection variable to your server address.


Persian Documentation

Full Persian API documentation: backend/API_DOCS_FA.md


HTTP Status Codes

Code Meaning
200 OK
201 Created
204 Deleted (no body)
400 Invalid data
403 Forbidden (login required)
404 Not found
Description
No description provided
Readme 104 KiB
Languages
Python 90.4%
Shell 7.1%
Dockerfile 2.5%