Description:
[web] fix problem availability bug git-svn-id: http://theory.cpe.ku.ac.th/grader/web/trunk@155 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

r75:8466e8e886f1 - - 1 file changed: 1 inserted, 1 deleted

@@ -1,130 +1,130
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 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 => 'number 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 def self.find_all_by_user_problem(user_id, problem_id)
53 53 Submission.find(:all,
54 54 :conditions => {
55 55 :user_id => user_id,
56 56 :problem_id => problem_id,
57 57 })
58 58 end
59 59
60 60 protected
61 61
62 62 def self.find_option_in_source(option, source)
63 63 if source==nil
64 64 return nil
65 65 end
66 66 i = 0
67 67 source.each_line do |s|
68 68 if s =~ option
69 69 words = s.split
70 70 return words[1]
71 71 end
72 72 i = i + 1
73 73 if i==10
74 74 return nil
75 75 end
76 76 end
77 77 return nil
78 78 end
79 79
80 80 def self.find_language_in_source(source)
81 81 langopt = find_option_in_source(/^LANG:/,source)
82 82 if language = Language.find_by_name(langopt)
83 83 return language
84 84 elsif language = Language.find_by_pretty_name(langopt)
85 85 return language
86 86 else
87 87 return nil
88 88 end
89 89 end
90 90
91 91 def self.find_problem_in_source(source)
92 92 prob_opt = find_option_in_source(/^TASK:/,source)
93 93 if problem = Problem.find_by_name(prob_opt)
94 94 return problem
95 95 else
96 96 return nil
97 97 end
98 98 end
99 99
100 100 # validation codes
101 101 def must_specify_language
102 102 return if self.source==nil
103 103 self.language = Submission.find_language_in_source(self.source)
104 104 errors.add_to_base("must specify programming language") unless self.language!=nil
105 105 end
106 106
107 107 def must_have_valid_problem
108 108 return if self.source==nil
109 109 if self.problem_id!=-1
110 110 problem = Problem.find(self.problem_id)
111 111 else
112 112 problem = Submission.find_problem_in_source(self.source)
113 113 end
114 114 if problem==nil
115 115 errors.add_to_base("must specify problem")
116 - elsif !problem.available
116 + elsif (!problem.available) and (self.new_record?)
117 117 errors.add_to_base("must specify valid problem")
118 118 else
119 119 self.problem = problem
120 120 end
121 121 end
122 122
123 123 # callbacks
124 124 def assign_latest_number_if_new_recond
125 125 return if !self.new_record?
126 126 latest = Submission.find_last_by_user_and_problem(self.user_id, self.problem_id)
127 127 self.number = (latest==nil) ? 1 : latest.number + 1;
128 128 end
129 129
130 130 end
You need to be logged in to leave comments. Login now