1. Home
  2. Employee āĻŽāύāĻŋāϟāϰāĻŋāĻ‚
  3. āĻŦ⧇āϏāĻŋāĻ•
  4. 📊 🔖 Part 3: Activity Tracking Module Design

📊 🔖 Part 3: Activity Tracking Module Design

đŸ—ƒī¸ 🔖 Part 3: Activity Tracking Module Design

āĻāĻ–āĻžāύ⧇ āφāĻŽāϰāĻž ActivityLog model āϤ⧈āϰāĻŋ, Database Migration, āĻāĻŦāĻ‚ Admin Customization āĻ•āϰāĻŦā§‹āĨ¤ āĻĒā§āϰāϤāĻŋāϟāĻŋ āĻ¸ā§āĻŸā§‡āĻĒ⧇ āĻĒā§āϰāĻĢ⧇āĻļāύāĻžāϞ āϞ⧇āϭ⧇āϞ āĻŦā§āϝāĻžāĻ–ā§āϝāĻž + Bangla comments āĻĨāĻžāĻ•āĻŦ⧇ āϝ⧇āύ āĻŦāĻžāĻ¸ā§āϤāĻŦ⧇ apply āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧋āĨ¤


✅ ā§§. Designing ActivityLog model

đŸŽ¯ Goal:

āĻĒā§āϰāϤāĻŋāϟāĻŋ āĻ•āĻ°ā§āĻŽāϚāĻžāϰ⧀āϰ āĻ•āĻŽā§āĻĒāĻŋāωāϟāĻžāϰ āĻāĻ•āϟāĻŋāĻ­āĻŋāϟāĻŋ āϞāĻ— āϏāĻ‚āϰāĻ•ā§āώāĻŖ āĻ•āϰāĻž, āϝ⧇āĻŽāύ:

  • Active window
  • Website URL
  • Keystrokes (optional)
  • Screenshot
  • App usage data
  • Idle time
  • Boot time (optional here; separate model recommended)

🔨 Step 1.1 – Edit monitoring/models.py

from django.db import models

# 🔗 Employee model import if in same file no need, else:
# from .models import Employee

class ActivityLog(models.Model):
    """
    📝 ActivityLog Model
    āĻĒā§āϰāϤāĻŋāϟāĻŋ āϞāĻ— āĻ āĻ•āĻ°ā§āĻŽāϚāĻžāϰ⧀āϰ āĻāĻ•āϟāĻŋāĻ­āĻŋāϟāĻŋ data save āĻšāĻŦ⧇āĨ¤
    """

    # āϕ⧋āύ āĻ•āĻ°ā§āĻŽāϚāĻžāϰ⧀āϰ āϞāĻ—
    employee = models.ForeignKey('Employee', on_delete=models.CASCADE, related_name='activity_logs')

    # āϞāĻ— āĻāϰ āϏāĻŽāϝāĻŧ
    timestamp = models.DateTimeField(auto_now_add=True)

    # āϕ⧋āύ window active āĻ›āĻŋāϞ (āϝ⧇āĻŽāύ 'Google Chrome - YouTube')
    active_window = models.CharField(max_length=255, blank=True, null=True)

    # āϝāĻĻāĻŋ āĻ“āϝāĻŧ⧇āĻŦāϏāĻžāχāĻŸā§‡ āĻĨāĻžāϕ⧇, āϤāĻžāĻšāϞ⧇ URL save āĻšāĻŦ⧇
    website_url = models.URLField(blank=True, null=True)

    # Keystrokes data (optional, ethical consideration)
    keystrokes = models.TextField(blank=True, null=True)

    # Screenshot image
    screenshot = models.ImageField(upload_to='screenshots/', blank=True, null=True)

    # App usage data as JSON (example: [{"app_name":"Word","duration_min":20}])
    app_usage = models.JSONField(blank=True, null=True)

    # Idle time (minute)
    idle_time_min = models.PositiveIntegerField(default=0)

    class Meta:
        ordering = ['-timestamp']  # āϏāĻ°ā§āĻŦāĻļ⧇āώ āϞāĻ— āωāĻĒāϰ⧇ āĻĨāĻžāĻ•āĻŦ⧇

    def __str__(self):
        return f"{self.employee.name} | {self.timestamp.strftime('%Y-%m-%d %H:%M:%S')}"

🔎 Bangla Explanation:

✅ ForeignKey → āĻĒā§āϰāϤāĻŋāϟāĻŋ āϞāĻ— āĻāĻ•āϟāĻŋ āĻ•āĻ°ā§āĻŽāϚāĻžāϰ⧀āϰ āϏāĻžāĻĨ⧇ āϝ⧁āĻ•ā§āϤ
✅ CharField / URLField / TextField → āĻĄāĻžāϟāĻž āϟāĻžāχāĻĒ āĻ…āύ⧁āϝāĻžāϝāĻŧā§€
✅ ImageField → screenshot save āĻšāĻŦ⧇ media/screenshots/ āĻĢā§‹āĻ˛ā§āĻĄāĻžāϰ⧇
✅ JSONField → multiple app usage data JSON āφāĻ•āĻžāϰ⧇ save āĻšāĻŦ⧇
✅ PositiveIntegerField → Idle time negative āĻšāϤ⧇ āĻĒāĻžāϰ⧇ āύāĻž
✅ Meta ordering → Admin āĻ latest log āωāĻĒāϰ⧇


🔨 Step 1.2 – Install Pillow (ImageField requires it)

pip install Pillow

✅ ⧍. Migration & Database Schema Optimization

🔨 Step 2.1 – Make Migrations

python manage.py makemigrations monitoring

🔨 Step 2.2 – Apply Migrations

python manage.py migrate

🔎 Result: Database āĻ monitoring_activitylog table create āĻšāĻŦ⧇āĨ¤


✅ ā§Š. Admin Interface for Activity Logs

🔨 Step 3.1 – Register in monitoring/admin.py

from django.contrib import admin
from .models import Employee, ActivityLog

@admin.register(ActivityLog)
class ActivityLogAdmin(admin.ModelAdmin):
    # Admin table āĻ āϕ⧋āύ āϕ⧋āύ column āĻĻ⧇āĻ–āĻžāĻŦ⧇
    list_display = ('id', 'employee', 'timestamp', 'active_window', 'website_url', 'idle_time_min')

    # Search field enable āĻ•āϰāĻŦ⧇
    search_fields = ('employee__name', 'active_window', 'website_url')

    # Filter sidebar
    list_filter = ('employee', 'timestamp')

    # Readonly fields (screenshot preview)
    readonly_fields = ('screenshot_preview',)

    # Custom method to show screenshot preview in admin
    def screenshot_preview(self, obj):
        if obj.screenshot:
            return f'<img src="{obj.screenshot.url}" width="200"/>'
        return 'No Screenshot'

    screenshot_preview.allow_tags = True
    screenshot_preview.short_description = 'Screenshot Preview'

🔎 Bangla Explanation:

  • list_display → admin table columns
  • search_fields → employee āύāĻžāĻŽ, window, url search āĻ•āϰāϤ⧇ āĻĒāĻžāϰāĻŦ⧇
  • list_filter → employee āĻāĻŦāĻ‚ timestamp filter
  • readonly_fields + screenshot_preview → admin āĻ screenshot image preview

✅ ā§Ē. Media URL serve configuration (for local testing)

🔨 Step 4.1 – Edit employee_monitoring/urls.py

from django.conf import settings
from django.conf.urls.static import static

urlpatterns = [
    # ... your other urls
]

# Local media file serve configuration
if settings.DEBUG:
    urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

📝 🔖 Summary of Part 3

âœ”ī¸ ActivityLog Model āϤ⧈āϰāĻŋ āĻ•āϰ⧇āϛ⧋ – professional scalable design
âœ”ī¸ Migration apply āĻ•āϰ⧇ database ready
âœ”ī¸ Admin customization – screenshots āϏāĻš logs āĻĻ⧇āĻ–āĻž āϝāĻžāĻŦ⧇


🚀 âžĄī¸ Next Step:

🔖 Part 4: Django REST API Development

  1. DRF setup & configuration
  2. Serializer design for Employee & ActivityLog
  3. API endpoints to create ActivityLog (client data receive)
  4. Retrieve logs filtered by employee and date range
  5. Permission & token auth setup

👉 āĻŦāϞ⧋ “Start Part 4” – āϤāĻžāĻšāϞ⧇ āφāĻŽāϰāĻž API development āĻļ⧁āϰ⧁ āĻ•āϰāĻŦā§‹, āϝāĻž Python client āĻĨ⧇āϕ⧇ data receive āĻ•āϰāĻŦ⧇āĨ¤ Step by step full code + Bangla explanation āĻĨāĻžāĻ•āĻŦ⧇āĨ¤

How can we help?