Description:
added number (auto generated when submitting) to submissions
git-svn-id: http://theory.cpe.ku.ac.th/grader/web/trunk@73 6386c4cd-e34a-4fa8-8920-d93eb39b512e
Commit status:
[Not Reviewed]
References:
Diff options:
Comments:
0 Commit comments
0 Inline Comments
Unresolved TODOs:
There are no unresolved TODOs
r35:3d41a77d4876 - - 6 files changed: 62 inserted, 18 deleted
@@ -0,0 +1,33 | |||
|
1 | + class AddNumberToSubmissions < ActiveRecord::Migration | |
|
2 | + def self.up | |
|
3 | + add_column :submissions, :number, :integer | |
|
4 | + | |
|
5 | + # add number field for all records | |
|
6 | + Submission.reset_column_information | |
|
7 | + | |
|
8 | + last_user_id = nil | |
|
9 | + last_problem_id = nil | |
|
10 | + current_number = 0 | |
|
11 | + | |
|
12 | + Submission.find(:all, | |
|
13 | + :order => 'user_id, problem_id, submitted_at').each do |submission| | |
|
14 | + if submission.user_id==last_user_id and submission.problem_id==last_problem_id | |
|
15 | + current_number += 1 | |
|
16 | + else | |
|
17 | + current_number = 1 | |
|
18 | + end | |
|
19 | + submission.number = current_number | |
|
20 | + submission.save | |
|
21 | + | |
|
22 | + last_user_id = submission.user_id | |
|
23 | + last_problem_id = submission.problem_id | |
|
24 | + end | |
|
25 | + | |
|
26 | + add_index :submissions, [:user_id, :problem_id, :number], :unique => true | |
|
27 | + end | |
|
28 | + | |
|
29 | + def self.down | |
|
30 | + remove_index :submissions, :column => [:user_id, :problem_id, :number] | |
|
31 | + remove_column :submissions, :number | |
|
32 | + end | |
|
33 | + end |
@@ -48,19 +48,23 | |||
|
48 | 48 | :type => 'text/plain'}) |
|
49 | 49 | else |
|
50 | 50 | flash[:notice] = 'Error viewing source' |
|
51 | 51 | end |
|
52 | 52 | end |
|
53 | 53 | |
|
54 | 54 | protected |
|
55 | 55 | def prepare_list_information |
|
56 | 56 | @problems = Problem.find_available_problems |
|
57 | 57 | @prob_submissions = Array.new |
|
58 | 58 | @user = User.find(session[:user_id]) |
|
59 | 59 | @problems.each do |p| |
|
60 |
- |
|
|
61 | - @prob_submissions << { :count => c, :submission => sub } | |
|
60 | + sub = Submission.find_last_by_user_and_problem(@user.id,p.id) | |
|
61 | + if sub!=nil | |
|
62 | + @prob_submissions << { :count => sub.number, :submission => sub } | |
|
63 | + else | |
|
64 | + @prob_submissions << { :count => 0, :submission => nil } | |
|
65 | + end | |
|
62 | 66 | end |
|
63 | 67 | end |
|
64 | 68 | |
|
65 | 69 | end |
|
66 | 70 |
@@ -56,15 +56,15 | |||
|
56 | 56 | redirect_to :action => 'list' |
|
57 | 57 | end |
|
58 | 58 | |
|
59 | 59 | def toggle_avail |
|
60 | 60 | problem = Problem.find(params[:id]) |
|
61 | 61 | problem.available = !(problem.available) |
|
62 | 62 | problem.save |
|
63 | 63 | redirect_to :action => 'list' |
|
64 | 64 | end |
|
65 | 65 | |
|
66 | 66 | def stat |
|
67 | 67 | @problem = Problem.find(params[:id]) |
|
68 | - @submissions = Submission.find_last_by_problem(params[:id]) | |
|
68 | + @submissions = Submission.find_all_last_by_problem(params[:id]) | |
|
69 | 69 | end |
|
70 | 70 | end |
@@ -68,23 +68,23 | |||
|
68 | 68 | User.find(params[:id]).destroy |
|
69 | 69 | redirect_to :action => 'list' |
|
70 | 70 | end |
|
71 | 71 | |
|
72 | 72 | def user_stat |
|
73 | 73 | @problems = Problem.find_available_problems |
|
74 | 74 | @users = User.find(:all) |
|
75 | 75 | @scorearray = Array.new |
|
76 | 76 | @users.each do |u| |
|
77 | 77 | ustat = Array.new |
|
78 | 78 | ustat[0] = u.login |
|
79 | 79 | @problems.each do |p| |
|
80 |
- |
|
|
81 |
- if ( |
|
|
80 | + sub = Submission.find_last_by_user_and_problem(u.id,p.id) | |
|
81 | + if (sub!=nil) and (sub.points!=nil) | |
|
82 | 82 | ustat << [sub.points, (sub.points>=p.full_score)] |
|
83 | 83 | else |
|
84 | 84 | ustat << [0,false] |
|
85 | 85 | end |
|
86 | 86 | end |
|
87 | 87 | @scorearray << ustat |
|
88 | 88 | end |
|
89 | 89 | end |
|
90 | 90 | end |
@@ -1,47 +1,46 | |||
|
1 | 1 | class Submission < ActiveRecord::Base |
|
2 | 2 | |
|
3 | 3 | belongs_to :language |
|
4 | 4 | belongs_to :problem |
|
5 | 5 | belongs_to :user |
|
6 | 6 | |
|
7 | 7 | validates_presence_of :source |
|
8 | 8 | validates_length_of :source, :maximum => 100_000, :allow_blank => true, :message => 'too long' |
|
9 | 9 | validates_length_of :source, :minimum => 1, :allow_blank => true, :message => 'too short' |
|
10 | 10 | validate :must_specify_language |
|
11 | 11 | validate :must_have_valid_problem |
|
12 | 12 | |
|
13 | - def self.find_by_user_and_problem(user_id, problem_id) | |
|
14 | - subcount = count(:conditions => "user_id = #{user_id} AND problem_id = #{problem_id}") | |
|
15 | - if subcount != 0 | |
|
16 |
- |
|
|
17 |
- |
|
|
18 |
- |
|
|
19 |
- |
|
|
20 | - else | |
|
21 | - last_sub = nil | |
|
22 | - end | |
|
23 | - return subcount, last_sub | |
|
13 | + before_save :assign_latest_number | |
|
14 | + | |
|
15 | + def self.find_last_by_user_and_problem(user_id, problem_id) | |
|
16 | + last_sub = find(:first, | |
|
17 | + :conditions => {:user_id => user_id, | |
|
18 | + :problem_id => problem_id}, | |
|
19 | + :order => 'submitted_at DESC') | |
|
20 | + return last_sub | |
|
24 | 21 | end |
|
25 | 22 | |
|
26 | - def self.find_last_by_problem(problem_id) | |
|
23 | + def self.find_all_last_by_problem(problem_id) | |
|
27 | 24 | # need to put in SQL command, maybe there's a better way |
|
28 | 25 | Submission.find_by_sql("SELECT * FROM submissions " + |
|
29 | 26 | "WHERE id = " + |
|
30 | 27 | "(SELECT MAX(id) FROM submissions AS subs " + |
|
31 | 28 | "WHERE subs.user_id = submissions.user_id AND " + |
|
32 | 29 | "problem_id = " + problem_id.to_s + " " + |
|
33 | 30 | "GROUP BY user_id)") |
|
34 | 31 | end |
|
35 | 32 | |
|
33 | + protected | |
|
34 | + | |
|
36 | 35 | def self.find_option_in_source(option, source) |
|
37 | 36 | if source==nil |
|
38 | 37 | return nil |
|
39 | 38 | end |
|
40 | 39 | i = 0 |
|
41 | 40 | source.each_line do |s| |
|
42 | 41 | if s =~ option |
|
43 | 42 | words = s.split |
|
44 | 43 | return words[1] |
|
45 | 44 | end |
|
46 | 45 | i = i + 1 |
|
47 | 46 | if i==10 |
@@ -83,13 +82,19 | |||
|
83 | 82 | if self.problem_id!=-1 |
|
84 | 83 | problem = Problem.find(self.problem_id) |
|
85 | 84 | else |
|
86 | 85 | problem = Submission.find_problem_in_source(self.source) |
|
87 | 86 | end |
|
88 | 87 | if problem==nil |
|
89 | 88 | errors.add_to_base("must specify problem") |
|
90 | 89 | elsif !problem.available |
|
91 | 90 | errors.add_to_base("must specify valid problem") |
|
92 | 91 | end |
|
93 | 92 | end |
|
94 | 93 | |
|
94 | + # callbacks | |
|
95 | + def assign_latest_number | |
|
96 | + latest = Submission.find_last_by_user_and_problem(self.user_id, self.problem_id) | |
|
97 | + self.number = (latest==nil) ? 1 : latest.number + 1; | |
|
98 | + end | |
|
99 | + | |
|
95 | 100 | end |
@@ -1,24 +1,24 | |||
|
1 | 1 | # This file is auto-generated from the current state of the database. Instead of editing this file, |
|
2 | 2 | # please use the migrations feature of ActiveRecord to incrementally modify your database, and |
|
3 | 3 | # then regenerate this schema definition. |
|
4 | 4 | # |
|
5 | 5 | # Note that this schema.rb definition is the authoritative source for your database schema. If you need |
|
6 | 6 | # to create the application database on another system, you should be using db:schema:load, not running |
|
7 | 7 | # all the migrations from scratch. The latter is a flawed and unsustainable approach (the more migrations |
|
8 | 8 | # you'll amass, the slower it'll run and the greater likelihood for issues). |
|
9 | 9 | # |
|
10 | 10 | # It's strongly recommended to check this file into your version control system. |
|
11 | 11 | |
|
12 |
- ActiveRecord::Schema.define(:version => 1 |
|
|
12 | + ActiveRecord::Schema.define(:version => 18) do | |
|
13 | 13 | |
|
14 | 14 | create_table "grader_processes", :force => true do |t| |
|
15 | 15 | t.string "host", :limit => 20 |
|
16 | 16 | t.integer "pid" |
|
17 | 17 | t.string "mode" |
|
18 | 18 | t.boolean "active" |
|
19 | 19 | t.datetime "created_at" |
|
20 | 20 | t.datetime "updated_at" |
|
21 | 21 | t.integer "task_id" |
|
22 | 22 | end |
|
23 | 23 | |
|
24 | 24 | add_index "grader_processes", ["host", "pid"], :name => "index_grader_processes_on_ip_and_pid" |
@@ -74,26 +74,28 | |||
|
74 | 74 | create_table "submissions", :force => true do |t| |
|
75 | 75 | t.integer "user_id" |
|
76 | 76 | t.integer "problem_id" |
|
77 | 77 | t.integer "language_id" |
|
78 | 78 | t.text "source" |
|
79 | 79 | t.binary "binary" |
|
80 | 80 | t.datetime "submitted_at" |
|
81 | 81 | t.datetime "compiled_at" |
|
82 | 82 | t.text "compiler_message" |
|
83 | 83 | t.datetime "graded_at" |
|
84 | 84 | t.integer "points" |
|
85 | 85 | t.text "grader_comment" |
|
86 | + t.integer "number" | |
|
86 | 87 | end |
|
87 | 88 | |
|
89 | + add_index "submissions", ["user_id", "problem_id", "number"], :name => "index_submissions_on_user_id_and_problem_id_and_number", :unique => true | |
|
88 | 90 | add_index "submissions", ["user_id", "problem_id"], :name => "index_submissions_on_user_id_and_problem_id" |
|
89 | 91 | |
|
90 | 92 | create_table "tasks", :force => true do |t| |
|
91 | 93 | t.integer "submission_id" |
|
92 | 94 | t.datetime "created_at" |
|
93 | 95 | t.integer "status" |
|
94 | 96 | t.datetime "updated_at" |
|
95 | 97 | end |
|
96 | 98 | |
|
97 | 99 | create_table "users", :force => true do |t| |
|
98 | 100 | t.string "login", :limit => 10 |
|
99 | 101 | t.string "full_name" |
You need to be logged in to leave comments.
Login now