Description:
still upgrading
Commit status:
[Not Reviewed]
References:
Diff options:
Comments:
0 Commit comments
0 Inline Comments
Unresolved TODOs:
There are no unresolved TODOs
r753:9918c6e0c313 - - 6 files changed: 15 inserted, 6 deleted
@@ -21,104 +21,104 | |||||
|
21 | @description = nil |
|
21 | @description = nil |
|
22 | end |
|
22 | end |
|
23 |
|
23 | ||
|
24 | def create |
|
24 | def create |
|
25 | @problem = Problem.new(problem_params) |
|
25 | @problem = Problem.new(problem_params) |
|
26 | @description = Description.new(problem_params[:description]) |
|
26 | @description = Description.new(problem_params[:description]) |
|
27 | if @description.body!='' |
|
27 | if @description.body!='' |
|
28 | if !@description.save |
|
28 | if !@description.save |
|
29 | render :action => new and return |
|
29 | render :action => new and return |
|
30 | end |
|
30 | end |
|
31 | else |
|
31 | else |
|
32 | @description = nil |
|
32 | @description = nil |
|
33 | end |
|
33 | end |
|
34 | @problem.description = @description |
|
34 | @problem.description = @description |
|
35 | if @problem.save |
|
35 | if @problem.save |
|
36 | flash[:notice] = 'Problem was successfully created.' |
|
36 | flash[:notice] = 'Problem was successfully created.' |
|
37 | redirect_to action: :index |
|
37 | redirect_to action: :index |
|
38 | else |
|
38 | else |
|
39 | render :action => 'new' |
|
39 | render :action => 'new' |
|
40 | end |
|
40 | end |
|
41 | end |
|
41 | end |
|
42 |
|
42 | ||
|
43 | def quick_create |
|
43 | def quick_create |
|
44 | @problem = Problem.new(problem_params) |
|
44 | @problem = Problem.new(problem_params) |
|
45 | @problem.full_name = @problem.name if @problem.full_name == '' |
|
45 | @problem.full_name = @problem.name if @problem.full_name == '' |
|
46 | @problem.full_score = 100 |
|
46 | @problem.full_score = 100 |
|
47 | @problem.available = false |
|
47 | @problem.available = false |
|
48 | @problem.test_allowed = true |
|
48 | @problem.test_allowed = true |
|
49 | @problem.output_only = false |
|
49 | @problem.output_only = false |
|
50 | @problem.date_added = Time.new |
|
50 | @problem.date_added = Time.new |
|
51 | if @problem.save |
|
51 | if @problem.save |
|
52 | flash[:notice] = 'Problem was successfully created.' |
|
52 | flash[:notice] = 'Problem was successfully created.' |
|
53 | redirect_to action: :index |
|
53 | redirect_to action: :index |
|
54 | else |
|
54 | else |
|
55 | flash[:notice] = 'Error saving problem' |
|
55 | flash[:notice] = 'Error saving problem' |
|
56 | redirect_to action: :index |
|
56 | redirect_to action: :index |
|
57 | end |
|
57 | end |
|
58 | end |
|
58 | end |
|
59 |
|
59 | ||
|
60 | def edit |
|
60 | def edit |
|
61 | @problem = Problem.find(params[:id]) |
|
61 | @problem = Problem.find(params[:id]) |
|
62 | @description = @problem.description |
|
62 | @description = @problem.description |
|
63 | end |
|
63 | end |
|
64 |
|
64 | ||
|
65 | def update |
|
65 | def update |
|
66 | @problem = Problem.find(params[:id]) |
|
66 | @problem = Problem.find(params[:id]) |
|
67 | @description = @problem.description |
|
67 | @description = @problem.description |
|
68 | if @description.nil? and params[:description][:body]!='' |
|
68 | if @description.nil? and params[:description][:body]!='' |
|
69 |
- @description = Description.new( |
|
69 | + @description = Description.new(description_params) |
|
70 | if !@description.save |
|
70 | if !@description.save |
|
71 | flash[:notice] = 'Error saving description' |
|
71 | flash[:notice] = 'Error saving description' |
|
72 | render :action => 'edit' and return |
|
72 | render :action => 'edit' and return |
|
73 | end |
|
73 | end |
|
74 | @problem.description = @description |
|
74 | @problem.description = @description |
|
75 | elsif @description |
|
75 | elsif @description |
|
76 |
- if !@description.update_attributes( |
|
76 | + if !@description.update_attributes(description_params) |
|
77 | flash[:notice] = 'Error saving description' |
|
77 | flash[:notice] = 'Error saving description' |
|
78 | render :action => 'edit' and return |
|
78 | render :action => 'edit' and return |
|
79 | end |
|
79 | end |
|
80 | end |
|
80 | end |
|
81 | if params[:file] and params[:file].content_type != 'application/pdf' |
|
81 | if params[:file] and params[:file].content_type != 'application/pdf' |
|
82 | flash[:notice] = 'Error: Uploaded file is not PDF' |
|
82 | flash[:notice] = 'Error: Uploaded file is not PDF' |
|
83 | render :action => 'edit' and return |
|
83 | render :action => 'edit' and return |
|
84 | end |
|
84 | end |
|
85 | if @problem.update_attributes(problem_params) |
|
85 | if @problem.update_attributes(problem_params) |
|
86 | flash[:notice] = 'Problem was successfully updated.' |
|
86 | flash[:notice] = 'Problem was successfully updated.' |
|
87 | unless params[:file] == nil or params[:file] == '' |
|
87 | unless params[:file] == nil or params[:file] == '' |
|
88 | flash[:notice] = 'Problem was successfully updated and a new PDF file is uploaded.' |
|
88 | flash[:notice] = 'Problem was successfully updated and a new PDF file is uploaded.' |
|
89 | out_dirname = "#{Problem.download_file_basedir}/#{@problem.id}" |
|
89 | out_dirname = "#{Problem.download_file_basedir}/#{@problem.id}" |
|
90 | if not FileTest.exists? out_dirname |
|
90 | if not FileTest.exists? out_dirname |
|
91 | Dir.mkdir out_dirname |
|
91 | Dir.mkdir out_dirname |
|
92 | end |
|
92 | end |
|
93 |
|
93 | ||
|
94 | out_filename = "#{out_dirname}/#{@problem.name}.pdf" |
|
94 | out_filename = "#{out_dirname}/#{@problem.name}.pdf" |
|
95 | if FileTest.exists? out_filename |
|
95 | if FileTest.exists? out_filename |
|
96 | File.delete out_filename |
|
96 | File.delete out_filename |
|
97 | end |
|
97 | end |
|
98 |
|
98 | ||
|
99 | File.open(out_filename,"wb") do |file| |
|
99 | File.open(out_filename,"wb") do |file| |
|
100 | file.write(params[:file].read) |
|
100 | file.write(params[:file].read) |
|
101 | end |
|
101 | end |
|
102 | @problem.description_filename = "#{@problem.name}.pdf" |
|
102 | @problem.description_filename = "#{@problem.name}.pdf" |
|
103 | @problem.save |
|
103 | @problem.save |
|
104 | end |
|
104 | end |
|
105 | redirect_to :action => 'show', :id => @problem |
|
105 | redirect_to :action => 'show', :id => @problem |
|
106 | else |
|
106 | else |
|
107 | render :action => 'edit' |
|
107 | render :action => 'edit' |
|
108 | end |
|
108 | end |
|
109 | end |
|
109 | end |
|
110 |
|
110 | ||
|
111 | def destroy |
|
111 | def destroy |
|
112 | p = Problem.find(params[:id]).destroy |
|
112 | p = Problem.find(params[:id]).destroy |
|
113 | redirect_to action: :index |
|
113 | redirect_to action: :index |
|
114 | end |
|
114 | end |
|
115 |
|
115 | ||
|
116 | def toggle |
|
116 | def toggle |
|
117 | @problem = Problem.find(params[:id]) |
|
117 | @problem = Problem.find(params[:id]) |
|
118 | @problem.update_attributes(available: !(@problem.available) ) |
|
118 | @problem.update_attributes(available: !(@problem.available) ) |
|
119 | respond_to do |format| |
|
119 | respond_to do |format| |
|
120 | format.js { } |
|
120 | format.js { } |
|
121 | end |
|
121 | end |
|
122 | end |
|
122 | end |
|
123 |
|
123 | ||
|
124 | def toggle_test |
|
124 | def toggle_test |
@@ -256,49 +256,53 | |||||
|
256 |
|
256 | ||
|
257 | def change_date_added |
|
257 | def change_date_added |
|
258 | problems = get_problems_from_params |
|
258 | problems = get_problems_from_params |
|
259 | date = Date.parse(params[:date_added]) |
|
259 | date = Date.parse(params[:date_added]) |
|
260 | problems.each do |p| |
|
260 | problems.each do |p| |
|
261 | p.date_added = date |
|
261 | p.date_added = date |
|
262 | p.save |
|
262 | p.save |
|
263 | end |
|
263 | end |
|
264 | end |
|
264 | end |
|
265 |
|
265 | ||
|
266 | def add_to_contest |
|
266 | def add_to_contest |
|
267 | problems = get_problems_from_params |
|
267 | problems = get_problems_from_params |
|
268 | contest = Contest.find(params[:contest][:id]) |
|
268 | contest = Contest.find(params[:contest][:id]) |
|
269 | if contest!=nil and contest.enabled |
|
269 | if contest!=nil and contest.enabled |
|
270 | problems.each do |p| |
|
270 | problems.each do |p| |
|
271 | p.contests << contest |
|
271 | p.contests << contest |
|
272 | end |
|
272 | end |
|
273 | end |
|
273 | end |
|
274 | end |
|
274 | end |
|
275 |
|
275 | ||
|
276 | def set_available(avail) |
|
276 | def set_available(avail) |
|
277 | problems = get_problems_from_params |
|
277 | problems = get_problems_from_params |
|
278 | problems.each do |p| |
|
278 | problems.each do |p| |
|
279 | p.available = avail |
|
279 | p.available = avail |
|
280 | p.save |
|
280 | p.save |
|
281 | end |
|
281 | end |
|
282 | end |
|
282 | end |
|
283 |
|
283 | ||
|
284 | def get_problems_from_params |
|
284 | def get_problems_from_params |
|
285 | problems = [] |
|
285 | problems = [] |
|
286 | params.keys.each do |k| |
|
286 | params.keys.each do |k| |
|
287 | if k.index('prob-')==0 |
|
287 | if k.index('prob-')==0 |
|
288 | name, id, order = k.split('-') |
|
288 | name, id, order = k.split('-') |
|
289 | problems << Problem.find(id) |
|
289 | problems << Problem.find(id) |
|
290 | end |
|
290 | end |
|
291 | end |
|
291 | end |
|
292 | problems |
|
292 | problems |
|
293 | end |
|
293 | end |
|
294 |
|
294 | ||
|
295 | def get_problems_stat |
|
295 | def get_problems_stat |
|
296 | end |
|
296 | end |
|
297 |
|
297 | ||
|
298 | private |
|
298 | private |
|
299 |
|
299 | ||
|
300 | def problem_params |
|
300 | def problem_params |
|
301 | params.require(:problem).permit(:name, :full_name, :full_score, :change_date_added, :date_added, :available, :test_allowed,:output_only, :url, :description, tag_ids:[]) |
|
301 | params.require(:problem).permit(:name, :full_name, :full_score, :change_date_added, :date_added, :available, :test_allowed,:output_only, :url, :description, tag_ids:[]) |
|
302 | end |
|
302 | end |
|
303 |
|
303 | ||
|
|
304 | + def description_params | ||
|
|
305 | + params.require(:description).permit(:body, :markdown) | ||
|
304 | end |
|
306 | end |
|
|
307 | + | ||
|
|
308 | + end |
@@ -1,78 +1,78 | |||||
|
1 | require 'digest/sha1' |
|
1 | require 'digest/sha1' |
|
2 | require 'net/pop' |
|
2 | require 'net/pop' |
|
3 | require 'net/https' |
|
3 | require 'net/https' |
|
4 | require 'net/http' |
|
4 | require 'net/http' |
|
5 | require 'json' |
|
5 | require 'json' |
|
6 |
|
6 | ||
|
7 | class User < ActiveRecord::Base |
|
7 | class User < ActiveRecord::Base |
|
8 |
|
8 | ||
|
9 | has_and_belongs_to_many :roles |
|
9 | has_and_belongs_to_many :roles |
|
10 |
|
10 | ||
|
11 | #has_and_belongs_to_many :groups |
|
11 | #has_and_belongs_to_many :groups |
|
12 | has_many :groups_users, class_name: 'GroupUser' |
|
12 | has_many :groups_users, class_name: 'GroupUser' |
|
13 | has_many :groups, :through => :groups_users |
|
13 | has_many :groups, :through => :groups_users |
|
14 |
|
14 | ||
|
15 | has_many :test_requests, -> {order(submitted_at: :desc)} |
|
15 | has_many :test_requests, -> {order(submitted_at: :desc)} |
|
16 |
|
16 | ||
|
17 | has_many :messages, -> { order(created_at: :desc) }, |
|
17 | has_many :messages, -> { order(created_at: :desc) }, |
|
18 | :class_name => "Message", |
|
18 | :class_name => "Message", |
|
19 | :foreign_key => "sender_id" |
|
19 | :foreign_key => "sender_id" |
|
20 |
|
20 | ||
|
21 | has_many :replied_messages, -> { order(created_at: :desc) }, |
|
21 | has_many :replied_messages, -> { order(created_at: :desc) }, |
|
22 | :class_name => "Message", |
|
22 | :class_name => "Message", |
|
23 | :foreign_key => "receiver_id" |
|
23 | :foreign_key => "receiver_id" |
|
24 |
|
24 | ||
|
25 | has_one :contest_stat, :class_name => "UserContestStat", :dependent => :destroy |
|
25 | has_one :contest_stat, :class_name => "UserContestStat", :dependent => :destroy |
|
26 |
|
26 | ||
|
27 | belongs_to :site |
|
27 | belongs_to :site |
|
28 | belongs_to :country |
|
28 | belongs_to :country |
|
29 |
|
29 | ||
|
30 |
- has_and_belongs_to_many :contests, -> { order(:name) |
|
30 | + has_and_belongs_to_many :contests, -> { order(:name)} |
|
31 |
|
31 | ||
|
32 | scope :activated_users, -> {where activated: true} |
|
32 | scope :activated_users, -> {where activated: true} |
|
33 |
|
33 | ||
|
34 | validates_presence_of :login |
|
34 | validates_presence_of :login |
|
35 | validates_uniqueness_of :login |
|
35 | validates_uniqueness_of :login |
|
36 | validates_format_of :login, :with => /\A[\_A-Za-z0-9]+\z/ |
|
36 | validates_format_of :login, :with => /\A[\_A-Za-z0-9]+\z/ |
|
37 | validates_length_of :login, :within => 3..30 |
|
37 | validates_length_of :login, :within => 3..30 |
|
38 |
|
38 | ||
|
39 | validates_presence_of :full_name |
|
39 | validates_presence_of :full_name |
|
40 | validates_length_of :full_name, :minimum => 1 |
|
40 | validates_length_of :full_name, :minimum => 1 |
|
41 |
|
41 | ||
|
42 | validates_presence_of :password, :if => :password_required? |
|
42 | validates_presence_of :password, :if => :password_required? |
|
43 | validates_length_of :password, :within => 4..20, :if => :password_required? |
|
43 | validates_length_of :password, :within => 4..20, :if => :password_required? |
|
44 | validates_confirmation_of :password, :if => :password_required? |
|
44 | validates_confirmation_of :password, :if => :password_required? |
|
45 |
|
45 | ||
|
46 | validates_format_of :email, |
|
46 | validates_format_of :email, |
|
47 | :with => /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\Z/i, |
|
47 | :with => /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\Z/i, |
|
48 | :if => :email_validation? |
|
48 | :if => :email_validation? |
|
49 | validate :uniqueness_of_email_from_activated_users, |
|
49 | validate :uniqueness_of_email_from_activated_users, |
|
50 | :if => :email_validation? |
|
50 | :if => :email_validation? |
|
51 | validate :enough_time_interval_between_same_email_registrations, |
|
51 | validate :enough_time_interval_between_same_email_registrations, |
|
52 | :if => :email_validation? |
|
52 | :if => :email_validation? |
|
53 |
|
53 | ||
|
54 | # these are for ytopc |
|
54 | # these are for ytopc |
|
55 | # disable for now |
|
55 | # disable for now |
|
56 | #validates_presence_of :province |
|
56 | #validates_presence_of :province |
|
57 |
|
57 | ||
|
58 | attr_accessor :password |
|
58 | attr_accessor :password |
|
59 |
|
59 | ||
|
60 | before_save :encrypt_new_password |
|
60 | before_save :encrypt_new_password |
|
61 | before_save :assign_default_site |
|
61 | before_save :assign_default_site |
|
62 | before_save :assign_default_contest |
|
62 | before_save :assign_default_contest |
|
63 |
|
63 | ||
|
64 | # this is for will_paginate |
|
64 | # this is for will_paginate |
|
65 | cattr_reader :per_page |
|
65 | cattr_reader :per_page |
|
66 | @@per_page = 50 |
|
66 | @@per_page = 50 |
|
67 |
|
67 | ||
|
68 | def self.authenticate(login, password) |
|
68 | def self.authenticate(login, password) |
|
69 | user = find_by_login(login) |
|
69 | user = find_by_login(login) |
|
70 | if user |
|
70 | if user |
|
71 | return user if user.authenticated?(password) |
|
71 | return user if user.authenticated?(password) |
|
72 | end |
|
72 | end |
|
73 | end |
|
73 | end |
|
74 |
|
74 | ||
|
75 | def authenticated?(password) |
|
75 | def authenticated?(password) |
|
76 | if self.activated |
|
76 | if self.activated |
|
77 | hashed_password == User.encrypt(password,self.salt) |
|
77 | hashed_password == User.encrypt(password,self.salt) |
|
78 | else |
|
78 | else |
@@ -128,97 +128,97 | |||||
|
128 | password = '' |
|
128 | password = '' |
|
129 | length.times { password << chars[rand(chars.length - 1)] } |
|
129 | length.times { password << chars[rand(chars.length - 1)] } |
|
130 | password |
|
130 | password |
|
131 | end |
|
131 | end |
|
132 |
|
132 | ||
|
133 | def self.find_non_admin_with_prefix(prefix='') |
|
133 | def self.find_non_admin_with_prefix(prefix='') |
|
134 | users = User.all |
|
134 | users = User.all |
|
135 | return users.find_all { |u| !(u.admin?) and u.login.index(prefix)==0 } |
|
135 | return users.find_all { |u| !(u.admin?) and u.login.index(prefix)==0 } |
|
136 | end |
|
136 | end |
|
137 |
|
137 | ||
|
138 | # Contest information |
|
138 | # Contest information |
|
139 |
|
139 | ||
|
140 | def self.find_users_with_no_contest() |
|
140 | def self.find_users_with_no_contest() |
|
141 | users = User.all |
|
141 | users = User.all |
|
142 | return users.find_all { |u| u.contests.length == 0 } |
|
142 | return users.find_all { |u| u.contests.length == 0 } |
|
143 | end |
|
143 | end |
|
144 |
|
144 | ||
|
145 |
|
145 | ||
|
146 | def contest_time_left |
|
146 | def contest_time_left |
|
147 | if GraderConfiguration.contest_mode? |
|
147 | if GraderConfiguration.contest_mode? |
|
148 | return nil if site==nil |
|
148 | return nil if site==nil |
|
149 | return site.time_left |
|
149 | return site.time_left |
|
150 | elsif GraderConfiguration.indv_contest_mode? |
|
150 | elsif GraderConfiguration.indv_contest_mode? |
|
151 | time_limit = GraderConfiguration.contest_time_limit |
|
151 | time_limit = GraderConfiguration.contest_time_limit |
|
152 | if time_limit == nil |
|
152 | if time_limit == nil |
|
153 | return nil |
|
153 | return nil |
|
154 | end |
|
154 | end |
|
155 | if contest_stat==nil or contest_stat.started_at==nil |
|
155 | if contest_stat==nil or contest_stat.started_at==nil |
|
156 | return (Time.now.gmtime + time_limit) - Time.now.gmtime |
|
156 | return (Time.now.gmtime + time_limit) - Time.now.gmtime |
|
157 | else |
|
157 | else |
|
158 | finish_time = contest_stat.started_at + time_limit |
|
158 | finish_time = contest_stat.started_at + time_limit |
|
159 | current_time = Time.now.gmtime |
|
159 | current_time = Time.now.gmtime |
|
160 | if current_time > finish_time |
|
160 | if current_time > finish_time |
|
161 | return 0 |
|
161 | return 0 |
|
162 | else |
|
162 | else |
|
163 | return finish_time - current_time |
|
163 | return finish_time - current_time |
|
164 | end |
|
164 | end |
|
165 | end |
|
165 | end |
|
166 | else |
|
166 | else |
|
167 | return nil |
|
167 | return nil |
|
168 | end |
|
168 | end |
|
169 | end |
|
169 | end |
|
170 |
|
170 | ||
|
171 | def contest_finished? |
|
171 | def contest_finished? |
|
172 | if GraderConfiguration.contest_mode? |
|
172 | if GraderConfiguration.contest_mode? |
|
173 | return false if site==nil |
|
173 | return false if site==nil |
|
174 | return site.finished? |
|
174 | return site.finished? |
|
175 | elsif GraderConfiguration.indv_contest_mode? |
|
175 | elsif GraderConfiguration.indv_contest_mode? |
|
176 |
- return false if self.contest_stat |
|
176 | + return false if self.contest_stat==nil |
|
177 | return contest_time_left == 0 |
|
177 | return contest_time_left == 0 |
|
178 | else |
|
178 | else |
|
179 | return false |
|
179 | return false |
|
180 | end |
|
180 | end |
|
181 | end |
|
181 | end |
|
182 |
|
182 | ||
|
183 | def contest_started? |
|
183 | def contest_started? |
|
184 | if GraderConfiguration.indv_contest_mode? |
|
184 | if GraderConfiguration.indv_contest_mode? |
|
185 | stat = self.contest_stat |
|
185 | stat = self.contest_stat |
|
186 | return ((stat != nil) and (stat.started_at != nil)) |
|
186 | return ((stat != nil) and (stat.started_at != nil)) |
|
187 | elsif GraderConfiguration.contest_mode? |
|
187 | elsif GraderConfiguration.contest_mode? |
|
188 | return true if site==nil |
|
188 | return true if site==nil |
|
189 | return site.started |
|
189 | return site.started |
|
190 | else |
|
190 | else |
|
191 | return true |
|
191 | return true |
|
192 | end |
|
192 | end |
|
193 | end |
|
193 | end |
|
194 |
|
194 | ||
|
195 | def update_start_time |
|
195 | def update_start_time |
|
196 | stat = self.contest_stat |
|
196 | stat = self.contest_stat |
|
197 | if stat.nil? or stat.started_at.nil? |
|
197 | if stat.nil? or stat.started_at.nil? |
|
198 | stat ||= UserContestStat.new(:user => self) |
|
198 | stat ||= UserContestStat.new(:user => self) |
|
199 | stat.started_at = Time.now.gmtime |
|
199 | stat.started_at = Time.now.gmtime |
|
200 | stat.save |
|
200 | stat.save |
|
201 | end |
|
201 | end |
|
202 | end |
|
202 | end |
|
203 |
|
203 | ||
|
204 | def problem_in_user_contests?(problem) |
|
204 | def problem_in_user_contests?(problem) |
|
205 | problem_contests = problem.contests.all |
|
205 | problem_contests = problem.contests.all |
|
206 |
|
206 | ||
|
207 | if problem_contests.length == 0 # this is public contest |
|
207 | if problem_contests.length == 0 # this is public contest |
|
208 | return true |
|
208 | return true |
|
209 | end |
|
209 | end |
|
210 |
|
210 | ||
|
211 | contests.each do |contest| |
|
211 | contests.each do |contest| |
|
212 | if problem_contests.find {|c| c.id == contest.id } |
|
212 | if problem_contests.find {|c| c.id == contest.id } |
|
213 | return true |
|
213 | return true |
|
214 | end |
|
214 | end |
|
215 | end |
|
215 | end |
|
216 | return false |
|
216 | return false |
|
217 | end |
|
217 | end |
|
218 |
|
218 | ||
|
219 | def available_problems_group_by_contests |
|
219 | def available_problems_group_by_contests |
|
220 | contest_problems = [] |
|
220 | contest_problems = [] |
|
221 | pin = {} |
|
221 | pin = {} |
|
222 | contests.enabled.each do |contest| |
|
222 | contests.enabled.each do |contest| |
|
223 | available_problems = contest.problems.available |
|
223 | available_problems = contest.problems.available |
|
224 | contest_problems << { |
|
224 | contest_problems << { |
@@ -1,59 +1,60 | |||||
|
1 | - content_for :head do |
|
1 | - content_for :head do |
|
2 | = stylesheet_link_tag 'problems' |
|
2 | = stylesheet_link_tag 'problems' |
|
3 |
|
3 | ||
|
4 | %h1 Import problems |
|
4 | %h1 Import problems |
|
5 |
|
5 | ||
|
6 | %p= link_to '[Back to problem list]', problems_path |
|
6 | %p= link_to '[Back to problem list]', problems_path |
|
7 |
|
7 | ||
|
8 | - if @problem and @problem.errors |
|
8 | - if @problem and @problem.errors |
|
9 | =error_messages_for 'problem' |
|
9 | =error_messages_for 'problem' |
|
10 |
|
10 | ||
|
11 |
- = |
|
11 | + = simple_form_for :problem, url: do_import_problems_path, :multipart => true do |f| |
|
|
12 | + | ||
|
12 | .submitbox |
|
13 | .submitbox |
|
13 | %table |
|
14 | %table |
|
14 | %tr |
|
15 | %tr |
|
15 | %td Name: |
|
16 | %td Name: |
|
16 | %td= text_field_tag 'name' |
|
17 | %td= text_field_tag 'name' |
|
17 | %tr |
|
18 | %tr |
|
18 | %td Full name: |
|
19 | %td Full name: |
|
19 | %td |
|
20 | %td |
|
20 | = text_field_tag 'full_name' |
|
21 | = text_field_tag 'full_name' |
|
21 | %span{:class => 'help'} Leave blank to use the same value as the name above. |
|
22 | %span{:class => 'help'} Leave blank to use the same value as the name above. |
|
22 | %tr |
|
23 | %tr |
|
23 | %td Testdata file: |
|
24 | %td Testdata file: |
|
24 | %td= file_field_tag 'file' |
|
25 | %td= file_field_tag 'file' |
|
25 | %tr |
|
26 | %tr |
|
26 | %td |
|
27 | %td |
|
27 | %td |
|
28 | %td |
|
28 | %span{:class => 'help'} |
|
29 | %span{:class => 'help'} |
|
29 | In .zip, .tgz, tar.gz, .tar format. |
|
30 | In .zip, .tgz, tar.gz, .tar format. |
|
30 | It should includes inputs (e.g., 1.in, 2a.in, 2b.in) |
|
31 | It should includes inputs (e.g., 1.in, 2a.in, 2b.in) |
|
31 | and solutions (e.g., 1.sol, 2a.sol, 2b.sol). |
|
32 | and solutions (e.g., 1.sol, 2a.sol, 2b.sol). |
|
32 | %br/ |
|
33 | %br/ |
|
33 | You may put task description in *.html for raw html |
|
34 | You may put task description in *.html for raw html |
|
34 | and *.md or *.markdown for markdown. |
|
35 | and *.md or *.markdown for markdown. |
|
35 | %br/ |
|
36 | %br/ |
|
36 | You may also put a pdf file for the task description |
|
37 | You may also put a pdf file for the task description |
|
37 | %tr |
|
38 | %tr |
|
38 | %td Checker: |
|
39 | %td Checker: |
|
39 | %td= select_tag 'checker', options_for_select([['Text checker','text'],['Float checker','float']], 'text') |
|
40 | %td= select_tag 'checker', options_for_select([['Text checker','text'],['Float checker','float']], 'text') |
|
40 | %tr |
|
41 | %tr |
|
41 | %td |
|
42 | %td |
|
42 | %td |
|
43 | %td |
|
43 | %span{:class => 'help'} |
|
44 | %span{:class => 'help'} |
|
44 | "Text" checker checks if the text (including numbers) is the same, ignoring any whitespace |
|
45 | "Text" checker checks if the text (including numbers) is the same, ignoring any whitespace |
|
45 | %br/ |
|
46 | %br/ |
|
46 | "Float" checker checks if all numbers is within EPSILON error using formula |a-b| < EPSILON * max(|a|,|b|) |
|
47 | "Float" checker checks if all numbers is within EPSILON error using formula |a-b| < EPSILON * max(|a|,|b|) |
|
47 |
|
48 | ||
|
48 | - if @allow_test_pair_import |
|
49 | - if @allow_test_pair_import |
|
49 | %tr |
|
50 | %tr |
|
50 | %td |
|
51 | %td |
|
51 | %td |
|
52 | %td |
|
52 | = check_box_tag 'import_to_db' |
|
53 | = check_box_tag 'import_to_db' |
|
53 | Import test data to database (for a test-pair task) |
|
54 | Import test data to database (for a test-pair task) |
|
54 | %tr |
|
55 | %tr |
|
55 | %td Time limit: |
|
56 | %td Time limit: |
|
56 | %td |
|
57 | %td |
|
57 | = text_field_tag 'time_limit' |
|
58 | = text_field_tag 'time_limit' |
|
58 | %span{:class => 'help'} In seconds. Leave blank to use 1 sec. |
|
59 | %span{:class => 'help'} In seconds. Leave blank to use 1 sec. |
|
59 | %tr |
|
60 | %tr |
@@ -1,49 +1,49 | |||||
|
1 | %h1 Maximum score |
|
1 | %h1 Maximum score |
|
2 |
|
2 | ||
|
3 |
- = form_tag |
|
3 | + = form_tag show_max_score_report_path |
|
4 | .row |
|
4 | .row |
|
5 | .col-md-4 |
|
5 | .col-md-4 |
|
6 | .panel.panel-primary |
|
6 | .panel.panel-primary |
|
7 | .panel-heading |
|
7 | .panel-heading |
|
8 | Problems |
|
8 | Problems |
|
9 | .panel-body |
|
9 | .panel-body |
|
10 | %p |
|
10 | %p |
|
11 | Select problem(s) that we wish to know the score. |
|
11 | Select problem(s) that we wish to know the score. |
|
12 | = label_tag :problem_id, "Problems" |
|
12 | = label_tag :problem_id, "Problems" |
|
13 | = select_tag 'problem_id[]', |
|
13 | = select_tag 'problem_id[]', |
|
14 | options_for_select(Problem.all.collect {|p| ["[#{p.name}] #{p.full_name}", p.id]},params[:problem_id]), |
|
14 | options_for_select(Problem.all.collect {|p| ["[#{p.name}] #{p.full_name}", p.id]},params[:problem_id]), |
|
15 | { class: 'select2 form-control', multiple: "true" } |
|
15 | { class: 'select2 form-control', multiple: "true" } |
|
16 | .col-md-4 |
|
16 | .col-md-4 |
|
17 | .panel.panel-primary |
|
17 | .panel.panel-primary |
|
18 | .panel-heading |
|
18 | .panel-heading |
|
19 | Submission range |
|
19 | Submission range |
|
20 | .panel-body |
|
20 | .panel-body |
|
21 | %p |
|
21 | %p |
|
22 | Input minimum and maximum range of submission ID that should be included. A blank value for min and max means -1 and infinity, respectively. |
|
22 | Input minimum and maximum range of submission ID that should be included. A blank value for min and max means -1 and infinity, respectively. |
|
23 | .form-group |
|
23 | .form-group |
|
24 | = label_tag :from, "Min" |
|
24 | = label_tag :from, "Min" |
|
25 | = text_field_tag 'from_id', @since_id, class: "form-control" |
|
25 | = text_field_tag 'from_id', @since_id, class: "form-control" |
|
26 | .form-group |
|
26 | .form-group |
|
27 | = label_tag :from, "Max" |
|
27 | = label_tag :from, "Max" |
|
28 | = text_field_tag 'to_id', @until_id, class: "form-control" |
|
28 | = text_field_tag 'to_id', @until_id, class: "form-control" |
|
29 | .col-md-4 |
|
29 | .col-md-4 |
|
30 | .panel.panel-primary |
|
30 | .panel.panel-primary |
|
31 | .panel-heading |
|
31 | .panel-heading |
|
32 | Users |
|
32 | Users |
|
33 | .panel-body |
|
33 | .panel-body |
|
34 | .radio |
|
34 | .radio |
|
35 | %label |
|
35 | %label |
|
36 | = radio_button_tag 'users', 'all', (params[:users] == "all") |
|
36 | = radio_button_tag 'users', 'all', (params[:users] == "all") |
|
37 | All users |
|
37 | All users |
|
38 | .radio |
|
38 | .radio |
|
39 | %label |
|
39 | %label |
|
40 | = radio_button_tag 'users', 'enabled', (params[:users] == "enabled") |
|
40 | = radio_button_tag 'users', 'enabled', (params[:users] == "enabled") |
|
41 | Only enabled users |
|
41 | Only enabled users |
|
42 | .row |
|
42 | .row |
|
43 | .col-md-12 |
|
43 | .col-md-12 |
|
44 | = button_tag 'Show', class: "btn btn-primary btn-large", value: "show" |
|
44 | = button_tag 'Show', class: "btn btn-primary btn-large", value: "show" |
|
45 | = button_tag 'Download CSV', class: "btn btn-primary btn-large", value: "download" |
|
45 | = button_tag 'Download CSV', class: "btn btn-primary btn-large", value: "download" |
|
46 |
|
46 | ||
|
47 | - if @scorearray |
|
47 | - if @scorearray |
|
48 | %h2 Result |
|
48 | %h2 Result |
|
49 | =render "score_table" |
|
49 | =render "score_table" |
@@ -6,96 +6,97 | |||||
|
6 | .row |
|
6 | .row |
|
7 | .col-md-12 |
|
7 | .col-md-12 |
|
8 | .alert.alert-info |
|
8 | .alert.alert-info |
|
9 | Write your code in the following box, choose language, and click submit button when finished |
|
9 | Write your code in the following box, choose language, and click submit button when finished |
|
10 | .row |
|
10 | .row |
|
11 | .col-md-8 |
|
11 | .col-md-8 |
|
12 | %div#editor{style: 'height: 500px; border-radius: 7px; font-size: 14px;'} |
|
12 | %div#editor{style: 'height: 500px; border-radius: 7px; font-size: 14px;'} |
|
13 | .col-md-4 |
|
13 | .col-md-4 |
|
14 | - # submission form |
|
14 | - # submission form |
|
15 | = form_tag({controller: :main, :action => 'submit'}, :multipart => true, class: 'form') do |
|
15 | = form_tag({controller: :main, :action => 'submit'}, :multipart => true, class: 'form') do |
|
16 |
|
16 | ||
|
17 | = hidden_field_tag 'editor_text', @source |
|
17 | = hidden_field_tag 'editor_text', @source |
|
18 | = hidden_field_tag 'submission[problem_id]', @problem.id |
|
18 | = hidden_field_tag 'submission[problem_id]', @problem.id |
|
19 | .form-group |
|
19 | .form-group |
|
20 | = label_tag "Task:" |
|
20 | = label_tag "Task:" |
|
21 | = text_field_tag 'asdf', "#{@problem.long_name}", class: 'form-control', disabled: true |
|
21 | = text_field_tag 'asdf', "#{@problem.long_name}", class: 'form-control', disabled: true |
|
22 | .form-group |
|
22 | .form-group |
|
23 | = label_tag "Description:" |
|
23 | = label_tag "Description:" |
|
24 | = link_to_description_if_any "[download] <span class='glyphicon glyphicon-file'></span>".html_safe, @problem |
|
24 | = link_to_description_if_any "[download] <span class='glyphicon glyphicon-file'></span>".html_safe, @problem |
|
25 |
|
25 | ||
|
26 | .form-group |
|
26 | .form-group |
|
27 | = label_tag 'Language:' |
|
27 | = label_tag 'Language:' |
|
28 | = select_tag 'language_id', options_from_collection_for_select(Language.all, 'id', 'pretty_name', @lang_id || Language.find_by_pretty_name("Python").id || Language.first.id), class: 'form-control select', style: "width: 100px" |
|
28 | = select_tag 'language_id', options_from_collection_for_select(Language.all, 'id', 'pretty_name', @lang_id || Language.find_by_pretty_name("Python").id || Language.first.id), class: 'form-control select', style: "width: 100px" |
|
29 | .form-group |
|
29 | .form-group |
|
30 | .input-group |
|
30 | .input-group |
|
31 | %span.input-group-btn |
|
31 | %span.input-group-btn |
|
32 | %span.btn.btn-default.btn-file |
|
32 | %span.btn.btn-default.btn-file |
|
33 | Browse |
|
33 | Browse |
|
34 | = file_field_tag 'load_file' |
|
34 | = file_field_tag 'load_file' |
|
35 | = text_field_tag '' , nil, {readonly: true, class: 'form-control'} |
|
35 | = text_field_tag '' , nil, {readonly: true, class: 'form-control'} |
|
36 | .form-group |
|
36 | .form-group |
|
37 | = submit_tag 'Submit', class: 'btn btn-success', id: 'live_submit', |
|
37 | = submit_tag 'Submit', class: 'btn btn-success', id: 'live_submit', |
|
38 | data: {confirm: "Submitting this source code for task #{@problem.long_name}?"} |
|
38 | data: {confirm: "Submitting this source code for task #{@problem.long_name}?"} |
|
39 | - # latest submission status |
|
39 | - # latest submission status |
|
40 | .panel{class: (@submission && @submission.graded_at) ? "panel-info" : "panel-warning"} |
|
40 | .panel{class: (@submission && @submission.graded_at) ? "panel-info" : "panel-warning"} |
|
41 | .panel-heading |
|
41 | .panel-heading |
|
42 | Latest Submission Status |
|
42 | Latest Submission Status |
|
43 | = link_to "Refresh",get_latest_submission_status_submissions_path(@submission.user,@problem), class: "btn btn-default btn-sm", remote: true if @submission |
|
43 | = link_to "Refresh",get_latest_submission_status_submissions_path(@submission.user,@problem), class: "btn btn-default btn-sm", remote: true if @submission |
|
44 | .panel-body |
|
44 | .panel-body |
|
45 | %div#latest_status |
|
45 | %div#latest_status |
|
46 | - if @submission |
|
46 | - if @submission |
|
47 | = render :partial => 'submission_short', |
|
47 | = render :partial => 'submission_short', |
|
48 | :locals => {submission: @submission, problem_name: @problem.name, problem_id: @problem.id } |
|
48 | :locals => {submission: @submission, problem_name: @problem.name, problem_id: @problem.id } |
|
49 | .row |
|
49 | .row |
|
50 | .col-md-12 |
|
50 | .col-md-12 |
|
51 | %h2 Console |
|
51 | %h2 Console |
|
52 | %textarea#console{style: 'height: 100%; width: 100%;background-color:#000;color:#fff;font-family: consolas, monaco, "Droid Sans Mono";',rows: 20} |
|
52 | %textarea#console{style: 'height: 100%; width: 100%;background-color:#000;color:#fff;font-family: consolas, monaco, "Droid Sans Mono";',rows: 20} |
|
53 |
|
53 | ||
|
|
54 | + - if @submission | ||
|
54 | .modal.fade#compiler{tabindex: -1,role: 'dialog'} |
|
55 | .modal.fade#compiler{tabindex: -1,role: 'dialog'} |
|
55 | .modal-dialog.modal-lg{role:'document'} |
|
56 | .modal-dialog.modal-lg{role:'document'} |
|
56 | .modal-content |
|
57 | .modal-content |
|
57 | .modal-header |
|
58 | .modal-header |
|
58 | %button.close{type: 'button', data: {dismissed: :modal}, aria: {label: 'close'}} |
|
59 | %button.close{type: 'button', data: {dismissed: :modal}, aria: {label: 'close'}} |
|
59 | %span{aria: {hidden: 'true'}, data: {dismiss: 'modal'}} × |
|
60 | %span{aria: {hidden: 'true'}, data: {dismiss: 'modal'}} × |
|
60 | %h4 Compiler message |
|
61 | %h4 Compiler message |
|
61 | .modal-body |
|
62 | .modal-body |
|
62 | %pre#compiler_msg= @submission.compiler_message |
|
63 | %pre#compiler_msg= @submission.compiler_message |
|
63 | .modal-footer |
|
64 | .modal-footer |
|
64 | %button.btn.btn-default{type: 'button', data: {dismiss: 'modal'}} Close |
|
65 | %button.btn.btn-default{type: 'button', data: {dismiss: 'modal'}} Close |
|
65 |
|
66 | ||
|
66 | :javascript |
|
67 | :javascript |
|
67 | $(document).ready(function() { |
|
68 | $(document).ready(function() { |
|
68 | e = ace.edit("editor") |
|
69 | e = ace.edit("editor") |
|
69 | e.setValue($("#text_sourcecode").val()); |
|
70 | e.setValue($("#text_sourcecode").val()); |
|
70 | e.gotoLine(1); |
|
71 | e.gotoLine(1); |
|
71 | $("#language_id").trigger('change'); |
|
72 | $("#language_id").trigger('change'); |
|
72 |
|
73 | ||
|
73 | $("#load_file").on('change',function(evt) { |
|
74 | $("#load_file").on('change',function(evt) { |
|
74 | var file = evt.target.files[0]; |
|
75 | var file = evt.target.files[0]; |
|
75 | var reader = new FileReader(); |
|
76 | var reader = new FileReader(); |
|
76 | reader.onload = function(theFile) { |
|
77 | reader.onload = function(theFile) { |
|
77 | var e = ace.edit("editor") |
|
78 | var e = ace.edit("editor") |
|
78 | e.setValue(theFile.target.result); |
|
79 | e.setValue(theFile.target.result); |
|
79 | e.gotoLine(1); |
|
80 | e.gotoLine(1); |
|
80 | }; |
|
81 | }; |
|
81 | reader.readAsText(file) |
|
82 | reader.readAsText(file) |
|
82 | }); |
|
83 | }); |
|
83 |
|
84 | ||
|
84 | //brython(); |
|
85 | //brython(); |
|
85 | }); |
|
86 | }); |
|
86 |
|
87 | ||
|
87 |
|
88 | ||
|
88 |
|
89 | ||
|
89 |
|
90 | ||
|
90 |
|
91 | ||
|
91 | %script#__main__{type:'text/python3'} |
|
92 | %script#__main__{type:'text/python3'} |
|
92 | :plain |
|
93 | :plain |
|
93 | import sys |
|
94 | import sys |
|
94 | import traceback |
|
95 | import traceback |
|
95 |
|
96 | ||
|
96 | from browser import document as doc |
|
97 | from browser import document as doc |
|
97 | from browser import window, alert, console |
|
98 | from browser import window, alert, console |
|
98 |
|
99 | ||
|
99 | _credits = """ Thanks to CWI, CNRI, BeOpen.com, Zope Corporation and a cast of thousands |
|
100 | _credits = """ Thanks to CWI, CNRI, BeOpen.com, Zope Corporation and a cast of thousands |
|
100 | for supporting Python development. See www.python.org for more information.""" |
|
101 | for supporting Python development. See www.python.org for more information.""" |
|
101 |
|
102 |
@@ -1,165 +1,168 | |||||
|
1 | Rails.application.routes.draw do |
|
1 | Rails.application.routes.draw do |
|
2 | resources :tags |
|
2 | resources :tags |
|
3 | get "sources/direct_edit" |
|
3 | get "sources/direct_edit" |
|
4 |
|
4 | ||
|
5 | root :to => 'main#login' |
|
5 | root :to => 'main#login' |
|
6 |
|
6 | ||
|
7 | #logins |
|
7 | #logins |
|
8 | match 'login/login', to: 'login#login', via: [:get,:post] |
|
8 | match 'login/login', to: 'login#login', via: [:get,:post] |
|
9 |
|
9 | ||
|
10 |
|
10 | ||
|
11 | resources :contests |
|
11 | resources :contests |
|
12 |
|
12 | ||
|
13 | resources :sites |
|
13 | resources :sites |
|
14 |
|
14 | ||
|
15 | resources :test |
|
15 | resources :test |
|
16 |
|
16 | ||
|
17 | resources :messages do |
|
17 | resources :messages do |
|
18 | collection do |
|
18 | collection do |
|
19 | get 'console' |
|
19 | get 'console' |
|
20 | end |
|
20 | end |
|
21 | end |
|
21 | end |
|
22 |
|
22 | ||
|
23 | resources :announcements do |
|
23 | resources :announcements do |
|
24 | member do |
|
24 | member do |
|
25 | get 'toggle','toggle_front' |
|
25 | get 'toggle','toggle_front' |
|
26 | end |
|
26 | end |
|
27 | end |
|
27 | end |
|
28 |
|
28 | ||
|
29 | resources :problems do |
|
29 | resources :problems do |
|
30 | member do |
|
30 | member do |
|
31 | get 'toggle' |
|
31 | get 'toggle' |
|
32 | get 'toggle_test' |
|
32 | get 'toggle_test' |
|
33 | get 'toggle_view_testcase' |
|
33 | get 'toggle_view_testcase' |
|
34 | get 'stat' |
|
34 | get 'stat' |
|
35 | end |
|
35 | end |
|
36 | collection do |
|
36 | collection do |
|
37 | get 'turn_all_off' |
|
37 | get 'turn_all_off' |
|
38 | get 'turn_all_on' |
|
38 | get 'turn_all_on' |
|
39 | get 'import' |
|
39 | get 'import' |
|
40 | get 'manage' |
|
40 | get 'manage' |
|
41 | get 'quick_create' |
|
41 | get 'quick_create' |
|
42 | post 'do_manage' |
|
42 | post 'do_manage' |
|
|
43 | + post 'do_import' | ||
|
43 | end |
|
44 | end |
|
44 | end |
|
45 | end |
|
45 |
|
46 | ||
|
46 | resources :groups do |
|
47 | resources :groups do |
|
47 | member do |
|
48 | member do |
|
48 | post 'add_user', to: 'groups#add_user', as: 'add_user' |
|
49 | post 'add_user', to: 'groups#add_user', as: 'add_user' |
|
49 | delete 'remove_user/:user_id', to: 'groups#remove_user', as: 'remove_user' |
|
50 | delete 'remove_user/:user_id', to: 'groups#remove_user', as: 'remove_user' |
|
50 | delete 'remove_all_user', to: 'groups#remove_all_user', as: 'remove_all_user' |
|
51 | delete 'remove_all_user', to: 'groups#remove_all_user', as: 'remove_all_user' |
|
51 | post 'add_problem', to: 'groups#add_problem', as: 'add_problem' |
|
52 | post 'add_problem', to: 'groups#add_problem', as: 'add_problem' |
|
52 | delete 'remove_problem/:problem_id', to: 'groups#remove_problem', as: 'remove_problem' |
|
53 | delete 'remove_problem/:problem_id', to: 'groups#remove_problem', as: 'remove_problem' |
|
53 | delete 'remove_all_problem', to: 'groups#remove_all_problem', as: 'remove_all_problem' |
|
54 | delete 'remove_all_problem', to: 'groups#remove_all_problem', as: 'remove_all_problem' |
|
54 | end |
|
55 | end |
|
55 | collection do |
|
56 | collection do |
|
56 |
|
57 | ||
|
57 | end |
|
58 | end |
|
58 | end |
|
59 | end |
|
59 |
|
60 | ||
|
60 | resources :testcases, only: [] do |
|
61 | resources :testcases, only: [] do |
|
61 | member do |
|
62 | member do |
|
62 | get 'download_input' |
|
63 | get 'download_input' |
|
63 | get 'download_sol' |
|
64 | get 'download_sol' |
|
64 | end |
|
65 | end |
|
65 | collection do |
|
66 | collection do |
|
66 | get 'show_problem/:problem_id(/:test_num)' => 'testcases#show_problem', as: 'show_problem' |
|
67 | get 'show_problem/:problem_id(/:test_num)' => 'testcases#show_problem', as: 'show_problem' |
|
67 | end |
|
68 | end |
|
68 | end |
|
69 | end |
|
69 |
|
70 | ||
|
70 | resources :grader_configuration, controller: 'configurations' |
|
71 | resources :grader_configuration, controller: 'configurations' |
|
71 |
|
72 | ||
|
72 | resources :users do |
|
73 | resources :users do |
|
73 | member do |
|
74 | member do |
|
74 | get 'toggle_activate', 'toggle_enable' |
|
75 | get 'toggle_activate', 'toggle_enable' |
|
75 | get 'stat' |
|
76 | get 'stat' |
|
76 | end |
|
77 | end |
|
77 | end |
|
78 | end |
|
78 |
|
79 | ||
|
79 | resources :submissions do |
|
80 | resources :submissions do |
|
80 | member do |
|
81 | member do |
|
81 | get 'download' |
|
82 | get 'download' |
|
82 | get 'compiler_msg' |
|
83 | get 'compiler_msg' |
|
83 | get 'rejudge' |
|
84 | get 'rejudge' |
|
|
85 | + get 'source' | ||
|
84 | end |
|
86 | end |
|
85 | collection do |
|
87 | collection do |
|
86 | get 'prob/:problem_id', to: 'submissions#index', as: 'problem' |
|
88 | get 'prob/:problem_id', to: 'submissions#index', as: 'problem' |
|
87 | get 'direct_edit_problem/:problem_id(/:user_id)', to: 'submissions#direct_edit_problem', as: 'direct_edit_problem' |
|
89 | get 'direct_edit_problem/:problem_id(/:user_id)', to: 'submissions#direct_edit_problem', as: 'direct_edit_problem' |
|
88 | get 'get_latest_submission_status/:uid/:pid', to: 'submissions#get_latest_submission_status', as: 'get_latest_submission_status' |
|
90 | get 'get_latest_submission_status/:uid/:pid', to: 'submissions#get_latest_submission_status', as: 'get_latest_submission_status' |
|
89 | end |
|
91 | end |
|
90 | end |
|
92 | end |
|
91 |
|
93 | ||
|
92 |
|
94 | ||
|
93 | #user admin |
|
95 | #user admin |
|
94 | resources :user_admin do |
|
96 | resources :user_admin do |
|
95 | collection do |
|
97 | collection do |
|
96 | match 'bulk_manage', via: [:get, :post] |
|
98 | match 'bulk_manage', via: [:get, :post] |
|
97 | get 'bulk_mail' |
|
99 | get 'bulk_mail' |
|
98 | get 'user_stat' |
|
100 | get 'user_stat' |
|
99 | get 'import' |
|
101 | get 'import' |
|
100 | get 'new_list' |
|
102 | get 'new_list' |
|
101 | get 'admin' |
|
103 | get 'admin' |
|
102 | get 'active' |
|
104 | get 'active' |
|
103 | get 'mass_mailing' |
|
105 | get 'mass_mailing' |
|
104 | post 'grant_admin' |
|
106 | post 'grant_admin' |
|
105 | match 'create_from_list', via: [:get, :post] |
|
107 | match 'create_from_list', via: [:get, :post] |
|
106 | match 'random_all_passwords', via: [:get, :post] |
|
108 | match 'random_all_passwords', via: [:get, :post] |
|
107 | end |
|
109 | end |
|
108 | member do |
|
110 | member do |
|
109 | get 'clear_last_ip' |
|
111 | get 'clear_last_ip' |
|
110 | end |
|
112 | end |
|
111 | end |
|
113 | end |
|
112 |
|
114 | ||
|
113 | resources :contest_management, only: [:index] do |
|
115 | resources :contest_management, only: [:index] do |
|
114 | collection do |
|
116 | collection do |
|
115 | get 'user_stat' |
|
117 | get 'user_stat' |
|
116 | get 'clear_stat' |
|
118 | get 'clear_stat' |
|
117 | get 'clear_all_stat' |
|
119 | get 'clear_all_stat' |
|
|
120 | + get 'change_contest_mode' | ||
|
118 | end |
|
121 | end |
|
119 | end |
|
122 | end |
|
120 |
|
123 | ||
|
121 | #get 'user_admin', to: 'user_admin#index' |
|
124 | #get 'user_admin', to: 'user_admin#index' |
|
122 | #get 'user_admin/bulk_manage', to: 'user_admin#bulk_manage', as: 'bulk_manage_user_admin' |
|
125 | #get 'user_admin/bulk_manage', to: 'user_admin#bulk_manage', as: 'bulk_manage_user_admin' |
|
123 | #post 'user_admin', to: 'user_admin#create' |
|
126 | #post 'user_admin', to: 'user_admin#create' |
|
124 | #delete 'user_admin/:id', to: 'user_admin#destroy', as: 'user_admin_destroy' |
|
127 | #delete 'user_admin/:id', to: 'user_admin#destroy', as: 'user_admin_destroy' |
|
125 |
|
128 | ||
|
126 | #singular resource |
|
129 | #singular resource |
|
127 | #---- BEWARE ---- singular resource maps to plural controller by default, we can override by provide controller name directly |
|
130 | #---- BEWARE ---- singular resource maps to plural controller by default, we can override by provide controller name directly |
|
128 | #report |
|
131 | #report |
|
129 | resource :report, only: [], controller: 'report' do |
|
132 | resource :report, only: [], controller: 'report' do |
|
130 | get 'login' |
|
133 | get 'login' |
|
131 | get 'multiple_login' |
|
134 | get 'multiple_login' |
|
132 | get 'problem_hof/:id', action: 'problem_hof' |
|
135 | get 'problem_hof/:id', action: 'problem_hof' |
|
133 | get 'current_score' |
|
136 | get 'current_score' |
|
134 | get 'max_score' |
|
137 | get 'max_score' |
|
135 | post 'show_max_score' |
|
138 | post 'show_max_score' |
|
136 | end |
|
139 | end |
|
137 | #get 'report/current_score', to: 'report#current_score', as: 'report_current_score' |
|
140 | #get 'report/current_score', to: 'report#current_score', as: 'report_current_score' |
|
138 | #get 'report/problem_hof(/:id)', to: 'report#problem_hof', as: 'report_problem_hof' |
|
141 | #get 'report/problem_hof(/:id)', to: 'report#problem_hof', as: 'report_problem_hof' |
|
139 | #get "report/login" |
|
142 | #get "report/login" |
|
140 | #get 'report/max_score', to: 'report#max_score', as: 'report_max_score' |
|
143 | #get 'report/max_score', to: 'report#max_score', as: 'report_max_score' |
|
141 | #post 'report/show_max_score', to: 'report#show_max_score', as: 'report_show_max_score' |
|
144 | #post 'report/show_max_score', to: 'report#show_max_score', as: 'report_show_max_score' |
|
142 |
|
145 | ||
|
143 | resource :main, only: [], controller: 'main' do |
|
146 | resource :main, only: [], controller: 'main' do |
|
144 | get 'list' |
|
147 | get 'list' |
|
145 | get 'submission(/:id)', action: 'submission', as: 'main_submission' |
|
148 | get 'submission(/:id)', action: 'submission', as: 'main_submission' |
|
146 | post 'submit' |
|
149 | post 'submit' |
|
147 | get 'announcements' |
|
150 | get 'announcements' |
|
148 | get 'help' |
|
151 | get 'help' |
|
149 | end |
|
152 | end |
|
150 | #main |
|
153 | #main |
|
151 | #get "main/list" |
|
154 | #get "main/list" |
|
152 | #get 'main/submission(/:id)', to: 'main#submission', as: 'main_submission' |
|
155 | #get 'main/submission(/:id)', to: 'main#submission', as: 'main_submission' |
|
153 | #post 'main/submit', to: 'main#submit' |
|
156 | #post 'main/submit', to: 'main#submit' |
|
154 | #get 'main/announcements', to: 'main#announcements' |
|
157 | #get 'main/announcements', to: 'main#announcements' |
|
155 |
|
158 | ||
|
156 |
|
159 | ||
|
157 | # |
|
160 | # |
|
158 | get 'tasks/view/:file.:ext' => 'tasks#view' |
|
161 | get 'tasks/view/:file.:ext' => 'tasks#view' |
|
159 | get 'tasks/download/:id/:file.:ext' => 'tasks#download' |
|
162 | get 'tasks/download/:id/:file.:ext' => 'tasks#download' |
|
160 | get 'heartbeat/:id/edit' => 'heartbeat#edit' |
|
163 | get 'heartbeat/:id/edit' => 'heartbeat#edit' |
|
161 |
|
164 | ||
|
162 | #grader |
|
165 | #grader |
|
163 | get 'graders/list', to: 'graders#list', as: 'grader_list' |
|
166 | get 'graders/list', to: 'graders#list', as: 'grader_list' |
|
164 |
|
167 | ||
|
165 |
|
168 |
You need to be logged in to leave comments.
Login now