Commit 449c59b9 authored by Administrator's avatar Administrator

Update 326 files via Son of Anton

parent 6810c876
# ============================================
# THE CLUB ERP — Environment Variables
# ============================================
# Django
DJANGO_SETTINGS_MODULE=config.settings.dev
SECRET_KEY=change-me-to-a-very-long-random-string-at-least-50-chars
DEBUG=True
ALLOWED_HOSTS=localhost,127.0.0.1,0.0.0.0
# Database
DB_NAME=theclub
DB_USER=theclub
DB_PASSWORD=theclub_secret_2024
DB_HOST=db
DB_PORT=5432
# Redis
REDIS_URL=redis://redis:6379/0
CELERY_BROKER_URL=redis://redis:6379/1
CELERY_RESULT_BACKEND=redis://redis:6379/2
# MinIO / S3
MINIO_ACCESS_KEY=minioadmin
MINIO_SECRET_KEY=minioadmin123
MINIO_ENDPOINT=minio:9000
MINIO_BUCKET_NAME=theclub-media
MINIO_USE_SSL=False
# JWT
JWT_ACCESS_TOKEN_LIFETIME_MINUTES=60
JWT_REFRESH_TOKEN_LIFETIME_DAYS=7
# SMS Gateway (placeholder)
SMS_GATEWAY_URL=https://sms.example.com/api/send
SMS_GATEWAY_API_KEY=your-sms-api-key
SMS_GATEWAY_SENDER_ID=THECLUB
# Email (optional)
EMAIL_HOST=smtp.gmail.com
EMAIL_PORT=587
EMAIL_HOST_USER=
EMAIL_HOST_PASSWORD=
EMAIL_USE_TLS=True
# Sentry (optional)
SENTRY_DSN=
# Frontend
NEXT_PUBLIC_API_URL=http://localhost:8000/api/v1
\ No newline at end of file
FROM python:3.12-slim
ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1
RUN apt-get update && apt-get install -y --no-install-recommends \
build-essential \
libpq-dev \
libcairo2 \
libpango-1.0-0 \
libpangocairo-1.0-0 \
libgdk-pixbuf2.0-0 \
libffi-dev \
shared-mime-info \
&& rm -rf /var/lib/apt/lists/*
WORKDIR /app
COPY backend/requirements/base.txt /tmp/requirements/base.txt
COPY backend/requirements/prod.txt /tmp/requirements/prod.txt
RUN pip install --no-cache-dir -r /tmp/requirements/base.txt
COPY backend/ /app/
EXPOSE 8000
CMD ["gunicorn", "config.wsgi:application", "--bind", "0.0.0.0:8000"]
\ No newline at end of file
FROM python:3.12-slim
ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1
RUN apt-get update && apt-get install -y --no-install-recommends \
build-essential \
libpq-dev \
libcairo2 \
libpango-1.0-0 \
libpangocairo-1.0-0 \
libgdk-pixbuf2.0-0 \
libffi-dev \
shared-mime-info \
&& rm -rf /var/lib/apt/lists/*
WORKDIR /app
COPY backend/requirements/base.txt /tmp/requirements/base.txt
RUN pip install --no-cache-dir -r /tmp/requirements/base.txt
COPY backend/ /app/
CMD ["celery", "-A", "config", "worker", "-l", "info"]
\ No newline at end of file
# THE CLUB ERP
## نظام إدارة النادي — THE CLUB
A complete Club ERP system built with Django 5.1, Next.js 14, PostgreSQL, Redis, and Celery.
### Quick Start
\ No newline at end of file
# Admin for archive — implemented in Phase 2
\ No newline at end of file
from django.apps import AppConfig
class ArchiveConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'apps.archive'
verbose_name = 'الأرشيف'
\ No newline at end of file
# Models for archive — implemented in Phase 2
\ No newline at end of file
# Serializers for archive — implemented in Phase 2
\ No newline at end of file
# Tests for archive — implemented in Phase 2
\ No newline at end of file
urlpatterns = []
\ No newline at end of file
# Views for archive — implemented in Phase 2
\ No newline at end of file
# Admin for audit — implemented in Phase 2
\ No newline at end of file
from django.apps import AppConfig
class AuditConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'apps.audit'
verbose_name = 'سجل المراجعة'
\ No newline at end of file
"""
THE CLUB ERP — Audit IP Middleware
===================================
Captures IP address and user-agent for audit logging.
"""
class AuditIPMiddleware:
"""Middleware that attaches IP and user-agent to the request for audit logging."""
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
# Extract IP address
x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR')
if x_forwarded_for:
request.audit_ip = x_forwarded_for.split(',')[0].strip()
else:
request.audit_ip = request.META.get('REMOTE_ADDR', '0.0.0.0')
# Extract user-agent
request.audit_user_agent = request.META.get('HTTP_USER_AGENT', '')
response = self.get_response(request)
return response
\ No newline at end of file
# Models for audit — implemented in Phase 2
\ No newline at end of file
# Serializers for audit — implemented in Phase 2
\ No newline at end of file
# Tests for audit — implemented in Phase 2
\ No newline at end of file
urlpatterns = []
\ No newline at end of file
# Views for audit — implemented in Phase 2
\ No newline at end of file
from django.apps import AppConfig
class AuthenticationConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'apps.authentication'
verbose_name = 'المصادقة'
\ No newline at end of file
# Custom authentication backends — implemented in Phase 2
\ No newline at end of file
# Serializers for authentication — implemented in Phase 2
from rest_framework_simplejwt.serializers import TokenObtainPairSerializer
class CustomTokenObtainPairSerializer(TokenObtainPairSerializer):
"""Placeholder — full implementation in Phase 2."""
pass
\ No newline at end of file
# Tests for authentication — implemented in Phase 2
\ No newline at end of file
urlpatterns = []
\ No newline at end of file
# Views for authentication — implemented in Phase 2
\ No newline at end of file
# Admin for branches — implemented in Phase 2
\ No newline at end of file
from django.apps import AppConfig
class BranchesConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'apps.branches'
verbose_name = 'الفروع'
\ No newline at end of file
# Models for branches — implemented in Phase 2
\ No newline at end of file
# Management command: seed_branches — implemented in Phase 2
\ No newline at end of file
# Serializers for branches — implemented in Phase 2
\ No newline at end of file
# Tests for branches — implemented in Phase 2
\ No newline at end of file
urlpatterns = []
\ No newline at end of file
# Views for branches — implemented in Phase 2
\ No newline at end of file
# Admin for carnets — implemented in Phase 9
\ No newline at end of file
from django.apps import AppConfig
class CarnetsConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'apps.carnets'
verbose_name = 'الكارنيهات'
\ No newline at end of file
# QR code + carnet image generator — implemented in Phase 9
\ No newline at end of file
# Models for carnets — implemented in Phase 9
\ No newline at end of file
# Serializers for carnets — implemented in Phase 9
\ No newline at end of file
# Tests for carnets — implemented in Phase 9
\ No newline at end of file
urlpatterns = []
\ No newline at end of file
# Views for carnets — implemented in Phase 9
\ No newline at end of file
# Admin for children — implemented in Phase 4
\ No newline at end of file
from django.apps import AppConfig
class ChildrenConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'apps.children'
verbose_name = 'الأبناء'
\ No newline at end of file
# Child fee calculator — implemented in Phase 4
\ No newline at end of file
# Models for children — implemented in Phase 4
\ No newline at end of file
# Serializers for children — implemented in Phase 4
\ No newline at end of file
# Tests for children — implemented in Phase 4
\ No newline at end of file
urlpatterns = []
\ No newline at end of file
# Views for children — implemented in Phase 4
\ No newline at end of file
from django.apps import AppConfig
class DashboardConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'apps.dashboard'
verbose_name = 'لوحة التحكم'
\ No newline at end of file
# Serializers for dashboard — implemented in Phase 10
\ No newline at end of file
# Tests for dashboard — implemented in Phase 10
\ No newline at end of file
urlpatterns = []
\ No newline at end of file
# Views for dashboard — implemented in Phase 10
\ No newline at end of file
# Admin for death_cases — implemented in Phase 8
\ No newline at end of file
from django.apps import AppConfig
class DeathCasesConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'apps.death_cases'
verbose_name = 'حالات الوفاة'
\ No newline at end of file
# Models for death_cases — implemented in Phase 8
\ No newline at end of file
# Serializers for death_cases — implemented in Phase 8
\ No newline at end of file
# Death case services — implemented in Phase 8
\ No newline at end of file
# Tests for death_cases — implemented in Phase 8
\ No newline at end of file
urlpatterns = []
\ No newline at end of file
# Views for death_cases — implemented in Phase 8
\ No newline at end of file
# Admin for divorce_cases — implemented in Phase 8
\ No newline at end of file
from django.apps import AppConfig
class DivorceCasesConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'apps.divorce_cases'
verbose_name = 'حالات الطلاق'
\ No newline at end of file
# Divorce fee calculator — implemented in Phase 8
\ No newline at end of file
# Models for divorce_cases — implemented in Phase 8
\ No newline at end of file
# Serializers for divorce_cases — implemented in Phase 8
\ No newline at end of file
# Tests for divorce_cases — implemented in Phase 8
\ No newline at end of file
urlpatterns = []
\ No newline at end of file
# Views for divorce_cases — implemented in Phase 8
\ No newline at end of file
# Admin for documents — implemented in Phase 9
\ No newline at end of file
from django.apps import AppConfig
class DocumentsConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'apps.documents'
verbose_name = 'المستندات'
\ No newline at end of file
# Models for documents — implemented in Phase 9
\ No newline at end of file
# Serializers for documents — implemented in Phase 9
\ No newline at end of file
# Tests for documents — implemented in Phase 9
\ No newline at end of file
urlpatterns = []
\ No newline at end of file
# Views for documents — implemented in Phase 9
\ No newline at end of file
# Admin for fines — implemented in Phase 7
\ No newline at end of file
from django.apps import AppConfig
class FinesConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'apps.fines'
verbose_name = 'الغرامات والجزاءات'
\ No newline at end of file
# Late fine calculator — implemented in Phase 7
\ No newline at end of file
# Models for fines — implemented in Phase 7
\ No newline at end of file
# Serializers for fines — implemented in Phase 7
\ No newline at end of file
# Tests for fines — implemented in Phase 7
\ No newline at end of file
urlpatterns = []
\ No newline at end of file
# Views for fines — implemented in Phase 7
\ No newline at end of file
# Admin for foreign_members — implemented in Phase 5
\ No newline at end of file
from django.apps import AppConfig
class ForeignMembersConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'apps.foreign_members'
verbose_name = 'الأعضاء الأجانب'
\ No newline at end of file
# Models for foreign_members — implemented in Phase 5
\ No newline at end of file
# Serializers for foreign_members — implemented in Phase 5
\ No newline at end of file
# Tests for foreign_members — implemented in Phase 5
\ No newline at end of file
urlpatterns = []
\ No newline at end of file
# Views for foreign_members — implemented in Phase 5
\ No newline at end of file
# Admin for forms_engine — implemented in Phase 3
\ No newline at end of file
from django.apps import AppConfig
class FormsEngineConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'apps.forms_engine'
verbose_name = 'محرك الاستمارات'
\ No newline at end of file
# Models for forms_engine — implemented in Phase 3
\ No newline at end of file
# Management command: seed_forms — implemented in Phase 3
\ No newline at end of file
# Serializers for forms_engine — implemented in Phase 3
\ No newline at end of file
# Tests for forms_engine — implemented in Phase 3
\ No newline at end of file
urlpatterns = []
\ No newline at end of file
# Form validator — implemented in Phase 3
\ No newline at end of file
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment