From 39f962d83aa9127007b4d75f976add9e0f2bd4b1 Mon Sep 17 00:00:00 2001 From: Kai Bukharenko Date: Thu, 24 Jul 2025 18:12:07 +0300 Subject: [PATCH 1/2] Initial commit for adopting tags, tag 'warn' will turn even full points yellow --- .../fi/aalto/cs/apluscourses/api/APlusApi.kt | 72 ++++++++++++++++++- .../apluscourses/model/exercise/Exercise.kt | 11 ++- .../model/exercise/SubmissionResult.kt | 5 ++ .../services/exercise/ExercisesUpdater.kt | 16 +++-- .../ui/exercise/ExercisesTreeRenderer.kt | 20 +++--- 5 files changed, 107 insertions(+), 17 deletions(-) diff --git a/src/main/kotlin/fi/aalto/cs/apluscourses/api/APlusApi.kt b/src/main/kotlin/fi/aalto/cs/apluscourses/api/APlusApi.kt index 2cf464093..683bd8e11 100644 --- a/src/main/kotlin/fi/aalto/cs/apluscourses/api/APlusApi.kt +++ b/src/main/kotlin/fi/aalto/cs/apluscourses/api/APlusApi.kt @@ -12,6 +12,7 @@ import io.ktor.http.* import io.ktor.resources.* import kotlinx.serialization.ExperimentalSerializationApi import kotlinx.serialization.Serializable +import kotlinx.serialization.encodeToString import kotlinx.serialization.json.Json import kotlinx.serialization.json.JsonNamingStrategy import java.time.ZonedDateTime @@ -157,7 +158,7 @@ object APlusApi { ) } - @Resource("submissiondata/me") + @Resource("submissiondata/me") //plugari saa tiedot palautuksista tästä class SubmissionData(val parent: Course) { suspend fun get(project: Project): List { val res = CoursesClient.getInstance(project) @@ -180,7 +181,9 @@ object APlusApi { val UserID: Long, val Status: String, val Grade: Int, - val Penalty: Double? + val Penalty: Double?, + //TODO: muista laittaa päälle, laitettu pois testauksen vuoksi + val Tags: String //tunnisteet ovat eroteltu pystyviivoilla | . Pitäisikö nämä muuntaa jo täällä listaksi? ) } @@ -286,10 +289,57 @@ object APlusApi { @Resource("/submissions/{id}") class Submission(val id: Long) { + @OptIn(ExperimentalSerializationApi::class) suspend fun get(project: Project): SubmissionBody { - return CoursesClient.getInstance(project).getBody(this@Submission) + val json = Json { + ignoreUnknownKeys = true + namingStrategy = JsonNamingStrategy.SnakeCase + } + val noTagJson = json.encodeToString(OuterData(gradingData = null)) + val raw = CoursesClient.getInstance(project).getBody(this@Submission) + var tags: List = emptyList() //käytä tätä tunisteiden tallentamiseen + //kyseessä tuskin on tää, koska jopa if lause antaa virheen + val rawGradingData = raw.gradingData?.let { //yksittäisen tehtävän väritys toimii nyt oikein! ongelmia, jos ei ole grading_dataa! + //RawGradingData() //tämä toimii, miten?? + val potentialRaw = it.gradingData ?: noTagJson + json.decodeFromString(potentialRaw) //TODO: jos grading_data on tyhjä, tämä aiheuttaa ongelmia + } + if (rawGradingData != null) { + //println(rawGradingData) + tags = rawGradingData.submissionTags?.split(",")?.map { it.trim() } ?: emptyList() + //println(tags) + } + /* + val gradingData = raw.gradingData?.let { + GradingData( + submissionTags = rawGradingData?.submissionTags?.split(",")?.map { it.trim() } ?: emptyList() + ) + } + */ + //println(gradingData) + return SubmissionBody( + feedback = raw.feedback, + htmlUrl = raw.htmlUrl, + status = raw.status, + grade = raw.grade, + latePenaltyApplied = raw.latePenaltyApplied, + submissionTags = tags, + exercise = raw.exercise + ) } + @Serializable + data class RawSubmissionBody( + val feedback: String, + val htmlUrl: String, + val status: String, + val grade: Int, + val latePenaltyApplied: Double?, + val gradingData: OuterData?, + val exercise: SubmissionExercise, + ) + + //TODO: change this for simplicity so that tags are stored immediately inside it @Serializable data class SubmissionBody( val feedback: String, @@ -297,9 +347,25 @@ object APlusApi { val status: String, val grade: Int, val latePenaltyApplied: Double?, + val submissionTags: List = emptyList(), //tunnisteet ovat suoraan tässä val exercise: SubmissionExercise, ) + @Serializable + data class OuterData( + val gradingData: String? = null, + ) + + @Serializable //virheet tässä? + data class RawGradingData( + val submissionTags: String? = "", + ) + + @Serializable + data class GradingData( + val submissionTags: List = emptyList(), + ) + @Serializable data class SubmissionExercise( val id: Long, diff --git a/src/main/kotlin/fi/aalto/cs/apluscourses/model/exercise/Exercise.kt b/src/main/kotlin/fi/aalto/cs/apluscourses/model/exercise/Exercise.kt index 5b553c6c3..b0572b85a 100644 --- a/src/main/kotlin/fi/aalto/cs/apluscourses/model/exercise/Exercise.kt +++ b/src/main/kotlin/fi/aalto/cs/apluscourses/model/exercise/Exercise.kt @@ -36,8 +36,15 @@ data class Exercise( /** * Returns the best submission of this exercise (if one exists). */ - private fun bestSubmission(): SubmissionResult? { - return submissionResults.find { it.id == bestSubmissionId } + private fun bestSubmission(): SubmissionResult? { //this may need some adjustments + //aina oletuksena se, jonka api saa palvelimelta, mutta jos löytyy ilman varoitustunnistetta, välitä se eteenpäin + val best = submissionResults.find { it.id == bestSubmissionId } + return submissionResults.find { !it.hasTag("warn") && it.userPoints >= (best?.userPoints ?: 0) } ?: best + } + + fun bestHasWarn(): Boolean { + val bestSubmission = bestSubmission() + return bestSubmission != null && bestSubmission.hasTag("warn") } fun isLate(): Boolean { diff --git a/src/main/kotlin/fi/aalto/cs/apluscourses/model/exercise/SubmissionResult.kt b/src/main/kotlin/fi/aalto/cs/apluscourses/model/exercise/SubmissionResult.kt index 4bed3bb89..57de4c7f2 100644 --- a/src/main/kotlin/fi/aalto/cs/apluscourses/model/exercise/SubmissionResult.kt +++ b/src/main/kotlin/fi/aalto/cs/apluscourses/model/exercise/SubmissionResult.kt @@ -10,6 +10,7 @@ data class SubmissionResult( val maxPoints: Int, var userPoints: Int, var latePenalty: Double?, + var tags: List, //tags arrive here from SubmissinData through ExerciseUpdater var status: Status, val filesInfo: List, val submitters: List?, @@ -25,6 +26,10 @@ data class SubmissionResult( this.status = status } + fun hasTag(tagSlug: String): Boolean { + return tags.contains(tagSlug) + } + enum class Status { GRADED, UNOFFICIAL, diff --git a/src/main/kotlin/fi/aalto/cs/apluscourses/services/exercise/ExercisesUpdater.kt b/src/main/kotlin/fi/aalto/cs/apluscourses/services/exercise/ExercisesUpdater.kt index 3f1d5026d..95193b552 100644 --- a/src/main/kotlin/fi/aalto/cs/apluscourses/services/exercise/ExercisesUpdater.kt +++ b/src/main/kotlin/fi/aalto/cs/apluscourses/services/exercise/ExercisesUpdater.kt @@ -175,7 +175,7 @@ class ExercisesUpdater( this.points = newPoints this.submissionCount = newSubmissionCount val exercisesResponseDeferred = withContext(Dispatchers.IO) { async { courseApi.exercises(project) } } - val submissionDataResponseDeferred = withContext(Dispatchers.IO) { async { courseApi.submissionData(project) } } + val submissionDataResponseDeferred = withContext(Dispatchers.IO) { async { courseApi.submissionData(project) } }//TODO: tästä se sa palautukset ja mm. tunnisteet! val exercises = exercisesResponseDeferred.await() val submissionDataResponse = submissionDataResponseDeferred.await() @@ -207,7 +207,7 @@ class ExercisesUpdater( module = course.exerciseModules[exercise.id]?.get(selectedLanguage), htmlUrl = exerciseExercise?.htmlUrl ?: "", url = exercise.url, - submissionResults = exercise + submissionResults = exercise //tässä luultavasti tapahtuu muunnos .submissionsWithPoints .map { val data = submissionData[it.id] @@ -221,12 +221,13 @@ class ExercisesUpdater( status = SubmissionResult.statusFromString(data?.Status), filesInfo = emptyList(), submitters = submitters, + tags = data?.Tags?.split("|")?.map { it.trim() } ?: emptyList() //emptyList() //listOf("warn") // TODO: remember to uncomment after testing data?.Tags?.split("|").map { it.trim() } ?: emptyList() ) }.toMutableList(), maxPoints = exercise.maxPoints, - userPoints = exercise.points, + userPoints = exercise.points, //exercise.points palauttaa aina tehtävän parhaat pisteet maxSubmissions = exerciseExercise?.maxSubmissions ?: 0, - bestSubmissionId = exercise.bestSubmission?.split("/")?.last()?.toLong(), + bestSubmissionId = exercise.bestSubmission?.split("/")?.last()?.toLong(), //TODO: tämä pitää luultavasti myös muuttaa difficulty = exercise.difficulty, isSubmittable = exerciseExercise?.hasSubmittableFiles == true, isOptional = optionalCategories.contains(exercise.difficulty), @@ -272,6 +273,13 @@ class ExercisesUpdater( submissionResult.updateStatus(submission.status) submissionResult.userPoints = submission.grade submissionResult.latePenalty = submission.latePenaltyApplied + //ignore unknown keys? + //val json = Json { ignoreUnknownKeys = true } + //TODO: muista palauttaa tyhjä lista testauksen jälkeen + submissionResult.tags = submission.submissionTags + //println(submission?.gradingData) + //json.decodeFromString(submission.gradingData?.gradingData ?: "\"submission_tags\":\"\"").submissionTags?.split(",") ?: emptyList() + //tänne myös tunnisteet, koska jokaisella palautuskerralla ne päivittyy Notifier.notify(FeedbackAvailableNotification(submissionResult, exercise, project), project) fireExerciseUpdated(exercise) } diff --git a/src/main/kotlin/fi/aalto/cs/apluscourses/ui/exercise/ExercisesTreeRenderer.kt b/src/main/kotlin/fi/aalto/cs/apluscourses/ui/exercise/ExercisesTreeRenderer.kt index 2f3386c46..0051c81da 100644 --- a/src/main/kotlin/fi/aalto/cs/apluscourses/ui/exercise/ExercisesTreeRenderer.kt +++ b/src/main/kotlin/fi/aalto/cs/apluscourses/ui/exercise/ExercisesTreeRenderer.kt @@ -181,17 +181,19 @@ class ExercisesTreeRenderer : NodeRenderer() { } } - private fun statusToColor(status: Status): Color { + private fun statusToColor(status: Status): Color { //tämä on vastuussa koko tehtävän väristä val baseColor = when (status) { Status.FULL_POINTS -> JBColor(0x8bc34a, 0x8bc34a) - Status.NO_POINTS, Status.PARTIAL_POINTS -> JBColor(0xffb74d, 0xffb74d) + Status.NO_POINTS, Status.PARTIAL_POINTS -> JBColor(0xffb74d, 0xffb74d) //kuseeko tämä? else -> JBColor(0xc5c5c5, 0xc5c5c5) } return if (isSubmittable()) baseColor else ColorUtil.withAlpha(baseColor, 0.5) } - private fun submissionResultToColor(submission: SubmissionResult): Color { - return if (submission.userPoints == submission.maxPoints) { + //määrittelee yksittäisen palautksen väriä + private fun submissionResultToColor(submission: SubmissionResult): Color { //tämä aiheuttaa luultavasti väärän värin palautuksen jälkeen + //toinen ehto antaa aina true viimeisellä palautuksella jostain syystä + return if (submission.userPoints == submission.maxPoints && !submission.hasTag("warn")) { //virhe oli tunnisteiden tallentamisessa, nyt toimii JBColor(0x8bc34a, 0x8bc34a) } else { JBColor(0xffb74d, 0xffb74d) @@ -273,21 +275,23 @@ class ExercisesTreeRenderer : NodeRenderer() { } companion object { - private fun getStatus(exercise: Exercise): Status { + private fun getStatus(exercise: Exercise): Status { //set status to warn if the tag is set or change how PARTIAL_POINTS works? return if (exercise.isInGrading()) { Status.IN_GRADING } else if (exercise.isOptional) { Status.OPTIONAL_PRACTICE } else if (exercise.submissionResults.isEmpty()) { Status.NO_SUBMISSIONS - } else if (exercise.userPoints == exercise.maxPoints) { + } else if (exercise.userPoints == exercise.maxPoints && !exercise.bestHasWarn()) { //toinen ehto antaa aina true viimeisen palautuksen jälkeen + //TODO: yksittäisestä tehtävästä jossa on warn voi edelleen tulla vihreät pisteet, jos avaa intellij uudestaan sit muuttuu keltaiseksi + //println("warn is not set!") Status.FULL_POINTS } else if (exercise.isLate()) { Status.LATE } else if (exercise.userPoints == 0) { Status.NO_POINTS } else { - Status.PARTIAL_POINTS + Status.PARTIAL_POINTS //koska tämä on oeltustila, voi vain katsoa jos on tyäydet pisteet eikä warn-tunnistetta } } @@ -297,7 +301,7 @@ class ExercisesTreeRenderer : NodeRenderer() { Status.OPTIONAL_PRACTICE -> CoursesIcons.OptionalPractice Status.NO_SUBMISSIONS -> CoursesIcons.NoSubmissions Status.NO_POINTS -> CoursesIcons.NoPoints - Status.PARTIAL_POINTS -> CoursesIcons.PartialPoints + Status.PARTIAL_POINTS -> CoursesIcons.PartialPoints //warning should probably be incorporated into this Status.FULL_POINTS -> CoursesIcons.FullPoints Status.LATE -> CoursesIcons.Late Status.IN_GRADING -> CoursesIcons.Loading From 192f9ad6339ea57500fc0f62b725e415f009e081 Mon Sep 17 00:00:00 2001 From: Kai Bukharenko Date: Thu, 24 Jul 2025 18:24:35 +0300 Subject: [PATCH 2/2] Cleaned up the code of old comments --- .../fi/aalto/cs/apluscourses/api/APlusApi.kt | 35 +++++-------------- .../apluscourses/model/exercise/Exercise.kt | 4 +-- .../model/exercise/SubmissionResult.kt | 2 +- .../services/exercise/ExercisesUpdater.kt | 16 +++------ .../ui/exercise/ExercisesTreeRenderer.kt | 19 +++++----- 5 files changed, 24 insertions(+), 52 deletions(-) diff --git a/src/main/kotlin/fi/aalto/cs/apluscourses/api/APlusApi.kt b/src/main/kotlin/fi/aalto/cs/apluscourses/api/APlusApi.kt index 683bd8e11..64e554cf1 100644 --- a/src/main/kotlin/fi/aalto/cs/apluscourses/api/APlusApi.kt +++ b/src/main/kotlin/fi/aalto/cs/apluscourses/api/APlusApi.kt @@ -12,7 +12,6 @@ import io.ktor.http.* import io.ktor.resources.* import kotlinx.serialization.ExperimentalSerializationApi import kotlinx.serialization.Serializable -import kotlinx.serialization.encodeToString import kotlinx.serialization.json.Json import kotlinx.serialization.json.JsonNamingStrategy import java.time.ZonedDateTime @@ -158,7 +157,7 @@ object APlusApi { ) } - @Resource("submissiondata/me") //plugari saa tiedot palautuksista tästä + @Resource("submissiondata/me") class SubmissionData(val parent: Course) { suspend fun get(project: Project): List { val res = CoursesClient.getInstance(project) @@ -182,8 +181,7 @@ object APlusApi { val Status: String, val Grade: Int, val Penalty: Double?, - //TODO: muista laittaa päälle, laitettu pois testauksen vuoksi - val Tags: String //tunnisteet ovat eroteltu pystyviivoilla | . Pitäisikö nämä muuntaa jo täällä listaksi? + val Tags: String //tunnisteet ovat eroteltu pystyviivoilla | api:ssa ) } @@ -297,26 +295,15 @@ object APlusApi { } val noTagJson = json.encodeToString(OuterData(gradingData = null)) val raw = CoursesClient.getInstance(project).getBody(this@Submission) - var tags: List = emptyList() //käytä tätä tunisteiden tallentamiseen - //kyseessä tuskin on tää, koska jopa if lause antaa virheen - val rawGradingData = raw.gradingData?.let { //yksittäisen tehtävän väritys toimii nyt oikein! ongelmia, jos ei ole grading_dataa! - //RawGradingData() //tämä toimii, miten?? + var tags: List = emptyList() + val rawGradingData = raw.gradingData?.let { val potentialRaw = it.gradingData ?: noTagJson - json.decodeFromString(potentialRaw) //TODO: jos grading_data on tyhjä, tämä aiheuttaa ongelmia + json.decodeFromString(potentialRaw) } if (rawGradingData != null) { - //println(rawGradingData) tags = rawGradingData.submissionTags?.split(",")?.map { it.trim() } ?: emptyList() - //println(tags) } - /* - val gradingData = raw.gradingData?.let { - GradingData( - submissionTags = rawGradingData?.submissionTags?.split(",")?.map { it.trim() } ?: emptyList() - ) - } - */ - //println(gradingData) + return SubmissionBody( feedback = raw.feedback, htmlUrl = raw.htmlUrl, @@ -339,7 +326,6 @@ object APlusApi { val exercise: SubmissionExercise, ) - //TODO: change this for simplicity so that tags are stored immediately inside it @Serializable data class SubmissionBody( val feedback: String, @@ -347,7 +333,7 @@ object APlusApi { val status: String, val grade: Int, val latePenaltyApplied: Double?, - val submissionTags: List = emptyList(), //tunnisteet ovat suoraan tässä + val submissionTags: List = emptyList(), val exercise: SubmissionExercise, ) @@ -356,16 +342,11 @@ object APlusApi { val gradingData: String? = null, ) - @Serializable //virheet tässä? + @Serializable data class RawGradingData( val submissionTags: String? = "", ) - @Serializable - data class GradingData( - val submissionTags: List = emptyList(), - ) - @Serializable data class SubmissionExercise( val id: Long, diff --git a/src/main/kotlin/fi/aalto/cs/apluscourses/model/exercise/Exercise.kt b/src/main/kotlin/fi/aalto/cs/apluscourses/model/exercise/Exercise.kt index b0572b85a..c964f3ecc 100644 --- a/src/main/kotlin/fi/aalto/cs/apluscourses/model/exercise/Exercise.kt +++ b/src/main/kotlin/fi/aalto/cs/apluscourses/model/exercise/Exercise.kt @@ -36,8 +36,8 @@ data class Exercise( /** * Returns the best submission of this exercise (if one exists). */ - private fun bestSubmission(): SubmissionResult? { //this may need some adjustments - //aina oletuksena se, jonka api saa palvelimelta, mutta jos löytyy ilman varoitustunnistetta, välitä se eteenpäin + private fun bestSubmission(): SubmissionResult? { + //the best submission is always assumed to be the one returned by api, but if there is another one with equal/higher points and no 'warn', it is treated as the best locally val best = submissionResults.find { it.id == bestSubmissionId } return submissionResults.find { !it.hasTag("warn") && it.userPoints >= (best?.userPoints ?: 0) } ?: best } diff --git a/src/main/kotlin/fi/aalto/cs/apluscourses/model/exercise/SubmissionResult.kt b/src/main/kotlin/fi/aalto/cs/apluscourses/model/exercise/SubmissionResult.kt index 57de4c7f2..0f0323e8d 100644 --- a/src/main/kotlin/fi/aalto/cs/apluscourses/model/exercise/SubmissionResult.kt +++ b/src/main/kotlin/fi/aalto/cs/apluscourses/model/exercise/SubmissionResult.kt @@ -10,7 +10,7 @@ data class SubmissionResult( val maxPoints: Int, var userPoints: Int, var latePenalty: Double?, - var tags: List, //tags arrive here from SubmissinData through ExerciseUpdater + var tags: List, var status: Status, val filesInfo: List, val submitters: List?, diff --git a/src/main/kotlin/fi/aalto/cs/apluscourses/services/exercise/ExercisesUpdater.kt b/src/main/kotlin/fi/aalto/cs/apluscourses/services/exercise/ExercisesUpdater.kt index 95193b552..174d92752 100644 --- a/src/main/kotlin/fi/aalto/cs/apluscourses/services/exercise/ExercisesUpdater.kt +++ b/src/main/kotlin/fi/aalto/cs/apluscourses/services/exercise/ExercisesUpdater.kt @@ -175,7 +175,7 @@ class ExercisesUpdater( this.points = newPoints this.submissionCount = newSubmissionCount val exercisesResponseDeferred = withContext(Dispatchers.IO) { async { courseApi.exercises(project) } } - val submissionDataResponseDeferred = withContext(Dispatchers.IO) { async { courseApi.submissionData(project) } }//TODO: tästä se sa palautukset ja mm. tunnisteet! + val submissionDataResponseDeferred = withContext(Dispatchers.IO) { async { courseApi.submissionData(project) } } val exercises = exercisesResponseDeferred.await() val submissionDataResponse = submissionDataResponseDeferred.await() @@ -207,7 +207,7 @@ class ExercisesUpdater( module = course.exerciseModules[exercise.id]?.get(selectedLanguage), htmlUrl = exerciseExercise?.htmlUrl ?: "", url = exercise.url, - submissionResults = exercise //tässä luultavasti tapahtuu muunnos + submissionResults = exercise .submissionsWithPoints .map { val data = submissionData[it.id] @@ -221,13 +221,13 @@ class ExercisesUpdater( status = SubmissionResult.statusFromString(data?.Status), filesInfo = emptyList(), submitters = submitters, - tags = data?.Tags?.split("|")?.map { it.trim() } ?: emptyList() //emptyList() //listOf("warn") // TODO: remember to uncomment after testing data?.Tags?.split("|").map { it.trim() } ?: emptyList() + tags = data?.Tags?.split("|")?.map { it.trim() } ?: emptyList() ) }.toMutableList(), maxPoints = exercise.maxPoints, - userPoints = exercise.points, //exercise.points palauttaa aina tehtävän parhaat pisteet + userPoints = exercise.points, maxSubmissions = exerciseExercise?.maxSubmissions ?: 0, - bestSubmissionId = exercise.bestSubmission?.split("/")?.last()?.toLong(), //TODO: tämä pitää luultavasti myös muuttaa + bestSubmissionId = exercise.bestSubmission?.split("/")?.last()?.toLong(), difficulty = exercise.difficulty, isSubmittable = exerciseExercise?.hasSubmittableFiles == true, isOptional = optionalCategories.contains(exercise.difficulty), @@ -273,13 +273,7 @@ class ExercisesUpdater( submissionResult.updateStatus(submission.status) submissionResult.userPoints = submission.grade submissionResult.latePenalty = submission.latePenaltyApplied - //ignore unknown keys? - //val json = Json { ignoreUnknownKeys = true } - //TODO: muista palauttaa tyhjä lista testauksen jälkeen submissionResult.tags = submission.submissionTags - //println(submission?.gradingData) - //json.decodeFromString(submission.gradingData?.gradingData ?: "\"submission_tags\":\"\"").submissionTags?.split(",") ?: emptyList() - //tänne myös tunnisteet, koska jokaisella palautuskerralla ne päivittyy Notifier.notify(FeedbackAvailableNotification(submissionResult, exercise, project), project) fireExerciseUpdated(exercise) } diff --git a/src/main/kotlin/fi/aalto/cs/apluscourses/ui/exercise/ExercisesTreeRenderer.kt b/src/main/kotlin/fi/aalto/cs/apluscourses/ui/exercise/ExercisesTreeRenderer.kt index 0051c81da..ca629964d 100644 --- a/src/main/kotlin/fi/aalto/cs/apluscourses/ui/exercise/ExercisesTreeRenderer.kt +++ b/src/main/kotlin/fi/aalto/cs/apluscourses/ui/exercise/ExercisesTreeRenderer.kt @@ -181,19 +181,18 @@ class ExercisesTreeRenderer : NodeRenderer() { } } - private fun statusToColor(status: Status): Color { //tämä on vastuussa koko tehtävän väristä + private fun statusToColor(status: Status): Color { val baseColor = when (status) { Status.FULL_POINTS -> JBColor(0x8bc34a, 0x8bc34a) - Status.NO_POINTS, Status.PARTIAL_POINTS -> JBColor(0xffb74d, 0xffb74d) //kuseeko tämä? + Status.NO_POINTS, Status.PARTIAL_POINTS -> JBColor(0xffb74d, 0xffb74d) else -> JBColor(0xc5c5c5, 0xc5c5c5) } return if (isSubmittable()) baseColor else ColorUtil.withAlpha(baseColor, 0.5) } //määrittelee yksittäisen palautksen väriä - private fun submissionResultToColor(submission: SubmissionResult): Color { //tämä aiheuttaa luultavasti väärän värin palautuksen jälkeen - //toinen ehto antaa aina true viimeisellä palautuksella jostain syystä - return if (submission.userPoints == submission.maxPoints && !submission.hasTag("warn")) { //virhe oli tunnisteiden tallentamisessa, nyt toimii + private fun submissionResultToColor(submission: SubmissionResult): Color { + return if (submission.userPoints == submission.maxPoints && !submission.hasTag("warn")) { JBColor(0x8bc34a, 0x8bc34a) } else { JBColor(0xffb74d, 0xffb74d) @@ -275,23 +274,21 @@ class ExercisesTreeRenderer : NodeRenderer() { } companion object { - private fun getStatus(exercise: Exercise): Status { //set status to warn if the tag is set or change how PARTIAL_POINTS works? + private fun getStatus(exercise: Exercise): Status { return if (exercise.isInGrading()) { Status.IN_GRADING } else if (exercise.isOptional) { Status.OPTIONAL_PRACTICE } else if (exercise.submissionResults.isEmpty()) { Status.NO_SUBMISSIONS - } else if (exercise.userPoints == exercise.maxPoints && !exercise.bestHasWarn()) { //toinen ehto antaa aina true viimeisen palautuksen jälkeen - //TODO: yksittäisestä tehtävästä jossa on warn voi edelleen tulla vihreät pisteet, jos avaa intellij uudestaan sit muuttuu keltaiseksi - //println("warn is not set!") + } else if (exercise.userPoints == exercise.maxPoints && !exercise.bestHasWarn()) { Status.FULL_POINTS } else if (exercise.isLate()) { Status.LATE } else if (exercise.userPoints == 0) { Status.NO_POINTS } else { - Status.PARTIAL_POINTS //koska tämä on oeltustila, voi vain katsoa jos on tyäydet pisteet eikä warn-tunnistetta + Status.PARTIAL_POINTS } } @@ -301,7 +298,7 @@ class ExercisesTreeRenderer : NodeRenderer() { Status.OPTIONAL_PRACTICE -> CoursesIcons.OptionalPractice Status.NO_SUBMISSIONS -> CoursesIcons.NoSubmissions Status.NO_POINTS -> CoursesIcons.NoPoints - Status.PARTIAL_POINTS -> CoursesIcons.PartialPoints //warning should probably be incorporated into this + Status.PARTIAL_POINTS -> CoursesIcons.PartialPoints Status.FULL_POINTS -> CoursesIcons.FullPoints Status.LATE -> CoursesIcons.Late Status.IN_GRADING -> CoursesIcons.Loading