Commit 4ec91edf authored by Martin Juhás's avatar Martin Juhás
Browse files

Merge branch '484-save-source-of-milestone-modification-in-the-details' into 'main'

Resolve "Save source of milestone modification in the details"

See merge request inject/backend!432
parents d2a8dff4 ebcbaf2d
Loading
Loading
Loading
Loading
+6 −1
Original line number Diff line number Diff line
@@ -3,7 +3,11 @@ from django.db import models

from exercise.models import TeamQuestionnaireState
from exercise_definition.models import QuestionTypes, Feature, InjectTypes
from running_exercise.models import LogType, QuestionnaireAnswerStatus
from running_exercise.models import (
    LogType,
    QuestionnaireAnswerStatus,
    MilestoneModificationDetails,
)
from user.models import User


@@ -42,3 +46,4 @@ ConfigFeatureEnum = graphene.Enum.from_enum(Feature)
QuestionnaireAnswerStateEnum = graphene.Enum.from_enum(
    QuestionnaireAnswerStatus
)
CauseTypeEnum = graphene.Enum.from_enum(MilestoneModificationDetails.CauseType)
+31 −20
Original line number Diff line number Diff line
@@ -22,6 +22,7 @@ from common_lib.schema.enums import (
    ExerciseStateEnum,
    LogTypeEnum,
    InjectTypeEnum,
    CauseTypeEnum,
)
from common_lib.schema.inputs import TimeIntervalType
from common_lib.utils import ensure_all_exist, ensure_exists
@@ -915,24 +916,29 @@ class IFileDownloadDetailsType(DjangoObjectType):
class TMilestoneModificationDetailsType(DjangoObjectType):
    class Meta:
        model = MilestoneModificationDetails
        exclude = ["cause"]

    activated_milestones = graphene.List(
        graphene.NonNull(MilestoneType), required=True
    activated_milestone_states = graphene.List(
        graphene.NonNull(MilestoneStateType), required=True
    )
    deactivated_milestones = graphene.List(
        graphene.NonNull(MilestoneType), required=True
    deactivated_milestone_states = graphene.List(
        graphene.NonNull(MilestoneStateType), required=True
    )

    def resolve_activated_milestones(self, info):
    def resolve_activated_milestone_states(self, info):
        return ensure_all_exist(
            Milestone.objects.filter(id__in=self.activated_milestones),
            len(self.activated_milestones),
            MilestoneState.objects.filter(
                id__in=self.activated_milestone_states
            ),
            len(self.activated_milestone_states),
        )

    def resolve_deactivated_milestones(self, info):
    def resolve_deactivated_milestone_states(self, info):
        return ensure_all_exist(
            Milestone.objects.filter(id__in=self.deactivated_milestones),
            len(self.deactivated_milestones),
            MilestoneState.objects.filter(
                id__in=self.deactivated_milestone_states
            ),
            len(self.deactivated_milestone_states),
        )


@@ -940,23 +946,28 @@ class IMilestoneModificationDetailsType(DjangoObjectType):
    class Meta:
        model = MilestoneModificationDetails

    activated_milestones = graphene.List(
        graphene.NonNull(MilestoneType), required=True
    activated_milestone_states = graphene.List(
        graphene.NonNull(MilestoneStateType), required=True
    )
    deactivated_milestones = graphene.List(
        graphene.NonNull(MilestoneType), required=True
    deactivated_milestone_states = graphene.List(
        graphene.NonNull(MilestoneStateType), required=True
    )
    cause = graphene.Field(CauseTypeEnum, required=True)

    def resolve_activated_milestones(self, info):
    def resolve_activated_milestone_states(self, info):
        return ensure_all_exist(
            Milestone.objects.filter(id__in=self.activated_milestones),
            len(self.activated_milestones),
            MilestoneState.objects.filter(
                id__in=self.activated_milestone_states
            ),
            len(self.activated_milestone_states),
        )

    def resolve_deactivated_milestones(self, info):
    def resolve_deactivated_milestone_states(self, info):
        return ensure_all_exist(
            Milestone.objects.filter(id__in=self.deactivated_milestones),
            len(self.deactivated_milestones),
            MilestoneState.objects.filter(
                id__in=self.deactivated_milestone_states
            ),
            len(self.deactivated_milestone_states),
        )


+1 −1
Original line number Diff line number Diff line
@@ -142,7 +142,7 @@ class EmailClient:
                if p.team is not None
            )
        )  # ensure finding the first non-null team from cached data
        logs = handler.send_email(email, time, access.user)
        logs = handler.send_email(email, time, access)
        SubscriptionHandler.broadcast_action_logs(logs)
        return logs

+6 −2
Original line number Diff line number Diff line
@@ -206,7 +206,10 @@ class EmailHandler:
        )

    def send_email(
        self, email: Email, in_exercise_time: int, user: Optional[User] = None
        self,
        email: Email,
        in_exercise_time: int,
        access: Optional[ExerciseAccess] = None,
    ) -> List[ActionLog]:
        self.milestone_modifications.dedupe_modifications()
        requires_attention = self.requires_attention()
@@ -221,7 +224,7 @@ class EmailHandler:
                email,
                in_exercise_time,
                requires_attention,
                user=user,
                user=access.user if access else None,
            )

            logs.append(email_log)
@@ -230,6 +233,7 @@ class EmailHandler:
                self.milestone_handlers[participant.team_id].update(
                    self.milestone_modifications,
                    email_log,
                    access,
                )
            )

+1 −1
Original line number Diff line number Diff line
@@ -139,7 +139,7 @@ def get_uploaded_file(
        )
        logs.extend(
            milestone_handler.update(
                Control(activate_milestone=to_activate), logs[0]
                Control(activate_milestone=to_activate), logs[0], access
            )
        )

Loading