From ea9b39f6027ec8c3b32c2a0718dc064a82ee1ae2 Mon Sep 17 00:00:00 2001 From: wzglinieckisoldevelo Date: Wed, 5 Jun 2024 15:16:45 +0200 Subject: [PATCH 1/3] OM-182: Added user language change mutation. --- core/schema.py | 36 +++++++++++++++++++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/core/schema.py b/core/schema.py index 349bb40..3aa12a7 100644 --- a/core/schema.py +++ b/core/schema.py @@ -1423,6 +1423,34 @@ def async_mutate(cls, user, **data): return errors +class ChangeUserLanguageMutation(OpenIMISMutation): + """ + Update an existing User Language and do not change history data + """ + _mutation_module = "core" + _mutation_class = "ChangeUserLanguageMutation" + + class Input(OpenIMISMutation.Input): + language_id = graphene.String() + + @classmethod + def async_mutate(cls, user, **data): + try: + if type(user) is AnonymousUser or not user.id: + raise ValidationError("mutation.authentication_required") + data['audit_user_id'] = user.id_for_audit + change_user_language(data, user) + + return None + except Exception as exc: + return [ + { + 'message': "core.mutation.failed_to_update_user_language", + 'detail': str(exc) + }] + + + @transaction.atomic @validate_payload_for_obligatory_fields(CoreConfig.fields_controls_user, 'data') def update_or_create_user(data, user): @@ -1520,6 +1548,12 @@ def set_user_deleted(user): } +def change_user_language(data, user): + new_user = User.objects.get(id=user.id) + new_user.i_user.language_id = data["language_id"] + new_user.save() + + class ChangePasswordMutation(graphene.relay.ClientIDMutation): """ Change a user's password. Either the user can update his own by providing the old password, or an administrator @@ -1652,7 +1686,6 @@ def mutate(cls, root, info, **kwargs): return super().mutate(cls, info, **kwargs) - class Mutation(graphene.ObjectType): create_role = CreateRoleMutation.Field() update_role = UpdateRoleMutation.Field() @@ -1662,6 +1695,7 @@ class Mutation(graphene.ObjectType): create_user = CreateUserMutation.Field() update_user = UpdateUserMutation.Field() delete_user = DeleteUserMutation.Field() + change_user_language = ChangeUserLanguageMutation.Field() change_password = ChangePasswordMutation.Field() reset_password = ResetPasswordMutation.Field() From 54ac3fa11fae52bfa780790a1e81af2e1f2e6c20 Mon Sep 17 00:00:00 2001 From: wzglinieckisoldevelo Date: Wed, 5 Jun 2024 23:23:14 +0200 Subject: [PATCH 2/3] OM-182: Language change code more generic. --- core/schema.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/core/schema.py b/core/schema.py index 3aa12a7..f52d7eb 100644 --- a/core/schema.py +++ b/core/schema.py @@ -1431,7 +1431,7 @@ class ChangeUserLanguageMutation(OpenIMISMutation): _mutation_class = "ChangeUserLanguageMutation" class Input(OpenIMISMutation.Input): - language_id = graphene.String() + language_id = graphene.String(required=True) @classmethod def async_mutate(cls, user, **data): @@ -1439,7 +1439,7 @@ def async_mutate(cls, user, **data): if type(user) is AnonymousUser or not user.id: raise ValidationError("mutation.authentication_required") data['audit_user_id'] = user.id_for_audit - change_user_language(data, user) + change_user_language(user, language_id=data["language_id"]) return None except Exception as exc: @@ -1548,10 +1548,10 @@ def set_user_deleted(user): } -def change_user_language(data, user): - new_user = User.objects.get(id=user.id) - new_user.i_user.language_id = data["language_id"] - new_user.save() +def change_user_language(user, language_id): + updated_user = User.objects.get(id=user.id) + updated_user.i_user.language_id = language_id + updated_user.save() class ChangePasswordMutation(graphene.relay.ClientIDMutation): From 53000cdf3f20f76701eb578cab378ac56f042d64 Mon Sep 17 00:00:00 2001 From: delcroip Date: Thu, 6 Jun 2024 10:56:39 +0200 Subject: [PATCH 3/3] add test --- core/models/openimis_graphql_test_case.py | 3 +++ core/tests/test_graphql.py | 26 ++++++++++++++++++++++- 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/core/models/openimis_graphql_test_case.py b/core/models/openimis_graphql_test_case.py index a1c8fe1..1354e14 100644 --- a/core/models/openimis_graphql_test_case.py +++ b/core/models/openimis_graphql_test_case.py @@ -15,6 +15,9 @@ class openIMISGraphQLTestCase(GraphQLTestCase): GRAPHQL_URL = f"/{settings.SITE_ROOT()}graphql" GRAPHQL_SCHEMA = True + class BaseTestContext: + def __init__(self, user): + self.user = user # client = None @classmethod def setUpClass(cls): diff --git a/core/tests/test_graphql.py b/core/tests/test_graphql.py index 64e26f6..6e9e225 100644 --- a/core/tests/test_graphql.py +++ b/core/tests/test_graphql.py @@ -1,5 +1,7 @@ from core.models.openimis_graphql_test_case import openIMISGraphQLTestCase from core.test_helpers import create_test_interactive_user +from graphql_jwt.shortcuts import get_token + import json class gqlTest(openIMISGraphQLTestCase): @@ -11,6 +13,7 @@ class gqlTest(openIMISGraphQLTestCase): def setUpClass(cls): super().setUpClass() cls.admin_user = create_test_interactive_user(username=cls.admin_username, password=cls.admin_password) + cls.admin_token = get_token(cls.admin_user, cls.BaseTestContext(user=cls.admin_user)) def test_login_successful(self): variables = { @@ -34,7 +37,7 @@ def test_login_successful(self): content = json.loads(response.content) - def test_login_deafult_successful(self): + def test_login_default_successful(self): variables = { "username": "Admin", "password": "admin123" @@ -74,4 +77,25 @@ def test_login_wrong_credentials(self): variables=variables ) self.assertResponseHasErrors(response) + content = json.loads(response.content) + + + def test_change_langue(self): + query = """ + mutation { + changeUserLanguage( + input: {clientMutationId: "b2a639a9-1a85-4643-bf84-69d05160c8ee", + clientMutationLabel: "Change User Language", + languageId: "fr"} + ) { + clientMutationId + internalId + } + } + """ + response = self.query( + query, + headers={"HTTP_AUTHORIZATION": f"Bearer {self.admin_token}"} + ) + self.assertResponseNoErrors(response) content = json.loads(response.content) \ No newline at end of file