alpha-python 0.7.8__py3-none-any.whl → 0.7.9__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.
@@ -205,3 +205,16 @@ class User(LifeCycleBase, BaseDomainModel):
205
205
  self.admin = obj.admin
206
206
 
207
207
  return cast(DomainModel, self)
208
+
209
+ def update_from_identity(self, identity: Identity) -> Self:
210
+ """Update the User instance with data from an Identity instance. Only
211
+ the email and display name are updated.
212
+
213
+ Parameters
214
+ ----------
215
+ identity
216
+ Identity object to update from.
217
+ """
218
+ self.email = identity.email
219
+ self.display_name = identity.display_name
220
+ return self
@@ -32,7 +32,7 @@ class SqlAlchemyDatabase:
32
32
  db_name
33
33
  Database name, by default ""
34
34
  db_type
35
- Database type, by default "postgresql"
35
+ Database type and driver, by default "postgresql+psycopg2"
36
36
  conn_str
37
37
  Connection string. Can be used instead of host, port, username,
38
38
  password, and db_name, by default None
@@ -55,7 +55,7 @@ class SqlAlchemyDatabase:
55
55
  username: str = "",
56
56
  password: str = "",
57
57
  db_name: str = "",
58
- db_type: str = "postgresql",
58
+ db_type: str = "postgresql+psycopg2",
59
59
  conn_str: str | None = None,
60
60
  schema_name: str = "public",
61
61
  create_schema: bool = True,
@@ -1,6 +1,7 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  from dataclasses import dataclass
4
+ from enum import Enum
4
5
  from typing import Mapping, Any, Self, Sequence, TYPE_CHECKING, cast
5
6
  from datetime import datetime, timezone
6
7
 
@@ -321,18 +322,24 @@ class Identity:
321
322
  User object to update from.
322
323
  """
323
324
  self.username = user.username
324
- if not self.email:
325
- self.email = user.email
326
- if not self.display_name:
327
- self.display_name = user.display_name
325
+ self.role = (
326
+ user.role.name if isinstance(user.role, Enum) else user.role
327
+ )
328
+ self.admin = user.admin
328
329
  for permission in user.permissions or []:
329
330
  self.permissions = self._append_on_sequence(
330
331
  self.permissions, str(permission)
331
332
  )
332
333
  for group in user.groups or []:
333
334
  self.groups = self._append_on_sequence(self.groups, str(group))
334
- self.role = user.role # type: ignore
335
- self.admin = user.admin
335
+
336
+ # Update email and display name only if they are not already set. This
337
+ # ensures that existing values which are provided by an identity
338
+ # provider are not overwritten.
339
+ if not self.email:
340
+ self.email = user.email
341
+ if not self.display_name:
342
+ self.display_name = user.display_name
336
343
 
337
344
  def update_from_groups(self, groups: list[Group]) -> None:
338
345
  """Update the Identity permissions with data from a list of Group
@@ -622,12 +622,13 @@ class AuthenticationService:
622
622
  )
623
623
  if user:
624
624
  identity.update_from_user(user)
625
+ user.update_from_identity(identity)
625
626
 
626
627
  else:
627
628
  # Create new user from identity if not found in database
628
629
  user = self._user_model.from_identity(identity)
629
630
  users.add(user)
630
- self.uow.commit()
631
+ self.uow.commit()
631
632
 
632
633
  return identity
633
634
 
@@ -147,7 +147,9 @@ def init_container():
147
147
  "username": os.getenv("TEST_PSQL_USERNAME", "postgres"),
148
148
  "password": os.getenv("TEST_PSQL_PASSWORD", "postgres"),
149
149
  "db_name": os.getenv("TEST_PSQL_DB_NAME", "postgres"),
150
- "db_type": os.getenv("TEST_PSQL_DB_TYPE", "postgresql"),
150
+ "db_type": os.getenv(
151
+ "TEST_PSQL_DB_TYPE", "postgresql+psycopg2"
152
+ ),
151
153
  },
152
154
  "authentication": {
153
155
  "use_cookies": True,
@@ -62,6 +62,9 @@ class TestUser(LifeCycleBase, BaseDomainModel):
62
62
  display_name=identity.display_name,
63
63
  )
64
64
 
65
+ def update_from_identity(self, identity: Identity) -> None:
66
+ return None
67
+
65
68
 
66
69
  @dataclass
67
70
  class TestToken(BaseDomainModel):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: alpha-python
3
- Version: 0.7.8
3
+ Version: 0.7.9
4
4
  Summary: Alpha is intended to be the first dependency you need to add to your Python application. It is a Python library which contains standard building blocks that can be used in applications that are used as APIs and/or make use of database interaction.
5
5
  Author-email: Bart Reijling <bart@reijling.eu>
6
6
  License-Expression: MIT
@@ -15,7 +15,7 @@ alpha/domain/models/group.py,sha256=yrSDbt1MsQ-8rYl57jKlA-gJAn8q_qseT7T0LwgvFSs,
15
15
  alpha/domain/models/life_cycle_base.py,sha256=xRwcTPRR0pHwsBN_dyaN8d1AVuKOEF6iNCS0IWZntDY,875
16
16
  alpha/domain/models/permission.py,sha256=pqFu6WnqEqry9x8InPhXNTZInLcoY7fb9Fk8jMBRISw,3195
17
17
  alpha/domain/models/role.py,sha256=95cUc8VDB7o_IXJdTBF0KFJUyvOfRtpNkxTslzpVqIQ,4614
18
- alpha/domain/models/user.py,sha256=H64rNrjY9VV-ljux_HIEyxT0O4zlLaIXMzZLEyCKLZY,6868
18
+ alpha/domain/models/user.py,sha256=zGyABzzQo1qWiI4CtFoD1J9GF3CwPj1UbxhIIrNqc-8,7277
19
19
  alpha/factories/__init__.py,sha256=baxoq0UY7UYust7NiR9wT954nJw5bfgSmOWvLjBt2C4,278
20
20
  alpha/factories/_type_conversion_matrix.py,sha256=mhMYpus6OFE0sZB0gQ-b1ndIOhiA1ScprvDa9tLANAM,5055
21
21
  alpha/factories/_type_mapping.py,sha256=f8cRfu8KUfw1ggY0Txs6fEX2e6GaXrsNcc2SCeYFRHM,789
@@ -70,7 +70,7 @@ alpha/infra/__init__.py,sha256=4eIKsW1N06_vVBrO2u1ESU5iURBb0cGvxcscaPsB4PE,1018
70
70
  alpha/infra/connectors/__init__.py,sha256=kEh_mOIIqkWeY4cilislM8ZjKXNFp8zBuMThfbJ1CGc,647
71
71
  alpha/infra/connectors/ldap_connector.py,sha256=Ce2IspqcrTEkYwlhxoh8QOzEK51-ZcJ9t6RCytk0Ob8,5132
72
72
  alpha/infra/connectors/oidc_connector.py,sha256=z9AY1lMVK5nULd80zOvJzo8zPbp6CHJ7fv2smp71eIs,15675
73
- alpha/infra/connectors/sql_alchemy.py,sha256=8DivUj25_OAVaXmaCsbSnHgOD1w5_ewAXSlZ-cxuMVk,5116
73
+ alpha/infra/connectors/sql_alchemy.py,sha256=4SlETRrhIZtChPvgX2xLqyb8Kb4XCoB1uwNGHckRw3o,5145
74
74
  alpha/infra/databases/__init__.py,sha256=IyA_aB9h_7rOM-aa50QLsA_q4e9W4HnJOqh76aDyrj4,106
75
75
  alpha/infra/databases/sql_alchemy.py,sha256=7t17M8UEgW1NMX9LYW6A14EM5UxEJZyp-8a_xLEONAs,235
76
76
  alpha/infra/models/__init__.py,sha256=SIakw9bAPXwFmx3I7exCRBs3e2Ug3etOJy6JyIOR1Uc,348
@@ -108,7 +108,7 @@ alpha/providers/ldap_provider.py,sha256=nZhSvLXl-dWN6bEBQ6UO8r-xpb_QzY2m7mkzQA7a
108
108
  alpha/providers/oidc_provider.py,sha256=8-VWHzWYXpgwfqi64hnMYcT7Hp1p8Gr8I1EIPDgY6nA,14603
109
109
  alpha/providers/models/__init__.py,sha256=SI-qTA3JMOxXx4o1h7frk8x3PRj0g_GSCEbLzyvw7CI,409
110
110
  alpha/providers/models/credentials.py,sha256=IjGm1MpnUrwnTo1Of5eacNtkh72Iqj2uKTsoyq1po_o,1304
111
- alpha/providers/models/identity.py,sha256=M8b7uiaVYvtCgGV2nxEWrPPgbxUiWPbI-tGcMmaHtbE,16285
111
+ alpha/providers/models/identity.py,sha256=5Sit9QrcX7J5YVaduXqV7F9jFwvnPotAWgBbUocIhKA,16559
112
112
  alpha/providers/models/token.py,sha256=xLiE-bWufbcWgkKpar5R2VAE8YhjyhWF44yN0Me9sJw,4793
113
113
  alpha/repositories/__init__.py,sha256=i4kyfLbLSHUzrqDF9Q96CgEaK-srPtEIspUD6uUjElk,787
114
114
  alpha/repositories/rest_api_repository.py,sha256=BC_M5_HPwWKwMRsHI2PNCmqu0SC5Tw9ZGhZ7eaLIFgw,48702
@@ -121,7 +121,7 @@ alpha/repositories/refresh/database_repository.py,sha256=b5Z0_nVairZOaqQ6OBb6_X2
121
121
  alpha/repositories/refresh/file_repository.py,sha256=EoygSFD7XLzSmnY1W2d3pdlNbQ0rcxwhRGNrlbMH62g,5490
122
122
  alpha/repositories/refresh/memory_repository.py,sha256=r0P2DVgTTDSqV8g1OaNf8knqpiysb-LaWW0pdS2wZaQ,3926
123
123
  alpha/services/__init__.py,sha256=yeUbS-N0127DSejbCAv9jbdKuHRa_H5Ue0CtsWf4ghI,224
124
- alpha/services/authentication_service.py,sha256=X1CPvXel_R9PRBlwh-6RDJdodgPq1MbbiUUUKnAMc3Y,29846
124
+ alpha/services/authentication_service.py,sha256=3HBAz3orzxxM9loigIdNc3EHyRg8ongeF_zK0SAFSIU,29894
125
125
  alpha/services/user_lifecycle_management.py,sha256=yj0ITtD_WOCVo54KaNSC29XPixxdKi9ArvCMeQm6WKA,2696
126
126
  alpha/services/models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
127
127
  alpha/services/models/cookie.py,sha256=vxNLPtMmOGlxFLKdccxEV7hd_mPKmFCEao8SczNOilo,132
@@ -138,15 +138,15 @@ alpha/utils/secret_generator.py,sha256=LjsKb8oDfsfmCCcTKrqtw_duqJ7u3V_o6zGGuG26_
138
138
  alpha/utils/verify_identity.py,sha256=Y1pdcVl8Z_I4ibw2KY7i5QwTQrY29WwpBOJ6j0YOAow,2271
139
139
  alpha/utils/version_checker.py,sha256=W8v69hDbrr0VvJ40gpFmXMtVawrDmUz_YGWssKUTmVE,380
140
140
  alpha/utils/openapi_test/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
141
- alpha/utils/openapi_test/container.py,sha256=5QRfRl4S3KiPjvsu4zOro5swlFAS8O3ZSSmkAT6_IRU,6638
141
+ alpha/utils/openapi_test/container.py,sha256=xdQ22lSsr_CjInwVl4QRB2mJke9oiTDjgi9Mzsrlaik,6685
142
142
  alpha/utils/openapi_test/exceptions.py,sha256=FfVodhZrajSGQEZngKZRmlJCxjQP502OqQgu3qdtuN4,298
143
- alpha/utils/openapi_test/models.py,sha256=n5KCwdlpOiFcgvYlmFl-cMrvoOhmClodVC4hKH4fOvo,4996
143
+ alpha/utils/openapi_test/models.py,sha256=5iZpUqgXy6T5f4v1XctD23l87m4g_pCVeuH09MbUv4A,5081
144
144
  alpha/utils/openapi_test/orm.py,sha256=Py95GV_0e7wI1MYDZR1_EHkvTgev6eNo70SVmnD7kGc,3045
145
145
  alpha/utils/openapi_test/response.py,sha256=IxbQ6Nw258LLViHkgfjOpc7zWGTP8ofVOX1zrwDoR50,270
146
146
  alpha/utils/openapi_test/service.py,sha256=WWR33FYr76zV7CD8OWYc1B0zofv3_DDo0jnRPV6uJuM,4948
147
- alpha_python-0.7.8.dist-info/licenses/LICENSE,sha256=5KwEqC3KUoH4lVXgZ9tGriKOl-LGxHkXBWo16mFmAYM,1070
148
- alpha_python-0.7.8.dist-info/METADATA,sha256=viK-l1AufOomnXyFtAicy4gy9qDSOBNnj8pdXCeBnvg,8639
149
- alpha_python-0.7.8.dist-info/WHEEL,sha256=YVMoNqKzERt-wjUZwJ33xBGAwnFl-4cqbYkTtWa4itE,91
150
- alpha_python-0.7.8.dist-info/entry_points.txt,sha256=LBEXdcofOugYYdZ46nz5Dxj_aj1QbRBkumfPGhy-GXI,41
151
- alpha_python-0.7.8.dist-info/top_level.txt,sha256=tqmNnOmi2RSSiPo99C03fD5Cc3r9za9xTjPAoQC1EGA,6
152
- alpha_python-0.7.8.dist-info/RECORD,,
147
+ alpha_python-0.7.9.dist-info/licenses/LICENSE,sha256=5KwEqC3KUoH4lVXgZ9tGriKOl-LGxHkXBWo16mFmAYM,1070
148
+ alpha_python-0.7.9.dist-info/METADATA,sha256=FM8botA-RX1qExZNw9obuJhGnvuhnjbKILY71DfQMtQ,8639
149
+ alpha_python-0.7.9.dist-info/WHEEL,sha256=YVMoNqKzERt-wjUZwJ33xBGAwnFl-4cqbYkTtWa4itE,91
150
+ alpha_python-0.7.9.dist-info/entry_points.txt,sha256=LBEXdcofOugYYdZ46nz5Dxj_aj1QbRBkumfPGhy-GXI,41
151
+ alpha_python-0.7.9.dist-info/top_level.txt,sha256=tqmNnOmi2RSSiPo99C03fD5Cc3r9za9xTjPAoQC1EGA,6
152
+ alpha_python-0.7.9.dist-info/RECORD,,