PageRenderTime 27ms CodeModel.GetById 19ms RepoModel.GetById 0ms app.codeStats 0ms

/sepap/app/controllers/attempts_controller.rb

https://github.com/rafagarciag/sepap
Ruby | 258 lines | 137 code | 65 blank | 56 comment | 12 complexity | 78e7989ce35e056a2cb05a85ac22fbd3 MD5 | raw file
  1. # -*- encoding : utf-8 -*-
  2. class AttemptsController < ApplicationController
  3. load_and_authorize_resource
  4. # GET /attempts
  5. # GET /attempts.xml
  6. def index
  7. @tab = "hist"
  8. @problemas = current_user.attempts.select('numero_problema').group(:numero_problema).page(params[:page]).per(20)
  9. @attempts = current_user.attempts
  10. respond_to do |format|
  11. format.html # index.html.erb
  12. format.xml { render :xml => @attempts }
  13. end
  14. end
  15. #======================
  16. # Muestra los últimos N intentos para todos los problemas
  17. #======================
  18. def show_last
  19. #Número de resultados que se mostrarán
  20. n = 25
  21. @attempts = Attempt.order("id desc").limit(n)
  22. end
  23. # GET /attempts/1
  24. # GET /attempts/1.xml
  25. def show
  26. @attempt = Attempt.find(params[:id])
  27. @attempt.resultado ? res = @attempt.resultado : res = " "
  28. #Desplegar el error de compilación en caso de existir
  29. if current_user.id == @attempt.user.id
  30. if res.include? 'Error de compilación'
  31. if FileTest.exist?("archivos/alumno/#{@attempt.user.matricula}/#{@attempt.numero_problema}/error")
  32. archivo = File.new("archivos/alumno/#{@attempt.user.matricula}/#{@attempt.numero_problema}/error", "r")
  33. @error = ""
  34. archivo.each {|line|
  35. #quita el path de donde esta guardado el archivo, esto para no mostrar informacion del servidor
  36. #linea = line.gsub("archivos/alumno/#{@attempt.user.matricula}/#{@attempt.numero_problema}/","")
  37. #linea = line.gsub(/\/([a-z]|sepap|((a|l)[0-9]+)|[0-9]+)+/, "")
  38. #linea = line.gsub(/\/home\/([a-z]|[0-9]|\/)+\/sepap\/archivos\/alumno\/#{@attempt.user.matricula}\/#{@attempt.numero_problema}\//, "")
  39. linea = line.gsub(/\/([a-z]|[0-9]|\/)+\/#{@attempt.user.matricula}\/#{@attempt.numero_problema}\//, "")
  40. @error << linea
  41. }
  42. archivo.close
  43. end
  44. end
  45. if FileTest.exist?("#{@attempt.code}")
  46. source = File.new("#{@attempt.code}", "r")
  47. @codigo = ""
  48. source.each {|line|
  49. @codigo << line
  50. }
  51. source.close
  52. end
  53. respond_to do |format|
  54. format.html # show.html.erb
  55. format.xml { render :xml => @attempt }
  56. end
  57. else #Si no es el usuario
  58. respond_to do |format|
  59. format.html { redirect_to(home_index_url) }
  60. end
  61. end
  62. end
  63. # GET /attempts/new
  64. # GET /attempts/new.xml
  65. def new
  66. @attempt = Attempt.new
  67. @tab = "newA"
  68. @numero = params[:numero]
  69. respond_to do |format|
  70. format.html # new.html.erb
  71. format.xml { render :xml => @attempt }
  72. end
  73. end
  74. # GET /attempts/1/edit
  75. def edit
  76. @attempt = Attempt.find(params[:id])
  77. end
  78. # POST /attempts
  79. # POST /attempts.xml
  80. def create
  81. @attempt = Attempt.new(params[:attempt])
  82. @attempt.user_id = current_user.id
  83. @attempt.problem = Problem.where(:numero => @attempt.numero_problema).first
  84. @attempt.lenguaje = params[:lenguaje]
  85. #Aqui genera un numero aleatorio para definir que entrada y salida usara
  86. num = 1 + rand(3)
  87. # =======================================================
  88. # Aqui compila el codigo fuente y produce un resultado
  89. #=========================================================
  90. respond_to do |format|
  91. if @attempt.save
  92. #=============================================================================
  93. #Se realiza el proceso de compilacion y verificacion de resultados para Java
  94. #=============================================================================
  95. if @attempt.lenguaje.include? "Java"
  96. #Checa si el problema a resolver es de modulos
  97. #Crea link simbolico
  98. if @attempt.problem.modulo?
  99. link = `cd archivos/alumno/#{@attempt.user.matricula}/#{@attempt.numero_problema}; ln -s #{@attempt.problem.solution}`
  100. end
  101. #tiempo limite
  102. tiempo = @attempt.problem.tiempo
  103. #archivo con el codigo fuente del alumno
  104. archivo = @attempt.code
  105. #archivo = "archivos/alumno/#{@attempt.user.matricula}/#{@attempt.numero_problema}/Problema#{@attempt.numero_problema}.java"
  106. #archivo que se ejecutará despues de compilar
  107. ejecutable = "archivos/alumno/#{@attempt.user.matricula}/#{@attempt.numero_problema} Problema#{@attempt.numero_problema}"
  108. #entrada con la que se correrá el ejecutable
  109. entrada = "archivos/maestro/#{@attempt.numero_problema}/entrada#{num}"
  110. #archivo donde se guardará la salida al ejecutar el archivo del alumno
  111. salida = "archivos/alumno/#{@attempt.user.matricula}/#{@attempt.numero_problema}/salida"
  112. #salida esperada proporcionada por el profesor
  113. salida_esperada = "archivos/maestro/#{@attempt.numero_problema}/salida_esperada#{num}"
  114. #archivo donde se guardarán los errores de compilación, ejecucion, etc. en caso de existir
  115. error = "archivos/alumno/#{@attempt.user.matricula}/#{@attempt.numero_problema}/error"
  116. #se llama al compilador
  117. resultado = `./compilarJava2 #{archivo} '#{ejecutable}' #{entrada} #{salida} #{salida_esperada} #{error} #{tiempo}`
  118. #=============================================================================
  119. #Se realiza el proceso de compilacion y verificacion de resultados para C/C++
  120. #=============================================================================
  121. elsif @attempt.lenguaje.include? "C/C++"
  122. if @attempt.problem.modulo?
  123. #archivo en C con el main que llamara al Header que sube el alumno
  124. link = `cd archivos/alumno/#{@attempt.user.matricula}/#{@attempt.numero_problema};ln -s #{@attempt.problem.solution}`
  125. archivo = "archivos/alumno/#{@attempt.user.matricula}/#{@attempt.numero_problema}/#{@attempt.problem.solution.file.filename.capitalize}"
  126. else
  127. #archivo con el codigo fuente del alumno
  128. archivo = @attempt.code
  129. end
  130. #tiempo limite
  131. tiempo = @attempt.problem.tiempo
  132. #archivo que se ejecutará despues de compilar
  133. ejecutable = "archivos/alumno/#{@attempt.user.matricula}/#{@attempt.numero_problema}/Problema#{@attempt.numero_problema}"
  134. #entrada con la que se correrá el ejecutable
  135. entrada = "archivos/maestro/#{@attempt.numero_problema}/entrada#{num}"
  136. #archivo donde se guardará la salida al ejecutar el archivo del alumno
  137. salida = "archivos/alumno/#{@attempt.user.matricula}/#{@attempt.numero_problema}/salida"
  138. #salida esperada proporcionada por el profesor
  139. salida_esperada = "archivos/maestro/#{@attempt.numero_problema}/salida_esperada#{num}"
  140. #archivo donde se guardarán los errores de compilación, ejecucion, etc. en caso de existir
  141. error = "archivos/alumno/#{@attempt.user.matricula}/#{@attempt.numero_problema}/error"
  142. #se llama al compilador
  143. resultado = `./compilarC #{archivo} '#{ejecutable}' #{entrada} #{salida} #{salida_esperada} #{error} #{tiempo}`
  144. end
  145. #Verifica el resultado que arroja el script
  146. if resultado.include? "ACEPTADO"
  147. resultado = "Aceptado"
  148. rutaAceptado = "archivos/alumno/#{@attempt.user.matricula}/#{@attempt.numero_problema}/aceptado"
  149. #Hace una copia del codigo fuente en caso de ser aceptado
  150. `mkdir -p #{rutaAceptado}`
  151. `cp #{@attempt.code} #{rutaAceptado}/aceptado`
  152. elsif resultado.include? "Error de compilación"
  153. resultado = "Error de compilación"
  154. elsif resultado.include? "Tiempo excedido"
  155. resultado = "Tiempo excedido"
  156. else
  157. resultado = "Rechazado"
  158. end
  159. #en caso de producirse un error y no tener un resultado
  160. @attempt.update_attribute(:resultado, "#{resultado}")
  161. format.html { redirect_to(@attempt, :notice => 'El Intento fue creado exitosamente.') }
  162. format.xml { render :xml => @attempt, :status => :created, :location => @attempt }
  163. else
  164. format.html { render :action => "new" }
  165. format.xml { render :xml => @attempt.errors, :status => :unprocessable_entity }
  166. end
  167. end
  168. end
  169. # PUT /attempts/1
  170. # PUT /attempts/1.xml
  171. def update
  172. @attempt = Attempt.find(params[:id])
  173. respond_to do |format|
  174. if @attempt.update_attributes(params[:attempt])
  175. format.html { redirect_to(@attempt, :notice => 'El Intento fue actualizado exitosamente.') }
  176. format.xml { head :ok }
  177. else
  178. format.html { render :action => "edit" }
  179. format.xml { render :xml => @attempt.errors, :status => :unprocessable_entity }
  180. end
  181. end
  182. end
  183. # DELETE /attempts/1
  184. # DELETE /attempts/1.xml
  185. def destroy
  186. @attempt = Attempt.find(params[:id])
  187. @attempt.destroy
  188. respond_to do |format|
  189. format.html { redirect_to(attempts_url) }
  190. format.xml { head :ok }
  191. end
  192. end
  193. end