Description:
- change user_admin default action from list to index - remove duplicate button in grader control
Commit status:
[Not Reviewed]
References:
Comments:
0 Commit comments 0 Inline Comments
Unresolved TODOs:
There are no unresolved TODOs
Add another comment

r588:8bdb0ec71018 - - 4 files changed: 21 inserted, 23 deleted

@@ -1,122 +1,123
1 1 class GradersController < ApplicationController
2 2
3 3 before_filter :admin_authorization, except: [ :submission ]
4 4 before_filter(only: [:submission]) {
5 5 return false unless authenticate
6 6
7 7 if GraderConfiguration["right.user_view_submission"]
8 8 return true;
9 9 end
10 10
11 11 admin_authorization
12 12 }
13 13
14 14 verify :method => :post, :only => ['clear_all',
15 15 'start_exam',
16 16 'start_grading',
17 17 'stop_all',
18 18 'clear_terminated'],
19 19 :redirect_to => {:action => 'index'}
20 20
21 21 def index
22 22 redirect_to :action => 'list'
23 23 end
24 24
25 25 def list
26 26 @grader_processes = GraderProcess.find_running_graders
27 27 @stalled_processes = GraderProcess.find_stalled_process
28 28
29 29 @terminated_processes = GraderProcess.find_terminated_graders
30 30
31 31 @last_task = Task.find(:first,
32 32 :order => 'created_at DESC')
33 33 @last_test_request = TestRequest.find(:first,
34 34 :order => 'created_at DESC')
35 35 @submission = Submission.order("id desc").limit(20)
36 + @backlog_submission = Submission.where('graded_at is null')
36 37 end
37 38
38 39 def clear
39 40 grader_proc = GraderProcess.find(params[:id])
40 41 grader_proc.destroy if grader_proc!=nil
41 42 redirect_to :action => 'list'
42 43 end
43 44
44 45 def clear_terminated
45 46 GraderProcess.find_terminated_graders.each do |p|
46 47 p.destroy
47 48 end
48 49 redirect_to :action => 'list'
49 50 end
50 51
51 52 def clear_all
52 53 GraderProcess.find(:all).each do |p|
53 54 p.destroy
54 55 end
55 56 redirect_to :action => 'list'
56 57 end
57 58
58 59 def view
59 60 if params[:type]=='Task'
60 61 redirect_to :action => 'task', :id => params[:id]
61 62 else
62 63 redirect_to :action => 'test_request', :id => params[:id]
63 64 end
64 65 end
65 66
66 67 def test_request
67 68 @test_request = TestRequest.find(params[:id])
68 69 end
69 70
70 71 def task
71 72 @task = Task.find(params[:id])
72 73 end
73 74
74 75 def submission
75 76 @submission = Submission.find(params[:id])
76 77 formatter = Rouge::Formatters::HTML.new(css_class: 'highlight', line_numbers: true )
77 78 lexer = case @submission.language.name
78 79 when "c" then Rouge::Lexers::C.new
79 80 when "cpp" then Rouge::Lexers::Cpp.new
80 81 when "pas" then Rouge::Lexers::Pas.new
81 82 when "ruby" then Rouge::Lexers::Ruby.new
82 83 when "python" then Rouge::Lexers::Python.new
83 84 when "java" then Rouge::Lexers::Java.new
84 85 when "php" then Rouge::Lexers::PHP.new
85 86 end
86 87 @formatted_code = formatter.format(lexer.lex(@submission.source))
87 88 @css_style = Rouge::Themes::ThankfulEyes.render(scope: '.highlight')
88 89
89 90 user = User.find(session[:user_id])
90 91 SubmissionViewLog.create(user_id: session[:user_id],submission_id: @submission.id) unless user.admin?
91 92
92 93 end
93 94
94 95 # various grader controls
95 96
96 97 def stop
97 98 grader_proc = GraderProcess.find(params[:id])
98 99 GraderScript.stop_grader(grader_proc.pid)
99 100 flash[:notice] = 'Grader stopped. It may not disappear now, but it should disappear shortly.'
100 101 redirect_to :action => 'list'
101 102 end
102 103
103 104 def stop_all
104 105 GraderScript.stop_graders(GraderProcess.find_running_graders +
105 106 GraderProcess.find_stalled_process)
106 107 flash[:notice] = 'Graders stopped. They may not disappear now, but they should disappear shortly.'
107 108 redirect_to :action => 'list'
108 109 end
109 110
110 111 def start_grading
111 112 GraderScript.start_grader('grading')
112 113 flash[:notice] = '2 graders in grading env started, one for grading queue tasks, another for grading test request'
113 114 redirect_to :action => 'list'
114 115 end
115 116
116 117 def start_exam
117 118 GraderScript.start_grader('exam')
118 119 flash[:notice] = '2 graders in grading env started, one for grading queue tasks, another for grading test request'
119 120 redirect_to :action => 'list'
120 121 end
121 122
122 123 end
@@ -1,119 +1,114
1 1 require 'csv'
2 2
3 3 class UserAdminController < ApplicationController
4 4
5 5 include MailHelperMethods
6 6
7 7 before_filter :admin_authorization
8 8
9 9 # GETs should be safe (see http://www.w3.org/2001/tag/doc/whenToUseGet.html)
10 10 verify :method => :post, :only => [ :destroy,
11 11 :create, :create_from_list,
12 12 :update,
13 13 :manage_contest,
14 14 :bulk_mail
15 15 ],
16 16 :redirect_to => { :action => :list }
17 17
18 18 def index
19 - list
20 - render :action => 'list'
21 - end
22 -
23 - def list
24 19 @user_count = User.count
25 20 if params[:page] == 'all'
26 21 @users = User.all
27 22 @paginated = false
28 23 else
29 24 @users = User.paginate :page => params[:page]
30 25 @paginated = true
31 26 end
32 27 @hidden_columns = ['hashed_password', 'salt', 'created_at', 'updated_at']
33 28 @contests = Contest.enabled
34 29 end
35 30
36 31 def active
37 32 sessions = ActiveRecord::SessionStore::Session.find(:all, :conditions => ["updated_at >= ?", 60.minutes.ago])
38 33 @users = []
39 34 sessions.each do |session|
40 35 if session.data[:user_id]
41 36 @users << User.find(session.data[:user_id])
42 37 end
43 38 end
44 39 end
45 40
46 41 def show
47 42 @user = User.find(params[:id])
48 43 end
49 44
50 45 def new
51 46 @user = User.new
52 47 end
53 48
54 49 def create
55 50 @user = User.new(params[:user])
56 51 @user.activated = true
57 52 if @user.save
58 53 flash[:notice] = 'User was successfully created.'
59 54 redirect_to :action => 'index'
60 55 else
61 56 render :action => 'new'
62 57 end
63 58 end
64 59
65 60 def clear_last_ip
66 61 @user = User.find(params[:id])
67 62 @user.last_ip = nil
68 63 @user.save
69 64 redirect_to action: 'index', page: params[:page]
70 65 end
71 66
72 67 def create_from_list
73 68 lines = params[:user_list]
74 69
75 70 note = []
76 71
77 72 lines.split("\n").each do |line|
78 73 items = line.chomp.split(',')
79 74 if items.length>=2
80 75 login = items[0]
81 76 full_name = items[1]
82 77
83 78 added_random_password = false
84 79 if items.length>=3
85 80 password = items[2].chomp(" ")
86 81 user_alias = (items.length>=4) ? items[3] : login
87 82 else
88 83 password = random_password
89 84 user_alias = (items.length>=4) ? items[3] : login
90 85 added_random_password = true
91 86 end
92 87
93 88 user = User.find_by_login(login)
94 89 if (user)
95 90 user.full_name = full_name
96 91 user.password = password
97 92 else
98 93 user = User.new({:login => login,
99 94 :full_name => full_name,
100 95 :password => password,
101 96 :password_confirmation => password,
102 97 :alias => user_alias})
103 98 end
104 99 user.activated = true
105 100 user.save
106 101
107 102 if added_random_password
108 103 note << "'#{login}' (+)"
109 104 else
110 105 note << login
111 106 end
112 107 end
113 108 end
114 109 flash[:notice] = 'User(s) ' + note.join(', ') +
115 110 ' were successfully created. ' +
116 111 '( (+) - created with random passwords.)'
117 112 redirect_to :action => 'index'
118 113 end
119 114
@@ -1,99 +1,100
1 1 # Methods added to this helper will be available to all templates in the application.
2 2 module ApplicationHelper
3 3
4 + #new bootstrap header
4 5 def navbar_user_header
5 6 left_menu = ''
6 7 right_menu = ''
7 8 user = User.find(session[:user_id])
8 9
9 10 if (user!=nil) and (GraderConfiguration.show_tasks_to?(user))
10 11 left_menu << add_menu("#{I18n.t 'menu.tasks'}", 'tasks', 'list')
11 12 left_menu << add_menu("#{I18n.t 'menu.submissions'}", 'main', 'submission')
12 13 left_menu << add_menu("#{I18n.t 'menu.test'}", 'test', 'index')
13 14 end
14 15
15 16 if GraderConfiguration['right.user_hall_of_fame']
16 17 left_menu << add_menu("#{I18n.t 'menu.hall_of_fame'}", 'report', 'problem_hof')
17 18 end
18 19
19 20 right_menu << add_menu("#{content_tag(:span,'',class: 'glyphicon glyphicon-question-sign')}".html_safe, 'main', 'help')
20 21 right_menu << add_menu("#{content_tag(:span,'',class: 'glyphicon glyphicon-comment')}".html_safe, 'messages', 'list', {title: I18n.t('menu.messages'), data: {toggle: 'tooltip'}})
21 22 if GraderConfiguration['system.user_setting_enabled']
22 23 right_menu << add_menu("#{content_tag(:span,'',class: 'glyphicon glyphicon-cog')}".html_safe, 'users', 'index', {title: I18n.t('menu.settings'), data: {toggle: 'tooltip'}})
23 24 end
24 25 right_menu << add_menu("#{content_tag(:span,'',class: 'glyphicon glyphicon-log-out')} #{user.full_name}".html_safe, 'main', 'login', {title: I18n.t('menu.log_out'), data: {toggle: 'tooltip'}})
25 26
26 27
27 28 result = content_tag(:ul,left_menu.html_safe,class: 'nav navbar-nav') + content_tag(:ul,right_menu.html_safe,class: 'nav navbar-nav navbar-right')
28 29 end
29 30
30 31 def add_menu(title, controller, action,html_option = {})
31 32 link_option = {controller: controller, action: action}
32 33 html_option[:class] = (html_option[:class] || '') + " active" if current_page?(link_option)
33 34 content_tag(:li, link_to(title,link_option),html_option)
34 35 end
35 36
36 37 def user_header
37 38 menu_items = ''
38 39 user = User.find(session[:user_id])
39 40
40 41 if (user!=nil) and (session[:admin])
41 42 # admin menu
42 43 menu_items << "<b>Administrative task:</b> "
43 44 append_to menu_items, '[Announcements]', 'announcements', 'index'
44 45 append_to menu_items, '[Msg console]', 'messages', 'console'
45 46 append_to menu_items, '[Problems]', 'problems', 'index'
46 47 append_to menu_items, '[Users]', 'user_admin', 'index'
47 48 append_to menu_items, '[Results]', 'user_admin', 'user_stat'
48 49 append_to menu_items, '[Report]', 'report', 'multiple_login'
49 50 append_to menu_items, '[Graders]', 'graders', 'list'
50 51 append_to menu_items, '[Contests]', 'contest_management', 'index'
51 52 append_to menu_items, '[Sites]', 'sites', 'index'
52 53 append_to menu_items, '[System config]', 'configurations', 'index'
53 54 menu_items << "<br/>"
54 55 end
55 56
56 57 # main page
57 58 append_to menu_items, "[#{I18n.t 'menu.main'}]", 'main', 'list'
58 59 append_to menu_items, "[#{I18n.t 'menu.messages'}]", 'messages', 'list'
59 60
60 61 if (user!=nil) and (GraderConfiguration.show_tasks_to?(user))
61 62 append_to menu_items, "[#{I18n.t 'menu.tasks'}]", 'tasks', 'list'
62 63 append_to menu_items, "[#{I18n.t 'menu.submissions'}]", 'main', 'submission'
63 64 append_to menu_items, "[#{I18n.t 'menu.test'}]", 'test', 'index'
64 65 end
65 66
66 67 if GraderConfiguration['right.user_hall_of_fame']
67 68 append_to menu_items, "[#{I18n.t 'menu.hall_of_fame'}]", 'report', 'problem_hof'
68 69 end
69 70 append_to menu_items, "[#{I18n.t 'menu.help'}]", 'main', 'help'
70 71
71 72 if GraderConfiguration['system.user_setting_enabled']
72 73 append_to menu_items, "[#{I18n.t 'menu.settings'}]", 'users', 'index'
73 74 end
74 75 append_to menu_items, "[#{I18n.t 'menu.log_out'}]", 'main', 'login'
75 76
76 77 menu_items.html_safe
77 78 end
78 79
79 80 def append_to(option,label, controller, action)
80 81 option << ' ' if option!=''
81 82 option << link_to_unless_current(label,
82 83 :controller => controller,
83 84 :action => action)
84 85 end
85 86
86 87 def format_short_time(time)
87 88 now = Time.now.gmtime
88 89 st = ''
89 90 if (time.yday != now.yday) or
90 91 (time.year != now.year)
91 92 st = time.strftime("%x ")
92 93 end
93 94 st + time.strftime("%X")
94 95 end
95 96
96 97 def format_short_duration(duration)
97 98 return '' if duration==nil
98 99 d = duration.to_f
99 100 return Time.at(d).gmtime.strftime("%X")
@@ -1,81 +1,82
1 1 - content_for :head do
2 2 <meta http-equiv ="refresh" content="60"/>
3 3
4 4 %h1 Grader information
5 5
6 6 %p
7 7 = link_to 'Refresh', { :action => 'list' }, class: 'btn btn-info'
8 8
9 9 .panel.panel-primary
10 10 .panel-heading
11 11 Grader control:
12 12 .panel-body
13 13 =link_to 'Start Graders in grading env', { action: 'start_grading'}, class: 'btn btn-default', method: 'post'
14 14 =link_to 'Start Graders in exam env', { action: 'start_exam'}, class: 'btn btn-default', method: 'post'
15 15 =link_to 'Stop all running Graders', { action: 'stop_all'}, class: 'btn btn-default', method: 'post'
16 16 =link_to 'Clear all data', { action: 'clear_all'}, class: 'btn btn-default', method: 'post'
17 17
18 - .submitbox
19 - .item
20 - Grader control:
21 - .item
22 - = form_for :clear, :url => {:action => 'start_grading'} do |f|
23 - = submit_tag 'Start graders in grading env'
24 - .item
25 - = form_for :clear, :url => {:action => 'start_exam'} do |f|
26 - = submit_tag 'Start graders in exam env'
27 - .item
28 - = form_for :clear, :url => {:action => 'stop_all'} do |f|
29 - = submit_tag 'Stop all running graders'
30 - .item
31 - = form_for :clear, :url => {:action => 'clear_all'} do |f|
32 - = submit_tag 'Clear all data'
33 - %br{:style => 'clear:both'}/
34 -
35 18 .row
36 19 .col-md-6
37 20 - if @last_task
38 21 Last task:
39 22 = link_to "#{@last_task.id}", :action => 'view', :id => @last_task.id, :type => 'Task'
40 23
41 24 %br/
42 25
43 26 - if @last_test_request
44 27 Last test_request:
45 28 = link_to "#{@last_test_request.id}", :action => 'view', :id => @last_test_request.id, :type => 'TestRequest'
46 29
47 30 %h2 Current graders
48 31
49 32 = render :partial => 'grader_list', :locals => {:grader_list => @grader_processes}
50 33
51 34 %h2 Stalled graders
52 35
53 36 = render :partial => 'grader_list', :locals => {:grader_list => @stalled_processes}
54 37
55 38 %h2 Terminated graders
56 39
57 40 %p= link_to 'Clear data for terminated graders', { action: 'clear_terminated'}, class: 'btn btn-default', method: 'post'
58 41
59 42 = render :partial => 'grader_list', :locals => {:grader_list => @terminated_processes}
60 43 .col-md-6
61 44 %h2 Last 20 submissions
62 45 %table.table.table-striped.table-condensed
63 46 %thead
64 47 %th ID
65 48 %th User
66 49 %th Problem
67 50 %th Submitted
68 51 %th Graded
69 52 %th Result
70 - %th
71 53 %tbody
72 54 - @submission.each do |sub|
73 55 %tr.inactive
74 56 %td= link_to sub.id, controller: 'graders' ,action: 'submission', id: sub.id
75 57 %td= sub.try(:user).try(:full_name)
76 58 %td= sub.try(:problem).try(:full_name)
77 59 %td= "#{time_ago_in_words(sub.submitted_at)} ago"
78 60 %td= sub.graded_at ? "#{time_ago_in_words(sub.graded_at)} ago" : " "
79 61 %td= sub.grader_comment
62 + %h2 Ungraded submission
63 + %table.table.table-striped.table-condensed
64 + %thead
65 + %th ID
66 + %th User
67 + %th Problem
68 + %th Submitted
69 + %th Graded
70 + %th Result
71 + %tbody
72 + - @backlog_submission.each do |sub|
73 + %tr.inactive
74 + %td= link_to sub.id, controller: 'graders' ,action: 'submission', id: sub.id
75 + %td= sub.try(:user).try(:full_name)
76 + %td= sub.try(:problem).try(:full_name)
77 + %td= "#{time_ago_in_words(sub.submitted_at)} ago"
78 + %td= sub.graded_at ? "#{time_ago_in_words(sub.graded_at)} ago" : " "
79 + %td= sub.grader_comment
80 80
81 81
82 +
You need to be logged in to leave comments. Login now