Description:
[web] improving readability of test_interface, re: ticket #10 git-svn-id: http://theory.cpe.ku.ac.th/grader/web/trunk@141 6386c4cd-e34a-4fa8-8920-d93eb39b512e
Commit status:
[Not Reviewed]
References:
Comments:
0 Commit comments 0 Inline Comments
Unresolved TODOs:
There are no unresolved TODOs
Add another comment

r64:f6cdb5f921b2 - - 5 files changed: 6 inserted, 5 deleted

@@ -1,52 +1,53
1 1 class TestController < ApplicationController
2 2
3 3 before_filter :authenticate
4 4
5 5 verify :method => :post, :only => [:test_submit],
6 6 :redirect_to => { :action => :index }
7 7
8 8 def index
9 9 @user = User.find(session[:user_id])
10 10 prepare_index_information
11 + @test_requests = @user.test_requests
11 12 end
12 13
13 14 def submit
14 15 @user = User.find(session[:user_id])
15 16 test_request = TestRequest.new_from_form_params(@user,params[:test_request])
16 17 if test_request.save
17 18 redirect_to :action => 'index'
18 19 else
19 20 flash[:notice] = 'Error saving your test submission'
20 21 redirect_to :action => 'index'
21 22 end
22 23 end
23 24
24 25 def read
25 26 user = User.find(session[:user_id])
26 27 test_request = TestRequest.find(params[:id])
27 28 if test_request.user_id != user.id
28 29 flash[:notice] = 'Invalid output'
29 30 redirect_to :action => 'index'
30 31 return
31 32 end
32 33 if test_request.output_file_name!=nil
33 34 data = File.open(test_request.output_file_name).read(2048)
34 35 if data==nil
35 36 data=""
36 37 end
37 38 send_data(data,
38 39 {:filename => 'output.txt',
39 40 :type => 'text/plain'})
40 41 return
41 42 end
42 43 redirect_to :action => 'index'
43 44 end
44 45
45 46 protected
46 47
47 48 def prepare_index_information
48 49 @submissions = Submission.find_last_for_all_available_problems(@user.id)
49 50 @problems = @submissions.collect { |submission| submission.problem }
50 51 end
51 52
52 53 end
@@ -1,76 +1,76
1 1 require 'digest/sha1'
2 2
3 3 class User < ActiveRecord::Base
4 4
5 5 has_and_belongs_to_many :roles
6 6
7 - has_many :test_requests, :order => "problem_id"
7 + has_many :test_requests, :order => "submitted_at DESC"
8 8
9 9 validates_presence_of :login
10 10 validates_presence_of :full_name
11 11 validates_length_of :full_name, :minimum => 1
12 12
13 13 validates_presence_of :password, :if => :password_required?
14 14 validates_length_of :password, :within => 4..20, :if => :password_required?
15 15 validates_confirmation_of :password, :if => :password_required?
16 16
17 17 attr_accessor :password
18 18
19 19 before_save :encrypt_new_password
20 20
21 21 def self.authenticate(login, password)
22 22 user = find_by_login(login)
23 23 return user if user && user.authenticated?(password)
24 24 end
25 25
26 26 def authenticated?(password)
27 27 hashed_password == User.encrypt(password,self.salt)
28 28 end
29 29
30 30 def admin?
31 31 self.roles.detect {|r| r.name == 'admin' }
32 32 end
33 33
34 34 def email_for_editing
35 35 if self.email==nil
36 36 "(unknown)"
37 37 elsif self.email==''
38 38 "(blank)"
39 39 else
40 40 self.email
41 41 end
42 42 end
43 43
44 44 def email_for_editing=(e)
45 45 self.email=e
46 46 end
47 47
48 48 def alias_for_editing
49 49 if self.alias==nil
50 50 "(unknown)"
51 51 elsif self.alias==''
52 52 "(blank)"
53 53 else
54 54 self.alias
55 55 end
56 56 end
57 57
58 58 def alias_for_editing=(e)
59 59 self.alias=e
60 60 end
61 61
62 62 protected
63 63 def encrypt_new_password
64 64 return if password.blank?
65 65 self.salt = (10+rand(90)).to_s
66 66 self.hashed_password = User.encrypt(self.password,self.salt)
67 67 end
68 68
69 69 def password_required?
70 70 self.hashed_password.blank? || !self.password.blank?
71 71 end
72 72
73 73 def self.encrypt(string,salt)
74 74 Digest::SHA1.hexdigest(salt + string)
75 75 end
76 76 end
@@ -1,11 +1,11
1 1 %tr{:class => (test_request_counter%2==0) ? "info-even" : "info-odd"}
2 2 %td= test_request_counter +1
3 3 %td= test_request.problem.full_name
4 4 %td= test_request.submission.number
5 5 %td= test_request.status_str
6 - %td= test_request.running_stat or ''
6 + %td= simple_format((test_request.running_stat or ''))
7 7 %td
8 8 - if test_request.output_file_name!=nil
9 9 = link_to '[output]', :action => 'read', :id => test_request.id
10 10 %td= test_request.grader_comment or ''
11 - %td= test_request.compiler_message or ''
11 + %td= simple_format((test_request.compiler_message or ''))
@@ -1,73 +1,73
1 1 <h2>Test Interface</h2>
2 2
3 3 <% if @problems.length==0 %>
4 4 There is no submission
5 5 <% else %>
6 6
7 7 <script type="text/javascript">
8 8 var submissionCount = {
9 9 <% @submissions.each do |submission| %>
10 10 <%= submission.problem_id %> : <%= submission.number %>,
11 11 <% end %>
12 12 };
13 13 function updateSubmissionList() {
14 14 currentProb = document.getElementById("test_request_problem_id").value;
15 15 count = submissionCount[currentProb];
16 16 submissionSelect = document.getElementById("test_request_submission_number");
17 17 submissionSelect.options.length = 0;
18 18 for(i=0; i<count; i++) {
19 19 submissionSelect.options[i] = new Option(""+(i+1),""+(i+1),false,false);
20 20 }
21 21 }
22 22 </script>
23 23
24 24 <% form_for :test_request, nil,
25 25 :url => { :action => 'submit'},
26 26 :html => { :multipart => true } do |f| %>
27 27 <table>
28 28 <tr>
29 29 <td>Task:</td>
30 30 <td>
31 31 <%= select(:test_request,
32 32 :problem_id,
33 33 @problems.collect {|p| [p.name, p.id]}, {},
34 34 { :onclick => "updateSubmissionList();" }) %>
35 35 </td>
36 36 </tr>
37 37 <tr>
38 38 <td>Submission:</td>
39 39 <td>
40 40 <%= select(:test_request,
41 41 :submission_number,
42 42 ((1..@submissions[0].number).collect {|n| [n,n]}).reverse) %>
43 43 </td>
44 44 </tr>
45 45 <tr>
46 46 <td>Input data:</td>
47 47 <td><%= f.file_field :input_file %></td>
48 48 <tr>
49 49 <td colspan="2">
50 50 <%= submit_tag 'submit' %>
51 51 </td>
52 52 </tr>
53 53 </table>
54 54 <% end %>
55 55
56 56 <h3>Previous requests</h3>
57 57
58 58 <table class="info">
59 59 <tr class="info-head">
60 60 <th></td>
61 61 <th>problem</th>
62 62 <th>#</th>
63 63 <th>status</th>
64 64 <th>running stat</th>
65 65 <th>output (first 2kb)</th>
66 66 <th>grading comment</th>
67 67 <th>compiler message</th>
68 68 </tr>
69 - <%= render :partial => 'test_request', :collection => @user.test_requests %>
69 + <%= render :partial => 'test_request', :collection => @test_requests %>
70 70 </table>
71 71
72 72 <% end %>
73 73
@@ -1,37 +1,37
1 1
2 2 require File.dirname(__FILE__) + '/../spec_helper'
3 3
4 - describe Submission do
4 + describe Submission, "when verifying user submission" do
5 5
6 6 before(:each) do
7 7 @submission = Submission.new
8 8 @submission.source = <<SOURCE
9 9 /*
10 10 LANG: C++
11 11 TASK: testproblem
12 12 */
13 13 SOURCE
14 14 end
15 15
16 16 it "should find language in source" do
17 17 langcpp = stub(Language, :name => 'cpp', :ext => 'cpp')
18 18 Language.should_receive(:find_by_name).with('C++').and_return(langcpp)
19 19 Submission.find_language_in_source(@submission.source).should == langcpp
20 20 end
21 21
22 22 it "should find problem in source, when there is any" do
23 23 problem = stub(Problem, :name => 'testproblem')
24 24 Problem.should_receive(:find_by_name).with('testproblem').and_return(problem)
25 25 Submission.find_problem_in_source(@submission.source).should == problem
26 26 end
27 27
28 28 it "should return nil when it cannot find problem in source" do
29 29 Submission.find_problem_in_source(<<SOURCE
30 30 /*
31 31 LANG: C
32 32 */
33 33 SOURCE
34 34 ).should == nil
35 35 end
36 36
37 37 end
You need to be logged in to leave comments. Login now