editdetails.py 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. from rest_framework.response import Response
  2. from django import forms
  3. from misago.users.profilefields import profilefields, serialize_profilefields_data
  4. def edit_details_endpoint(request, user):
  5. if request.method == 'GET':
  6. return get_form_description(request, user)
  7. return submit_form(request, user)
  8. def get_form_description(request, user):
  9. groups = []
  10. for group in profilefields.get_fields_groups():
  11. group_fields = []
  12. for field in group['fields']:
  13. if field.can_edit(request, user):
  14. group_fields.append(field.get_edit_field_json(request, user))
  15. if group_fields:
  16. groups.append({
  17. 'name': group['name'],
  18. 'fields': group_fields
  19. })
  20. return Response(groups)
  21. def submit_form(request, user):
  22. fields = []
  23. for field in profilefields.get_fields():
  24. if field.can_edit(request, user):
  25. fields.append(field)
  26. form = DetailsForm(
  27. request.data,
  28. request=request,
  29. user=user,
  30. profilefields=fields,
  31. )
  32. if form.is_valid():
  33. user.profile_fields = form.cleaned_data
  34. user.save(update_fields=['profile_fields'])
  35. return Response(serialize_profilefields_data(request, profilefields, user))
  36. return Response(form.errors, status=400)
  37. class DetailsForm(forms.Form):
  38. def __init__(self, *args, **kwargs):
  39. self.request = kwargs.pop('request')
  40. self.user = kwargs.pop('user')
  41. self.profilefields = kwargs.pop('profilefields')
  42. super(DetailsForm, self).__init__(*args, **kwargs)
  43. for field in self.profilefields:
  44. self.fields[field.fieldname] = field.get_field_for_validation(
  45. self.request, self.user)
  46. def clean(self):
  47. data = super(DetailsForm, self).clean()
  48. for field in self.profilefields:
  49. if field.fieldname in data:
  50. try:
  51. data[field.fieldname] = field.clean_field(
  52. self.request, self.user, data[field.fieldname])
  53. except forms.ValidationError as e:
  54. self.add_error(field.fieldname, e)
  55. return data