Django

⌘K
  1. Home
  2. Django
  3. Django তে কিভাবে কাজ করতে...
  4. Permission
  5. ৪. কাস্টম ফিল্ড লেভেল পারমিশন তৈরি ও ব্যবস্থাপনা

৪. কাস্টম ফিল্ড লেভেল পারমিশন তৈরি ও ব্যবস্থাপনা

Django-তে কাস্টম ফিল্ড লেভেল পারমিশন তৈরি ও ব্যবস্থাপনা করতে হলে আমাদেরকে Django এর সাধারণ পারমিশন সিস্টেম ছাড়াও আরও উন্নত কিছু লজিক প্রয়োগ করতে হয়। ফিল্ড লেভেলে পারমিশন মানে প্রতিটি ফিল্ডের উপর ভিত্তি করে ইউজারকে অনুমতি দেওয়া বা নির্দিষ্ট ফিল্ড দেখতে বা আপডেট করতে পারবে কিনা তা নিয়ন্ত্রণ করা।

এখানে আমরা একটি বাস্তব উদাহরণের মাধ্যমে কিভাবে ফিল্ড লেভেল পারমিশন তৈরি করা যায় এবং কিভাবে ভিউতে তা প্রয়োগ করা যায় তা দেখাবো।

ধরা যাক, আমাদের একটি Employee মডেল আছে যেখানে সাধারণ ইনফরমেশন ফিল্ড ছাড়াও কিছু সংবেদনশীল ইনফরমেশন আছে যেমন salary এবং date_of_birth। আমরা চাই যে শুধুমাত্র ম্যানেজাররা salary এবং date_of_birth দেখতে ও আপডেট করতে পারবে, কিন্তু অন্যান্য ইউজাররা শুধু সাধারণ ইনফরমেশন দেখতে ও আপডেট করতে পারবে।

১. Employee মডেল তৈরি

# models.py
from django.db import models

class Employee(models.Model):
    name = models.CharField(max_length=100)
    position = models.CharField(max_length=100)
    department = models.CharField(max_length=100)
    salary = models.DecimalField(max_digits=10, decimal_places=2)
    date_of_birth = models.DateField()

    def __str__(self):
        return self.name

২. ফিল্ড লেভেল পারমিশন কনফিগারেশন

এখন ফিল্ড লেভেল পারমিশন সেট করতে আমাদেরকে Django এর ডিফল্ট পারমিশন মডেল বাদ দিয়ে কাস্টম পারমিশন সিস্টেম তৈরি করতে হবে। এর জন্য, আমরা Django এর PermissionRequiredMixin অথবা has_perm() মেথড ব্যবহার করবো, তবে ফিল্ড লেভেল পারমিশন চেক করার জন্য কিছু কাস্টম লজিক তৈরি করতে হবে।

৩. কাস্টম পারমিশন চেকিং মেথড তৈরি

আমরা একটি কাস্টম মেথড তৈরি করব যা নির্দিষ্ট ফিল্ডের জন্য পারমিশন চেক করবে।

# utils.py
def has_field_permission(user, field_name):
    # শুধুমাত্র ম্যানেজাররা 'salary' এবং 'date_of_birth' দেখতে পারবে
    if field_name in ['salary', 'date_of_birth']:
        return user.groups.filter(name='Manager').exists()  # ইউজার ম্যানেজার কিনা চেক করা হচ্ছে
    # সাধারণ ইউজাররা অন্যান্য ফিল্ড দেখতে পারবে
    return True

এই has_field_permission ফাংশনটি ইউজার এবং ফিল্ডের নাম নেবে এবং ইউজারকে ওই ফিল্ড অ্যাক্সেসের অনুমতি আছে কিনা তা চেক করবে। ম্যানেজার গ্রুপে থাকলে salary এবং date_of_birth দেখতে পারবে।

৪. ভিউতে ফিল্ড লেভেল পারমিশন প্রয়োগ

এখন আমরা একটি ডিটেইল এবং আপডেট ভিউ তৈরি করবো যেখানে ফিল্ড লেভেল পারমিশন চেক করা হবে।

# views.py
from django.shortcuts import render, get_object_or_404
from django.http import HttpResponseForbidden
from .models import Employee
from .utils import has_field_permission

def employee_detail(request, pk):
    employee = get_object_or_404(Employee, pk=pk)
    
    # ফিল্ড অনুযায়ী পারমিশন চেক
    if not has_field_permission(request.user, 'salary'):
        employee.salary = "আপনার অনুমতি নেই"
    if not has_field_permission(request.user, 'date_of_birth'):
        employee.date_of_birth = "আপনার অনুমতি নেই"
    
    return render(request, 'employee_detail.html', {'employee': employee})

এখানে employee_detail ভিউতে প্রতিটি ফিল্ডের জন্য has_field_permission চেক করে, যদি ইউজারের পারমিশন না থাকে তাহলে সেই ফিল্ডটি “আপনার অনুমতি নেই” দেখাবে।

৫. ফর্মে ফিল্ড লেভেল পারমিশন প্রয়োগ (আপডেট ভিউ)

আপডেট ভিউতে প্রতিটি ফিল্ডের জন্য কাস্টম পারমিশন চেক করা এবং শুধুমাত্র অনুমোদিত ফিল্ডগুলো আপডেট করা যাবে।

# views.py
from django.shortcuts import redirect
from .forms import EmployeeForm

def employee_update(request, pk):
    employee = get_object_or_404(Employee, pk=pk)
    if request.method == 'POST':
        form = EmployeeForm(request.POST, instance=employee)
        
        # ফর্মে ফিল্ড লেভেল পারমিশন চেক
        if form.is_valid():
            for field in form.cleaned_data:
                if not has_field_permission(request.user, field):
                    return HttpResponseForbidden(f"আপনার {field} আপডেট করার অনুমতি নেই।")
            form.save()
            return redirect('employee_detail', pk=employee.pk)
    else:
        form = EmployeeForm(instance=employee)
    
    # ফিল্ড লেভেল পারমিশন অনুযায়ী নিষ্ক্রিয় করা
    for field in form.fields:
        if not has_field_permission(request.user, field):
            form.fields[field].disabled = True  # পারমিশন না থাকলে ফিল্ড নিষ্ক্রিয়
    
    return render(request, 'employee_form.html', {'form': form})

এই উদাহরণে, employee_update ভিউতে has_field_permission চেক করা হচ্ছে। যেসব ফিল্ডের জন্য ইউজারের পারমিশন নেই, সেগুলো form.fields[field].disabled = True করে দেওয়া হয়েছে, যাতে ইউজার এগুলো আপডেট করতে না পারে।

৬. টেমপ্লেট

employee_detail.html টেমপ্লেটে শুধুমাত্র সেই ফিল্ডগুলো দেখানো হবে যেগুলোতে ইউজারের পারমিশন আছে।

<!-- employee_detail.html -->
<h1>Employee Details</h1>
<p><strong>Name:</strong> {{ employee.name }}</p>
<p><strong>Position:</strong> {{ employee.position }}</p>
<p><strong>Department:</strong> {{ employee.department }}</p>
<p><strong>Salary:</strong> {{ employee.salary }}</p>
<p><strong>Date of Birth:</strong> {{ employee.date_of_birth }}</p>

এই প্রক্রিয়াটি ব্যবহার করে, আমরা Django তে ফিল্ড লেভেল পারমিশন কার্যকরভাবে কনফিগার এবং ব্যবহার করতে পারি।

How can we help?