[Api/Librus] Add syncing and saving teacher absence

This commit is contained in:
Kacper Ziubryniewicz 2019-09-28 22:14:57 +02:00
parent ce0f2f74df
commit f4b997b41f
11 changed files with 298 additions and 184 deletions

View File

@ -72,6 +72,7 @@ import pl.szczodrzynski.edziennik.data.db.modules.profiles.Profile;
import pl.szczodrzynski.edziennik.data.db.modules.profiles.ProfileFull; import pl.szczodrzynski.edziennik.data.db.modules.profiles.ProfileFull;
import pl.szczodrzynski.edziennik.data.db.modules.subjects.Subject; 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.Teacher;
import pl.szczodrzynski.edziennik.data.db.modules.teachers.TeacherAbsence;
import pl.szczodrzynski.edziennik.data.db.modules.teams.Team; import pl.szczodrzynski.edziennik.data.db.modules.teams.Team;
import pl.szczodrzynski.edziennik.ui.modules.messages.MessagesComposeInfo; import pl.szczodrzynski.edziennik.ui.modules.messages.MessagesComposeInfo;
import pl.szczodrzynski.edziennik.utils.models.Date; import pl.szczodrzynski.edziennik.utils.models.Date;
@ -170,6 +171,7 @@ public class Librus implements EdziennikInterface {
private List<Team> teamList; private List<Team> teamList;
private List<Teacher> teacherList; private List<Teacher> teacherList;
private List<TeacherAbsence> teacherAbsenceList;
private List<Subject> subjectList; private List<Subject> subjectList;
private List<Lesson> lessonList; private List<Lesson> lessonList;
private List<LessonChange> lessonChangeList; private List<LessonChange> lessonChangeList;
@ -240,6 +242,7 @@ public class Librus implements EdziennikInterface {
teamList = profileId == -1 ? new ArrayList<>() : app.db.teamDao().getAllNow(profileId); teamList = profileId == -1 ? new ArrayList<>() : app.db.teamDao().getAllNow(profileId);
teacherList = profileId == -1 ? new ArrayList<>() : app.db.teacherDao().getAllNow(profileId); teacherList = profileId == -1 ? new ArrayList<>() : app.db.teacherDao().getAllNow(profileId);
teacherAbsenceList = new ArrayList<>();
subjectList = new ArrayList<>(); subjectList = new ArrayList<>();
lessonList = new ArrayList<>(); lessonList = new ArrayList<>();
lessonChangeList = new ArrayList<>(); lessonChangeList = new ArrayList<>();
@ -293,6 +296,7 @@ public class Librus implements EdziennikInterface {
targetEndpoints.add("BehaviourGrades"); targetEndpoints.add("BehaviourGrades");
targetEndpoints.add("Events"); targetEndpoints.add("Events");
targetEndpoints.add("TeacherFreeDays");
targetEndpoints.add("CustomTypes"); targetEndpoints.add("CustomTypes");
targetEndpoints.add("Homework"); targetEndpoints.add("Homework");
targetEndpoints.add("LuckyNumbers"); targetEndpoints.add("LuckyNumbers");
@ -349,6 +353,7 @@ public class Librus implements EdziennikInterface {
targetEndpoints.add("CustomTypes"); targetEndpoints.add("CustomTypes");
targetEndpoints.add("PtMeetings"); targetEndpoints.add("PtMeetings");
targetEndpoints.add("SchoolFreeDays"); targetEndpoints.add("SchoolFreeDays");
targetEndpoints.add("TeacherFreeDays");
break; break;
case FEATURE_GRADES: case FEATURE_GRADES:
targetEndpoints.add("SavedGradeCategories"); targetEndpoints.add("SavedGradeCategories");
@ -589,6 +594,8 @@ public class Librus implements EdziennikInterface {
} }
if (eventTypeList.size() > 0) if (eventTypeList.size() > 0)
app.db.eventTypeDao().addAll(eventTypeList); app.db.eventTypeDao().addAll(eventTypeList);
if (teacherAbsenceList.size() > 0)
app.db.teacherAbsenceDao().addAll(teacherAbsenceList);
if (noticeList.size() > 0) { if (noticeList.size() > 0) {
app.db.noticeDao().clear(profileId); app.db.noticeDao().clear(profileId);
app.db.noticeDao().addAll(noticeList); app.db.noticeDao().addAll(noticeList);
@ -3107,6 +3114,10 @@ public class Librus implements EdziennikInterface {
private SparseArray<String> teacherFreeDaysTypes = new SparseArray<>(); private SparseArray<String> teacherFreeDaysTypes = new SparseArray<>();
private void getTeacherFreeDaysTypes() { private void getTeacherFreeDaysTypes() {
if (!fullSync) {
r("finish", "TeacherFreeDaysTypes");
return;
}
callback.onActionStarted(R.string.sync_action_syncing_teacher_free_days_types); callback.onActionStarted(R.string.sync_action_syncing_teacher_free_days_types);
apiRequest("TeacherFreeDays/Types", data -> { apiRequest("TeacherFreeDays/Types", data -> {
if (data == null) { if (data == null) {
@ -3141,27 +3152,35 @@ public class Librus implements EdziennikInterface {
JsonObject freeDay = freeDayEl.getAsJsonObject(); JsonObject freeDay = freeDayEl.getAsJsonObject();
long id = freeDay.get("Id").getAsLong(); long id = freeDay.get("Id").getAsLong();
long teacherId = freeDay.getAsJsonObject("Teacher").get("Id").getAsLong();
Date dateFrom = Date.fromY_m_d(freeDay.get("DateFrom").getAsString()); Date dateFrom = Date.fromY_m_d(freeDay.get("DateFrom").getAsString());
Date dateTo = Date.fromY_m_d(freeDay.get("DateTo").getAsString()); Date dateTo = Date.fromY_m_d(freeDay.get("DateTo").getAsString());
int type = freeDay.getAsJsonObject("Type").get("Id").getAsInt(); long type = freeDay.getAsJsonObject("Type").get("Id").getAsLong();
String topic = teacherFreeDaysTypes.get(type)+"\n"+(dateFrom.getValue() != dateTo.getValue() ? dateFrom.getFormattedString()+" - "+dateTo.getFormattedString() : "");
Event eventObject = new Event( //String topic = teacherFreeDaysTypes.get(type)+"\n"+(dateFrom.getValue() != dateTo.getValue() ? dateFrom.getFormattedString()+" - "+dateTo.getFormattedString() : "");
TeacherAbsence teacherAbsence = new TeacherAbsence(
profileId, profileId,
id, id,
teacherId,
type,
dateFrom, dateFrom,
null, dateTo
topic,
-1,
TYPE_TEACHER_ABSENCE,
false,
freeDay.getAsJsonObject("Teacher").get("Id").getAsLong(),
-1,
-1
); );
eventList.add(eventObject);
metadataList.add(new Metadata(profileId, Metadata.TYPE_EVENT, eventObject.id, profile.getEmpty(), profile.getEmpty(), System.currentTimeMillis())); teacherAbsenceList.add(teacherAbsence);
metadataList.add(
new Metadata(
profileId,
Metadata.TYPE_TEACHER_ABSENCE,
teacherAbsence.getId(),
true,
true,
System.currentTimeMillis())
);
} }
r("finish", "TeacherFreeDays"); r("finish", "TeacherFreeDays");
} }

View File

@ -1,5 +1,6 @@
package pl.szczodrzynski.edziennik.data.db; package pl.szczodrzynski.edziennik.data.db;
import androidx.annotation.NonNull;
import androidx.sqlite.db.SupportSQLiteDatabase; import androidx.sqlite.db.SupportSQLiteDatabase;
import androidx.room.Database; import androidx.room.Database;
import androidx.room.Room; import androidx.room.Room;
@ -49,6 +50,8 @@ import pl.szczodrzynski.edziennik.data.db.modules.profiles.ProfileDao;
import pl.szczodrzynski.edziennik.data.db.modules.subjects.Subject; import pl.szczodrzynski.edziennik.data.db.modules.subjects.Subject;
import pl.szczodrzynski.edziennik.data.db.modules.subjects.SubjectDao; 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.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.TeacherDao; 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.Team;
import pl.szczodrzynski.edziennik.data.db.modules.teams.TeamDao; import pl.szczodrzynski.edziennik.data.db.modules.teams.TeamDao;
@ -60,6 +63,7 @@ import android.content.Context;
Grade.class, Grade.class,
//GradeCategory.class, //GradeCategory.class,
Teacher.class, Teacher.class,
TeacherAbsence.class,
Subject.class, Subject.class,
Notice.class, Notice.class,
Lesson.class, Lesson.class,
@ -77,7 +81,7 @@ import android.content.Context;
Message.class, Message.class,
MessageRecipient.class, MessageRecipient.class,
DebugLog.class, DebugLog.class,
Metadata.class}, version = 52) Metadata.class}, version = 53)
@TypeConverters({ @TypeConverters({
ConverterTime.class, ConverterTime.class,
ConverterDate.class, ConverterDate.class,
@ -89,6 +93,7 @@ public abstract class AppDb extends RoomDatabase {
public abstract GradeDao gradeDao(); public abstract GradeDao gradeDao();
//public abstract GradeCategoryDao gradeCategoryDao(); //public abstract GradeCategoryDao gradeCategoryDao();
public abstract TeacherDao teacherDao(); public abstract TeacherDao teacherDao();
public abstract TeacherAbsenceDao teacherAbsenceDao();
public abstract SubjectDao subjectDao(); public abstract SubjectDao subjectDao();
public abstract NoticeDao noticeDao(); public abstract NoticeDao noticeDao();
public abstract LessonDao lessonDao(); public abstract LessonDao lessonDao();
@ -532,6 +537,20 @@ public abstract class AppDb extends RoomDatabase {
database.execSQL("ALTER TABLE teachers ADD teacherTypeDescription TEXT DEFAULT NULL"); database.execSQL("ALTER TABLE teachers ADD teacherTypeDescription TEXT DEFAULT NULL");
} }
}; };
private static final Migration MIGRATION_52_53 = new Migration(52, 53) {
@Override
public void migrate(@NonNull SupportSQLiteDatabase database) {
database.execSQL("CREATE TABLE IF NOT EXISTS teacherAbsence (" +
"profileId INTEGER NOT NULL," +
"teacherAbsenceId INTEGER NOT NULL," +
"teacherId INTEGER NOT NULL," +
"teacherAbsenceType INTEGER NOT NULL," +
"teacherAbsenceDateFrom TEXT NOT NULL," +
"teacherAbsenceDateTo TEXT NOT NULL," +
"PRIMARY KEY(profileId, teacherAbsenceId)" +
")");
}
};
public static AppDb getDatabase(final Context context) { public static AppDb getDatabase(final Context context) {
@ -581,7 +600,8 @@ public abstract class AppDb extends RoomDatabase {
MIGRATION_48_49, MIGRATION_48_49,
MIGRATION_49_50, MIGRATION_49_50,
MIGRATION_50_51, MIGRATION_50_51,
MIGRATION_51_52) MIGRATION_51_52,
MIGRATION_52_53)
.allowMainThreadQueries() .allowMainThreadQueries()
//.fallbackToDestructiveMigration() //.fallbackToDestructiveMigration()
.build(); .build();

View File

@ -12,7 +12,7 @@ import androidx.room.RawQuery;
import java.util.List; import java.util.List;
import pl.szczodrzynski.edziennik.utils.models.Date; import pl.szczodrzynski.edziennik.utils.models.Date;
import pl.szczodrzynski.edziennik.utils.models.db.LessonChangeCounter; import pl.szczodrzynski.edziennik.ui.modules.agenda.LessonChangeCounter;
import static pl.szczodrzynski.edziennik.data.db.modules.metadata.Metadata.TYPE_LESSON_CHANGE; import static pl.szczodrzynski.edziennik.data.db.modules.metadata.Metadata.TYPE_LESSON_CHANGE;
import static pl.szczodrzynski.edziennik.utils.Utils.d; import static pl.szczodrzynski.edziennik.utils.Utils.d;

View File

@ -18,6 +18,7 @@ public class Metadata {
public static final int TYPE_LESSON_CHANGE = 6; public static final int TYPE_LESSON_CHANGE = 6;
public static final int TYPE_ANNOUNCEMENT = 7; public static final int TYPE_ANNOUNCEMENT = 7;
public static final int TYPE_MESSAGE = 8; public static final int TYPE_MESSAGE = 8;
public static final int TYPE_TEACHER_ABSENCE = 9;
public int profileId; public int profileId;

View File

@ -17,7 +17,7 @@ import pl.szczodrzynski.edziennik.data.db.modules.grades.Grade;
import pl.szczodrzynski.edziennik.data.db.modules.lessons.LessonChange; import pl.szczodrzynski.edziennik.data.db.modules.lessons.LessonChange;
import pl.szczodrzynski.edziennik.data.db.modules.lessons.LessonFull; import pl.szczodrzynski.edziennik.data.db.modules.lessons.LessonFull;
import pl.szczodrzynski.edziennik.data.db.modules.messages.Message; import pl.szczodrzynski.edziennik.data.db.modules.messages.Message;
import pl.szczodrzynski.edziennik.utils.models.db.UnreadCounter; import pl.szczodrzynski.edziennik.utils.models.UnreadCounter;
import static pl.szczodrzynski.edziennik.data.db.modules.metadata.Metadata.TYPE_ANNOUNCEMENT; import static pl.szczodrzynski.edziennik.data.db.modules.metadata.Metadata.TYPE_ANNOUNCEMENT;
import static pl.szczodrzynski.edziennik.data.db.modules.metadata.Metadata.TYPE_ATTENDANCE; import static pl.szczodrzynski.edziennik.data.db.modules.metadata.Metadata.TYPE_ATTENDANCE;

View File

@ -0,0 +1,27 @@
package pl.szczodrzynski.edziennik.data.db.modules.teachers
import androidx.room.ColumnInfo
import androidx.room.Entity
import pl.szczodrzynski.edziennik.utils.models.Date
@Entity(tableName = "teacherAbsence",
primaryKeys = ["profileId", "teacherAbsenceId"])
open class TeacherAbsence (
val profileId: Int,
@ColumnInfo(name = "teacherAbsenceId")
val id: Long,
val teacherId: Long,
@ColumnInfo(name = "teacherAbsenceType")
val type: Long,
@ColumnInfo(name = "teacherAbsenceDateFrom")
val dateFrom: Date,
@ColumnInfo(name = "teacherAbsenceDateTo")
val dateTo: Date
)

View File

@ -0,0 +1,26 @@
package pl.szczodrzynski.edziennik.data.db.modules.teachers
import androidx.room.Dao
import androidx.room.Insert
import androidx.room.OnConflictStrategy
import androidx.room.Query
import pl.szczodrzynski.edziennik.utils.models.Date
@Dao
interface TeacherAbsenceDao {
@Insert(onConflict = OnConflictStrategy.REPLACE)
fun add(teacherAbsence: TeacherAbsence)
@Insert(onConflict = OnConflictStrategy.REPLACE)
fun addAll(teacherAbsenceList: List<TeacherAbsence>)
@Query("SELECT profileId, teacherAbsenceDateFrom, teacherAbsenceDateTo, COUNT(*) as teacherAbsenceCount" +
"from teacherAbsence WHERE profileId = :profileId GROUP BY teacherAbsenceDateFrom, teacherAbsenceDateTo")
fun getCounters(profileId: Int)
@Query("SELECT profileId, teacherAbsenceDateFrom, teacherAbsenceDateTo, COUNT(*) as teacherAbsenceCount" +
"from teacherAbsence WHERE profileId = :profileId AND :date BETWEEN teacherAbsenceDateFrom and teacherAbsenceDateTo" +
"GROUP BY teacherAbsenceDateFrom, teacherAbsenceDateTo")
fun getCounterByDate(profileId: Int, date: Date)
}

View File

@ -0,0 +1,14 @@
package pl.szczodrzynski.edziennik.data.db.modules.teachers
import pl.szczodrzynski.edziennik.utils.models.Date
class TeacherAbsenceFull(profileId: Int, id: Long, teacherId: Long, type: Long, dateFrom: Date, dateTo: Date)
: TeacherAbsence(profileId, id, teacherId, type, dateFrom, dateTo) {
var teacherFullName = ""
// metadata
var seen: Boolean = false
var notified: Boolean = false
var addedDate: Long = 0
}

View File

@ -45,7 +45,6 @@ import pl.szczodrzynski.edziennik.ui.dialogs.event.EventManualDialog;
import pl.szczodrzynski.edziennik.ui.dialogs.lessonchange.LessonChangeDialog; import pl.szczodrzynski.edziennik.ui.dialogs.lessonchange.LessonChangeDialog;
import pl.szczodrzynski.edziennik.utils.models.Date; import pl.szczodrzynski.edziennik.utils.models.Date;
import pl.szczodrzynski.edziennik.utils.models.Time; import pl.szczodrzynski.edziennik.utils.models.Time;
import pl.szczodrzynski.edziennik.utils.models.db.LessonChangeCounter;
import pl.szczodrzynski.edziennik.utils.Colors; import pl.szczodrzynski.edziennik.utils.Colors;
import pl.szczodrzynski.edziennik.utils.Themes; import pl.szczodrzynski.edziennik.utils.Themes;
import pl.szczodrzynski.edziennik.utils.Utils; import pl.szczodrzynski.edziennik.utils.Utils;
@ -136,6 +135,14 @@ public class AgendaDefaultFragment extends Fragment {
activity.gainAttention(); activity.gainAttention();
if (viewType == AGENDA_DEFAULT) { if (viewType == AGENDA_DEFAULT) {
createDefaultAgendaView();
}
else {
createCalendarAgendaView();
}
}
private void createDefaultAgendaView() {
List<Integer> unreadEventDates = new ArrayList<>(); List<Integer> unreadEventDates = new ArrayList<>();
final Handler handler = new Handler(); final Handler handler = new Handler();
@ -276,7 +283,8 @@ public class AgendaDefaultFragment extends Fragment {
}); });
}), 500); }), 500);
} }
else {
private void createCalendarAgendaView() {
List<Integer> unreadEventDates = new ArrayList<>(); List<Integer> unreadEventDates = new ArrayList<>();
final Handler handler = new Handler(); final Handler handler = new Handler();
@ -352,7 +360,6 @@ public class AgendaDefaultFragment extends Fragment {
}); });
}), 300); }), 300);
} }
}
public static class EventListComparator implements java.util.Comparator<CalendarEvent> { public static class EventListComparator implements java.util.Comparator<CalendarEvent> {
@Override @Override

View File

@ -1,4 +1,4 @@
package pl.szczodrzynski.edziennik.utils.models.db; package pl.szczodrzynski.edziennik.ui.modules.agenda;
import pl.szczodrzynski.edziennik.utils.models.Date; import pl.szczodrzynski.edziennik.utils.models.Date;

View File

@ -1,4 +1,4 @@
package pl.szczodrzynski.edziennik.utils.models.db package pl.szczodrzynski.edziennik.utils.models
import pl.szczodrzynski.navlib.drawer.IUnreadCounter import pl.szczodrzynski.navlib.drawer.IUnreadCounter