1. Home
  2. Employee āĻŽāύāĻŋāϟāϰāĻŋāĻ‚
  3. āĻŦ⧇āϏāĻŋāĻ•
  4. 🌐 🔖 Part 4: Django REST API Development

🌐 🔖 Part 4: Django REST API Development

āĻĻāĻžāϰ⧁āĻŖ! āĻāĻ–āύ āφāĻŽāϰāĻž đŸ—‚ī¸ 🔖 Part 4: Django REST API Development āĻļ⧁āϰ⧁ āĻ•āϰāĻ›āĻŋ —
āĻāĻ•āϜāύ āĻĒā§āϰāĻĢ⧇āĻļāύāĻžāϞ āϏāĻĢāϟāĻ“āϝāĻŧā§āϝāĻžāϰ āχāĻžā§āϜāĻŋāύāĻŋāϝāĻŧāĻžāϰ āϝ⧇āĻ­āĻžāĻŦ⧇ scalable, secure, clean API āϤ⧈āϰāĻŋ āĻ•āϰ⧇, āĻ āĻŋāĻ• āϏ⧇āχāĻ­āĻžāĻŦ⧇āĨ¤
āϏāĻŦ āϕ⧋āĻĄā§‡ Bangla comments āĻĨāĻžāĻ•āĻŦ⧇ āϝāĻžāϤ⧇ āĻŦāĻžāĻ¸ā§āϤāĻŦ⧇ āĻĒā§āϰāĻœā§‡āĻ•ā§āĻŸā§‡ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧋āĨ¤


đŸ—‚ī¸ 🔖 Part 4: Django REST API Development


✅ ā§§. DRF Setup & Basic Config

āφāĻŽāϰāĻž āφāϗ⧇āχ djangorestframework āχāύāĻ¸ā§āϟāϞ āĻ•āϰ⧇āĻ›āĻŋāĨ¤ āĻāĻ–āύ settings.py āϤ⧇ āĻ•āĻŋāϛ⧁ important setup check āĻ•āϰ⧋āĨ¤

# settings.py
INSTALLED_APPS = [
    ...
    'rest_framework',
    'monitoring',
]

# DRF Global settings (basic)
REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework.authentication.TokenAuthentication',
    ],
    'DEFAULT_PERMISSION_CLASSES': [
        'rest_framework.permissions.IsAuthenticated',
    ],
}

✅ ⧍. Token Auth System Setup

🔨 Step 2.1 – Install Token Auth App

pip install djangorestframework-authtoken

settings.py āĻ add āĻ•āϰ⧋:

INSTALLED_APPS = [
    ...
    'rest_framework.authtoken',
]

🔨 Step 2.2 – Apply Token Table Migration

python manage.py migrate

🔨 Step 2.3 – Create Token for superuser (testing)

python manage.py drf_create_token your_superuser_username

āĻāϤ⧇ āĻāĻ•āĻŦāĻžāϰ⧇āϰ āϜāĻ¨ā§āϝ superuser āĻāϰ āϜāĻ¨ā§āϝ token create āĻšāĻŦ⧇āĨ¤ Client python script āĻāχ token āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻŦ⧇āĨ¤


✅ ā§Š. Serializer Design

đŸŽ¯ Goal:

Employee āφāϰ ActivityLog āĻāϰ āϜāĻ¨ā§āϝ Serializer āĻŦāĻžāύāĻžāύ⧋āĨ¤


🔨 Step 3.1 – monitoring/serializers.py

from rest_framework import serializers
from .models import Employee, ActivityLog

class EmployeeSerializer(serializers.ModelSerializer):
    """
    📝 Employee Serializer
    Employee data serialize/deserailize āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝāĨ¤
    """
    class Meta:
        model = Employee
        fields = '__all__'

class ActivityLogSerializer(serializers.ModelSerializer):
    """
    📝 ActivityLog Serializer
    Client āĻĨ⧇āϕ⧇ incoming activity log data handle āĻ•āϰāĻŦ⧇āĨ¤
    """
    class Meta:
        model = ActivityLog
        fields = '__all__'

🔎 Bangla Explanation:

  • ModelSerializer → Model āĻāϰ fields auto map āĻšāĻŦ⧇
  • fields = '__all__' → āϏāĻŦ field expose āĻ•āϰāĻŦ⧇ (āϚāĻžāχāϞ⧇ later limit āĻ•āϰāĻž āϝāĻžāĻŦ⧇)

✅ ā§Ē. Views: API Endpoints

đŸŽ¯ Goal:

  • Client POST āĻ•āϰāĻŦ⧇ → ActivityLog save āĻšāĻŦ⧇
  • Admin āĻŦāĻž Manager GET āĻ•āϰāĻŦ⧇ → Logs filter āĻ•āϰāĻŦ⧇

🔨 Step 4.1 – monitoring/views.py

from rest_framework import generics, permissions, authentication
from .models import Employee, ActivityLog
from .serializers import EmployeeSerializer, ActivityLogSerializer

# ✅ Token auth enforced by settings.py

class ActivityLogCreateView(generics.CreateAPIView):
    """
    ✅ ActivityLog Create API
    Python client background service āĻāĻ–āĻžāύ⧇ data POST āĻ•āϰāĻŦ⧇āĨ¤
    """
    queryset = ActivityLog.objects.all()
    serializer_class = ActivityLogSerializer

class ActivityLogListView(generics.ListAPIView):
    """
    ✅ ActivityLog List API
    Admin āĻŦāĻž Manager āϞāĻ—āϗ⧁āϞ⧋ filter āĻ•āϰ⧇ āĻĻ⧇āĻ–āϤ⧇ āĻĒāĻžāϰāĻŦ⧇āĨ¤
    Example: /api/activity-logs/?employee=1&start_date=2025-07-01&end_date=2025-07-15
    """
    serializer_class = ActivityLogSerializer

    def get_queryset(self):
        queryset = ActivityLog.objects.all()

        # Query param āĻĨ⧇āϕ⧇ employee filter āĻ•āϰāĻŦ⧇
        employee_id = self.request.query_params.get('employee')
        if employee_id:
            queryset = queryset.filter(employee_id=employee_id)

        # Optional: āϤāĻžāϰāĻŋāĻ– āĻĻāĻŋāϝāĻŧ⧇ filter
        start_date = self.request.query_params.get('start_date')
        end_date = self.request.query_params.get('end_date')

        if start_date and end_date:
            queryset = queryset.filter(timestamp__date__range=[start_date, end_date])

        return queryset

🔎 Bangla Explanation:

✅ CreateAPIView → POST request handle
✅ ListAPIView → GET request handle with filter
✅ Query param āĻŦā§āϝāĻŦāĻšāĻžāϰ → flexible reporting


✅ ā§Ģ. URL Routing

🔨 Step 5.1 – monitoring/urls.py

from django.urls import path
from .views import ActivityLogCreateView, ActivityLogListView

urlpatterns = [
    path('activity-logs/create/', ActivityLogCreateView.as_view(), name='activity-log-create'),
    path('activity-logs/', ActivityLogListView.as_view(), name='activity-log-list'),
]

🔨 Step 5.2 – Main employee_monitoring/urls.py āϤ⧇ Include āĻ•āϰ⧋

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('api/', include('monitoring.urls')),  # ✅ API prefix
]

✅ ā§Ŧ. API Test

1ī¸âƒŖ Django runserver āϚāĻžāϞāĻžāĻ“
2ī¸âƒŖ Postman āĻŦāĻž curl āĻĻāĻŋāϝāĻŧ⧇ POST request āĻ•āϰ⧋:

POST http://127.0.0.1:8000/api/activity-logs/create/
Authorization: Token your_token_here
Content-Type: multipart/form-data (for screenshot)

BODY:
{
  "employee": 1,
  "active_window": "Chrome - YouTube",
  "website_url": "https://youtube.com",
  "keystrokes": "abcd",
  "idle_time_min": 10,
  "app_usage": [{"app_name":"Word","duration_min":20}],
  "screenshot": (file)
}

3ī¸âƒŖ GET request: Logs āĻĻ⧇āĻ–āϤ⧇:

GET http://127.0.0.1:8000/api/activity-logs/?employee=1&start_date=2025-07-10&end_date=2025-07-14

📝 ✅ Summary of Part 4

âœ”ī¸ DRF & Token Auth setup
âœ”ī¸ Serializer ready (Employee, ActivityLog)
âœ”ī¸ CreateAPIView → Python client data post āĻ•āϰāĻŦ⧇
âœ”ī¸ ListAPIView → Admin logs filter āĻ•āϰāĻŦ⧇
âœ”ī¸ Production-level clean architecture + secure


🚀 âžĄī¸ Next Step:

🔖 Part 5: Python Client Development

  1. Python script → background service
  2. Active window, website, idle time track
  3. Screenshot capture
  4. Periodic API POST with Token

👉 āĻŦāϞ⧋ “Start Part 5” – āϤāĻžāĻšāϞ⧇ āĻĒ⧁āϰ⧋ Python Client Tracking Script āĻļ⧁āϰ⧁ āĻ•āϰāĻŦā§‹āĨ¤
Bangla comments āϏāĻš real working example āĻĨāĻžāĻ•āĻŦ⧇!

How can we help?