diff --git a/backend/apps/api/v1/graphql.py b/backend/apps/api/v1/graphql.py index 4c0795a42..a19cc12bf 100644 --- a/backend/apps/api/v1/graphql.py +++ b/backend/apps/api/v1/graphql.py @@ -1,9 +1,9 @@ # -*- coding: utf-8 -*- -from graphene import UUID, Boolean, Float, List, ObjectType, String +from graphene import UUID, Boolean, Float, List, Mutation, ObjectType, String from graphene_django import DjangoObjectType -from backend.apps.api.v1.models import Table, TableNeighbor +from backend.apps.api.v1.models import Column, ObservationLevel, Table, TableNeighbor from backend.apps.api.v1.sql_generator import OneBigTableQueryGenerator from backend.custom.graphql_base import PlainTextNode @@ -39,6 +39,42 @@ def resolve_score(root, info): return root.score +class ReorderTables(Mutation): + """Set display order for tables within a dataset. + ids: ordered list of table UUIDs (index 0 = first).""" + + class Arguments: + ids = List(UUID, required=True) + + ok = Boolean() + errors = List(String) + + def mutate(root, info, ids): + if not info.context.user.is_staff: + return ReorderTables(ok=False, errors=["Permission denied"]) + for i, table_id in enumerate(ids): + Table.objects.filter(pk=table_id).update(order=i) + return ReorderTables(ok=True, errors=[]) + + +class ReorderObservationLevels(Mutation): + """Set display order for observation levels within a table. + ids: ordered list of ObservationLevel UUIDs (index 0 = first).""" + + class Arguments: + ids = List(UUID, required=True) + + ok = Boolean() + errors = List(String) + + def mutate(root, info, ids): + if not info.context.user.is_staff: + return ReorderObservationLevels(ok=False, errors=["Permission denied"]) + for i, ol_id in enumerate(ids): + ObservationLevel.objects.filter(pk=ol_id).update(order=i) + return ReorderObservationLevels(ok=True, errors=[]) + + class Query(ObjectType): get_table_neighbor = List( TableNeighborNode, @@ -63,3 +99,27 @@ def resolve_get_table_one_big_table_query( table, columns, include_table_translation ) return sql_query + + +class ReorderColumns(Mutation): + """Set display order for columns within a table. + ids: ordered list of Column UUIDs (index 0 = first).""" + + class Arguments: + ids = List(UUID, required=True) + + ok = Boolean() + errors = List(String) + + def mutate(root, info, ids): + if not info.context.user.is_staff: + return ReorderColumns(ok=False, errors=["Permission denied"]) + for i, col_id in enumerate(ids): + Column.objects.filter(pk=col_id).update(order=i) + return ReorderColumns(ok=True, errors=[]) + + +class APIMutation: + reorder_tables = ReorderTables.Field() + reorder_observation_levels = ReorderObservationLevels.Field() + reorder_columns = ReorderColumns.Field() diff --git a/backend/apps/schema.py b/backend/apps/schema.py index 1e833d65c..4ef832d4f 100644 --- a/backend/apps/schema.py +++ b/backend/apps/schema.py @@ -2,6 +2,7 @@ from backend.apps.account.graphql import AccountMutation from backend.apps.account_payment.graphql import Mutation as PaymentMutation from backend.apps.account_payment.graphql import Query as PaymentQuery +from backend.apps.api.v1.graphql import APIMutation from backend.apps.api.v1.graphql import Query as APIQuery from backend.apps.user_notifications.graphql import ( DeactivateAllTableUpdateNotification, @@ -16,6 +17,7 @@ extra_queries=[APIQuery, PaymentQuery, UserNotificationQuery], extra_mutations=[ AccountMutation, + APIMutation, PaymentMutation, TableUpdateNotification, DeactivateTableUpdateNotification, diff --git a/backend/custom/graphql_auto.py b/backend/custom/graphql_auto.py index 48462b434..7b021d4dc 100644 --- a/backend/custom/graphql_auto.py +++ b/backend/custom/graphql_auto.py @@ -429,6 +429,13 @@ def __init_subclass_with_meta__( _meta=_meta, input_fields=input_fields, **options ) + @classmethod + def perform_mutate(cls, form, info): + obj = form.save(commit=False) + obj.save() + form.save_m2m() + return cls(errors=[], **{cls._meta.return_field_name: obj}) + @classmethod def get_form_kwargs(cls, root, info, **input): # Get file data diff --git a/charts/basedosdados-api/templates/deployment.yaml b/charts/basedosdados-api/templates/deployment.yaml index c4a05a7aa..f40c079f8 100644 --- a/charts/basedosdados-api/templates/deployment.yaml +++ b/charts/basedosdados-api/templates/deployment.yaml @@ -90,5 +90,3 @@ spec: items: - key: GCP_SA path: gcp-sa.json - - key: CHATBOT_SA - path: chatbot-sa.json