37733-vm/core/views.py
Flatlogic Bot de92a4ccc0 dem1
2026-01-23 09:32:37 +00:00

173 lines
6.2 KiB
Python

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)