37733-vm/core/views.py
Flatlogic Bot cdfcd5f4e8 demo13
2026-01-23 12:14:40 +00:00

238 lines
9.5 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.utils import timezone
from .models import Profile, Truck, Shipment, Bid, Message
from .forms import TruckForm, ShipmentForm, BidForm, UserRegistrationForm
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
from .whatsapp import send_whatsapp_message
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 = UserRegistrationForm(request.POST)
if form.is_valid():
user = form.save()
profile = user.profile
profile.role = form.cleaned_data.get('role')
profile.phone_number = form.cleaned_data.get('phone_number')
profile.country_code = form.cleaned_data.get('country_code')
profile.save()
login(request, user)
messages.success(request, _("Registration successful. Welcome!"))
return redirect('dashboard')
else:
messages.error(request, _("Please correct the errors below."))
else:
form = UserRegistrationForm()
return render(request, 'registration/register.html', {'form': form})
@login_required
def dashboard(request):
profile, created = Profile.objects.get_or_create(user=request.user)
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':
approved_trucks = Truck.objects.filter(owner=request.user, is_approved=True)
pending_trucks = Truck.objects.filter(owner=request.user, is_approved=False)
my_bids = Bid.objects.filter(truck_owner=request.user).order_by('-created_at')
return render(request, 'core/truck_owner_dashboard.html', {
'trucks': approved_trucks,
'pending_trucks': pending_trucks,
'bids': my_bids
})
elif profile.role == 'ADMIN' or request.user.is_superuser:
pending_trucks = Truck.objects.filter(is_approved=False).order_by('-created_at')
approved_trucks = Truck.objects.filter(is_approved=True).order_by('-created_at')
context = {
'total_users': User.objects.count(),
'total_trucks': Truck.objects.count(),
'total_shipments': Shipment.objects.count(),
'total_bids': Bid.objects.count(),
'pending_trucks': pending_trucks,
'approved_trucks': approved_trucks,
}
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.is_approved = False # Ensure it stays false on new reg
truck.save()
messages.success(request, _("Truck registered successfully! It will be visible after admin approval."))
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 edit_truck(request, truck_id):
truck = get_object_or_404(Truck, id=truck_id, owner=request.user)
if request.method == 'POST':
form = TruckForm(request.POST, request.FILES, instance=truck)
if form.is_valid():
truck = form.save(commit=False)
truck.is_approved = False # Reset approval status on update
truck.save()
messages.success(request, _("Truck data updated successfully! It will be reviewed by admin again."))
return redirect('dashboard')
else:
messages.error(request, _("There was an error updating your truck. Please check the form."))
else:
form = TruckForm(instance=truck)
return render(request, 'core/truck_register.html', {'form': form, 'edit_mode': True, 'truck': truck})
@login_required
def approve_truck(request, truck_id):
if not (request.user.profile.role == 'ADMIN' or request.user.is_superuser):
return redirect('dashboard')
truck = get_object_or_404(Truck, id=truck_id)
truck.is_approved = True
truck.save()
# Notify Truck Owner via WhatsApp
owner_phone = getattr(truck.owner.profile, 'full_phone_number', None)
if owner_phone:
msg = f"Your truck ({truck.plate_no}) has been approved! You can now place bids on shipments."
send_whatsapp_message(owner_phone, msg)
messages.success(request, _("Truck approved successfully!"))
return redirect('dashboard')
@login_required
def suspend_truck(request, truck_id):
if not (request.user.profile.role == 'ADMIN' or request.user.is_superuser):
return redirect('dashboard')
truck = get_object_or_404(Truck, id=truck_id)
truck.is_approved = False
truck.save()
messages.warning(request, _("Truck has been suspended."))
return redirect('dashboard')
@login_required
def post_shipment(request):
if request.user.profile.role != 'SHIPPER':
return redirect('dashboard')
if request.method == 'POST':
form = ShipmentForm(request.POST)
if form.is_valid():
shipment = form.save(commit=False)
shipment.shipper = request.user
shipment.save()
messages.success(request, _("Shipment posted successfully!"))
return redirect('dashboard')
else:
messages.error(request, _("Please correct the errors in the form."))
else:
form = ShipmentForm()
return render(request, 'core/post_shipment.html', {'form': form})
@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')
# Optional: Only allow bidding if user has at least one approved truck
if not Truck.objects.filter(owner=request.user, is_approved=True).exists():
messages.warning(request, _("You must have at least one approved truck to place a bid."))
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()
# Notify Shipper via WhatsApp
shipper_phone = getattr(shipment.shipper.profile, 'full_phone_number', None)
if shipper_phone:
msg = f"New bid placed on your shipment from {shipment.origin} to {shipment.destination}! Amount: {bid.amount}"
send_whatsapp_message(shipper_phone, msg)
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()
# Notify Truck Owner via WhatsApp
owner_phone = getattr(bid.truck_owner.profile, 'full_phone_number', None)
if owner_phone:
msg = f"Congratulations! Your bid for the shipment from {bid.shipment.origin} to {bid.shipment.destination} has been accepted."
send_whatsapp_message(owner_phone, msg)
messages.success(request, _("Bid accepted! Shipment is now in progress."))
return redirect('shipment_detail', shipment_id=bid.shipment.id)