Description:
fixed bug: increament of number on old records in submission git-svn-id: http://theory.cpe.ku.ac.th/grader/web/trunk@98 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

r46:c9ffe114dd77 - - 1 file changed: 3 inserted, 2 deleted

@@ -1,61 +1,61
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 - before_save :assign_latest_number
13 + before_save :assign_latest_number_if_new_recond
14 14
15 15 def self.find_last_by_user_and_problem(user_id, problem_id)
16 16 last_sub = find(:first,
17 17 :conditions => {:user_id => user_id,
18 18 :problem_id => problem_id},
19 19 :order => 'submitted_at DESC')
20 20 return last_sub
21 21 end
22 22
23 23 def self.find_all_last_by_problem(problem_id)
24 24 # need to put in SQL command, maybe there's a better way
25 25 Submission.find_by_sql("SELECT * FROM submissions " +
26 26 "WHERE id = " +
27 27 "(SELECT MAX(id) FROM submissions AS subs " +
28 28 "WHERE subs.user_id = submissions.user_id AND " +
29 29 "problem_id = " + problem_id.to_s + " " +
30 30 "GROUP BY user_id)")
31 31 end
32 32
33 33 def self.find_last_for_all_available_problems(user_id)
34 34 submissions = Array.new
35 35 problems = Problem.find_available_problems
36 36 problems.each do |problem|
37 37 sub = Submission.find_last_by_user_and_problem(user_id, problem.id)
38 38 submissions << sub if sub!=nil
39 39 end
40 40 submissions
41 41 end
42 42
43 43 def self.find_by_user_problem_number(user_id, problem_id, number)
44 44 Submission.find(:first,
45 45 :conditions => {
46 46 :user_id => user_id,
47 47 :problem_id => problem_id,
48 48 :number => number
49 49 })
50 50 end
51 51
52 52 protected
53 53
54 54 def self.find_option_in_source(option, source)
55 55 if source==nil
56 56 return nil
57 57 end
58 58 i = 0
59 59 source.each_line do |s|
60 60 if s =~ option
61 61 words = s.split
@@ -66,54 +66,55
66 66 return nil
67 67 end
68 68 end
69 69 return nil
70 70 end
71 71
72 72 def self.find_language_in_source(source)
73 73 langopt = find_option_in_source(/^LANG:/,source)
74 74 if language = Language.find_by_name(langopt)
75 75 return language
76 76 elsif language = Language.find_by_pretty_name(langopt)
77 77 return language
78 78 else
79 79 return nil
80 80 end
81 81 end
82 82
83 83 def self.find_problem_in_source(source)
84 84 prob_opt = find_option_in_source(/^TASK:/,source)
85 85 if problem = Problem.find_by_name(prob_opt)
86 86 return problem
87 87 else
88 88 return nil
89 89 end
90 90 end
91 91
92 92 # validation codes
93 93 def must_specify_language
94 94 return if self.source==nil
95 95 self.language = Submission.find_language_in_source(self.source)
96 96 errors.add_to_base("must specify programming language") unless self.language!=nil
97 97 end
98 98
99 99 def must_have_valid_problem
100 100 return if self.source==nil
101 101 if self.problem_id!=-1
102 102 problem = Problem.find(self.problem_id)
103 103 else
104 104 problem = Submission.find_problem_in_source(self.source)
105 105 end
106 106 if problem==nil
107 107 errors.add_to_base("must specify problem")
108 108 elsif !problem.available
109 109 errors.add_to_base("must specify valid problem")
110 110 end
111 111 end
112 112
113 113 # callbacks
114 - def assign_latest_number
114 + def assign_latest_number_if_new_recond
115 + return if !self.new_record?
115 116 latest = Submission.find_last_by_user_and_problem(self.user_id, self.problem_id)
116 117 self.number = (latest==nil) ? 1 : latest.number + 1;
117 118 end
118 119
119 120 end
You need to be logged in to leave comments. Login now