37733-vm/core/views.py
Flatlogic Bot ba8173f9d8 demo2
2026-01-23 09:55:56 +00:00

168 lines
6.1 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 .forms import TruckForm, ShipmentForm, BidForm
from django.contrib import messages
from django.utils.translation import gettext as _
from django.db.models import Q
from django.contrib.auth.models import User
def home(request):
"""Render the landing screen for MASAR CARGO."""
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
})
elif profile.role == 'ADMIN' or request.user.is_superuser:
context = {
'total_users': User.objects.count(),
'total_trucks': Truck.objects.count(),
'total_shipments': Shipment.objects.count(),
'total_bids': Bid.objects.count(),
}
return render(request, 'core/admin_dashboard.html', context)
else:
# Fallback for undefined roles
return redirect('/')
@login_required
def truck_register(request):
if request.user.profile.role != 'TRUCK_OWNER':
return redirect('dashboard')
if request.method == 'POST':
form = TruckForm(request.POST, request.FILES)
if form.is_valid():
truck = form.save(commit=False)
truck.owner = request.user
truck.save()
messages.success(request, _("Truck registered successfully!"))
return redirect('dashboard')
else:
messages.error(request, _("There was an error in your registration. Please check the form."))
else:
form = TruckForm()
return render(request, 'core/truck_register.html', {'form': form})
@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')
if request.method == 'POST':
form = BidForm(request.POST, user=request.user)
if form.is_valid():
bid = form.save(commit=False)
bid.truck_owner = request.user
bid.shipment = shipment
bid.save()
messages.success(request, _("Bid placed successfully!"))
return redirect('marketplace')
else:
messages.error(request, _("Error placing bid. Please check the form."))
else:
form = BidForm(user=request.user)
return render(request, 'core/place_bid.html', {'form': form, 'shipment': shipment})
@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' and not request.user.is_superuser:
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)