[API/Idziennik] Correct showing proposed descriptive grades. Clarify some connection errors.

This commit is contained in:
Kuba Szczodrzyński 2020-04-02 11:17:47 +02:00
parent f5a7799924
commit b790421693
3 changed files with 103 additions and 20 deletions

View File

@ -13,6 +13,7 @@ import pl.szczodrzynski.edziennik.data.api.edziennik.idziennik.data.IdziennikWeb
import pl.szczodrzynski.edziennik.data.api.models.ApiError import pl.szczodrzynski.edziennik.data.api.models.ApiError
import pl.szczodrzynski.edziennik.data.api.models.DataRemoveModel import pl.szczodrzynski.edziennik.data.api.models.DataRemoveModel
import pl.szczodrzynski.edziennik.data.db.entity.Grade import pl.szczodrzynski.edziennik.data.db.entity.Grade
import pl.szczodrzynski.edziennik.data.db.entity.Grade.Companion.TYPE_DESCRIPTIVE
import pl.szczodrzynski.edziennik.data.db.entity.Grade.Companion.TYPE_SEMESTER1_PROPOSED import pl.szczodrzynski.edziennik.data.db.entity.Grade.Companion.TYPE_SEMESTER1_PROPOSED
import pl.szczodrzynski.edziennik.data.db.entity.Grade.Companion.TYPE_YEAR_PROPOSED import pl.szczodrzynski.edziennik.data.db.entity.Grade.Companion.TYPE_YEAR_PROPOSED
import pl.szczodrzynski.edziennik.data.db.entity.Metadata import pl.szczodrzynski.edziennik.data.db.entity.Metadata
@ -20,7 +21,6 @@ import pl.szczodrzynski.edziennik.data.db.entity.SYNC_ALWAYS
import pl.szczodrzynski.edziennik.getJsonArray import pl.szczodrzynski.edziennik.getJsonArray
import pl.szczodrzynski.edziennik.getJsonObject import pl.szczodrzynski.edziennik.getJsonObject
import pl.szczodrzynski.edziennik.getString import pl.szczodrzynski.edziennik.getString
import pl.szczodrzynski.edziennik.utils.Utils.getWordGradeValue
class IdziennikWebProposedGrades(override val data: DataIdziennik, class IdziennikWebProposedGrades(override val data: DataIdziennik,
override val lastSync: Long?, override val lastSync: Long?,
@ -39,36 +39,64 @@ class IdziennikWebProposedGrades(override val data: DataIdziennik,
.withApiResponse(result)) .withApiResponse(result))
return@webApiGet return@webApiGet
} }
val manager = data.app.gradesManager
json.getJsonArray("Przedmioty")?.asJsonObjectList()?.forEach { subject -> json.getJsonArray("Przedmioty")?.asJsonObjectList()?.forEach { subject ->
val subjectName = subject.getString("Przedmiot") ?: return@forEach val subjectName = subject.getString("Przedmiot") ?: return@forEach
val subjectObject = data.getSubject(subjectName, null, subjectName) val subjectObject = data.getSubject(subjectName, null, subjectName)
val semester1Proposed = subject.getString("OcenaSem1") ?: "" val semester1Proposed = subject.getString("OcenaSem1") ?: ""
val semester1Value = getWordGradeValue(semester1Proposed) val semester1Value = manager.getGradeValue(semester1Proposed)
val semester1Id = subjectObject.id * (-100) - 1 val semester1Id = subjectObject.id * (-100) - 1
val semester1Type =
if (semester1Value == 0f) TYPE_DESCRIPTIVE
else TYPE_SEMESTER1_PROPOSED
val semester1Name = when {
semester1Value == 0f -> " "
semester1Value % 1.0f == 0f -> semester1Value.toInt().toString()
else -> semester1Value.toString()
}
val semester1Color =
if (semester1Value == 0f) 0xff536dfe.toInt()
else -1
val semester2Proposed = subject.getString("OcenaSem2") ?: "" val semester2Proposed = subject.getString("OcenaSem2") ?: ""
val semester2Value = getWordGradeValue(semester2Proposed) val semester2Value = manager.getGradeValue(semester2Proposed)
val semester2Id = subjectObject.id * (-100) - 2 val semester2Id = subjectObject.id * (-100) - 2
val semester2Type =
if (semester2Value == 0f) TYPE_DESCRIPTIVE
else TYPE_YEAR_PROPOSED
val semester2Name = when {
semester2Value == 0f -> " "
semester2Value % 1.0f == 0f -> semester2Value.toInt().toString()
else -> semester2Value.toString()
}
val semester2Color =
if (semester2Value == 0f) 0xffff4081.toInt()
else -1
if (semester1Proposed != "") { if (semester1Proposed != "") {
val gradeObject = Grade( val gradeObject = Grade(
profileId = profileId, profileId = profileId,
id = semester1Id, id = semester1Id,
name = semester1Value.toString(), name = semester1Name,
type = TYPE_SEMESTER1_PROPOSED, type = semester1Type,
value = semester1Value.toFloat(), value = semester1Value,
weight = 0f, weight = 0f,
color = -1, color = semester1Color,
category = null, category = if (semester1Value == 0f) "Ocena opisowa semestralna" else null,
description = null, description = if (semester1Value == 0f) semester1Proposed else null,
comment = null, comment = null,
semester = 1, semester = 1,
teacherId = -1, teacherId = -1,
subjectId = subjectObject.id subjectId = subjectObject.id
) )
val addedDate = if (data.profile.empty)
data.profile.dateSemester1Start.inMillis
else
System.currentTimeMillis()
data.gradeList.add(gradeObject) data.gradeList.add(gradeObject)
data.metadataList.add(Metadata( data.metadataList.add(Metadata(
profileId, profileId,
@ -76,7 +104,7 @@ class IdziennikWebProposedGrades(override val data: DataIdziennik,
gradeObject.id, gradeObject.id,
profile.empty, profile.empty,
profile.empty, profile.empty,
System.currentTimeMillis() addedDate
)) ))
} }
@ -84,13 +112,13 @@ class IdziennikWebProposedGrades(override val data: DataIdziennik,
val gradeObject = Grade( val gradeObject = Grade(
profileId = profileId, profileId = profileId,
id = semester2Id, id = semester2Id,
name = semester2Value.toString(), name = semester2Name,
type = TYPE_YEAR_PROPOSED, type = semester2Type,
value = semester2Value.toFloat(), value = semester2Value,
weight = 0f, weight = 0f,
color = -1, color = semester2Color,
category = null, category = if (semester2Value == 0f) "Ocena opisowa końcoworoczna" else null,
description = null, description = if (semester2Value == 0f) semester2Proposed else null,
comment = null, comment = null,
semester = 2, semester = 2,
teacherId = -1, teacherId = -1,
@ -98,7 +126,7 @@ class IdziennikWebProposedGrades(override val data: DataIdziennik,
) )
val addedDate = if (data.profile.empty) val addedDate = if (data.profile.empty)
data.profile.dateSemester1Start.inMillis data.profile.dateSemester2Start.inMillis
else else
System.currentTimeMillis() System.currentTimeMillis()

View File

@ -82,10 +82,19 @@ class GradesManager(val app: App) : CoroutineScope {
else -> null else -> null
} }
/**
* Returns the "rounded" grade value as an integer.
* The decimal value is rounded to ceil if >= 0.75.
*/
fun getRoundedGrade(value: Float): Int { fun getRoundedGrade(value: Float): Int {
return floor(value.toDouble()).toInt() + if (value % 1.0f >= 0.75) 1 else 0 return floor(value.toDouble()).toInt() + if (value % 1.0f >= 0.75) 1 else 0
} }
/**
* Get a grade value, either saved in the [grade]
* or calculated including the [plusValue] and
* [minusValue].
*/
fun getGradeValue(grade: Grade): Float { fun getGradeValue(grade: Grade): Float {
if (plusValue == null && minusValue == null) if (plusValue == null && minusValue == null)
return grade.value return grade.value
@ -102,6 +111,10 @@ class GradesManager(val app: App) : CoroutineScope {
return grade.value return grade.value
} }
/**
* Returns a weight if the grade should be counted
* to the average, 0f otherwise.
*/
fun getGradeWeight(dontCountEnabled: Boolean, dontCountGrades: List<String>, grade: Grade): Float { fun getGradeWeight(dontCountEnabled: Boolean, dontCountGrades: List<String>, grade: Grade): Float {
if (!dontCountEnabled) if (!dontCountEnabled)
return grade.weight return grade.weight
@ -161,6 +174,48 @@ class GradesManager(val app: App) : CoroutineScope {
return color or 0xff000000.toInt() return color or 0xff000000.toInt()
} }
/**
* Calculate the grade's value using
* the specified [name].
*/
fun getGradeValue(name: String): Float {
return when (name.toLowerCase()) {
"1-" -> 0.75f
"1" -> 1.00f
"1+" -> 1.50f
"2-" -> 1.75f
"2" -> 2.00f
"2+" -> 2.50f
"3-" -> 2.75f
"3" -> 3.00f
"3+" -> 3.50f
"4-" -> 3.75f
"4" -> 4.00f
"4+" -> 4.50f
"5-" -> 4.75f
"5" -> 5.00f
"5+" -> 5.50f
"6-" -> 5.75f
"6" -> 6.00f
"6+" -> 6.50f
"niedostateczny", "f" -> 1f
"dopuszczający", "e" -> 2f
"dostateczny", "d" -> 3f
"dobry", "c" -> 4f
"bardzo dobry", "b" -> 5f
"celujący", "a" -> 6f
else -> 0f
}
}
/* _ _ _____ _____ _ __ _
| | | |_ _| / ____| (_)/ _(_)
| | | | | | | (___ _ __ ___ ___ _| |_ _ ___
| | | | | | \___ \| '_ \ / _ \/ __| | _| |/ __|
| |__| |_| |_ ____) | |_) | __/ (__| | | | | (__
\____/|_____| |_____/| .__/ \___|\___|_|_| |_|\___|
| |
|*/
fun markAsSeen(grade: GradeFull) { fun markAsSeen(grade: GradeFull) {
grade.seen = true grade.seen = true
startCoroutineTimer(500L, 0L) { startCoroutineTimer(500L, 0L) {

View File

@ -182,7 +182,7 @@
<string name="error_1_reason">Aplikacja przestała działać</string> <string name="error_1_reason">Aplikacja przestała działać</string>
<string name="error_10_reason">Nie udało się wysłać wiadomości: nowa wiadomość nie została odnaleziona na liście wiadomości wysłanych</string> <string name="error_10_reason">Nie udało się wysłać wiadomości: nowa wiadomość nie została odnaleziona na liście wiadomości wysłanych</string>
<string name="error_50_reason">Błąd odpowiedzi serwera</string> <string name="error_50_reason">Błąd odpowiedzi serwera. Dziennik może być przeciążony lub mieć przerwę techniczną.</string>
<string name="error_51_reason">Błąd serwera: nieprawidłowe zapytanie. Dziennik może być przeciążony lub mieć przerwę techniczną.</string> <string name="error_51_reason">Błąd serwera: nieprawidłowe zapytanie. Dziennik może być przeciążony lub mieć przerwę techniczną.</string>
<string name="error_52_reason">Błąd serwera: odmowa dostępu</string> <string name="error_52_reason">Błąd serwera: odmowa dostępu</string>
<string name="error_53_reason">Błąd serwera: dostęp zabroniony</string> <string name="error_53_reason">Błąd serwera: dostęp zabroniony</string>
@ -193,9 +193,9 @@
<string name="error_58_reason">Wewnętrzny błąd serwera. Dziennik może być przeciążony lub mieć przerwę techniczną.</string> <string name="error_58_reason">Wewnętrzny błąd serwera. Dziennik może być przeciążony lub mieć przerwę techniczną.</string>
<string name="error_59_reason">Dziennik jest tymczasowo niedostępny</string> <string name="error_59_reason">Dziennik jest tymczasowo niedostępny</string>
<string name="error_60_reason">Brak internetu: nie znaleziono adresu serwera</string> <string name="error_60_reason">Brak internetu: nie znaleziono adresu serwera</string>
<string name="error_61_reason">Brak internetu: przekroczono czas oczekiwania. Dziennik może być przeciążony lub mieć przerwę techniczną.</string> <string name="error_61_reason">Przekroczono czas oczekiwania. Dziennik może być przeciążony lub mieć przerwę techniczną.</string>
<string name="error_62_reason">Brak internetu</string> <string name="error_62_reason">Brak internetu</string>
<string name="error_63_reason">Brak internetu: połączenie SSL nie powiodło się</string> <string name="error_63_reason">Połączenie bezpieczne nie powiodło się. Sprawdź, czy masz ustawioną poprawnie datę i godzinę.</string>
<string name="error_100_reason">Brak odpowiedzi serwera. Dziennik może być przeciążony lub mieć przerwę techniczną.</string> <string name="error_100_reason">Brak odpowiedzi serwera. Dziennik może być przeciążony lub mieć przerwę techniczną.</string>
<string name="error_101_reason">Dane logowania niekompletne. Skontaktuj się z twórcą aplikacji.</string> <string name="error_101_reason">Dane logowania niekompletne. Skontaktuj się z twórcą aplikacji.</string>
<string name="error_102_reason">Nieprawidłowe dane logowania</string> <string name="error_102_reason">Nieprawidłowe dane logowania</string>