from django.shortcuts import render, redirect, get_object_or_404 from django.contrib.auth.decorators import login_required from django.contrib.auth import login, authenticate from django.contrib.auth.forms import UserCreationForm from django.utils import timezone from .models import Profile, Truck, Shipment, Bid, Message from django.contrib import messages from django.utils.translation import gettext as _ from django.db.models import Q def home(request): """Render the landing screen for MASAR CARGO.""" if request.user.is_authenticated: return redirect('dashboard') context = { "deployment_timestamp": timezone.now().timestamp(), } return render(request, "core/index.html", context) def register(request): if request.method == 'POST': form = UserCreationForm(request.POST) role = request.POST.get('role') phone = request.POST.get('phone_number') if form.is_valid(): user = form.save() profile = user.profile profile.role = role profile.phone_number = phone profile.save() login(request, user) return redirect('dashboard') else: form = UserCreationForm() return render(request, 'registration/register.html', {'form': form}) @login_required def dashboard(request): profile = request.user.profile if profile.role == 'SHIPPER': my_shipments = Shipment.objects.filter(shipper=request.user).order_by('-created_at') return render(request, 'core/shipper_dashboard.html', {'shipments': my_shipments}) elif profile.role == 'TRUCK_OWNER': my_trucks = Truck.objects.filter(owner=request.user) my_bids = Bid.objects.filter(truck_owner=request.user).order_by('-created_at') return render(request, 'core/truck_owner_dashboard.html', { 'trucks': my_trucks, 'bids': my_bids }) else: return redirect('/admin/') @login_required def truck_register(request): if request.user.profile.role != 'TRUCK_OWNER': return redirect('dashboard') if request.method == 'POST': truck_type = request.POST.get('truck_type') model = request.POST.get('model') year = request.POST.get('year') plate_no = request.POST.get('plate_no') load_capacity = request.POST.get('load_capacity') color = request.POST.get('color') truck = Truck.objects.create( owner=request.user, truck_type=truck_type, model=model, year=year, plate_no=plate_no, load_capacity=load_capacity, color=color, truck_picture=request.FILES.get('truck_picture'), registration_front=request.FILES.get('registration_front'), registration_back=request.FILES.get('registration_back'), driver_license=request.FILES.get('driver_license') ) messages.success(request, _("Truck registered successfully!")) return redirect('dashboard') return render(request, 'core/truck_register.html') @login_required def post_shipment(request): if request.user.profile.role != 'SHIPPER': return redirect('dashboard') if request.method == 'POST': description = request.POST.get('description') weight = request.POST.get('weight') origin = request.POST.get('origin') destination = request.POST.get('destination') delivery_date = request.POST.get('delivery_date') Shipment.objects.create( shipper=request.user, description=description, weight=weight, origin=origin, destination=destination, delivery_date=delivery_date ) messages.success(request, _("Shipment posted successfully!")) return redirect('dashboard') return render(request, 'core/post_shipment.html') @login_required def marketplace(request): if request.user.profile.role != 'TRUCK_OWNER': return redirect('dashboard') shipments = Shipment.objects.filter(status='OPEN').order_by('-created_at') return render(request, 'core/marketplace.html', {'shipments': shipments}) @login_required def place_bid(request, shipment_id): shipment = get_object_or_404(Shipment, id=shipment_id) if request.user.profile.role != 'TRUCK_OWNER': return redirect('dashboard') my_trucks = Truck.objects.filter(owner=request.user) if request.method == 'POST': truck_id = request.POST.get('truck') amount = request.POST.get('amount') comments = request.POST.get('comments') truck = get_object_or_404(Truck, id=truck_id, owner=request.user) Bid.objects.create( shipment=shipment, truck_owner=request.user, truck=truck, amount=amount, comments=comments ) messages.success(request, _("Bid placed successfully!")) return redirect('marketplace') return render(request, 'core/place_bid.html', {'shipment': shipment, 'trucks': my_trucks}) @login_required def shipment_detail(request, shipment_id): shipment = get_object_or_404(Shipment, id=shipment_id) # Security: check if user is shipper or a truck owner who bid if shipment.shipper != request.user and not Bid.objects.filter(shipment=shipment, truck_owner=request.user).exists(): if request.user.profile.role != 'ADMIN': return redirect('dashboard') bids = shipment.bids.all() return render(request, 'core/shipment_detail.html', {'shipment': shipment, 'bids': bids}) @login_required def accept_bid(request, bid_id): bid = get_object_or_404(Bid, id=bid_id) if bid.shipment.shipper != request.user: return redirect('dashboard') # Accept this bid bid.status = 'ACCEPTED' bid.save() # Reject others bid.shipment.bids.exclude(id=bid_id).update(status='REJECTED') # Update shipment bid.shipment.status = 'IN_PROGRESS' bid.shipment.assigned_truck = bid.truck bid.shipment.save() messages.success(request, _("Bid accepted! Shipment is now in progress.")) return redirect('shipment_detail', shipment_id=bid.shipment.id)