# Paython Project Guide (Arabic)

## 1) تشغيل المشروع محليًا

من داخل مسار المشروع `c:\laragon\www\Paython`:

```powershell
python manage.py check
python manage.py runserver
```

افتح في المتصفح:

- `http://127.0.0.1:8000/` الموقع
- `http://127.0.0.1:8000/admin/` الداشبورد المخصص
- `http://127.0.0.1:8000/djadmin/` Django Admin

---

## 2) أماكن الملفات المهمة في المشروع

- `mainapp/controllers/website_controller.py`  
  منطق صفحات الموقع (Controllers/Views functions).

- `mainapp/urls.py`  
  لينكات الموقع (Routes/URLs).

- `mainapp/templates/mainapp/site/`  
  صفحات HTML (Templates) مثل `home.html`, `about.html`, `services.html`.

- `mainapp/templates/mainapp/site/base.html`  
  Layout أساسي مشترك (Head + CSS/JS + Blocks).

- `mainapp/templates/mainapp/site/header.html`  
  هيدر مشترك للموقع.

- `mainapp/context_processors.py`  
  بيانات عامة لكل الصفحات (مثل خدمات الهيدر/أسماء المنيو).

- `mainapp/models.py` و `legacydb/model_defs/...`  
  الموديلات.  
  - `mainapp/models.py`: موديلات التطبيق الأساسية.  
  - `legacydb/model_defs`: موديلات الجداول المنقولة من Laravel DB.

---

## 3) لو عايز تعمل صفحة جديدة (الخطوات القياسية)

مثال: صفحة اسمها `News`.

### الخطوة A) أنشئ Template

أنشئ ملف:

- `mainapp/templates/mainapp/site/news.html`

مثال بسيط:

```django
{% extends "mainapp/site/base.html" %}

{% block title %}News{% endblock %}

{% block content %}
<section class="py-5">
    <div class="container">
        <h1>News</h1>
        <p>News page content...</p>
    </div>
</section>
{% endblock %}
```

### الخطوة B) أضف Controller function

داخل `mainapp/controllers/website_controller.py`:

```python
def website_news(request):
    return render(request, "mainapp/site/news.html")
```

### الخطوة C) أضف Route (URL)

داخل `mainapp/urls.py`:

1. أضف الاستيراد ضمن list:

```python
from .controllers.website_controller import (
    ...
    website_news,
)
```

2. أضف path:

```python
path("news/", website_news, name="website_news"),
```

### الخطوة D) اربطها في الهيدر

داخل `mainapp/templates/mainapp/site/header.html`:

```django
<li><a href="{% url 'website_news' %}">News</a></li>
```

> مهم: لا تكتب `href="news.html"`  
> استخدم دائمًا `{% url 'route_name' %}`.

### الخطوة E) اختبر

```powershell
python manage.py check
```

ثم افتح:

- `http://127.0.0.1:8000/news/`

---

## 4) لو الصفحة محتاجة بيانات من الداتابيز

داخل `website_controller.py`:

```python
def website_news(request):
    items = News.objects.filter(status=True).order_by("-id")
    return render(request, "mainapp/site/news.html", {"items": items})
```

وفي `news.html`:

```django
{% for item in items %}
  <h4>{{ item.title }}</h4>
{% empty %}
  <p>No items found.</p>
{% endfor %}
```

---

## 5) إمتى تستخدم Context Processor؟

استخدم `context_processors.py` لما تحتاج بيانات تظهر في كل الصفحات، مثل:

- قائمة خدمات في الهيدر
- أسماء منيو ديناميكية
- إعدادات عامة (موبايل/إيميل/لوغو)

ثم أضف الـ processor في `mysite/settings.py` داخل:

- `TEMPLATES -> OPTIONS -> context_processors`

---

## 6) فرق سريع بين Model / Controller / View / URL

- **Model:** شكل البيانات في الداتابيز (جداول وحقول).  
- **Controller (function in website_controller):** يجلب البيانات ويحدد أي template يتعرض.  
- **View (Template HTML):** شكل الصفحة للمستخدم.  
- **URL:** الرابط الذي يربط المتصفح بالـ controller.

---

## 7) Checklist سريعة قبل أي صفحة جديدة

- [ ] أنشأت template في `templates/mainapp/site/`
- [ ] أضفت function في `website_controller.py`
- [ ] أضفت path + name في `mainapp/urls.py`
- [ ] استخدمت `{% url %}` داخل الهيدر/الروابط
- [ ] شغلت `python manage.py check`
- [ ] جرّبت الرابط في المتصفح


#  ثبّت المتطلبات
pip install --upgrade pip
pip install -r requirements.txt
#  نفّذ migrations
python manage.py migrate
python manage.py seed
#  اجمع static
python manage.py collectstatic --noinput
#  ترجم ملفات اللغة (لو تستخدم i18n)
python manage.py compilemessages || true
#  افحص إعدادات Django
python manage.py check --deploy
#  (اختياري أول مرة فقط) أنشئ سوبر أدمن
python manage.py createsuperuser

# توليد مفتاح المشروع
python -c "from django.core.management.utils import get_random_secret_key; print(get_random_secret_key())"

# ربط الميديا وملفات الاستايل
cd public_html
ln -s /home/niledental/public_html/foldername/static static

cd public_html
ln -s /home/niledental/public_html/foldername/media media

# اعادة تشغيل
touch tmp/restart.txt

# بعد اي تغيير في الاستايل على السيرفر نفذ من داخل مجلد المشروع 
python manage.py collectstatic --noinput


