Skip to content
Snippets Groups Projects
Verified Commit 29309413 authored by Jonathan Weth's avatar Jonathan Weth :keyboard:
Browse files

Add dedicated button for publishing validity ranges

parent 1f2ee1bc
No related branches found
No related tags found
1 merge request!23Resolve "Improve publishing process of validity ranges"
<template>
<ApolloMutation
v-if="item.status !== 'PUBLISHED'"
:mutation="publishValidityRange"
:variables="{ id: item.id }"
@done="onDone"
tag="span"
>
<template #default="{ mutate, loading, error }">
<confirm-dialog v-model="confirmDialog" @confirm="mutate()">
<template #title>
{{ $t("lesrooster.validity_range.publish.confirm_title", item) }}
</template>
<template #text>
{{
$t("lesrooster.validity_range.publish.confirm_explanation", item)
}}
</template>
<template #confirm>
{{ $t("lesrooster.validity_range.publish.confirm_button") }}
</template>
</confirm-dialog>
<secondary-action-button
icon-text="mdi-publish"
i18n-key="lesrooster.validity_range.publish.button"
@click="confirmDialog = true"
:loading="loading"
></secondary-action-button>
</template>
</ApolloMutation>
</template>
<script setup>
import SecondaryActionButton from "aleksis.core/components/generic/buttons/SecondaryActionButton.vue";
import ConfirmDialog from "aleksis.core/components/generic/dialogs/ConfirmDialog.vue";
</script>
<script>
import { publishValidityRange } from "./validityRange.graphql";
export default {
name: "PublishValidityRange",
data() {
return {
confirmDialog: false,
};
},
methods: {
onDone() {
console.log("ON DONE RUN");
this.$activateFrequentCeleryPolling();
},
},
props: {
item: {
type: Object,
required: true,
},
},
};
</script>
...@@ -9,6 +9,7 @@ import DialogObjectForm from "aleksis.core/components/generic/dialogs/DialogObje ...@@ -9,6 +9,7 @@ import DialogObjectForm from "aleksis.core/components/generic/dialogs/DialogObje
import DeleteDialog from "aleksis.core/components/generic/dialogs/DeleteDialog.vue"; import DeleteDialog from "aleksis.core/components/generic/dialogs/DeleteDialog.vue";
import ValidityRangeStatusField from "./ValidityRangeStatusField.vue"; import ValidityRangeStatusField from "./ValidityRangeStatusField.vue";
import ValidityRangeStatusChip from "./ValidityRangeStatusChip.vue"; import ValidityRangeStatusChip from "./ValidityRangeStatusChip.vue";
import PublishValidityRange from "./PublishValidityRange.vue";
</script> </script>
<template> <template>
...@@ -108,6 +109,10 @@ import ValidityRangeStatusChip from "./ValidityRangeStatusChip.vue"; ...@@ -108,6 +109,10 @@ import ValidityRangeStatusChip from "./ValidityRangeStatusChip.vue";
/> />
</template> </template>
<template #actions="{ item }">
<publish-validity-range :item="item" />
</template>
<template #expanded-item="{ item }"> <template #expanded-item="{ item }">
<v-sheet class="my-4"> <v-sheet class="my-4">
<message-box type="error" v-if="item.timeGrids.length === 0"> <message-box type="error" v-if="item.timeGrids.length === 0">
......
...@@ -80,6 +80,32 @@ mutation updateValidityRanges($input: [BatchPatchValidityRangeInput]!) { ...@@ -80,6 +80,32 @@ mutation updateValidityRanges($input: [BatchPatchValidityRangeInput]!) {
} }
} }
mutation publishValidityRange($id: ID!) {
publishValidityRange(id: $id) {
validityRange {
id
name
status
schoolTerm {
id
name
}
timeGrids {
id
group {
id
name
shortName
}
}
dateStart
dateEnd
canEdit
canDelete
}
}
}
query currentValidityRange { query currentValidityRange {
currentValidityRange { currentValidityRange {
id id
......
...@@ -14,6 +14,12 @@ ...@@ -14,6 +14,12 @@
"draft": "Draft", "draft": "Draft",
"published": "Published" "published": "Published"
}, },
"publish": {
"button": "Publish",
"confirm_title": "Are you sure that you want to publish the validity range \"{name}\"?",
"confirm_explanation": "Please be aware that this will publish the whole timetable and make it visible for everyone. Additionally, you won't be able to change the time grid, the course configs, and the timetable in this validity range after it's published.",
"confirm_button": "Publish"
},
"time_grid": { "time_grid": {
"generic": "Generic (catch-all)", "generic": "Generic (catch-all)",
"explanations": { "explanations": {
......
...@@ -55,7 +55,7 @@ class ValidityRange(ExtensibleModel): ...@@ -55,7 +55,7 @@ class ValidityRange(ExtensibleModel):
verbose_name=_("Status"), verbose_name=_("Status"),
max_length=255, max_length=255,
choices=ValidityRangeStatus.choices, choices=ValidityRangeStatus.choices,
default=ValidityRangeStatus.DRAFT, default=ValidityRangeStatus.DRAFT.value,
) )
status_tracker = FieldTracker(fields=["status", "date_start", "date_end", "school_term"]) status_tracker = FieldTracker(fields=["status", "date_start", "date_end", "school_term"])
...@@ -146,7 +146,7 @@ class ValidityRange(ExtensibleModel): ...@@ -146,7 +146,7 @@ class ValidityRange(ExtensibleModel):
:param request: Optional :class:`HttpRequest` to show progress of syncing in frontend :param request: Optional :class:`HttpRequest` to show progress of syncing in frontend
""" """
self.status = ValidityRangeStatus.PUBLISHED self.status = ValidityRangeStatus.PUBLISHED.value
self.full_clean() self.full_clean()
self.save() self.save()
self.sync(request=request) self.sync(request=request)
...@@ -164,7 +164,8 @@ class ValidityRange(ExtensibleModel): ...@@ -164,7 +164,8 @@ class ValidityRange(ExtensibleModel):
else: else:
result = sync_validity_range.delay(self.pk) result = sync_validity_range.delay(self.pk)
return render_progress_page( return render_progress_page(
result, request,
task_result=result,
title=_("Publish validity range {}".format(self)), title=_("Publish validity range {}".format(self)),
progress_title=_( progress_title=_(
"All lessons and supervisions in the validity range {} are being synced …" "All lessons and supervisions in the validity range {} are being synced …"
......
...@@ -62,6 +62,7 @@ from .timebound_course_config import ( ...@@ -62,6 +62,7 @@ from .timebound_course_config import (
TimeboundCourseConfigType, TimeboundCourseConfigType,
) )
from .validity_range import ( from .validity_range import (
PublishValidityRangeMutation,
ValidityRangeBatchCreateMutation, ValidityRangeBatchCreateMutation,
ValidityRangeBatchDeleteMutation, ValidityRangeBatchDeleteMutation,
ValidityRangeBatchPatchMutation, ValidityRangeBatchPatchMutation,
...@@ -313,6 +314,7 @@ class Mutation(graphene.ObjectType): ...@@ -313,6 +314,7 @@ class Mutation(graphene.ObjectType):
create_validity_ranges = ValidityRangeBatchCreateMutation.Field() create_validity_ranges = ValidityRangeBatchCreateMutation.Field()
delete_validity_ranges = ValidityRangeBatchDeleteMutation.Field() delete_validity_ranges = ValidityRangeBatchDeleteMutation.Field()
update_validity_ranges = ValidityRangeBatchPatchMutation.Field() update_validity_ranges = ValidityRangeBatchPatchMutation.Field()
publish_validity_range = PublishValidityRangeMutation.Field()
create_time_grids = TimeGridBatchCreateMutation.Field() create_time_grids = TimeGridBatchCreateMutation.Field()
delete_time_grids = TimeGridBatchDeleteMutation.Field() delete_time_grids = TimeGridBatchDeleteMutation.Field()
......
from django.core.exceptions import PermissionDenied
import graphene
from graphene_django.types import DjangoObjectType from graphene_django.types import DjangoObjectType
from graphene_django_cud.mutations import ( from graphene_django_cud.mutations import (
DjangoBatchCreateMutation, DjangoBatchCreateMutation,
...@@ -72,3 +75,25 @@ class ValidityRangeBatchPatchMutation(PermissionBatchPatchMixin, DjangoBatchPatc ...@@ -72,3 +75,25 @@ class ValidityRangeBatchPatchMutation(PermissionBatchPatchMixin, DjangoBatchPatc
"date_end", "date_end",
"time_grids", "time_grids",
) )
class PublishValidityRangeMutation(graphene.Mutation):
# No batch mutation as publishing can only be done for one validity range
class Arguments:
id = graphene.ID() # noqa
validity_range = graphene.Field(ValidityRangeType)
@classmethod
def mutate(cls, root, info, id): # noqa
validity_range = ValidityRange.objects.get(pk=id)
if (
not info.context.user.has_perm("lesrooster.edit_validityrange_rule", validity_range)
or validity_range.published
):
raise PermissionDenied()
validity_range.publish(request=info.context)
return PublishValidityRangeMutation(validity_range=validity_range)
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment