mirror of
https://github.com/szkolny-eu/szkolny-android.git
synced 2025-03-31 22:04:27 +02:00
[API/Podlasie] Fix saving class team, add main endpoint and getting the timetable.
This commit is contained in:
parent
3c2f85f263
commit
fcffa2afeb
@ -4,13 +4,11 @@
|
|||||||
|
|
||||||
package pl.szczodrzynski.edziennik.data.api.edziennik.podlasie
|
package pl.szczodrzynski.edziennik.data.api.edziennik.podlasie
|
||||||
|
|
||||||
import pl.szczodrzynski.edziennik.App
|
import pl.szczodrzynski.edziennik.*
|
||||||
import pl.szczodrzynski.edziennik.crc32
|
|
||||||
import pl.szczodrzynski.edziennik.data.api.LOGIN_METHOD_PODLASIE_API
|
import pl.szczodrzynski.edziennik.data.api.LOGIN_METHOD_PODLASIE_API
|
||||||
import pl.szczodrzynski.edziennik.data.api.models.Data
|
import pl.szczodrzynski.edziennik.data.api.models.Data
|
||||||
import pl.szczodrzynski.edziennik.data.db.entity.LoginStore
|
import pl.szczodrzynski.edziennik.data.db.entity.*
|
||||||
import pl.szczodrzynski.edziennik.data.db.entity.Profile
|
import kotlin.text.replace
|
||||||
import pl.szczodrzynski.edziennik.isNotNullNorEmpty
|
|
||||||
|
|
||||||
class DataPodlasie(app: App, profile: Profile?, loginStore: LoginStore) : Data(app, profile, loginStore) {
|
class DataPodlasie(app: App, profile: Profile?, loginStore: LoginStore) : Data(app, profile, loginStore) {
|
||||||
|
|
||||||
@ -83,4 +81,39 @@ class DataPodlasie(app: App, profile: Profile?, loginStore: LoginStore) : Data(a
|
|||||||
|
|
||||||
val loginShort: String?
|
val loginShort: String?
|
||||||
get() = studentLogin?.split('@')?.get(0)
|
get() = studentLogin?.split('@')?.get(0)
|
||||||
|
|
||||||
|
fun getSubject(name: String): Subject {
|
||||||
|
val id = name.crc32()
|
||||||
|
return subjectList.singleOrNull { it.id == id } ?: run {
|
||||||
|
val subject = Subject(profileId, id, name, name)
|
||||||
|
subjectList.put(id, subject)
|
||||||
|
subject
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun getTeacher(firstName: String, lastName: String): Teacher {
|
||||||
|
val name = "$firstName $lastName".fixName()
|
||||||
|
val id = name.crc32()
|
||||||
|
return teacherList.singleOrNull { it.id == id } ?: run {
|
||||||
|
val teacher = Teacher(profileId, id, firstName, lastName)
|
||||||
|
teacherList.put(id, teacher)
|
||||||
|
teacher
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun getTeam(name: String? = null): Team {
|
||||||
|
if (name == "cała klasa" || name == null) return teamClass ?: run {
|
||||||
|
val id = className!!.crc32()
|
||||||
|
val teamCode = "$schoolShortName:$className"
|
||||||
|
val team = Team(profileId, id, className, Team.TYPE_CLASS, teamCode, -1)
|
||||||
|
teamList.put(id, team)
|
||||||
|
return team
|
||||||
|
} else {
|
||||||
|
val id = name.crc32()
|
||||||
|
val teamCode = "$schoolShortName:$name"
|
||||||
|
val team = Team(profileId, id, name, Team.TYPE_VIRTUAL, teamCode, -1)
|
||||||
|
teamList.put(id, team)
|
||||||
|
return team
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -4,6 +4,15 @@
|
|||||||
|
|
||||||
package pl.szczodrzynski.edziennik.data.api.edziennik.podlasie
|
package pl.szczodrzynski.edziennik.data.api.edziennik.podlasie
|
||||||
|
|
||||||
|
import pl.szczodrzynski.edziennik.data.api.FEATURE_ALWAYS_NEEDED
|
||||||
|
import pl.szczodrzynski.edziennik.data.api.LOGIN_METHOD_PODLASIE_API
|
||||||
|
import pl.szczodrzynski.edziennik.data.api.LOGIN_TYPE_PODLASIE
|
||||||
import pl.szczodrzynski.edziennik.data.api.models.Feature
|
import pl.szczodrzynski.edziennik.data.api.models.Feature
|
||||||
|
|
||||||
val PodlasieFeatures = listOf<Feature>()
|
const val ENDPOINT_PODLASIE_API_MAIN = 1001
|
||||||
|
|
||||||
|
val PodlasieFeatures = listOf(
|
||||||
|
Feature(LOGIN_TYPE_PODLASIE, FEATURE_ALWAYS_NEEDED, listOf(
|
||||||
|
ENDPOINT_PODLASIE_API_MAIN to LOGIN_METHOD_PODLASIE_API
|
||||||
|
), listOf(LOGIN_METHOD_PODLASIE_API))
|
||||||
|
)
|
||||||
|
@ -98,7 +98,8 @@ open class PodlasieApi(open val data: DataPodlasie, open val lastSync: Long?) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun getSecurityToken(): String {
|
private fun getSecurityToken(): String {
|
||||||
val format = SimpleDateFormat("yyyy-MM-dd HH", Locale.ENGLISH).format(Calendar.getInstance().time.time)
|
val format = SimpleDateFormat("yyyy-MM-dd HH", Locale.ENGLISH)
|
||||||
|
.also { it.timeZone = TimeZone.getTimeZone("Europe/Warsaw") }.format(System.currentTimeMillis())
|
||||||
val instance = MessageDigest.getInstance("SHA-256")
|
val instance = MessageDigest.getInstance("SHA-256")
|
||||||
val digest = instance.digest("-EYlwYu8u16miVd8tT?oO7cvoUVQrQN0vr!$format".toByteArray()).toHexString()
|
val digest = instance.digest("-EYlwYu8u16miVd8tT?oO7cvoUVQrQN0vr!$format".toByteArray()).toHexString()
|
||||||
val digest2 = instance.digest(data.apiToken!!.toByteArray()).toHexString()
|
val digest2 = instance.digest(data.apiToken!!.toByteArray()).toHexString()
|
||||||
|
@ -4,7 +4,10 @@
|
|||||||
|
|
||||||
package pl.szczodrzynski.edziennik.data.api.edziennik.podlasie.data
|
package pl.szczodrzynski.edziennik.data.api.edziennik.podlasie.data
|
||||||
|
|
||||||
|
import pl.szczodrzynski.edziennik.R
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.podlasie.DataPodlasie
|
import pl.szczodrzynski.edziennik.data.api.edziennik.podlasie.DataPodlasie
|
||||||
|
import pl.szczodrzynski.edziennik.data.api.edziennik.podlasie.ENDPOINT_PODLASIE_API_MAIN
|
||||||
|
import pl.szczodrzynski.edziennik.data.api.edziennik.podlasie.data.api.PodlasieApiMain
|
||||||
import pl.szczodrzynski.edziennik.utils.Utils
|
import pl.szczodrzynski.edziennik.utils.Utils
|
||||||
|
|
||||||
class PodlasieData(val data: DataPodlasie, val onSuccess: () -> Unit) {
|
class PodlasieData(val data: DataPodlasie, val onSuccess: () -> Unit) {
|
||||||
@ -36,6 +39,10 @@ class PodlasieData(val data: DataPodlasie, val onSuccess: () -> Unit) {
|
|||||||
private fun useEndpoint(endpointId: Int, lastSync: Long?, onSuccess: (endpointId: Int) -> Unit) {
|
private fun useEndpoint(endpointId: Int, lastSync: Long?, onSuccess: (endpointId: Int) -> Unit) {
|
||||||
Utils.d(TAG, "Using endpoint $endpointId. Last sync time = $lastSync")
|
Utils.d(TAG, "Using endpoint $endpointId. Last sync time = $lastSync")
|
||||||
when (endpointId) {
|
when (endpointId) {
|
||||||
|
ENDPOINT_PODLASIE_API_MAIN -> {
|
||||||
|
data.startProgress(R.string.edziennik_progress_endpoint_data)
|
||||||
|
PodlasieApiMain(data, lastSync, onSuccess)
|
||||||
|
}
|
||||||
else -> onSuccess(endpointId)
|
else -> onSuccess(endpointId)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,32 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) Kacper Ziubryniewicz 2020-5-12
|
||||||
|
*/
|
||||||
|
|
||||||
|
package pl.szczodrzynski.edziennik.data.api.edziennik.podlasie.data.api
|
||||||
|
|
||||||
|
import pl.szczodrzynski.edziennik.asJsonObjectList
|
||||||
|
import pl.szczodrzynski.edziennik.data.api.PODLASIE_API_USER_ENDPOINT
|
||||||
|
import pl.szczodrzynski.edziennik.data.api.edziennik.podlasie.DataPodlasie
|
||||||
|
import pl.szczodrzynski.edziennik.data.api.edziennik.podlasie.ENDPOINT_PODLASIE_API_MAIN
|
||||||
|
import pl.szczodrzynski.edziennik.data.api.edziennik.podlasie.data.PodlasieApi
|
||||||
|
import pl.szczodrzynski.edziennik.data.db.entity.SYNC_ALWAYS
|
||||||
|
import pl.szczodrzynski.edziennik.getJsonArray
|
||||||
|
|
||||||
|
class PodlasieApiMain(override val data: DataPodlasie,
|
||||||
|
override val lastSync: Long?,
|
||||||
|
val onSuccess: (endpointId: Int) -> Unit) : PodlasieApi(data, lastSync) {
|
||||||
|
companion object {
|
||||||
|
const val TAG = "PodlasieApiTimetable"
|
||||||
|
}
|
||||||
|
|
||||||
|
init {
|
||||||
|
apiGet(TAG, PODLASIE_API_USER_ENDPOINT) { json ->
|
||||||
|
data.getTeam() // Save the class team when it doesn't exist.
|
||||||
|
|
||||||
|
json.getJsonArray("Timetable")?.asJsonObjectList()?.let { PodlasieApiTimetable(data, it) }
|
||||||
|
|
||||||
|
data.setSyncNext(ENDPOINT_PODLASIE_API_MAIN, SYNC_ALWAYS)
|
||||||
|
onSuccess(ENDPOINT_PODLASIE_API_MAIN)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,89 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) Kacper Ziubryniewicz 2020-5-12
|
||||||
|
*/
|
||||||
|
|
||||||
|
package pl.szczodrzynski.edziennik.data.api.edziennik.podlasie.data.api
|
||||||
|
|
||||||
|
import com.google.gson.JsonObject
|
||||||
|
import pl.szczodrzynski.edziennik.data.api.edziennik.podlasie.DataPodlasie
|
||||||
|
import pl.szczodrzynski.edziennik.data.api.models.DataRemoveModel
|
||||||
|
import pl.szczodrzynski.edziennik.data.db.entity.Lesson
|
||||||
|
import pl.szczodrzynski.edziennik.getInt
|
||||||
|
import pl.szczodrzynski.edziennik.getString
|
||||||
|
import pl.szczodrzynski.edziennik.utils.models.Date
|
||||||
|
import pl.szczodrzynski.edziennik.utils.models.Time
|
||||||
|
import pl.szczodrzynski.edziennik.utils.models.Week
|
||||||
|
|
||||||
|
class PodlasieApiTimetable(val data: DataPodlasie, rows: List<JsonObject>) {
|
||||||
|
init {
|
||||||
|
val currentWeekStart = Week.getWeekStart()
|
||||||
|
|
||||||
|
if (Date.getToday().weekDay > 4) {
|
||||||
|
currentWeekStart.stepForward(0, 0, 7)
|
||||||
|
}
|
||||||
|
|
||||||
|
val getDate = data.arguments?.getString("weekStart") ?: currentWeekStart.stringY_m_d
|
||||||
|
|
||||||
|
val weekStart = Date.fromY_m_d(getDate)
|
||||||
|
val weekEnd = weekStart.clone().stepForward(0, 0, 6)
|
||||||
|
|
||||||
|
val days = mutableListOf<Int>()
|
||||||
|
var startDate: Date? = null
|
||||||
|
var endDate: Date? = null
|
||||||
|
|
||||||
|
rows.forEach { lesson ->
|
||||||
|
val date = lesson.getString("Date")?.let { Date.fromY_m_d(it) } ?: return@forEach
|
||||||
|
|
||||||
|
if ((date > weekEnd || date < weekStart) && data.profile?.empty != true) return@forEach
|
||||||
|
if (startDate == null) startDate = date.clone()
|
||||||
|
endDate = date.clone()
|
||||||
|
if (date.value !in days) days += date.value
|
||||||
|
|
||||||
|
val lessonNumber = lesson.getInt("LessonNumber") ?: return@forEach
|
||||||
|
val startTime = lesson.getString("TimeFrom")?.let { Time.fromH_m_s(it) }
|
||||||
|
?: return@forEach
|
||||||
|
val endTime = lesson.getString("TimeTo")?.let { Time.fromH_m_s(it) } ?: return@forEach
|
||||||
|
val subject = lesson.getString("SchoolSubject")?.let { data.getSubject(it) }
|
||||||
|
?: return@forEach
|
||||||
|
|
||||||
|
val teacherFirstName = lesson.getString("TeacherFirstName") ?: return@forEach
|
||||||
|
val teacherLastName = lesson.getString("TeacherLastName") ?: return@forEach
|
||||||
|
val teacher = data.getTeacher(teacherFirstName, teacherLastName)
|
||||||
|
|
||||||
|
val team = lesson.getString("Group")?.let { data.getTeam(it) } ?: return@forEach
|
||||||
|
val classroom = lesson.getString("Room")
|
||||||
|
|
||||||
|
Lesson(data.profileId, -1).also {
|
||||||
|
it.type = Lesson.TYPE_NORMAL
|
||||||
|
it.date = date
|
||||||
|
it.lessonNumber = lessonNumber
|
||||||
|
it.startTime = startTime
|
||||||
|
it.endTime = endTime
|
||||||
|
it.subjectId = subject.id
|
||||||
|
it.teacherId = teacher.id
|
||||||
|
it.teamId = team.id
|
||||||
|
it.classroom = classroom
|
||||||
|
|
||||||
|
it.id = it.buildId()
|
||||||
|
data.lessonList += it
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (startDate != null && endDate != null) {
|
||||||
|
if (weekEnd > endDate!!) endDate = weekEnd
|
||||||
|
|
||||||
|
while (startDate!! <= endDate!!) {
|
||||||
|
if (startDate!!.value !in days) {
|
||||||
|
val lessonDate = startDate!!.clone()
|
||||||
|
data.lessonList += Lesson(data.profileId, lessonDate.value.toLong()).apply {
|
||||||
|
type = Lesson.TYPE_NO_LESSONS
|
||||||
|
date = lessonDate
|
||||||
|
}
|
||||||
|
}
|
||||||
|
startDate!!.stepForward(0, 0, 1)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
data.toRemove.add(DataRemoveModel.Timetable.between(weekStart, weekEnd))
|
||||||
|
}
|
||||||
|
}
|
@ -60,6 +60,7 @@ class PodlasieFirstLogin(val data: DataPodlasie, val onSuccess: () -> Unit) {
|
|||||||
schoolYear?.split('/')?.get(0)?.toInt()?.let {
|
schoolYear?.split('/')?.get(0)?.toInt()?.let {
|
||||||
studentSchoolYearStart = it
|
studentSchoolYearStart = it
|
||||||
}
|
}
|
||||||
|
studentClassName = className
|
||||||
}
|
}
|
||||||
|
|
||||||
EventBus.getDefault().postSticky(FirstLoginFinishedEvent(listOf(profile), data.loginStore))
|
EventBus.getDefault().postSticky(FirstLoginFinishedEvent(listOf(profile), data.loginStore))
|
||||||
|
Loading…
x
Reference in New Issue
Block a user