forked from github/szkolny
[API/Edudziennik] Add getting teams and exams.
This commit is contained in:
parent
cb5eb19abc
commit
658e59bed6
@ -671,3 +671,14 @@ inline fun <T> List<T>.ifNotEmpty(block: (List<T>) -> Unit) {
|
|||||||
if (!isEmpty())
|
if (!isEmpty())
|
||||||
block(this)
|
block(this)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
val String.firstLettersName: String
|
||||||
|
get() {
|
||||||
|
var nameShort = ""
|
||||||
|
this.split(" ").forEach {
|
||||||
|
if (it.isBlank())
|
||||||
|
return@forEach
|
||||||
|
nameShort += it[0].toLowerCase()
|
||||||
|
}
|
||||||
|
return nameShort
|
||||||
|
}
|
||||||
|
@ -104,11 +104,20 @@ object Regexes {
|
|||||||
val EDUDZIENNIK_GRADE_ID by lazy {
|
val EDUDZIENNIK_GRADE_ID by lazy {
|
||||||
"""/Grades/([\w-_]+?)/""".toRegex()
|
"""/Grades/([\w-_]+?)/""".toRegex()
|
||||||
}
|
}
|
||||||
|
val EDUDZIENNIK_EXAM_ID by lazy {
|
||||||
|
"""/Evaluations/([\w-_]+?)/""".toRegex()
|
||||||
|
}
|
||||||
|
|
||||||
val EDUDZIENNIK_SCHOOL_DETAIL_ID by lazy {
|
val EDUDZIENNIK_SCHOOL_DETAIL_ID by lazy {
|
||||||
"""<a id="School_detail".*?/School/([\w-_]+?)/""".toRegex(RegexOption.DOT_MATCHES_ALL)
|
"""<a id="School_detail".*?/School/([\w-_]+?)/""".toRegex(RegexOption.DOT_MATCHES_ALL)
|
||||||
}
|
}
|
||||||
|
val EDUDZIENNIK_SCHOOL_DETAIL_NAME by lazy {
|
||||||
|
"""</li>.*?<p>(.*?)</p>.*?<li>""".toRegex(RegexOption.DOT_MATCHES_ALL)
|
||||||
|
}
|
||||||
val EDUDZIENNIK_CLASS_DETAIL_ID by lazy {
|
val EDUDZIENNIK_CLASS_DETAIL_ID by lazy {
|
||||||
"""<a id="Klass_detail".*?/Klass/([\w-_]+?)/""".toRegex(RegexOption.DOT_MATCHES_ALL)
|
"""<a id="Klass_detail".*?/Klass/([\w-_]+?)/""".toRegex(RegexOption.DOT_MATCHES_ALL)
|
||||||
}
|
}
|
||||||
|
val EDUDZIENNIK_CLASS_DETAIL_NAME by lazy {
|
||||||
|
"""<a id="Klass_detail".*?>Klasa (.*?)</a>""".toRegex(RegexOption.DOT_MATCHES_ALL)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -9,6 +9,7 @@ import pl.szczodrzynski.edziennik.data.api.models.Feature
|
|||||||
|
|
||||||
const val ENDPOINT_EDUDZIENNIK_WEB_START = 1000
|
const val ENDPOINT_EDUDZIENNIK_WEB_START = 1000
|
||||||
const val ENDPOINT_EDUDZIENNIK_WEB_TIMETABLE = 1001
|
const val ENDPOINT_EDUDZIENNIK_WEB_TIMETABLE = 1001
|
||||||
|
const val ENDPOINT_EDUDZIENNIK_WEB_EXAMS = 1002
|
||||||
const val ENDPOINT_EDUDZIENNIK_WEB_LUCKY_NUMBER = 1010
|
const val ENDPOINT_EDUDZIENNIK_WEB_LUCKY_NUMBER = 1010
|
||||||
|
|
||||||
val EdudziennikFeatures = listOf(
|
val EdudziennikFeatures = listOf(
|
||||||
@ -24,6 +25,10 @@ val EdudziennikFeatures = listOf(
|
|||||||
ENDPOINT_EDUDZIENNIK_WEB_START to LOGIN_METHOD_EDUDZIENNIK_WEB
|
ENDPOINT_EDUDZIENNIK_WEB_START to LOGIN_METHOD_EDUDZIENNIK_WEB
|
||||||
), listOf(LOGIN_METHOD_EDUDZIENNIK_WEB)),
|
), listOf(LOGIN_METHOD_EDUDZIENNIK_WEB)),
|
||||||
|
|
||||||
|
Feature(LOGIN_TYPE_EDUDZIENNIK, FEATURE_AGENDA, listOf(
|
||||||
|
ENDPOINT_EDUDZIENNIK_WEB_EXAMS to LOGIN_METHOD_EDUDZIENNIK_WEB
|
||||||
|
), listOf(LOGIN_METHOD_EDUDZIENNIK_WEB)),
|
||||||
|
|
||||||
Feature(LOGIN_TYPE_EDUDZIENNIK, FEATURE_LUCKY_NUMBER, listOf(
|
Feature(LOGIN_TYPE_EDUDZIENNIK, FEATURE_LUCKY_NUMBER, listOf(
|
||||||
ENDPOINT_EDUDZIENNIK_WEB_LUCKY_NUMBER to LOGIN_METHOD_EDUDZIENNIK_WEB
|
ENDPOINT_EDUDZIENNIK_WEB_LUCKY_NUMBER to LOGIN_METHOD_EDUDZIENNIK_WEB
|
||||||
), listOf(LOGIN_METHOD_EDUDZIENNIK_WEB))
|
), listOf(LOGIN_METHOD_EDUDZIENNIK_WEB))
|
||||||
|
@ -5,10 +5,8 @@
|
|||||||
package pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik.data
|
package pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik.data
|
||||||
|
|
||||||
import pl.szczodrzynski.edziennik.R
|
import pl.szczodrzynski.edziennik.R
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik.DataEdudziennik
|
import pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik.*
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik.ENDPOINT_EDUDZIENNIK_WEB_LUCKY_NUMBER
|
import pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik.data.web.EdudziennikWebExams
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik.ENDPOINT_EDUDZIENNIK_WEB_START
|
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik.ENDPOINT_EDUDZIENNIK_WEB_TIMETABLE
|
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik.data.web.EdudziennikWebLuckyNumber
|
import pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik.data.web.EdudziennikWebLuckyNumber
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik.data.web.EdudziennikWebStart
|
import pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik.data.web.EdudziennikWebStart
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik.data.web.EdudziennikWebTimetable
|
import pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik.data.web.EdudziennikWebTimetable
|
||||||
@ -49,6 +47,10 @@ class EdudziennikData(val data: DataEdudziennik, val onSuccess: () -> Unit) {
|
|||||||
data.startProgress(R.string.edziennik_progress_endpoint_timetable)
|
data.startProgress(R.string.edziennik_progress_endpoint_timetable)
|
||||||
EdudziennikWebTimetable(data, onSuccess)
|
EdudziennikWebTimetable(data, onSuccess)
|
||||||
}
|
}
|
||||||
|
ENDPOINT_EDUDZIENNIK_WEB_EXAMS -> {
|
||||||
|
data.startProgress(R.string.edziennik_progress_endpoint_exams)
|
||||||
|
EdudziennikWebExams(data, onSuccess)
|
||||||
|
}
|
||||||
ENDPOINT_EDUDZIENNIK_WEB_LUCKY_NUMBER -> {
|
ENDPOINT_EDUDZIENNIK_WEB_LUCKY_NUMBER -> {
|
||||||
data.startProgress(R.string.edziennik_progress_endpoint_lucky_number)
|
data.startProgress(R.string.edziennik_progress_endpoint_lucky_number)
|
||||||
EdudziennikWebLuckyNumber(data, onSuccess)
|
EdudziennikWebLuckyNumber(data, onSuccess)
|
||||||
|
@ -0,0 +1,82 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) Kacper Ziubryniewicz 2019-12-24
|
||||||
|
*/
|
||||||
|
|
||||||
|
package pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik.data.web
|
||||||
|
|
||||||
|
import org.jsoup.Jsoup
|
||||||
|
import pl.szczodrzynski.edziennik.crc32
|
||||||
|
import pl.szczodrzynski.edziennik.data.api.Regexes.EDUDZIENNIK_EXAM_ID
|
||||||
|
import pl.szczodrzynski.edziennik.data.api.Regexes.EDUDZIENNIK_SUBJECT_ID
|
||||||
|
import pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik.DataEdudziennik
|
||||||
|
import pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik.ENDPOINT_EDUDZIENNIK_WEB_EXAMS
|
||||||
|
import pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik.data.EdudziennikWeb
|
||||||
|
import pl.szczodrzynski.edziennik.data.api.models.DataRemoveModel
|
||||||
|
import pl.szczodrzynski.edziennik.data.db.modules.api.SYNC_ALWAYS
|
||||||
|
import pl.szczodrzynski.edziennik.data.db.modules.events.Event
|
||||||
|
import pl.szczodrzynski.edziennik.data.db.modules.metadata.Metadata
|
||||||
|
import pl.szczodrzynski.edziennik.get
|
||||||
|
import pl.szczodrzynski.edziennik.utils.models.Date
|
||||||
|
|
||||||
|
class EdudziennikWebExams(override val data: DataEdudziennik,
|
||||||
|
val onSuccess: () -> Unit) : EdudziennikWeb(data) {
|
||||||
|
companion object {
|
||||||
|
const val TAG = "EdudziennikWebExams"
|
||||||
|
}
|
||||||
|
|
||||||
|
init { profile?.also { profile ->
|
||||||
|
webGet(TAG, data.studentAndClassEndpoint + "Evaluations", xhr = true) { text ->
|
||||||
|
val doc = Jsoup.parseBodyFragment("<table>" + text.trim() + "</table>")
|
||||||
|
|
||||||
|
doc.select("tr").forEach { examElement ->
|
||||||
|
val id = EDUDZIENNIK_EXAM_ID.find(examElement.child(0).child(0).attr("href"))
|
||||||
|
?.get(1)?.crc32() ?: return@forEach
|
||||||
|
val topic = examElement.child(0).text().trim()
|
||||||
|
|
||||||
|
val subjectElement = examElement.child(1).child(0)
|
||||||
|
val subjectId = EDUDZIENNIK_SUBJECT_ID.find(subjectElement.attr("href"))?.get(1)
|
||||||
|
?: return@forEach
|
||||||
|
val subjectName = subjectElement.text().trim()
|
||||||
|
val subject = data.getSubject(subjectId, subjectName)
|
||||||
|
|
||||||
|
val dateString = examElement.child(2).text().trim()
|
||||||
|
if (dateString.isBlank()) return@forEach
|
||||||
|
val date = Date.fromY_m_d(dateString)
|
||||||
|
|
||||||
|
val lessons = data.app.db.timetableDao().getForDateNow(profileId, date)
|
||||||
|
val startTime = lessons.firstOrNull { it.subjectId == subject.id }?.startTime
|
||||||
|
|
||||||
|
val description = examElement.child(3).text()
|
||||||
|
|
||||||
|
val eventObject = Event(
|
||||||
|
profileId,
|
||||||
|
id,
|
||||||
|
date,
|
||||||
|
startTime,
|
||||||
|
"$topic\n$description",
|
||||||
|
-1,
|
||||||
|
Event.TYPE_DEFAULT,
|
||||||
|
false,
|
||||||
|
-1,
|
||||||
|
subject.id,
|
||||||
|
data.teamClass?.id ?: -1
|
||||||
|
)
|
||||||
|
|
||||||
|
data.eventList.add(eventObject)
|
||||||
|
data.metadataList.add(Metadata(
|
||||||
|
profileId,
|
||||||
|
Metadata.TYPE_EVENT,
|
||||||
|
id,
|
||||||
|
profile.empty,
|
||||||
|
profile.empty,
|
||||||
|
System.currentTimeMillis()
|
||||||
|
))
|
||||||
|
}
|
||||||
|
|
||||||
|
data.toRemove.add(DataRemoveModel.Events.futureWithType(Event.TYPE_DEFAULT))
|
||||||
|
|
||||||
|
data.setSyncNext(ENDPOINT_EDUDZIENNIK_WEB_EXAMS, SYNC_ALWAYS)
|
||||||
|
onSuccess()
|
||||||
|
}
|
||||||
|
}}
|
||||||
|
}
|
@ -10,15 +10,21 @@ import org.jsoup.nodes.Document
|
|||||||
import pl.szczodrzynski.edziennik.colorFromCssName
|
import pl.szczodrzynski.edziennik.colorFromCssName
|
||||||
import pl.szczodrzynski.edziennik.crc32
|
import pl.szczodrzynski.edziennik.crc32
|
||||||
import pl.szczodrzynski.edziennik.data.api.Regexes.EDUDZIENNIK_CLASS_DETAIL_ID
|
import pl.szczodrzynski.edziennik.data.api.Regexes.EDUDZIENNIK_CLASS_DETAIL_ID
|
||||||
|
import pl.szczodrzynski.edziennik.data.api.Regexes.EDUDZIENNIK_CLASS_DETAIL_NAME
|
||||||
import pl.szczodrzynski.edziennik.data.api.Regexes.EDUDZIENNIK_GRADE_ID
|
import pl.szczodrzynski.edziennik.data.api.Regexes.EDUDZIENNIK_GRADE_ID
|
||||||
import pl.szczodrzynski.edziennik.data.api.Regexes.EDUDZIENNIK_SCHOOL_DETAIL_ID
|
import pl.szczodrzynski.edziennik.data.api.Regexes.EDUDZIENNIK_SCHOOL_DETAIL_ID
|
||||||
|
import pl.szczodrzynski.edziennik.data.api.Regexes.EDUDZIENNIK_SCHOOL_DETAIL_NAME
|
||||||
import pl.szczodrzynski.edziennik.data.api.Regexes.STYLE_CSS_COLOR
|
import pl.szczodrzynski.edziennik.data.api.Regexes.STYLE_CSS_COLOR
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik.DataEdudziennik
|
import pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik.DataEdudziennik
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik.ENDPOINT_EDUDZIENNIK_WEB_START
|
import pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik.ENDPOINT_EDUDZIENNIK_WEB_START
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik.data.EdudziennikWeb
|
import pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik.data.EdudziennikWeb
|
||||||
|
import pl.szczodrzynski.edziennik.data.api.models.DataRemoveModel
|
||||||
import pl.szczodrzynski.edziennik.data.db.modules.api.SYNC_ALWAYS
|
import pl.szczodrzynski.edziennik.data.db.modules.api.SYNC_ALWAYS
|
||||||
import pl.szczodrzynski.edziennik.data.db.modules.grades.Grade
|
import pl.szczodrzynski.edziennik.data.db.modules.grades.Grade
|
||||||
|
import pl.szczodrzynski.edziennik.data.db.modules.grades.Grade.*
|
||||||
import pl.szczodrzynski.edziennik.data.db.modules.metadata.Metadata
|
import pl.szczodrzynski.edziennik.data.db.modules.metadata.Metadata
|
||||||
|
import pl.szczodrzynski.edziennik.data.db.modules.teams.Team
|
||||||
|
import pl.szczodrzynski.edziennik.firstLettersName
|
||||||
import pl.szczodrzynski.edziennik.get
|
import pl.szczodrzynski.edziennik.get
|
||||||
import pl.szczodrzynski.edziennik.utils.Utils
|
import pl.szczodrzynski.edziennik.utils.Utils
|
||||||
import pl.szczodrzynski.edziennik.utils.models.Date
|
import pl.szczodrzynski.edziennik.utils.models.Date
|
||||||
@ -42,11 +48,33 @@ class EdudziennikWebStart(override val data: DataEdudziennik,
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun getInfo(text: String) {
|
private fun getInfo(text: String) {
|
||||||
val schoolId = EDUDZIENNIK_SCHOOL_DETAIL_ID.find(text)?.get(1)
|
val schoolId = EDUDZIENNIK_SCHOOL_DETAIL_ID.find(text)?.get(1)?.trim()
|
||||||
|
val schoolName = EDUDZIENNIK_SCHOOL_DETAIL_NAME.find(text)?.get(1)?.trim()
|
||||||
data.schoolId = schoolId
|
data.schoolId = schoolId
|
||||||
|
|
||||||
val classId = EDUDZIENNIK_CLASS_DETAIL_ID.find(text)?.get(1)
|
val classId = EDUDZIENNIK_CLASS_DETAIL_ID.find(text)?.get(1)?.trim()
|
||||||
|
val className = EDUDZIENNIK_CLASS_DETAIL_NAME.find(text)?.get(1)?.trim()
|
||||||
data.classId = classId
|
data.classId = classId
|
||||||
|
|
||||||
|
if (classId == null || className == null || schoolId == null || schoolName == null) {
|
||||||
|
// TODO data.error(
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
val teamId = classId.crc32()
|
||||||
|
val teamCode = schoolId.crc32().toString() + schoolName.firstLettersName + "_edu:" + className
|
||||||
|
|
||||||
|
val teamObject = Team(
|
||||||
|
profileId,
|
||||||
|
teamId,
|
||||||
|
className,
|
||||||
|
Team.TYPE_CLASS,
|
||||||
|
teamCode,
|
||||||
|
-1
|
||||||
|
)
|
||||||
|
|
||||||
|
data.teamClass = teamObject
|
||||||
|
data.teamList.put(teamObject.id, teamObject)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun getGrades(doc: Document) { data.profile?.also { profile ->
|
private fun getGrades(doc: Document) { data.profile?.also { profile ->
|
||||||
@ -148,8 +176,8 @@ class EdudziennikWebStart(override val data: DataEdudziennik,
|
|||||||
subject.id
|
subject.id
|
||||||
).apply {
|
).apply {
|
||||||
type = when (semester) {
|
type = when (semester) {
|
||||||
1 -> Grade.TYPE_SEMESTER1_PROPOSED
|
1 -> TYPE_SEMESTER1_PROPOSED
|
||||||
else -> Grade.TYPE_SEMESTER2_PROPOSED
|
else -> TYPE_SEMESTER2_PROPOSED
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -181,8 +209,8 @@ class EdudziennikWebStart(override val data: DataEdudziennik,
|
|||||||
subject.id
|
subject.id
|
||||||
).apply {
|
).apply {
|
||||||
type = when (semester) {
|
type = when (semester) {
|
||||||
1 -> Grade.TYPE_SEMESTER1_FINAL
|
1 -> TYPE_SEMESTER1_FINAL
|
||||||
else -> Grade.TYPE_SEMESTER2_FINAL
|
else -> TYPE_SEMESTER2_FINAL
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -197,5 +225,16 @@ class EdudziennikWebStart(override val data: DataEdudziennik,
|
|||||||
))
|
))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} ?: onSuccess() }
|
|
||||||
|
data.toRemove.addAll(listOf(
|
||||||
|
TYPE_NORMAL,
|
||||||
|
TYPE_SEMESTER1_PROPOSED,
|
||||||
|
TYPE_SEMESTER2_PROPOSED,
|
||||||
|
TYPE_SEMESTER1_FINAL,
|
||||||
|
TYPE_SEMESTER2_FINAL
|
||||||
|
).map {
|
||||||
|
DataRemoveModel.Grades.semesterWithType(profile.currentSemester, it)
|
||||||
|
})
|
||||||
|
|
||||||
|
}}
|
||||||
}
|
}
|
||||||
|
@ -26,12 +26,7 @@ class LibrusApiSchools(override val data: DataLibrus,
|
|||||||
|
|
||||||
// create the school's short name using first letters of each long name's word
|
// create the school's short name using first letters of each long name's word
|
||||||
// append the town name and save to student data
|
// append the town name and save to student data
|
||||||
var schoolNameShort = ""
|
val schoolNameShort = schoolNameLong?.firstLettersName
|
||||||
schoolNameLong?.split(" ")?.forEach {
|
|
||||||
if (it.isBlank())
|
|
||||||
return@forEach
|
|
||||||
schoolNameShort += it[0].toLowerCase()
|
|
||||||
}
|
|
||||||
val schoolTown = school?.getString("Town")?.toLowerCase(Locale.getDefault())
|
val schoolTown = school?.getString("Town")?.toLowerCase(Locale.getDefault())
|
||||||
data.schoolName = schoolId.toString() + schoolNameShort + "_" + schoolTown
|
data.schoolName = schoolId.toString() + schoolNameShort + "_" + schoolTown
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user