Add SOLD OUT badge and improve deployment docs
- Add SOLD OUT overlay on car detail page image - Add SOLD OUT badge next to car name - Add Sold Out status in Admin Cars detail view - Add soldout field to Car TypeScript interface - Create PRODUCTION_VALUES.md for deployment reference - Update CLAUDE.md with CRITICAL deployment section - Update TROUBLESHOOTING.md with recurring errors 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -4,7 +4,7 @@ from typing import List
|
||||
from datetime import datetime, timedelta
|
||||
|
||||
from ..database import get_db
|
||||
from ..models import VehicleRequest, RequestVehicle, PurchasedVehicle, User, DealerInfo, SystemSettings
|
||||
from ..models import VehicleRequest, RequestVehicle, PurchasedVehicle, User, DealerInfo, SystemSettings, Car
|
||||
from ..schemas import (
|
||||
VehicleRequestCreate, VehicleRequestResponse,
|
||||
RequestVehicleCreate, RequestVehicleResponse, RequestVehicleApprove,
|
||||
@@ -100,9 +100,21 @@ def get_my_requests(
|
||||
else:
|
||||
approved_vehicles = []
|
||||
|
||||
# Enrich approved vehicles with latest soldout status from cars table
|
||||
enriched_vehicles = []
|
||||
for v in approved_vehicles:
|
||||
vehicle_response = RequestVehicleResponse.model_validate(v)
|
||||
# Get latest soldout status from cars table
|
||||
if v.car_id:
|
||||
car = db.query(Car).filter(Car.id == v.car_id).first()
|
||||
if car:
|
||||
# Add soldout status to car_data
|
||||
vehicle_response.car_data = {**vehicle_response.car_data, "soldout": car.soldout}
|
||||
enriched_vehicles.append(vehicle_response)
|
||||
|
||||
result.append(VehicleRequestWithVehicles(
|
||||
request=VehicleRequestResponse.model_validate(req),
|
||||
approved_vehicles=[RequestVehicleResponse.model_validate(v) for v in approved_vehicles]
|
||||
approved_vehicles=enriched_vehicles
|
||||
))
|
||||
|
||||
return result
|
||||
@@ -189,9 +201,30 @@ def admin_get_request_detail(
|
||||
if not request:
|
||||
raise HTTPException(status_code=404, detail="Request not found")
|
||||
|
||||
# Import CarPerformanceCheck for PDF status
|
||||
from ..models import CarPerformanceCheck
|
||||
|
||||
# Enrich with PDF status and soldout
|
||||
enriched_vehicles = []
|
||||
for v in request.recommended_vehicles:
|
||||
vehicle_response = RequestVehicleResponse.model_validate(v)
|
||||
|
||||
# Get PDF status and soldout from car
|
||||
if v.car_id:
|
||||
car = db.query(Car).filter(Car.id == v.car_id).first()
|
||||
perf_check = db.query(CarPerformanceCheck).filter(CarPerformanceCheck.car_id == v.car_id).first()
|
||||
|
||||
vehicle_response.car_data = {
|
||||
**vehicle_response.car_data,
|
||||
"soldout": car.soldout if car else False,
|
||||
"has_pdf": bool(perf_check and perf_check.pdf_path),
|
||||
"check_num": perf_check.check_number if perf_check else None,
|
||||
}
|
||||
enriched_vehicles.append(vehicle_response)
|
||||
|
||||
return VehicleRequestWithVehicles(
|
||||
request=VehicleRequestResponse.model_validate(request),
|
||||
approved_vehicles=[RequestVehicleResponse.model_validate(v) for v in request.recommended_vehicles]
|
||||
approved_vehicles=enriched_vehicles
|
||||
)
|
||||
|
||||
|
||||
@@ -202,7 +235,7 @@ def admin_add_vehicle(
|
||||
current_user: User = Depends(get_current_user),
|
||||
db: Session = Depends(get_db)
|
||||
):
|
||||
"""Admin: Add a vehicle to a request"""
|
||||
"""Admin: Add a vehicle to a request (also imports to cars table)"""
|
||||
if not current_user.is_admin:
|
||||
raise HTTPException(status_code=403, detail="Admin access required")
|
||||
|
||||
@@ -210,9 +243,51 @@ def admin_add_vehicle(
|
||||
if not request:
|
||||
raise HTTPException(status_code=404, detail="Request not found")
|
||||
|
||||
# Extract car data
|
||||
car_data = vehicle_data.car_data
|
||||
source_id = str(car_data.get("id", ""))
|
||||
|
||||
# Check if car already exists in cars table
|
||||
existing_car = None
|
||||
if source_id:
|
||||
existing_car = db.query(Car).filter(
|
||||
Car.source == "carmodoo",
|
||||
Car.source_id == source_id
|
||||
).first()
|
||||
|
||||
car_id = None
|
||||
if existing_car:
|
||||
car_id = existing_car.id
|
||||
elif source_id:
|
||||
# Create new car record from car_data
|
||||
new_car = Car(
|
||||
source="carmodoo",
|
||||
source_id=source_id,
|
||||
car_name=car_data.get("car_name", ""),
|
||||
year=car_data.get("year"),
|
||||
mileage=car_data.get("mileage"),
|
||||
price_krw=car_data.get("original_price"),
|
||||
fuel=car_data.get("fuel"),
|
||||
transmission=car_data.get("transmission"),
|
||||
color=car_data.get("color"),
|
||||
displacement=car_data.get("displacement"),
|
||||
margin_krw=car_data.get("korea_margin"),
|
||||
margin_mn=car_data.get("mongolia_margin"),
|
||||
check_num=car_data.get("check_num"),
|
||||
is_displayed=True, # Displayed so user can view recommended car
|
||||
status="active"
|
||||
)
|
||||
db.add(new_car)
|
||||
db.flush()
|
||||
car_id = new_car.id
|
||||
|
||||
# Update car_data with local car_id for frontend
|
||||
car_data["local_car_id"] = car_id
|
||||
|
||||
vehicle = RequestVehicle(
|
||||
request_id=request_id,
|
||||
car_data=vehicle_data.car_data,
|
||||
car_id=car_id,
|
||||
car_data=car_data,
|
||||
is_approved=vehicle_data.is_approved,
|
||||
approved_at=datetime.utcnow() if vehicle_data.is_approved else None
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user