নিচে ধাপে ধাপে কোডগুলো দেওয়া হলো:
১. প্রোজেক্ট সেটআপ এবং লাইব্রেরি ইন্সটলেশন
প্রথমে টার্মিনালে নিচের কমান্ডগুলো চালিয়ে প্রয়োজনীয় প্যাকেজগুলো ইন্সটল করে নিন:
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 ব্যবহার করতে পারবেন:
- Login:
POST http://127.0.0.1:8000/api/login/(বডিতেusername,passwordদেবেন)। রিটার্ন হিসেবেaccessটোকেন পাবেন। - Upload: স্ক্রিনশট তোলার পর
POST http://127.0.0.1:8000/api/upload-screenshot/এ পাঠাবেন। হেডার হিসেবেAuthorization: Bearer <YOUR_ACCESS_TOKEN>পাঠাতে হবে।
আপনি চাইলে আমি ডেস্কটপ অ্যাপের Upload Function টি এই API এর সাথে কাজ করার জন্য লিখে দিতে পারি।