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

180 lines
7.3 KiB

from django.shortcuts import render, redirect,HttpResponse,get_object_or_404
from django.contrib.auth import login, logout, authenticate
from django.contrib.auth.tokens import default_token_generator
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
import logging
import json
from django.http import JsonResponse
from django.views.decorators.csrf import csrf_protect
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>")
def register(request):
if request.user.is_authenticated:
messages.warning(request,"You are already logged in. Please Logout first to register ")
return redirect('home')
if request.method == 'POST' and request.FILES:
form = UserRegistrationForm(request.POST,request.FILES, instance=request.user)
if form.is_valid():
user = form.save(commit=False)
user.set_password(form.cleaned_data['password'])
user.save()
try:
user.send_verification_email(user)
messages.success(request, 'Registration successful! Please check your email to activate your account.')
except Exception as e:
logger.error(f"Error sending verification email: {e}")
messages.error(request, e)
return redirect('login')
else:
form = UserRegistrationForm()
messages.error(request, 'email already exists')
return render(request, 'main/register.html', {'form': form})
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
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')
def user_login(request):
if request.user.is_authenticated:
messages.info(request, f'You are already logged in as {request.user}')
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.')
# 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})
@login_required
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')
@login_required
@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)
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)
completed = ServiceRequest.objects.filter(service_provider=user, is_completed=True)
context = {'user':user,
'pending_requests':pending_requests,
'completed_orders' : completed
}
return render(request,'main/profile.html', context)