We are currently solving the following issue within our repository. Here is the issue text:
--- BEGIN ISSUE ---
Learn-only device - The 'Full name' value entered in the setup wizard is missing
## Observed behavior
If I create a new learner user through the 'LOD>Create a new user account for an existing facility' user flow then the 'Full name' value is missing from both the learner's profile page and the user details in Facility > Users

![2023-09-01_15-24-40](https://github.com/learningequality/kolibri/assets/79847249/23ba6915-2ab3-45a4-a62b-4665115a8c9f)

## Expected behavior
The 'Full name' value should be stored and displayed correctly as it is a required field.

## Steps to reproduce the issue
1. Install the latest [Beta 4 build](https://github.com/learningequality/kolibri/releases/tag/v0.16.0-beta4).
2. On one VM create a Full facility
3. On another VM go through the 'LOD>Create a new user account for an existing facility' user flow

## More information

https://github.com/learningequality/kolibri/assets/79847249/0a5e978b-ee99-481b-8ce3-d5c4d166eef2

## Usage Details
Kolibri 0.16beta4
Windows 10, Ubuntu - Chrome, Firefox

--- END ISSUE ---

Below are some code segments, each from a relevant file. One or more of these files may contain bugs.
--- BEGIN FILES ---
Path: `kolibri/plugins/setup_wizard/api.py`
Content:
```
1 import requests
2 from django.urls import reverse
3 from rest_framework import decorators
4 from rest_framework.exceptions import NotFound
5 from rest_framework.exceptions import PermissionDenied
6 from rest_framework.exceptions import ValidationError
7 from rest_framework.permissions import BasePermission
8 from rest_framework.response import Response
9 from rest_framework.viewsets import ViewSet
10 
11 from kolibri.core.auth.constants import user_kinds
12 from kolibri.core.auth.models import Facility
13 from kolibri.core.auth.models import FacilityUser
14 from kolibri.core.auth.utils.users import get_remote_users_info
15 from kolibri.core.device.models import DevicePermissions
16 
17 
18 # Basic class that makes these endpoints unusable if device is provisioned
19 class HasPermissionDuringSetup(BasePermission):
20     def has_permission(self, request, view):
21         from kolibri.core.device.utils import device_provisioned
22 
23         return not device_provisioned()
24 
25 
26 class HasPermissionDuringLODSetup(BasePermission):
27     def has_permission(self, request, view):
28         from kolibri.core.device.utils import get_device_setting
29 
30         return get_device_setting("subset_of_users_device")
31 
32 
33 class SetupWizardResource(ViewSet):
34     """
35     Generic endpoints for use during various setup wizard onboarding flows
36     """
37 
38     permission_classes = (HasPermissionDuringSetup,)
39 
40     @decorators.action(methods=["post"], detail=False)
41     def createuseronremote(self, request):
42         facility_id = request.data.get("facility_id", None)
43         username = request.data.get("username", None)
44         password = request.data.get("password", None)
45         baseurl = request.data.get("baseurl", None)
46 
47         api_url = reverse("kolibri:core:publicsignup-list")
48 
49         url = "{}{}".format(baseurl, api_url)
50 
51         payload = {
52             "facility_id": facility_id,
53             "username": username,
54             "password": password,
55         }
56 
57         r = requests.post(url, data=payload)
58         return Response({"status": r.status_code, "data": r.content})
59 
60 
61 class FacilityImportViewSet(ViewSet):
62     """
63     A group of endpoints that are used by the SetupWizard to import a facility
64     and create a superuser
65     """
66 
67     permission_classes = (HasPermissionDuringSetup,)
68 
69     @decorators.action(methods=["get"], detail=False)
70     def facilityadmins(self, request):
71         # The filter is very loose, since we are assuming that the only
72         # users are from the new facility
73         queryset = FacilityUser.objects.filter(roles__kind__contains="admin")
74         response_data = [
75             {"full_name": user.full_name, "username": user.username, "id": user.id}
76             for user in queryset
77         ]
78         return Response(response_data)
79 
80     @decorators.action(methods=["post"], detail=False)
81     def grantsuperuserpermissions(self, request):
82         """
83         Given a user ID and credentials, create a superuser DevicePermissions record
84         """
85         user_id = request.data.get("user_id", "")
86         password = request.data.get("password", "")
87 
88         # Get the Facility User object
89         try:
90             facilityuser = FacilityUser.objects.get(id=user_id)
91         except (Exception, FacilityUser.DoesNotExist):
92             raise NotFound()
93 
94         # Test for password and admin role
95         if (
96             not facilityuser.check_password(password)
97             or user_kinds.ADMIN not in facilityuser.session_data["kind"]
98         ):
99             raise PermissionDenied()
100 
101         # If it succeeds, create a DevicePermissions model for the user
102         DevicePermissions.objects.update_or_create(
103             user=facilityuser,
104             defaults={"is_superuser": True, "can_manage_content": True},
105         )
106 
107         # Finally: return a simple 200 so UI can continue on
108         return Response({"user_id": user_id})
109 
110     @decorators.action(methods=["post"], detail=False)
111     def createsuperuser(self, request):
112         """
113         Given a username, full name and password, create a superuser attached
114         to the facility that was imported (or create a facility with given facility_name)
115         """
116         facility_name = request.data.get("facility_name", None)
117 
118         # Get the imported facility (assuming its the only one at this point)
119         if Facility.objects.count() == 0:
120             the_facility = Facility.objects.create(name=facility_name)
121         else:
122             the_facility = Facility.objects.get()
123             if facility_name:
124                 the_facility.name = facility_name
125                 the_facility.save()
126 
127         try:
128             superuser = FacilityUser.objects.create_superuser(
129                 request.data.get("username"),
130                 request.data.get("password"),
131                 facility=the_facility,
132                 full_name=request.data.get("full_name"),
133             )
134             return Response({"username": superuser.username})
135 
136         except ValidationError:
137             raise ValidationError(detail="duplicate", code="duplicate_username")
138 
139     @decorators.action(methods=["post"], detail=False)
140     def listfacilitylearners(self, request):
141         """
142         If the request is done by an admin user  it will return a list of the users of the
143         facility
144 
145         :param baseurl: First part of the url of the server that's going to be requested
146         :param facility_id: Id of the facility to authenticate and get the list of users
147         :param username: Username of the user that's going to authenticate
148         :param password: Password of the user that's going to authenticate
149         :return: List of the learners of the facility.
150         """
151         facility_id = request.data.get("facility_id")
152         baseurl = request.data.get("baseurl")
153         password = request.data.get("password")
154         username = request.data.get("username")
155         facility_info = get_remote_users_info(baseurl, facility_id, username, password)
156         user_info = facility_info["user"]
157         roles = user_info["roles"]
158         admin_roles = (user_kinds.ADMIN, user_kinds.SUPERUSER)
159         if not any(role in roles for role in admin_roles):
160             raise PermissionDenied()
161         students = [u for u in facility_info["users"] if not u["roles"]]
162         return Response({"students": students, "admin": facility_info["user"]})
163
```
--- END FILES ---

Please first localize the bug based on the issue statement, and then generate a patch according to the `git diff` format fenced by three backticks.

Here is an example:

```diff
diff --git a/examples/server_async.py b/examples/server_async.py
--- a/examples/server_async.py
+++ b/examples/server_async.py
@@ -313,4 +313,4 @@
 
 
 if __name__ == "__main__":
-    asyncio.run(run_async_server("."), debug=True)
+    asyncio.run(run_async_server(), debug=True)
diff --git a/examples/server_sync.py b/examples/server_sync.py
--- a/examples/server_sync.py
+++ b/examples/server_sync.py
@@ -313,5 +313,5 @@
 
 
 if __name__ == "__main__":
-    server = run_sync_server(".")
+    server = run_sync_server()
     server.shutdown()

```

diff --git a/kolibri/plugins/setup_wizard/api.py b/kolibri/plugins/setup_wizard/api.py
--- a/kolibri/plugins/setup_wizard/api.py
+++ b/kolibri/plugins/setup_wizard/api.py
@@ -42,6 +42,7 @@
         facility_id = request.data.get("facility_id", None)
         username = request.data.get("username", None)
         password = request.data.get("password", None)
+        full_name = request.data.get("full_name", "")
         baseurl = request.data.get("baseurl", None)
 
         api_url = reverse("kolibri:core:publicsignup-list")
@@ -52,6 +53,7 @@
             "facility_id": facility_id,
             "username": username,
             "password": password,
+            "full_name": full_name,
         }
 
         r = requests.post(url, data=payload)

{"golden_diff": "diff --git a/kolibri/plugins/setup_wizard/api.py b/kolibri/plugins/setup_wizard/api.py\n--- a/kolibri/plugins/setup_wizard/api.py\n+++ b/kolibri/plugins/setup_wizard/api.py\n@@ -42,6 +42,7 @@\n         facility_id = request.data.get(\"facility_id\", None)\n         username = request.data.get(\"username\", None)\n         password = request.data.get(\"password\", None)\n+        full_name = request.data.get(\"full_name\", \"\")\n         baseurl = request.data.get(\"baseurl\", None)\n \n         api_url = reverse(\"kolibri:core:publicsignup-list\")\n@@ -52,6 +53,7 @@\n             \"facility_id\": facility_id,\n             \"username\": username,\n             \"password\": password,\n+            \"full_name\": full_name,\n         }\n \n         r = requests.post(url, data=payload)\n", "issue": "Learn-only device - The 'Full name' value entered in the setup wizard is missing\n## Observed behavior\r\nIf I create a new learner user through the 'LOD>Create a new user account for an existing facility' user flow then the 'Full name' value is missing from both the learner's profile page and the user details in Facility > Users\r\n\r\n![2023-09-01_15-24-40](https://github.com/learningequality/kolibri/assets/79847249/23ba6915-2ab3-45a4-a62b-4665115a8c9f)\r\n\r\n## Expected behavior\r\nThe 'Full name' value should be stored and displayed correctly as it is a required field.\r\n\r\n## Steps to reproduce the issue\r\n1. Install the latest [Beta 4 build](https://github.com/learningequality/kolibri/releases/tag/v0.16.0-beta4).\r\n2. On one VM create a Full facility\r\n3. On another VM go through the 'LOD>Create a new user account for an existing facility' user flow\r\n\r\n## More information\r\n\r\nhttps://github.com/learningequality/kolibri/assets/79847249/0a5e978b-ee99-481b-8ce3-d5c4d166eef2\r\n\r\n## Usage Details\r\nKolibri 0.16beta4\r\nWindows 10, Ubuntu - Chrome, Firefox\n", "before_files": [{"content": "import requests\nfrom django.urls import reverse\nfrom rest_framework import decorators\nfrom rest_framework.exceptions import NotFound\nfrom rest_framework.exceptions import PermissionDenied\nfrom rest_framework.exceptions import ValidationError\nfrom rest_framework.permissions import BasePermission\nfrom rest_framework.response import Response\nfrom rest_framework.viewsets import ViewSet\n\nfrom kolibri.core.auth.constants import user_kinds\nfrom kolibri.core.auth.models import Facility\nfrom kolibri.core.auth.models import FacilityUser\nfrom kolibri.core.auth.utils.users import get_remote_users_info\nfrom kolibri.core.device.models import DevicePermissions\n\n\n# Basic class that makes these endpoints unusable if device is provisioned\nclass HasPermissionDuringSetup(BasePermission):\n    def has_permission(self, request, view):\n        from kolibri.core.device.utils import device_provisioned\n\n        return not device_provisioned()\n\n\nclass HasPermissionDuringLODSetup(BasePermission):\n    def has_permission(self, request, view):\n        from kolibri.core.device.utils import get_device_setting\n\n        return get_device_setting(\"subset_of_users_device\")\n\n\nclass SetupWizardResource(ViewSet):\n    \"\"\"\n    Generic endpoints for use during various setup wizard onboarding flows\n    \"\"\"\n\n    permission_classes = (HasPermissionDuringSetup,)\n\n    @decorators.action(methods=[\"post\"], detail=False)\n    def createuseronremote(self, request):\n        facility_id = request.data.get(\"facility_id\", None)\n        username = request.data.get(\"username\", None)\n        password = request.data.get(\"password\", None)\n        baseurl = request.data.get(\"baseurl\", None)\n\n        api_url = reverse(\"kolibri:core:publicsignup-list\")\n\n        url = \"{}{}\".format(baseurl, api_url)\n\n        payload = {\n            \"facility_id\": facility_id,\n            \"username\": username,\n            \"password\": password,\n        }\n\n        r = requests.post(url, data=payload)\n        return Response({\"status\": r.status_code, \"data\": r.content})\n\n\nclass FacilityImportViewSet(ViewSet):\n    \"\"\"\n    A group of endpoints that are used by the SetupWizard to import a facility\n    and create a superuser\n    \"\"\"\n\n    permission_classes = (HasPermissionDuringSetup,)\n\n    @decorators.action(methods=[\"get\"], detail=False)\n    def facilityadmins(self, request):\n        # The filter is very loose, since we are assuming that the only\n        # users are from the new facility\n        queryset = FacilityUser.objects.filter(roles__kind__contains=\"admin\")\n        response_data = [\n            {\"full_name\": user.full_name, \"username\": user.username, \"id\": user.id}\n            for user in queryset\n        ]\n        return Response(response_data)\n\n    @decorators.action(methods=[\"post\"], detail=False)\n    def grantsuperuserpermissions(self, request):\n        \"\"\"\n        Given a user ID and credentials, create a superuser DevicePermissions record\n        \"\"\"\n        user_id = request.data.get(\"user_id\", \"\")\n        password = request.data.get(\"password\", \"\")\n\n        # Get the Facility User object\n        try:\n            facilityuser = FacilityUser.objects.get(id=user_id)\n        except (Exception, FacilityUser.DoesNotExist):\n            raise NotFound()\n\n        # Test for password and admin role\n        if (\n            not facilityuser.check_password(password)\n            or user_kinds.ADMIN not in facilityuser.session_data[\"kind\"]\n        ):\n            raise PermissionDenied()\n\n        # If it succeeds, create a DevicePermissions model for the user\n        DevicePermissions.objects.update_or_create(\n            user=facilityuser,\n            defaults={\"is_superuser\": True, \"can_manage_content\": True},\n        )\n\n        # Finally: return a simple 200 so UI can continue on\n        return Response({\"user_id\": user_id})\n\n    @decorators.action(methods=[\"post\"], detail=False)\n    def createsuperuser(self, request):\n        \"\"\"\n        Given a username, full name and password, create a superuser attached\n        to the facility that was imported (or create a facility with given facility_name)\n        \"\"\"\n        facility_name = request.data.get(\"facility_name\", None)\n\n        # Get the imported facility (assuming its the only one at this point)\n        if Facility.objects.count() == 0:\n            the_facility = Facility.objects.create(name=facility_name)\n        else:\n            the_facility = Facility.objects.get()\n            if facility_name:\n                the_facility.name = facility_name\n                the_facility.save()\n\n        try:\n            superuser = FacilityUser.objects.create_superuser(\n                request.data.get(\"username\"),\n                request.data.get(\"password\"),\n                facility=the_facility,\n                full_name=request.data.get(\"full_name\"),\n            )\n            return Response({\"username\": superuser.username})\n\n        except ValidationError:\n            raise ValidationError(detail=\"duplicate\", code=\"duplicate_username\")\n\n    @decorators.action(methods=[\"post\"], detail=False)\n    def listfacilitylearners(self, request):\n        \"\"\"\n        If the request is done by an admin user  it will return a list of the users of the\n        facility\n\n        :param baseurl: First part of the url of the server that's going to be requested\n        :param facility_id: Id of the facility to authenticate and get the list of users\n        :param username: Username of the user that's going to authenticate\n        :param password: Password of the user that's going to authenticate\n        :return: List of the learners of the facility.\n        \"\"\"\n        facility_id = request.data.get(\"facility_id\")\n        baseurl = request.data.get(\"baseurl\")\n        password = request.data.get(\"password\")\n        username = request.data.get(\"username\")\n        facility_info = get_remote_users_info(baseurl, facility_id, username, password)\n        user_info = facility_info[\"user\"]\n        roles = user_info[\"roles\"]\n        admin_roles = (user_kinds.ADMIN, user_kinds.SUPERUSER)\n        if not any(role in roles for role in admin_roles):\n            raise PermissionDenied()\n        students = [u for u in facility_info[\"users\"] if not u[\"roles\"]]\n        return Response({\"students\": students, \"admin\": facility_info[\"user\"]})\n", "path": "kolibri/plugins/setup_wizard/api.py"}], "after_files": [{"content": "import requests\nfrom django.urls import reverse\nfrom rest_framework import decorators\nfrom rest_framework.exceptions import NotFound\nfrom rest_framework.exceptions import PermissionDenied\nfrom rest_framework.exceptions import ValidationError\nfrom rest_framework.permissions import BasePermission\nfrom rest_framework.response import Response\nfrom rest_framework.viewsets import ViewSet\n\nfrom kolibri.core.auth.constants import user_kinds\nfrom kolibri.core.auth.models import Facility\nfrom kolibri.core.auth.models import FacilityUser\nfrom kolibri.core.auth.utils.users import get_remote_users_info\nfrom kolibri.core.device.models import DevicePermissions\n\n\n# Basic class that makes these endpoints unusable if device is provisioned\nclass HasPermissionDuringSetup(BasePermission):\n    def has_permission(self, request, view):\n        from kolibri.core.device.utils import device_provisioned\n\n        return not device_provisioned()\n\n\nclass HasPermissionDuringLODSetup(BasePermission):\n    def has_permission(self, request, view):\n        from kolibri.core.device.utils import get_device_setting\n\n        return get_device_setting(\"subset_of_users_device\")\n\n\nclass SetupWizardResource(ViewSet):\n    \"\"\"\n    Generic endpoints for use during various setup wizard onboarding flows\n    \"\"\"\n\n    permission_classes = (HasPermissionDuringSetup,)\n\n    @decorators.action(methods=[\"post\"], detail=False)\n    def createuseronremote(self, request):\n        facility_id = request.data.get(\"facility_id\", None)\n        username = request.data.get(\"username\", None)\n        password = request.data.get(\"password\", None)\n        full_name = request.data.get(\"full_name\", \"\")\n        baseurl = request.data.get(\"baseurl\", None)\n\n        api_url = reverse(\"kolibri:core:publicsignup-list\")\n\n        url = \"{}{}\".format(baseurl, api_url)\n\n        payload = {\n            \"facility_id\": facility_id,\n            \"username\": username,\n            \"password\": password,\n            \"full_name\": full_name,\n        }\n\n        r = requests.post(url, data=payload)\n        return Response({\"status\": r.status_code, \"data\": r.content})\n\n\nclass FacilityImportViewSet(ViewSet):\n    \"\"\"\n    A group of endpoints that are used by the SetupWizard to import a facility\n    and create a superuser\n    \"\"\"\n\n    permission_classes = (HasPermissionDuringSetup,)\n\n    @decorators.action(methods=[\"get\"], detail=False)\n    def facilityadmins(self, request):\n        # The filter is very loose, since we are assuming that the only\n        # users are from the new facility\n        queryset = FacilityUser.objects.filter(roles__kind__contains=\"admin\")\n        response_data = [\n            {\"full_name\": user.full_name, \"username\": user.username, \"id\": user.id}\n            for user in queryset\n        ]\n        return Response(response_data)\n\n    @decorators.action(methods=[\"post\"], detail=False)\n    def grantsuperuserpermissions(self, request):\n        \"\"\"\n        Given a user ID and credentials, create a superuser DevicePermissions record\n        \"\"\"\n        user_id = request.data.get(\"user_id\", \"\")\n        password = request.data.get(\"password\", \"\")\n\n        # Get the Facility User object\n        try:\n            facilityuser = FacilityUser.objects.get(id=user_id)\n        except (Exception, FacilityUser.DoesNotExist):\n            raise NotFound()\n\n        # Test for password and admin role\n        if (\n            not facilityuser.check_password(password)\n            or user_kinds.ADMIN not in facilityuser.session_data[\"kind\"]\n        ):\n            raise PermissionDenied()\n\n        # If it succeeds, create a DevicePermissions model for the user\n        DevicePermissions.objects.update_or_create(\n            user=facilityuser,\n            defaults={\"is_superuser\": True, \"can_manage_content\": True},\n        )\n\n        # Finally: return a simple 200 so UI can continue on\n        return Response({\"user_id\": user_id})\n\n    @decorators.action(methods=[\"post\"], detail=False)\n    def createsuperuser(self, request):\n        \"\"\"\n        Given a username, full name and password, create a superuser attached\n        to the facility that was imported (or create a facility with given facility_name)\n        \"\"\"\n        facility_name = request.data.get(\"facility_name\", None)\n\n        # Get the imported facility (assuming its the only one at this point)\n        if Facility.objects.count() == 0:\n            the_facility = Facility.objects.create(name=facility_name)\n        else:\n            the_facility = Facility.objects.get()\n            if facility_name:\n                the_facility.name = facility_name\n                the_facility.save()\n\n        try:\n            superuser = FacilityUser.objects.create_superuser(\n                request.data.get(\"username\"),\n                request.data.get(\"password\"),\n                facility=the_facility,\n                full_name=request.data.get(\"full_name\"),\n            )\n            return Response({\"username\": superuser.username})\n\n        except ValidationError:\n            raise ValidationError(detail=\"duplicate\", code=\"duplicate_username\")\n\n    @decorators.action(methods=[\"post\"], detail=False)\n    def listfacilitylearners(self, request):\n        \"\"\"\n        If the request is done by an admin user  it will return a list of the users of the\n        facility\n\n        :param baseurl: First part of the url of the server that's going to be requested\n        :param facility_id: Id of the facility to authenticate and get the list of users\n        :param username: Username of the user that's going to authenticate\n        :param password: Password of the user that's going to authenticate\n        :return: List of the learners of the facility.\n        \"\"\"\n        facility_id = request.data.get(\"facility_id\")\n        baseurl = request.data.get(\"baseurl\")\n        password = request.data.get(\"password\")\n        username = request.data.get(\"username\")\n        facility_info = get_remote_users_info(baseurl, facility_id, username, password)\n        user_info = facility_info[\"user\"]\n        roles = user_info[\"roles\"]\n        admin_roles = (user_kinds.ADMIN, user_kinds.SUPERUSER)\n        if not any(role in roles for role in admin_roles):\n            raise PermissionDenied()\n        students = [u for u in facility_info[\"users\"] if not u[\"roles\"]]\n        return Response({\"students\": students, \"admin\": facility_info[\"user\"]})\n", "path": "kolibri/plugins/setup_wizard/api.py"}]}