forked from github/szkolny
[Vulcan/Hebe] Add getting grades.
This commit is contained in:
parent
ae20c30c88
commit
c7d2ac4e3e
@ -127,6 +127,7 @@ const val VULCAN_WEB_ENDPOINT_LUCKY_NUMBER = "Start.mvc/GetKidsLuckyNumbers"
|
||||
const val VULCAN_WEB_ENDPOINT_REGISTER_DEVICE = "RejestracjaUrzadzeniaToken.mvc/Get"
|
||||
const val VULCAN_HEBE_ENDPOINT_REGISTER_NEW = "api/mobile/register/new"
|
||||
const val VULCAN_HEBE_ENDPOINT_MAIN = "api/mobile/register/hebe"
|
||||
const val VULCAN_HEBE_ENDPOINT_GRADES = "api/mobile/grade"
|
||||
|
||||
const val EDUDZIENNIK_USER_AGENT = "Szkolny.eu/${BuildConfig.VERSION_NAME}"
|
||||
|
||||
|
@ -20,6 +20,8 @@ const val ENDPOINT_VULCAN_API_ATTENDANCE = 1080
|
||||
const val ENDPOINT_VULCAN_API_MESSAGES_INBOX = 1090
|
||||
const val ENDPOINT_VULCAN_API_MESSAGES_SENT = 1100
|
||||
const val ENDPOINT_VULCAN_WEB_LUCKY_NUMBERS = 2010
|
||||
const val ENDPOINT_VULCAN_HEBE_MAIN = 3000
|
||||
const val ENDPOINT_VULCAN_HEBE_GRADES = 3040
|
||||
|
||||
val VulcanFeatures = listOf(
|
||||
// timetable
|
||||
@ -35,6 +37,9 @@ val VulcanFeatures = listOf(
|
||||
ENDPOINT_VULCAN_API_GRADES to LOGIN_METHOD_VULCAN_API,
|
||||
ENDPOINT_VULCAN_API_GRADES_SUMMARY to LOGIN_METHOD_VULCAN_API
|
||||
), listOf(LOGIN_METHOD_VULCAN_API)),
|
||||
Feature(LOGIN_TYPE_VULCAN, FEATURE_GRADES, listOf(
|
||||
ENDPOINT_VULCAN_HEBE_GRADES to LOGIN_METHOD_VULCAN_HEBE
|
||||
), listOf(LOGIN_METHOD_VULCAN_HEBE)),
|
||||
// homework
|
||||
Feature(LOGIN_TYPE_VULCAN, FEATURE_HOMEWORK, listOf(
|
||||
ENDPOINT_VULCAN_API_HOMEWORK to LOGIN_METHOD_VULCAN_API
|
||||
|
@ -7,6 +7,7 @@ package pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.data
|
||||
import pl.szczodrzynski.edziennik.R
|
||||
import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.*
|
||||
import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.data.api.*
|
||||
import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.data.hebe.VulcanHebeGrades
|
||||
import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.data.web.VulcanWebLuckyNumber
|
||||
import pl.szczodrzynski.edziennik.utils.Utils
|
||||
|
||||
@ -91,6 +92,10 @@ class VulcanData(val data: DataVulcan, val onSuccess: () -> Unit) {
|
||||
data.startProgress(R.string.edziennik_progress_endpoint_lucky_number)
|
||||
VulcanWebLuckyNumber(data, lastSync, onSuccess)
|
||||
}
|
||||
ENDPOINT_VULCAN_HEBE_GRADES -> {
|
||||
data.startProgress(R.string.edziennik_progress_endpoint_grades)
|
||||
VulcanHebeGrades(data, lastSync, onSuccess)
|
||||
}
|
||||
else -> onSuccess(endpointId)
|
||||
}
|
||||
}
|
||||
|
@ -1,6 +1,7 @@
|
||||
package pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.data
|
||||
|
||||
import android.os.Build
|
||||
import androidx.core.util.set
|
||||
import com.google.gson.JsonArray
|
||||
import com.google.gson.JsonElement
|
||||
import com.google.gson.JsonObject
|
||||
@ -14,6 +15,8 @@ import pl.szczodrzynski.edziennik.data.api.*
|
||||
import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.DataVulcan
|
||||
import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.data.hebe.HebeFilterType
|
||||
import pl.szczodrzynski.edziennik.data.api.models.ApiError
|
||||
import pl.szczodrzynski.edziennik.data.db.entity.Subject
|
||||
import pl.szczodrzynski.edziennik.data.db.entity.Teacher
|
||||
import pl.szczodrzynski.edziennik.utils.Utils.d
|
||||
import pl.szczodrzynski.edziennik.utils.models.Date
|
||||
import java.net.HttpURLConnection
|
||||
@ -36,6 +39,47 @@ open class VulcanHebe(open val data: DataVulcan, open val lastSync: Long?) {
|
||||
val profile
|
||||
get() = data.profile
|
||||
|
||||
fun getDate(json: JsonObject?, key: String): Long {
|
||||
val date = json.getJsonObject(key)
|
||||
return date.getLong("Timestamp") ?: return System.currentTimeMillis()
|
||||
}
|
||||
|
||||
fun getTeacherId(json: JsonObject?, key: String): Long {
|
||||
val teacher = json.getJsonObject(key)
|
||||
val teacherId = teacher.getLong("Id") ?: return -1
|
||||
if (data.teacherList[teacherId] == null) {
|
||||
data.teacherList[teacherId] = Teacher(
|
||||
data.profileId,
|
||||
teacherId,
|
||||
teacher.getString("Name") ?: "",
|
||||
teacher.getString("Surname") ?: ""
|
||||
)
|
||||
}
|
||||
return teacherId
|
||||
}
|
||||
|
||||
fun getSubjectId(json: JsonObject?, key: String): Long {
|
||||
val subject = json.getJsonObject(key)
|
||||
val subjectId = subject.getLong("Id") ?: return -1
|
||||
if (data.subjectList[subjectId] == null) {
|
||||
data.subjectList[subjectId] = Subject(
|
||||
data.profileId,
|
||||
subjectId,
|
||||
subject.getString("Name") ?: "",
|
||||
subject.getString("Kod") ?: ""
|
||||
)
|
||||
}
|
||||
return subjectId
|
||||
}
|
||||
|
||||
fun getSemester(json: JsonObject?): Int {
|
||||
val periodId = json.getInt("PeriodId") ?: return 1
|
||||
return if (periodId == data.semester1Id)
|
||||
1
|
||||
else
|
||||
2
|
||||
}
|
||||
|
||||
inline fun <reified T> apiRequest(
|
||||
tag: String,
|
||||
endpoint: String,
|
||||
@ -168,7 +212,9 @@ open class VulcanHebe(open val data: DataVulcan, open val lastSync: Long?) {
|
||||
firebaseToken: String? = null,
|
||||
crossinline onSuccess: (json: T, response: Response?) -> Unit
|
||||
) {
|
||||
val queryPath = query.map { it.key + "=" + URLEncoder.encode(it.value, "UTF-8") }.join("&")
|
||||
val queryPath = query.map {
|
||||
it.key + "=" + URLEncoder.encode(it.value, "UTF-8").replace("+", "%20")
|
||||
}.join("&")
|
||||
apiRequest(
|
||||
tag,
|
||||
if (query.isNotEmpty()) "$endpoint?$queryPath" else endpoint,
|
||||
|
@ -0,0 +1,119 @@
|
||||
package pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.data.hebe
|
||||
|
||||
import pl.szczodrzynski.edziennik.*
|
||||
import pl.szczodrzynski.edziennik.data.api.VULCAN_HEBE_ENDPOINT_GRADES
|
||||
import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.DataVulcan
|
||||
import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.ENDPOINT_VULCAN_HEBE_GRADES
|
||||
import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.data.VulcanHebe
|
||||
import pl.szczodrzynski.edziennik.data.db.entity.Grade
|
||||
import pl.szczodrzynski.edziennik.data.db.entity.Metadata
|
||||
import java.text.DecimalFormat
|
||||
import kotlin.math.roundToInt
|
||||
|
||||
class VulcanHebeGrades(
|
||||
override val data: DataVulcan,
|
||||
override val lastSync: Long?,
|
||||
val onSuccess: (endpointId: Int) -> Unit
|
||||
) : VulcanHebe(data, lastSync) {
|
||||
companion object {
|
||||
const val TAG = "VulcanApiGrades"
|
||||
}
|
||||
|
||||
init {
|
||||
apiGetList(
|
||||
TAG,
|
||||
VULCAN_HEBE_ENDPOINT_GRADES,
|
||||
HebeFilterType.BY_PUPIL,
|
||||
lastSync = lastSync
|
||||
) { list, _ ->
|
||||
list.forEach { grade ->
|
||||
val id = grade.getLong("Id") ?: return@forEach
|
||||
|
||||
val column = grade.getJsonObject("Column")
|
||||
val category = column.getJsonObject("Category")
|
||||
val categoryText = category.getString("Name")
|
||||
|
||||
val teacherId = getTeacherId(grade, "Creator")
|
||||
val subjectId = getSubjectId(column, "Subject")
|
||||
|
||||
val description = column.getString("Name")
|
||||
val comment = grade.getString("Comment")
|
||||
var value = grade.getFloat("Value")
|
||||
var weight = column.getFloat("Weight") ?: 0.0f
|
||||
val numerator = grade.getFloat("Numerator ")
|
||||
val denominator = grade.getFloat("Denominator")
|
||||
val addedDate = getDate(grade, "DateModify")
|
||||
|
||||
var finalDescription = ""
|
||||
|
||||
var name = when (numerator != null && denominator != null) {
|
||||
true -> {
|
||||
value = numerator / denominator
|
||||
finalDescription += DecimalFormat("#.##").format(numerator) +
|
||||
"/" + DecimalFormat("#.##").format(denominator)
|
||||
weight = 0.0f
|
||||
(value * 100).roundToInt().toString() + "%"
|
||||
}
|
||||
else -> {
|
||||
if (value == null) weight = 0.0f
|
||||
|
||||
grade.getString("Content") ?: ""
|
||||
}
|
||||
}
|
||||
|
||||
comment?.also {
|
||||
if (name == "") name = it
|
||||
else finalDescription = (if (finalDescription == "") "" else " ") + it
|
||||
}
|
||||
|
||||
description?.also {
|
||||
finalDescription = (if (finalDescription == "") "" else " - ") + it
|
||||
}
|
||||
|
||||
val columnColor = column.getInt("Color") ?: 0
|
||||
val color = if (columnColor == 0)
|
||||
when (name) {
|
||||
"1-", "1", "1+" -> 0xffd65757
|
||||
"2-", "2", "2+" -> 0xff9071b3
|
||||
"3-", "3", "3+" -> 0xffd2ab24
|
||||
"4-", "4", "4+" -> 0xff50b6d6
|
||||
"5-", "5", "5+" -> 0xff2cbd92
|
||||
"6-", "6", "6+" -> 0xff91b43c
|
||||
else -> 0xff3D5F9C
|
||||
}.toInt()
|
||||
else
|
||||
columnColor
|
||||
|
||||
val gradeObject = Grade(
|
||||
profileId = profileId,
|
||||
id = id,
|
||||
name = name,
|
||||
type = Grade.TYPE_NORMAL,
|
||||
value = value ?: 0.0f,
|
||||
weight = weight,
|
||||
color = color,
|
||||
category = categoryText,
|
||||
description = finalDescription,
|
||||
comment = null,
|
||||
semester = getSemester(column),
|
||||
teacherId = teacherId,
|
||||
subjectId = subjectId,
|
||||
addedDate = addedDate
|
||||
)
|
||||
|
||||
data.gradeList.add(gradeObject)
|
||||
data.metadataList.add(
|
||||
Metadata(
|
||||
profileId,
|
||||
Metadata.TYPE_GRADE,
|
||||
id,
|
||||
profile?.empty ?: true,
|
||||
profile?.empty ?: true
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
onSuccess(ENDPOINT_VULCAN_HEBE_GRADES)
|
||||
}
|
||||
}
|
||||
}
|
@ -5,10 +5,9 @@ import pl.szczodrzynski.edziennik.*
|
||||
import pl.szczodrzynski.edziennik.data.api.LOGIN_TYPE_VULCAN
|
||||
import pl.szczodrzynski.edziennik.data.api.VULCAN_HEBE_ENDPOINT_MAIN
|
||||
import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.DataVulcan
|
||||
import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.ENDPOINT_VULCAN_API_PUSH_CONFIG
|
||||
import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.ENDPOINT_VULCAN_HEBE_MAIN
|
||||
import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.data.VulcanHebe
|
||||
import pl.szczodrzynski.edziennik.data.db.entity.Profile
|
||||
import pl.szczodrzynski.edziennik.data.db.entity.SYNC_ALWAYS
|
||||
import pl.szczodrzynski.edziennik.utils.models.Date
|
||||
|
||||
class VulcanHebeMain(
|
||||
@ -146,7 +145,7 @@ class VulcanHebeMain(
|
||||
dateYearEnd?.let { newProfile.dateYearEnd = it }
|
||||
|
||||
if (profile != null)
|
||||
data.setSyncNext(ENDPOINT_VULCAN_API_PUSH_CONFIG, SYNC_ALWAYS)
|
||||
data.setSyncNext(ENDPOINT_VULCAN_HEBE_MAIN, 1 * DAY)
|
||||
|
||||
profileList?.add(newProfile)
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user