You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
TeamFlash/sahara/main/views.py

216 lines
8.3 KiB

from django.shortcuts import render, redirect,HttpResponse,get_object_or_404
6 months ago
from django.contrib.auth import login, logout, authenticate
from django.contrib.auth.tokens import default_token_generator
6 months ago
from django.utils.http import urlsafe_base64_decode
from django.contrib.auth.decorators import login_required
from django.contrib import messages
from .models import User,Service,ServiceRequest
from .forms import UserRegistrationForm
from django.urls import reverse
6 months ago
import logging
import json
from django.utils import timezone
from django.http import JsonResponse
from django.views.decorators.csrf import csrf_protect
6 months ago
logger = logging.getLogger('main')
def home(request):
if(request.method == "GET"):
category = request.GET.get('category')
search = request.GET.get('search')
services = Service.objects.all()
if category:
try:
service = Service.objects.get(id=category)
service_providers = User.objects.filter(service_offered=service)
except Service.DoesNotExist:
service_providers = []
elif search:
try:
service_providers = User.objects.filter(first_name__startswith=search)
except Service.DoesNotExist:
service_providers = []
else:
service_providers = User.objects.filter(service_offered__isnull=False)
context = {
'service_providers': service_providers,
'services': services
}
return render(request, "main/home.html", context)
print(request.POST)
return HttpResponse("<h1>tjisfjsa<h1>")
6 months ago
def register(request):
if request.user.is_authenticated:
messages.warning(request, "You are already logged in.")
return redirect('home')
if request.method == 'POST':
form = UserRegistrationForm(request.POST, request.FILES)
if form.is_valid():
6 months ago
try:
user = form.save()
messages.success(request, 'Registration successful! You can now login.')
return redirect('login')
6 months ago
except Exception as e:
logger.error(f"Registration error: {str(e)}")
messages.error(request, 'An error occurred during registration. Please try again.')
else:
# Display form errors
for field, errors in form.errors.items():
for error in errors:
messages.error(request, f"{field}: {error}")
6 months ago
else:
form = UserRegistrationForm()
return render(request, 'main/register.html', {'form': form})
6 months ago
def activate_account(request, uidb64, token):
try:
uid = urlsafe_base64_decode(uidb64).decode()
user = User.objects.get(pk=uid)
except (TypeError, ValueError, OverflowError, User.DoesNotExist):
user = None
6 months ago
if user is not None and default_token_generator.check_token(user, token):
user.is_active = True
user.save()
messages.success(request, 'Your account has been activated. You can now log in.')
return redirect('login')
else:
messages.error(request, 'Invalid activation link.')
return redirect('register')
6 months ago
def user_login(request):
if request.user.is_authenticated:
messages.info(request, f'You are already logged in as {request.user}')
6 months ago
return redirect('home')
else:
if request.method == 'POST':
email = request.POST['email']
password = request.POST['password']
# Authenticate the user using the email and password
user = authenticate(request, email=email, password=password)
if user is not None:
# Log the user in
login(request, user)
messages.success(request, f'Welcome {user}!')
return redirect('home')
else:
# If authentication fails
messages.error(request, 'Invalid email or password. Please try again.')
6 months ago
# Handle GET request by initializing a blank form
form = None # Optionally, you can replace this with your login form
return render(request, 'main/login.html', {'form': form})
6 months ago
@login_required(login_url='login')
6 months ago
def user_logout(request):
logout(request)
messages.success(request, 'You have been logged out.')
return redirect('login')
def services(request):
return render(request,'main/services1.html')
6 months ago
def aboutus(request):
return render(request,'main/aboutus.html')
@login_required(login_url='login')
@csrf_protect
def hire_view(request):
if request.method == 'POST':
try:
data = json.loads(request.body)
price = data.get('price')
initiator_id = data.get('initiator')
service_provider_id = data.get('serviceProvider')
service_hour = data.get('serviceHour')
caretakerservice_id = data.get('caretakerservice')
# Validate required fields
if not price or not initiator_id or not service_provider_id or not service_hour or not caretakerservice_id:
return JsonResponse({'error': 'Missing required fields'}, status=400)
# Validate initiator
if str(request.user.id) != str(initiator_id):
return JsonResponse({'error': 'Unauthorized initiator'}, status=401)
# Retrieve service provider and service
service_provider = get_object_or_404(User, id=service_provider_id)
service = get_object_or_404(Service, id=caretakerservice_id)
# Create and save the service request
service_request = ServiceRequest(
agreed_price=price,
service_provider=service_provider,
client=request.user,
service_hour=service_hour,
service=service
)
service_request.save()
messages.success(request, 'Request submitted successfully!')
return JsonResponse({'success': 'Request submitted successfully!'}, status=201)
except json.JSONDecodeError:
messages.error(request, 'Invalid JSON format')
return JsonResponse({'error': 'Invalid JSON format'}, status=400)
except User.DoesNotExist:
messages.error(request, 'Service provider does not exist')
return JsonResponse({'error': 'Service provider does not exist'}, status=404)
except Service.DoesNotExist:
messages.error(request, 'Service does not exist')
return JsonResponse({'error': 'Service does not exist'}, status=404)
except Exception as e:
messages.error(request, f'An error occurred: {str(e)}')
return JsonResponse({'error': 'An error occurred'}, status=500)
else:
messages.error(request, 'Invalid request method')
return JsonResponse({'error': 'Invalid request method'}, status=405)
@login_required(login_url='login')
def profie_View(request,pk):
if request.method == "GET":
user = get_object_or_404(User,id=pk)
pending_requests = ServiceRequest.objects.filter(service_provider=user, is_approved=False)
current = ServiceRequest.objects.filter(service_provider=user, is_approved=True, is_completed=False)
completed = ServiceRequest.objects.filter(service_provider=user, is_completed=True)
context = {'user':user,
'pending_requests':pending_requests,
'completed_orders' : completed,
'current':current,
}
return render(request,'main/profile.html', context)
login_required(login_url='login')
def approve(request, pk):
try:
instance = ServiceRequest.objects.get(id=pk)
except ServiceRequest.DoesNotExist:
return redirect('error_page')
instance.is_approved = True
instance.agreed_on = timezone.now()
instance.save()
profile_url = reverse('profiles', kwargs={'pk': request.user.id})
return redirect(profile_url)
def complete(request, pk):
print(pk)
try:
instance = ServiceRequest.objects.get(id=pk)
except ServiceRequest.DoesNotExist:
return redirect('error_page')
instance.completed_date = timezone.now()
instance.is_completed = True
instance.save()
print(instance.is_completed)
profile_url = reverse('profiles', kwargs={'pk': request.user.id})
print(profile_url)
return redirect(profile_url)