Guest User

users_views.py

a guest
Dec 8th, 2016
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 11.33 KB | None | 0 0
  1. import json
  2. from base64 import b64decode
  3.  
  4. #REST Framework
  5. from rest_framework import viewsets, status, serializers
  6. from serializers import UserSerializer, CustomerDetailsSerializer
  7. from rest_framework.response import Response
  8. from rest_framework.decorators import api_view
  9.  
  10.  
  11. # Django packages
  12. from django.shortcuts import render
  13. from django.core.exceptions import ObjectDoesNotExist
  14. from django.views.generic import View
  15. from django.views.generic.edit import CreateView, UpdateView, DeleteView
  16. from django.views.generic.list import ListView
  17. from django.views.decorators.csrf import csrf_exempt
  18. from django.http import HttpResponse, JsonResponse
  19. from django.core import serializers
  20. from django.core.serializers.json import DjangoJSONEncoder
  21. from django.http import HttpResponseBadRequest
  22. from django.db import connection, transaction
  23. from django.core.files.base import ContentFile
  24. from django.utils.decorators import method_decorator
  25. from django.views.decorators.http import require_http_methods
  26.  
  27. #from django.contrib.auth.decorators import never_cache
  28.  
  29.  
  30.  
  31. #Auth and register
  32. from django.contrib.auth import authenticate, login as django_login, logout as django_logout
  33. from forms.register import RegistrationFormCustomer, RegistrationFormDriver, RegistrationFormCustomerDetails, RegistrationFormDriverDetails
  34. from forms.authenticate import AuthenticationForm
  35. from forms.forms import DriverDetailsChangeForm, CustomerDetailsChangeForm
  36. from backends import EmailAuthBackend
  37. from debtcollector.models import DebtTable
  38.  
  39. #logging
  40. import logging
  41. l = logging.getLogger('django.request')
  42. l2 = logging.getLogger('default')
  43. from models import CustomUser, CustomerDetails, DriverDetails
  44. from itertools import chain
  45.  
  46. #Decorators
  47.  
  48. # Create your views here.
  49.  
  50.  
  51. """
  52. REST classes
  53.  
  54. """
  55.  
  56. #class UserViewSet(viewsets.ModelViewSet):
  57.  
  58.  
  59. class CreationView(View):
  60.  
  61. """
  62. The CreationView.
  63.  
  64. Handles views related to creation of users. Through this interface, one can create either a customer or a driver.
  65.  
  66. There is currently no use for the method create_driver, as these are created through the admin page.
  67.  
  68. For each User object, a separate table is used to maintain additional non-trivial data about the user. This is a security measure, as the user object itself might be vulnerable.
  69.  
  70.  
  71.  
  72. TODO:
  73. Remove csrf_exempt, as cookies have been implemented on the client.
  74.  
  75.  
  76. Attributes:
  77. customerForm (:obj: RegistrationFormCustomer): The form that validates Customer data.
  78. customerDetailsForm (:obj: RegistrationFormCustomerDetails) : The form that validates Customer Details data.
  79.  
  80. driverForm (:obj: RegistrationFormDriver): The form that validates Driver data.
  81. driverDetailsForm (:obj: RegistrationFormDriverDetails): The form that validates Driver Details data.
  82.  
  83. """
  84.  
  85. customerForm = RegistrationFormCustomer
  86. customerDetailsForm = RegistrationFormCustomerDetails
  87. driverForm = RegistrationFormDriver
  88. driverDetailsForm = RegistrationFormDriverDetails
  89.  
  90. #@require_http_methods(['GET', 'POST',])
  91. def dispatch(self, *args, **kwargs):
  92. return super(CreationView, self).dispatch(*args, **kwargs)
  93.  
  94. @csrf_exempt
  95. def create_customer(self, request):
  96.  
  97. """Creates a customer details object if the data provided is valid.
  98.  
  99. Args:
  100. request (:obj: HttpRequest): The request object generated by the HttpRequest module. Contains headers, session data and payload(amongst others)
  101.  
  102. Returns:
  103. HttpResponse(user, content_type="application/json") if successful.
  104. HttpResponseBadRequest("Customer details data not saved.") if details form is invalid.
  105. HttpResponseBadRequest("Customer form is invalid.") if user form is invalid.
  106.  
  107.  
  108. """
  109.  
  110. json_data = json.loads(request.body)
  111.  
  112. form = self.customerForm(json_data)
  113. serialized = UserSerializer(data=json_data)
  114. if form.is_valid():
  115. user = form.save()
  116. detailsForm = RegistrationFormCustomerDetails(json_data)
  117. if detailsForm.is_valid():
  118. serializedDetails = CustomerDetailsSerializer(json_data)
  119. cd = CustomerDetails.objects.create_customer_details(user=user,
  120. phone=json_data.get('phone'),
  121. facebookurl=json_data.get('facebookurl'),
  122. nationality=json_data.get('nationality'))
  123. cd.save()
  124.  
  125. print "SERIALIZED USER"
  126. else:
  127. return JsonResponse(CustomerDetailsSerializer(instance=serializedDetails), status=status.HTTP_201_CREATED)
  128.  
  129. return JsonResponse(UserSerializer(instance=user).data, status=status.HTTP_201_CREATED)
  130.  
  131. return Response(serialized.initial_data, status=status.HTTP_400_BAD_REQUEST)
  132.  
  133. def create_driver(self, request):
  134.  
  135. """Not used"""
  136.  
  137. json_data = json.loads(request.body)
  138.  
  139. form = self.driverForm(json_data)
  140.  
  141. if form.is_valid():
  142. user = form.save()
  143. detailsForm = RegistrationFormDriverDetails(json_data)
  144.  
  145. if detailsForm.is_valid():
  146. dd = DriverDetails.objects.create_driver_details(user=user, phone=json_data.get('phone'), facebookurl=json_data.get('facebookurl'))
  147. dd.save()
  148. driver_name = user.firstname + " " + user.lastname
  149. debt = DebtTable(driver = dd, debt = 0.0, driver_email=user.email, driver_name=driver_name)
  150. debt.save()
  151. else:
  152. return HttpResponseBadRequest("Driver details data not saved.")
  153. return HttpResponse(user, content_type="application/json")
  154. return HttpResponseBadRequest("Driver form is invalid.")
  155.  
  156. @csrf_exempt
  157. def post(self, request, *args, **kwargs):
  158. if request.path == '/create_customer':
  159. return self.create_customer(request)
  160. elif request.path == '/create_driver':
  161. return self.create_driver(request)
  162.  
  163. return HttpResponseBadRequest("Invalid URL")
  164.  
  165. class AuthView(View):
  166.  
  167. def login(self, request):
  168.  
  169. """Logs the user in.
  170.  
  171. The response of this method is subject to rework and will return responses based on standards in the REST framework
  172.  
  173. Args:
  174. request (:obj: HttpRequest): The request object generated by the HttpRequest module. Contains headers, session data and payload(amongst others)
  175.  
  176. Returns:
  177. HttpResponse("User is now logged in.") if successful. As a security measure, note that a user has to be flagged as is_active == True in order to be logged in.
  178.  
  179.  
  180. """
  181.  
  182. json_data = json.loads(request.body)
  183.  
  184. username = json_data.get('email')
  185. password = json_data.get('password')
  186. form = AuthenticationForm(json_data)
  187.  
  188.  
  189. if form.is_valid():
  190. try:
  191. user = authenticate(email=username, password=password)
  192. if user.is_authenticated():
  193. request.session['user_email'] = username
  194. if user.is_active:
  195. django_login(request, user)
  196. return HttpResponse("User is now logged in.")
  197. else:
  198. return HttpResponse("Inactive user.")
  199. else:
  200. return HttpResponse("User is None.(views.login())")
  201. except Exception:
  202. return HttpResponseBadRequest("Login failed.")
  203.  
  204. return HttpResponseBadRequest("User form invalid")
  205.  
  206. def logout(self, request):
  207.  
  208. json_data = json.loads(request.body)
  209.  
  210. user = request.user
  211.  
  212. if user.user_type == 'D':
  213. driver_instance = DriverDetails.objects.get(user_instance=user)
  214.  
  215. try:
  216. django_logout(request)
  217. if user.user_type == 'D':
  218. driver_instance.available=False
  219.  
  220. return HttpResponse("User logged out.")
  221. except Exception, e:
  222. raise e
  223.  
  224. return HttpResponseBadRequest
  225.  
  226. def post(self, request, *args, **kwargs):
  227.  
  228. if request.path == '/login':
  229. return self.login(request)
  230. elif request.path == '/logout':
  231. return self.logout(request)
  232. return Http404("url does not exist")
  233.  
  234. class DetailsView(View):
  235.  
  236. def add_profile_pic(self, request, details_obj):
  237.  
  238. """Saves a profile picture to target details_obj
  239.  
  240. Args:
  241. request (:obj: HttpRequest): The request object generated by the HttpRequest module. Contains headers, session data and payload(amongst others)
  242. details_obj (:obj: CustomerDetails || :obj: DriverDetails): The details object connected to the user.
  243.  
  244. Returns:
  245. HttpResponse("Profile picture saved") if successful
  246. HttpResponseBadRequest("An expcetion was caught: Profile Picture not saved.", error_message) otherwise.
  247.  
  248. """
  249.  
  250. try:
  251. json_data = json.loads(request.body)
  252.  
  253. base64raw = json_data.get('profile_pic')
  254. image_name = str(request.user.id) + "_profile.png"
  255. image_data = ContentFile(b64decode(base64raw), image_name)
  256.  
  257. details_obj.profile_pic.save(image_name, image_data, save=True)
  258.  
  259. return HttpResponse("Profile picture saved.")
  260.  
  261. except Exception, e:
  262. return HttpResponseBadRequest("An expcetion was caught: Profile Picture not saved.", e)
  263.  
  264. def get_profile_pic(self, request):
  265.  
  266. """Fetches the profile picture for the specific user.
  267.  
  268. Args:
  269. request (:obj: HttpRequest): The request object generated by the HttpRequest module. Contains headers, session data and payload(amongst others)
  270.  
  271. Returns:
  272. JsonResponse(:json: ContentFile): A JsonResponse containing the base64 encoded profile picture wrapped in a File upon success
  273. HttpResponseBadRequest("Something went wrong when fetching Profile Picture.") otherwise.
  274. TODO:
  275. Add support for multiple pictures per user.
  276. """
  277.  
  278. json_data = json.loads(request.body)
  279.  
  280. user = CustomUser.objects.get(email=json.data.get("email"))
  281. user_type = json_data.get("user_type")
  282.  
  283. if user_type == "D":
  284. details_obj = DriverDetails.objects.get(user_instance=user)
  285. elif user_type == "C":
  286. details_obj = CustomerDetails.objects.get(user_instance=user)
  287. else:
  288. details_obj = None
  289. try:
  290. image_data = ContentFile(b64encode(details_obj.profile_pic.file.read()))
  291. image_dict = json.dumps({"b64_img" : image_data})
  292. return JsonResponse(image_dict)
  293. except Exception as e:
  294. return HttpResponseBadRequest("Something went wrong when fetching Profile Picture.")
  295.  
  296.  
  297. def get_driver_details(self, request):
  298.  
  299. """
  300. Rewrite to use request.user?
  301.  
  302. """
  303.  
  304. try:
  305.  
  306. driver_email = request.session['trip_driver_email']
  307.  
  308. user_instance = CustomUser.objects.get(email=driver_email)
  309.  
  310. dd = DriverDetails.objects.get(user_instance=user_instance)
  311. return HttpResponse(serializers.serialize("json", [user_instance, dd]))
  312. except Exception, e:
  313. return HttpResponse("Driver not found")
  314.  
  315. return HttpResponse("Driver not found")
  316. def available(self, request):
  317.  
  318. user_instance = CustomUser.objects.get(email=request.GET['email'])
  319.  
  320. dd = DriverDetails.objects.get(user_instance=user_instance)
  321.  
  322. return dd.available
  323.  
  324. def post(self, request):
  325.  
  326. if request.user.is_authenticated():
  327.  
  328. if request.path == '/get_driver_details':
  329. return self.get_driver_details(request)
  330. elif request.path =='/add_profile_pic':
  331. if request.user.user_type == 'C':
  332. return self.add_profile_pic(request, CustomerDetails.objects.get(user_instance=request.user))
  333. elif request.user.user_type == 'D':
  334. return self.add_profile_pic(request, DriverDetails.objects.get(user_instance=request.user))
  335. else:
  336. return HttpResponseBadRequest("Invalid user type")
  337. elif request.path =='/get_profile_pic':
  338. return self.get_profile_pic(request)
  339.  
  340. return HttpResponseBadRequest("Bad url")
  341. else:
  342. return HttpResponseBadRequest("User not authenticated.")
  343.  
  344. def get(self, request):
  345.  
  346. if request.user.is_authenticated():
  347.  
  348. if request.path == '/available/':
  349. return HttpResponse(self.available(request))
  350. return HttpResponseBadRequest("Bad URL")
  351. else:
  352. return HttpResponseBadRequest("User not authenticated")
  353.  
  354. class CustomerAlreadyExistsException(Exception):
  355.  
  356. pass
Add Comment
Please, Sign In to add comment