Description:
add bulk manage for enablind users
Commit status:
[Not Reviewed]
References:
Diff options:
Comments:
0 Commit comments
0 Inline Comments
Unresolved TODOs:
There are no unresolved TODOs
r643:39e4a808eb76 - - 7 files changed: 132 inserted, 7 deleted
@@ -0,0 +1,77 | |||||
|
|
1 | + %h1 Bulk Manage User | ||
|
|
2 | + | ||
|
|
3 | + = form_tag bulk_manage_user_admin_path | ||
|
|
4 | + .row | ||
|
|
5 | + .col-md-6 | ||
|
|
6 | + .panel.panel-primary | ||
|
|
7 | + .panel-title.panel-heading | ||
|
|
8 | + Filter User | ||
|
|
9 | + .panel-body | ||
|
|
10 | + Filtering users whose login match the following MySQL regex | ||
|
|
11 | + .form-group | ||
|
|
12 | + = label_tag "regex", 'Regex Pattern' | ||
|
|
13 | + = text_field_tag "regex", params[:regex], class: 'form-control' | ||
|
|
14 | + %p | ||
|
|
15 | + Example | ||
|
|
16 | + %ul | ||
|
|
17 | + %li | ||
|
|
18 | + %code root | ||
|
|
19 | + matches every user whose login contains "root" | ||
|
|
20 | + %li | ||
|
|
21 | + %code ^56 | ||
|
|
22 | + matches every user whose login starts with "56" | ||
|
|
23 | + %li | ||
|
|
24 | + %code 21$ | ||
|
|
25 | + matches every user whose login ends with "21" | ||
|
|
26 | + .col-md-6 | ||
|
|
27 | + .panel.panel-primary | ||
|
|
28 | + .panel-title.panel-heading | ||
|
|
29 | + Action | ||
|
|
30 | + .panel-body | ||
|
|
31 | + .row.form-group | ||
|
|
32 | + .col-md-6 | ||
|
|
33 | + %label.checkbox-inline | ||
|
|
34 | + = check_box_tag "enabled", true, params[:enabled] | ||
|
|
35 | + Change "Enabled" to | ||
|
|
36 | + .col-md-3 | ||
|
|
37 | + %label.radio-inline | ||
|
|
38 | + = radio_button_tag "enable", 1, params[:enable] == '1', id: 'enable-yes' | ||
|
|
39 | + Yes | ||
|
|
40 | + .col-md-3 | ||
|
|
41 | + %label.radio-inline | ||
|
|
42 | + = radio_button_tag "enable", 0, params[:enable] == '0', id: 'enable-no' | ||
|
|
43 | + No | ||
|
|
44 | + .row.form-group | ||
|
|
45 | + .col-md-6 | ||
|
|
46 | + %label.checkbox-inline | ||
|
|
47 | + = check_box_tag "gen_password", true, params[:gen_password] | ||
|
|
48 | + Generate new random password | ||
|
|
49 | + | ||
|
|
50 | + .row | ||
|
|
51 | + .col-md-12 | ||
|
|
52 | + = submit_tag "Preview Result", class: 'btn btn-default' | ||
|
|
53 | + - if @users | ||
|
|
54 | + .row | ||
|
|
55 | + .col-md-4 | ||
|
|
56 | + - if @action | ||
|
|
57 | + %h2 Confirmation | ||
|
|
58 | + - if @action[:set_enable] | ||
|
|
59 | + .alert.alert-info The following users will be set #{(@action[:enabled] ? 'enable' : 'disable')}. | ||
|
|
60 | + - if @action[:gen_password] | ||
|
|
61 | + .alert.alert-info The password of the following users will be randomly generated. | ||
|
|
62 | + .row | ||
|
|
63 | + .col-md-4 | ||
|
|
64 | + = submit_tag "Perform", class: 'btn btn-primary' | ||
|
|
65 | + .row | ||
|
|
66 | + .col-md-12 | ||
|
|
67 | + The pattern matches #{@users.count} following users. | ||
|
|
68 | + %br | ||
|
|
69 | + - @users.each do |user| | ||
|
|
70 | + = user.login | ||
|
|
71 | + = ' ' | ||
|
|
72 | + = user.full_name | ||
|
|
73 | + = ' ' | ||
|
|
74 | + = "(#{user.remark})" if user.remark | ||
|
|
75 | + %br | ||
|
|
76 | + | ||
|
|
77 | + |
@@ -362,96 +362,129 | |||||
|
362 | redirect_to :action => 'admin' and return |
|
362 | redirect_to :action => 'admin' and return |
|
363 | end |
|
363 | end |
|
364 |
|
364 | ||
|
365 | admin_role = Role.find_by_name('admin') |
|
365 | admin_role = Role.find_by_name('admin') |
|
366 | user.roles.delete(admin_role) |
|
366 | user.roles.delete(admin_role) |
|
367 | flash[:notice] = 'User permission revoked' |
|
367 | flash[:notice] = 'User permission revoked' |
|
368 | redirect_to :action => 'admin' |
|
368 | redirect_to :action => 'admin' |
|
369 | end |
|
369 | end |
|
370 |
|
370 | ||
|
371 | # mass mailing |
|
371 | # mass mailing |
|
372 |
|
372 | ||
|
373 | def mass_mailing |
|
373 | def mass_mailing |
|
374 | end |
|
374 | end |
|
375 |
|
375 | ||
|
376 | def bulk_mail |
|
376 | def bulk_mail |
|
377 | lines = params[:login_list] |
|
377 | lines = params[:login_list] |
|
378 | if !lines or lines.blank? |
|
378 | if !lines or lines.blank? |
|
379 | flash[:notice] = 'You entered an empty list.' |
|
379 | flash[:notice] = 'You entered an empty list.' |
|
380 | redirect_to :action => 'mass_mailing' and return |
|
380 | redirect_to :action => 'mass_mailing' and return |
|
381 | end |
|
381 | end |
|
382 |
|
382 | ||
|
383 | mail_subject = params[:subject] |
|
383 | mail_subject = params[:subject] |
|
384 | if !mail_subject or mail_subject.blank? |
|
384 | if !mail_subject or mail_subject.blank? |
|
385 | flash[:notice] = 'You entered an empty mail subject.' |
|
385 | flash[:notice] = 'You entered an empty mail subject.' |
|
386 | redirect_to :action => 'mass_mailing' and return |
|
386 | redirect_to :action => 'mass_mailing' and return |
|
387 | end |
|
387 | end |
|
388 |
|
388 | ||
|
389 | mail_body = params[:email_body] |
|
389 | mail_body = params[:email_body] |
|
390 | if !mail_body or mail_body.blank? |
|
390 | if !mail_body or mail_body.blank? |
|
391 | flash[:notice] = 'You entered an empty mail body.' |
|
391 | flash[:notice] = 'You entered an empty mail body.' |
|
392 | redirect_to :action => 'mass_mailing' and return |
|
392 | redirect_to :action => 'mass_mailing' and return |
|
393 | end |
|
393 | end |
|
394 |
|
394 | ||
|
395 | note = [] |
|
395 | note = [] |
|
396 | users = [] |
|
396 | users = [] |
|
397 | lines.split("\n").each do |line| |
|
397 | lines.split("\n").each do |line| |
|
398 | user = User.find_by_login(line.chomp) |
|
398 | user = User.find_by_login(line.chomp) |
|
399 | if user |
|
399 | if user |
|
400 | send_mail(user.email, mail_subject, mail_body) |
|
400 | send_mail(user.email, mail_subject, mail_body) |
|
401 | note << user.login |
|
401 | note << user.login |
|
402 | end |
|
402 | end |
|
403 | end |
|
403 | end |
|
404 |
|
404 | ||
|
405 | flash[:notice] = 'User(s) ' + note.join(', ') + |
|
405 | flash[:notice] = 'User(s) ' + note.join(', ') + |
|
406 | ' were successfully modified. ' |
|
406 | ' were successfully modified. ' |
|
407 | redirect_to :action => 'mass_mailing' |
|
407 | redirect_to :action => 'mass_mailing' |
|
408 | end |
|
408 | end |
|
409 |
|
409 | ||
|
|
410 | + #bulk manage | ||
|
|
411 | + def bulk_manage | ||
|
|
412 | + | ||
|
|
413 | + begin | ||
|
|
414 | + @users = User.where('login REGEXP ?',params[:regex]) if params[:regex] | ||
|
|
415 | + @users.count if @users #i don't know why I have to call count, but if I won't exception is not raised | ||
|
|
416 | + rescue Exception | ||
|
|
417 | + flash[:error] = 'Regular Expression is malformed' | ||
|
|
418 | + @users = nil | ||
|
|
419 | + end | ||
|
|
420 | + | ||
|
|
421 | + if params[:commit] | ||
|
|
422 | + @action = {} | ||
|
|
423 | + @action[:set_enable] = params[:enabled] | ||
|
|
424 | + @action[:enabled] = params[:enable] == "1" | ||
|
|
425 | + @action[:gen_password] = params[:gen_password] | ||
|
|
426 | + end | ||
|
|
427 | + | ||
|
|
428 | + if params[:commit] == "Perform" | ||
|
|
429 | + if @action[:set_enable] | ||
|
|
430 | + @users.update_all(enabled: @action[:enabled]) | ||
|
|
431 | + end | ||
|
|
432 | + if @action[:gen_password] | ||
|
|
433 | + @users.each do |u| | ||
|
|
434 | + password = random_password | ||
|
|
435 | + u.password = password | ||
|
|
436 | + u.password_confirmation = password | ||
|
|
437 | + u.save | ||
|
|
438 | + end | ||
|
|
439 | + end | ||
|
|
440 | + end | ||
|
|
441 | + end | ||
|
|
442 | + | ||
|
410 | protected |
|
443 | protected |
|
411 |
|
444 | ||
|
412 | def random_password(length=5) |
|
445 | def random_password(length=5) |
|
413 | chars = 'abcdefghijkmnopqrstuvwxyz23456789' |
|
446 | chars = 'abcdefghijkmnopqrstuvwxyz23456789' |
|
414 | newpass = "" |
|
447 | newpass = "" |
|
415 | length.times { newpass << chars[rand(chars.size-1)] } |
|
448 | length.times { newpass << chars[rand(chars.size-1)] } |
|
416 | return newpass |
|
449 | return newpass |
|
417 | end |
|
450 | end |
|
418 |
|
451 | ||
|
419 | def import_from_file(f) |
|
452 | def import_from_file(f) |
|
420 | data_hash = YAML.load(f) |
|
453 | data_hash = YAML.load(f) |
|
421 | @import_log = "" |
|
454 | @import_log = "" |
|
422 |
|
455 | ||
|
423 | country_data = data_hash[:countries] |
|
456 | country_data = data_hash[:countries] |
|
424 | site_data = data_hash[:sites] |
|
457 | site_data = data_hash[:sites] |
|
425 | user_data = data_hash[:users] |
|
458 | user_data = data_hash[:users] |
|
426 |
|
459 | ||
|
427 | # import country |
|
460 | # import country |
|
428 | countries = {} |
|
461 | countries = {} |
|
429 | country_data.each_pair do |id,country| |
|
462 | country_data.each_pair do |id,country| |
|
430 | c = Country.find_by_name(country[:name]) |
|
463 | c = Country.find_by_name(country[:name]) |
|
431 | if c!=nil |
|
464 | if c!=nil |
|
432 | countries[id] = c |
|
465 | countries[id] = c |
|
433 | @import_log << "Found #{country[:name]}\n" |
|
466 | @import_log << "Found #{country[:name]}\n" |
|
434 | else |
|
467 | else |
|
435 | countries[id] = Country.new(:name => country[:name]) |
|
468 | countries[id] = Country.new(:name => country[:name]) |
|
436 | countries[id].save |
|
469 | countries[id].save |
|
437 | @import_log << "Created #{country[:name]}\n" |
|
470 | @import_log << "Created #{country[:name]}\n" |
|
438 | end |
|
471 | end |
|
439 | end |
|
472 | end |
|
440 |
|
473 | ||
|
441 | # import sites |
|
474 | # import sites |
|
442 | sites = {} |
|
475 | sites = {} |
|
443 | site_data.each_pair do |id,site| |
|
476 | site_data.each_pair do |id,site| |
|
444 | s = Site.find_by_name(site[:name]) |
|
477 | s = Site.find_by_name(site[:name]) |
|
445 | if s!=nil |
|
478 | if s!=nil |
|
446 | @import_log << "Found #{site[:name]}\n" |
|
479 | @import_log << "Found #{site[:name]}\n" |
|
447 | else |
|
480 | else |
|
448 | s = Site.new(:name => site[:name]) |
|
481 | s = Site.new(:name => site[:name]) |
|
449 | @import_log << "Created #{site[:name]}\n" |
|
482 | @import_log << "Created #{site[:name]}\n" |
|
450 | end |
|
483 | end |
|
451 | s.password = site[:password] |
|
484 | s.password = site[:password] |
|
452 | s.country = countries[site[:country_id]] |
|
485 | s.country = countries[site[:country_id]] |
|
453 | s.save |
|
486 | s.save |
|
454 | sites[id] = s |
|
487 | sites[id] = s |
|
455 | end |
|
488 | end |
|
456 |
|
489 | ||
|
457 | # import users |
|
490 | # import users |
@@ -16,97 +16,99 | |||||
|
16 |
|
16 | ||
|
17 | def self.available_problems |
|
17 | def self.available_problems |
|
18 | available.order(date_added: :desc).order(:name) |
|
18 | available.order(date_added: :desc).order(:name) |
|
19 | #Problem.available.all(:order => "date_added DESC, name ASC") |
|
19 | #Problem.available.all(:order => "date_added DESC, name ASC") |
|
20 | end |
|
20 | end |
|
21 |
|
21 | ||
|
22 | def self.create_from_import_form_params(params, old_problem=nil) |
|
22 | def self.create_from_import_form_params(params, old_problem=nil) |
|
23 | org_problem = old_problem || Problem.new |
|
23 | org_problem = old_problem || Problem.new |
|
24 | import_params, problem = Problem.extract_params_and_check(params, |
|
24 | import_params, problem = Problem.extract_params_and_check(params, |
|
25 | org_problem) |
|
25 | org_problem) |
|
26 |
|
26 | ||
|
27 | if !problem.errors.empty? |
|
27 | if !problem.errors.empty? |
|
28 | return problem, 'Error importing' |
|
28 | return problem, 'Error importing' |
|
29 | end |
|
29 | end |
|
30 |
|
30 | ||
|
31 | problem.full_score = 100 |
|
31 | problem.full_score = 100 |
|
32 | problem.date_added = Time.new |
|
32 | problem.date_added = Time.new |
|
33 | problem.test_allowed = true |
|
33 | problem.test_allowed = true |
|
34 | problem.output_only = false |
|
34 | problem.output_only = false |
|
35 | problem.available = false |
|
35 | problem.available = false |
|
36 |
|
36 | ||
|
37 | if not problem.save |
|
37 | if not problem.save |
|
38 | return problem, 'Error importing' |
|
38 | return problem, 'Error importing' |
|
39 | end |
|
39 | end |
|
40 |
|
40 | ||
|
41 | import_to_db = params.has_key? :import_to_db |
|
41 | import_to_db = params.has_key? :import_to_db |
|
42 |
|
42 | ||
|
43 | importer = TestdataImporter.new(problem) |
|
43 | importer = TestdataImporter.new(problem) |
|
44 |
|
44 | ||
|
45 | if not importer.import_from_file(import_params[:file], |
|
45 | if not importer.import_from_file(import_params[:file], |
|
46 | import_params[:time_limit], |
|
46 | import_params[:time_limit], |
|
47 | import_params[:memory_limit], |
|
47 | import_params[:memory_limit], |
|
48 | import_params[:checker_name], |
|
48 | import_params[:checker_name], |
|
49 | import_to_db) |
|
49 | import_to_db) |
|
50 | problem.errors.add(:base,'Import error.') |
|
50 | problem.errors.add(:base,'Import error.') |
|
51 | end |
|
51 | end |
|
52 |
|
52 | ||
|
53 | return problem, importer.log_msg |
|
53 | return problem, importer.log_msg |
|
54 | end |
|
54 | end |
|
55 |
|
55 | ||
|
56 | def self.download_file_basedir |
|
56 | def self.download_file_basedir |
|
57 | return "#{Rails.root}/data/tasks" |
|
57 | return "#{Rails.root}/data/tasks" |
|
58 | end |
|
58 | end |
|
59 |
|
59 | ||
|
60 | def get_submission_stat |
|
60 | def get_submission_stat |
|
61 | result = Hash.new |
|
61 | result = Hash.new |
|
62 | #total number of submission |
|
62 | #total number of submission |
|
63 | result[:total_sub] = Submission.where(problem_id: self.id).count |
|
63 | result[:total_sub] = Submission.where(problem_id: self.id).count |
|
64 |
- result[:attempted_user] = Submission.where(problem_id: self.id).group |
|
64 | + result[:attempted_user] = Submission.where(problem_id: self.id).group(:user_id) |
|
|
65 | + result[:pass] = Submission.where(problem_id: self.id).where("points >= ?",self.full_score).count | ||
|
|
66 | + return result | ||
|
65 | end |
|
67 | end |
|
66 |
|
68 | ||
|
67 | def long_name |
|
69 | def long_name |
|
68 | "[#{name}] #{full_name}" |
|
70 | "[#{name}] #{full_name}" |
|
69 | end |
|
71 | end |
|
70 |
|
72 | ||
|
71 | protected |
|
73 | protected |
|
72 |
|
74 | ||
|
73 | def self.to_i_or_default(st, default) |
|
75 | def self.to_i_or_default(st, default) |
|
74 | if st!='' |
|
76 | if st!='' |
|
75 | result = st.to_i |
|
77 | result = st.to_i |
|
76 | end |
|
78 | end |
|
77 | result ||= default |
|
79 | result ||= default |
|
78 | end |
|
80 | end |
|
79 |
|
81 | ||
|
80 | def self.to_f_or_default(st, default) |
|
82 | def self.to_f_or_default(st, default) |
|
81 | if st!='' |
|
83 | if st!='' |
|
82 | result = st.to_f |
|
84 | result = st.to_f |
|
83 | end |
|
85 | end |
|
84 | result ||= default |
|
86 | result ||= default |
|
85 | end |
|
87 | end |
|
86 |
|
88 | ||
|
87 | def self.extract_params_and_check(params, problem) |
|
89 | def self.extract_params_and_check(params, problem) |
|
88 | time_limit = Problem.to_f_or_default(params[:time_limit], |
|
90 | time_limit = Problem.to_f_or_default(params[:time_limit], |
|
89 | DEFAULT_TIME_LIMIT) |
|
91 | DEFAULT_TIME_LIMIT) |
|
90 | memory_limit = Problem.to_i_or_default(params[:memory_limit], |
|
92 | memory_limit = Problem.to_i_or_default(params[:memory_limit], |
|
91 | DEFAULT_MEMORY_LIMIT) |
|
93 | DEFAULT_MEMORY_LIMIT) |
|
92 |
|
94 | ||
|
93 | if time_limit<=0 or time_limit >60 |
|
95 | if time_limit<=0 or time_limit >60 |
|
94 | problem.errors.add(:base,'Time limit out of range.') |
|
96 | problem.errors.add(:base,'Time limit out of range.') |
|
95 | end |
|
97 | end |
|
96 |
|
98 | ||
|
97 | if memory_limit==0 and params[:memory_limit]!='0' |
|
99 | if memory_limit==0 and params[:memory_limit]!='0' |
|
98 | problem.errors.add(:base,'Memory limit format errors.') |
|
100 | problem.errors.add(:base,'Memory limit format errors.') |
|
99 | elsif memory_limit<=0 or memory_limit >512 |
|
101 | elsif memory_limit<=0 or memory_limit >512 |
|
100 | problem.errors.add(:base,'Memory limit out of range.') |
|
102 | problem.errors.add(:base,'Memory limit out of range.') |
|
101 | end |
|
103 | end |
|
102 |
|
104 | ||
|
103 | if params[:file]==nil or params[:file]=='' |
|
105 | if params[:file]==nil or params[:file]=='' |
|
104 | problem.errors.add(:base,'No testdata file.') |
|
106 | problem.errors.add(:base,'No testdata file.') |
|
105 | end |
|
107 | end |
|
106 |
|
108 | ||
|
107 | checker_name = 'text' |
|
109 | checker_name = 'text' |
|
108 | if ['text','float'].include? params[:checker] |
|
110 | if ['text','float'].include? params[:checker] |
|
109 | checker_name = params[:checker] |
|
111 | checker_name = params[:checker] |
|
110 | end |
|
112 | end |
|
111 |
|
113 | ||
|
112 | file = params[:file] |
|
114 | file = params[:file] |
@@ -1,18 +1,22 | |||||
|
1 | %tr |
|
1 | %tr |
|
2 | %td |
|
2 | %td |
|
|
3 | + - if @current_user and @current_user.admin? | ||
|
|
4 | + = link_to problem.name, stat_problem_path(problem) | ||
|
|
5 | + - else | ||
|
3 | = "#{problem.name}" |
|
6 | = "#{problem.name}" |
|
4 | %td |
|
7 | %td |
|
5 | = "#{problem.full_name}" |
|
8 | = "#{problem.full_name}" |
|
|
9 | + | ||
|
6 | %br |
|
10 | %br |
|
7 | = link_to_description_if_any "[#{t 'main.problem_desc'}] <span class='glyphicon glyphicon-file'></span>".html_safe, problem |
|
11 | = link_to_description_if_any "[#{t 'main.problem_desc'}] <span class='glyphicon glyphicon-file'></span>".html_safe, problem |
|
8 | %td |
|
12 | %td |
|
9 | = @prob_submissions[problem.id][:count] |
|
13 | = @prob_submissions[problem.id][:count] |
|
10 | = link_to "[subs]", main_submission_path(problem.id) |
|
14 | = link_to "[subs]", main_submission_path(problem.id) |
|
11 | %td |
|
15 | %td |
|
12 | = render :partial => 'submission_short', |
|
16 | = render :partial => 'submission_short', |
|
13 | :locals => {:submission => @prob_submissions[problem.id][:submission], :problem_name => problem.name, :problem_id => problem.id } |
|
17 | :locals => {:submission => @prob_submissions[problem.id][:submission], :problem_name => problem.name, :problem_id => problem.id } |
|
14 | %td |
|
18 | %td |
|
15 | - if @prob_submissions[problem.id][:submission] |
|
19 | - if @prob_submissions[problem.id][:submission] |
|
16 | = link_to 'Edit', edit_submission_path(@prob_submissions[problem.id][:submission]), class: 'btn btn-success' |
|
20 | = link_to 'Edit', edit_submission_path(@prob_submissions[problem.id][:submission]), class: 'btn btn-success' |
|
17 | - else |
|
21 | - else |
|
18 | = link_to 'New', direct_edit_problem_submissions_path(problem.id), class: 'btn btn-success' |
|
22 | = link_to 'New', direct_edit_problem_submissions_path(problem.id), class: 'btn btn-success' |
@@ -1,92 +1,93 | |||||
|
1 | %h1 Listing users |
|
1 | %h1 Listing users |
|
2 |
|
2 | ||
|
3 | .panel.panel-primary |
|
3 | .panel.panel-primary |
|
4 | .panel-title.panel-heading |
|
4 | .panel-title.panel-heading |
|
5 | Quick Add |
|
5 | Quick Add |
|
6 | .panel-body |
|
6 | .panel-body |
|
7 | = form_tag( {method: 'post'}, {class: 'form-inline'}) do |
|
7 | = form_tag( {method: 'post'}, {class: 'form-inline'}) do |
|
8 | .form-group |
|
8 | .form-group |
|
9 | = label_tag 'user_login', 'Login' |
|
9 | = label_tag 'user_login', 'Login' |
|
10 | = text_field 'user', 'login', :size => 10,class: 'form-control' |
|
10 | = text_field 'user', 'login', :size => 10,class: 'form-control' |
|
11 | .form-group |
|
11 | .form-group |
|
12 | = label_tag 'user_full_name', 'Full Name' |
|
12 | = label_tag 'user_full_name', 'Full Name' |
|
13 | = text_field 'user', 'full_name', :size => 10,class: 'form-control' |
|
13 | = text_field 'user', 'full_name', :size => 10,class: 'form-control' |
|
14 | .form-group |
|
14 | .form-group |
|
15 | = label_tag 'user_password', 'Password' |
|
15 | = label_tag 'user_password', 'Password' |
|
16 | = text_field 'user', 'password', :size => 10,class: 'form-control' |
|
16 | = text_field 'user', 'password', :size => 10,class: 'form-control' |
|
17 | .form-group |
|
17 | .form-group |
|
18 | = label_tag 'user_password_confirmation', 'Confirm' |
|
18 | = label_tag 'user_password_confirmation', 'Confirm' |
|
19 | = text_field 'user', 'password_confirmation', :size => 10,class: 'form-control' |
|
19 | = text_field 'user', 'password_confirmation', :size => 10,class: 'form-control' |
|
20 | .form-group |
|
20 | .form-group |
|
21 | = label_tag 'user_email', 'email' |
|
21 | = label_tag 'user_email', 'email' |
|
22 | = text_field 'user', 'email', :size => 10,class: 'form-control' |
|
22 | = text_field 'user', 'email', :size => 10,class: 'form-control' |
|
23 | =submit_tag "Create", class: 'btn btn-primary' |
|
23 | =submit_tag "Create", class: 'btn btn-primary' |
|
24 |
|
24 | ||
|
25 | .panel.panel-primary |
|
25 | .panel.panel-primary |
|
26 | .panel-title.panel-heading |
|
26 | .panel-title.panel-heading |
|
27 | Import from site management |
|
27 | Import from site management |
|
28 | .panel-body |
|
28 | .panel-body |
|
29 | = form_tag({:action => 'import'}, :multipart => true,class: 'form form-inline') do |
|
29 | = form_tag({:action => 'import'}, :multipart => true,class: 'form form-inline') do |
|
30 | .form-group |
|
30 | .form-group |
|
31 | = label_tag :file, 'File:' |
|
31 | = label_tag :file, 'File:' |
|
32 | .input-group |
|
32 | .input-group |
|
33 | %span.input-group-btn |
|
33 | %span.input-group-btn |
|
34 | %span.btn.btn-default.btn-file |
|
34 | %span.btn.btn-default.btn-file |
|
35 | Browse |
|
35 | Browse |
|
36 | = file_field_tag 'file' |
|
36 | = file_field_tag 'file' |
|
37 | = text_field_tag '' , nil, {readonly: true, class: 'form-control'} |
|
37 | = text_field_tag '' , nil, {readonly: true, class: 'form-control'} |
|
38 | = submit_tag 'Submit', class: 'btn btn-default' |
|
38 | = submit_tag 'Submit', class: 'btn btn-default' |
|
39 |
|
39 | ||
|
40 |
|
40 | ||
|
41 | %p |
|
41 | %p |
|
42 | = link_to '+ New user', { :action => 'new' }, { class: 'btn btn-success '} |
|
42 | = link_to '+ New user', { :action => 'new' }, { class: 'btn btn-success '} |
|
43 | = link_to '+ New list of users', { :action => 'new_list' }, { class: 'btn btn-success '} |
|
43 | = link_to '+ New list of users', { :action => 'new_list' }, { class: 'btn btn-success '} |
|
44 | = link_to 'View administrators',{ :action => 'admin'}, { class: 'btn btn-default '} |
|
44 | = link_to 'View administrators',{ :action => 'admin'}, { class: 'btn btn-default '} |
|
|
45 | + = link_to 'Bulk Manage', bulk_manage_user_admin_path , { class: 'btn btn-default '} | ||
|
45 | = link_to 'Random passwords',{ :action => 'random_all_passwords'}, { class: 'btn btn-default '} |
|
46 | = link_to 'Random passwords',{ :action => 'random_all_passwords'}, { class: 'btn btn-default '} |
|
46 | = link_to 'View active users',{ :action => 'active'}, { class: 'btn btn-default '} |
|
47 | = link_to 'View active users',{ :action => 'active'}, { class: 'btn btn-default '} |
|
47 | = link_to 'Mass mailing',{ :action => 'mass_mailing'}, { class: 'btn btn-default '} |
|
48 | = link_to 'Mass mailing',{ :action => 'mass_mailing'}, { class: 'btn btn-default '} |
|
48 |
|
49 | ||
|
49 | - if GraderConfiguration.multicontests? |
|
50 | - if GraderConfiguration.multicontests? |
|
50 | %br/ |
|
51 | %br/ |
|
51 | %b Multi-contest: |
|
52 | %b Multi-contest: |
|
52 | = link_to '[Manage bulk users in contests]', :action => 'contest_management' |
|
53 | = link_to '[Manage bulk users in contests]', :action => 'contest_management' |
|
53 | View users in: |
|
54 | View users in: |
|
54 | - @contests.each do |contest| |
|
55 | - @contests.each do |contest| |
|
55 | = link_to "[#{contest.name}]", :action => 'contests', :id => contest.id |
|
56 | = link_to "[#{contest.name}]", :action => 'contests', :id => contest.id |
|
56 | = link_to "[no contest]", :action => 'contests', :id => 'none' |
|
57 | = link_to "[no contest]", :action => 'contests', :id => 'none' |
|
57 |
|
58 | ||
|
58 | Total #{@user_count} users | |
|
59 | Total #{@user_count} users | |
|
59 | - if !@paginated |
|
60 | - if !@paginated |
|
60 | Display all users. |
|
61 | Display all users. |
|
61 | \#{link_to '[show in pages]', :action => 'index', :page => '1'} |
|
62 | \#{link_to '[show in pages]', :action => 'index', :page => '1'} |
|
62 | - else |
|
63 | - else |
|
63 | Display in pages. |
|
64 | Display in pages. |
|
64 | \#{link_to '[display all]', :action => 'index', :page => 'all'} | |
|
65 | \#{link_to '[display all]', :action => 'index', :page => 'all'} | |
|
65 | \#{will_paginate @users, :container => false} |
|
66 | \#{will_paginate @users, :container => false} |
|
66 |
|
67 | ||
|
67 |
|
68 | ||
|
68 | %table.table.table-hover.table-condense |
|
69 | %table.table.table-hover.table-condense |
|
69 | %thead |
|
70 | %thead |
|
70 | %th Login |
|
71 | %th Login |
|
71 | %th Full name |
|
72 | %th Full name |
|
72 | %th email |
|
73 | %th email |
|
73 | %th Remark |
|
74 | %th Remark |
|
74 | %th |
|
75 | %th |
|
75 | Activated |
|
76 | Activated |
|
76 | %sup{class: 'text-primary',data: {toggle: 'tooltip', placement: 'top'}, title: 'User has already confirmed the email?' } [?] |
|
77 | %sup{class: 'text-primary',data: {toggle: 'tooltip', placement: 'top'}, title: 'User has already confirmed the email?' } [?] |
|
77 | %th |
|
78 | %th |
|
78 | Enabled |
|
79 | Enabled |
|
79 | %sup{class: 'text-primary',data: {toggle: 'tooltip', placement: 'top'}, title: 'Allow the user to login?' } [?] |
|
80 | %sup{class: 'text-primary',data: {toggle: 'tooltip', placement: 'top'}, title: 'Allow the user to login?' } [?] |
|
80 | %th Last IP |
|
81 | %th Last IP |
|
81 | %th |
|
82 | %th |
|
82 | %th |
|
83 | %th |
|
83 | %th |
|
84 | %th |
|
84 | %th |
|
85 | %th |
|
85 | - for user in @users |
|
86 | - for user in @users |
|
86 | %tr |
|
87 | %tr |
|
87 | %td= link_to user.login, stat_user_path(user) |
|
88 | %td= link_to user.login, stat_user_path(user) |
|
88 | %td= user.full_name |
|
89 | %td= user.full_name |
|
89 | %td= user.email |
|
90 | %td= user.email |
|
90 | %td= user.remark |
|
91 | %td= user.remark |
|
91 | %td= toggle_button(user.activated?, toggle_activate_user_path(user),"toggle_activate_user_#{user.id}") |
|
92 | %td= toggle_button(user.activated?, toggle_activate_user_path(user),"toggle_activate_user_#{user.id}") |
|
92 | %td= toggle_button(user.enabled?, toggle_enable_user_path(user),"toggle_enable_user_#{user.id}") |
|
93 | %td= toggle_button(user.enabled?, toggle_enable_user_path(user),"toggle_enable_user_#{user.id}") |
@@ -1,8 +1,9 | |||||
|
1 | <h1>Adding list of users</h1> |
|
1 | <h1>Adding list of users</h1> |
|
2 |
|
2 | ||
|
3 | <%= form_tag :action => 'create_from_list' do %> |
|
3 | <%= form_tag :action => 'create_from_list' do %> |
|
4 | - <%= submit_tag 'create users' %><br/> |
|
4 | + <%= submit_tag 'create users',class: 'btn btn-success'%><br/> |
|
5 | - List of user information in this format: <tt>user_id,name(,passwd(,alias))</tt><br/> |
|
5 | + List of user information in this format: <tt>user_id,name(,passwd(,alias(,remark)))</tt><br/> |
|
6 |
- Note that <tt>passwd</tt> and <tt> |
|
6 | + Note that <tt>passwd, alias</tt> and <tt> remark </tt>is optional.<br /> |
|
|
7 | + When <tt>passwd</tt> or <tt>alias</tt> is empty, the original value will be used instead.<br/> | ||
|
7 | <%= text_area_tag 'user_list', nil, :rows => 50, :cols => 80 %> |
|
8 | <%= text_area_tag 'user_list', nil, :rows => 50, :cols => 80 %> |
|
8 | <% end %> |
|
9 | <% end %> |
@@ -18,75 +18,82 | |||||
|
18 |
|
18 | ||
|
19 | resources :problems do |
|
19 | resources :problems do |
|
20 | member do |
|
20 | member do |
|
21 | get 'toggle' |
|
21 | get 'toggle' |
|
22 | get 'toggle_test' |
|
22 | get 'toggle_test' |
|
23 | get 'toggle_view_testcase' |
|
23 | get 'toggle_view_testcase' |
|
24 | get 'stat' |
|
24 | get 'stat' |
|
25 | end |
|
25 | end |
|
26 | collection do |
|
26 | collection do |
|
27 | get 'turn_all_off' |
|
27 | get 'turn_all_off' |
|
28 | get 'turn_all_on' |
|
28 | get 'turn_all_on' |
|
29 | get 'import' |
|
29 | get 'import' |
|
30 | get 'manage' |
|
30 | get 'manage' |
|
31 | end |
|
31 | end |
|
32 |
|
32 | ||
|
33 | end |
|
33 | end |
|
34 |
|
34 | ||
|
35 | resources :testcases, only: [] do |
|
35 | resources :testcases, only: [] do |
|
36 | member do |
|
36 | member do |
|
37 | get 'download_input' |
|
37 | get 'download_input' |
|
38 | get 'download_sol' |
|
38 | get 'download_sol' |
|
39 | end |
|
39 | end |
|
40 | collection do |
|
40 | collection do |
|
41 | get 'show_problem/:problem_id(/:test_num)' => 'testcases#show_problem', as: 'show_problem' |
|
41 | get 'show_problem/:problem_id(/:test_num)' => 'testcases#show_problem', as: 'show_problem' |
|
42 | end |
|
42 | end |
|
43 | end |
|
43 | end |
|
44 |
|
44 | ||
|
45 | resources :grader_configuration, controller: 'configurations' |
|
45 | resources :grader_configuration, controller: 'configurations' |
|
46 |
|
46 | ||
|
47 | resources :users do |
|
47 | resources :users do |
|
48 | member do |
|
48 | member do |
|
49 | get 'toggle_activate', 'toggle_enable' |
|
49 | get 'toggle_activate', 'toggle_enable' |
|
50 | get 'stat' |
|
50 | get 'stat' |
|
51 | end |
|
51 | end |
|
52 | end |
|
52 | end |
|
53 |
|
53 | ||
|
54 | resources :submissions do |
|
54 | resources :submissions do |
|
55 | member do |
|
55 | member do |
|
56 | get 'download' |
|
56 | get 'download' |
|
57 | get 'compiler_msg' |
|
57 | get 'compiler_msg' |
|
58 | end |
|
58 | end |
|
59 | collection do |
|
59 | collection do |
|
60 | get 'prob/:problem_id', to: 'submissions#index', as: 'problem' |
|
60 | get 'prob/:problem_id', to: 'submissions#index', as: 'problem' |
|
61 | get 'direct_edit_problem/:problem_id', to: 'submissions#direct_edit_problem', as: 'direct_edit_problem' |
|
61 | get 'direct_edit_problem/:problem_id', to: 'submissions#direct_edit_problem', as: 'direct_edit_problem' |
|
62 | get 'get_latest_submission_status/:uid/:pid', to: 'submissions#get_latest_submission_status', as: 'get_latest_submission_status' |
|
62 | get 'get_latest_submission_status/:uid/:pid', to: 'submissions#get_latest_submission_status', as: 'get_latest_submission_status' |
|
63 | end |
|
63 | end |
|
64 | end |
|
64 | end |
|
65 |
|
65 | ||
|
66 | - get 'tasks/view/:file.:ext' => 'tasks#view' |
|
66 | + |
|
67 | - get 'tasks/download/:id/:file.:ext' => 'tasks#download' |
|
||
|
68 | - get 'heartbeat/:id/edit' => 'heartbeat#edit' |
|
||
|
69 |
|
67 | ||
|
70 | #main |
|
68 | #main |
|
71 | get "main/list" |
|
69 | get "main/list" |
|
72 | get 'main/submission(/:id)', to: 'main#submission', as: 'main_submission' |
|
70 | get 'main/submission(/:id)', to: 'main#submission', as: 'main_submission' |
|
73 |
|
71 | ||
|
|
72 | + #user admin | ||
|
|
73 | + get 'user_admin/bulk_manage', to: 'user_admin#bulk_manage', as: 'bulk_manage_user_admin' | ||
|
|
74 | + | ||
|
74 | #report |
|
75 | #report |
|
75 | get 'report/current_score', to: 'report#current_score', as: 'report_current_score' |
|
76 | get 'report/current_score', to: 'report#current_score', as: 'report_current_score' |
|
76 | get 'report/problem_hof(/:id)', to: 'report#problem_hof', as: 'report_problem_hof' |
|
77 | get 'report/problem_hof(/:id)', to: 'report#problem_hof', as: 'report_problem_hof' |
|
77 | get "report/login" |
|
78 | get "report/login" |
|
78 | get 'report/max_score', to: 'report#max_score', as: 'report_max_score' |
|
79 | get 'report/max_score', to: 'report#max_score', as: 'report_max_score' |
|
79 | post 'report/show_max_score', to: 'report#show_max_score', as: 'report_show_max_score' |
|
80 | post 'report/show_max_score', to: 'report#show_max_score', as: 'report_show_max_score' |
|
80 |
|
81 | ||
|
|
82 | + | ||
|
|
83 | + # | ||
|
|
84 | + get 'tasks/view/:file.:ext' => 'tasks#view' | ||
|
|
85 | + get 'tasks/download/:id/:file.:ext' => 'tasks#download' | ||
|
|
86 | + get 'heartbeat/:id/edit' => 'heartbeat#edit' | ||
|
|
87 | + | ||
|
81 | #grader |
|
88 | #grader |
|
82 | get 'graders/list', to: 'graders#list', as: 'grader_list' |
|
89 | get 'graders/list', to: 'graders#list', as: 'grader_list' |
|
83 |
|
90 | ||
|
84 |
|
91 | ||
|
85 | get 'heartbeat/:id/edit' => 'heartbeat#edit' |
|
92 | get 'heartbeat/:id/edit' => 'heartbeat#edit' |
|
86 |
|
93 | ||
|
87 | # See how all your routes lay out with "rake routes" |
|
94 | # See how all your routes lay out with "rake routes" |
|
88 |
|
95 | ||
|
89 | # This is a legacy wild controller route that's not recommended for RESTful applications. |
|
96 | # This is a legacy wild controller route that's not recommended for RESTful applications. |
|
90 | # Note: This route will make all actions in every controller accessible via GET requests. |
|
97 | # Note: This route will make all actions in every controller accessible via GET requests. |
|
91 | match ':controller(/:action(/:id))(.:format)', via: [:get, :post] |
|
98 | match ':controller(/:action(/:id))(.:format)', via: [:get, :post] |
|
92 | end |
|
99 | end |
You need to be logged in to leave comments.
Login now