44from django .http import HttpResponse
55from django .urls import path
66from django .urls import register_converter
7+ from django .urls import reverse
78from django .utils .decorators import method_decorator
89from django .views import View
910from django .views .decorators .csrf import csrf_exempt
@@ -43,6 +44,13 @@ def scim_response(payload, status=HTTPStatus.OK):
4344 status = status ,
4445 content_type = "application/scim+json" ,
4546 )
47+
48+
49+ def resource_location (request , app_record ):
50+ """Return the canonical URL for a user record."""
51+ return request .build_absolute_uri (
52+ reverse ("scim_user" , kwargs = {"app_record" : app_record })
53+ )
4654# -- setup-end --
4755
4856
@@ -115,7 +123,7 @@ def get(self, request, app_record):
115123 if if_none_match and etag in [t .strip () for t in if_none_match .split ("," )]:
116124 return HttpResponse (status = HTTPStatus .NOT_MODIFIED )
117125
118- scim_user = to_scim_user (app_record )
126+ scim_user = to_scim_user (app_record , resource_location ( request , app_record ) )
119127 resp = scim_response (
120128 scim_user .model_dump_json (
121129 scim_ctx = Context .RESOURCE_QUERY_RESPONSE ,
@@ -139,7 +147,7 @@ def put(self, request, app_record):
139147 check_etag (app_record , request .META .get ("HTTP_IF_MATCH" ))
140148 except PreconditionFailed :
141149 return scim_precondition_error ()
142- existing_user = to_scim_user (app_record )
150+ existing_user = to_scim_user (app_record , resource_location ( request , app_record ) )
143151 try :
144152 replacement = User .model_validate (
145153 json .loads (request .body ),
@@ -156,7 +164,7 @@ def put(self, request, app_record):
156164 except ValueError as error :
157165 return scim_uniqueness_error (error )
158166
159- response_user = to_scim_user (updated_record )
167+ response_user = to_scim_user (updated_record , resource_location ( request , updated_record ) )
160168 resp = scim_response (
161169 response_user .model_dump_json (
162170 scim_ctx = Context .RESOURCE_REPLACEMENT_RESPONSE
@@ -178,7 +186,7 @@ def patch(self, request, app_record):
178186 except ValidationError as error :
179187 return scim_validation_error (error )
180188
181- scim_user = to_scim_user (app_record )
189+ scim_user = to_scim_user (app_record , resource_location ( request , app_record ) )
182190 patch .patch (scim_user )
183191
184192 updated_record = from_scim_user (scim_user )
@@ -207,7 +215,7 @@ def get(self, request):
207215 return scim_validation_error (error )
208216
209217 total , page = list_records (req .start_index_0 , req .stop_index_0 )
210- resources = [to_scim_user (record ) for record in page ]
218+ resources = [to_scim_user (record , resource_location ( request , record ) ) for record in page ]
211219 response = ListResponse [User ](
212220 total_results = total ,
213221 start_index = req .start_index or 1 ,
@@ -237,7 +245,7 @@ def post(self, request):
237245 except ValueError as error :
238246 return scim_uniqueness_error (error )
239247
240- response_user = to_scim_user (app_record )
248+ response_user = to_scim_user (app_record , resource_location ( request , app_record ) )
241249 resp = scim_response (
242250 response_user .model_dump_json (scim_ctx = Context .RESOURCE_CREATION_RESPONSE ),
243251 HTTPStatus .CREATED ,
0 commit comments