maquinaweb-shared-auth 0.2.60__py3-none-any.whl

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,6 @@
1
+ from storages.backends.s3boto3 import S3Boto3Storage
2
+ from .conf import CUSTOM_DOMAIN_AUTH
3
+
4
+ class Storage(S3Boto3Storage):
5
+ location = "media"
6
+ custom_domain = CUSTOM_DOMAIN_AUTH
shared_auth/urls.py ADDED
@@ -0,0 +1,8 @@
1
+ from rest_framework.routers import DefaultRouter
2
+ from .views import OrganizationViewSet, UserViewSet
3
+
4
+ router = DefaultRouter()
5
+ router.register(r'organizations', OrganizationViewSet, basename='organization')
6
+ router.register(r'user', UserViewSet, basename='user')
7
+
8
+ urlpatterns = router.urls
shared_auth/utils.py ADDED
@@ -0,0 +1,356 @@
1
+ """
2
+ Utilitários para obter os models configurados
3
+ Similar ao get_user_model() do Django
4
+ """
5
+
6
+ from django.apps import apps
7
+ from django.conf import importlib
8
+ from django.core.exceptions import ImproperlyConfigured
9
+ from rest_framework import serializers
10
+
11
+ from .conf import get_setting
12
+
13
+
14
+ def get_token_model():
15
+ """
16
+ Retorna o model de Token configurado ou o padrão.
17
+
18
+ Usage:
19
+ from shared_auth.utils import get_token_model
20
+
21
+ Token = get_token_model()
22
+ token = Token.objects.get(key='abc123')
23
+ """
24
+ model_string = get_setting("SHARED_AUTH_TOKEN_MODEL", "shared_auth.SharedToken")
25
+
26
+ try:
27
+ return apps.get_model(model_string, require_ready=False)
28
+ except ValueError:
29
+ raise ImproperlyConfigured(
30
+ f"SHARED_AUTH_TOKEN_MODEL deve estar no formato 'app_label.model_name'. "
31
+ f"Recebido: '{model_string}'"
32
+ )
33
+ except LookupError:
34
+ raise ImproperlyConfigured(
35
+ f"SHARED_AUTH_TOKEN_MODEL refere-se ao model '{model_string}' "
36
+ f"que não foi instalado ou é inválido."
37
+ )
38
+
39
+
40
+ def get_organization_model():
41
+ """
42
+ Retorna o model de Organization configurado ou o padrão.
43
+
44
+ Usage:
45
+ from shared_auth.utils import get_organization_model
46
+
47
+ Organization = get_organization_model()
48
+ org = Organization.objects.get(id=1)
49
+ """
50
+ model_string = get_setting(
51
+ "SHARED_AUTH_ORGANIZATION_MODEL", "shared_auth.SharedOrganization"
52
+ )
53
+
54
+ try:
55
+ return apps.get_model(model_string, require_ready=False)
56
+ except ValueError:
57
+ raise ImproperlyConfigured(
58
+ f"SHARED_AUTH_ORGANIZATION_MODEL deve estar no formato 'app_label.model_name'. "
59
+ f"Recebido: '{model_string}'"
60
+ )
61
+ except LookupError:
62
+ raise ImproperlyConfigured(
63
+ f"SHARED_AUTH_ORGANIZATION_MODEL refere-se ao model '{model_string}' "
64
+ f"que não foi instalado ou é inválido."
65
+ )
66
+
67
+
68
+ def get_user_model():
69
+ """
70
+ Retorna o model de User configurado ou o padrão.
71
+
72
+ Usage:
73
+ from shared_auth.utils import get_user_model
74
+
75
+ User = get_user_model()
76
+ user = User.objects.get(id=1)
77
+ """
78
+ model_string = get_setting("SHARED_AUTH_USER_MODEL", "shared_auth.User")
79
+
80
+ try:
81
+ return apps.get_model(model_string, require_ready=False)
82
+ except ValueError:
83
+ raise ImproperlyConfigured(
84
+ f"SHARED_AUTH_USER_MODEL deve estar no formato 'app_label.model_name'. "
85
+ f"Recebido: '{model_string}'"
86
+ )
87
+ except LookupError:
88
+ raise ImproperlyConfigured(
89
+ f"SHARED_AUTH_USER_MODEL refere-se ao model '{model_string}' "
90
+ f"que não foi instalado ou é inválido."
91
+ )
92
+
93
+
94
+ def get_member_model():
95
+ """
96
+ Retorna o model de Member configurado ou o padrão.
97
+
98
+ Usage:
99
+ from shared_auth.utils import get_member_model
100
+
101
+ Member = get_member_model()
102
+ member = Member.objects.get(id=1)
103
+ """
104
+ model_string = get_setting("SHARED_AUTH_MEMBER_MODEL", "shared_auth.SharedMember")
105
+
106
+ try:
107
+ return apps.get_model(model_string, require_ready=False)
108
+ except ValueError:
109
+ raise ImproperlyConfigured(
110
+ f"SHARED_AUTH_MEMBER_MODEL deve estar no formato 'app_label.model_name'. "
111
+ f"Recebido: '{model_string}'"
112
+ )
113
+ except LookupError:
114
+ raise ImproperlyConfigured(
115
+ f"SHARED_AUTH_MEMBER_MODEL refere-se ao model '{model_string}' "
116
+ f"que não foi instalado ou é inválido."
117
+ )
118
+
119
+
120
+ def get_organization_serializer():
121
+ import_path_serializer = get_setting("SHARED_AUTH_ORGANIZATION_SERIALIZER", None)
122
+
123
+ if not import_path_serializer:
124
+ return serializers.ModelSerializer
125
+
126
+ try:
127
+ module_path, class_name = import_path_serializer.rsplit(".", 1)
128
+ module = importlib.import_module(module_path)
129
+ serializer_class = getattr(module, class_name)
130
+ return serializer_class
131
+ except Exception as e:
132
+ print(f"Erro ao importar serializer: {import_path_serializer}: {e}")
133
+ return serializers.ModelSerializer
134
+
135
+
136
+ def get_organization_group_model():
137
+ """
138
+ Retorna o model de OrganizationGroup configurado ou o padrão.
139
+
140
+ Usage:
141
+ from shared_auth.utils import get_organization_group_model
142
+
143
+ OrganizationGroup = get_organization_group_model()
144
+ group = OrganizationGroup.objects.get(id=1)
145
+ """
146
+ model_string = get_setting(
147
+ "SHARED_AUTH_ORGANIZATION_GROUP_MODEL", "shared_auth.OrganizationGroup"
148
+ )
149
+
150
+ try:
151
+ return apps.get_model(model_string, require_ready=False)
152
+ except ValueError:
153
+ raise ImproperlyConfigured(
154
+ f"SHARED_AUTH_ORGANIZATION_GROUP_MODEL deve estar no formato 'app_label.model_name'. "
155
+ f"Recebido: '{model_string}'"
156
+ )
157
+ except LookupError:
158
+ raise ImproperlyConfigured(
159
+ f"SHARED_AUTH_ORGANIZATION_GROUP_MODEL refere-se ao model '{model_string}' "
160
+ f"que não foi instalado ou é inválido."
161
+ )
162
+
163
+
164
+
165
+ # ============================================================================
166
+ # PERMISSION SYSTEM MODEL GETTERS
167
+ # ============================================================================
168
+
169
+
170
+ def get_system_model():
171
+ """
172
+ Retorna o model de System configurado ou o padrão.
173
+
174
+ Usage:
175
+ from shared_auth.utils import get_system_model
176
+
177
+ System = get_system_model()
178
+ system = System.objects.get(id=1)
179
+ """
180
+ model_string = get_setting("SHARED_AUTH_SYSTEM_MODEL", "shared_auth.System")
181
+
182
+ try:
183
+ return apps.get_model(model_string, require_ready=False)
184
+ except ValueError:
185
+ raise ImproperlyConfigured(
186
+ f"SHARED_AUTH_SYSTEM_MODEL deve estar no formato 'app_label.model_name'. "
187
+ f"Recebido: '{model_string}'"
188
+ )
189
+ except LookupError:
190
+ raise ImproperlyConfigured(
191
+ f"SHARED_AUTH_SYSTEM_MODEL refere-se ao model '{model_string}' "
192
+ f"que não foi instalado ou é inválido."
193
+ )
194
+
195
+
196
+ def get_permission_model():
197
+ """
198
+ Retorna o model de Permission configurado ou o padrão.
199
+
200
+ Usage:
201
+ from shared_auth.utils import get_permission_model
202
+
203
+ Permission = get_permission_model()
204
+ perm = Permission.objects.get(id=1)
205
+ """
206
+ model_string = get_setting("SHARED_AUTH_PERMISSION_MODEL", "shared_auth.Permission")
207
+
208
+ try:
209
+ return apps.get_model(model_string, require_ready=False)
210
+ except ValueError:
211
+ raise ImproperlyConfigured(
212
+ f"SHARED_AUTH_PERMISSION_MODEL deve estar no formato 'app_label.model_name'. "
213
+ f"Recebido: '{model_string}'"
214
+ )
215
+ except LookupError:
216
+ raise ImproperlyConfigured(
217
+ f"SHARED_AUTH_PERMISSION_MODEL refere-se ao model '{model_string}' "
218
+ f"que não foi instalado ou é inválido."
219
+ )
220
+
221
+
222
+ def get_plan_model():
223
+ """
224
+ Retorna o model de Plan configurado ou o padrão.
225
+
226
+ Usage:
227
+ from shared_auth.utils import get_plan_model
228
+
229
+ Plan = get_plan_model()
230
+ plan = Plan.objects.get(id=1)
231
+ """
232
+ model_string = get_setting("SHARED_AUTH_PLAN_MODEL", "shared_auth.Plan")
233
+
234
+ try:
235
+ return apps.get_model(model_string, require_ready=False)
236
+ except ValueError:
237
+ raise ImproperlyConfigured(
238
+ f"SHARED_AUTH_PLAN_MODEL deve estar no formato 'app_label.model_name'. "
239
+ f"Recebido: '{model_string}'"
240
+ )
241
+ except LookupError:
242
+ raise ImproperlyConfigured(
243
+ f"SHARED_AUTH_PLAN_MODEL refere-se ao model '{model_string}' "
244
+ f"que não foi instalado ou é inválido."
245
+ )
246
+
247
+
248
+ def get_subscription_model():
249
+ """
250
+ Retorna o model de Subscription configurado ou o padrão.
251
+
252
+ Usage:
253
+ from shared_auth.utils import get_subscription_model
254
+
255
+ Subscription = get_subscription_model()
256
+ sub = Subscription.objects.get(id=1)
257
+ """
258
+ model_string = get_setting("SHARED_AUTH_SUBSCRIPTION_MODEL", "shared_auth.Subscription")
259
+
260
+ try:
261
+ return apps.get_model(model_string, require_ready=False)
262
+ except ValueError:
263
+ raise ImproperlyConfigured(
264
+ f"SHARED_AUTH_SUBSCRIPTION_MODEL deve estar no formato 'app_label.model_name'. "
265
+ f"Recebido: '{model_string}'"
266
+ )
267
+ except LookupError:
268
+ raise ImproperlyConfigured(
269
+ f"SHARED_AUTH_SUBSCRIPTION_MODEL refere-se ao model '{model_string}' "
270
+ f"que não foi instalado ou é inválido."
271
+ )
272
+
273
+
274
+ def get_group_permissions_model():
275
+ """
276
+ Retorna o model de GroupPermissions configurado ou o padrão.
277
+
278
+ Usage:
279
+ from shared_auth.utils import get_group_permissions_model
280
+
281
+ GroupPermissions = get_group_permissions_model()
282
+ group = GroupPermissions.objects.get(id=1)
283
+ """
284
+ model_string = get_setting("SHARED_AUTH_GROUP_PERMISSIONS_MODEL", "shared_auth.GroupPermissions")
285
+
286
+ try:
287
+ return apps.get_model(model_string, require_ready=False)
288
+ except ValueError:
289
+ raise ImproperlyConfigured(
290
+ f"SHARED_AUTH_GROUP_PERMISSIONS_MODEL deve estar no formato 'app_label.model_name'. "
291
+ f"Recebido: '{model_string}'"
292
+ )
293
+ except LookupError:
294
+ raise ImproperlyConfigured(
295
+ f"SHARED_AUTH_GROUP_PERMISSIONS_MODEL refere-se ao model '{model_string}' "
296
+ f"que não foi instalado ou é inválido."
297
+ )
298
+
299
+
300
+ def get_group_organization_permissions_model():
301
+ """
302
+ Retorna o model de GroupOrganizationPermissions configurado ou o padrão.
303
+
304
+ Usage:
305
+ from shared_auth.utils import get_group_organization_permissions_model
306
+
307
+ GroupOrgPermissions = get_group_organization_permissions_model()
308
+ group = GroupOrgPermissions.objects.get(id=1)
309
+ """
310
+ model_string = get_setting(
311
+ "SHARED_AUTH_GROUP_ORG_PERMISSIONS_MODEL",
312
+ "shared_auth.GroupOrganizationPermissions"
313
+ )
314
+
315
+ try:
316
+ return apps.get_model(model_string, require_ready=False)
317
+ except ValueError:
318
+ raise ImproperlyConfigured(
319
+ f"SHARED_AUTH_GROUP_ORG_PERMISSIONS_MODEL deve estar no formato 'app_label.model_name'. "
320
+ f"Recebido: '{model_string}'"
321
+ )
322
+ except LookupError:
323
+ raise ImproperlyConfigured(
324
+ f"SHARED_AUTH_GROUP_ORG_PERMISSIONS_MODEL refere-se ao model '{model_string}' "
325
+ f"que não foi instalado ou é inválido."
326
+ )
327
+
328
+
329
+ def get_member_system_group_model():
330
+ """
331
+ Retorna o model de MemberSystemGroup configurado ou o padrão.
332
+
333
+ Usage:
334
+ from shared_auth.utils import get_member_system_group_model
335
+
336
+ MemberSystemGroup = get_member_system_group_model()
337
+ assignment = MemberSystemGroup.objects.get(id=1)
338
+ """
339
+ model_string = get_setting(
340
+ "SHARED_AUTH_MEMBER_SYSTEM_GROUP_MODEL",
341
+ "shared_auth.MemberSystemGroup"
342
+ )
343
+
344
+ try:
345
+ return apps.get_model(model_string, require_ready=False)
346
+ except ValueError:
347
+ raise ImproperlyConfigured(
348
+ f"SHARED_AUTH_MEMBER_SYSTEM_GROUP_MODEL deve estar no formato 'app_label.model_name'. "
349
+ f"Recebido: '{model_string}'"
350
+ )
351
+ except LookupError:
352
+ raise ImproperlyConfigured(
353
+ f"SHARED_AUTH_MEMBER_SYSTEM_GROUP_MODEL refere-se ao model '{model_string}' "
354
+ f"que não foi instalado ou é inválido."
355
+ )
356
+
shared_auth/views.py ADDED
@@ -0,0 +1,40 @@
1
+ from rest_framework import viewsets
2
+ from rest_framework.decorators import action
3
+ from rest_framework.response import Response
4
+ from rest_framework.permissions import IsAuthenticated
5
+ from .middleware import get_member
6
+ from .serializers import OrganizationSerializer, UserSerializer
7
+
8
+ class OrganizationViewSet(viewsets.ReadOnlyModelViewSet):
9
+ """
10
+ ViewSet para organizações do usuário + action `me` para retornar
11
+ a organização atual via header.
12
+ """
13
+ serializer_class = OrganizationSerializer
14
+ permission_classes = [IsAuthenticated]
15
+
16
+ def get_queryset(self):
17
+ organizations = self.request.user.organizations
18
+ return organizations
19
+
20
+ @action(detail=False, methods=['get'])
21
+ def me(self, request):
22
+ org = request.user.get_org(request.organization_id)
23
+ if not org:
24
+ return Response({"detail": "Organization not specified or not found."}, status=400)
25
+
26
+ if not get_member(request.user.id, org.pk):
27
+ return Response({"detail": "Você não pertence a essa organização."}, status=403)
28
+ serializer = self.get_serializer(org)
29
+ return Response(serializer.data)
30
+
31
+ class UserViewSet(viewsets.ReadOnlyModelViewSet):
32
+ serializer_class = UserSerializer
33
+ permission_classes = [IsAuthenticated]
34
+
35
+ # def get_queryset(self):
36
+ # return User.objects.filter(pk=self.request.user.pk)
37
+
38
+ def list(self, request, *args, **kwargs):
39
+ serializer = self.get_serializer(request.user)
40
+ return Response(serializer.data)