From c8dbe7a9f2f7d7bb849bda7d2ae93e5ae6f113b7 Mon Sep 17 00:00:00 2001
From: nairafiany <naira.afiany@gmail.com>
Date: Tue, 25 Mar 2025 00:05:57 +0700
Subject: [PATCH] Menyelesaikan weekly assignment 07

---
 main/admin.py  |   9 ++++-
 main/models.py |  39 ++++++++++---------
 main/views.py  | 102 -------------------------------------------------
 3 files changed, 28 insertions(+), 122 deletions(-)

diff --git a/main/admin.py b/main/admin.py
index c006696..97f0237 100644
--- a/main/admin.py
+++ b/main/admin.py
@@ -3,7 +3,14 @@ from django.contrib.auth.admin import UserAdmin
 from .models import User, Transportasi
 
 class CustomUserAdmin(UserAdmin):
-    list_display = ('username', 'email', 'is_superuser', 'birthdate', 'phone_number', 'blog_url', 'transportasi')
+    list_display = ('username', 'email', 'is_superuser', 'birthdate', 'phone_number', 'blog_url', 'transportasi', 'bio')
+    
+    fieldsets = UserAdmin.fieldsets + (
+        ('Additional Info', {
+            'fields': ('birthdate', 'phone_number', 'blog_url', 'transportasi', 'bio'),
+        }),
+    )
 
 admin.site.register(User, CustomUserAdmin)
 admin.site.register(Transportasi)
+
diff --git a/main/models.py b/main/models.py
index 05be1c8..a2013f3 100644
--- a/main/models.py
+++ b/main/models.py
@@ -19,7 +19,7 @@ def validate_password(value):
 def validate_birthdate(value):
     """Usia minimal adalah 12 tahun."""
     try:
-        if isinstance(value, str):  # Pastikan jika value masih string, kita konversi
+        if isinstance(value, str):  # Jika masih dalam bentuk string
             value = datetime.strptime(value, "%d/%m/%Y").date()
         min_birthdate = date.today() - timedelta(days=12 * 365)
         if value > min_birthdate:
@@ -28,11 +28,10 @@ def validate_birthdate(value):
     except ValueError:
         raise ValidationError("Format tanggal harus dd/mm/yyyy.")
 
-
 def validate_phone(value):
-    """Nomor HP harus dalam format 62xxxxxxxx dan panjang 8-15 angka."""
-    if not re.match(r'^62[0-9]{6,13}$', value):
-        raise ValidationError("Nomor HP harus dalam format 62xxxxxxxx dan panjangnya 8-15 angka.")
+    """Nomor HP harus terdiri dari 8-15 digit angka."""
+    if not re.match(r'^[0-9]{8,15}$', value):
+        raise ValidationError("Nomor HP harus terdiri dari 8-15 digit angka.")
 
 def validate_nomor_rangka(value):
     """Nomor rangka harus diawali 5 huruf, lalu 10 karakter alfanumerik."""
@@ -57,6 +56,7 @@ def validate_lokasi_duduk(value):
     if value not in pilihan_valid:
         raise ValidationError(f"Lokasi duduk harus salah satu dari: {', '.join(pilihan_valid)}")
     return value
+
 # === MODEL TRANSPORTASI ===
 class Transportasi(models.Model):
     LOKASI_DUDUK_CHOICES = [
@@ -82,7 +82,7 @@ class Transportasi(models.Model):
 
 # === CUSTOM USER MANAGER ===
 class UserManager(BaseUserManager):
-    def create_user(self, username, email, password, birthdate, phone_number, blog_url, bio, transportasi, **extra_fields):
+    def create_user(self, username, email, password, birthdate, phone_number, blog_url, bio, transportasi=None, **extra_fields):
         if not username:
             raise ValueError("Username harus diisi.")
         if not email:
@@ -90,15 +90,13 @@ class UserManager(BaseUserManager):
         if not password:
             raise ValueError("Password harus diisi.")
 
-        # Validasi menggunakan fungsi eksternal
+        # Validasi
         validate_username(username)
         validate_password(password)
         birthdate = validate_birthdate(birthdate)
-        phone_number = validate_phone(phone_number)
+        validate_phone(phone_number)
         validate_blog_url(blog_url)
         validate_bio(bio)
-        validate_lokasi_duduk(transportasi.lokasi_duduk)
-        validate_nomor_rangka(transportasi.nomor_rangka)
 
         email = self.normalize_email(email)
         user = self.model(
@@ -108,10 +106,11 @@ class UserManager(BaseUserManager):
             phone_number=phone_number,
             blog_url=blog_url,
             bio=bio,
-            transportasi=transportasi,
             **extra_fields
         )
         user.set_password(password)
+        if transportasi:
+            user.transportasi = transportasi
         user.save(using=self._db)
         return user
 
@@ -121,7 +120,7 @@ class UserManager(BaseUserManager):
 
         errors = {}
 
-        # Ambil input dari terminal
+        # Ambil input tambahan untuk superuser
         birthdate_str = input("Birthdate (dd/mm/yyyy): ")
         phone_number = input("Phone Number (8-15 angka): ")
         blog_url = input("Blog URL: ")
@@ -129,7 +128,7 @@ class UserManager(BaseUserManager):
         lokasi_duduk = input("Lokasi Duduk (Jendela/Tengah/Gang): ")
         nomor_rangka = input("Nomor Rangka Kendaraan: ")
 
-        # Validasi masing-masing field (supaya muncul di terminal apabila error)
+        # Validasi input
         try:
             birthdate = validate_birthdate(birthdate_str)
         except ValidationError as e:
@@ -159,7 +158,8 @@ class UserManager(BaseUserManager):
             validate_nomor_rangka(nomor_rangka)
         except ValidationError as e:
             errors['Nomor Rangka'] = str(e)
-        # Jika ada error, tampilkan semua
+
+        # Jika ada error, tampilkan semua dan keluar
         if errors:
             print("\nERROR:")
             for field, error_msg in errors.items():
@@ -168,9 +168,12 @@ class UserManager(BaseUserManager):
                 print(f" - {field}: {error_msg.strip('[]')}")
             sys.exit(1)
 
+        # Buat objek transportasi terlebih dahulu
+        transportasi = Transportasi.objects.create(
+            lokasi_duduk=lokasi_duduk,
+            nomor_rangka=nomor_rangka
+        )
 
-
-        # Jika tidak ada error, lanjutkan pembuatan superuser
         return self.create_user(
             username=username,
             email=email,
@@ -179,12 +182,10 @@ class UserManager(BaseUserManager):
             phone_number=phone_number,
             blog_url=blog_url,
             bio=bio,
-            lokasi_duduk=lokasi_duduk,
-            nomor_rangka=nomor_rangka,
+            transportasi=transportasi,
             **extra_fields
         )
 
-
 # === CUSTOM USER MODEL ===
 class User(AbstractUser):
     username = models.CharField(max_length=255, unique=True, validators=[validate_username])
diff --git a/main/views.py b/main/views.py
index 820963f..8f1502d 100644
--- a/main/views.py
+++ b/main/views.py
@@ -7,108 +7,6 @@ from django.contrib.auth import authenticate, login, logout
 from .models import User, Transportasi
 from datetime import datetime
 
-# Home Page
-def home(request):
-    return render(request, 'main.html')
-
-# Login Page
-def login_page(request):
-    if request.method == "POST":
-        username = request.POST.get('username')
-        password = request.POST.get('password')
-
-        # Validasi apakah username ada di database
-        if not User.objects.filter(username=username).exists():
-            messages.error(request, 'Invalid Username')
-            return redirect('/login/')
-
-        # Autentikasi pengguna
-        user = authenticate(username=username, password=password)
-        if user is None:
-            messages.error(request, "Invalid Password")
-            return redirect('/login/')
-        else:
-            login(request, user)
-            return redirect('/home/')
-
-    return render(request, 'login.html')
-
-# Register Page
-def register_page(request):
-    if request.method == 'POST':
-        username = request.POST.get('username')
-        email = request.POST.get('email')
-        password = request.POST.get('password')
-        birthdate_str = request.POST.get('birthdate')
-        phone_number = request.POST.get('phone_number')
-        blog_url = request.POST.get('blog_url')
-        bio = request.POST.get('bio')
-        lokasi_duduk = request.POST.get('lokasi_duduk')
-        nomor_rangka = request.POST.get('nomor_rangka')
-
-        try:
-            birthdate = datetime.strptime(birthdate_str, "%Y-%m-%d").date()
-        except ValueError:
-            return render(request, 'register.html', {"form_errors": {"birthdate": "Invalid birthdate format!"}})
-
-        errors = {}
-
-        if User.objects.filter(username=username).exists():
-            errors['username'] = "Username already taken!"
-        if User.objects.filter(email=email).exists():
-            errors['email'] = "Email already registered!"
-
-        user = User(
-            username=username,
-            email=email,
-            birthdate=birthdate,
-            phone_number=phone_number,
-            blog_url=blog_url,
-            bio=bio
-        )
-
-        try:
-            user.full_clean()  # Validasi model User
-        except ValidationError as e:
-            for field, error_list in e.message_dict.items():
-                errors[field] = error_list[0]  
-
-        # Validasi transportasi
-        transportasi = Transportasi(lokasi_duduk=lokasi_duduk, nomor_rangka=nomor_rangka)
-        try:
-            transportasi.full_clean()
-        except ValidationError as e:
-            for field, error_list in e.message_dict.items():
-                errors[field] = error_list[0] 
-
-        if errors:
-            return render(request, 'register.html', {"form_errors": errors})
-
-        # Simpan data jika tidak ada error
-        transportasi.save()
-        user.set_password(password)
-        user.transportasi = transportasi
-        user.save()
-
-        messages.success(request, "Account created successfully!")
-        return redirect('/login/')
-
-    return render(request, 'register.html', {"form_errors": {}})
-
-
-# Logout
-def logout_page(request):
-    logout(request)
-    messages.success(request, "Logout successful.")
-    return redirect('/login/')
-
-from django.forms import ValidationError
-from django.http import JsonResponse
-from django.shortcuts import render, redirect
-from django.contrib import messages
-from django.contrib.auth import authenticate, login, logout
-from .models import User, Transportasi
-from datetime import datetime
 
 # Home Page
 def home(request):
-- 
GitLab