You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
pgfqe6ch8/app/services/sources_service.rb

283 lines
12 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# encoding=utf-8
# 外部数据分析专用
class SourcesService
include ApplicationHelper
include GamesHelper
LIMIT = 10
# shixuns start ############################################
def shixun_index params
#offset = params[:page].to_i * 15
#Shixun.select([:id, :identifier]).offset(offset).limit(15)
Shixun.select([:id, :name,:identifier, :created_at]).where("created_at < ?", params[:time])
end
def shixun_detail params
shixun = Shixun.select([:id, :identifier, :name, :description, :user_id, :myshixuns_count, :evaluate_script,
:propaedeutics, :challenges_count, :gpid, :created_at, :updated_at]).find_by_identifier(params[:identifier])
return {:status => 404} unless shixun.present?
g = Gitlab.client
git_url = "#{Redmine::Configuration['gitlab_address']}/#{g.project(shixun.try(:gpid)).try(:path_with_namespace)}.git"
language = shixun.mirror_repositories.first.try(:type_name)
homework_common_ids = HomeworkCommonsShixuns.where(:shixun_id => shixun.id).pluck(:homework_common_id)
course_ids = HomeworkCommon.where(:id => homework_common_ids).pluck(:course_id)
course_info =[]
course_ids.each do |id|
course= Course.select([:name]).find id
course_info << {course_id: id, course_name: course.name}
end
list = shixun.try(:attributes).merge({:git_url => git_url, :language => language, :course_info => course_info})
return list
end
def shixun_challenges params
list = []
shixun = Shixun.find_by_identifier(params[:identifier])
return {:status => 404} unless shixun.present?
shixun.challenges.each do |challenge|
sets = []
challenge.test_sets.each do |set|
sets << {input: set.input, output: set.output}
end
list << {:id => challenge.id, :name => challenge.subject, :shixun_id => challenge.shixun_id,
:task_pass => challenge.task_pass, :position => challenge.position, :answer => challenge.answer,
:score => challenge.score, :path => challenge.path, :difficulty => challenge.difficulty,
:user_id => shixun.user_id, :sets => sets}
end
return list
end
def get_tpi_info params
shixun = Shixun.find_by_identifier params[:identifier]
page = params[:page].to_i
offset = page * 10
challenge_paths = shixun.challenges.pluck(:path)
myshixuns = shixun.myshixuns.select([:id, :user_id, :gpid, :shixun_id]).offset(offset).limit(10)
g = Gitlab.client
tpi_info = []
myshixuns.each do |myshixun|
code_info = []
challenge_paths.each do |paths|
x_paths = paths.split("")
x_paths.each do |path|
Rails.logger.info("############################gpid #{myshixun.gpid}")
Rails.logger.info("############################path #{path}")
code = g.files(myshixun.gpid, path, "master").try(:content)
code = tran_base64_decode64(code)
# 取begin和end之间的代码
if code.present?
user_code = code.match(/\/\*+ Begin \*+\/(\S*)\/\*+ End \*+\//)
coder = user_code[1] if code.length == 2
end
code_info << {path: path, code: code}
end
end
tpi_info << {user_id: myshixun.user_id, code: code_info}
end
{tpi_info: tpi_info}
end
# paths start ###########################
def get_paths_info params
path = Subject.find params[:id]
stages = path.stages.order("position asc")
path_info = []
stages.each do |stage|
chapter_name = stage.name
chapter_shixuns = []
stage.stage_shixuns.each do |stage_shixun|
challenges = stage_shixun.shixun.challenges
challenge_info = []
challenges.each do |challenge|
challenge_info << {challenge_id: challenge.id, challenge_name: challenge.subject}
end
chapter_shixuns << {name: stage_shixun.shixun.name, identifier: stage_shixun.shixun.identifier, challenge_info: challenge_info}
end
path_info << {chapter_name: chapter_name, chapter_shixuns: chapter_shixuns}
end
{ path_info: path_info}
end
# games start ############################################
def myshixuns_index params
endTime = Time.parse(params[:time].to_s)
beginTime = Time.parse(params[:begin_time].to_s)
offset = ((params[:page] || 1).to_i - 1) * 50
Myshixun.select([:id, :user_id, :shixun_id]).where("created_at < ? and created_at > ?", endTime, beginTime).offset(offset).limit(50)
end
def search_myshixun params
myshixun = Myshixun.where(:shixun_id => params[:shixun_id], :user_id => params[:user_id]).first
return {:status => 404} unless myshixun.present?
g = Gitlab.client
git_url = "#{Redmine::Configuration['gitlab_address']}/#{g.project(myshixun.try(:gpid)).try(:path_with_namespace)}.git"
{:status => myshixun.status, :git_url => git_url, :shixun_id => myshixun.shixun_id, :user_id => myshixun.user_id}
end
def games params
time = Time.parse(params[:time].to_s)
offset = ((params[:page] || 1).to_i - 1) * 50
Game.select([:id, :identifier, :user_id, :myshixun_id]).where("created_at < ?", time).offset(offset).limit(50)
end
# 关卡详情
def game_detail params
game = Game.min.find_by_identifier(params[:identifier])
myshixun = game.myshixun
return {:status => 404} unless game.present?
challenge = Challenge.min.find(game.challenge_id)
outputs_commit_count = Output.find_by_sql("select count(*) as commit_count from outputs where game_id=#{game.id} and test_set_position=1").first.try(:commit_count)
right = game.status == 2 ? true : false
type = challenge.st
g = Gitlab.client
last_code = game.game_codes.pluck(:new_code)
commit_status = []
game.outputs.group(:query_index).each_with_index do |output, index|
result = output.code == 0 ? true : false
commit_status << {commit_time: output.created_at, commit_result: result}
end
git_url = "#{Redmine::Configuration['gitlab_address']}/#{g.project(myshixun.try(:gpid)).try(:path_with_namespace)}.git"
{:id => game.id, :identifier => game.identifier, :commit_count => outputs_commit_count, :right => right, :type => type,
:myshixun_id => game.myshixun_id, :final_Score => game.final_score, :git_url => git_url,
shixun_id: myshixun.shixun_id, challenge_id: challenge.id, :last_commit_code => last_code, commit_status: commit_status}
end
# 搜索学员开启的关卡
def search_game params
shixun_id = Challenge.where(:id => params[:challenge_id]).pluck(:shixun_id).first
myshixun_id = Myshixun.where(:shixun_id => shixun_id, :user_id => params[:user_id]).pluck(:id).first
game = Game.where(:myshixun_id => myshixun_id, :challenge_id => params[:challenge_id]).first
if game.present?
return {:id => game.id, :identifier => game.identifier}
else
return {:status => 404}
end
end
# users start ############################################
def users params
time = Time.parse("#{params[:time]}")
users = User.select([:id, :login, :created_on, :firstname, :lastname, :nickname]).includes(user_extensions: :school).where("created_on < ?", time)
users = users.map{|user| {id: user.id, login: user.login, username: user.show_real_name, school: user.school_name, work: user.identity, sex: user.sex, created_on: user.created_on}}
end
def login params
user, last_login_on = User.try_to_login(params[:username], params[:password])
return {status: -1, message: '账号或密码错误!'} if user.blank?
{status: 1, user_id: user.id, message: "登陆成功!"}
end
def get_user_info params
user = User.find params[:id]
mail = user.mail.presence || "login@educoder.net"
{username: user.show_real_name, user_id: user.id, email: mail, phone: user.phone, sex: user.sex, school_name: user.school_name}
end
# courses start ############################################
def course_detail params
course = Course.select([:id, :name, :tea_id, :time, :term, :class_period, :school_id, :description,
:end_time, :end_term, :visits, :credit, :end_date, :members_count, :homework_commons_count]).find(params[:id])
if course.present?
return course.try(:attributes)
else
return {:status => 404}
end
end
def courses params
time = Time.parse("#{params[:time]}")
Course.select([:id, :name, :created_at]).where("created_at < ?", time)
end
def exercises params
time = Time.parse("#{params[:time]}")
Exercise.select([:id, :exercise_name, :created_at]).where("created_at < ?", time)
end
def exercise_detail params
exercise = Exercise.find params[:id]
if exercise.present?
return exercise.try(:attributes)
else
return {:status => 404}
end
end
def get_exercise_questions params
exercise = Exercise.find params[:id]
exercise_list = []
exercise.exercise_questions.each do |question|
title =
if question.question_type == 1 || question.question_type == 2
question.exercise_choices.pluck(:choice_text)
else
[]
end
right_answer =
if question.question_type == 1 || question.question_type == 2
choice_id = question.exercise_standard_answers.first.try(:exercise_choice_id)
choice_ids = choice_id.to_s.split("") if choice_id
question.exercise_choices.where(:choice_position => choice_ids).pluck(:choice_text)
elsif question.question_type == 5
[]
else
question.exercise_standard_answers.pluck(:answer_text)
end
exercise_list << {choice_id: choice_id, id: question.id, name: question.question_title, type: question.question_type_name, title: title, right_answer: right_answer, score: question.question_score}
end
{exercise_id: exercise.id, exercise_name: exercise.exercise_name, course_id: exercise.course_id, course_name: exercise.course.name, exercise_list: exercise_list}
end
# 竞赛相关 ###################################################
def get_competition_members params
comp = Competition.find_by_identifier params[:identifier]
team_ids = comp.competition_teams.pluck(:id)
user_team = TeamMember.where(:competition_team_id => team_ids, :user_id => params[:user_id]).first
users =TeamMember.where(:competition_team_id => user_team.try(:competition_team_id))
{team_user_ids: users.as_json(only: [:user_id, :role])}
end
def get_team_ids params
comp = Competition.find_by_identifier params[:identifier]
team_ids = comp.competition_teams.pluck(:id)
{team_ids: team_ids}
end
def get_team_user_ids params
comp = CompetitionTeam.find params[:team_id]
user_ids = comp.team_members.pluck(:user_id)
{user_ids: user_ids}
end
def get_user_competition_id params
competition_ids = Competition.where(:identifier => params[:identifier]).pluck(:id)
team_id = TeamMember.where(:user_id => params[:educoder_userid], :competition_id => competition_ids).pluck(:competition_team_id)
{team_id: team_id}
end
def get_team_info params
comp = Competition.find_by_identifier(params[:identifier])
if comp
team_info = []
teams = comp.competition_teams
teams.each do |t|
team_member = []
t.team_members.each do |m|
user = User.find m.user_id
team_member << {user_id: m.user_id, user_name: user.show_real_name}
end
team_info << {team_id: t.id, team_name: t.name, team_member: team_member}
end
{team_info: team_info}
end
end
def shixun_homework_commons params
HomeworkCommon.where(:homework_type => 4, :course_id => params[:id])
end
end