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