Description:
add user profile page listing all submission, permission is by 'right.user_view_submission' add link from users to their profile page
Commit status:
[Not Reviewed]
References:
Comments:
0 Commit comments 0 Inline Comments
Unresolved TODOs:
There are no unresolved TODOs
Add another comment

r431:7654a9f33bc8 - - 6 files changed: 89 inserted, 11 deleted

@@ -0,0 +1,40
1 + - content_for :header do
2 + = javascript_include_tag 'new'
3 +
4 + %script{:type=>"text/javascript"}
5 + $(function () {
6 + $('#submission_table').tablesorter({widgets: ['zebra','filter']});
7 + });
8 +
9 + %h1= @user.full_name + ' Profile'
10 +
11 + %h2 Basic info
12 + <b>Login:</b> #{@user.login} <br/>
13 + <b>Full name:</b> #{@user.full_name} <br />
14 +
15 +
16 + %h2 Problem Stat
17 +
18 + %h2 Submissions
19 +
20 + %table.tablesorter-cafe#submission_table
21 + %thead
22 + %tr
23 + %th ID
24 + %th Problem code
25 + %th Problem name
26 + %th Language
27 + %th Result
28 + %th Score
29 + %tbody
30 + - @submission.each do |s|
31 + %tr
32 + %td= link_to "#{s.id}", controller: "graders", action: "submission", id: s.id
33 + %td= s.problem.name
34 + %td= s.problem.full_name
35 + %td= s.language.pretty_name
36 + %td{style: 'font-family: Droid Sans Mono,Consolas, monospace, mono'}= s.grader_comment
37 + %td= s.points/s.problem.full_score * 100
38 +
39 +
40 +
@@ -18,25 +18,26
18 begin
18 begin
19 @since_time = DateTime.strptime(params[:since_datetime],date_and_time)
19 @since_time = DateTime.strptime(params[:since_datetime],date_and_time)
20 rescue
20 rescue
21 @since_time = DateTime.new(1000,1,1)
21 @since_time = DateTime.new(1000,1,1)
22 end
22 end
23 begin
23 begin
24 @until_time = DateTime.strptime(params[:until_datetime],date_and_time)
24 @until_time = DateTime.strptime(params[:until_datetime],date_and_time)
25 rescue
25 rescue
26 @until_time = DateTime.new(3000,1,1)
26 @until_time = DateTime.new(3000,1,1)
27 end
27 end
28
28
29 User.all.each do |user|
29 User.all.each do |user|
30 - @logins << { login: user.login,
30 + @logins << { id: user.id,
31 + login: user.login,
31 full_name: user.full_name,
32 full_name: user.full_name,
32 count: Login.where("user_id = ? AND created_at >= ? AND created_at <= ?",
33 count: Login.where("user_id = ? AND created_at >= ? AND created_at <= ?",
33 user.id,@since_time,@until_time)
34 user.id,@since_time,@until_time)
34 .count(:id),
35 .count(:id),
35 min: Login.where("user_id = ? AND created_at >= ? AND created_at <= ?",
36 min: Login.where("user_id = ? AND created_at >= ? AND created_at <= ?",
36 user.id,@since_time,@until_time)
37 user.id,@since_time,@until_time)
37 .minimum(:created_at),
38 .minimum(:created_at),
38 max: Login.where("user_id = ? AND created_at >= ? AND created_at <= ?",
39 max: Login.where("user_id = ? AND created_at >= ? AND created_at <= ?",
39 user.id,@since_time,@until_time)
40 user.id,@since_time,@until_time)
40 .maximum(:created_at)
41 .maximum(:created_at)
41 }
42 }
42 end
43 end
@@ -5,24 +5,25
5 include MailHelperMethods
5 include MailHelperMethods
6
6
7 before_filter :authenticate, :except => [:new,
7 before_filter :authenticate, :except => [:new,
8 :register,
8 :register,
9 :confirm,
9 :confirm,
10 :forget,
10 :forget,
11 :retrieve_password]
11 :retrieve_password]
12
12
13 before_filter :verify_online_registration, :only => [:new,
13 before_filter :verify_online_registration, :only => [:new,
14 :register,
14 :register,
15 :forget,
15 :forget,
16 :retrieve_password]
16 :retrieve_password]
17 + before_filter :authenticate, :profile_authorization, only: [:profile]
17
18
18 verify :method => :post, :only => [:chg_passwd],
19 verify :method => :post, :only => [:chg_passwd],
19 :redirect_to => { :action => :index }
20 :redirect_to => { :action => :index }
20
21
21 #in_place_edit_for :user, :alias_for_editing
22 #in_place_edit_for :user, :alias_for_editing
22 #in_place_edit_for :user, :email_for_editing
23 #in_place_edit_for :user, :email_for_editing
23
24
24 def index
25 def index
25 if !GraderConfiguration['system.user_setting_enabled']
26 if !GraderConfiguration['system.user_setting_enabled']
26 redirect_to :controller => 'main', :action => 'list'
27 redirect_to :controller => 'main', :action => 'list'
27 else
28 else
28 @user = User.find(session[:user_id])
29 @user = User.find(session[:user_id])
@@ -99,24 +100,29
99 else
100 else
100 user.password = user.password_confirmation = User.random_password
101 user.password = user.password_confirmation = User.random_password
101 user.save
102 user.save
102 send_new_password_email(user)
103 send_new_password_email(user)
103 flash[:notice] = 'New password has been mailed to you.'
104 flash[:notice] = 'New password has been mailed to you.'
104 end
105 end
105 else
106 else
106 flash[:notice] = I18n.t 'registration.password_retrieval.no_email'
107 flash[:notice] = I18n.t 'registration.password_retrieval.no_email'
107 end
108 end
108 redirect_to :action => 'forget'
109 redirect_to :action => 'forget'
109 end
110 end
110
111
112 + def profile
113 + @user = User.find(params[:id])
114 + @submission = Submission.where(user_id: params[:id]).all
115 + end
116 +
111 protected
117 protected
112
118
113 def verify_online_registration
119 def verify_online_registration
114 if !GraderConfiguration['system.online_registration']
120 if !GraderConfiguration['system.online_registration']
115 redirect_to :controller => 'main', :action => 'login'
121 redirect_to :controller => 'main', :action => 'login'
116 end
122 end
117 end
123 end
118
124
119 def send_confirmation_email(user)
125 def send_confirmation_email(user)
120 contest_name = GraderConfiguration['contest.name']
126 contest_name = GraderConfiguration['contest.name']
121 activation_url = url_for(:action => 'confirm',
127 activation_url = url_for(:action => 'confirm',
122 :login => user.login,
128 :login => user.login,
@@ -144,13 +150,27
144 :full_name => user.full_name,
150 :full_name => user.full_name,
145 :contest_name => contest_name,
151 :contest_name => contest_name,
146 :login => user.login,
152 :login => user.login,
147 :password => user.password,
153 :password => user.password,
148 :admin_email => admin_email
154 :admin_email => admin_email
149 })
155 })
150
156
151 logger.info mail_body
157 logger.info mail_body
152
158
153 send_mail(user.email, mail_subject, mail_body)
159 send_mail(user.email, mail_subject, mail_body)
154 end
160 end
155
161
162 + # allow viewing of regular user profile only when options allow so
163 + # only admins can view admins profile
164 + def profile_authorization
165 + #if view admins' profile, allow only admin
166 + return false unless(params[:id])
167 + user = User.find(params[:id])
168 + return false unless user
169 + return admin_authorization if user.admin?
170 + return true if GraderConfiguration["right.user_view_submission"]
171 +
172 + #finally, we allow only admin
173 + admin_authorization
156 end
174 end
175 +
176 + end
@@ -1,62 +1,79
1 :css
1 :css
2 .hof_user { color: orangered; font-style: italic; }
2 .hof_user { color: orangered; font-style: italic; }
3 .hof_language { color: green; font-style: italic; }
3 .hof_language { color: green; font-style: italic; }
4 .hof_value { color: deeppink;font-style: italic; }
4 .hof_value { color: deeppink;font-style: italic; }
5
5
6 %h2 Overall
6 %h2 Overall
7
7
8 - if @best
8 - if @best
9 %b Best Runtime:
9 %b Best Runtime:
10 - by <span class="hof_user">#{@best[:runtime][:user]}</span> using <span class="hof_language">#{@best[:runtime][:lang]}</span> with <span class="hof_value">#{@best[:runtime][:value] * 1000} milliseconds</span> at submission
10 + by #{link_to @best[:runtime][:user], controller:'users', action:'profile', id:@best[:memory][:user_id]}
11 + using <span class="hof_language">#{@best[:runtime][:lang]}</span>
12 + with <span class="hof_value">#{@best[:runtime][:value] * 1000} milliseconds</span>
13 + at submission
11 = link_to("#" + @best[:runtime][:sub_id].to_s, controller: 'graders', action: 'submission', id:@best[:runtime][:sub_id])
14 = link_to("#" + @best[:runtime][:sub_id].to_s, controller: 'graders', action: 'submission', id:@best[:runtime][:sub_id])
12 %br/
15 %br/
13
16
14 %b Best Memory Usage:
17 %b Best Memory Usage:
15 - by <span class="hof_user">#{@best[:memory][:user]}</span> using <span class="hof_language">#{@best[:memory][:lang]}</span> with <span class="hof_value">#{@best[:memory][:value]} kbytes </span> at submission
18 + by #{link_to @best[:memory][:user], controller:'users', action:'profile', id:@best[:memory][:user_id]}
19 + using <span class="hof_language">#{@best[:memory][:lang]}</span>
20 + with <span class="hof_value">#{@best[:memory][:value]} kbytes </span>
21 + at submission
16 = link_to("#" + @best[:memory][:sub_id].to_s, controller: 'graders' , action: 'submission', id:@best[:memory][:sub_id])
22 = link_to("#" + @best[:memory][:sub_id].to_s, controller: 'graders' , action: 'submission', id:@best[:memory][:sub_id])
17 %br/
23 %br/
18
24
19 %b Shortest Code:
25 %b Shortest Code:
20 - by <span class="hof_user">#{@best[:length][:user]}</span> using <span class="hof_language">#{@best[:length][:lang]}</span> with <span class="hof_value">#{@best[:length][:value]} bytes</span> at submission
26 + by #{link_to @best[:length][:user], controller:'users', action:'profile', id:@best[:length][:user_id]}
27 + using <span class="hof_language">#{@best[:length][:lang]}</span>
28 + with <span class="hof_value">#{@best[:length][:value]} bytes</span>
29 + at submission
21 = link_to("#" + @best[:length][:sub_id].to_s, controller: 'graders' , action: 'submission', id: @best[:length][:sub_id])
30 = link_to("#" + @best[:length][:sub_id].to_s, controller: 'graders' , action: 'submission', id: @best[:length][:sub_id])
22 %br/
31 %br/
23
32
24 %b First solver:
33 %b First solver:
25 - <span class="hof_user">#{@best[:first][:user]}</span> is the first solver using <span class="hof_language">#{@best[:first][:lang]}</span> on <span class="hof_value">#{@best[:first][:value]}</span> at submission
34 + #{link_to @best[:first][:user], controller:'users', action:'profile', id:@best[:first][:user_id]} is the first solver
35 + using <span class="hof_language">#{@best[:first][:lang]}</span>
36 + on <span class="hof_value">#{@best[:first][:value]}</span>
37 + at submission
26 = link_to("#" + @best[:first][:sub_id].to_s, controller: 'graders' , action: 'submission', id: @best[:first][:sub_id])
38 = link_to("#" + @best[:first][:sub_id].to_s, controller: 'graders' , action: 'submission', id: @best[:first][:sub_id])
27 %br/
39 %br/
28
40
29
41
30 %p
42 %p
31 This counts only for submission with 100% score <br/>
43 This counts only for submission with 100% score <br/>
32 Right now, java is excluded from memory usage competition. (Because it always uses 2GB memory...)
44 Right now, java is excluded from memory usage competition. (Because it always uses 2GB memory...)
33
45
34 %h2 By language
46 %h2 By language
35
47
36 %table.info
48 %table.info
37 %thead
49 %thead
38 %tr.info-head
50 %tr.info-head
39 %th Language
51 %th Language
40 %th Best runtime (ms)
52 %th Best runtime (ms)
41 %th Best memory (kbytes)
53 %th Best memory (kbytes)
42 %th Shortest Code (bytes)
54 %th Shortest Code (bytes)
43 %th First solver
55 %th First solver
44 %tbody
56 %tbody
45 - @by_lang.each do |lang,value|
57 - @by_lang.each do |lang,value|
46 %tr{class: cycle('info-even','info-odd')}
58 %tr{class: cycle('info-even','info-odd')}
47 %td= lang
59 %td= lang
48 %td
60 %td
49 - = "#{value[:runtime][:user]} (#{(value[:runtime][:value] * 1000).to_i} @"
61 + = link_to value[:runtime][:user], controller: 'users', action: 'profile', id: value[:runtime][:user_id]
62 + = "(#{(value[:runtime][:value] * 1000).to_i} @"
50 = "#{link_to("#" + value[:runtime][:sub_id].to_s, controller: 'graders' , action: 'submission', id: value[:runtime][:sub_id])} )".html_safe
63 = "#{link_to("#" + value[:runtime][:sub_id].to_s, controller: 'graders' , action: 'submission', id: value[:runtime][:sub_id])} )".html_safe
51 %td
64 %td
52 - = "#{value[:memory][:user]} (#{value[:memory][:value]} @"
65 + = link_to value[:memory][:user], controller: 'users', action: 'profile', id: value[:memory][:user_id]
66 + = "(#{value[:memory][:value]} @"
53 = "#{link_to("#" + value[:memory][:sub_id].to_s, controller: 'graders' , action: 'submission', id: value[:memory][:sub_id])} )".html_safe
67 = "#{link_to("#" + value[:memory][:sub_id].to_s, controller: 'graders' , action: 'submission', id: value[:memory][:sub_id])} )".html_safe
54 %td
68 %td
55 - = "#{value[:length][:user]} (#{value[:length][:value]} @"
69 + = link_to value[:length][:user], controller: 'users', action: 'profile', id: value[:length][:user_id]
70 + = "(#{value[:length][:value]} @"
56 = "#{link_to("#" + value[:length][:sub_id].to_s, controller: 'graders' , action: 'submission', id: value[:length][:sub_id])} )".html_safe
71 = "#{link_to("#" + value[:length][:sub_id].to_s, controller: 'graders' , action: 'submission', id: value[:length][:sub_id])} )".html_safe
57 %td
72 %td
58 - = "#{value[:first][:user]} (#{value[:first][:value]} @"
73 + - if value[:first][:user] != '(NULL)' #TODO: i know... this is wrong...
74 + = link_to value[:first][:user], controller: 'users', action: 'profile', id: value[:first][:user_id]
75 + = "(#{value[:first][:value]} @"
59 = "#{link_to("#" + value[:first][:sub_id].to_s, controller: 'graders' , action: 'submission', id: value[:first][:sub_id])} )".html_safe
76 = "#{link_to("#" + value[:first][:sub_id].to_s, controller: 'graders' , action: 'submission', id: value[:first][:sub_id])} )".html_safe
60
77
61 - else
78 - else
62 %h3 No submissions
79 %h3 No submissions
@@ -16,17 +16,17
16
16
17 %table.tablesorter-cafe#my_table
17 %table.tablesorter-cafe#my_table
18 %thead
18 %thead
19 %tr
19 %tr
20 %th login
20 %th login
21 %th full name
21 %th full name
22 %th login count
22 %th login count
23 %th earliest
23 %th earliest
24 %th latest
24 %th latest
25 %tbody
25 %tbody
26 - @logins.each do |l|
26 - @logins.each do |l|
27 %tr{class: cycle('info-even','info-odd')}
27 %tr{class: cycle('info-even','info-odd')}
28 - %td= l[:login]
28 + %td= link_to l[:login], controller: 'users', action: 'profile', id: l[:id]
29 %td= l[:full_name]
29 %td= l[:full_name]
30 %td= l[:count]
30 %td= l[:count]
31 %td= l[:min] ? l[:min].in_time_zone.strftime('%Y-%m-%d %H:%M') : ''
31 %td= l[:min] ? l[:min].in_time_zone.strftime('%Y-%m-%d %H:%M') : ''
32 %td= l[:max] ? time_ago_in_words(l[:max].in_time_zone) + ' ago' : ''
32 %td= l[:max] ? time_ago_in_words(l[:max].in_time_zone) + ' ago' : ''
@@ -32,23 +32,23
32 %th Logged in
32 %th Logged in
33 %th Contest(s)
33 %th Contest(s)
34 - @problems.each do |p|
34 - @problems.each do |p|
35 %th= p.name
35 %th= p.name
36 %th Total
36 %th Total
37 %th Passed
37 %th Passed
38 %tbody
38 %tbody
39 - @scorearray.each do |sc|
39 - @scorearray.each do |sc|
40 %tr{class: cycle('info-even','info-odd')}
40 %tr{class: cycle('info-even','info-odd')}
41 - total,num_passed = 0,0
41 - total,num_passed = 0,0
42 - sc.each_index do |i|
42 - sc.each_index do |i|
43 - if i == 0
43 - if i == 0
44 - %td= sc[i].login
44 + %td= link_to sc[i].login, controller: 'users', action: 'profile', id: sc[i]
45 %td= sc[i].full_name
45 %td= sc[i].full_name
46 %td= sc[i].activated
46 %td= sc[i].activated
47 %td= sc[i].try(:contest_stat).try(:started_at)!=nil ? 'yes' : 'no'
47 %td= sc[i].try(:contest_stat).try(:started_at)!=nil ? 'yes' : 'no'
48 %td= sc[i].contests.collect {|c| c.name}.join(', ')
48 %td= sc[i].contests.collect {|c| c.name}.join(', ')
49 - else
49 - else
50 %td= sc[i][0]
50 %td= sc[i][0]
51 - total += sc[i][0]
51 - total += sc[i][0]
52 - num_passed += 1 if sc[i][1]
52 - num_passed += 1 if sc[i][1]
53 %td= total
53 %td= total
54 %td= num_passed
54 %td= num_passed
You need to be logged in to leave comments. Login now