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

Merge branch '351-not-storing-groups-for-documentations-is-kind-of-a-problem' into 'master'

Resolve "Not storing groups for documentations is kind of a problem"

Closes #351

See merge request !476
parents 400f4934 7faa1dfb
No related branches found
No related tags found
1 merge request!476Resolve "Not storing groups for documentations is kind of a problem"
Pipeline #195630 failed
Showing with 54 additions and 17 deletions
...@@ -20,9 +20,10 @@ import CancelButton from "aleksis.core/components/generic/buttons/CancelButton.v ...@@ -20,9 +20,10 @@ import CancelButton from "aleksis.core/components/generic/buttons/CancelButton.v
{{ $t("alsijil.coursebook.print.title") }} {{ $t("alsijil.coursebook.print.title") }}
</template> </template>
<template #content> <template #content>
{{ $t("alsijil.coursebook.print.groups") }}
<v-autocomplete <v-autocomplete
v-if="!group"
:items="availableGroups" :items="availableGroups"
:label="$t('alsijil.coursebook.print.groups')"
item-text="name" item-text="name"
item-value="id" item-value="id"
:value="value" :value="value"
...@@ -87,7 +88,16 @@ export default { ...@@ -87,7 +88,16 @@ export default {
*/ */
availableGroups: { availableGroups: {
type: Array, type: Array,
required: true, required: false,
default: () => [],
},
/**
* Set a group to use this dialog exclusively for
*/
group: {
type: Object,
required: false,
default: null,
}, },
/** /**
* Initially selected groups * Initially selected groups
...@@ -121,6 +131,9 @@ export default { ...@@ -121,6 +131,9 @@ export default {
}, },
computed: { computed: {
selectedGroups() { selectedGroups() {
if (this.group) {
return [this.group.id];
}
if (this.currentGroupSelection.length == 0) { if (this.currentGroupSelection.length == 0) {
return this.value.map((group) => group.id); return this.value.map((group) => group.id);
} else { } else {
......
...@@ -10,6 +10,9 @@ ...@@ -10,6 +10,9 @@
:show-select="false" :show-select="false"
@items="items = $event" @items="items = $event"
> >
<template #additionalActions>
<coursebook-print-dialog :group="group" />
</template>
<template <template
v-for="(extraMark, index) in extraMarks" v-for="(extraMark, index) in extraMarks"
#[`extraMarks.${index}.count`]="{ item }" #[`extraMarks.${index}.count`]="{ item }"
...@@ -67,7 +70,7 @@ ...@@ -67,7 +70,7 @@
:to="{ :to="{
name: 'core.personById', name: 'core.personById',
params: { params: {
personId: item.person.id, id: item.person.id,
}, },
hash: '#' + MODE.PARTICIPATIONS, hash: '#' + MODE.PARTICIPATIONS,
}" }"
...@@ -81,13 +84,14 @@ import groupOverviewTabMixin from "aleksis.core/mixins/groupOverviewTabMixin.js" ...@@ -81,13 +84,14 @@ import groupOverviewTabMixin from "aleksis.core/mixins/groupOverviewTabMixin.js"
import CRUDList from "aleksis.core/components/generic/CRUDList.vue"; import CRUDList from "aleksis.core/components/generic/CRUDList.vue";
import PersonChip from "aleksis.core/components/person/PersonChip.vue"; import PersonChip from "aleksis.core/components/person/PersonChip.vue";
import SecondaryActionButton from "aleksis.core/components/generic/buttons/SecondaryActionButton.vue"; import SecondaryActionButton from "aleksis.core/components/generic/buttons/SecondaryActionButton.vue";
import CoursebookPrintDialog from "../CoursebookPrintDialog.vue";
import AbsenceReasonChip from "aleksis.apps.kolego/components/AbsenceReasonChip.vue"; import AbsenceReasonChip from "aleksis.apps.kolego/components/AbsenceReasonChip.vue";
import ExtraMarkChip from "aleksis.apps.alsijil/components/extra_marks/ExtraMarkChip.vue"; import ExtraMarkChip from "aleksis.apps.alsijil/components/extra_marks/ExtraMarkChip.vue";
import { statisticsByGroup } from "./statistics.graphql"; import { statisticsByGroup } from "./statistics.graphql";
import { absenceReasons } from "../queries/absenceReasons.graphql"; import { absenceReasons } from "../queries/absenceReasons.graphql";
import { extraMarks } from "../../extra_marks/extra_marks.graphql"; import { extraMarks } from "../queries/extraMarks.graphql";
import { MODE } from "./modes"; import { MODE } from "./modes";
export default { export default {
...@@ -99,6 +103,7 @@ export default { ...@@ -99,6 +103,7 @@ export default {
ExtraMarkChip, ExtraMarkChip,
PersonChip, PersonChip,
SecondaryActionButton, SecondaryActionButton,
CoursebookPrintDialog,
}, },
data() { data() {
return { return {
......
...@@ -179,6 +179,14 @@ ...@@ -179,6 +179,14 @@
<v-list-item-action <v-list-item-action
class="flex-row full-width justify-md-end ma-0 align-center fill-height" class="flex-row full-width justify-md-end ma-0 align-center fill-height"
> >
<v-chip
color="warning"
class="mx-1"
v-if="!item.relatedDocumentation.amended"
>{{
$t("alsijil.coursebook.statistics.not_counted")
}}</v-chip
>
<!-- chips: absences & extraMarks --> <!-- chips: absences & extraMarks -->
<absence-reason-chip <absence-reason-chip
v-if="item.absenceReason" v-if="item.absenceReason"
......
...@@ -64,6 +64,7 @@ query participationsOfPerson($person: ID!) { ...@@ -64,6 +64,7 @@ query participationsOfPerson($person: ID!) {
colourFg colourFg
colourBg colourBg
} }
amended
} }
canEdit canEdit
canDelete canDelete
......
<script> <script>
import { extraMarks } from "./extra_marks.graphql"; import { extraMarksList } from "./extra_marks.graphql";
export default { export default {
name: "ExtraMarkButtons", name: "ExtraMarkButtons",
...@@ -10,7 +10,7 @@ export default { ...@@ -10,7 +10,7 @@ export default {
}, },
apollo: { apollo: {
extraMarks: { extraMarks: {
query: extraMarks, query: extraMarksList,
update: (data) => data.items, update: (data) => data.items,
skip() { skip() {
return this.customExtraMarks.length > 0; return this.customExtraMarks.length > 0;
......
...@@ -82,7 +82,8 @@ ...@@ -82,7 +82,8 @@
"title": "Kursbuch · Statistiken · {fullName}" "title": "Kursbuch · Statistiken · {fullName}"
}, },
"person_view_details": "Details", "person_view_details": "Details",
"title_plural": "Statistiken" "title_plural": "Statistiken",
"not_counted": "nicht gezählt"
}, },
"status": { "status": {
"available": "Kursbucheintrag vorhanden", "available": "Kursbucheintrag vorhanden",
......
...@@ -85,7 +85,8 @@ ...@@ -85,7 +85,8 @@
"summary": "Summary" "summary": "Summary"
}, },
"person_view_details": "Details", "person_view_details": "Details",
"title_plural": "Statistics" "title_plural": "Statistics",
"not_counted": "not counted"
}, },
"notes": { "notes": {
"show_list": "List of participants", "show_list": "List of participants",
......
...@@ -2,6 +2,7 @@ from django.db.models import FilteredRelation, Q, QuerySet, Value ...@@ -2,6 +2,7 @@ from django.db.models import FilteredRelation, Q, QuerySet, Value
from django.db.models.aggregates import Count, Sum from django.db.models.aggregates import Count, Sum
from django.utils.translation import gettext as _ from django.utils.translation import gettext as _
from aleksis.apps.chronos.models import LessonEvent
from aleksis.apps.kolego.models import AbsenceReason from aleksis.apps.kolego.models import AbsenceReason
from aleksis.core.models import Group, Person, SchoolTerm from aleksis.core.models import Group, Person, SchoolTerm
...@@ -137,13 +138,6 @@ def annotate_person_statistics_for_school_term( ...@@ -137,13 +138,6 @@ def annotate_person_statistics_for_school_term(
datetime_end__date__lte=school_term.date_end, datetime_end__date__lte=school_term.date_end,
) )
if group: if group:
documentations = documentations.filter( lesson_events = LessonEvent.objects.filter(LessonEvent.objects.for_group_q(group))
pk__in=Documentation.objects.filter(course__groups=group) documentations = documentations.filter(amends__in=lesson_events)
.values_list("pk", flat=True)
.union(
Documentation.objects.filter(course__groups__parent_groups=group).values_list(
"pk", flat=True
)
)
)
return annotate_person_statistics_from_documentations(persons, documentations) return annotate_person_statistics_from_documentations(persons, documentations)
...@@ -48,6 +48,7 @@ class DocumentationType(PermissionsTypeMixin, DjangoFilterMixin, DjangoObjectTyp ...@@ -48,6 +48,7 @@ class DocumentationType(PermissionsTypeMixin, DjangoFilterMixin, DjangoObjectTyp
course = graphene.Field(CourseType, required=False) course = graphene.Field(CourseType, required=False)
amends = graphene.Field(lambda: LessonEventType, required=False) amends = graphene.Field(lambda: LessonEventType, required=False)
amended = graphene.Boolean(required=False)
subject = graphene.Field(SubjectType, required=False) subject = graphene.Field(SubjectType, required=False)
participations = graphene.List(ParticipationStatusType, required=False) participations = graphene.List(ParticipationStatusType, required=False)
...@@ -66,6 +67,11 @@ class DocumentationType(PermissionsTypeMixin, DjangoFilterMixin, DjangoObjectTyp ...@@ -66,6 +67,11 @@ class DocumentationType(PermissionsTypeMixin, DjangoFilterMixin, DjangoObjectTyp
return root._amends_prefetched return root._amends_prefetched
return root.amends return root.amends
@staticmethod
@bypass_get_queryset
def resolve_amended(root: Documentation, info, **kwargs):
return root.amends_id is not None
@staticmethod @staticmethod
@bypass_get_queryset @bypass_get_queryset
def resolve_teachers(root: Documentation, info, **kwargs): def resolve_teachers(root: Documentation, info, **kwargs):
......
...@@ -7,6 +7,7 @@ from django.utils.translation import gettext as _ ...@@ -7,6 +7,7 @@ from django.utils.translation import gettext as _
from celery.result import allow_join_result from celery.result import allow_join_result
from celery.states import SUCCESS from celery.states import SUCCESS
from aleksis.apps.chronos.models import LessonEvent
from aleksis.apps.cursus.models import Course from aleksis.apps.cursus.models import Course
from aleksis.apps.kolego.models.absence import AbsenceReason from aleksis.apps.kolego.models.absence import AbsenceReason
from aleksis.core.models import Group, PDFFile from aleksis.core.models import Group, PDFFile
...@@ -118,6 +119,13 @@ def generate_full_register_printout( ...@@ -118,6 +119,13 @@ def generate_full_register_printout(
course__groups__parent_groups=group course__groups__parent_groups=group
).values_list("pk", flat=True) ).values_list("pk", flat=True)
) )
.union(
Documentation.objects.filter(
amends__in=LessonEvent.objects.filter(
LessonEvent.objects.for_group_q(group)
)
).values_list("pk", flat=True)
)
) )
) )
......
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