from django.shortcuts import render, redirect import random from django.contrib.auth import authenticate, login from .forms import * from Device .forms import DevicesForm from django.db import IntegrityError from django.conf import settings from .models import* from django.http import HttpResponse from django.core.mail import EmailMultiAlternatives from django.template.loader import render_to_string from django.utils.html import strip_tags from django.contrib import messages from django.views.decorators.csrf import csrf_exempt from django.http import JsonResponse from django.contrib.auth import logout from django.utils.decorators import method_decorator from django.contrib.auth.decorators import login_required from rest_framework.decorators import api_view from rest_framework.response import Response from rest_framework import status from .models import UserProfile from Device .models import Devices from .serializers import UserProfileSerializer, DeviceSerializer import os #________________________________________________________Mail Functions____________________________________________ def tech4biz_generate_otp(length=6): otp = "" for _ in range(length): otp += str(random.randint(0, 9)) return otp def tech4biz_send_otp_email(email): otp = tech4biz_generate_otp() subject = 'Your OTP for Signup' html_content = render_to_string('accounts/otp_template.html', {'otp': otp}) text_content = strip_tags(html_content) email_message = EmailMultiAlternatives(subject, text_content, settings.EMAIL_HOST_USER, [email]) email_message.attach_alternative(html_content, "text/html") try: email_message.send() return otp except Exception as e: return None #________________________________________________________Signup Login___________________________________________________ # def tech4biz_Signup(request): # if request.method == 'POST': # form = SignUpForm(request.POST) # if form.is_valid(): # request.session['form_data'] = form.cleaned_data # email = form.cleaned_data['email'] # try: # otp = tech4biz_send_otp_email(email) # print(otp) # request.session['sent_otp'] = otp # return redirect('otp_verification') # except Exception as e: # return HttpResponse(f'Failed to send OTP email: {e}') # else: # form = SignUpForm() # return render(request, 'accounts/signup.html', {'form': form}) # def tech4biz_Signup(request): # if request.method == 'POST': # form = SignUpForm(request.POST) # if form.is_valid(): # user_profile = form.save() # Saves both the user and user profile # request.session['user_id'] = user_profile.user.id # Assuming user_profile has a related User object # return JsonResponse({ # "message": "User registered successfully", # "user_id": user_profile.user.id # Include user.id in the response # }, status=200) # else: # # Return a more user-friendly error message # error_messages = form.errors.as_json() # Get errors in JSON format # return JsonResponse({"error": error_messages}, status=400) # Return form errors as JSON # else: # form = SignUpForm() # Instantiate an empty form # return render(request, 'accounts/signup.html', {'form': form}) def tech4biz_Signup(request): mapbox_access_token = 'pk.eyJ1IjoiZmxleHhvbiIsImEiOiJjbHVtYzNoM2cwNXI2MnFveW51c2tyejVwIn0.ceqt6Ot6nU67CUmxVAWPEQ' print("Received a request to tech4biz_Signup") if request.method == 'POST': print("Processing POST request") form = SignUpForm(request.POST) device_form = DevicesForm(request.POST) print("SignUpForm and DevicesForm created") if form.is_valid(): # Save the user profile from SignUpForm user_profile = form.save() print("User profile created:", user_profile) user_id = user_profile.user.id # Access the ID of the newly created user from user_profile print("Extracted user ID:", user_id) # Set the user_id in the session request.session['user_id'] = user_id # Set 'used_by' field directly in device_form's data before validation device_form.data = device_form.data.copy() device_form.data['used_by'] = user_profile if device_form.is_valid(): # Create device instance from device_form without saving it yet device_instance = device_form.save(commit=False) device_instance.used_by = user_profile # Set the user as 'used_by' print('Device instance prepared for saving:', device_instance) try: # Save the device instance device_instance.save() print("Device instance saved successfully") # Set the device ID in environment variable os.environ['DEVICE_ID'] = str(device_instance.id) print("Device ID set in OS environment:", os.environ['DEVICE_ID']) device_id = device_instance.id return JsonResponse({ "message": "User and device registered successfully", "user_id": user_profile.user.id, "device_id": device_id }, status=200) except IntegrityError as e: error_message = str(e) print("IntegrityError occurred:", error_message) form.add_error(None, error_message) device_form.add_error(None, error_message) else: # Print device form errors if it is not valid print("Device form errors:", device_form.errors) return JsonResponse({ "device_errors": device_form.errors.as_json() }, status=400) else: # Return form errors if any exist error_messages = form.errors.as_json() device_error_messages = device_form.errors.as_json() print("Form errors:", error_messages) print("Device form errors:", device_error_messages) return JsonResponse({ "error": error_messages, "device_errors": device_error_messages }, status=400) else: print("Request method is not POST") form = SignUpForm() device_form = DevicesForm() return render(request, 'accounts/signup.html', { 'form': form, 'device_form': device_form, "mapbox_access_token": mapbox_access_token }) def otp_verification(request): if request.method == 'POST': # Get individual OTP digits entered_otp1 = request.POST.get('email_otp1') entered_otp2 = request.POST.get('email_otp2') entered_otp3 = request.POST.get('email_otp3') entered_otp4 = request.POST.get('email_otp4') entered_otp5 = request.POST.get('email_otp5') entered_otp6 = request.POST.get('email_otp6') # Combine OTP digits into a single string entered_otp = entered_otp1 + entered_otp2 + entered_otp3 + entered_otp4 + entered_otp5 + entered_otp6 print(entered_otp, "otp") # Just for debugging stored_otp = request.session.get('sent_otp') if entered_otp == stored_otp: form_data = request.session.get('form_data') form = SignUpForm(form_data) if form.is_valid(): form.save() del request.session['form_data'] del request.session['sent_otp'] return redirect('login') else: messages.error(request, 'Form data is not valid.') return redirect('signup') else: messages.error(request, 'Invalid OTP. Please try again.') return redirect('otp_verification') return render(request, 'accounts/otp_verification.html') def tech4biz_Login(request): if request.user.is_authenticated: # Check if the user is already logged in return redirect('home') if request.method == 'POST': form = UserLoginForm(request.POST) if form.is_valid(): email = form.cleaned_data['email'] password = form.cleaned_data['password'] user = authenticate(request, username=email, password=password) if user is not None: login(request, user) return redirect('home') else: return render(request, 'accounts/login.html', {'form': form, 'invalid_login': True}) else: form = UserLoginForm() return render(request, 'accounts/login.html', {'form': form}) def user_logout(request): logout(request) return redirect('login') def profile(request): return render(request, 'profile/profile.html') #____________________________________________________________________________________________________________________ @api_view(['GET']) @login_required # Ensures the user is logged in def get_user_details_and_device_pods(request): try: # Get the logged-in user's UserProfile user_profile = UserProfile.objects.get(user=request.user) # Get the devices associated with the logged-in user devices = Devices.objects.filter(used_by=user_profile) # Construct the response data response_data = { "user_details": { "user": user_profile.user.id, "email": user_profile.email, "phone_number": user_profile.phone_number, "company_name": user_profile.company_name, }, "device_pods": [{"pod": device.pod} for device in devices] } print('response data',response_data) # Return data as JSON response return JsonResponse(response_data, status=200) except UserProfile.DoesNotExist: return JsonResponse({"error": "User profile not found."}, status=404) except Exception as e: return JsonResponse({"error": str(e)}, status=500)