mirror of
https://github.com/szkolny-eu/szkolny-android.git
synced 2025-01-31 05:48:19 +01:00
[API/Idziennik] Correct showing proposed descriptive grades. Clarify some connection errors.
This commit is contained in:
parent
f5a7799924
commit
b790421693
@ -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()
|
||||||
|
|
||||||
|
@ -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) {
|
||||||
|
@ -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>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user