From 2934d21f5fe1c4e21ac87a3728da0542ed2005d0 Mon Sep 17 00:00:00 2001 From: Joshua Coles Date: Fri, 29 Sep 2023 21:19:43 +0100 Subject: [PATCH] Rephrase toggl scraping in term of attendances --- app/jobs/scrape_toggl_job.rb | 24 ++++++++++++++----- app/models/attendance.rb | 8 +++++++ app/models/lecture.rb | 1 + .../20230929201207_create_attendances.rb | 11 +++++++++ ...1903_remove_toggl_entry_id_from_lecture.rb | 5 ++++ db/schema.rb | 13 ++++++++-- test/fixtures/attendances.yml | 11 +++++++++ test/models/attendance_test.rb | 7 ++++++ 8 files changed, 72 insertions(+), 8 deletions(-) create mode 100644 app/models/attendance.rb create mode 100644 db/migrate/20230929201207_create_attendances.rb create mode 100644 db/migrate/20230929201903_remove_toggl_entry_id_from_lecture.rb create mode 100644 test/fixtures/attendances.yml create mode 100644 test/models/attendance_test.rb diff --git a/app/jobs/scrape_toggl_job.rb b/app/jobs/scrape_toggl_job.rb index 2f205ef..a09c88b 100644 --- a/app/jobs/scrape_toggl_job.rb +++ b/app/jobs/scrape_toggl_job.rb @@ -12,7 +12,8 @@ class ScrapeTogglJob < ApplicationJob # @param [Course] course def scrape_course(course) toggl_project_id = course.toggl_project - lectures = course.lectures.order(:start_time).where(associated_toggl_entry: nil) + lectures = course.lectures.order(:start_time) + return if lectures.empty? entries_data = Toggl::entries_for_project( @@ -24,13 +25,24 @@ class ScrapeTogglJob < ApplicationJob ) lectures.each do |lecture| - entries_data.find do |entry| - associated_entry = entry['time_entries'].find do |inner_entry| - (Time.new(inner_entry['start']) - lecture.start_time) < 15.seconds + entries_data.each do |entry| + concurrent_time_entry = entry['time_entries'].find do |inner_entry| + (Time.new(inner_entry['start']) - lecture.start_time) < 10.minutes end - if associated_entry.present? - lecture.update!(associated_toggl_entry: associated_entry['id']) + if concurrent_time_entry.present? + Attendance.create!( + lecture:, + associated_toggl_entry: concurrent_time_entry['id'], + kind: :concurrent + ) + elsif entry['description'] == lecture.nice_title + # If the title matches but it wasn't concurrent, then it was a catchup + Attendance.create!( + lecture:, + associated_toggl_entry: entry['time_entries'][0]['id'], + kind: :catchup + ) end end end diff --git a/app/models/attendance.rb b/app/models/attendance.rb new file mode 100644 index 0000000..b822bc7 --- /dev/null +++ b/app/models/attendance.rb @@ -0,0 +1,8 @@ +class Attendance < ApplicationRecord + belongs_to :lecture + + enum :kind, [ + :concurrent, + :catchup + ] +end diff --git a/app/models/lecture.rb b/app/models/lecture.rb index 9ff2dcf..7e36de5 100644 --- a/app/models/lecture.rb +++ b/app/models/lecture.rb @@ -1,5 +1,6 @@ class Lecture < ApplicationRecord belongs_to :course + has_one :attendance enum :status, [ :undetermined, diff --git a/db/migrate/20230929201207_create_attendances.rb b/db/migrate/20230929201207_create_attendances.rb new file mode 100644 index 0000000..6e4bda1 --- /dev/null +++ b/db/migrate/20230929201207_create_attendances.rb @@ -0,0 +1,11 @@ +class CreateAttendances < ActiveRecord::Migration[7.0] + def change + create_table :attendances do |t| + t.references :lecture, null: false, foreign_key: true + t.string :associated_toggl_entry + t.integer :kind + + t.timestamps + end + end +end diff --git a/db/migrate/20230929201903_remove_toggl_entry_id_from_lecture.rb b/db/migrate/20230929201903_remove_toggl_entry_id_from_lecture.rb new file mode 100644 index 0000000..79a7ee1 --- /dev/null +++ b/db/migrate/20230929201903_remove_toggl_entry_id_from_lecture.rb @@ -0,0 +1,5 @@ +class RemoveTogglEntryIdFromLecture < ActiveRecord::Migration[7.0] + def change + remove_column :lectures, :associated_toggl_entry + end +end diff --git a/db/schema.rb b/db/schema.rb index 44a1da7..5d22434 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,10 +10,19 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema[7.0].define(version: 2023_09_29_200245) do +ActiveRecord::Schema[7.0].define(version: 2023_09_29_201903) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" + create_table "attendances", force: :cascade do |t| + t.bigint "lecture_id", null: false + t.string "associated_toggl_entry" + t.integer "kind" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.index ["lecture_id"], name: "index_attendances_on_lecture_id" + end + create_table "courses", force: :cascade do |t| t.string "title" t.string "unit_code" @@ -31,9 +40,9 @@ ActiveRecord::Schema[7.0].define(version: 2023_09_29_200245) do t.datetime "created_at", null: false t.datetime "updated_at", null: false t.bigint "course_id" - t.string "associated_toggl_entry" t.index ["course_id"], name: "index_lectures_on_course_id" t.index ["recording_id"], name: "index_lectures_on_recording_id", unique: true end + add_foreign_key "attendances", "lectures" end diff --git a/test/fixtures/attendances.yml b/test/fixtures/attendances.yml new file mode 100644 index 0000000..149927a --- /dev/null +++ b/test/fixtures/attendances.yml @@ -0,0 +1,11 @@ +# Read about fixtures at https://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html + +one: + lecture: one + associated_toggl_entry: MyString + kind: 1 + +two: + lecture: two + associated_toggl_entry: MyString + kind: 1 diff --git a/test/models/attendance_test.rb b/test/models/attendance_test.rb new file mode 100644 index 0000000..fa2aac9 --- /dev/null +++ b/test/models/attendance_test.rb @@ -0,0 +1,7 @@ +require "test_helper" + +class AttendanceTest < ActiveSupport::TestCase + # test "the truth" do + # assert true + # end +end