class TimetableManager

include Contracts ~~~~~~~~~~~~~~~~~~~~~~~~~~

Public Class Methods

new(timetable_reader, date) click to toggle source

Contract IsA, Any => Any

# File lib/tmis/engine/import/timetable_manager.rb, line 21
def initialize(timetable_reader, date)
  @reader = timetable_reader
  @days = {'понедельник' => date, 'вторник' => date + 1, 'среда' => date + 2, 'четверг' => date + 3, 'пятница' => date + 4, 'суббота' => date + 5 }
end

Public Instance Methods

save_to_db() click to toggle source

Contract None => Any

# File lib/tmis/engine/import/timetable_manager.rb, line 27
def save_to_db
  Database.instance.transaction do
    create_subgroups
    (1..4).each{ |n| add(Course, number: n) }
    Course.all.zip(Course.all).flatten.each_with_index { |c, i| add(Semester, {title: i + 1, course_id: c}) }
  end
end

Private Instance Methods

add(model, options) click to toggle source

Contract IsA, Hash => IsA

# File lib/tmis/engine/import/timetable_manager.rb, line 71
def add(model, options)
  model.where(options).first_or_create
end
create_studies(data, group, subgroups) click to toggle source

Contract Hash, Group, ArrayOf => Any

# File lib/tmis/engine/import/timetable_manager.rb, line 46
def create_studies(data, group, subgroups)
  data[:days].each do |day|
    day[:studies].each_with_index do |study, number|
      if study.size == 1
        if (s = study.first[:info][:subgroup])
          s = s.to_i
          if s > 0 && s < 3
            Study.create( get_study_options(study[0], day[:name], number.succ, subgroups[s.to_i - 1]) )
          else
            next
          end
        else
          Study.create( get_study_options(study[0], day[:name], number.succ, group) )
        end
      else
        study.each do |sepstudy|
          Study.create( get_study_options(sepstudy, day[:name], number.succ,
            sepstudy[:info][:subgroup] ? subgroups[sepstudy[:info][:subgroup].to_i - 1] : group) )
        end
      end
    end
  end
end
create_subgroups() click to toggle source

Contract None => Any

# File lib/tmis/engine/import/timetable_manager.rb, line 37
def create_subgroups
  @reader.groups.each do |data|
    group = add(Group, title: data[:title] || "")
    subgroups = (1..2).map{ |i| add(Subgroup, {group_id: group, number: i}) }
    create_studies(data, group, subgroups)
  end
end
fix_cabinet(title) click to toggle source

Contract Or[Num, String] => String

# File lib/tmis/engine/import/timetable_manager.rb, line 107
def fix_cabinet(title)
  title.is_a?(Float) ? title.ceil.to_s : title.to_s
end
get_study_options(study, day, study_number, groupable) click to toggle source

Contract Hash, String, Pos, Or[Group, Subgroup] => Hash

# File lib/tmis/engine/import/timetable_manager.rb, line 76
def get_study_options(study, day, study_number, groupable)
  { subject: add(Subject, title: study[:info][:subject]),
    cabinet: new_cabinet_or_stub(study),
    lecturer: new_lecturer_or_stub(study),
    date: @days[day.mb_chars.downcase.to_s.gsub(' ', '')],
    number: study_number,
    groupable: groupable }
end
new_cabinet_or_stub(study) click to toggle source
# File lib/tmis/engine/import/timetable_manager.rb, line 98
def new_cabinet_or_stub(study)
  if study[:cabinet]
    add(Cabinet, title: fix_cabinet(study[:cabinet]))
  else
    Cabinet.where(stub: true).first
  end
end
new_lecturer_or_stub(study) click to toggle source
# File lib/tmis/engine/import/timetable_manager.rb, line 85
def new_lecturer_or_stub(study)
  case study[:info][:lecturer][:surname]
  when nil
    Lecturer.where(stub: true).first
  when /#{Settings[:stubs, :lecturer]}/i
    Lecturer.where(stub: true).first
  else
    add(Lecturer, { surname: study[:info][:lecturer][:surname],
                    name: study[:info][:lecturer][:name],
                    patronymic: study[:info][:lecturer][:patronymic] })
  end
end