1. Home
  2. Sms Campaign Project
  3. Project Setup

Project Setup

Step 1: Virtual Environment & Packages Install

টার্মিনালে রান করো:

python -m venv venv
venv\Scripts\activate    # Windows এ
# অথবা source venv/bin/activate  # Mac/Linux

pip install django djangorestframework django-cors-headers rest-framework-simplejwt pillow stripe

কী হচ্ছে এখানে?

  • venv একটা আলাদা environment বানায় যাতে তোমার প্রজেক্টের packages অন্য প্রজেক্টের সাথে মিশে না যায়।
  • Activate করলে তুমি এই environment এর ভিতরে কাজ করবে।
  • ফলাফল: Django, DRF (API এর জন্য), CORS (Frontend থেকে call করার জন্য), SimpleJWT (JWT token এর জন্য), Pillow (ImageField এর জন্য), Stripe (পরে payment এর জন্য) install হয়ে যাবে।

Step 2: Django Project & App Create

django-admin startproject campaign_project
cd campaign_project
python manage.py startapp campaign_app

কী হচ্ছে?

  • campaign_project হলো তোমার মেইন প্রজেক্ট ফোল্ডার।
  • campaign_app হলো তোমার অ্যাপ – এখানে সব models, views ইত্যাদি থাকবে।

ফলাফল: প্রজেক্ট রেডি। এখন আমরা campaign_app এ কাজ করব।

Step 3: Folder Structure তৈরি করা (API গুলো আলাদা রাখার জন্য)

campaign_app ফোল্ডারে যাও এবং বানাও:

mkdir campaign_app/api
touch campaign_app/api/__init__.py
touch campaign_app/api/serializers.py
touch campaign_app/api/views.py
touch campaign_app/api/urls.py

কেন করছি?
তুমি বলেছিলে serializers ও views api/ ফোল্ডারে রাখতে। এটা clean code এর জন্য ভালো।

ফলাফল: Structure clean হয়ে গেল।

Step 4: models.py – Custom User Model বানানো (সবচেয়ে গুরুত্বপূর্ণ অংশ!)

campaign_app/models.py এ পুরোটা পেস্ট করো:

from django.db import models
from django.contrib.auth.models import AbstractBaseUser, BaseUserManager, PermissionsMixin
from django.utils import timezone
import uuid

# ✅ 1. Custom User Manager
class UserManager(BaseUserManager):
    def create_user(self, email, password=None, **extra_fields):
        """সাধারণ user তৈরি করে"""
        if not email:
            raise ValueError("Email দিতে হবে!")
        email = self.normalize_email(email)  # lowercase করে
        user = self.model(email=email, **extra_fields)
        user.set_password(password)  # password hash করে
        user.save(using=self._db)
        return user

    def create_superuser(self, email, password=None, **extra_fields):
        """Superuser তৈরি করে (admin panel এর জন্য)"""
        extra_fields.setdefault('is_super_admin', True)
        extra_fields.setdefault('is_active', True)
        extra_fields.setdefault('is_admin', True)

        return self.create_user(email, password, **extra_fields)


# ✅ 2. Main Custom User Model
class User(AbstractBaseUser, PermissionsMixin):
    # Basic Info
    email = models.EmailField(unique=True)  # এটাই login এর username হবে
    business_owner_name = models.CharField(max_length=255)
    business_name = models.CharField(max_length=255)
    industry_type = models.CharField(max_length=100, blank=True)
    mobile_number = models.CharField(max_length=20, blank=True)

    # Address
    address = models.TextField(blank=True)
    address_line_2 = models.TextField(blank=True, null=True)
    city = models.CharField(max_length=100, blank=True)
    state = models.CharField(max_length=100, blank=True)
    zipcode = models.CharField(max_length=20, blank=True)

    # Media
    profile_photo = models.ImageField(upload_to='profile_photos/', blank=True, null=True)

    # Status flags
    is_active = models.BooleanField(default=True)
    is_admin = models.BooleanField(default=False)
    is_super_admin = models.BooleanField(default=False)

    # Payment related
    stripe_customer_id = models.CharField(max_length=255, blank=True)

    # Timestamps
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    # ✅ Manager attach করা
    objects = UserManager()

    # ✅ কোন field দিয়ে login হবে? → email
    USERNAME_FIELD = 'email'

    # ✅ createsuperuser কমান্ড চালালে কোন কোন field চাইবে?
    REQUIRED_FIELDS = ['business_owner_name', 'business_name']

    def __str__(self):
        return self.email


# ✅ 3. Password Reset Token Model
class PasswordResetToken(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    token = models.UUIDField(default=uuid.uuid4, unique=True)
    created_at = models.DateTimeField(default=timezone.now)


# ✅ 4. Invitation Model (Team member invite)
class Invitation(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='invitations')
    email = models.EmailField()
    token = models.UUIDField(default=uuid.uuid4, unique=True)
    is_accepted = models.BooleanField(default=False)
    created_at = models.DateTimeField(auto_now_add=True)

গভীর ব্যাখ্যা (যা তুমি বিশেষভাবে জানতে চেয়েছ):

  • AbstractBaseUser কেন ব্যবহার করছি?
    Django এর default User model এ username field থাকে। কিন্তু আমরা চাই email দিয়ে login করতে। তাই AbstractBaseUser inherit করে নিজের মতো model বানাচ্ছি। এটা করে আমরা password hashing, is_active ইত্যাদি built-in features পাই, কিন্তু username বাদ দিয়ে email কে primary করতে পারি।
  • PermissionsMixin কেন?
    এটা থেকে is_superuser, groups, permissions ইত্যাদি আসে। না দিলে admin panel এ permission manage করা যাবে না।
  • USERNAME_FIELD = ’email’ কী করে?
    এটা বলে যে login করার সময় email দিয়ে authenticate হবে (username এর বদলে)। authenticate(email=..., password=...) এভাবে কাজ করবে।
  • REQUIRED_FIELDS কী? কেন দরকার?
    এটা শুধু python manage.py createsuperuser কমান্ডের জন্য। এই লিস্টে যে fields দিবে, superuser বানানোর সময় terminal এ সেগুলো চাইবে।
  • আমি দিয়েছি ['business_owner_name', 'business_name'] → superuser বানালে email + password + এই দুটো চাইবে।
  • গুরুত্বপূর্ণ: এখানে email বা password দিতে হবে না – এগুলো automatically চাওয়া হয়।
  • UserManager কেন বানালাম?
    Django এর default manager username expect করে। কিন্তু আমাদের email দিয়ে user তৈরি করতে হবে। তাই custom manager বানিয়ে create_usercreate_superuser override করলাম।
  • create_user: সাধারণ registration এ ব্যবহার হবে।
  • create_superuser: admin superuser বানানোর জন্য (is_super_admin = True করে)।
  • normalize_email() → email lowercase করে duplicate avoid করে।
  • set_password() → password hash করে save করে (security এর জন্য)।
  • Registration এ কোন fields পাবে?
    Serializer এ আমরা decide করব, কিন্তু model এ যা আছে:
    Required (blank=False): email, business_owner_name, business_name, password (manager এ handle করে)
    Optional: industry_type, mobile_number, address ইত্যাদি, profile_photo
  • Superuser বানালে কী হবে?
    python manage.py createsuperuser চালালে:
  • Email চাইবে (USERNAME_FIELD এর জন্য)
  • Password চাইবে
  • business_owner_name ও business_name চাইবে (REQUIRED_FIELDS এর জন্য)
  • User টা is_active=True, is_super_admin=True হয়ে তৈরি হবে → admin panel এ full access পাবে।

Step 5: settings.py Configuration

campaign_project/settings.py এ যোগ/চেঞ্জ করো (গুরুত্বপূর্ণ অংশগুলো):

INSTALLED_APPS = [
    # ... default গুলো
    'rest_framework',
    'rest_framework_simplejwt',
    'corsheaders',
    'campaign_app',
]

MIDDLEWARE = [
    'corsheaders.middleware.CorsMiddleware',  # সবার উপরে
    # ... বাকি গুলো
]

AUTH_USER_MODEL = 'campaign_app.User'  # ← এটা সবচেয়ে গুরুত্বপূর্ণ!

CORS_ALLOW_ALL_ORIGINS = True  # Development এ

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework_simplejwt.authentication.JWTAuthentication',
    ),
}

SIMPLE_JWT = {
    'ACCESS_TOKEN_LIFETIME': timedelta(days=1),
    'REFRESH_TOKEN_LIFETIME': timedelta(days=7),
}

MEDIA_URL = '/media/'
MEDIA_ROOT = BASE_DIR / 'media'

কেন এগুলো?

  • AUTH_USER_MODEL: Django কে বলছে আমাদের custom User ব্যবহার করতে। এটা না দিলে default User চলবে।
  • JWT & CORS: API এর জন্য দরকার।
  • Media: profile photo upload এর জন্য।

Step 6: urls.py

campaign_project/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

urlpatterns = [
    path('admin/', admin.site.urls),
    path('api/', include('campaign_app.api.urls')),  # পরে API গুলো এখানে আসবে
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

Step 7: Migration & Test

python manage.py makemigrations
python manage.py migrate
python manage.py createsuperuser  # ← এখানে দেখবে email + password + business_owner_name + business_name চাইছে
python manage.py runserver

ফলাফল:

  • Database এ custom User table তৈরি হবে।
  • Superuser বানানো যাবে।
  • Admin panel এ login করতে পারবে (http://127.0.0.1:8000/admin/)

Articles

How can we help?