[APIv2/Librus] Add getting and showing teacher absence reason

This commit is contained in:
Kacper Ziubryniewicz 2019-10-19 13:33:50 +02:00
parent cf8afc03bc
commit e138ca6eab
14 changed files with 158 additions and 6 deletions

View File

@ -40,6 +40,7 @@ const val ENDPOINT_LIBRUS_API_ATTENDANCE_TYPES = 1080
const val ENDPOINT_LIBRUS_API_ATTENDANCES = 1081
const val ENDPOINT_LIBRUS_API_ANNOUNCEMENTS = 1090
const val ENDPOINT_LIBRUS_API_PT_MEETINGS = 1100
const val ENDPOINT_LIBRUS_API_TEACHER_FREE_DAY_TYPES = 1109
const val ENDPOINT_LIBRUS_API_TEACHER_FREE_DAYS = 1110
const val ENDPOINT_LIBRUS_API_SCHOOL_FREE_DAYS = 1120
const val ENDPOINT_LIBRUS_API_CLASS_FREE_DAYS = 1130
@ -79,6 +80,7 @@ val LibrusFeatures = listOf(
ENDPOINT_LIBRUS_API_EVENTS to LOGIN_METHOD_LIBRUS_API,
ENDPOINT_LIBRUS_API_EVENT_TYPES to LOGIN_METHOD_LIBRUS_API,
ENDPOINT_LIBRUS_API_PT_MEETINGS to LOGIN_METHOD_LIBRUS_API,
ENDPOINT_LIBRUS_API_TEACHER_FREE_DAY_TYPES to LOGIN_METHOD_LIBRUS_API,
ENDPOINT_LIBRUS_API_TEACHER_FREE_DAYS to LOGIN_METHOD_LIBRUS_API,
ENDPOINT_LIBRUS_API_SCHOOL_FREE_DAYS to LOGIN_METHOD_LIBRUS_API,
ENDPOINT_LIBRUS_API_CLASS_FREE_DAYS to LOGIN_METHOD_LIBRUS_API

View File

@ -75,6 +75,10 @@ class LibrusData(val data: DataLibrus, val onSuccess: () -> Unit) {
data.startProgress(R.string.edziennik_progress_endpoint_classes)
LibrusApiClasses(data) { onSuccess() }
}
ENDPOINT_LIBRUS_API_TEACHER_FREE_DAY_TYPES -> {
data.startProgress(R.string.edziennik_progress_endpoint_teacher_free_day_types)
LibrusApiTeacherFreeDayTypes(data) { onSuccess() }
}
ENDPOINT_LIBRUS_API_TEACHER_FREE_DAYS -> {
data.startProgress(R.string.edziennik_progress_endpoint_teacher_free_days)
LibrusApiTeacherFreeDays(data) { onSuccess() }

View File

@ -0,0 +1,46 @@
/*
* Copyright (c) Kacper Ziubryniewicz 2019-10-19
*/
package pl.szczodrzynski.edziennik.api.v2.librus.data.api
import pl.szczodrzynski.edziennik.DAY
import pl.szczodrzynski.edziennik.api.v2.librus.DataLibrus
import pl.szczodrzynski.edziennik.api.v2.librus.ENDPOINT_LIBRUS_API_TEACHER_FREE_DAY_TYPES
import pl.szczodrzynski.edziennik.api.v2.librus.data.LibrusApi
import pl.szczodrzynski.edziennik.data.db.modules.api.SYNC_ALWAYS
import pl.szczodrzynski.edziennik.data.db.modules.teachers.TeacherAbsenceType
import pl.szczodrzynski.edziennik.getJsonArray
import pl.szczodrzynski.edziennik.getLong
import pl.szczodrzynski.edziennik.getString
class LibrusApiTeacherFreeDayTypes(override val data: DataLibrus,
val onSuccess: () -> Unit) : LibrusApi(data) {
companion object {
const val TAG = "LibrusApiTeacherFreeDayTypes"
}
init {
apiGet(TAG, "TeacherFreeDays/Types") { json ->
val teacherAbsenceTypes = json.getJsonArray("Types")
teacherAbsenceTypes?.forEach { teacherAbsenceTypeEl ->
val teacherAbsenceType = teacherAbsenceTypeEl.asJsonObject
val id = teacherAbsenceType.getLong("Id") ?: return@forEach
val name = teacherAbsenceType.getString("Name") ?: return@forEach
val teacherAbsenceTypeObject = TeacherAbsenceType(
profileId,
id,
name
)
data.teacherAbsenceTypes.put(id, teacherAbsenceTypeObject)
}
data.setSyncNext(ENDPOINT_LIBRUS_API_TEACHER_FREE_DAY_TYPES, 4 * DAY)
onSuccess()
}
}
}

View File

@ -30,6 +30,7 @@ class LibrusApiTeacherFreeDays(override val data: DataLibrus,
val teacherId = teacherAbsence.getJsonObject("Teacher")?.getLong("Id")
?: return@forEach
val type = teacherAbsence.getJsonObject("Type").getLong("Id") ?: return@forEach
val name = data.teacherAbsenceTypes.singleOrNull { it.id == type }?.name
val dateFrom = Date.fromY_m_d(teacherAbsence.getString("DateFrom"))
val dateTo = Date.fromY_m_d(teacherAbsence.getString("DateTo"))
val timeFrom = teacherAbsence.getString("TimeFrom")?.let { Time.fromH_m_s(it) }
@ -40,6 +41,7 @@ class LibrusApiTeacherFreeDays(override val data: DataLibrus,
id,
teacherId,
type,
name,
dateFrom,
dateTo,
timeFrom,

View File

@ -32,6 +32,7 @@ import pl.szczodrzynski.edziennik.data.db.modules.profiles.Profile
import pl.szczodrzynski.edziennik.data.db.modules.subjects.Subject
import pl.szczodrzynski.edziennik.data.db.modules.teachers.Teacher
import pl.szczodrzynski.edziennik.data.db.modules.teachers.TeacherAbsence
import pl.szczodrzynski.edziennik.data.db.modules.teachers.TeacherAbsenceType
import pl.szczodrzynski.edziennik.data.db.modules.teams.Team
import pl.szczodrzynski.edziennik.singleOrNull
import pl.szczodrzynski.edziennik.toSparseArray
@ -102,6 +103,7 @@ open class Data(val app: App, val profile: Profile?, val loginStore: LoginStore)
val lessonRanges = SparseArray<LessonRange>()
val gradeCategories = LongSparseArray<GradeCategory>()
val attendanceTypes = SparseArray<Pair<Int, String>>()
val teacherAbsenceTypes = LongSparseArray<TeacherAbsenceType>()
private var mTeamClass: Team? = null
var teamClass: Team?
@ -156,6 +158,7 @@ open class Data(val app: App, val profile: Profile?, val loginStore: LoginStore)
db.teamDao().getAllNow(profileId).toSparseArray(teamList) { it.id }
db.lessonRangeDao().getAllNow(profileId).toSparseArray(lessonRanges) { it.lessonNumber }
db.gradeCategoryDao().getAllNow(profileId).toSparseArray(gradeCategories) { it.categoryId }
db.teacherAbsenceTypeDao().getAllNow(profileId).toSparseArray(teacherAbsenceTypes) { it.id }
}
}
@ -205,6 +208,8 @@ open class Data(val app: App, val profile: Profile?, val loginStore: LoginStore)
db.lessonRangeDao().addAll(lessonRanges.values())
db.gradeCategoryDao().clear(profileId)
db.gradeCategoryDao().addAll(gradeCategories.values())
db.teacherAbsenceTypeDao().clear(profileId)
db.teacherAbsenceTypeDao().addAll(teacherAbsenceTypes.values())
gradesToRemove?.let { it ->
it.removeAll?.let { _ -> db.gradeDao().clear(profileId) }
@ -297,8 +302,11 @@ open class Data(val app: App, val profile: Profile?, val loginStore: LoginStore)
else -> errorCode
}
}
error(ApiError(tag, code).apply { profileId = profile?.id ?: -1 }.withResponse(response).withThrowable(throwable).withApiResponse(apiResponse))
error(ApiError(tag, code).apply {
profileId = profile?.id ?: -1
}.withResponse(response).withThrowable(throwable).withApiResponse(apiResponse))
}
fun error(tag: String, errorCode: Int, response: Response? = null, apiResponse: String? = null) {
val code = when (null) {
is UnknownHostException, is SSLException, is InterruptedIOException -> CODE_NO_INTERNET
@ -308,16 +316,21 @@ open class Data(val app: App, val profile: Profile?, val loginStore: LoginStore)
else -> errorCode
}
}
error(ApiError(tag, code).apply { profileId = profile?.id ?: -1 }.withResponse(response).withApiResponse(apiResponse))
error(ApiError(tag, code).apply {
profileId = profile?.id ?: -1
}.withResponse(response).withApiResponse(apiResponse))
}
fun error(apiError: ApiError) {
if (apiError.isCritical)
cancel()
callback.onError(apiError)
}
fun progress(step: Int) {
callback.onProgress(step)
}
fun startProgress(stringRes: Int) {
callback.onStartProgress(stringRes)
}

View File

@ -3201,6 +3201,7 @@ public class Librus implements EdziennikInterface {
id,
teacherId,
type,
null,
dateFrom,
dateTo,
timeFrom,

View File

@ -61,6 +61,8 @@ import pl.szczodrzynski.edziennik.data.db.modules.subjects.SubjectDao;
import pl.szczodrzynski.edziennik.data.db.modules.teachers.Teacher;
import pl.szczodrzynski.edziennik.data.db.modules.teachers.TeacherAbsence;
import pl.szczodrzynski.edziennik.data.db.modules.teachers.TeacherAbsenceDao;
import pl.szczodrzynski.edziennik.data.db.modules.teachers.TeacherAbsenceType;
import pl.szczodrzynski.edziennik.data.db.modules.teachers.TeacherAbsenceTypeDao;
import pl.szczodrzynski.edziennik.data.db.modules.teachers.TeacherDao;
import pl.szczodrzynski.edziennik.data.db.modules.teams.Team;
import pl.szczodrzynski.edziennik.data.db.modules.teams.TeamDao;
@ -71,6 +73,7 @@ import pl.szczodrzynski.edziennik.utils.models.Date;
//GradeCategory.class,
Teacher.class,
TeacherAbsence.class,
TeacherAbsenceType.class,
Subject.class,
Notice.class,
Lesson.class,
@ -91,7 +94,7 @@ import pl.szczodrzynski.edziennik.utils.models.Date;
EndpointTimer.class,
LessonRange.class,
Notification.class,
Metadata.class}, version = 60)
Metadata.class}, version = 61)
@TypeConverters({
ConverterTime.class,
ConverterDate.class,
@ -105,6 +108,7 @@ public abstract class AppDb extends RoomDatabase {
//public abstract GradeCategoryDao gradeCategoryDao();
public abstract TeacherDao teacherDao();
public abstract TeacherAbsenceDao teacherAbsenceDao();
public abstract TeacherAbsenceTypeDao teacherAbsenceTypeDao();
public abstract SubjectDao subjectDao();
public abstract NoticeDao noticeDao();
public abstract LessonDao lessonDao();
@ -667,6 +671,17 @@ public abstract class AppDb extends RoomDatabase {
database.execSQL("ALTER TABLE profiles ADD COLUMN disabledNotifications TEXT DEFAULT NULL");
}
};
private static final Migration MIGRATION_60_61 = new Migration(60, 61) {
@Override
public void migrate(@NonNull SupportSQLiteDatabase database) {
database.execSQL("CREATE TABLE IF NOT EXISTS teacherAbsenceTypes (" +
"profileId INTEGER NOT NULL," +
"teacherAbsenceTypeId INTEGER NOT NULL," +
"teacherAbsenceTypeName TEXT NOT NULL," +
"PRIMARY KEY(profileId, teacherAbsenceTypeId))");
database.execSQL("ALTER TABLE teacherAbsence ADD COLUMN teacherAbsenceName TEXT DEFAULT NULL");
}
};
public static AppDb getDatabase(final Context context) {
@ -724,7 +739,8 @@ public abstract class AppDb extends RoomDatabase {
MIGRATION_56_57,
MIGRATION_57_58,
MIGRATION_58_59,
MIGRATION_59_60
MIGRATION_59_60,
MIGRATION_60_61
)
.allowMainThreadQueries()
//.fallbackToDestructiveMigration()

View File

@ -19,6 +19,9 @@ open class TeacherAbsence (
@ColumnInfo(name = "teacherAbsenceType")
val type: Long,
@ColumnInfo(name = "teacherAbsenceName")
val name: String?,
@ColumnInfo(name = "teacherAbsenceDateFrom")
val dateFrom: Date,

View File

@ -3,9 +3,9 @@ package pl.szczodrzynski.edziennik.data.db.modules.teachers
import pl.szczodrzynski.edziennik.utils.models.Date
import pl.szczodrzynski.edziennik.utils.models.Time
class TeacherAbsenceFull(profileId: Int, id: Long, teacherId: Long, type: Long,
class TeacherAbsenceFull(profileId: Int, id: Long, teacherId: Long, type: Long, name: String?,
dateFrom: Date, dateTo: Date, timeFrom: Time?, timeTo: Time?)
: TeacherAbsence(profileId, id, teacherId, type, dateFrom, dateTo, timeFrom, timeTo) {
: TeacherAbsence(profileId, id, teacherId, type, name, dateFrom, dateTo, timeFrom, timeTo) {
var teacherFullName = ""

View File

@ -0,0 +1,20 @@
/*
* Copyright (c) Kacper Ziubryniewicz 2019-10-18
*/
package pl.szczodrzynski.edziennik.data.db.modules.teachers
import androidx.room.ColumnInfo
import androidx.room.Entity
@Entity(tableName = "teacherAbsenceTypes",
primaryKeys = ["profileId", "teacherAbsenceTypeId"])
data class TeacherAbsenceType (
val profileId: Int,
@ColumnInfo(name = "teacherAbsenceTypeId")
val id: Long,
@ColumnInfo(name = "teacherAbsenceTypeName")
val name: String
)

View File

@ -0,0 +1,25 @@
/*
* Copyright (c) Kacper Ziubryniewicz 2019-10-18
*/
package pl.szczodrzynski.edziennik.data.db.modules.teachers
import androidx.room.Dao
import androidx.room.Insert
import androidx.room.OnConflictStrategy
import androidx.room.Query
@Dao
interface TeacherAbsenceTypeDao {
@Insert(onConflict = OnConflictStrategy.REPLACE)
fun add(teacherAbsence: TeacherAbsenceType)
@Insert(onConflict = OnConflictStrategy.REPLACE)
fun addAll(teacherAbsenceList: List<TeacherAbsenceType>)
@Query("DELETE FROM teacherAbsenceTypes WHERE profileId = :profileId")
fun clear(profileId: Int)
@Query("SELECT * FROM teacherAbsenceTypes WHERE profileId = :profileId")
fun getAllNow(profileId: Int): List<TeacherAbsenceType>
}

View File

@ -1,6 +1,7 @@
package pl.szczodrzynski.edziennik.ui.dialogs.teacherabsence
import android.content.Context
import android.opengl.Visibility
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
@ -47,10 +48,19 @@ class TeacherAbsenceAdapter(
}
holder.teacherAbsenceTime.text = time
if (teacherAbsence.name != null) {
holder.teacherAbsenceName.visibility = View.VISIBLE
holder.teacherAbsenceName.text = teacherAbsence.name
} else {
holder.teacherAbsenceName.visibility = View.GONE
}
}
class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
var teacherAbsenceTeacher: TextView = itemView.findViewById(R.id.teacherAbsenceTeacher)
var teacherAbsenceTime: TextView = itemView.findViewById(R.id.teacherAbsenceTime)
var teacherAbsenceName: TextView = itemView.findViewById(R.id.teacherAbsenceName)
}
}

View File

@ -36,6 +36,15 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
tools:text="Jan Kowalski"/>
<TextView
android:id="@+id/teacherAbsenceName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="@style/NavView.TextView.Helper"
android:visibility="gone"
tools:text="wycieczka"
tools:visibility="visible"/>
</LinearLayout>
</com.google.android.material.card.MaterialCardView>
</LinearLayout>

View File

@ -949,4 +949,5 @@
<string name="edziennik_notification_api_first_login_title">Pierwsze logowanie</string>
<string name="edziennik_progress_endpoint_classes">Pobieranie informacji o klasie...</string>
<string name="edziennik_progress_endpoint_teacher_free_days">Pobieranie nieobecności nauczycieli...</string>
<string name="edziennik_progress_endpoint_teacher_free_day_types">Pobieranie rodzajów nieobecności nauczycieli...</string>
</resources>