Description:
merge with algo-bm
Commit status:
[Not Reviewed]
References:
merge default
Comments:
0 Commit comments 0 Inline Comments
Unresolved TODOs:
There are no unresolved TODOs
Add another comment

r787:6a311ff47066 - - 13 files changed: 81 inserted, 75 deleted

@@ -4,13 +4,13
4 protect_from_forgery
4 protect_from_forgery
5
5
6 before_action :current_user
6 before_action :current_user
7
7
8 SINGLE_USER_MODE_CONF_KEY = 'system.single_user_mode'
8 SINGLE_USER_MODE_CONF_KEY = 'system.single_user_mode'
9 MULTIPLE_IP_LOGIN_CONF_KEY = 'right.multiple_ip_login'
9 MULTIPLE_IP_LOGIN_CONF_KEY = 'right.multiple_ip_login'
10 - ALLOW_WHITELIST_IP_ONLY_CONF_KEY = 'right.allow_whitelist_ip_only'
10 + WHITELIST_IGNORE_CONF_KEY = 'right.whitelist_ignore'
11 WHITELIST_IP_CONF_KEY = 'right.whitelist_ip'
11 WHITELIST_IP_CONF_KEY = 'right.whitelist_ip'
12
12
13 #report and redirect for unauthorized activities
13 #report and redirect for unauthorized activities
14 def unauthorized_redirect(notice = 'You are not authorized to view the page you requested')
14 def unauthorized_redirect(notice = 'You are not authorized to view the page you requested')
15 flash[:notice] = notice
15 flash[:notice] = notice
16 redirect_to login_main_path
16 redirect_to login_main_path
@@ -78,15 +78,15
78 unless @current_user.enabled? || @current_user.admin?
78 unless @current_user.enabled? || @current_user.admin?
79 unauthorized_redirect 'Your account is disabled'
79 unauthorized_redirect 'Your account is disabled'
80 return false
80 return false
81 end
81 end
82
82
83 # check if user ip is allowed
83 # check if user ip is allowed
84 - unless @current_user.admin? || !GraderConfiguration[ALLOW_WHITELIST_IP_ONLY_CONF_KEY]
84 + unless @current_user.admin? || GraderConfiguration[WHITELIST_IGNORE_CONF_KEY]
85 unless is_request_ip_allowed?
85 unless is_request_ip_allowed?
86 - unauthorized_redirect 'Your IP is not allowed'
86 + unauthorized_redirect 'Your IP is not allowed to login at this time.'
87 return false
87 return false
88 end
88 end
89 end
89 end
90
90
91 if GraderConfiguration.multicontests?
91 if GraderConfiguration.multicontests?
92 return true if @current_user.admin?
92 return true if @current_user.admin?
@@ -105,16 +105,14
105 #if the user use different ip from the previous connection
105 #if the user use different ip from the previous connection
106 # only applicable when MULTIPLE_IP_LOGIN options is false only
106 # only applicable when MULTIPLE_IP_LOGIN options is false only
107 def authenticate_by_ip_address
107 def authenticate_by_ip_address
108 #this assume that we have already authenticate normally
108 #this assume that we have already authenticate normally
109 unless GraderConfiguration[MULTIPLE_IP_LOGIN_CONF_KEY]
109 unless GraderConfiguration[MULTIPLE_IP_LOGIN_CONF_KEY]
110 user = User.find(session[:user_id])
110 user = User.find(session[:user_id])
111 - puts "User admin #{user.admin?}"
112 if (!user.admin? && user.last_ip && user.last_ip != request.remote_ip)
111 if (!user.admin? && user.last_ip && user.last_ip != request.remote_ip)
113 flash[:notice] = "You cannot use the system from #{request.remote_ip}. Your last ip is #{user.last_ip}"
112 flash[:notice] = "You cannot use the system from #{request.remote_ip}. Your last ip is #{user.last_ip}"
114 - puts "hahaha"
115 redirect_to :controller => 'main', :action => 'login'
113 redirect_to :controller => 'main', :action => 'login'
116 return false
114 return false
117 end
115 end
118 unless user.last_ip
116 unless user.last_ip
119 user.last_ip = request.remote_ip
117 user.last_ip = request.remote_ip
120 user.save
118 user.save
@@ -149,19 +147,21
149 return false
147 return false
150 end
148 end
151 return true
149 return true
152 end
150 end
153
151
154 def is_request_ip_allowed?
152 def is_request_ip_allowed?
155 - if GraderConfiguration[ALLOW_WHITELIST_IP_ONLY_CONF_KEY]
153 + unless GraderConfiguration[WHITELIST_IGNORE_CONF_KEY]
156 user_ip = IPAddr.new(request.remote_ip)
154 user_ip = IPAddr.new(request.remote_ip)
157 - GraderConfiguration[WHITELIST_IP_LIST_CONF_KEY].delete(' ').split(',').each do |ips|
155 +
156 + GraderConfiguration[WHITELIST_IP_CONF_KEY].delete(' ').split(',').each do |ips|
158 allow_ips = IPAddr.new(ips)
157 allow_ips = IPAddr.new(ips)
159 - unless allow_ips.includes(user_ip)
158 + if allow_ips.include?(user_ip)
160 - return false
159 + return true
161 end
160 end
162 end
161 end
162 + return false
163 end
163 end
164 return true
164 return true
165 end
165 end
166
166
167 end
167 end
@@ -18,12 +18,13
18 #reset login, clear session
18 #reset login, clear session
19 #front page
19 #front page
20 def login
20 def login
21 saved_notice = flash[:notice]
21 saved_notice = flash[:notice]
22 reset_session
22 reset_session
23 flash.now[:notice] = saved_notice
23 flash.now[:notice] = saved_notice
24 + @remote_ip = request.remote_ip
24
25
25 # EXPERIMENT:
26 # EXPERIMENT:
26 # Hide login if in single user mode and the url does not
27 # Hide login if in single user mode and the url does not
27 # explicitly specify /login
28 # explicitly specify /login
28 #
29 #
29 # logger.info "PATH: #{request.path}"
30 # logger.info "PATH: #{request.path}"
@@ -462,12 +462,13
462
462
463 end
463 end
464
464
465 protected
465 protected
466
466
467 def calculate_max_score(problems, users,since_id,until_id, get_last_score = false)
467 def calculate_max_score(problems, users,since_id,until_id, get_last_score = false)
468 + #scorearray[i] = user #i's user stat where i is the index (not id)
468 scorearray = Array.new
469 scorearray = Array.new
469 users.each do |u|
470 users.each do |u|
470 ustat = Array.new
471 ustat = Array.new
471 ustat[0] = u
472 ustat[0] = u
472 problems.each do |p|
473 problems.each do |p|
473 unless get_last_score
474 unless get_last_score
@@ -72,15 +72,12
72 end
72 end
73
73
74
74
75 def get_latest_submission_status
75 def get_latest_submission_status
76 @problem = Problem.find(params[:pid])
76 @problem = Problem.find(params[:pid])
77 @submission = Submission.find_last_by_user_and_problem(params[:uid],params[:pid])
77 @submission = Submission.find_last_by_user_and_problem(params[:uid],params[:pid])
78 - puts User.find(params[:uid]).login
79 - puts Problem.find(params[:pid]).name
80 - puts 'nil' unless @submission
81 respond_to do |format|
78 respond_to do |format|
82 format.js
79 format.js
83 end
80 end
84 end
81 end
85
82
86 # GET /submissions/:id/rejudge
83 # GET /submissions/:id/rejudge
@@ -58,12 +58,13
58
58
59 def create_from_list
59 def create_from_list
60 lines = params[:user_list]
60 lines = params[:user_list]
61
61
62 note = []
62 note = []
63 error_note = []
63 error_note = []
64 + error_msg = nil
64 ok_user = []
65 ok_user = []
65
66
66 lines.split("\n").each do |line|
67 lines.split("\n").each do |line|
67 items = line.chomp.split(',')
68 items = line.chomp.split(',')
68 if items.length>=2
69 if items.length>=2
69 login = items[0]
70 login = items[0]
@@ -73,13 +74,13
73
74
74 added_random_password = false
75 added_random_password = false
75 if items.length >= 3 and items[2].chomp(" ").length > 0;
76 if items.length >= 3 and items[2].chomp(" ").length > 0;
76 password = items[2].chomp(" ")
77 password = items[2].chomp(" ")
77 else
78 else
78 password = random_password
79 password = random_password
79 - add_random_password=true;
80 + added_random_password=true;
80 end
81 end
81
82
82 if items.length>= 4 and items[3].chomp(" ").length > 0;
83 if items.length>= 4 and items[3].chomp(" ").length > 0;
83 user_alias = items[3].chomp(" ")
84 user_alias = items[3].chomp(" ")
84 else
85 else
85 user_alias = login
86 user_alias = login
@@ -93,29 +94,30
93 if (user)
94 if (user)
94 user.full_name = full_name
95 user.full_name = full_name
95 user.password = password
96 user.password = password
96 user.remark = remark
97 user.remark = remark
97 else
98 else
98 user = User.new({:login => login,
99 user = User.new({:login => login,
99 - :full_name => full_name,
100 + :full_name => full_name,
100 - :password => password,
101 + :password => password,
101 - :password_confirmation => password,
102 + :password_confirmation => password,
102 - :alias => user_alias,
103 + :alias => user_alias,
103 - :remark => remark})
104 + :remark => remark})
104 end
105 end
105 user.activated = true
106 user.activated = true
106
107
107 if user.save
108 if user.save
108 if added_random_password
109 if added_random_password
109 note << "'#{login}' (+)"
110 note << "'#{login}' (+)"
110 else
111 else
111 note << login
112 note << login
112 end
113 end
113 ok_user << user
114 ok_user << user
114 else
115 else
115 - error_note << "#{login}"
116 + error_note << "'#{login}'"
117 + error_msg = user.errors.full_messages.to_sentence unless error_msg
116 end
118 end
117
119
118 end
120 end
119 end
121 end
120
122
121 #add to group
123 #add to group
@@ -124,17 +126,19
124 if group
126 if group
125 group.users << ok_user
127 group.users << ok_user
126 end
128 end
127 end
129 end
128
130
129 # show flash
131 # show flash
130 - flash[:success] = 'User(s) ' + note.join(', ') +
132 + if note.size > 0
131 - ' were successfully created. ' +
133 + flash[:success] = 'User(s) ' + note.join(', ') +
132 - '( (+) - created with random passwords.)'
134 + ' were successfully created. ' +
135 + '( (+) - created with random passwords.)'
136 + end
133 if error_note.size > 0
137 if error_note.size > 0
134 - flash[:error] = "Following user(s) failed to be created: " + error_note.join(', ')
138 + flash[:error] = "Following user(s) failed to be created: " + error_note.join(', ') + ". The error of the first failed one are: " + error_msg;
135 end
139 end
136 redirect_to :action => 'index'
140 redirect_to :action => 'index'
137 end
141 end
138
142
139 def edit
143 def edit
140 @user = User.find(params[:id])
144 @user = User.find(params[:id])
@@ -18,17 +18,19
18 .panel-title Users in this group
18 .panel-title Users in this group
19 .panel-body
19 .panel-body
20 %ul
20 %ul
21 %li
21 %li
22 If you want to add several users to a group, it may be easier to just re-import those users in
22 If you want to add several users to a group, it may be easier to just re-import those users in
23 = link_to 'New list of users', new_list_user_admin_index_path
23 = link_to 'New list of users', new_list_user_admin_index_path
24 - page
24 + page. You can also use
25 + = link_to 'Bulk Manage User', bulk_manage_user_admin_index_path
26 + page.
25 =form_tag add_user_group_path(@group), class: 'form-inline' do
27 =form_tag add_user_group_path(@group), class: 'form-inline' do
26 .form-group
28 .form-group
27 =label_tag :user_id, "User"
29 =label_tag :user_id, "User"
28 - =select_tag :user_id, options_from_collection_for_select(User.all,'id','full_name'), class: 'select2'
30 + =select_tag :user_id, options_from_collection_for_select(User.all,'id','full_name'), class: 'select2', style: 'width: 10em';
29 =submit_tag "Add",class: 'btn btn-primary'
31 =submit_tag "Add",class: 'btn btn-primary'
30
32
31
33
32 %table.table.table-hover
34 %table.table.table-hover
33 %thead
35 %thead
34 %tr
36 %tr
@@ -49,18 +51,18
49 .panel-heading
51 .panel-heading
50 .panel-title Problems
52 .panel-title Problems
51 .panel-body
53 .panel-body
52 %ul
54 %ul
53 %li
55 %li
54 If you want to add several problem to a group, it may be easier to bulk manage them in the
56 If you want to add several problem to a group, it may be easier to bulk manage them in the
55 - = link_to 'Bulk Manage', manage_problems_path
57 + = link_to 'Bulk Manage Problems', manage_problems_path
56 page
58 page
57 =form_tag add_problem_group_path(@group), class: 'form-inline' do
59 =form_tag add_problem_group_path(@group), class: 'form-inline' do
58 .form-group
60 .form-group
59 =label_tag :problem_id, "Problem"
61 =label_tag :problem_id, "Problem"
60 - =select_tag :problem_id, options_from_collection_for_select(Problem.all,'id','full_name'), class: 'select2'
62 + =select_tag :problem_id, options_from_collection_for_select(Problem.all,'id','full_name'), class: 'select2', style: 'width: 10em';
61 =submit_tag "Add",class: 'btn btn-primary'
63 =submit_tag "Add",class: 'btn btn-primary'
62
64
63
65
64 %table.table.table-hover
66 %table.table.table-hover
65 %thead
67 %thead
66 %tr
68 %tr
@@ -6,6 +6,7
6 .announcementbox{:style => 'margin-top: 0px'}
6 .announcementbox{:style => 'margin-top: 0px'}
7 %span{:class => 'title'}
7 %span{:class => 'title'}
8 Announcements
8 Announcements
9 = render :partial => 'announcement', :collection => @announcements
9 = render :partial => 'announcement', :collection => @announcements
10 .col-md-4{style: "padding-left: 20px;"}
10 .col-md-4{style: "padding-left: 20px;"}
11 = render :partial => 'login_box'
11 = render :partial => 'login_box'
12 + = "current ip is #{@remote_ip}"
@@ -9,15 +9,15
9 %th Remark
9 %th Remark
10 - @problems.each do |p|
10 - @problems.each do |p|
11 %th.text-right= p.name.gsub('_',' ')
11 %th.text-right= p.name.gsub('_',' ')
12 %th.text-right Total
12 %th.text-right Total
13 %th.text-right Passed
13 %th.text-right Passed
14 %tbody
14 %tbody
15 - - sum = Array.new(@scorearray[0].count,0)
15 + - sum = Array.new(@problems.count+1,0)
16 - - nonzero = Array.new(@scorearray[0].count,0)
16 + - nonzero = Array.new(@problems.count+1,0)
17 - - full = Array.new(@scorearray[0].count,0)
17 + - full = Array.new(@problems.count+1,0)
18 - @scorearray.each do |sc|
18 - @scorearray.each do |sc|
19 %tr
19 %tr
20 - total,num_passed = 0,0
20 - total,num_passed = 0,0
21 - sc.each_index do |i|
21 - sc.each_index do |i|
22 - if i == 0
22 - if i == 0
23 %td= link_to sc[i].login, stat_user_path(sc[i])
23 %td= link_to sc[i].login, stat_user_path(sc[i])
@@ -1,11 +1,11
1 .container-fluid
1 .container-fluid
2 %h1 Current Score
2 %h1 Current Score
3 = form_tag current_score_report_path, method: 'get' do
3 = form_tag current_score_report_path, method: 'get' do
4 Show only users from this group
4 Show only users from this group
5 - = select_tag "group_id", options_from_collection_for_select( Group.all, 'id','name',params[:group_name]), id: 'group_name',class: 'select2'
5 + = select_tag "group_id", options_from_collection_for_select( Group.all, 'id','name',params[:group_id]), id: 'group_name',class: 'select2', style: 'width: 20em';
6 = submit_tag 'Apply',class: 'btn btn-default'
6 = submit_tag 'Apply',class: 'btn btn-default'
7
7
8 %br
8 %br
9
9
10
10
11 = render "score_table"
11 = render "score_table"
@@ -144,13 +144,12
144 get 'login'
144 get 'login'
145 get 'multiple_login'
145 get 'multiple_login'
146 get 'problem_hof(/:id)', action: 'problem_hof', as: 'problem_hof'
146 get 'problem_hof(/:id)', action: 'problem_hof', as: 'problem_hof'
147 get 'current_score(/:group_id)', action: 'current_score', as: 'current_score'
147 get 'current_score(/:group_id)', action: 'current_score', as: 'current_score'
148 get 'max_score'
148 get 'max_score'
149 post 'show_max_score'
149 post 'show_max_score'
150 - get 'problem_hof(/:id)', action: 'problem_hof', as: 'problem_hof'
151 get 'stuck'
150 get 'stuck'
152 get 'cheat_report'
151 get 'cheat_report'
153 post 'cheat_report'
152 post 'cheat_report'
154 get 'cheat_scruntinize'
153 get 'cheat_scruntinize'
155 post 'cheat_scruntinize'
154 post 'cheat_scruntinize'
156 end
155 end
@@ -9,128 +9,128
9 # you'll amass, the slower it'll run and the greater likelihood for issues).
9 # you'll amass, the slower it'll run and the greater likelihood for issues).
10 #
10 #
11 # It's strongly recommended that you check this file into your version control system.
11 # It's strongly recommended that you check this file into your version control system.
12
12
13 ActiveRecord::Schema.define(version: 2018_06_12_102327) do
13 ActiveRecord::Schema.define(version: 2018_06_12_102327) do
14
14
15 - create_table "announcements", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t|
15 + create_table "announcements", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1", force: :cascade do |t|
16 t.string "author"
16 t.string "author"
17 t.text "body"
17 t.text "body"
18 t.boolean "published"
18 t.boolean "published"
19 t.datetime "created_at"
19 t.datetime "created_at"
20 t.datetime "updated_at"
20 t.datetime "updated_at"
21 t.boolean "frontpage", default: false
21 t.boolean "frontpage", default: false
22 t.boolean "contest_only", default: false
22 t.boolean "contest_only", default: false
23 t.string "title"
23 t.string "title"
24 t.string "notes"
24 t.string "notes"
25 end
25 end
26
26
27 - create_table "contests", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t|
27 + create_table "contests", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1", force: :cascade do |t|
28 t.string "title"
28 t.string "title"
29 t.boolean "enabled"
29 t.boolean "enabled"
30 t.datetime "created_at"
30 t.datetime "created_at"
31 t.datetime "updated_at"
31 t.datetime "updated_at"
32 t.string "name"
32 t.string "name"
33 end
33 end
34
34
35 - create_table "contests_problems", id: false, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t|
35 + create_table "contests_problems", id: false, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1", force: :cascade do |t|
36 t.integer "contest_id"
36 t.integer "contest_id"
37 t.integer "problem_id"
37 t.integer "problem_id"
38 end
38 end
39
39
40 - create_table "contests_users", id: false, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t|
40 + create_table "contests_users", id: false, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1", force: :cascade do |t|
41 t.integer "contest_id"
41 t.integer "contest_id"
42 t.integer "user_id"
42 t.integer "user_id"
43 end
43 end
44
44
45 - create_table "countries", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t|
45 + create_table "countries", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1", force: :cascade do |t|
46 t.string "name"
46 t.string "name"
47 t.datetime "created_at"
47 t.datetime "created_at"
48 t.datetime "updated_at"
48 t.datetime "updated_at"
49 end
49 end
50
50
51 - create_table "descriptions", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t|
51 + create_table "descriptions", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1", force: :cascade do |t|
52 t.text "body"
52 t.text "body"
53 t.boolean "markdowned"
53 t.boolean "markdowned"
54 t.datetime "created_at"
54 t.datetime "created_at"
55 t.datetime "updated_at"
55 t.datetime "updated_at"
56 end
56 end
57
57
58 - create_table "grader_configurations", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t|
58 + create_table "grader_configurations", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1", force: :cascade do |t|
59 t.string "key"
59 t.string "key"
60 t.string "value_type"
60 t.string "value_type"
61 t.string "value"
61 t.string "value"
62 t.datetime "created_at"
62 t.datetime "created_at"
63 t.datetime "updated_at"
63 t.datetime "updated_at"
64 t.text "description"
64 t.text "description"
65 end
65 end
66
66
67 - create_table "grader_processes", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t|
67 + create_table "grader_processes", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1", force: :cascade do |t|
68 t.string "host"
68 t.string "host"
69 t.integer "pid"
69 t.integer "pid"
70 t.string "mode"
70 t.string "mode"
71 t.boolean "active"
71 t.boolean "active"
72 t.datetime "created_at"
72 t.datetime "created_at"
73 t.datetime "updated_at"
73 t.datetime "updated_at"
74 t.integer "task_id"
74 t.integer "task_id"
75 t.string "task_type"
75 t.string "task_type"
76 t.boolean "terminated"
76 t.boolean "terminated"
77 - t.index ["host", "pid"], name: "index_grader_processes_on_ip_and_pid"
77 + t.index ["host", "pid"], name: "index_grader_processes_on_host_and_pid"
78 end
78 end
79
79
80 - create_table "groups", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci", force: :cascade do |t|
80 + create_table "groups", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1", force: :cascade do |t|
81 t.string "name"
81 t.string "name"
82 t.string "description"
82 t.string "description"
83 end
83 end
84
84
85 - create_table "groups_problems", id: false, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci", force: :cascade do |t|
85 + create_table "groups_problems", id: false, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1", force: :cascade do |t|
86 t.integer "problem_id", null: false
86 t.integer "problem_id", null: false
87 t.integer "group_id", null: false
87 t.integer "group_id", null: false
88 t.index ["group_id", "problem_id"], name: "index_groups_problems_on_group_id_and_problem_id"
88 t.index ["group_id", "problem_id"], name: "index_groups_problems_on_group_id_and_problem_id"
89 end
89 end
90
90
91 - create_table "groups_users", id: false, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci", force: :cascade do |t|
91 + create_table "groups_users", id: false, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1", force: :cascade do |t|
92 t.integer "group_id", null: false
92 t.integer "group_id", null: false
93 t.integer "user_id", null: false
93 t.integer "user_id", null: false
94 t.index ["user_id", "group_id"], name: "index_groups_users_on_user_id_and_group_id"
94 t.index ["user_id", "group_id"], name: "index_groups_users_on_user_id_and_group_id"
95 end
95 end
96
96
97 create_table "heart_beats", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1", force: :cascade do |t|
97 create_table "heart_beats", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1", force: :cascade do |t|
98 t.integer "user_id"
98 t.integer "user_id"
99 t.string "ip_address"
99 t.string "ip_address"
100 - t.datetime "created_at", null: false
100 + t.datetime "created_at"
101 - t.datetime "updated_at", null: false
101 + t.datetime "updated_at"
102 t.string "status"
102 t.string "status"
103 t.index ["updated_at"], name: "index_heart_beats_on_updated_at"
103 t.index ["updated_at"], name: "index_heart_beats_on_updated_at"
104 end
104 end
105
105
106 - create_table "languages", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t|
106 + create_table "languages", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1", force: :cascade do |t|
107 t.string "name", limit: 10
107 t.string "name", limit: 10
108 t.string "pretty_name"
108 t.string "pretty_name"
109 t.string "ext", limit: 10
109 t.string "ext", limit: 10
110 t.string "common_ext"
110 t.string "common_ext"
111 end
111 end
112
112
113 create_table "logins", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1", force: :cascade do |t|
113 create_table "logins", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1", force: :cascade do |t|
114 t.integer "user_id"
114 t.integer "user_id"
115 t.string "ip_address"
115 t.string "ip_address"
116 - t.datetime "created_at", null: false
116 + t.datetime "created_at"
117 - t.datetime "updated_at", null: false
117 + t.datetime "updated_at"
118 end
118 end
119
119
120 - create_table "messages", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t|
120 + create_table "messages", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1", force: :cascade do |t|
121 t.integer "sender_id"
121 t.integer "sender_id"
122 t.integer "receiver_id"
122 t.integer "receiver_id"
123 t.integer "replying_message_id"
123 t.integer "replying_message_id"
124 t.text "body"
124 t.text "body"
125 t.boolean "replied"
125 t.boolean "replied"
126 t.datetime "created_at"
126 t.datetime "created_at"
127 t.datetime "updated_at"
127 t.datetime "updated_at"
128 end
128 end
129
129
130 - create_table "problems", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t|
130 + create_table "problems", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1", force: :cascade do |t|
131 t.string "name", limit: 30
131 t.string "name", limit: 30
132 t.string "full_name"
132 t.string "full_name"
133 t.integer "full_score"
133 t.integer "full_score"
134 t.date "date_added"
134 t.date "date_added"
135 t.boolean "available"
135 t.boolean "available"
136 t.string "url"
136 t.string "url"
@@ -138,68 +138,68
138 t.boolean "test_allowed"
138 t.boolean "test_allowed"
139 t.boolean "output_only"
139 t.boolean "output_only"
140 t.string "description_filename"
140 t.string "description_filename"
141 t.boolean "view_testcase"
141 t.boolean "view_testcase"
142 end
142 end
143
143
144 - create_table "problems_tags", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci", force: :cascade do |t|
144 + create_table "problems_tags", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1", force: :cascade do |t|
145 t.integer "problem_id"
145 t.integer "problem_id"
146 t.integer "tag_id"
146 t.integer "tag_id"
147 t.index ["problem_id", "tag_id"], name: "index_problems_tags_on_problem_id_and_tag_id", unique: true
147 t.index ["problem_id", "tag_id"], name: "index_problems_tags_on_problem_id_and_tag_id", unique: true
148 t.index ["problem_id"], name: "index_problems_tags_on_problem_id"
148 t.index ["problem_id"], name: "index_problems_tags_on_problem_id"
149 t.index ["tag_id"], name: "index_problems_tags_on_tag_id"
149 t.index ["tag_id"], name: "index_problems_tags_on_tag_id"
150 end
150 end
151
151
152 - create_table "rights", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t|
152 + create_table "rights", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1", force: :cascade do |t|
153 t.string "name"
153 t.string "name"
154 t.string "controller"
154 t.string "controller"
155 t.string "action"
155 t.string "action"
156 end
156 end
157
157
158 - create_table "rights_roles", id: false, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t|
158 + create_table "rights_roles", id: false, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1", force: :cascade do |t|
159 t.integer "right_id"
159 t.integer "right_id"
160 t.integer "role_id"
160 t.integer "role_id"
161 t.index ["role_id"], name: "index_rights_roles_on_role_id"
161 t.index ["role_id"], name: "index_rights_roles_on_role_id"
162 end
162 end
163
163
164 - create_table "roles", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t|
164 + create_table "roles", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1", force: :cascade do |t|
165 t.string "name"
165 t.string "name"
166 end
166 end
167
167
168 - create_table "roles_users", id: false, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t|
168 + create_table "roles_users", id: false, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1", force: :cascade do |t|
169 t.integer "role_id"
169 t.integer "role_id"
170 t.integer "user_id"
170 t.integer "user_id"
171 t.index ["user_id"], name: "index_roles_users_on_user_id"
171 t.index ["user_id"], name: "index_roles_users_on_user_id"
172 end
172 end
173
173
174 - create_table "sessions", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t|
174 + create_table "sessions", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1", force: :cascade do |t|
175 t.string "session_id"
175 t.string "session_id"
176 t.text "data"
176 t.text "data"
177 t.datetime "updated_at"
177 t.datetime "updated_at"
178 t.index ["session_id"], name: "index_sessions_on_session_id"
178 t.index ["session_id"], name: "index_sessions_on_session_id"
179 t.index ["updated_at"], name: "index_sessions_on_updated_at"
179 t.index ["updated_at"], name: "index_sessions_on_updated_at"
180 end
180 end
181
181
182 - create_table "sites", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t|
182 + create_table "sites", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1", force: :cascade do |t|
183 t.string "name"
183 t.string "name"
184 t.boolean "started"
184 t.boolean "started"
185 t.datetime "start_time"
185 t.datetime "start_time"
186 t.datetime "created_at"
186 t.datetime "created_at"
187 t.datetime "updated_at"
187 t.datetime "updated_at"
188 t.integer "country_id"
188 t.integer "country_id"
189 t.string "password"
189 t.string "password"
190 end
190 end
191
191
192 create_table "submission_view_logs", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1", force: :cascade do |t|
192 create_table "submission_view_logs", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1", force: :cascade do |t|
193 t.integer "user_id"
193 t.integer "user_id"
194 t.integer "submission_id"
194 t.integer "submission_id"
195 - t.datetime "created_at", null: false
195 + t.datetime "created_at"
196 - t.datetime "updated_at", null: false
196 + t.datetime "updated_at"
197 end
197 end
198
198
199 - create_table "submissions", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t|
199 + create_table "submissions", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1", force: :cascade do |t|
200 t.integer "user_id"
200 t.integer "user_id"
201 t.integer "problem_id"
201 t.integer "problem_id"
202 t.integer "language_id"
202 t.integer "language_id"
203 t.text "source", limit: 16777215
203 t.text "source", limit: 16777215
204 t.binary "binary"
204 t.binary "binary"
205 t.datetime "submitted_at"
205 t.datetime "submitted_at"
@@ -215,37 +215,37
215 t.integer "effective_code_length"
215 t.integer "effective_code_length"
216 t.string "ip_address"
216 t.string "ip_address"
217 t.index ["user_id", "problem_id", "number"], name: "index_submissions_on_user_id_and_problem_id_and_number", unique: true
217 t.index ["user_id", "problem_id", "number"], name: "index_submissions_on_user_id_and_problem_id_and_number", unique: true
218 t.index ["user_id", "problem_id"], name: "index_submissions_on_user_id_and_problem_id"
218 t.index ["user_id", "problem_id"], name: "index_submissions_on_user_id_and_problem_id"
219 end
219 end
220
220
221 - create_table "tags", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci", force: :cascade do |t|
221 + create_table "tags", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1", force: :cascade do |t|
222 t.string "name", null: false
222 t.string "name", null: false
223 t.text "description"
223 t.text "description"
224 t.boolean "public"
224 t.boolean "public"
225 t.datetime "created_at", null: false
225 t.datetime "created_at", null: false
226 t.datetime "updated_at", null: false
226 t.datetime "updated_at", null: false
227 end
227 end
228
228
229 - create_table "tasks", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t|
229 + create_table "tasks", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1", force: :cascade do |t|
230 t.integer "submission_id"
230 t.integer "submission_id"
231 t.datetime "created_at"
231 t.datetime "created_at"
232 t.integer "status"
232 t.integer "status"
233 t.datetime "updated_at"
233 t.datetime "updated_at"
234 t.index ["submission_id"], name: "index_tasks_on_submission_id"
234 t.index ["submission_id"], name: "index_tasks_on_submission_id"
235 end
235 end
236
236
237 - create_table "test_pairs", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t|
237 + create_table "test_pairs", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1", force: :cascade do |t|
238 t.integer "problem_id"
238 t.integer "problem_id"
239 t.text "input", limit: 16777215
239 t.text "input", limit: 16777215
240 t.text "solution", limit: 16777215
240 t.text "solution", limit: 16777215
241 t.datetime "created_at"
241 t.datetime "created_at"
242 t.datetime "updated_at"
242 t.datetime "updated_at"
243 end
243 end
244
244
245 - create_table "test_requests", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t|
245 + create_table "test_requests", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1", force: :cascade do |t|
246 t.integer "user_id"
246 t.integer "user_id"
247 t.integer "problem_id"
247 t.integer "problem_id"
248 t.integer "submission_id"
248 t.integer "submission_id"
249 t.string "input_file_name"
249 t.string "input_file_name"
250 t.string "output_file_name"
250 t.string "output_file_name"
251 t.string "running_stat"
251 t.string "running_stat"
@@ -260,32 +260,33
260 t.float "running_time"
260 t.float "running_time"
261 t.string "exit_status"
261 t.string "exit_status"
262 t.integer "memory_usage"
262 t.integer "memory_usage"
263 t.index ["user_id", "problem_id"], name: "index_test_requests_on_user_id_and_problem_id"
263 t.index ["user_id", "problem_id"], name: "index_test_requests_on_user_id_and_problem_id"
264 end
264 end
265
265
266 - create_table "testcases", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci", force: :cascade do |t|
266 + create_table "testcases", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1", force: :cascade do |t|
267 t.integer "problem_id"
267 t.integer "problem_id"
268 t.integer "num"
268 t.integer "num"
269 t.integer "group"
269 t.integer "group"
270 t.integer "score"
270 t.integer "score"
271 t.text "input", limit: 4294967295
271 t.text "input", limit: 4294967295
272 t.text "sol", limit: 4294967295
272 t.text "sol", limit: 4294967295
273 t.datetime "created_at"
273 t.datetime "created_at"
274 t.datetime "updated_at"
274 t.datetime "updated_at"
275 t.index ["problem_id"], name: "index_testcases_on_problem_id"
275 t.index ["problem_id"], name: "index_testcases_on_problem_id"
276 end
276 end
277
277
278 - create_table "user_contest_stats", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t|
278 + create_table "user_contest_stats", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1", force: :cascade do |t|
279 t.integer "user_id"
279 t.integer "user_id"
280 t.datetime "started_at"
280 t.datetime "started_at"
281 t.datetime "created_at"
281 t.datetime "created_at"
282 t.datetime "updated_at"
282 t.datetime "updated_at"
283 + t.boolean "forced_logout"
283 end
284 end
284
285
285 - create_table "users", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t|
286 + create_table "users", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1", force: :cascade do |t|
286 t.string "login", limit: 50
287 t.string "login", limit: 50
287 t.string "full_name"
288 t.string "full_name"
288 t.string "hashed_password"
289 t.string "hashed_password"
289 t.string "salt", limit: 5
290 t.string "salt", limit: 5
290 t.string "alias"
291 t.string "alias"
291 t.string "email"
292 t.string "email"
@@ -97,13 +97,13
97 },
97 },
98
98
99 {
99 {
100 :key => 'right.view_testcase',
100 :key => 'right.view_testcase',
101 :value_type => 'boolean',
101 :value_type => 'boolean',
102 :default_value => 'false',
102 :default_value => 'false',
103 - :description => 'When true, any user can view/download test data'
103 + :description => 'If true, any user can view/download test data'
104 },
104 },
105
105
106 {
106 {
107 :key => 'system.online_registration',
107 :key => 'system.online_registration',
108 :value_type => 'boolean',
108 :value_type => 'boolean',
109 :default_value => 'false',
109 :default_value => 'false',
@@ -179,23 +179,23
179 :default_value => 'false',
179 :default_value => 'false',
180 :description => "If true, available problem to the user will be only ones associated with the group of the user."
180 :description => "If true, available problem to the user will be only ones associated with the group of the user."
181 },
181 },
182
182
183
183
184 {
184 {
185 - :key => 'right.whitelist_ip_only',
185 + :key => 'right.whitelist_ignore',
186 :value_type => 'boolean',
186 :value_type => 'boolean',
187 - :default_value => 'false',
187 + :default_value => 'true',
188 - :description => "If true, non-admin user will be able to use the system only when their ip is in the 'whitelist_ip'."
188 + :description => "If true, no IP check against whitelist_ip is perform. However, when false, non-admin user must have their ip in 'whitelist_ip' to be able to login."
189 },
189 },
190
190
191 {
191 {
192 :key => 'right.whitelist_ip',
192 :key => 'right.whitelist_ip',
193 :value_type => 'string',
193 :value_type => 'string',
194 :default_value => '0.0.0.0/0',
194 :default_value => '0.0.0.0/0',
195 - :description => "list of whitelist ip, given in comma separated CIDR notation. For example '161.200.92.0/23, 161.200.80.1/32'"
195 + :description => "list of whitelist ip, given in comma separated CIDR notation. For example '192.168.90.0/23, 192.168.1.23/32'"
196 },
196 },
197
197
198 ]
198 ]
199
199
200
200
201 def create_configuration_key(key,
201 def create_configuration_key(key,
@@ -271,13 +271,13
271 def seed_users_and_roles
271 def seed_users_and_roles
272 seed_roles
272 seed_roles
273 seed_root
273 seed_root
274 end
274 end
275
275
276 def seed_more_languages
276 def seed_more_languages
277 - Language.delete_all
277 + #Language.delete_all
278 Language.find_or_create_by( name: 'c', pretty_name: 'C', ext: 'c', common_ext: 'c' )
278 Language.find_or_create_by( name: 'c', pretty_name: 'C', ext: 'c', common_ext: 'c' )
279 Language.find_or_create_by( name: 'cpp', pretty_name: 'C++', ext: 'cpp', common_ext: 'cpp,cc' )
279 Language.find_or_create_by( name: 'cpp', pretty_name: 'C++', ext: 'cpp', common_ext: 'cpp,cc' )
280 Language.find_or_create_by( name: 'pas', pretty_name: 'Pascal', ext: 'pas', common_ext: 'pas' )
280 Language.find_or_create_by( name: 'pas', pretty_name: 'Pascal', ext: 'pas', common_ext: 'pas' )
281 Language.find_or_create_by( name: 'ruby', pretty_name: 'Ruby', ext: 'rb', common_ext: 'rb' )
281 Language.find_or_create_by( name: 'ruby', pretty_name: 'Ruby', ext: 'rb', common_ext: 'rb' )
282 Language.find_or_create_by( name: 'python', pretty_name: 'Python', ext: 'py', common_ext: 'py' )
282 Language.find_or_create_by( name: 'python', pretty_name: 'Python', ext: 'py', common_ext: 'py' )
283 Language.find_or_create_by( name: 'java', pretty_name: 'Java', ext: 'java', common_ext: 'java' )
283 Language.find_or_create_by( name: 'java', pretty_name: 'Java', ext: 'java', common_ext: 'java' )
@@ -47,13 +47,13
47 click_on 'Manage'
47 click_on 'Manage'
48 click_on 'Users', match: :first
48 click_on 'Users', match: :first
49 end
49 end
50
50
51 click_on 'New list of users', match: :first
51 click_on 'New list of users', match: :first
52 find(:css, 'textarea').fill_in with:"abc1,Boaty McBoatface,abcdef,alias1,remark1,\nabc2,Boaty2 McSecond,acbdef123,aias2,remark2"
52 find(:css, 'textarea').fill_in with:"abc1,Boaty McBoatface,abcdef,alias1,remark1,\nabc2,Boaty2 McSecond,acbdef123,aias2,remark2"
53 - click_on 'create users'
53 + click_on 'Create following users'
54
54
55 assert_text('remark1')
55 assert_text('remark1')
56 assert_text('remark2')
56 assert_text('remark2')
57 end
57 end
58
58
59 test "grant admin right" do
59 test "grant admin right" do
You need to be logged in to leave comments. Login now