[API/Grades] Add data remove model for grades.

This commit is contained in:
Kacper Ziubryniewicz 2019-12-22 23:21:03 +01:00
parent 8f8eb64364
commit 52ac40c826
9 changed files with 87 additions and 30 deletions

View File

@ -12,6 +12,7 @@ import pl.szczodrzynski.edziennik.data.api.edziennik.idziennik.DataIdziennik
import pl.szczodrzynski.edziennik.data.api.edziennik.idziennik.ENDPOINT_IDZIENNIK_WEB_GRADES import pl.szczodrzynski.edziennik.data.api.edziennik.idziennik.ENDPOINT_IDZIENNIK_WEB_GRADES
import pl.szczodrzynski.edziennik.data.api.edziennik.idziennik.data.IdziennikWeb 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.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.metadata.Metadata import pl.szczodrzynski.edziennik.data.db.modules.metadata.Metadata
@ -23,7 +24,7 @@ class IdziennikWebGrades(override val data: DataIdziennik,
private const val TAG = "IdziennikWebGrades" private const val TAG = "IdziennikWebGrades"
} }
init { init { data.profile?.also { profile ->
webApiGet(TAG, IDZIENNIK_WEB_GRADES, mapOf( webApiGet(TAG, IDZIENNIK_WEB_GRADES, mapOf(
"idPozDziennika" to data.registerId "idPozDziennika" to data.registerId
)) { result -> )) { result ->
@ -141,15 +142,22 @@ class IdziennikWebGrades(override val data: DataIdziennik,
profileId, profileId,
Metadata.TYPE_GRADE, Metadata.TYPE_GRADE,
id, id,
data.profile?.empty ?: false, data.profile.empty,
data.profile?.empty ?: false, data.profile.empty,
addedDate addedDate
)) ))
} }
} }
data.toRemove.addAll(listOf(
Grade.TYPE_NORMAL,
Grade.TYPE_SEMESTER1_FINAL,
Grade.TYPE_YEAR_FINAL
).map {
DataRemoveModel.Grades.semesterWithType(profile.currentSemester, it)
})
data.setSyncNext(ENDPOINT_IDZIENNIK_WEB_GRADES, SYNC_ALWAYS) data.setSyncNext(ENDPOINT_IDZIENNIK_WEB_GRADES, SYNC_ALWAYS)
onSuccess() onSuccess()
} }
} } ?: onSuccess() }
} }

View File

@ -4,13 +4,14 @@
package pl.szczodrzynski.edziennik.data.api.edziennik.idziennik.data.web package pl.szczodrzynski.edziennik.data.api.edziennik.idziennik.data.web
import pl.szczodrzynski.edziennik.asJsonObjectList
import pl.szczodrzynski.edziennik.data.api.ERROR_IDZIENNIK_WEB_REQUEST_NO_DATA import pl.szczodrzynski.edziennik.data.api.ERROR_IDZIENNIK_WEB_REQUEST_NO_DATA
import pl.szczodrzynski.edziennik.data.api.IDZIENNIK_WEB_MISSING_GRADES import pl.szczodrzynski.edziennik.data.api.IDZIENNIK_WEB_MISSING_GRADES
import pl.szczodrzynski.edziennik.data.api.edziennik.idziennik.DataIdziennik import pl.szczodrzynski.edziennik.data.api.edziennik.idziennik.DataIdziennik
import pl.szczodrzynski.edziennik.data.api.edziennik.idziennik.ENDPOINT_IDZIENNIK_WEB_PROPOSED_GRADES import pl.szczodrzynski.edziennik.data.api.edziennik.idziennik.ENDPOINT_IDZIENNIK_WEB_PROPOSED_GRADES
import pl.szczodrzynski.edziennik.data.api.edziennik.idziennik.data.IdziennikWeb 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.asJsonObjectList 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.TYPE_SEMESTER1_PROPOSED import pl.szczodrzynski.edziennik.data.db.modules.grades.Grade.TYPE_SEMESTER1_PROPOSED
@ -106,8 +107,11 @@ class IdziennikWebProposedGrades(override val data: DataIdziennik,
} }
} }
data.toRemove.addAll(listOf(TYPE_SEMESTER1_PROPOSED, TYPE_YEAR_PROPOSED).map {
DataRemoveModel.Grades.semesterWithType(profile.currentSemester, it)
})
data.setSyncNext(ENDPOINT_IDZIENNIK_WEB_PROPOSED_GRADES, SYNC_ALWAYS) data.setSyncNext(ENDPOINT_IDZIENNIK_WEB_PROPOSED_GRADES, SYNC_ALWAYS)
onSuccess() onSuccess()
} }
}} } ?: onSuccess() }
} }

View File

@ -8,6 +8,7 @@ import pl.szczodrzynski.edziennik.*
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.DataLibrus import pl.szczodrzynski.edziennik.data.api.edziennik.librus.DataLibrus
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.ENDPOINT_LIBRUS_API_BEHAVIOUR_GRADES import pl.szczodrzynski.edziennik.data.api.edziennik.librus.ENDPOINT_LIBRUS_API_BEHAVIOUR_GRADES
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.data.LibrusApi import pl.szczodrzynski.edziennik.data.api.edziennik.librus.data.LibrusApi
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.GradeCategory import pl.szczodrzynski.edziennik.data.db.modules.grades.GradeCategory
@ -23,7 +24,7 @@ class LibrusApiBehaviourGrades(override val data: DataLibrus,
private val nameFormat by lazy { DecimalFormat("#.##") } private val nameFormat by lazy { DecimalFormat("#.##") }
init { data.profile?.let { profile -> init { data.profile?.also { profile ->
apiGet(TAG, "BehaviourGrades/Points") { json -> apiGet(TAG, "BehaviourGrades/Points") { json ->
if (data.startPointsSemester1 > 0) { if (data.startPointsSemester1 > 0) {
@ -147,8 +148,9 @@ class LibrusApiBehaviourGrades(override val data: DataLibrus,
)) ))
} }
data.toRemove.add(DataRemoveModel.Grades.semesterWithType(profile.currentSemester, Grade.TYPE_BEHAVIOUR))
data.setSyncNext(ENDPOINT_LIBRUS_API_BEHAVIOUR_GRADES, SYNC_ALWAYS) data.setSyncNext(ENDPOINT_LIBRUS_API_BEHAVIOUR_GRADES, SYNC_ALWAYS)
onSuccess() onSuccess()
} }
}} } ?: onSuccess() }
} }

View File

@ -4,8 +4,10 @@ import pl.szczodrzynski.edziennik.*
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.DataLibrus import pl.szczodrzynski.edziennik.data.api.edziennik.librus.DataLibrus
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.ENDPOINT_LIBRUS_API_NORMAL_GRADES import pl.szczodrzynski.edziennik.data.api.edziennik.librus.ENDPOINT_LIBRUS_API_NORMAL_GRADES
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.data.LibrusApi import pl.szczodrzynski.edziennik.data.api.edziennik.librus.data.LibrusApi
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.grades.GradeCategory import pl.szczodrzynski.edziennik.data.db.modules.grades.GradeCategory
import pl.szczodrzynski.edziennik.data.db.modules.metadata.Metadata import pl.szczodrzynski.edziennik.data.db.modules.metadata.Metadata
import pl.szczodrzynski.edziennik.utils.Utils import pl.szczodrzynski.edziennik.utils.Utils
@ -17,7 +19,7 @@ class LibrusApiGrades(override val data: DataLibrus,
const val TAG = "LibrusApiGrades" const val TAG = "LibrusApiGrades"
} }
init { init { data.profile?.also { profile ->
apiGet(TAG, "Grades") { json -> apiGet(TAG, "Grades") { json ->
val grades = json.getJsonArray("Grades").asJsonObjectList() val grades = json.getJsonArray("Grades").asJsonObjectList()
@ -68,15 +70,15 @@ class LibrusApiGrades(override val data: DataLibrus,
when { when {
grade.getBoolean("IsConstituent") ?: false -> grade.getBoolean("IsConstituent") ?: false ->
gradeObject.type = Grade.TYPE_NORMAL gradeObject.type = TYPE_NORMAL
grade.getBoolean("IsSemester") ?: false -> // semester final grade.getBoolean("IsSemester") ?: false -> // semester final
gradeObject.type = if (gradeObject.semester == 1) Grade.TYPE_SEMESTER1_FINAL else Grade.TYPE_SEMESTER2_FINAL gradeObject.type = if (gradeObject.semester == 1) TYPE_SEMESTER1_FINAL else TYPE_SEMESTER2_FINAL
grade.getBoolean("IsSemesterProposition") ?: false -> // semester proposed grade.getBoolean("IsSemesterProposition") ?: false -> // semester proposed
gradeObject.type = if (gradeObject.semester == 1) Grade.TYPE_SEMESTER1_PROPOSED else Grade.TYPE_SEMESTER2_PROPOSED gradeObject.type = if (gradeObject.semester == 1) TYPE_SEMESTER1_PROPOSED else TYPE_SEMESTER2_PROPOSED
grade.getBoolean("IsFinal") ?: false -> // year final grade.getBoolean("IsFinal") ?: false -> // year final
gradeObject.type = Grade.TYPE_YEAR_FINAL gradeObject.type = TYPE_YEAR_FINAL
grade.getBoolean("IsFinalProposition") ?: false -> // year final grade.getBoolean("IsFinalProposition") ?: false -> // year final
gradeObject.type = Grade.TYPE_YEAR_PROPOSED gradeObject.type = TYPE_YEAR_PROPOSED
} }
grade.getJsonObject("Improvement")?.also { grade.getJsonObject("Improvement")?.also {
@ -94,14 +96,25 @@ class LibrusApiGrades(override val data: DataLibrus,
profileId, profileId,
Metadata.TYPE_GRADE, Metadata.TYPE_GRADE,
id, id,
profile?.empty ?: false, profile.empty,
profile?.empty ?: false, profile.empty,
addedDate addedDate
)) ))
} }
data.toRemove.addAll(listOf(
TYPE_NORMAL,
TYPE_SEMESTER1_FINAL,
TYPE_SEMESTER2_FINAL,
TYPE_SEMESTER1_PROPOSED,
TYPE_SEMESTER2_PROPOSED,
TYPE_YEAR_FINAL,
TYPE_YEAR_PROPOSED
).map {
DataRemoveModel.Grades.semesterWithType(profile.currentSemester, it)
})
data.setSyncNext(ENDPOINT_LIBRUS_API_NORMAL_GRADES, SYNC_ALWAYS) data.setSyncNext(ENDPOINT_LIBRUS_API_NORMAL_GRADES, SYNC_ALWAYS)
onSuccess() onSuccess()
} }
} } ?: onSuccess() }
} }

View File

@ -5,12 +5,13 @@
package pl.szczodrzynski.edziennik.data.api.edziennik.mobidziennik.data.api package pl.szczodrzynski.edziennik.data.api.edziennik.mobidziennik.data.api
import pl.szczodrzynski.edziennik.data.api.edziennik.mobidziennik.DataMobidziennik import pl.szczodrzynski.edziennik.data.api.edziennik.mobidziennik.DataMobidziennik
import pl.szczodrzynski.edziennik.data.api.models.DataRemoveModel
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.grades.Grade.*
import pl.szczodrzynski.edziennik.data.db.modules.metadata.Metadata import pl.szczodrzynski.edziennik.data.db.modules.metadata.Metadata
class MobidziennikApiGrades(val data: DataMobidziennik, rows: List<String>) { class MobidziennikApiGrades(val data: DataMobidziennik, rows: List<String>) {
init { run { init { data.profile?.also { profile -> run {
data.db.gradeDao().getDetails( data.db.gradeDao().getDetails(
data.profileId, data.profileId,
data.gradeAddedDates, data.gradeAddedDates,
@ -73,6 +74,17 @@ class MobidziennikApiGrades(val data: DataMobidziennik, rows: List<String>) {
subjectId) subjectId)
gradeObject.type = type gradeObject.type = type
data.toRemove.addAll(listOf(
TYPE_NORMAL,
TYPE_SEMESTER1_FINAL,
TYPE_SEMESTER2_FINAL,
TYPE_SEMESTER1_PROPOSED,
TYPE_SEMESTER2_PROPOSED,
TYPE_YEAR_FINAL,
TYPE_YEAR_PROPOSED
).map {
DataRemoveModel.Grades.semesterWithType(profile.currentSemester, it)
})
data.gradeList.add(gradeObject) data.gradeList.add(gradeObject)
data.metadataList.add( data.metadataList.add(
Metadata( Metadata(
@ -85,5 +97,5 @@ class MobidziennikApiGrades(val data: DataMobidziennik, rows: List<String>) {
)) ))
addedDate++ addedDate++
} }
}} }}}
} }

View File

@ -10,6 +10,7 @@ import pl.szczodrzynski.edziennik.data.api.Regexes
import pl.szczodrzynski.edziennik.data.api.edziennik.mobidziennik.DataMobidziennik import pl.szczodrzynski.edziennik.data.api.edziennik.mobidziennik.DataMobidziennik
import pl.szczodrzynski.edziennik.data.api.edziennik.mobidziennik.ENDPOINT_MOBIDZIENNIK_WEB_GRADES import pl.szczodrzynski.edziennik.data.api.edziennik.mobidziennik.ENDPOINT_MOBIDZIENNIK_WEB_GRADES
import pl.szczodrzynski.edziennik.data.api.edziennik.mobidziennik.data.MobidziennikWeb import pl.szczodrzynski.edziennik.data.api.edziennik.mobidziennik.data.MobidziennikWeb
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.metadata.Metadata import pl.szczodrzynski.edziennik.data.db.modules.metadata.Metadata
@ -25,8 +26,10 @@ class MobidziennikWebGrades(override val data: DataMobidziennik,
private const val TAG = "MobidziennikWebGrades" private const val TAG = "MobidziennikWebGrades"
} }
init { init { data.profile?.also { profile ->
webGet(TAG, "/dziennik/oceny?semestr=${profile?.currentSemester ?: 1}") { text -> val currentSemester = profile.currentSemester
webGet(TAG, "/dziennik/oceny?semestr=$currentSemester") { text ->
MobidziennikLuckyNumberExtractor(data, text) MobidziennikLuckyNumberExtractor(data, text)
val doc = Jsoup.parse(text) val doc = Jsoup.parse(text)
@ -90,7 +93,7 @@ class MobidziennikWebGrades(override val data: DataMobidziennik,
) )
val time = Time.fromH_m_s(it[4]) val time = Time.fromH_m_s(it[4])
gradeAddedDateMillis = gradeAddedDate.combineWith(time) gradeAddedDateMillis = gradeAddedDate.combineWith(time)
gradeSemester = profile?.dateToSemester(gradeAddedDate) ?: 1 gradeSemester = profile.dateToSemester(gradeAddedDate)
} }
if (Regexes.MOBIDZIENNIK_GRADES_COUNT_TO_AVG.containsMatchIn(html)) { if (Regexes.MOBIDZIENNIK_GRADES_COUNT_TO_AVG.containsMatchIn(html)) {
@ -129,8 +132,8 @@ class MobidziennikWebGrades(override val data: DataMobidziennik,
profileId, profileId,
Metadata.TYPE_GRADE, Metadata.TYPE_GRADE,
gradeObject.id, gradeObject.id,
profile?.empty ?: false, profile.empty,
profile?.empty ?: false, profile.empty,
gradeAddedDateMillis gradeAddedDateMillis
)) ))
} }
@ -143,8 +146,9 @@ class MobidziennikWebGrades(override val data: DataMobidziennik,
} }
} }
data.toRemove.add(DataRemoveModel.Grades.semesterWithType(currentSemester, Grade.TYPE_NORMAL))
data.setSyncNext(ENDPOINT_MOBIDZIENNIK_WEB_GRADES, SYNC_ALWAYS) data.setSyncNext(ENDPOINT_MOBIDZIENNIK_WEB_GRADES, SYNC_ALWAYS)
onSuccess() onSuccess()
} }
} }}
} }

View File

@ -9,6 +9,7 @@ import pl.szczodrzynski.edziennik.data.api.VULCAN_API_ENDPOINT_GRADES
import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.DataVulcan import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.DataVulcan
import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.ENDPOINT_VULCAN_API_GRADES import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.ENDPOINT_VULCAN_API_GRADES
import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.data.VulcanApi import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.data.VulcanApi
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.metadata.Metadata import pl.szczodrzynski.edziennik.data.db.modules.metadata.Metadata
@ -109,6 +110,7 @@ class VulcanApiGrades(override val data: DataVulcan, val onSuccess: () -> Unit)
)) ))
} }
data.toRemove.add(DataRemoveModel.Grades.semesterWithType(data.studentSemesterNumber, Grade.TYPE_NORMAL))
data.setSyncNext(ENDPOINT_VULCAN_API_GRADES, SYNC_ALWAYS) data.setSyncNext(ENDPOINT_VULCAN_API_GRADES, SYNC_ALWAYS)
onSuccess() onSuccess()
} }

View File

@ -27,17 +27,23 @@ open class DataRemoveModel {
} }
} }
class Grades(private val all: Boolean, private val semester: Int?) : DataRemoveModel() { class Grades(private val all: Boolean, private val semester: Int?, private val type: Int?) : DataRemoveModel() {
companion object { companion object {
fun all() = Grades(true, null) fun all() = Grades(true, null, null)
fun semester(semester: Int) = Grades(false, semester) fun allWithType(type: Int) = Grades(true, null, type)
fun semester(semester: Int) = Grades(false, semester, null)
fun semesterWithType(semester: Int, type: Int) = Grades(false, semester, type)
} }
fun commit(profileId: Int, dao: GradeDao) { fun commit(profileId: Int, dao: GradeDao) {
if (all) { if (all) {
dao.clear(profileId) if (type != null) dao.clearWithType(profileId, type)
else dao.clear(profileId)
}
semester?.let {
if (type != null) dao.clearForSemesterWithType(profileId, it, type)
else dao.clearForSemester(profileId, it)
} }
semester?.let { dao.clearForSemester(profileId, it) }
} }
} }

View File

@ -27,9 +27,15 @@ public abstract class GradeDao {
@Query("DELETE FROM grades WHERE profileId = :profileId") @Query("DELETE FROM grades WHERE profileId = :profileId")
public abstract void clear(int profileId); public abstract void clear(int profileId);
@Query("DELETE FROM grades WHERE profileId = :profileId AND gradeType = :type")
public abstract void clearWithType(int profileId, int type);
@Query("DELETE FROM grades WHERE profileId = :profileId AND gradeSemester = :semester") @Query("DELETE FROM grades WHERE profileId = :profileId AND gradeSemester = :semester")
public abstract void clearForSemester(int profileId, int semester); public abstract void clearForSemester(int profileId, int semester);
@Query("DELETE FROM grades WHERE profileId = :profileId AND gradeSemester = :semester AND gradeType = :type")
public abstract void clearForSemesterWithType(int profileId, int semester, int type);
@RawQuery(observedEntities = {Grade.class}) @RawQuery(observedEntities = {Grade.class})
abstract LiveData<List<GradeFull>> getAll(SupportSQLiteQuery query); abstract LiveData<List<GradeFull>> getAll(SupportSQLiteQuery query);
public LiveData<List<GradeFull>> getAll(int profileId, String filter, String orderBy) { public LiveData<List<GradeFull>> getAll(int profileId, String filter, String orderBy) {