168 lines
6.1 KiB
Python
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)
|