1. Home
  2. Learn Python Library
  3. mss
  4. django api

django api

নিচে ধাপে ধাপে কোডগুলো দেওয়া হলো:

১. প্রোজেক্ট সেটআপ এবং লাইব্রেরি ইন্সটলেশন

প্রথমে টার্মিনালে নিচের কমান্ডগুলো চালিয়ে প্রয়োজনীয় প্যাকেজগুলো ইন্সটল করে নিন:

pip install django djangorestframework djangorestframework-simplejwt pillow drf-spectacular gunicorn
django-admin startproject config
cd config
python manage.py startapp monitoring

২. সেটিংস কনফিগারেশন (config/settings.py)

settings.py ফাইলে গিয়ে নিচের পরিবর্তনগুলো করুন:

Python

import os
from datetime import timedelta

# 1. INSTALLED_APPS এ নিচের অ্যাপগুলো যোগ করুন
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    
    # Third party apps
    'rest_framework',
    'rest_framework_simplejwt',
    'drf_spectacular',

    
    # Local apps
    'monitoring',
]

# 2. REST FRAMEWORK কনফিগারেশন
REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework_simplejwt.authentication.JWTAuthentication',
    ),
    'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.IsAuthenticated',
    ),
    'DEFAULT_SCHEMA_CLASS': 'drf_spectacular.openapi.AutoSchema',
}

# DRF Spectacular (Swagger/ReDoc) কনফিগারেশন
SPECTACULAR_SETTINGS = {
    'TITLE': 'Monitoring API',
    'DESCRIPTION': 'API documentation for Monitoring system',
    'VERSION': '1.0.0',
    'SERVE_INCLUDE_SCHEMA': False,
}

# 3. JWT কনফিগারেশন (টোকেন কতক্ষণ ভ্যালিড থাকবে)
SIMPLE_JWT = {
    'ACCESS_TOKEN_LIFETIME': timedelta(days=1), # ডেস্কটপ অ্যাপ তাই ১ দিন রাখা ভালো
    'REFRESH_TOKEN_LIFETIME': timedelta(days=7),
}

# 4. Static & Media Files কনফিগারেশন (ফাইলের শেষে যোগ করুন)
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static')

MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

৩. ডাটাবেস মডেল (monitoring/models.py)

এখানে Multi-Company আর্কিটেকচার ইমপ্লিমেন্ট করা হয়েছে। প্রতিটি এমপ্লয়ি একটি কোম্পানির সাথে যুক্ত থাকবে।

from django.db import models
from django.contrib.auth.models import User
import os
from datetime import datetime

# ১. কোম্পানি মডেল (Multi-Company সাপোর্টের জন্য)
class Company(models.Model):
    name = models.CharField(max_length=200)
    company_code = models.CharField(max_length=50, unique=True) # লগিনের সময় লাগতে পারে
    address = models.TextField(blank=True, null=True)
    created_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.name

# ২. এমপ্লয়ি প্রোফাইল (User এর সাথে Company কে লিঙ্ক করা)
class Employee(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='employee_profile')
    company = models.ForeignKey(Company, on_delete=models.CASCADE, related_name='employees')
    designation = models.CharField(max_length=100, blank=True)
    is_active = models.BooleanField(default=True)

    def __str__(self):
        return f"{self.user.username} - {self.company.name}"

# ডাইনামিক ফোল্ডার পাথ জেনারেটর (Company/User/Date অনুযায়ী ফোল্ডার হবে)
def screenshot_upload_path(instance, filename):
    company_name = instance.employee.company.name.replace(" ", "_")
    username = instance.employee.user.username
    date_str = datetime.now().strftime("%Y-%m-%d")
    return f"screenshots/{company_name}/{username}/{date_str}/{filename}"

# ৩. স্ক্রিনশট মডেল
class Screenshot(models.Model):
    employee = models.ForeignKey(Employee, on_delete=models.CASCADE, related_name='screenshots')
    image = models.ImageField(upload_to=screenshot_upload_path)
    created_at = models.DateTimeField(auto_now_add=True)
    
    # অতিরিক্ত তথ্য (যদি দরকার হয়)
    screen_index = models.IntegerField(default=1) # কোন মনিটরের ছবি

    def __str__(self):
        return f"Shot: {self.employee.user.username} at {self.created_at}"

৪. সিরিয়ালাইজার (monitoring/serializers.py)

ফাইলটি তৈরি করে নিচের কোড দিন। এটি API ডাটা হ্যান্ডেল করবে।

Python

from rest_framework import serializers
from .models import Screenshot, Employee

class ScreenshotSerializer(serializers.ModelSerializer):
    class Meta:
        model = Screenshot
        fields = ['image', 'screen_index', 'created_at']

    def create(self, validated_data):
        # রিকোয়েস্ট পাঠানো ইউজার থেকেই এমপ্লয়ি বের করা হবে
        user = self.context['request'].user
        try:
            employee = user.employee_profile
            return Screenshot.objects.create(employee=employee, **validated_data)
        except Employee.DoesNotExist:
            raise serializers.ValidationError("User is not assigned to any company/employee profile.")

৫. ভিউস / API লজিক (monitoring/views.py)

এখানে স্ক্রিনশট আপলোড করার লজিক থাকবে। লগিনের জন্য আমরা SimpleJWT এর বিল্ট-ইন ভিউ ব্যবহার করব, তাই আলাদা কোড লাগবে না।

Python

from rest_framework import generics, permissions, status
from rest_framework.response import Response
from rest_framework.parsers import MultiPartParser, FormParser
from .models import Screenshot
from .serializers import ScreenshotSerializer

# স্ক্রিনশট আপলোড API
class ScreenshotUploadView(generics.CreateAPIView):
    queryset = Screenshot.objects.all()
    serializer_class = ScreenshotSerializer
    permission_classes = [permissions.IsAuthenticated]
    parser_classes = (MultiPartParser, FormParser) # ইমেজ আপলোডের জন্য জরুরি

    def perform_create(self, serializer):
        # অটোমেটিকালি বর্তমান ইউজারকে এসাইন করবে সিরিয়ালাইজারের মাধ্যমে
        serializer.save()

৬. URL কনফিগারেশন

A. অ্যাপের URL (monitoring/urls.py):

ফাইলটি তৈরি করুন এবং লিখুন:

from django.urls import path
from rest_framework_simplejwt.views import (
    TokenObtainPairView,
    TokenRefreshView,
)
from .views import ScreenshotUploadView

urlpatterns = [
    # Login API (Desktop App এ এটি কল করবেন)
    path('api/login/', TokenObtainPairView.as_view(), name='token_obtain_pair'),
    path('api/token/refresh/', TokenRefreshView.as_view(), name='token_refresh'),
    
    # Screenshot Upload API
    path('api/upload-screenshot/', ScreenshotUploadView.as_view(), name='upload_screenshot'),
]

B. মেইন প্রোজেক্টের URL (config/urls.py):

from django.contrib import admin
from django.urls import path, include
from django.conf import settings
from django.conf.urls.static import static
from drf_spectacular.views import SpectacularAPIView, SpectacularRedocView, SpectacularSwaggerView

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('monitoring.urls')), # monitoring অ্যাপ লিংক করা হলো
    
    # API Documentation
    path('api/schema/', SpectacularAPIView.as_view(), name='schema'),
    path('api/docs/', SpectacularSwaggerView.as_view(url_name='schema'), name='swagger-ui'),
    path('api/redoc/', SpectacularRedocView.as_view(url_name='schema'), name='redoc'),
]

# মিডিয়া ফাইল সার্ভ করার জন্য (ডেভেলপমেন্ট মোডে)
if settings.DEBUG:
    urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

৭. অ্যাডমিন প্যানেল সেটআপ (monitoring/admin.py)

অ্যাডমিন প্যানেল থেকে কোম্পানি এবং এমপ্লয়ি তৈরি করার জন্য:

from django.contrib import admin
from .models import Company, Employee, Screenshot

@admin.register(Employee)
class EmployeeAdmin(admin.ModelAdmin):
    list_display = ('user', 'company', 'designation', 'is_active')
    list_filter = ('company',)

@admin.register(Screenshot)
class ScreenshotAdmin(admin.ModelAdmin):
    list_display = ('employee', 'created_at', 'screen_index')
    list_filter = ('employee__company', 'created_at')

admin.site.register(Company)

.gitignore

# Python
__pycache__/
*.py[cod]
*$py.class
*.so
.Python
env/
venv/
.venv/
*.egg-info/
dist/
build/

# Django
*.log
local_settings.py
db.sqlite3
media/
static/

# IDE
.idea/
.vscode/
*.swp
*.swo

# Environment
.env
.env.local

# OS
.DS_Store
Thumbs.db


৮. রান এবং টেস্ট করার নিয়ম

১. মাইগ্রেশন করুন:

python manage.py makemigrations
python manage.py migrate

২. সুপার ইউজার তৈরি করুন:

python manage.py createsuperuser

৩. সার্ভার রান করুন:

python manage.py runserver

৪. ডাটা এন্ট্রি:

  • http://127.0.0.1:8000/admin/ এ যান।
  • প্রথমে একটি Company তৈরি করুন (যেমন: “My Tech Ltd”)।
  • এরপর Users এ গিয়ে নতুন ইউজার (Employee) তৈরি করুন।
  • শেষে Employees টেবিলে গিয়ে ওই ইউজারকে সিলেক্ট করে কোম্পানির সাথে যুক্ত করুন।

৯. ডেস্কটপ অ্যাপ থেকে যেভাবে কল করবেন

আপনার ডেস্কটপ অ্যাপ থেকে এখন এই API ব্যবহার করতে পারবেন:

  1. Login: POST http://127.0.0.1:8000/api/login/ (বডিতে username, password দেবেন)। রিটার্ন হিসেবে access টোকেন পাবেন।
  2. Upload: স্ক্রিনশট তোলার পর POST http://127.0.0.1:8000/api/upload-screenshot/ এ পাঠাবেন। হেডার হিসেবে Authorization: Bearer <YOUR_ACCESS_TOKEN> পাঠাতে হবে।

আপনি চাইলে আমি ডেস্কটপ অ্যাপের Upload Function টি এই API এর সাথে কাজ করার জন্য লিখে দিতে পারি।

How can we help?