forked from github/szkolny
[API/Mobidziennik] Implement getting full event description.
This commit is contained in:
parent
325efd8b14
commit
0b4421c7a7
@ -16,6 +16,10 @@ object Regexes {
|
|||||||
"""[^0-9]""".toRegex()
|
"""[^0-9]""".toRegex()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
val HTML_BR by lazy {
|
||||||
|
"""<br\s?/?>""".toRegex()
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
val MOBIDZIENNIK_GRADES_SUBJECT_NAME by lazy {
|
val MOBIDZIENNIK_GRADES_SUBJECT_NAME by lazy {
|
||||||
@ -128,6 +132,11 @@ object Regexes {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
val MOBIDZIENNIK_EVENT_CONTENT by lazy {
|
||||||
|
"""<h1>(.+?) <small>\(wpisał\(a\) (.+?) w dniu ([0-9-]{10})\).+?<strong>(.+?)</strong><br""".toRegex(DOT_MATCHES_ALL)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
val IDZIENNIK_LOGIN_HIDDEN_FIELDS by lazy {
|
val IDZIENNIK_LOGIN_HIDDEN_FIELDS by lazy {
|
||||||
"""<input type="hidden".+?name="([A-z0-9_]+)?".+?value="([A-z0-9_+-/=]+)?".+?>""".toRegex(DOT_MATCHES_ALL)
|
"""<input type="hidden".+?name="([A-z0-9_]+)?".+?value="([A-z0-9_+-/=]+)?".+?>""".toRegex(DOT_MATCHES_ALL)
|
||||||
|
@ -120,8 +120,15 @@ class Mobidziennik(val app: App, val profile: Profile?, val loginStore: LoginSto
|
|||||||
|
|
||||||
override fun getEvent(eventFull: EventFull) {
|
override fun getEvent(eventFull: EventFull) {
|
||||||
login(LOGIN_METHOD_MOBIDZIENNIK_WEB) {
|
login(LOGIN_METHOD_MOBIDZIENNIK_WEB) {
|
||||||
MobidziennikWebGetHomework(data, eventFull) {
|
if (eventFull.isHomework) {
|
||||||
completed()
|
MobidziennikWebGetHomework(data, eventFull) {
|
||||||
|
completed()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
MobidziennikWebGetEvent(data, eventFull) {
|
||||||
|
completed()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -81,6 +81,7 @@ class MobidziennikWebCalendar(override val data: DataMobidziennik,
|
|||||||
subjectId = -1,
|
subjectId = -1,
|
||||||
teamId = data.teamClass?.id ?: -1
|
teamId = data.teamClass?.id ?: -1
|
||||||
)
|
)
|
||||||
|
eventObject.isDownloaded = false
|
||||||
|
|
||||||
data.eventList.add(eventObject)
|
data.eventList.add(eventObject)
|
||||||
data.metadataList.add(
|
data.metadataList.add(
|
||||||
|
@ -0,0 +1,57 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) Kuba Szczodrzyński 2021-10-1.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package pl.szczodrzynski.edziennik.data.api.edziennik.mobidziennik.data.web
|
||||||
|
|
||||||
|
import org.greenrobot.eventbus.EventBus
|
||||||
|
import pl.szczodrzynski.edziennik.data.api.POST
|
||||||
|
import pl.szczodrzynski.edziennik.data.api.Regexes
|
||||||
|
import pl.szczodrzynski.edziennik.data.api.edziennik.mobidziennik.DataMobidziennik
|
||||||
|
import pl.szczodrzynski.edziennik.data.api.edziennik.mobidziennik.data.MobidziennikWeb
|
||||||
|
import pl.szczodrzynski.edziennik.data.api.events.EventGetEvent
|
||||||
|
import pl.szczodrzynski.edziennik.data.db.full.EventFull
|
||||||
|
import pl.szczodrzynski.edziennik.get
|
||||||
|
import pl.szczodrzynski.edziennik.utils.models.Date
|
||||||
|
|
||||||
|
class MobidziennikWebGetEvent(
|
||||||
|
override val data: DataMobidziennik,
|
||||||
|
val event: EventFull,
|
||||||
|
val onSuccess: () -> Unit
|
||||||
|
) : MobidziennikWeb(data, null) {
|
||||||
|
companion object {
|
||||||
|
private const val TAG = "MobidziennikWebGetEvent"
|
||||||
|
}
|
||||||
|
|
||||||
|
init {
|
||||||
|
val params = listOf(
|
||||||
|
"typ" to "kalendarz",
|
||||||
|
"uczen" to data.studentId,
|
||||||
|
"id" to event.id,
|
||||||
|
)
|
||||||
|
|
||||||
|
webGet(TAG, "/dziennik/ajaxkalendarzklasowy", method = POST, parameters = params) { text ->
|
||||||
|
Regexes.MOBIDZIENNIK_EVENT_CONTENT.find(text)?.let {
|
||||||
|
val topic = it[1]
|
||||||
|
val teacherName = it[2]
|
||||||
|
val teacher = data.getTeacherByLastFirst(teacherName)
|
||||||
|
val addedDate = Date.fromY_m_d(it[3])
|
||||||
|
val body = it[4]
|
||||||
|
.replace("\n", "")
|
||||||
|
.replace(Regexes.HTML_BR, "\n")
|
||||||
|
|
||||||
|
event.topic = topic
|
||||||
|
event.homeworkBody = body
|
||||||
|
event.teacherId = teacher.id
|
||||||
|
event.addedDate = addedDate.inMillis
|
||||||
|
event.isDownloaded = true
|
||||||
|
}
|
||||||
|
|
||||||
|
data.eventList.add(event)
|
||||||
|
data.eventListReplace = true
|
||||||
|
|
||||||
|
EventBus.getDefault().postSticky(EventGetEvent(event))
|
||||||
|
onSuccess()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -437,11 +437,13 @@ abstract class Data(val app: App, val profile: Profile?, val loginStore: LoginSt
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun getTeacherByLastFirst(nameLastFirst: String, loginId: String? = null): Teacher {
|
fun getTeacherByLastFirst(nameLastFirst: String, loginId: String? = null): Teacher {
|
||||||
|
// comparing full name is safer than splitting and swapping
|
||||||
|
val teacher = teacherList.singleOrNull { it.fullNameLastFirst == nameLastFirst }
|
||||||
val nameParts = nameLastFirst.split(" ")
|
val nameParts = nameLastFirst.split(" ")
|
||||||
return if (nameParts.size == 1)
|
return if (nameParts.size == 1)
|
||||||
getTeacher(nameParts[0], "", loginId)
|
validateTeacher(teacher, nameParts[0], "", loginId)
|
||||||
else
|
else
|
||||||
getTeacher(nameParts[1], nameParts[0], loginId)
|
validateTeacher(teacher, nameParts[1], nameParts[0], loginId)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun getTeacherByFirstLast(nameFirstLast: String, loginId: String? = null): Teacher {
|
fun getTeacherByFirstLast(nameFirstLast: String, loginId: String? = null): Teacher {
|
||||||
|
@ -43,7 +43,7 @@ import pl.szczodrzynski.edziennik.data.db.migration.*
|
|||||||
LibrusLesson::class,
|
LibrusLesson::class,
|
||||||
TimetableManual::class,
|
TimetableManual::class,
|
||||||
Metadata::class
|
Metadata::class
|
||||||
], version = 93)
|
], version = 94)
|
||||||
@TypeConverters(
|
@TypeConverters(
|
||||||
ConverterTime::class,
|
ConverterTime::class,
|
||||||
ConverterDate::class,
|
ConverterDate::class,
|
||||||
@ -178,7 +178,8 @@ abstract class AppDb : RoomDatabase() {
|
|||||||
Migration90(),
|
Migration90(),
|
||||||
Migration91(),
|
Migration91(),
|
||||||
Migration92(),
|
Migration92(),
|
||||||
Migration93()
|
Migration93(),
|
||||||
|
Migration94()
|
||||||
).allowMainThreadQueries().build()
|
).allowMainThreadQueries().build()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -83,6 +83,13 @@ open class Event(
|
|||||||
@ColumnInfo(name = "eventIsDone")
|
@ColumnInfo(name = "eventIsDone")
|
||||||
var isDone: Boolean = false
|
var isDone: Boolean = false
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Whether the full contents of the event are already stored locally.
|
||||||
|
* There may be a need to download the full topic or body.
|
||||||
|
*/
|
||||||
|
@ColumnInfo(name = "eventIsDownloaded")
|
||||||
|
var isDownloaded: Boolean = true
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Body/text of the event, if this is a [TYPE_HOMEWORK].
|
* Body/text of the event, if this is a [TYPE_HOMEWORK].
|
||||||
* May be null if the body is not downloaded yet, or the type is not [TYPE_HOMEWORK].
|
* May be null if the body is not downloaded yet, or the type is not [TYPE_HOMEWORK].
|
||||||
|
@ -26,6 +26,7 @@ class EventFull(
|
|||||||
sharedBy = it.sharedBy
|
sharedBy = it.sharedBy
|
||||||
sharedByName = it.sharedByName
|
sharedByName = it.sharedByName
|
||||||
blacklisted = it.blacklisted
|
blacklisted = it.blacklisted
|
||||||
|
isDownloaded = it.isDownloaded
|
||||||
homeworkBody = it.homeworkBody
|
homeworkBody = it.homeworkBody
|
||||||
attachmentIds = it.attachmentIds
|
attachmentIds = it.attachmentIds
|
||||||
attachmentNames = it.attachmentNames
|
attachmentNames = it.attachmentNames
|
||||||
|
@ -0,0 +1,26 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) Kuba Szczodrzyński 2021-10-1.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package pl.szczodrzynski.edziennik.data.db.migration
|
||||||
|
|
||||||
|
import androidx.room.migration.Migration
|
||||||
|
import androidx.sqlite.db.SupportSQLiteDatabase
|
||||||
|
import pl.szczodrzynski.edziennik.data.db.entity.Event
|
||||||
|
import pl.szczodrzynski.edziennik.data.db.entity.LoginStore
|
||||||
|
|
||||||
|
class Migration94 : Migration(93, 94) {
|
||||||
|
override fun migrate(database: SupportSQLiteDatabase) {
|
||||||
|
// events - is downloaded flag
|
||||||
|
|
||||||
|
// get all profiles using Mobidziennik
|
||||||
|
database.execSQL("CREATE TABLE _94_ids (id INTEGER NOT NULL);")
|
||||||
|
database.execSQL("INSERT INTO _94_ids SELECT profileId FROM profiles JOIN loginStores USING(loginStoreId) WHERE loginStores.loginStoreType = ${LoginStore.LOGIN_TYPE_MOBIDZIENNIK};")
|
||||||
|
|
||||||
|
database.execSQL("ALTER TABLE events ADD COLUMN eventIsDownloaded INT NOT NULL DEFAULT 1;")
|
||||||
|
// set isDownloaded = 0 for information events in Mobidziennik
|
||||||
|
database.execSQL("UPDATE events SET eventIsDownloaded = 0 WHERE profileId IN (SELECT id FROM _94_ids) AND eventType = ${Event.TYPE_INFORMATION};")
|
||||||
|
|
||||||
|
database.execSQL("DROP TABLE _94_ids;")
|
||||||
|
}
|
||||||
|
}
|
@ -226,7 +226,7 @@ class EventDetailsDialog(
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!event.addedManually && event.isHomework && event.homeworkBody == null) {
|
if (!event.addedManually && (!event.isDownloaded || event.isHomework && event.homeworkBody == null)) {
|
||||||
b.bodyTitle.isVisible = true
|
b.bodyTitle.isVisible = true
|
||||||
b.bodyProgressBar.isVisible = true
|
b.bodyProgressBar.isVisible = true
|
||||||
b.body.isVisible = false
|
b.body.isVisible = false
|
||||||
|
Loading…
Reference in New Issue
Block a user