Description:
save point
Commit status:
[Not Reviewed]
References:
Comments:
0 Commit comments 0 Inline Comments
Unresolved TODOs:
There are no unresolved TODOs
Add another comment

r423:abd08161c89d - - 1 file changed: 13 inserted, 0 deleted

@@ -1,178 +1,191
1 1 class ReportController < ApplicationController
2 2
3 3 before_filter :admin_authorization, only: [:login_stat,:submission_stat]
4 + before_filter(only: :problem_hof) { |c|
5 + user = User.find(session[:user_id]) if session[:user_id]
6 + if user==nil
7 + flash[:notice] = 'You have to login first'
8 + redirect_to :controller => 'main', :action => 'login'
9 + return false
10 + end
11 +
12 + unless GraderConfiguration["hall_of_fame_available"]
13 + flash[:notice] = 'You are not authorized to view the page you requested'
14 + redirect_to :controller => 'main', :action => 'login' unless GraderConfiguration[ "hall_of_fame_available" ]
15 + end
16 + }
4 17
5 18 def login_stat
6 19 @logins = Array.new
7 20
8 21 date_and_time = '%Y-%m-%d %H:%M'
9 22 begin
10 23 @since_time = DateTime.strptime(params[:since_datetime],date_and_time)
11 24 rescue
12 25 @since_time = DateTime.new(1000,1,1)
13 26 end
14 27 begin
15 28 @until_time = DateTime.strptime(params[:until_datetime],date_and_time)
16 29 rescue
17 30 @until_time = DateTime.new(3000,1,1)
18 31 end
19 32
20 33 User.all.each do |user|
21 34 @logins << { login: user.login,
22 35 full_name: user.full_name,
23 36 count: Login.where("user_id = ? AND created_at >= ? AND created_at <= ?",
24 37 user.id,@since_time,@until_time)
25 38 .count(:id),
26 39 min: Login.where("user_id = ? AND created_at >= ? AND created_at <= ?",
27 40 user.id,@since_time,@until_time)
28 41 .minimum(:created_at),
29 42 max: Login.where("user_id = ? AND created_at >= ? AND created_at <= ?",
30 43 user.id,@since_time,@until_time)
31 44 .maximum(:created_at)
32 45 }
33 46 end
34 47 end
35 48
36 49 def submission_stat
37 50
38 51 date_and_time = '%Y-%m-%d %H:%M'
39 52 begin
40 53 @since_time = DateTime.strptime(params[:since_datetime],date_and_time)
41 54 rescue
42 55 @since_time = DateTime.new(1000,1,1)
43 56 end
44 57 begin
45 58 @until_time = DateTime.strptime(params[:until_datetime],date_and_time)
46 59 rescue
47 60 @until_time = DateTime.new(3000,1,1)
48 61 end
49 62
50 63 @submissions = {}
51 64
52 65 User.find_each do |user|
53 66 @submissions[user.id] = { login: user.login, full_name: user.full_name, count: 0, sub: { } }
54 67 end
55 68
56 69 Submission.where("submitted_at >= ? AND submitted_at <= ?",@since_time,@until_time).find_each do |s|
57 70 if @submissions[s.user_id]
58 71 if not @submissions[s.user_id][:sub].has_key?(s.problem_id)
59 72 a = nil
60 73 begin
61 74 a = Problem.find(s.problem_id)
62 75 rescue
63 76 a = nil
64 77 end
65 78 @submissions[s.user_id][:sub][s.problem_id] =
66 79 { prob_name: (a ? a.full_name : '(NULL)'),
67 80 sub_ids: [s.id] }
68 81 else
69 82 @submissions[s.user_id][:sub][s.problem_id][:sub_ids] << s.id
70 83 end
71 84 @submissions[s.user_id][:count] += 1
72 85 end
73 86 end
74 87 end
75 88
76 89 def problem_hof
77 90 # gen problem list
78 91 @user = User.find(session[:user_id])
79 92 @problems = @user.available_problems
80 93
81 94 # get selected problems or the default
82 95 if params[:id]
83 96 begin
84 97 @problem = Problem.available.find(params[:id])
85 98 rescue
86 99 redirect_to action: :problem_hof
87 100 flash[:notice] = 'Error: submissions for that problem are not viewable.'
88 101 return
89 102 end
90 103 end
91 104
92 105 if @problem
93 106 #aggregrate by language
94 107 @by_lang = {}
95 108 Submission.where(problem_id: @problem.id).find_each do |sub|
96 109 lang = Language.find_by_id(sub.language_id)
97 110 next unless lang
98 111 next unless sub.points >= @problem.full_score
99 112
100 113 #initialize
101 114 unless @by_lang.has_key?(lang.pretty_name)
102 115 @by_lang[lang.pretty_name] = {
103 116 runtime: { avail: false, value: 2**30-1 },
104 117 memory: { avail: false, value: 2**30-1 },
105 118 length: { avail: false, value: 2**30-1 },
106 119 first: { avail: false, value: DateTime.new(3000,1,1) }
107 120 }
108 121 end
109 122
110 123 if sub.max_runtime and sub.max_runtime < @by_lang[lang.pretty_name][:runtime][:value]
111 124 @by_lang[lang.pretty_name][:runtime] = {
112 125 avail: true,
113 126 user_id: sub.user_id,
114 127 value: sub.max_runtime,
115 128 sub_id: sub.id
116 129 }
117 130 end
118 131
119 132 if sub.peak_memory and sub.peak_memory < @by_lang[lang.pretty_name][:memory][:value]
120 133 @by_lang[lang.pretty_name][:memory] = {
121 134 avail: true,
122 135 user_id: sub.user_id,
123 136 value: sub.peak_memory,
124 137 sub_id: sub.id
125 138 }
126 139 end
127 140
128 141 if sub.submitted_at and sub.submitted_at < @by_lang[lang.pretty_name][:first][:value]
129 142 @by_lang[lang.pretty_name][:first] = {
130 143 avail: true,
131 144 user_id: sub.user_id,
132 145 value: sub.submitted_at,
133 146 sub_id: sub.id
134 147 }
135 148 end
136 149
137 150 if @by_lang[lang.pretty_name][:length][:value] > sub.effective_code_length
138 151 @by_lang[lang.pretty_name][:length] = {
139 152 avail: true,
140 153 user_id: sub.user_id,
141 154 value: sub.effective_code_length,
142 155 sub_id: sub.id
143 156 }
144 157 end
145 158 end
146 159
147 160 #process user_id
148 161 @by_lang.each do |lang,prop|
149 162 prop.each do |k,v|
150 163 v[:user] = User.exists?(v[:user_id]) ? User.find(v[:user_id]).login : "(NULL)"
151 164 end
152 165 end
153 166
154 167 #sum into best
155 168 if @by_lang and @by_lang.first
156 169 @best = @by_lang.first[1]
157 170 @by_lang.each do |lang,prop|
158 171 if @best[:runtime][:value] > prop[:runtime][:value]
159 172 @best[:runtime] = prop[:runtime]
160 173 @best[:runtime][:lang] = lang
161 174 end
162 175 if @best[:memory][:value] > prop[:memory][:value]
163 176 @best[:memory] = prop[:memory]
164 177 @best[:memory][:lang] = lang
165 178 end
166 179 if @best[:length][:value] > prop[:length][:value]
167 180 @best[:length] = prop[:length]
168 181 @best[:length][:lang] = lang
169 182 end
170 183 if @best[:first][:value] > prop[:first][:value]
171 184 @best[:first] = prop[:first]
172 185 @best[:first][:lang] = lang
173 186 end
174 187 end
175 188 end
176 189 end
177 190 end
178 191 end
You need to be logged in to leave comments. Login now