user_resource.py 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. # -*- coding: utf-8 -*-
  2. from __future__ import unicode_literals
  3. from tastypie import fields
  4. from tastypie.resources import ModelResource
  5. from tastypie.authorization import Authorization
  6. from tastypie.exceptions import ImmediateHttpResponse
  7. from tastypie.utils import trailing_slash
  8. from django.conf.urls import url
  9. from django.contrib.auth.models import User
  10. from api.validations.user_validation import UserValidation
  11. from api.resources.group_resource import GroupResource
  12. from api.utils.jwt_authentication import JWTAuthentication
  13. import simplejson as json
  14. '''
  15. '''
  16. class UserResource(ModelResource):
  17. groups = fields.ToManyField(GroupResource, 'groups')
  18. class Meta:
  19. queryset = User.objects.all()
  20. always_return_data = True
  21. validation = UserValidation()
  22. authentication = JWTAuthentication()
  23. '''
  24. '''
  25. def prepend_urls(self):
  26. return [
  27. url(r'^(?P<resource_name>%s)/(?P<%s>.*?)/change_password%s$' % (self._meta.resource_name, self._meta.detail_uri_name, trailing_slash), self.wrap_view('change_password'), name='api_change_password')
  28. ]
  29. '''
  30. '''
  31. def change_password(self, request, **kwargs):
  32. self.method_check(request, ['post'])
  33. self.is_authenticated(request)
  34. # Check content type
  35. if request.content_type != 'application/json':
  36. return self.create_response(request, {
  37. 'error_message': 'request is not json'
  38. })
  39. # Check body
  40. if not request.body:
  41. return self.create_response(request, {
  42. 'error_message': 'request body is empty'
  43. })
  44. # Check if password is present in body
  45. if not 'password' in request.body:
  46. return self.create_response(request, {
  47. 'error_message': 'password is not provided'
  48. })
  49. body = json.loads(request.body)
  50. user = User.objects.get(pk=kwargs.get('pk'))
  51. user.set_password(body['password'])
  52. bundle = self.build_bundle(obj=user, request=request)
  53. bundle = self.full_dehydrate(bundle)
  54. return self.create_response(request, {
  55. self._meta.resource_name: bundle
  56. })
  57. '''
  58. '''
  59. def save(self, bundle, skip_errors=False):
  60. if bundle.via_uri:
  61. return bundle
  62. self.is_valid(bundle)
  63. # If bundle has errors send this reponse
  64. if bundle.errors and not skip_errors:
  65. raise ImmediateHttpResponse(response=self.error_response(bundle.request, bundle.errors))
  66. # If object data is not persist create django auth user
  67. if bundle.obj._state.adding:
  68. user = User.objects.create_user(bundle.data['username'], bundle.data['email'], bundle.data['password'])
  69. user.first_name = bundle.data.get('first_name', '')
  70. user.last_name = bundle.data.get('last_name', '')
  71. bundle.obj = user
  72. bundle.data['groups'] = bundle.data.get('groups', [])
  73. if bundle.obj.pk:
  74. self.authorized_update_detail(self.get_object_list(bundle.request), bundle)
  75. else:
  76. self.authorized_create_detail(self.get_object_list(bundle.request), bundle)
  77. self.save_related(bundle)
  78. obj_id = self.create_identifier(bundle.obj)
  79. if obj_id not in bundle.objects_saved or bundle.obj._state.adding:
  80. bundle.obj.save()
  81. bundle.objects_saved.add(obj_id)
  82. m2m_bundle = self.hydrate_m2m(bundle)
  83. self.save_m2m(m2m_bundle)
  84. return bundle