@djangocfg/api 2.1.360 → 2.1.361

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,1811 @@
1
+ {
2
+ "openapi": "3.1.0",
3
+ "info": {
4
+ "title": "Django CFG API",
5
+ "version": "1.0.0",
6
+ "description": "RESTful API with modern architecture"
7
+ },
8
+ "paths": {
9
+ "/cfg/accounts/api-key/": {
10
+ "get": {
11
+ "operationId": "cfg_accounts_api_key_retrieve",
12
+ "description": "Retrieve the current user's API key (masked) and metadata.",
13
+ "summary": "Get API key details",
14
+ "tags": [
15
+ "cfg_accounts_api_key"
16
+ ],
17
+ "security": [
18
+ {
19
+ "jwtAuth": []
20
+ },
21
+ {
22
+ "cookieAuth": []
23
+ }
24
+ ],
25
+ "responses": {
26
+ "200": {
27
+ "content": {
28
+ "application/json": {
29
+ "schema": {
30
+ "$ref": "#/components/schemas/APIKey"
31
+ }
32
+ }
33
+ },
34
+ "description": ""
35
+ },
36
+ "401": {
37
+ "content": {
38
+ "application/json": {
39
+ "schema": {
40
+ "description": "Authentication credentials were not provided."
41
+ }
42
+ }
43
+ },
44
+ "description": ""
45
+ }
46
+ },
47
+ "x-async-capable": false
48
+ }
49
+ },
50
+ "/cfg/accounts/api-key/regenerate/": {
51
+ "post": {
52
+ "operationId": "cfg_accounts_api_key_regenerate_create",
53
+ "description": "Generate a new API key. The full key is returned only once.",
54
+ "summary": "Regenerate API key",
55
+ "tags": [
56
+ "cfg_accounts_api_key"
57
+ ],
58
+ "requestBody": {
59
+ "content": {
60
+ "application/json": {
61
+ "schema": {
62
+ "$ref": "#/components/schemas/APIKeyRequest"
63
+ }
64
+ }
65
+ },
66
+ "required": true
67
+ },
68
+ "security": [
69
+ {
70
+ "jwtAuth": []
71
+ },
72
+ {
73
+ "cookieAuth": []
74
+ }
75
+ ],
76
+ "responses": {
77
+ "200": {
78
+ "content": {
79
+ "application/json": {
80
+ "schema": {
81
+ "$ref": "#/components/schemas/APIKeyRegenerate"
82
+ },
83
+ "examples": {
84
+ "RegenerateResponse": {
85
+ "value": {
86
+ "key": "d0b45e78-1234-5678-9abc-def012345678",
87
+ "reissued_at": "2024-01-15T10:30:00Z"
88
+ },
89
+ "summary": "Regenerate Response"
90
+ }
91
+ }
92
+ }
93
+ },
94
+ "description": ""
95
+ },
96
+ "401": {
97
+ "content": {
98
+ "application/json": {
99
+ "schema": {
100
+ "description": "Authentication credentials were not provided."
101
+ }
102
+ }
103
+ },
104
+ "description": ""
105
+ }
106
+ },
107
+ "x-async-capable": false
108
+ }
109
+ },
110
+ "/cfg/accounts/api-key/test/": {
111
+ "post": {
112
+ "operationId": "cfg_accounts_api_key_test_create",
113
+ "description": "Test whether an API key is valid without consuming it.",
114
+ "summary": "Test API key",
115
+ "tags": [
116
+ "cfg_accounts_api_key"
117
+ ],
118
+ "requestBody": {
119
+ "content": {
120
+ "application/json": {
121
+ "schema": {
122
+ "$ref": "#/components/schemas/APIKeyTestRequest"
123
+ }
124
+ }
125
+ },
126
+ "required": true
127
+ },
128
+ "security": [
129
+ {
130
+ "jwtAuth": []
131
+ },
132
+ {
133
+ "cookieAuth": []
134
+ }
135
+ ],
136
+ "responses": {
137
+ "200": {
138
+ "content": {
139
+ "application/json": {
140
+ "schema": {
141
+ "$ref": "#/components/schemas/APIKeyTestResult"
142
+ },
143
+ "examples": {
144
+ "ValidKey": {
145
+ "value": {
146
+ "valid": true,
147
+ "user_id": "42"
148
+ },
149
+ "summary": "Valid Key"
150
+ },
151
+ "InvalidKey": {
152
+ "value": {
153
+ "valid": false,
154
+ "user_id": null
155
+ },
156
+ "summary": "Invalid Key"
157
+ }
158
+ }
159
+ }
160
+ },
161
+ "description": ""
162
+ }
163
+ },
164
+ "x-async-capable": false
165
+ }
166
+ },
167
+ "/cfg/accounts/oauth/connections/": {
168
+ "get": {
169
+ "operationId": "cfg_accounts_oauth_connections_list",
170
+ "description": "Get all OAuth connections for the current user.",
171
+ "summary": "List OAuth connections",
172
+ "tags": [
173
+ "cfg_accounts_oauth"
174
+ ],
175
+ "security": [
176
+ {
177
+ "apiKeyAuth": []
178
+ },
179
+ {
180
+ "jwtAuthWithLastLogin": []
181
+ }
182
+ ],
183
+ "responses": {
184
+ "200": {
185
+ "content": {
186
+ "application/json": {
187
+ "schema": {
188
+ "type": "array",
189
+ "items": {
190
+ "$ref": "#/components/schemas/OAuthConnection"
191
+ }
192
+ }
193
+ }
194
+ },
195
+ "description": ""
196
+ }
197
+ },
198
+ "x-async-capable": false
199
+ }
200
+ },
201
+ "/cfg/accounts/oauth/disconnect/": {
202
+ "post": {
203
+ "operationId": "cfg_accounts_oauth_disconnect_create",
204
+ "description": "Remove OAuth connection for the specified provider.",
205
+ "summary": "Disconnect OAuth provider",
206
+ "tags": [
207
+ "cfg_accounts_oauth"
208
+ ],
209
+ "requestBody": {
210
+ "content": {
211
+ "application/json": {
212
+ "schema": {
213
+ "$ref": "#/components/schemas/OAuthDisconnectRequestRequest"
214
+ }
215
+ }
216
+ },
217
+ "required": true
218
+ },
219
+ "security": [
220
+ {
221
+ "apiKeyAuth": []
222
+ },
223
+ {
224
+ "jwtAuthWithLastLogin": []
225
+ }
226
+ ],
227
+ "responses": {
228
+ "200": {
229
+ "content": {
230
+ "application/json": {
231
+ "schema": {
232
+ "type": "object",
233
+ "properties": {
234
+ "message": {
235
+ "type": "string"
236
+ }
237
+ }
238
+ }
239
+ }
240
+ },
241
+ "description": ""
242
+ },
243
+ "400": {
244
+ "content": {
245
+ "application/json": {
246
+ "schema": {
247
+ "$ref": "#/components/schemas/OAuthError"
248
+ }
249
+ }
250
+ },
251
+ "description": ""
252
+ },
253
+ "404": {
254
+ "content": {
255
+ "application/json": {
256
+ "schema": {
257
+ "$ref": "#/components/schemas/OAuthError"
258
+ }
259
+ }
260
+ },
261
+ "description": ""
262
+ }
263
+ },
264
+ "x-async-capable": false
265
+ }
266
+ },
267
+ "/cfg/accounts/oauth/github/authorize/": {
268
+ "post": {
269
+ "operationId": "cfg_accounts_oauth_github_authorize_create",
270
+ "description": "Generate GitHub OAuth authorization URL. Redirect user to this URL to start authentication.",
271
+ "summary": "Start GitHub OAuth",
272
+ "tags": [
273
+ "cfg_accounts_oauth"
274
+ ],
275
+ "requestBody": {
276
+ "content": {
277
+ "application/json": {
278
+ "schema": {
279
+ "$ref": "#/components/schemas/OAuthAuthorizeRequestRequest"
280
+ }
281
+ }
282
+ }
283
+ },
284
+ "security": [
285
+ {}
286
+ ],
287
+ "responses": {
288
+ "200": {
289
+ "content": {
290
+ "application/json": {
291
+ "schema": {
292
+ "$ref": "#/components/schemas/OAuthAuthorizeResponse"
293
+ }
294
+ }
295
+ },
296
+ "description": ""
297
+ },
298
+ "503": {
299
+ "content": {
300
+ "application/json": {
301
+ "schema": {
302
+ "$ref": "#/components/schemas/OAuthError"
303
+ }
304
+ }
305
+ },
306
+ "description": ""
307
+ }
308
+ },
309
+ "x-async-capable": false
310
+ }
311
+ },
312
+ "/cfg/accounts/oauth/github/callback/": {
313
+ "post": {
314
+ "operationId": "cfg_accounts_oauth_github_callback_create",
315
+ "description": "Exchange authorization code for JWT tokens. Call this after GitHub redirects back with code.",
316
+ "summary": "Complete GitHub OAuth",
317
+ "tags": [
318
+ "cfg_accounts_oauth"
319
+ ],
320
+ "requestBody": {
321
+ "content": {
322
+ "application/json": {
323
+ "schema": {
324
+ "$ref": "#/components/schemas/OAuthCallbackRequestRequest"
325
+ }
326
+ }
327
+ },
328
+ "required": true
329
+ },
330
+ "security": [
331
+ {}
332
+ ],
333
+ "responses": {
334
+ "200": {
335
+ "content": {
336
+ "application/json": {
337
+ "schema": {
338
+ "$ref": "#/components/schemas/OAuthTokenResponse"
339
+ }
340
+ }
341
+ },
342
+ "description": ""
343
+ },
344
+ "400": {
345
+ "content": {
346
+ "application/json": {
347
+ "schema": {
348
+ "$ref": "#/components/schemas/OAuthError"
349
+ }
350
+ }
351
+ },
352
+ "description": ""
353
+ }
354
+ },
355
+ "x-async-capable": false
356
+ }
357
+ },
358
+ "/cfg/accounts/oauth/providers/": {
359
+ "get": {
360
+ "operationId": "cfg_accounts_oauth_providers_retrieve",
361
+ "description": "Get list of available OAuth providers for authentication.",
362
+ "summary": "List OAuth providers",
363
+ "tags": [
364
+ "cfg_accounts_oauth"
365
+ ],
366
+ "security": [
367
+ {}
368
+ ],
369
+ "responses": {
370
+ "200": {
371
+ "content": {
372
+ "application/json": {
373
+ "schema": {
374
+ "$ref": "#/components/schemas/OAuthProvidersResponse"
375
+ }
376
+ }
377
+ },
378
+ "description": ""
379
+ }
380
+ },
381
+ "x-async-capable": false
382
+ }
383
+ },
384
+ "/cfg/accounts/otp/request/": {
385
+ "post": {
386
+ "operationId": "cfg_accounts_otp_request_create",
387
+ "description": "Request OTP code to email.",
388
+ "tags": [
389
+ "cfg_accounts"
390
+ ],
391
+ "requestBody": {
392
+ "content": {
393
+ "application/json": {
394
+ "schema": {
395
+ "$ref": "#/components/schemas/OTPRequestRequest"
396
+ }
397
+ }
398
+ },
399
+ "required": true
400
+ },
401
+ "security": [
402
+ {
403
+ "apiKeyAuth": []
404
+ },
405
+ {
406
+ "jwtAuthWithLastLogin": []
407
+ },
408
+ {}
409
+ ],
410
+ "responses": {
411
+ "200": {
412
+ "content": {
413
+ "application/json": {
414
+ "schema": {
415
+ "$ref": "#/components/schemas/OTPRequestResponse"
416
+ }
417
+ }
418
+ },
419
+ "description": ""
420
+ },
421
+ "400": {
422
+ "content": {
423
+ "application/json": {
424
+ "schema": {
425
+ "$ref": "#/components/schemas/OTPErrorResponse"
426
+ }
427
+ }
428
+ },
429
+ "description": ""
430
+ },
431
+ "429": {
432
+ "content": {
433
+ "application/json": {
434
+ "schema": {
435
+ "$ref": "#/components/schemas/OTPErrorResponse"
436
+ }
437
+ }
438
+ },
439
+ "description": ""
440
+ },
441
+ "500": {
442
+ "content": {
443
+ "application/json": {
444
+ "schema": {
445
+ "$ref": "#/components/schemas/OTPErrorResponse"
446
+ }
447
+ }
448
+ },
449
+ "description": ""
450
+ }
451
+ },
452
+ "x-async-capable": false
453
+ }
454
+ },
455
+ "/cfg/accounts/otp/verify/": {
456
+ "post": {
457
+ "operationId": "cfg_accounts_otp_verify_create",
458
+ "description": "Verify OTP code and return JWT tokens or 2FA session.\n\nIf user has 2FA enabled:\n- Returns requires_2fa=True with session_id\n- Client must complete 2FA verification at /cfg/totp/verify/\n\nIf user has no 2FA:\n- Returns JWT tokens and user data directly",
459
+ "tags": [
460
+ "cfg_accounts"
461
+ ],
462
+ "requestBody": {
463
+ "content": {
464
+ "application/json": {
465
+ "schema": {
466
+ "$ref": "#/components/schemas/OTPVerifyRequest"
467
+ }
468
+ }
469
+ },
470
+ "required": true
471
+ },
472
+ "security": [
473
+ {
474
+ "apiKeyAuth": []
475
+ },
476
+ {
477
+ "jwtAuthWithLastLogin": []
478
+ },
479
+ {}
480
+ ],
481
+ "responses": {
482
+ "200": {
483
+ "content": {
484
+ "application/json": {
485
+ "schema": {
486
+ "$ref": "#/components/schemas/OTPVerifyResponse"
487
+ }
488
+ }
489
+ },
490
+ "description": ""
491
+ },
492
+ "401": {
493
+ "content": {
494
+ "application/json": {
495
+ "schema": {
496
+ "$ref": "#/components/schemas/OTPErrorResponse"
497
+ }
498
+ }
499
+ },
500
+ "description": ""
501
+ },
502
+ "429": {
503
+ "content": {
504
+ "application/json": {
505
+ "schema": {
506
+ "$ref": "#/components/schemas/OTPErrorResponse"
507
+ }
508
+ }
509
+ },
510
+ "description": ""
511
+ }
512
+ },
513
+ "x-async-capable": false
514
+ }
515
+ },
516
+ "/cfg/accounts/profile/": {
517
+ "get": {
518
+ "operationId": "cfg_accounts_profile_retrieve",
519
+ "description": "Retrieve the current authenticated user's profile information.",
520
+ "summary": "Get current user profile",
521
+ "tags": [
522
+ "cfg_accounts_profile"
523
+ ],
524
+ "security": [
525
+ {
526
+ "jwtAuth": []
527
+ },
528
+ {
529
+ "cookieAuth": []
530
+ }
531
+ ],
532
+ "responses": {
533
+ "200": {
534
+ "content": {
535
+ "application/json": {
536
+ "schema": {
537
+ "$ref": "#/components/schemas/User"
538
+ }
539
+ }
540
+ },
541
+ "description": ""
542
+ },
543
+ "401": {
544
+ "content": {
545
+ "application/json": {
546
+ "schema": {
547
+ "description": "Authentication credentials were not provided."
548
+ }
549
+ }
550
+ },
551
+ "description": ""
552
+ }
553
+ },
554
+ "x-async-capable": false
555
+ }
556
+ },
557
+ "/cfg/accounts/profile/avatar/": {
558
+ "post": {
559
+ "operationId": "cfg_accounts_profile_avatar_create",
560
+ "description": "Upload avatar image for the current authenticated user. Accepts multipart/form-data with 'avatar' field.",
561
+ "summary": "Upload user avatar",
562
+ "tags": [
563
+ "cfg_accounts_profile"
564
+ ],
565
+ "requestBody": {
566
+ "content": {
567
+ "multipart/form-data": {
568
+ "schema": {
569
+ "type": "object",
570
+ "properties": {
571
+ "avatar": {
572
+ "type": "string",
573
+ "format": "binary",
574
+ "description": "Avatar image file (JPEG, PNG, GIF, WebP, max 5MB)"
575
+ }
576
+ },
577
+ "required": [
578
+ "avatar"
579
+ ]
580
+ }
581
+ }
582
+ }
583
+ },
584
+ "security": [
585
+ {
586
+ "apiKeyAuth": []
587
+ },
588
+ {
589
+ "jwtAuthWithLastLogin": []
590
+ }
591
+ ],
592
+ "responses": {
593
+ "200": {
594
+ "content": {
595
+ "application/json": {
596
+ "schema": {
597
+ "$ref": "#/components/schemas/User"
598
+ }
599
+ }
600
+ },
601
+ "description": ""
602
+ },
603
+ "400": {
604
+ "content": {
605
+ "application/json": {
606
+ "schema": {
607
+ "description": "Invalid file or validation error."
608
+ }
609
+ }
610
+ },
611
+ "description": ""
612
+ },
613
+ "401": {
614
+ "content": {
615
+ "application/json": {
616
+ "schema": {
617
+ "description": "Authentication credentials were not provided."
618
+ }
619
+ }
620
+ },
621
+ "description": ""
622
+ }
623
+ },
624
+ "x-async-capable": false
625
+ }
626
+ },
627
+ "/cfg/accounts/profile/delete/": {
628
+ "post": {
629
+ "operationId": "cfg_accounts_profile_delete_create",
630
+ "description": "\n Permanently delete the current user's account.\n\n This operation:\n - Deactivates the account (user cannot log in)\n - Anonymizes personal data (GDPR compliance)\n - Frees up the email address for re-registration\n - Preserves audit trail\n\n The account can be restored by an administrator if needed.\n ",
631
+ "summary": "Delete user account",
632
+ "tags": [
633
+ "cfg_accounts_profile"
634
+ ],
635
+ "security": [
636
+ {
637
+ "jwtAuth": []
638
+ },
639
+ {
640
+ "cookieAuth": []
641
+ }
642
+ ],
643
+ "responses": {
644
+ "200": {
645
+ "content": {
646
+ "application/json": {
647
+ "schema": {
648
+ "$ref": "#/components/schemas/AccountDeleteResponse"
649
+ }
650
+ }
651
+ },
652
+ "description": ""
653
+ },
654
+ "401": {
655
+ "content": {
656
+ "application/json": {
657
+ "schema": {
658
+ "description": "Authentication credentials were not provided."
659
+ }
660
+ }
661
+ },
662
+ "description": ""
663
+ },
664
+ "400": {
665
+ "content": {
666
+ "application/json": {
667
+ "schema": {
668
+ "description": "Account is already deleted."
669
+ }
670
+ }
671
+ },
672
+ "description": ""
673
+ }
674
+ },
675
+ "x-async-capable": false
676
+ }
677
+ },
678
+ "/cfg/accounts/profile/partial/": {
679
+ "put": {
680
+ "operationId": "cfg_accounts_profile_partial_update",
681
+ "description": "Partially update the current authenticated user's profile information. Supports avatar upload.",
682
+ "summary": "Partial update user profile",
683
+ "tags": [
684
+ "cfg_accounts_profile"
685
+ ],
686
+ "requestBody": {
687
+ "content": {
688
+ "application/json": {
689
+ "schema": {
690
+ "$ref": "#/components/schemas/CfgUserUpdateRequest"
691
+ },
692
+ "examples": {
693
+ "ProfileUpdateWithAvatar": {
694
+ "value": {
695
+ "first_name": "John",
696
+ "last_name": "Doe",
697
+ "company": "Tech Corp",
698
+ "phone": "+1 (555) 123-4567",
699
+ "position": "Software Engineer"
700
+ },
701
+ "summary": "Profile Update with Avatar"
702
+ }
703
+ }
704
+ }
705
+ }
706
+ },
707
+ "security": [
708
+ {
709
+ "jwtAuth": []
710
+ },
711
+ {
712
+ "cookieAuth": []
713
+ }
714
+ ],
715
+ "responses": {
716
+ "200": {
717
+ "content": {
718
+ "application/json": {
719
+ "schema": {
720
+ "$ref": "#/components/schemas/User"
721
+ }
722
+ }
723
+ },
724
+ "description": ""
725
+ },
726
+ "400": {
727
+ "content": {
728
+ "application/json": {
729
+ "schema": {
730
+ "description": "Invalid data provided."
731
+ }
732
+ }
733
+ },
734
+ "description": ""
735
+ },
736
+ "401": {
737
+ "content": {
738
+ "application/json": {
739
+ "schema": {
740
+ "description": "Authentication credentials were not provided."
741
+ }
742
+ }
743
+ },
744
+ "description": ""
745
+ }
746
+ },
747
+ "x-async-capable": false
748
+ },
749
+ "patch": {
750
+ "operationId": "cfg_accounts_profile_partial_partial_update",
751
+ "description": "Partially update the current authenticated user's profile information. Supports avatar upload.",
752
+ "summary": "Partial update user profile",
753
+ "tags": [
754
+ "cfg_accounts_profile"
755
+ ],
756
+ "requestBody": {
757
+ "content": {
758
+ "application/json": {
759
+ "schema": {
760
+ "$ref": "#/components/schemas/PatchedCfgUserUpdateRequest"
761
+ },
762
+ "examples": {
763
+ "ProfileUpdateWithAvatar": {
764
+ "value": {
765
+ "first_name": "John",
766
+ "last_name": "Doe",
767
+ "company": "Tech Corp",
768
+ "phone": "+1 (555) 123-4567",
769
+ "position": "Software Engineer"
770
+ },
771
+ "summary": "Profile Update with Avatar"
772
+ }
773
+ }
774
+ }
775
+ }
776
+ },
777
+ "security": [
778
+ {
779
+ "jwtAuth": []
780
+ },
781
+ {
782
+ "cookieAuth": []
783
+ }
784
+ ],
785
+ "responses": {
786
+ "200": {
787
+ "content": {
788
+ "application/json": {
789
+ "schema": {
790
+ "$ref": "#/components/schemas/User"
791
+ }
792
+ }
793
+ },
794
+ "description": ""
795
+ },
796
+ "400": {
797
+ "content": {
798
+ "application/json": {
799
+ "schema": {
800
+ "description": "Invalid data provided."
801
+ }
802
+ }
803
+ },
804
+ "description": ""
805
+ },
806
+ "401": {
807
+ "content": {
808
+ "application/json": {
809
+ "schema": {
810
+ "description": "Authentication credentials were not provided."
811
+ }
812
+ }
813
+ },
814
+ "description": ""
815
+ }
816
+ },
817
+ "x-async-capable": false
818
+ }
819
+ },
820
+ "/cfg/accounts/profile/update/": {
821
+ "put": {
822
+ "operationId": "cfg_accounts_profile_update_update",
823
+ "description": "Update the current authenticated user's profile information.",
824
+ "summary": "Update user profile",
825
+ "tags": [
826
+ "cfg_accounts_profile"
827
+ ],
828
+ "requestBody": {
829
+ "content": {
830
+ "application/json": {
831
+ "schema": {
832
+ "$ref": "#/components/schemas/CfgUserUpdateRequest"
833
+ },
834
+ "examples": {
835
+ "ValidProfileUpdate": {
836
+ "value": {
837
+ "first_name": "John",
838
+ "last_name": "Doe",
839
+ "company": "Tech Corp",
840
+ "phone": "+1 (555) 123-4567",
841
+ "position": "Software Engineer"
842
+ },
843
+ "summary": "Valid Profile Update"
844
+ }
845
+ }
846
+ }
847
+ }
848
+ },
849
+ "security": [
850
+ {
851
+ "jwtAuth": []
852
+ },
853
+ {
854
+ "cookieAuth": []
855
+ }
856
+ ],
857
+ "responses": {
858
+ "200": {
859
+ "content": {
860
+ "application/json": {
861
+ "schema": {
862
+ "$ref": "#/components/schemas/User"
863
+ }
864
+ }
865
+ },
866
+ "description": ""
867
+ },
868
+ "400": {
869
+ "content": {
870
+ "application/json": {
871
+ "schema": {
872
+ "description": "Invalid data provided."
873
+ }
874
+ }
875
+ },
876
+ "description": ""
877
+ },
878
+ "401": {
879
+ "content": {
880
+ "application/json": {
881
+ "schema": {
882
+ "description": "Authentication credentials were not provided."
883
+ }
884
+ }
885
+ },
886
+ "description": ""
887
+ }
888
+ },
889
+ "x-async-capable": false
890
+ },
891
+ "patch": {
892
+ "operationId": "cfg_accounts_profile_update_partial_update",
893
+ "description": "Update the current authenticated user's profile information.",
894
+ "summary": "Update user profile",
895
+ "tags": [
896
+ "cfg_accounts_profile"
897
+ ],
898
+ "requestBody": {
899
+ "content": {
900
+ "application/json": {
901
+ "schema": {
902
+ "$ref": "#/components/schemas/PatchedCfgUserUpdateRequest"
903
+ },
904
+ "examples": {
905
+ "ValidProfileUpdate": {
906
+ "value": {
907
+ "first_name": "John",
908
+ "last_name": "Doe",
909
+ "company": "Tech Corp",
910
+ "phone": "+1 (555) 123-4567",
911
+ "position": "Software Engineer"
912
+ },
913
+ "summary": "Valid Profile Update"
914
+ }
915
+ }
916
+ }
917
+ }
918
+ },
919
+ "security": [
920
+ {
921
+ "jwtAuth": []
922
+ },
923
+ {
924
+ "cookieAuth": []
925
+ }
926
+ ],
927
+ "responses": {
928
+ "200": {
929
+ "content": {
930
+ "application/json": {
931
+ "schema": {
932
+ "$ref": "#/components/schemas/User"
933
+ }
934
+ }
935
+ },
936
+ "description": ""
937
+ },
938
+ "400": {
939
+ "content": {
940
+ "application/json": {
941
+ "schema": {
942
+ "description": "Invalid data provided."
943
+ }
944
+ }
945
+ },
946
+ "description": ""
947
+ },
948
+ "401": {
949
+ "content": {
950
+ "application/json": {
951
+ "schema": {
952
+ "description": "Authentication credentials were not provided."
953
+ }
954
+ }
955
+ },
956
+ "description": ""
957
+ }
958
+ },
959
+ "x-async-capable": false
960
+ }
961
+ },
962
+ "/cfg/accounts/token/refresh/": {
963
+ "post": {
964
+ "operationId": "cfg_accounts_token_refresh_create",
965
+ "description": "Refresh JWT token.",
966
+ "tags": [
967
+ "cfg_accounts_auth"
968
+ ],
969
+ "requestBody": {
970
+ "content": {
971
+ "application/json": {
972
+ "schema": {
973
+ "$ref": "#/components/schemas/TokenRefreshRequest"
974
+ }
975
+ }
976
+ },
977
+ "required": true
978
+ },
979
+ "responses": {
980
+ "200": {
981
+ "content": {
982
+ "application/json": {
983
+ "schema": {
984
+ "$ref": "#/components/schemas/TokenRefresh"
985
+ }
986
+ }
987
+ },
988
+ "description": ""
989
+ }
990
+ },
991
+ "x-async-capable": false
992
+ }
993
+ }
994
+ },
995
+ "components": {
996
+ "schemas": {
997
+ "APIKey": {
998
+ "type": "object",
999
+ "description": "Serializer for API key response (masked).",
1000
+ "properties": {
1001
+ "key": {
1002
+ "type": "string",
1003
+ "description": "Masked API key"
1004
+ },
1005
+ "reissued_at": {
1006
+ "type": [
1007
+ "string",
1008
+ "null"
1009
+ ],
1010
+ "format": "date-time",
1011
+ "description": "When the key was last regenerated"
1012
+ },
1013
+ "created_at": {
1014
+ "type": "string",
1015
+ "format": "date-time",
1016
+ "description": "When the key was created"
1017
+ }
1018
+ },
1019
+ "required": [
1020
+ "created_at",
1021
+ "key",
1022
+ "reissued_at"
1023
+ ]
1024
+ },
1025
+ "APIKeyRegenerate": {
1026
+ "type": "object",
1027
+ "description": "Serializer for API key regeneration response (full key shown once).",
1028
+ "properties": {
1029
+ "key": {
1030
+ "type": "string",
1031
+ "description": "New API key (shown only once)"
1032
+ },
1033
+ "reissued_at": {
1034
+ "type": "string",
1035
+ "format": "date-time",
1036
+ "description": "When the key was regenerated"
1037
+ }
1038
+ },
1039
+ "required": [
1040
+ "key",
1041
+ "reissued_at"
1042
+ ]
1043
+ },
1044
+ "APIKeyRequest": {
1045
+ "type": "object",
1046
+ "description": "Serializer for API key response (masked).",
1047
+ "properties": {
1048
+ "key": {
1049
+ "type": "string",
1050
+ "minLength": 1,
1051
+ "description": "Masked API key"
1052
+ },
1053
+ "reissued_at": {
1054
+ "type": [
1055
+ "string",
1056
+ "null"
1057
+ ],
1058
+ "format": "date-time",
1059
+ "description": "When the key was last regenerated"
1060
+ },
1061
+ "created_at": {
1062
+ "type": "string",
1063
+ "format": "date-time",
1064
+ "description": "When the key was created"
1065
+ }
1066
+ },
1067
+ "required": [
1068
+ "created_at",
1069
+ "key",
1070
+ "reissued_at"
1071
+ ]
1072
+ },
1073
+ "APIKeyTestRequest": {
1074
+ "type": "object",
1075
+ "description": "Serializer for testing an API key.",
1076
+ "properties": {
1077
+ "key": {
1078
+ "type": "string",
1079
+ "minLength": 1,
1080
+ "description": "API key to test"
1081
+ }
1082
+ },
1083
+ "required": [
1084
+ "key"
1085
+ ]
1086
+ },
1087
+ "APIKeyTestResult": {
1088
+ "type": "object",
1089
+ "description": "Serializer for API key test result.",
1090
+ "properties": {
1091
+ "valid": {
1092
+ "type": "boolean",
1093
+ "description": "Whether the key is valid"
1094
+ },
1095
+ "user_id": {
1096
+ "type": [
1097
+ "string",
1098
+ "null"
1099
+ ],
1100
+ "description": "User ID if valid, null otherwise"
1101
+ }
1102
+ },
1103
+ "required": [
1104
+ "user_id",
1105
+ "valid"
1106
+ ]
1107
+ },
1108
+ "AccountDeleteResponse": {
1109
+ "type": "object",
1110
+ "description": "Response serializer for account deletion.",
1111
+ "properties": {
1112
+ "success": {
1113
+ "type": "boolean",
1114
+ "description": "Whether the account was successfully deleted"
1115
+ },
1116
+ "message": {
1117
+ "type": "string",
1118
+ "description": "Human-readable message about the deletion"
1119
+ }
1120
+ },
1121
+ "required": [
1122
+ "message",
1123
+ "success"
1124
+ ]
1125
+ },
1126
+ "CentrifugoToken": {
1127
+ "type": "object",
1128
+ "description": "Nested serializer for Centrifugo WebSocket connection token.",
1129
+ "properties": {
1130
+ "token": {
1131
+ "type": "string",
1132
+ "description": "JWT token for Centrifugo WebSocket connection"
1133
+ },
1134
+ "centrifugo_url": {
1135
+ "type": "string",
1136
+ "format": "uri",
1137
+ "description": "Centrifugo WebSocket URL"
1138
+ },
1139
+ "expires_at": {
1140
+ "type": "string",
1141
+ "format": "date-time",
1142
+ "description": "Token expiration time (ISO 8601)"
1143
+ },
1144
+ "channels": {
1145
+ "type": "array",
1146
+ "items": {
1147
+ "type": "string"
1148
+ },
1149
+ "description": "List of allowed channels for this user"
1150
+ }
1151
+ },
1152
+ "required": [
1153
+ "centrifugo_url",
1154
+ "channels",
1155
+ "expires_at",
1156
+ "token"
1157
+ ]
1158
+ },
1159
+ "CfgUserUpdateRequest": {
1160
+ "type": "object",
1161
+ "description": "Serializer for updating user profile.",
1162
+ "properties": {
1163
+ "first_name": {
1164
+ "type": "string",
1165
+ "maxLength": 50
1166
+ },
1167
+ "last_name": {
1168
+ "type": "string",
1169
+ "maxLength": 50
1170
+ },
1171
+ "company": {
1172
+ "type": "string",
1173
+ "maxLength": 100
1174
+ },
1175
+ "phone": {
1176
+ "type": "string",
1177
+ "maxLength": 20
1178
+ },
1179
+ "position": {
1180
+ "type": "string",
1181
+ "maxLength": 100
1182
+ },
1183
+ "language": {
1184
+ "type": "string",
1185
+ "maxLength": 10
1186
+ },
1187
+ "timezone": {
1188
+ "type": "string",
1189
+ "description": "IANA timezone name (e.g. 'Asia/Seoul'). Auto-detected from browser via X-Timezone header.",
1190
+ "maxLength": 64
1191
+ }
1192
+ }
1193
+ },
1194
+ "OAuthAuthorizeRequestRequest": {
1195
+ "type": "object",
1196
+ "description": "Request to start OAuth flow.",
1197
+ "properties": {
1198
+ "redirect_uri": {
1199
+ "type": "string",
1200
+ "format": "uri",
1201
+ "description": "URL to redirect after OAuth authorization. If not provided, uses config's site_url + callback_path"
1202
+ },
1203
+ "source_url": {
1204
+ "type": "string",
1205
+ "format": "uri",
1206
+ "description": "Optional source URL for registration tracking"
1207
+ }
1208
+ }
1209
+ },
1210
+ "OAuthAuthorizeResponse": {
1211
+ "type": "object",
1212
+ "description": "Response with OAuth authorization URL.",
1213
+ "properties": {
1214
+ "authorization_url": {
1215
+ "type": "string",
1216
+ "format": "uri",
1217
+ "description": "Full URL to redirect user to OAuth provider"
1218
+ },
1219
+ "state": {
1220
+ "type": "string",
1221
+ "description": "State token for CSRF protection. Store this and verify on callback."
1222
+ }
1223
+ },
1224
+ "required": [
1225
+ "authorization_url",
1226
+ "state"
1227
+ ]
1228
+ },
1229
+ "OAuthCallbackRequestRequest": {
1230
+ "type": "object",
1231
+ "description": "Request to complete OAuth flow (callback handler).",
1232
+ "properties": {
1233
+ "code": {
1234
+ "type": "string",
1235
+ "minLength": 10,
1236
+ "description": "Authorization code from OAuth provider callback",
1237
+ "maxLength": 500
1238
+ },
1239
+ "state": {
1240
+ "type": "string",
1241
+ "minLength": 20,
1242
+ "description": "State token for CSRF verification (from authorize response)",
1243
+ "maxLength": 100
1244
+ },
1245
+ "redirect_uri": {
1246
+ "type": "string",
1247
+ "format": "uri",
1248
+ "description": "Same redirect_uri used in authorize request. If not provided, uses config's site_url + callback_path"
1249
+ }
1250
+ },
1251
+ "required": [
1252
+ "code",
1253
+ "state"
1254
+ ]
1255
+ },
1256
+ "OAuthConnection": {
1257
+ "type": "object",
1258
+ "description": "Serializer for OAuth connection info (user-facing).",
1259
+ "properties": {
1260
+ "id": {
1261
+ "type": "integer",
1262
+ "readOnly": true
1263
+ },
1264
+ "provider": {
1265
+ "allOf": [
1266
+ {
1267
+ "$ref": "#/components/schemas/OAuthProviderEnum"
1268
+ }
1269
+ ],
1270
+ "readOnly": true,
1271
+ "description": "OAuth provider name (github, google, etc.)\n\n* `github` - GitHub"
1272
+ },
1273
+ "provider_display": {
1274
+ "type": "string",
1275
+ "readOnly": true
1276
+ },
1277
+ "provider_username": {
1278
+ "type": "string",
1279
+ "readOnly": true,
1280
+ "description": "Username on the OAuth provider platform"
1281
+ },
1282
+ "provider_email": {
1283
+ "type": "string",
1284
+ "format": "email",
1285
+ "readOnly": true,
1286
+ "description": "Email from OAuth provider (may differ from user.email)"
1287
+ },
1288
+ "provider_avatar_url": {
1289
+ "type": "string",
1290
+ "format": "uri",
1291
+ "readOnly": true,
1292
+ "description": "Avatar URL from OAuth provider"
1293
+ },
1294
+ "connected_at": {
1295
+ "type": "string",
1296
+ "format": "date-time",
1297
+ "readOnly": true,
1298
+ "description": "When this OAuth connection was created"
1299
+ },
1300
+ "last_login_at": {
1301
+ "type": "string",
1302
+ "format": "date-time",
1303
+ "readOnly": true,
1304
+ "description": "Last time this OAuth connection was used for login"
1305
+ }
1306
+ },
1307
+ "required": [
1308
+ "connected_at",
1309
+ "id",
1310
+ "last_login_at",
1311
+ "provider",
1312
+ "provider_avatar_url",
1313
+ "provider_display",
1314
+ "provider_email",
1315
+ "provider_username"
1316
+ ]
1317
+ },
1318
+ "OAuthDisconnectRequestRequest": {
1319
+ "type": "object",
1320
+ "description": "Request to disconnect OAuth provider.",
1321
+ "properties": {
1322
+ "provider": {
1323
+ "allOf": [
1324
+ {
1325
+ "$ref": "#/components/schemas/OAuthProviderEnum"
1326
+ }
1327
+ ],
1328
+ "description": "OAuth provider to disconnect\n\n* `github` - GitHub"
1329
+ }
1330
+ },
1331
+ "required": [
1332
+ "provider"
1333
+ ]
1334
+ },
1335
+ "OAuthError": {
1336
+ "type": "object",
1337
+ "description": "Error response for OAuth endpoints.",
1338
+ "properties": {
1339
+ "error": {
1340
+ "type": "string",
1341
+ "description": "Error code"
1342
+ },
1343
+ "error_description": {
1344
+ "type": "string",
1345
+ "description": "Human-readable error description"
1346
+ }
1347
+ },
1348
+ "required": [
1349
+ "error"
1350
+ ]
1351
+ },
1352
+ "OAuthProviderEnum": {
1353
+ "enum": [
1354
+ "github"
1355
+ ],
1356
+ "type": "string",
1357
+ "description": "* `github` - GitHub"
1358
+ },
1359
+ "OAuthProvidersResponse": {
1360
+ "type": "object",
1361
+ "description": "Response with available OAuth providers.",
1362
+ "properties": {
1363
+ "providers": {
1364
+ "type": "array",
1365
+ "items": {
1366
+ "type": "object",
1367
+ "additionalProperties": {}
1368
+ },
1369
+ "description": "List of available OAuth providers"
1370
+ }
1371
+ },
1372
+ "required": [
1373
+ "providers"
1374
+ ]
1375
+ },
1376
+ "OAuthTokenResponse": {
1377
+ "type": "object",
1378
+ "description": "Response with JWT tokens after OAuth authentication.\n\nWhen 2FA is required:\n- requires_2fa: True\n- session_id: UUID of 2FA verification session\n- access/refresh/user: null\n\nWhen 2FA is not required:\n- requires_2fa: False\n- session_id: null\n- access/refresh/user: populated",
1379
+ "properties": {
1380
+ "requires_2fa": {
1381
+ "type": "boolean",
1382
+ "default": false,
1383
+ "description": "True if 2FA verification is required"
1384
+ },
1385
+ "session_id": {
1386
+ "type": [
1387
+ "string",
1388
+ "null"
1389
+ ],
1390
+ "format": "uuid",
1391
+ "description": "2FA session ID (only when requires_2fa=True)"
1392
+ },
1393
+ "access": {
1394
+ "type": [
1395
+ "string",
1396
+ "null"
1397
+ ],
1398
+ "description": "JWT access token (null when requires_2fa=True)"
1399
+ },
1400
+ "refresh": {
1401
+ "type": [
1402
+ "string",
1403
+ "null"
1404
+ ],
1405
+ "description": "JWT refresh token (null when requires_2fa=True)"
1406
+ },
1407
+ "user": {
1408
+ "type": [
1409
+ "object",
1410
+ "null"
1411
+ ],
1412
+ "additionalProperties": {},
1413
+ "description": "Authenticated user info (null when requires_2fa=True)"
1414
+ },
1415
+ "is_new_user": {
1416
+ "type": "boolean",
1417
+ "description": "True if a new user was created during this OAuth flow"
1418
+ },
1419
+ "is_new_connection": {
1420
+ "type": "boolean",
1421
+ "description": "True if a new OAuth connection was created"
1422
+ },
1423
+ "should_prompt_2fa": {
1424
+ "type": "boolean",
1425
+ "description": "True if user should be prompted to enable 2FA"
1426
+ }
1427
+ },
1428
+ "required": [
1429
+ "is_new_connection",
1430
+ "is_new_user"
1431
+ ]
1432
+ },
1433
+ "OTPErrorResponse": {
1434
+ "type": "object",
1435
+ "description": "Typed error response for OTP operations.\n\nerror_code values:\n - invalid_identifier — malformed email\n - cooldown — too soon after last request (retry_after = seconds)\n - hourly_limit — hourly quota exceeded (retry_after = seconds until reset)\n - daily_limit — daily quota exceeded (retry_after = seconds until reset)\n - rate_limited — IP-level rate limit hit (no retry_after)\n - user_creation_failed — internal error creating account\n - send_failed — transport error (email / SMS)\n - internal_error — unexpected server error",
1436
+ "properties": {
1437
+ "error": {
1438
+ "type": "string",
1439
+ "description": "Human-readable error message"
1440
+ },
1441
+ "error_code": {
1442
+ "type": [
1443
+ "string",
1444
+ "null"
1445
+ ],
1446
+ "description": "Machine-readable error code"
1447
+ },
1448
+ "retry_after": {
1449
+ "type": [
1450
+ "integer",
1451
+ "null"
1452
+ ],
1453
+ "description": "Seconds until the client may retry (present only for rate-limit errors)"
1454
+ }
1455
+ },
1456
+ "required": [
1457
+ "error"
1458
+ ]
1459
+ },
1460
+ "OTPRequestRequest": {
1461
+ "type": "object",
1462
+ "description": "Serializer for OTP request.",
1463
+ "properties": {
1464
+ "identifier": {
1465
+ "type": "string",
1466
+ "minLength": 1,
1467
+ "description": "Email address for OTP delivery"
1468
+ },
1469
+ "source_url": {
1470
+ "type": "string",
1471
+ "format": "uri",
1472
+ "description": "Source URL for tracking registration (e.g., https://my.djangocfg.com)"
1473
+ }
1474
+ },
1475
+ "required": [
1476
+ "identifier"
1477
+ ]
1478
+ },
1479
+ "OTPRequestResponse": {
1480
+ "type": "object",
1481
+ "description": "OTP request response.",
1482
+ "properties": {
1483
+ "message": {
1484
+ "type": "string",
1485
+ "description": "Success message"
1486
+ }
1487
+ },
1488
+ "required": [
1489
+ "message"
1490
+ ]
1491
+ },
1492
+ "OTPVerifyRequest": {
1493
+ "type": "object",
1494
+ "description": "Serializer for OTP verification.",
1495
+ "properties": {
1496
+ "identifier": {
1497
+ "type": "string",
1498
+ "minLength": 1,
1499
+ "description": "Email address used for OTP request"
1500
+ },
1501
+ "otp": {
1502
+ "type": "string",
1503
+ "minLength": 4,
1504
+ "maxLength": 4
1505
+ },
1506
+ "source_url": {
1507
+ "type": "string",
1508
+ "format": "uri",
1509
+ "description": "Source URL for tracking login (e.g., https://my.djangocfg.com)"
1510
+ }
1511
+ },
1512
+ "required": [
1513
+ "identifier",
1514
+ "otp"
1515
+ ]
1516
+ },
1517
+ "OTPVerifyResponse": {
1518
+ "type": "object",
1519
+ "description": "OTP verification response.\n\nWhen 2FA is required:\n- requires_2fa: True\n- session_id: UUID of 2FA verification session\n- refresh/access/user: null\n\nWhen 2FA is not required:\n- requires_2fa: False\n- session_id: null\n- refresh/access/user: populated",
1520
+ "properties": {
1521
+ "requires_2fa": {
1522
+ "type": "boolean",
1523
+ "default": false,
1524
+ "description": "Whether 2FA verification is required"
1525
+ },
1526
+ "session_id": {
1527
+ "type": [
1528
+ "string",
1529
+ "null"
1530
+ ],
1531
+ "format": "uuid",
1532
+ "description": "2FA session ID (if requires_2fa is True)"
1533
+ },
1534
+ "refresh": {
1535
+ "type": [
1536
+ "string",
1537
+ "null"
1538
+ ],
1539
+ "description": "JWT refresh token (if requires_2fa is False)"
1540
+ },
1541
+ "access": {
1542
+ "type": [
1543
+ "string",
1544
+ "null"
1545
+ ],
1546
+ "description": "JWT access token (if requires_2fa is False)"
1547
+ },
1548
+ "user": {
1549
+ "oneOf": [
1550
+ {
1551
+ "$ref": "#/components/schemas/User"
1552
+ },
1553
+ {
1554
+ "type": "null"
1555
+ }
1556
+ ],
1557
+ "description": "User information (if requires_2fa is False)"
1558
+ },
1559
+ "should_prompt_2fa": {
1560
+ "type": "boolean",
1561
+ "description": "Whether user should be prompted to enable 2FA"
1562
+ }
1563
+ }
1564
+ },
1565
+ "PatchedCfgUserUpdateRequest": {
1566
+ "type": "object",
1567
+ "description": "Serializer for updating user profile.",
1568
+ "properties": {
1569
+ "first_name": {
1570
+ "type": "string",
1571
+ "maxLength": 50
1572
+ },
1573
+ "last_name": {
1574
+ "type": "string",
1575
+ "maxLength": 50
1576
+ },
1577
+ "company": {
1578
+ "type": "string",
1579
+ "maxLength": 100
1580
+ },
1581
+ "phone": {
1582
+ "type": "string",
1583
+ "maxLength": 20
1584
+ },
1585
+ "position": {
1586
+ "type": "string",
1587
+ "maxLength": 100
1588
+ },
1589
+ "language": {
1590
+ "type": "string",
1591
+ "maxLength": 10
1592
+ },
1593
+ "timezone": {
1594
+ "type": "string",
1595
+ "description": "IANA timezone name (e.g. 'Asia/Seoul'). Auto-detected from browser via X-Timezone header.",
1596
+ "maxLength": 64
1597
+ }
1598
+ }
1599
+ },
1600
+ "TokenRefresh": {
1601
+ "type": "object",
1602
+ "properties": {
1603
+ "access": {
1604
+ "type": "string",
1605
+ "readOnly": true
1606
+ },
1607
+ "refresh": {
1608
+ "type": "string"
1609
+ }
1610
+ },
1611
+ "required": [
1612
+ "access",
1613
+ "refresh"
1614
+ ]
1615
+ },
1616
+ "TokenRefreshRequest": {
1617
+ "type": "object",
1618
+ "properties": {
1619
+ "refresh": {
1620
+ "type": "string",
1621
+ "minLength": 1
1622
+ }
1623
+ },
1624
+ "required": [
1625
+ "refresh"
1626
+ ]
1627
+ },
1628
+ "User": {
1629
+ "type": "object",
1630
+ "description": "Serializer for user details.",
1631
+ "properties": {
1632
+ "id": {
1633
+ "type": "integer",
1634
+ "readOnly": true
1635
+ },
1636
+ "email": {
1637
+ "type": "string",
1638
+ "format": "email",
1639
+ "readOnly": true
1640
+ },
1641
+ "first_name": {
1642
+ "type": [
1643
+ "string",
1644
+ "null"
1645
+ ],
1646
+ "maxLength": 50
1647
+ },
1648
+ "last_name": {
1649
+ "type": [
1650
+ "string",
1651
+ "null"
1652
+ ],
1653
+ "maxLength": 50
1654
+ },
1655
+ "full_name": {
1656
+ "type": "string",
1657
+ "description": "Get user's full name.",
1658
+ "readOnly": true
1659
+ },
1660
+ "initials": {
1661
+ "type": "string",
1662
+ "description": "Get user's initials for avatar fallback.",
1663
+ "readOnly": true
1664
+ },
1665
+ "display_username": {
1666
+ "type": "string",
1667
+ "description": "Get formatted username for display.",
1668
+ "readOnly": true
1669
+ },
1670
+ "company": {
1671
+ "type": [
1672
+ "string",
1673
+ "null"
1674
+ ],
1675
+ "maxLength": 100
1676
+ },
1677
+ "phone": {
1678
+ "type": [
1679
+ "string",
1680
+ "null"
1681
+ ],
1682
+ "maxLength": 20
1683
+ },
1684
+ "position": {
1685
+ "type": [
1686
+ "string",
1687
+ "null"
1688
+ ],
1689
+ "maxLength": 100
1690
+ },
1691
+ "language": {
1692
+ "type": [
1693
+ "string",
1694
+ "null"
1695
+ ],
1696
+ "maxLength": 10
1697
+ },
1698
+ "timezone": {
1699
+ "type": [
1700
+ "string",
1701
+ "null"
1702
+ ],
1703
+ "maxLength": 64
1704
+ },
1705
+ "avatar": {
1706
+ "type": [
1707
+ "string",
1708
+ "null"
1709
+ ],
1710
+ "format": "uri",
1711
+ "readOnly": true
1712
+ },
1713
+ "is_staff": {
1714
+ "type": "boolean",
1715
+ "readOnly": true,
1716
+ "title": "Staff status",
1717
+ "description": "Designates whether the user can log into this admin site."
1718
+ },
1719
+ "is_superuser": {
1720
+ "type": "boolean",
1721
+ "readOnly": true,
1722
+ "title": "Superuser status",
1723
+ "description": "Designates that this user has all permissions without explicitly assigning them."
1724
+ },
1725
+ "date_joined": {
1726
+ "type": "string",
1727
+ "format": "date-time",
1728
+ "readOnly": true
1729
+ },
1730
+ "last_login": {
1731
+ "type": [
1732
+ "string",
1733
+ "null"
1734
+ ],
1735
+ "format": "date-time",
1736
+ "readOnly": true
1737
+ },
1738
+ "unanswered_messages_count": {
1739
+ "type": "integer",
1740
+ "readOnly": true,
1741
+ "default": 0
1742
+ },
1743
+ "centrifugo": {
1744
+ "oneOf": [
1745
+ {
1746
+ "$ref": "#/components/schemas/CentrifugoToken"
1747
+ },
1748
+ {
1749
+ "type": "null"
1750
+ }
1751
+ ],
1752
+ "readOnly": true
1753
+ },
1754
+ "api_key": {
1755
+ "type": [
1756
+ "string",
1757
+ "null"
1758
+ ],
1759
+ "readOnly": true
1760
+ }
1761
+ },
1762
+ "required": [
1763
+ "api_key",
1764
+ "avatar",
1765
+ "centrifugo",
1766
+ "date_joined",
1767
+ "display_username",
1768
+ "email",
1769
+ "full_name",
1770
+ "id",
1771
+ "initials",
1772
+ "is_staff",
1773
+ "is_superuser",
1774
+ "last_login",
1775
+ "unanswered_messages_count"
1776
+ ]
1777
+ }
1778
+ },
1779
+ "securitySchemes": {
1780
+ "apiKeyAuth": {
1781
+ "type": "apiKey",
1782
+ "in": "header",
1783
+ "name": "X-API-Key"
1784
+ },
1785
+ "basicAuth": {
1786
+ "type": "http",
1787
+ "scheme": "basic"
1788
+ },
1789
+ "cookieAuth": {
1790
+ "type": "apiKey",
1791
+ "in": "cookie",
1792
+ "name": "sessionid"
1793
+ },
1794
+ "jwtAuth": {
1795
+ "type": "http",
1796
+ "scheme": "bearer",
1797
+ "bearerFormat": "JWT"
1798
+ },
1799
+ "jwtAuthWithLastLogin": {
1800
+ "type": "http",
1801
+ "scheme": "bearer",
1802
+ "bearerFormat": "JWT"
1803
+ }
1804
+ }
1805
+ },
1806
+ "servers": [
1807
+ {
1808
+ "url": "http://localhost:8000"
1809
+ }
1810
+ ]
1811
+ }