diff --git a/kompassi-v2-frontend/src/__generated__/gql.ts b/kompassi-v2-frontend/src/__generated__/gql.ts index 535dc5ae8..bbea07f8a 100644 --- a/kompassi-v2-frontend/src/__generated__/gql.ts +++ b/kompassi-v2-frontend/src/__generated__/gql.ts @@ -100,7 +100,7 @@ type Documents = { "\n mutation DeleteProgramFormLanguage($input: DeleteSurveyLanguageInput!) {\n deleteSurveyLanguage(input: $input) {\n language\n }\n }\n": typeof types.DeleteProgramFormLanguageDocument, "\n mutation UpdateFormFieldsMutation($input: UpdateFormFieldsInput!) {\n updateFormFields(input: $input) {\n survey {\n slug\n }\n }\n }\n": typeof types.UpdateFormFieldsMutationDocument, "\n mutation PromoteProgramFormFieldToDimension(\n $input: PromoteFieldToDimensionInput!\n ) {\n promoteFieldToDimension(input: $input) {\n survey {\n slug\n }\n }\n }\n": typeof types.PromoteProgramFormFieldToDimensionDocument, - "\n query EditProgramFormFieldsPage(\n $eventSlug: String!\n $surveySlug: String!\n $language: String!\n $locale: String\n ) {\n event(slug: $eventSlug) {\n name\n slug\n\n program {\n eventAnnotations {\n isActive\n annotation {\n slug\n title(lang: $locale)\n isApplicableToProgramItems\n isApplicableToInvolvements\n }\n }\n }\n\n forms {\n survey(slug: $surveySlug, app: PROGRAM) {\n ...EditSurveyFieldsPage\n }\n }\n }\n }\n": typeof types.EditProgramFormFieldsPageDocument, + "\n query EditProgramFormFieldsPage(\n $eventSlug: String!\n $surveySlug: String!\n $language: String!\n $locale: String\n ) {\n event(slug: $eventSlug) {\n name\n slug\n\n program {\n eventAnnotations {\n isActive\n annotation {\n slug\n title(lang: $locale)\n isApplicableToProgramItems\n isApplicableToInvolvements\n }\n }\n }\n\n forms {\n survey(slug: $surveySlug, app: PROGRAM) {\n ...EditSurveyFieldsPage\n isInInvolvementUniverse\n }\n }\n }\n }\n": typeof types.EditProgramFormFieldsPageDocument, "\n fragment EditProgramFormLanguage on FullSurveyType {\n slug\n title(lang: $locale)\n canRemove\n canGrantAccess\n purpose\n\n form(lang: $language) {\n title\n language\n description\n thankYouMessage\n fields\n canRemove\n }\n\n languages {\n language\n }\n }\n": typeof types.EditProgramFormLanguageFragmentDoc, "\n query EditProgramFormLanguagePage(\n $eventSlug: String!\n $surveySlug: String!\n $language: String!\n $locale: String\n ) {\n event(slug: $eventSlug) {\n name\n slug\n\n forms {\n survey(slug: $surveySlug, app: PROGRAM) {\n ...EditProgramFormLanguage\n }\n }\n }\n }\n": typeof types.EditProgramFormLanguagePageDocument, "\n mutation CreateProgramFormLanguage($input: CreateSurveyLanguageInput!) {\n createSurveyLanguage(input: $input) {\n form {\n language\n }\n }\n }\n": typeof types.CreateProgramFormLanguageDocument, @@ -349,7 +349,7 @@ const documents: Documents = { "\n mutation DeleteProgramFormLanguage($input: DeleteSurveyLanguageInput!) {\n deleteSurveyLanguage(input: $input) {\n language\n }\n }\n": types.DeleteProgramFormLanguageDocument, "\n mutation UpdateFormFieldsMutation($input: UpdateFormFieldsInput!) {\n updateFormFields(input: $input) {\n survey {\n slug\n }\n }\n }\n": types.UpdateFormFieldsMutationDocument, "\n mutation PromoteProgramFormFieldToDimension(\n $input: PromoteFieldToDimensionInput!\n ) {\n promoteFieldToDimension(input: $input) {\n survey {\n slug\n }\n }\n }\n": types.PromoteProgramFormFieldToDimensionDocument, - "\n query EditProgramFormFieldsPage(\n $eventSlug: String!\n $surveySlug: String!\n $language: String!\n $locale: String\n ) {\n event(slug: $eventSlug) {\n name\n slug\n\n program {\n eventAnnotations {\n isActive\n annotation {\n slug\n title(lang: $locale)\n isApplicableToProgramItems\n isApplicableToInvolvements\n }\n }\n }\n\n forms {\n survey(slug: $surveySlug, app: PROGRAM) {\n ...EditSurveyFieldsPage\n }\n }\n }\n }\n": types.EditProgramFormFieldsPageDocument, + "\n query EditProgramFormFieldsPage(\n $eventSlug: String!\n $surveySlug: String!\n $language: String!\n $locale: String\n ) {\n event(slug: $eventSlug) {\n name\n slug\n\n program {\n eventAnnotations {\n isActive\n annotation {\n slug\n title(lang: $locale)\n isApplicableToProgramItems\n isApplicableToInvolvements\n }\n }\n }\n\n forms {\n survey(slug: $surveySlug, app: PROGRAM) {\n ...EditSurveyFieldsPage\n isInInvolvementUniverse\n }\n }\n }\n }\n": types.EditProgramFormFieldsPageDocument, "\n fragment EditProgramFormLanguage on FullSurveyType {\n slug\n title(lang: $locale)\n canRemove\n canGrantAccess\n purpose\n\n form(lang: $language) {\n title\n language\n description\n thankYouMessage\n fields\n canRemove\n }\n\n languages {\n language\n }\n }\n": types.EditProgramFormLanguageFragmentDoc, "\n query EditProgramFormLanguagePage(\n $eventSlug: String!\n $surveySlug: String!\n $language: String!\n $locale: String\n ) {\n event(slug: $eventSlug) {\n name\n slug\n\n forms {\n survey(slug: $surveySlug, app: PROGRAM) {\n ...EditProgramFormLanguage\n }\n }\n }\n }\n": types.EditProgramFormLanguagePageDocument, "\n mutation CreateProgramFormLanguage($input: CreateSurveyLanguageInput!) {\n createSurveyLanguage(input: $input) {\n form {\n language\n }\n }\n }\n": types.CreateProgramFormLanguageDocument, @@ -873,7 +873,7 @@ export function graphql(source: "\n mutation PromoteProgramFormFieldToDimension /** * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. */ -export function graphql(source: "\n query EditProgramFormFieldsPage(\n $eventSlug: String!\n $surveySlug: String!\n $language: String!\n $locale: String\n ) {\n event(slug: $eventSlug) {\n name\n slug\n\n program {\n eventAnnotations {\n isActive\n annotation {\n slug\n title(lang: $locale)\n isApplicableToProgramItems\n isApplicableToInvolvements\n }\n }\n }\n\n forms {\n survey(slug: $surveySlug, app: PROGRAM) {\n ...EditSurveyFieldsPage\n }\n }\n }\n }\n"): (typeof documents)["\n query EditProgramFormFieldsPage(\n $eventSlug: String!\n $surveySlug: String!\n $language: String!\n $locale: String\n ) {\n event(slug: $eventSlug) {\n name\n slug\n\n program {\n eventAnnotations {\n isActive\n annotation {\n slug\n title(lang: $locale)\n isApplicableToProgramItems\n isApplicableToInvolvements\n }\n }\n }\n\n forms {\n survey(slug: $surveySlug, app: PROGRAM) {\n ...EditSurveyFieldsPage\n }\n }\n }\n }\n"]; +export function graphql(source: "\n query EditProgramFormFieldsPage(\n $eventSlug: String!\n $surveySlug: String!\n $language: String!\n $locale: String\n ) {\n event(slug: $eventSlug) {\n name\n slug\n\n program {\n eventAnnotations {\n isActive\n annotation {\n slug\n title(lang: $locale)\n isApplicableToProgramItems\n isApplicableToInvolvements\n }\n }\n }\n\n forms {\n survey(slug: $surveySlug, app: PROGRAM) {\n ...EditSurveyFieldsPage\n isInInvolvementUniverse\n }\n }\n }\n }\n"): (typeof documents)["\n query EditProgramFormFieldsPage(\n $eventSlug: String!\n $surveySlug: String!\n $language: String!\n $locale: String\n ) {\n event(slug: $eventSlug) {\n name\n slug\n\n program {\n eventAnnotations {\n isActive\n annotation {\n slug\n title(lang: $locale)\n isApplicableToProgramItems\n isApplicableToInvolvements\n }\n }\n }\n\n forms {\n survey(slug: $surveySlug, app: PROGRAM) {\n ...EditSurveyFieldsPage\n isInInvolvementUniverse\n }\n }\n }\n }\n"]; /** * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. */ diff --git a/kompassi-v2-frontend/src/__generated__/graphql.ts b/kompassi-v2-frontend/src/__generated__/graphql.ts index fffb9d70e..d50797cab 100644 --- a/kompassi-v2-frontend/src/__generated__/graphql.ts +++ b/kompassi-v2-frontend/src/__generated__/graphql.ts @@ -1227,7 +1227,7 @@ export type EditProgramFormFieldsPageQueryVariables = Exact<{ }>; -export type EditProgramFormFieldsPageQuery = { event: { name: string, slug: string, program: { eventAnnotations: Array<{ isActive: boolean, annotation: { slug: string, title: string, isApplicableToProgramItems: boolean, isApplicableToInvolvements: boolean } }> } | null, forms: { survey: { slug: string, title: string | null, canRemove: boolean, canGrantAccess: boolean, purpose: SurveyPurpose, dimensions: Array<{ slug: string, canRemove: boolean, canAddValues: boolean, title: string | null, isPublic: boolean, isKeyDimension: boolean, isMultiValue: boolean, isListFilter: boolean, isShownInDetail: boolean, isNegativeSelection: boolean, isTechnical: boolean, valueOrdering: DimensionsDimensionValueOrderingChoices, titleFi: string, titleEn: string, titleSv: string, values: Array<{ slug: string, color: string, isTechnical: boolean, isSubjectLocked: boolean, canRemove: boolean, title: string | null, titleFi: string, titleEn: string, titleSv: string }> }>, form: { title: string, language: FormsFormLanguageChoices, fields: unknown, canRemove: boolean } | null, languages: Array<{ language: FormsFormLanguageChoices }> } | null } | null } | null }; +export type EditProgramFormFieldsPageQuery = { event: { name: string, slug: string, program: { eventAnnotations: Array<{ isActive: boolean, annotation: { slug: string, title: string, isApplicableToProgramItems: boolean, isApplicableToInvolvements: boolean } }> } | null, forms: { survey: { isInInvolvementUniverse: boolean, slug: string, title: string | null, canRemove: boolean, canGrantAccess: boolean, purpose: SurveyPurpose, dimensions: Array<{ slug: string, canRemove: boolean, canAddValues: boolean, title: string | null, isPublic: boolean, isKeyDimension: boolean, isMultiValue: boolean, isListFilter: boolean, isShownInDetail: boolean, isNegativeSelection: boolean, isTechnical: boolean, valueOrdering: DimensionsDimensionValueOrderingChoices, titleFi: string, titleEn: string, titleSv: string, values: Array<{ slug: string, color: string, isTechnical: boolean, isSubjectLocked: boolean, canRemove: boolean, title: string | null, titleFi: string, titleEn: string, titleSv: string }> }>, form: { title: string, language: FormsFormLanguageChoices, fields: unknown, canRemove: boolean } | null, languages: Array<{ language: FormsFormLanguageChoices }> } | null } | null } | null }; export type EditProgramFormLanguageFragment = { slug: string, title: string | null, canRemove: boolean, canGrantAccess: boolean, purpose: SurveyPurpose, form: { title: string, language: FormsFormLanguageChoices, description: string, thankYouMessage: string, fields: unknown, canRemove: boolean } | null, languages: Array<{ language: FormsFormLanguageChoices }> }; @@ -2282,7 +2282,7 @@ export const UpdateProgramFormLanguageDocument = {"kind":"Document","definitions export const DeleteProgramFormLanguageDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"DeleteProgramFormLanguage"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"input"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"DeleteSurveyLanguageInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"deleteSurveyLanguage"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"input"},"value":{"kind":"Variable","name":{"kind":"Name","value":"input"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"language"}}]}}]}}]} as unknown as DocumentNode; export const UpdateFormFieldsMutationDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"UpdateFormFieldsMutation"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"input"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"UpdateFormFieldsInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"updateFormFields"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"input"},"value":{"kind":"Variable","name":{"kind":"Name","value":"input"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"survey"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"slug"}}]}}]}}]}}]} as unknown as DocumentNode; export const PromoteProgramFormFieldToDimensionDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"PromoteProgramFormFieldToDimension"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"input"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"PromoteFieldToDimensionInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"promoteFieldToDimension"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"input"},"value":{"kind":"Variable","name":{"kind":"Name","value":"input"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"survey"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"slug"}}]}}]}}]}}]} as unknown as DocumentNode; -export const EditProgramFormFieldsPageDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"EditProgramFormFieldsPage"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"eventSlug"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"surveySlug"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"language"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"locale"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"event"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"slug"},"value":{"kind":"Variable","name":{"kind":"Name","value":"eventSlug"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"slug"}},{"kind":"Field","name":{"kind":"Name","value":"program"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"eventAnnotations"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"isActive"}},{"kind":"Field","name":{"kind":"Name","value":"annotation"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"slug"}},{"kind":"Field","name":{"kind":"Name","value":"title"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"lang"},"value":{"kind":"Variable","name":{"kind":"Name","value":"locale"}}}]},{"kind":"Field","name":{"kind":"Name","value":"isApplicableToProgramItems"}},{"kind":"Field","name":{"kind":"Name","value":"isApplicableToInvolvements"}}]}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"forms"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"survey"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"slug"},"value":{"kind":"Variable","name":{"kind":"Name","value":"surveySlug"}}},{"kind":"Argument","name":{"kind":"Name","value":"app"},"value":{"kind":"EnumValue","value":"PROGRAM"}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"EditSurveyFieldsPage"}}]}}]}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"DimensionEditorValue"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"DimensionValueType"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"slug"}},{"kind":"Field","name":{"kind":"Name","value":"color"}},{"kind":"Field","name":{"kind":"Name","value":"isTechnical"}},{"kind":"Field","name":{"kind":"Name","value":"isSubjectLocked"}},{"kind":"Field","name":{"kind":"Name","value":"canRemove"}},{"kind":"Field","name":{"kind":"Name","value":"title"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"lang"},"value":{"kind":"Variable","name":{"kind":"Name","value":"locale"}}}]},{"kind":"Field","name":{"kind":"Name","value":"titleFi"}},{"kind":"Field","name":{"kind":"Name","value":"titleEn"}},{"kind":"Field","name":{"kind":"Name","value":"titleSv"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"DimensionEditor"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"FullDimensionType"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"slug"}},{"kind":"Field","name":{"kind":"Name","value":"canRemove"}},{"kind":"Field","name":{"kind":"Name","value":"canAddValues"}},{"kind":"Field","name":{"kind":"Name","value":"title"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"lang"},"value":{"kind":"Variable","name":{"kind":"Name","value":"locale"}}}]},{"kind":"Field","name":{"kind":"Name","value":"isPublic"}},{"kind":"Field","name":{"kind":"Name","value":"isKeyDimension"}},{"kind":"Field","name":{"kind":"Name","value":"isMultiValue"}},{"kind":"Field","name":{"kind":"Name","value":"isListFilter"}},{"kind":"Field","name":{"kind":"Name","value":"isShownInDetail"}},{"kind":"Field","name":{"kind":"Name","value":"isNegativeSelection"}},{"kind":"Field","name":{"kind":"Name","value":"isTechnical"}},{"kind":"Field","name":{"kind":"Name","value":"valueOrdering"}},{"kind":"Field","name":{"kind":"Name","value":"titleFi"}},{"kind":"Field","name":{"kind":"Name","value":"titleEn"}},{"kind":"Field","name":{"kind":"Name","value":"titleSv"}},{"kind":"Field","name":{"kind":"Name","value":"values"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"DimensionEditorValue"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"EditSurveyFieldsPage"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"FullSurveyType"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"slug"}},{"kind":"Field","name":{"kind":"Name","value":"title"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"lang"},"value":{"kind":"Variable","name":{"kind":"Name","value":"locale"}}}]},{"kind":"Field","name":{"kind":"Name","value":"canRemove"}},{"kind":"Field","name":{"kind":"Name","value":"canGrantAccess"}},{"kind":"Field","name":{"kind":"Name","value":"purpose"}},{"kind":"Field","name":{"kind":"Name","value":"dimensions"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"DimensionEditor"}}]}},{"kind":"Field","name":{"kind":"Name","value":"form"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"lang"},"value":{"kind":"Variable","name":{"kind":"Name","value":"language"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"language"}},{"kind":"Field","name":{"kind":"Name","value":"fields"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"enrich"},"value":{"kind":"BooleanValue","value":false}}]},{"kind":"Field","name":{"kind":"Name","value":"canRemove"}}]}},{"kind":"Field","name":{"kind":"Name","value":"languages"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"language"}}]}}]}}]} as unknown as DocumentNode; +export const EditProgramFormFieldsPageDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"EditProgramFormFieldsPage"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"eventSlug"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"surveySlug"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"language"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"locale"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"event"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"slug"},"value":{"kind":"Variable","name":{"kind":"Name","value":"eventSlug"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"slug"}},{"kind":"Field","name":{"kind":"Name","value":"program"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"eventAnnotations"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"isActive"}},{"kind":"Field","name":{"kind":"Name","value":"annotation"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"slug"}},{"kind":"Field","name":{"kind":"Name","value":"title"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"lang"},"value":{"kind":"Variable","name":{"kind":"Name","value":"locale"}}}]},{"kind":"Field","name":{"kind":"Name","value":"isApplicableToProgramItems"}},{"kind":"Field","name":{"kind":"Name","value":"isApplicableToInvolvements"}}]}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"forms"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"survey"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"slug"},"value":{"kind":"Variable","name":{"kind":"Name","value":"surveySlug"}}},{"kind":"Argument","name":{"kind":"Name","value":"app"},"value":{"kind":"EnumValue","value":"PROGRAM"}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"EditSurveyFieldsPage"}},{"kind":"Field","name":{"kind":"Name","value":"isInInvolvementUniverse"}}]}}]}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"DimensionEditorValue"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"DimensionValueType"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"slug"}},{"kind":"Field","name":{"kind":"Name","value":"color"}},{"kind":"Field","name":{"kind":"Name","value":"isTechnical"}},{"kind":"Field","name":{"kind":"Name","value":"isSubjectLocked"}},{"kind":"Field","name":{"kind":"Name","value":"canRemove"}},{"kind":"Field","name":{"kind":"Name","value":"title"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"lang"},"value":{"kind":"Variable","name":{"kind":"Name","value":"locale"}}}]},{"kind":"Field","name":{"kind":"Name","value":"titleFi"}},{"kind":"Field","name":{"kind":"Name","value":"titleEn"}},{"kind":"Field","name":{"kind":"Name","value":"titleSv"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"DimensionEditor"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"FullDimensionType"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"slug"}},{"kind":"Field","name":{"kind":"Name","value":"canRemove"}},{"kind":"Field","name":{"kind":"Name","value":"canAddValues"}},{"kind":"Field","name":{"kind":"Name","value":"title"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"lang"},"value":{"kind":"Variable","name":{"kind":"Name","value":"locale"}}}]},{"kind":"Field","name":{"kind":"Name","value":"isPublic"}},{"kind":"Field","name":{"kind":"Name","value":"isKeyDimension"}},{"kind":"Field","name":{"kind":"Name","value":"isMultiValue"}},{"kind":"Field","name":{"kind":"Name","value":"isListFilter"}},{"kind":"Field","name":{"kind":"Name","value":"isShownInDetail"}},{"kind":"Field","name":{"kind":"Name","value":"isNegativeSelection"}},{"kind":"Field","name":{"kind":"Name","value":"isTechnical"}},{"kind":"Field","name":{"kind":"Name","value":"valueOrdering"}},{"kind":"Field","name":{"kind":"Name","value":"titleFi"}},{"kind":"Field","name":{"kind":"Name","value":"titleEn"}},{"kind":"Field","name":{"kind":"Name","value":"titleSv"}},{"kind":"Field","name":{"kind":"Name","value":"values"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"DimensionEditorValue"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"EditSurveyFieldsPage"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"FullSurveyType"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"slug"}},{"kind":"Field","name":{"kind":"Name","value":"title"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"lang"},"value":{"kind":"Variable","name":{"kind":"Name","value":"locale"}}}]},{"kind":"Field","name":{"kind":"Name","value":"canRemove"}},{"kind":"Field","name":{"kind":"Name","value":"canGrantAccess"}},{"kind":"Field","name":{"kind":"Name","value":"purpose"}},{"kind":"Field","name":{"kind":"Name","value":"dimensions"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"DimensionEditor"}}]}},{"kind":"Field","name":{"kind":"Name","value":"form"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"lang"},"value":{"kind":"Variable","name":{"kind":"Name","value":"language"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"language"}},{"kind":"Field","name":{"kind":"Name","value":"fields"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"enrich"},"value":{"kind":"BooleanValue","value":false}}]},{"kind":"Field","name":{"kind":"Name","value":"canRemove"}}]}},{"kind":"Field","name":{"kind":"Name","value":"languages"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"language"}}]}}]}}]} as unknown as DocumentNode; export const EditProgramFormLanguagePageDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"EditProgramFormLanguagePage"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"eventSlug"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"surveySlug"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"language"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"locale"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"event"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"slug"},"value":{"kind":"Variable","name":{"kind":"Name","value":"eventSlug"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"slug"}},{"kind":"Field","name":{"kind":"Name","value":"forms"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"survey"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"slug"},"value":{"kind":"Variable","name":{"kind":"Name","value":"surveySlug"}}},{"kind":"Argument","name":{"kind":"Name","value":"app"},"value":{"kind":"EnumValue","value":"PROGRAM"}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"EditProgramFormLanguage"}}]}}]}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"EditProgramFormLanguage"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"FullSurveyType"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"slug"}},{"kind":"Field","name":{"kind":"Name","value":"title"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"lang"},"value":{"kind":"Variable","name":{"kind":"Name","value":"locale"}}}]},{"kind":"Field","name":{"kind":"Name","value":"canRemove"}},{"kind":"Field","name":{"kind":"Name","value":"canGrantAccess"}},{"kind":"Field","name":{"kind":"Name","value":"purpose"}},{"kind":"Field","name":{"kind":"Name","value":"form"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"lang"},"value":{"kind":"Variable","name":{"kind":"Name","value":"language"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"language"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"thankYouMessage"}},{"kind":"Field","name":{"kind":"Name","value":"fields"}},{"kind":"Field","name":{"kind":"Name","value":"canRemove"}}]}},{"kind":"Field","name":{"kind":"Name","value":"languages"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"language"}}]}}]}}]} as unknown as DocumentNode; export const CreateProgramFormLanguageDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"CreateProgramFormLanguage"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"input"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"CreateSurveyLanguageInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"createSurveyLanguage"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"input"},"value":{"kind":"Variable","name":{"kind":"Name","value":"input"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"form"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"language"}}]}}]}}]}}]} as unknown as DocumentNode; export const UpdateProgramFormMutationDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"UpdateProgramFormMutation"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"input"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"UpdateSurveyInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"updateProgramForm"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"input"},"value":{"kind":"Variable","name":{"kind":"Name","value":"input"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"survey"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"slug"}}]}}]}}]}}]} as unknown as DocumentNode; diff --git a/kompassi-v2-frontend/src/app/[locale]/[eventSlug]/program-forms/[surveySlug]/edit/[language]/fields/page.tsx b/kompassi-v2-frontend/src/app/[locale]/[eventSlug]/program-forms/[surveySlug]/edit/[language]/fields/page.tsx index ad22e1a3f..650ba63d9 100644 --- a/kompassi-v2-frontend/src/app/[locale]/[eventSlug]/program-forms/[surveySlug]/edit/[language]/fields/page.tsx +++ b/kompassi-v2-frontend/src/app/[locale]/[eventSlug]/program-forms/[surveySlug]/edit/[language]/fields/page.tsx @@ -37,6 +37,7 @@ const query = graphql(` forms { survey(slug: $surveySlug, app: PROGRAM) { ...EditSurveyFieldsPage + isInInvolvementUniverse } } } @@ -134,11 +135,7 @@ export default async function EditProgramFormFieldsPage(props: Props) { initialFields={form.fields} dimensions={dimensions} annotations={annotations} - formContext={ - survey.purpose === "DEFAULT" || survey.purpose === "INVITE" - ? "program" - : "involvement" - } + formContext={survey.isInInvolvementUniverse ? "involvement" : "program"} messages={{ FormEditor: translations.FormEditor, SchemaForm: translations.SchemaForm, diff --git a/kompassi/dimensions/models/universe.py b/kompassi/dimensions/models/universe.py index d0c8fc0ae..dd6efdbe6 100644 --- a/kompassi/dimensions/models/universe.py +++ b/kompassi/dimensions/models/universe.py @@ -81,20 +81,7 @@ def annotations(self) -> models.QuerySet[Annotation]: def surveys(self): from kompassi.forms.models.survey import Survey - match self.app: - case DimensionApp.FORMS: - return Survey.objects.filter( - event=self.scope.event, - slug=self.slug, - app=self.app, - ) - case DimensionApp.PROGRAM: - return Survey.objects.filter( - event=self.scope.event, - app=self.app, - ) - case _: - raise ValueError(f"Unknown app type: {self.app}") + return Survey.objects.filter(universe=self) def clone(self, *, scope: Scope, slug: str) -> Universe: """ diff --git a/kompassi/forms/graphql/survey_full.py b/kompassi/forms/graphql/survey_full.py index 1d229dc3b..556fa9ad2 100644 --- a/kompassi/forms/graphql/survey_full.py +++ b/kompassi/forms/graphql/survey_full.py @@ -236,6 +236,14 @@ def resolve_languages(parent: Survey, info): # TODO supported_languages order instead of alphabetical? return parent.languages.order_by("language") + is_in_involvement_universe = graphene.NonNull( + graphene.Boolean, + description=( + "Whether the fields of this survey describe the involvement (eg. the program host) " + "and not the app object (eg. the program item)." + ), + ) + # TODO unify can_remove/can_delete naming across all apps @staticmethod def resolve_can_remove(survey: Survey, info): diff --git a/kompassi/forms/models/survey.py b/kompassi/forms/models/survey.py index 93aa9bebc..c229961d3 100644 --- a/kompassi/forms/models/survey.py +++ b/kompassi/forms/models/survey.py @@ -245,10 +245,21 @@ def _get_universe(self) -> Universe: app=self.app, )[0] case DimensionApp.PROGRAM: + # Invite fields describe the program host, not the program item. + if self.purpose == SurveyPurpose.INVITE: + return self.event.involvement_universe return self.event.program_universe case _: raise NotImplementedError(self.app) + @property + def is_in_involvement_universe(self) -> bool: + """ + False for program invite surveys created before they moved to the involvement universe. + Those cannot pass values forward to the involvement. + """ + return self.universe.app == DimensionApp.INVOLVEMENT + @cached_property def workflow(self) -> Workflow: """ @@ -432,7 +443,7 @@ def clone( Clones this survey with its language versions (but not responses). A stand-alone survey (app=FORMS) gets a fresh clone of this survey's Universe, including its dimensions and values. A program form (app=PROGRAM) uses the target event's shared - program Universe as is; no dimension cloning applies there. + program Universe (an invite uses the involvement Universe) as is; no dimension cloning applies there. Some fields are not copied over because they make no sense or might cause data leaks. """ survey = Survey( @@ -471,8 +482,8 @@ def set_default_response_dimension_values( ): from .survey_default_response_dimension_value import SurveyDefaultResponseDimensionValue - if cache.universe.app != self.app: - raise AssertionError(f"Expected cache universe to match survey app ({cache.universe.app} != {self.app})") + if cache.universe.id != self.universe_id: + raise AssertionError(f"Expected cache to be of the survey universe ({cache.universe} != {self.universe})") set_dimension_values(SurveyDefaultResponseDimensionValue, self, values_to_set, cache) diff --git a/kompassi/forms/tests.py b/kompassi/forms/tests.py index cafb2e840..90159e664 100644 --- a/kompassi/forms/tests.py +++ b/kompassi/forms/tests.py @@ -2123,3 +2123,29 @@ def test_extract_annotations_ignores_annotations_not_applicable_to_the_universe( ] assert extract_annotations_from_responses([response], universe_annotations) == {"test:programNote": "x"} + + +@pytest.mark.django_db +def test_extract_dimension_values_uses_only_marked_fields(): + from .utils.extract_dimension_values import extract_dimension_values_from_response + + event, _ = Event.get_or_create_dummy() + survey = Survey(event=event, slug="dims", app=DimensionApp.FORMS, purpose=SurveyPurpose.DEFAULT) + survey.with_mandatory_fields().save() + dimension = Dimension.objects.create(universe=survey.universe, slug="kind") + for value_slug in ("a", "b"): + DimensionValue.objects.create(dimension=dimension, slug=value_slug) + + form = Form.objects.create( + event=event, + survey=survey, + language="en", + fields=[ + dict(slug="marked", type="DimensionSingleSelect", dimension="kind", propagateDimensionOnCreate=True), + dict(slug="unmarked", type="DimensionSingleSelect", dimension="kind"), + ], + ) + response = Response.objects.create(form=form, form_data={"marked": "a", "unmarked": "b"}) + + assert extract_dimension_values_from_response(response) == {"kind": ["a"]} + assert extract_dimension_values_from_response(response, on_edit=True) == {} diff --git a/kompassi/forms/utils/extract_dimension_values.py b/kompassi/forms/utils/extract_dimension_values.py new file mode 100644 index 000000000..173f96680 --- /dev/null +++ b/kompassi/forms/utils/extract_dimension_values.py @@ -0,0 +1,46 @@ +import logging +from collections import defaultdict + +from ..models.response import Response +from .lift_dimension_values import get_dimension_field_value_slugs + +logger = logging.getLogger(__name__) + + +def extract_dimension_values_from_response( + response: Response, + *, + on_edit: bool = False, +) -> dict[str, list[str]]: + """ + Returns the dimension values that the fields of the response mark for passing forward. + Values come from the marked fields only, not from other fields feeding the same dimension. + Only meaningful when the survey universe is the one the values are passed forward into. + """ + fields = [ + field + for field in response.form.validated_fields + if field.dimension + and field.type.is_dimension_field + and (field.propagate_dimension_on_edit if on_edit else field.propagate_dimension_on_create) + ] + if not fields: + return {} + + values, warnings = response.get_processed_form_data(fields) + result: defaultdict[str, list[str]] = defaultdict(list) + + for field in fields: + if warnings.get(field.slug): + continue + + value_slugs = get_dimension_field_value_slugs( + field, + values, + dict(response=response.id, field=field.slug, dimension=field.dimension), + ) + for value_slug in value_slugs or []: + if value_slug not in result[str(field.dimension)]: + result[str(field.dimension)].append(value_slug) + + return dict(result) diff --git a/kompassi/forms/utils/lift_dimension_values.py b/kompassi/forms/utils/lift_dimension_values.py index 5002d1273..bc76e8452 100644 --- a/kompassi/forms/utils/lift_dimension_values.py +++ b/kompassi/forms/utils/lift_dimension_values.py @@ -2,6 +2,7 @@ import logging from collections import defaultdict +from typing import Any from kompassi.dimensions.utils.dimension_cache import DimensionCache @@ -71,23 +72,8 @@ def lift_dimension_values( ) continue - value_slugs: list[str] - match field.type: - case FieldType.DIMENSION_MULTI_SELECT: - value_slugs = values.get(field.slug, []) - case FieldType.DIMENSION_SINGLE_SELECT: - value_slugs = [value_slug] if (value_slug := values.get(field.slug)) else [] - case FieldType.DIMENSION_SINGLE_CHECKBOX: - value_slugs = ["true"] if values.get(field.slug) else ["false"] - case _: - logger.warning("Unexpected field type for dimension field: %s", log_context) - continue - - if not isinstance(value_slugs, list): - logger.warning( - "Expected list of value slugs for dimension field: %s", - dict(log_context, value_slugs=value_slugs), - ) + value_slugs = get_dimension_field_value_slugs(field, values, log_context) + if value_slugs is None: continue for value_slug in value_slugs: @@ -104,3 +90,34 @@ def lift_dimension_values( response.set_dimension_values(values_to_set, cache) return values_to_set + + +def get_dimension_field_value_slugs( + field: Field, + values: dict[str, Any], + log_context: dict[str, Any], +) -> list[str] | None: + """ + Normalizes the processed form data value of a Dimension* field into a list of value slugs. + Returns None if the value cannot be interpreted. + """ + value_slugs: list[str] + match field.type: + case FieldType.DIMENSION_MULTI_SELECT: + value_slugs = values.get(field.slug, []) + case FieldType.DIMENSION_SINGLE_SELECT: + value_slugs = [value_slug] if (value_slug := values.get(field.slug)) else [] + case FieldType.DIMENSION_SINGLE_CHECKBOX: + value_slugs = ["true"] if values.get(field.slug) else ["false"] + case _: + logger.warning("Unexpected field type for dimension field: %s", log_context) + return None + + if not isinstance(value_slugs, list): + logger.warning( + "Expected list of value slugs for dimension field: %s", + dict(log_context, value_slugs=value_slugs), + ) + return None + + return value_slugs diff --git a/kompassi/involvement/models/involvement.py b/kompassi/involvement/models/involvement.py index 44f236721..4165dd497 100644 --- a/kompassi/involvement/models/involvement.py +++ b/kompassi/involvement/models/involvement.py @@ -489,6 +489,18 @@ def from_accepted_invitation( app = involvement_type.app is_active = response.survey.workflow.is_response_active(response) + from kompassi.forms.utils.extract_annotations import extract_annotations_from_responses + from kompassi.forms.utils.extract_dimension_values import extract_dimension_values_from_response + + passed_forward_dimensions: dict[str, list[str]] = {} + passed_forward_annotations: CachedAnnotations = {} + if response.survey.is_in_involvement_universe: + passed_forward_dimensions = extract_dimension_values_from_response(response) + passed_forward_annotations = extract_annotations_from_responses( + [response], + cache.universe.active_universe_annotations.all(), + ) + involvement, created = cls.objects.update_or_create( universe=cache.universe, person=response.original_created_by.person, # type: ignore @@ -503,10 +515,12 @@ def from_accepted_invitation( ), ) + involvement.annotations = {**involvement.annotations, **passed_forward_annotations} involvement.with_computed_fields().save() if created or override_dimensions: dimensions = validate_cached_dimensions(response.survey.cached_default_involvement_dimensions) + dimensions.update(passed_forward_dimensions) dimensions.update(validate_cached_dimensions(invitation.cached_dimensions)) involvement.refresh_dimensions(dimensions, cache=cache) else: diff --git a/kompassi/program_v2/tests.py b/kompassi/program_v2/tests.py index eb6c42105..dcd738986 100644 --- a/kompassi/program_v2/tests.py +++ b/kompassi/program_v2/tests.py @@ -7,7 +7,9 @@ from kompassi.access.models.email_alias_domain import EmailAliasDomain from kompassi.core.models.person import Person from kompassi.dimensions.models.annotation import Annotation -from kompassi.dimensions.models.enums import DimensionApp +from kompassi.dimensions.models.dimension import Dimension +from kompassi.dimensions.models.dimension_value import DimensionValue +from kompassi.dimensions.models.enums import AnnotationAppliesTo, AnnotationDataType, DimensionApp from kompassi.dimensions.models.universe_annotation import UniverseAnnotation from kompassi.forms.models.enums import SurveyPurpose from kompassi.forms.models.form import Form @@ -225,6 +227,8 @@ def test_extract_annotations(): slug="accept-program-invitation", app=DimensionApp.PROGRAM, purpose=SurveyPurpose.INVITE, + # legacy: invites used to live in the program universe + universe=event.program_universe, ).with_mandatory_fields() accept_invitation.save() accept_invitation.workflow.handle_new_survey() @@ -390,3 +394,103 @@ def test_schedule_public_from(): meta.save(update_fields=["public_from"]) meta.refresh_from_db() assert meta.is_schedule_public + + +@pytest.mark.django_db +def test_invite_survey_lives_in_involvement_universe_and_passes_values_forward(): + meta, _ = ProgramV2EventMeta.get_or_create_dummy() + event = meta.event + EmailAliasDomain.get_or_create_dummy() + + person, _ = Person.get_or_create_dummy() + person2, _ = Person.get_or_create_dummy(another=True, superuser=False) + + offer = Survey(event=event, slug="offer", app=DimensionApp.PROGRAM, purpose=SurveyPurpose.DEFAULT) + offer.with_mandatory_fields().save() + offer.workflow.handle_new_survey() + offer_en = Form( + event=event, + survey=offer, + language="en", + fields=[dict(slug="title", title="Title", type="SingleLineText", required=True)], + ) + offer_en.save() + offer.workflow.handle_form_update() + + invite = Survey(event=event, slug="invite", app=DimensionApp.PROGRAM, purpose=SurveyPurpose.INVITE) + invite.with_mandatory_fields().save() + invite.workflow.handle_new_survey() + assert invite.universe == event.involvement_universe + assert invite.is_in_involvement_universe + assert offer.universe == event.program_universe + + annotation = Annotation.objects.create( + slug="test:hostNote", + type=AnnotationDataType.STRING, + applies_to=AnnotationAppliesTo.INVOLVEMENT, + ) + UniverseAnnotation.objects.create(universe=invite.universe, annotation=annotation) + + dimension = Dimension.objects.create(universe=invite.universe, slug="host-kind") + DimensionValue.objects.create(dimension=dimension, slug="gm", title_en="GM") + + invite_en = Form( + event=event, + survey=invite, + language="en", + fields=[ + dict(slug="note", title="Note", type="SingleLineText", propagateToAnnotation="test:hostNote"), + dict( + slug="kind", + title="Kind", + type="DimensionSingleSelect", + dimension="host-kind", + propagateDimensionOnCreate=True, + ), + ], + ) + invite_en.save() + invite.workflow.handle_form_update() + + with transaction.atomic(): + program_offer = Response.objects.create( + form=offer_en, + form_data={"title": "Test program"}, + revision_created_by=person.user, + ip_address="127.0.0.1", + sequence_number=offer.get_next_sequence_number(), + ) + offer.workflow.handle_new_response_phase1(program_offer) + offer.workflow.handle_new_response_phase2(program_offer) + program = Program.from_program_offer(program_offer) + + invitation = program.invite_program_host( + person2.email, + survey=invite, + language="en", + involvement_dimensions={}, + ) + + with transaction.atomic(): + response = Response.objects.create( + form=invite_en, + form_data={"note": "hello", "kind": "gm"}, + revision_created_by=person2.user, + ip_address="127.0.0.1", + sequence_number=invite.get_next_sequence_number(), + ) + invite.workflow.handle_new_response_phase1(response) + invitation.mark_used() + involvement = Involvement.from_accepted_invitation( + response=response, + invitation=invitation, + cache=event.involvement_universe.preload_dimensions(), + ) + invite.workflow.handle_new_response_phase2(response) + + assert response.cached_dimensions["host-kind"] == ["gm"] + assert involvement.annotations["test:hostNote"] == "hello" + assert involvement.cached_dimensions["host-kind"] == ["gm"] + + program.refresh_from_db() + assert "test:hostNote" not in program.annotations diff --git a/kompassi/program_v2/workflows/program_host_invitation.py b/kompassi/program_v2/workflows/program_host_invitation.py index 27562820c..e5865e1e0 100644 --- a/kompassi/program_v2/workflows/program_host_invitation.py +++ b/kompassi/program_v2/workflows/program_host_invitation.py @@ -8,7 +8,8 @@ class ProgramHostInvitationWorkflow(Workflow): """ - Note that the Universe for program host invitations is the Involvement universe. + Program host invitations created after the Involvement universe became their home live in it; + older ones (see Survey.is_in_involvement_universe) still live in the program universe. XXX This Workflow is silly because everything is handled in accept_invitation.py. """ @@ -64,6 +65,10 @@ def handle_new_response_phase2( if program is None: raise AssertionError("No it isn't (appease typechecker)") + if response.survey.is_in_involvement_universe: + # the fields describe the host; Involvement.from_accepted_invitation passed them forward + return + program.refresh_annotations( extract_annotations_from_responses( program.responses.all(),