Description:
switch to strong parameter for mass update (have not finished the problem controller yet)
Commit status:
[Not Reviewed]
References:
Comments:
0 Commit comments 0 Inline Comments
Unresolved TODOs:
There are no unresolved TODOs
Add another comment

r617:f062e467ef5c - - 10 files changed: 42 inserted, 63 deleted

@@ -21,91 +21,97
21 def show
21 def show
22 @announcement = Announcement.find(params[:id])
22 @announcement = Announcement.find(params[:id])
23
23
24 respond_to do |format|
24 respond_to do |format|
25 format.html # show.html.erb
25 format.html # show.html.erb
26 format.xml { render :xml => @announcement }
26 format.xml { render :xml => @announcement }
27 end
27 end
28 end
28 end
29
29
30 # GET /announcements/new
30 # GET /announcements/new
31 # GET /announcements/new.xml
31 # GET /announcements/new.xml
32 def new
32 def new
33 @announcement = Announcement.new
33 @announcement = Announcement.new
34
34
35 respond_to do |format|
35 respond_to do |format|
36 format.html # new.html.erb
36 format.html # new.html.erb
37 format.xml { render :xml => @announcement }
37 format.xml { render :xml => @announcement }
38 end
38 end
39 end
39 end
40
40
41 # GET /announcements/1/edit
41 # GET /announcements/1/edit
42 def edit
42 def edit
43 @announcement = Announcement.find(params[:id])
43 @announcement = Announcement.find(params[:id])
44 end
44 end
45
45
46 # POST /announcements
46 # POST /announcements
47 # POST /announcements.xml
47 # POST /announcements.xml
48 def create
48 def create
49 @announcement = Announcement.new(params[:announcement])
49 @announcement = Announcement.new(params[:announcement])
50
50
51 respond_to do |format|
51 respond_to do |format|
52 if @announcement.save
52 if @announcement.save
53 flash[:notice] = 'Announcement was successfully created.'
53 flash[:notice] = 'Announcement was successfully created.'
54 format.html { redirect_to(@announcement) }
54 format.html { redirect_to(@announcement) }
55 format.xml { render :xml => @announcement, :status => :created, :location => @announcement }
55 format.xml { render :xml => @announcement, :status => :created, :location => @announcement }
56 else
56 else
57 format.html { render :action => "new" }
57 format.html { render :action => "new" }
58 format.xml { render :xml => @announcement.errors, :status => :unprocessable_entity }
58 format.xml { render :xml => @announcement.errors, :status => :unprocessable_entity }
59 end
59 end
60 end
60 end
61 end
61 end
62
62
63 # PUT /announcements/1
63 # PUT /announcements/1
64 # PUT /announcements/1.xml
64 # PUT /announcements/1.xml
65 def update
65 def update
66 @announcement = Announcement.find(params[:id])
66 @announcement = Announcement.find(params[:id])
67
67
68 respond_to do |format|
68 respond_to do |format|
69 - if @announcement.update_attributes(params[:announcement])
69 + if @announcement.update_attributes(announcement_params)
70 flash[:notice] = 'Announcement was successfully updated.'
70 flash[:notice] = 'Announcement was successfully updated.'
71 format.html { redirect_to(@announcement) }
71 format.html { redirect_to(@announcement) }
72 format.js {}
72 format.js {}
73 format.xml { head :ok }
73 format.xml { head :ok }
74 else
74 else
75 format.html { render :action => "edit" }
75 format.html { render :action => "edit" }
76 format.js {}
76 format.js {}
77 format.xml { render :xml => @announcement.errors, :status => :unprocessable_entity }
77 format.xml { render :xml => @announcement.errors, :status => :unprocessable_entity }
78 end
78 end
79 end
79 end
80 end
80 end
81
81
82 def toggle
82 def toggle
83 @announcement = Announcement.find(params[:id])
83 @announcement = Announcement.find(params[:id])
84 @announcement.update_attributes( published: !@announcement.published? )
84 @announcement.update_attributes( published: !@announcement.published? )
85 respond_to do |format|
85 respond_to do |format|
86 format.js { render partial: 'toggle_button',
86 format.js { render partial: 'toggle_button',
87 locals: {button_id: "#announcement_toggle_#{@announcement.id}",button_on: @announcement.published? } }
87 locals: {button_id: "#announcement_toggle_#{@announcement.id}",button_on: @announcement.published? } }
88 end
88 end
89 end
89 end
90
90
91 def toggle_front
91 def toggle_front
92 @announcement = Announcement.find(params[:id])
92 @announcement = Announcement.find(params[:id])
93 @announcement.update_attributes( frontpage: !@announcement.frontpage? )
93 @announcement.update_attributes( frontpage: !@announcement.frontpage? )
94 respond_to do |format|
94 respond_to do |format|
95 format.js { render partial: 'toggle_button',
95 format.js { render partial: 'toggle_button',
96 locals: {button_id: "#announcement_toggle_front_#{@announcement.id}",button_on: @announcement.frontpage? } }
96 locals: {button_id: "#announcement_toggle_front_#{@announcement.id}",button_on: @announcement.frontpage? } }
97 end
97 end
98 end
98 end
99
99
100 # DELETE /announcements/1
100 # DELETE /announcements/1
101 # DELETE /announcements/1.xml
101 # DELETE /announcements/1.xml
102 def destroy
102 def destroy
103 @announcement = Announcement.find(params[:id])
103 @announcement = Announcement.find(params[:id])
104 @announcement.destroy
104 @announcement.destroy
105
105
106 respond_to do |format|
106 respond_to do |format|
107 format.html { redirect_to(announcements_url) }
107 format.html { redirect_to(announcements_url) }
108 format.xml { head :ok }
108 format.xml { head :ok }
109 end
109 end
110 end
110 end
111 +
112 + private
113 +
114 + def announcement_params
115 + params.require(:announcement).permit(:author, :body, :published, :frontpage, :contest_only,:title, :note)
116 + end
111 end
117 end
@@ -1,30 +1,35
1 class ConfigurationsController < ApplicationController
1 class ConfigurationsController < ApplicationController
2
2
3 before_filter :authenticate
3 before_filter :authenticate
4 before_filter { |controller| controller.authorization_by_roles(['admin'])}
4 before_filter { |controller| controller.authorization_by_roles(['admin'])}
5
5
6
6
7 def index
7 def index
8 @configurations = GraderConfiguration.find(:all,
8 @configurations = GraderConfiguration.find(:all,
9 :order => '`key`')
9 :order => '`key`')
10 @group = GraderConfiguration.pluck("grader_configurations.key").map{ |x| x[0...(x.index('.'))] }.uniq.sort
10 @group = GraderConfiguration.pluck("grader_configurations.key").map{ |x| x[0...(x.index('.'))] }.uniq.sort
11 end
11 end
12
12
13 def reload
13 def reload
14 GraderConfiguration.reload
14 GraderConfiguration.reload
15 redirect_to :action => 'index'
15 redirect_to :action => 'index'
16 end
16 end
17
17
18 def update
18 def update
19 @config = GraderConfiguration.find(params[:id])
19 @config = GraderConfiguration.find(params[:id])
20 User.clear_last_login if @config.key == GraderConfiguration::MULTIPLE_IP_LOGIN_KEY and @config.value == 'true' and params[:grader_configuration][:value] == 'false'
20 User.clear_last_login if @config.key == GraderConfiguration::MULTIPLE_IP_LOGIN_KEY and @config.value == 'true' and params[:grader_configuration][:value] == 'false'
21 respond_to do |format|
21 respond_to do |format|
22 - if @config.update_attributes(params[:grader_configuration])
22 + if @config.update_attributes(configuration_params)
23 format.json { head :ok }
23 format.json { head :ok }
24 else
24 else
25 format.json { respond_with_bip(@config) }
25 format.json { respond_with_bip(@config) }
26 end
26 end
27 end
27 end
28 end
28 end
29
29
30 + private
31 + def configuration_params
32 + params.require(:grader_configuration).permit(:key,:value_type,:value,:description)
33 + end
34 +
30 end
35 end
@@ -21,72 +21,78
21 def show
21 def show
22 @contest = Contest.find(params[:id])
22 @contest = Contest.find(params[:id])
23
23
24 respond_to do |format|
24 respond_to do |format|
25 format.html # show.html.erb
25 format.html # show.html.erb
26 format.xml { render :xml => @contest }
26 format.xml { render :xml => @contest }
27 end
27 end
28 end
28 end
29
29
30 # GET /contests/new
30 # GET /contests/new
31 # GET /contests/new.xml
31 # GET /contests/new.xml
32 def new
32 def new
33 @contest = Contest.new
33 @contest = Contest.new
34
34
35 respond_to do |format|
35 respond_to do |format|
36 format.html # new.html.erb
36 format.html # new.html.erb
37 format.xml { render :xml => @contest }
37 format.xml { render :xml => @contest }
38 end
38 end
39 end
39 end
40
40
41 # GET /contests/1/edit
41 # GET /contests/1/edit
42 def edit
42 def edit
43 @contest = Contest.find(params[:id])
43 @contest = Contest.find(params[:id])
44 end
44 end
45
45
46 # POST /contests
46 # POST /contests
47 # POST /contests.xml
47 # POST /contests.xml
48 def create
48 def create
49 @contest = Contest.new(params[:contest])
49 @contest = Contest.new(params[:contest])
50
50
51 respond_to do |format|
51 respond_to do |format|
52 if @contest.save
52 if @contest.save
53 flash[:notice] = 'Contest was successfully created.'
53 flash[:notice] = 'Contest was successfully created.'
54 format.html { redirect_to(@contest) }
54 format.html { redirect_to(@contest) }
55 format.xml { render :xml => @contest, :status => :created, :location => @contest }
55 format.xml { render :xml => @contest, :status => :created, :location => @contest }
56 else
56 else
57 format.html { render :action => "new" }
57 format.html { render :action => "new" }
58 format.xml { render :xml => @contest.errors, :status => :unprocessable_entity }
58 format.xml { render :xml => @contest.errors, :status => :unprocessable_entity }
59 end
59 end
60 end
60 end
61 end
61 end
62
62
63 # PUT /contests/1
63 # PUT /contests/1
64 # PUT /contests/1.xml
64 # PUT /contests/1.xml
65 def update
65 def update
66 @contest = Contest.find(params[:id])
66 @contest = Contest.find(params[:id])
67
67
68 respond_to do |format|
68 respond_to do |format|
69 - if @contest.update_attributes(params[:contest])
69 + if @contest.update_attributes(contests_params)
70 flash[:notice] = 'Contest was successfully updated.'
70 flash[:notice] = 'Contest was successfully updated.'
71 format.html { redirect_to(@contest) }
71 format.html { redirect_to(@contest) }
72 format.xml { head :ok }
72 format.xml { head :ok }
73 else
73 else
74 format.html { render :action => "edit" }
74 format.html { render :action => "edit" }
75 format.xml { render :xml => @contest.errors, :status => :unprocessable_entity }
75 format.xml { render :xml => @contest.errors, :status => :unprocessable_entity }
76 end
76 end
77 end
77 end
78 end
78 end
79
79
80 # DELETE /contests/1
80 # DELETE /contests/1
81 # DELETE /contests/1.xml
81 # DELETE /contests/1.xml
82 def destroy
82 def destroy
83 @contest = Contest.find(params[:id])
83 @contest = Contest.find(params[:id])
84 @contest.destroy
84 @contest.destroy
85
85
86 respond_to do |format|
86 respond_to do |format|
87 format.html { redirect_to(contests_url) }
87 format.html { redirect_to(contests_url) }
88 format.xml { head :ok }
88 format.xml { head :ok }
89 end
89 end
90 end
90 end
91
91
92 + private
93 +
94 + def contests_params
95 + params.require(:contest).permit(:title,:enabled,:name)
96 + end
97 +
92 end
98 end
@@ -14,49 +14,54
14
14
15 @site_select = []
15 @site_select = []
16 @countries.each do |country|
16 @countries.each do |country|
17 country.sites.each do |site|
17 country.sites.each do |site|
18 @site_select << ["#{site.name}, #{country.name}", site.id]
18 @site_select << ["#{site.name}, #{country.name}", site.id]
19 end
19 end
20 end
20 end
21
21
22 @default_site = Site.first if !GraderConfiguration['contest.multisites']
22 @default_site = Site.first if !GraderConfiguration['contest.multisites']
23
23
24 render :action => 'login', :layout => 'empty'
24 render :action => 'login', :layout => 'empty'
25 end
25 end
26
26
27 def index
27 def index
28 if @site.started
28 if @site.started
29 render :action => 'started', :layout => 'empty'
29 render :action => 'started', :layout => 'empty'
30 else
30 else
31 render :action => 'prompt', :layout => 'empty'
31 render :action => 'prompt', :layout => 'empty'
32 end
32 end
33 end
33 end
34
34
35 def start
35 def start
36 @site.started = true
36 @site.started = true
37 @site.start_time = Time.new.gmtime
37 @site.start_time = Time.new.gmtime
38 @site.save
38 @site.save
39 redirect_to :action => 'index'
39 redirect_to :action => 'index'
40 end
40 end
41
41
42 def logout
42 def logout
43 reset_session
43 reset_session
44 redirect_to :controller => 'main', :action => 'login'
44 redirect_to :controller => 'main', :action => 'login'
45 end
45 end
46
46
47 protected
47 protected
48 def site_admin_authorization
48 def site_admin_authorization
49 if session[:site_id]==nil
49 if session[:site_id]==nil
50 redirect_to :controller => 'site', :action => 'login' and return
50 redirect_to :controller => 'site', :action => 'login' and return
51 end
51 end
52 begin
52 begin
53 @site = Site.find(session[:site_id], :include => :country)
53 @site = Site.find(session[:site_id], :include => :country)
54 rescue ActiveRecord::RecordNotFound
54 rescue ActiveRecord::RecordNotFound
55 @site = nil
55 @site = nil
56 end
56 end
57 if @site==nil
57 if @site==nil
58 redirect_to :controller => 'site', :action => 'login' and return
58 redirect_to :controller => 'site', :action => 'login' and return
59 end
59 end
60 end
60 end
61
61
62 + private
63 + def site_params
64 + params.require(:site).permit()
65 + end
66 +
62 end
67 end
@@ -20,72 +20,78
20
20
21 respond_to do |format|
21 respond_to do |format|
22 format.html # show.html.erb
22 format.html # show.html.erb
23 format.xml { render :xml => @site }
23 format.xml { render :xml => @site }
24 end
24 end
25 end
25 end
26
26
27 # GET /sites/new
27 # GET /sites/new
28 # GET /sites/new.xml
28 # GET /sites/new.xml
29 def new
29 def new
30 @site = Site.new
30 @site = Site.new
31
31
32 respond_to do |format|
32 respond_to do |format|
33 format.html # new.html.erb
33 format.html # new.html.erb
34 format.xml { render :xml => @site }
34 format.xml { render :xml => @site }
35 end
35 end
36 end
36 end
37
37
38 # GET /sites/1/edit
38 # GET /sites/1/edit
39 def edit
39 def edit
40 @site = Site.find(params[:id])
40 @site = Site.find(params[:id])
41 end
41 end
42
42
43 # POST /sites
43 # POST /sites
44 # POST /sites.xml
44 # POST /sites.xml
45 def create
45 def create
46 @site = Site.new(params[:site])
46 @site = Site.new(params[:site])
47 @site.clear_start_time_if_not_started
47 @site.clear_start_time_if_not_started
48
48
49 respond_to do |format|
49 respond_to do |format|
50 if @site.save
50 if @site.save
51 flash[:notice] = 'Site was successfully created.'
51 flash[:notice] = 'Site was successfully created.'
52 format.html { redirect_to(@site) }
52 format.html { redirect_to(@site) }
53 format.xml { render :xml => @site, :status => :created, :location => @site }
53 format.xml { render :xml => @site, :status => :created, :location => @site }
54 else
54 else
55 format.html { render :action => "new" }
55 format.html { render :action => "new" }
56 format.xml { render :xml => @site.errors, :status => :unprocessable_entity }
56 format.xml { render :xml => @site.errors, :status => :unprocessable_entity }
57 end
57 end
58 end
58 end
59 end
59 end
60
60
61 # PUT /sites/1
61 # PUT /sites/1
62 # PUT /sites/1.xml
62 # PUT /sites/1.xml
63 def update
63 def update
64 @site = Site.find(params[:id])
64 @site = Site.find(params[:id])
65 @site.clear_start_time_if_not_started
65 @site.clear_start_time_if_not_started
66
66
67 respond_to do |format|
67 respond_to do |format|
68 - if @site.update_attributes(params[:site])
68 + if @site.update_attributes(site_params)
69 flash[:notice] = 'Site was successfully updated.'
69 flash[:notice] = 'Site was successfully updated.'
70 format.html { redirect_to(@site) }
70 format.html { redirect_to(@site) }
71 format.xml { head :ok }
71 format.xml { head :ok }
72 else
72 else
73 format.html { render :action => "edit" }
73 format.html { render :action => "edit" }
74 format.xml { render :xml => @site.errors, :status => :unprocessable_entity }
74 format.xml { render :xml => @site.errors, :status => :unprocessable_entity }
75 end
75 end
76 end
76 end
77 end
77 end
78
78
79 # DELETE /sites/1
79 # DELETE /sites/1
80 # DELETE /sites/1.xml
80 # DELETE /sites/1.xml
81 def destroy
81 def destroy
82 @site = Site.find(params[:id])
82 @site = Site.find(params[:id])
83 @site.destroy
83 @site.destroy
84
84
85 respond_to do |format|
85 respond_to do |format|
86 format.html { redirect_to(sites_url) }
86 format.html { redirect_to(sites_url) }
87 format.xml { head :ok }
87 format.xml { head :ok }
88 end
88 end
89 end
89 end
90
90
91 + private
92 +
93 + def site_params
94 + params.require(:site).permit(:name,:started,:start_time,:country_id,:password)
95 + end
96 +
91 end
97 end
@@ -15,123 +15,69
15 else
15 else
16 @problem = Problem.find_by_id(params[:problem_id])
16 @problem = Problem.find_by_id(params[:problem_id])
17 if (@problem == nil) or (not @problem.available)
17 if (@problem == nil) or (not @problem.available)
18 redirect_to main_list_path
18 redirect_to main_list_path
19 flash[:notice] = 'Error: submissions for that problem are not viewable.'
19 flash[:notice] = 'Error: submissions for that problem are not viewable.'
20 return
20 return
21 end
21 end
22 @submissions = Submission.find_all_by_user_problem(@user.id, @problem.id)
22 @submissions = Submission.find_all_by_user_problem(@user.id, @problem.id)
23 end
23 end
24 end
24 end
25
25
26 # GET /submissions/1
26 # GET /submissions/1
27 # GET /submissions/1.json
27 # GET /submissions/1.json
28 def show
28 def show
29 @submission = Submission.find(params[:id])
29 @submission = Submission.find(params[:id])
30
30
31 #log the viewing
31 #log the viewing
32 user = User.find(session[:user_id])
32 user = User.find(session[:user_id])
33 SubmissionViewLog.create(user_id: session[:user_id],submission_id: @submission.id) unless user.admin?
33 SubmissionViewLog.create(user_id: session[:user_id],submission_id: @submission.id) unless user.admin?
34 end
34 end
35
35
36 #on-site new submission on specific problem
36 #on-site new submission on specific problem
37 def direct_edit_problem
37 def direct_edit_problem
38 @problem = Problem.find(params[:problem_id])
38 @problem = Problem.find(params[:problem_id])
39 @source = ''
39 @source = ''
40 render 'edit'
40 render 'edit'
41 end
41 end
42
42
43 # GET /submissions/1/edit
43 # GET /submissions/1/edit
44 def edit
44 def edit
45 @submission = Submission.find(params[:id])
45 @submission = Submission.find(params[:id])
46 @source = @submission.source.to_s
46 @source = @submission.source.to_s
47 @problem = @submission.problem
47 @problem = @submission.problem
48 @lang_id = @submission.language.id
48 @lang_id = @submission.language.id
49 end
49 end
50
50
51
51
52 def get_latest_submission_status
52 def get_latest_submission_status
53 @problem = Problem.find(params[:pid])
53 @problem = Problem.find(params[:pid])
54 @submission = Submission.find_last_by_user_and_problem(params[:uid],params[:pid])
54 @submission = Submission.find_last_by_user_and_problem(params[:uid],params[:pid])
55 puts User.find(params[:uid]).login
55 puts User.find(params[:uid]).login
56 puts Problem.find(params[:pid]).name
56 puts Problem.find(params[:pid]).name
57 puts 'nil' unless @submission
57 puts 'nil' unless @submission
58 respond_to do |format|
58 respond_to do |format|
59 format.js
59 format.js
60 end
60 end
61 end
61 end
62
62
63 - # # GET /submissions/new
64 - # # GET /submissions/new.json
65 - # def new
66 - # @submission = Submission.new
67 - #
68 - # respond_to do |format|
69 - # format.html # new.html.erb
70 - # format.json { render json: @submission }
71 - # end
72 - # end
73 - #
74 - #
75 - # # POST /submissions
76 - # # POST /submissions.json
77 - # def create
78 - # @submission = Submission.new(params[:submission])
79 - #
80 - # respond_to do |format|
81 - # if @submission.save
82 - # format.html { redirect_to @submission, notice: 'Submission was successfully created.' }
83 - # format.json { render json: @submission, status: :created, location: @submission }
84 - # else
85 - # format.html { render action: "new" }
86 - # format.json { render json: @submission.errors, status: :unprocessable_entity }
87 - # end
88 - # end
89 - # end
90 - #
91 - # # PUT /submissions/1
92 - # # PUT /submissions/1.json
93 - # def update
94 - # @submission = Submission.find(params[:id])
95 - #
96 - # respond_to do |format|
97 - # if @submission.update_attributes(params[:submission])
98 - # format.html { redirect_to @submission, notice: 'Submission was successfully updated.' }
99 - # format.json { head :no_content }
100 - # else
101 - # format.html { render action: "edit" }
102 - # format.json { render json: @submission.errors, status: :unprocessable_entity }
103 - # end
104 - # end
105 - # end
106 - #
107 - # # DELETE /submissions/1
108 - # # DELETE /submissions/1.json
109 - # def destroy
110 - # @submission = Submission.find(params[:id])
111 - # @submission.destroy
112 - #
113 - # respond_to do |format|
114 - # format.html { redirect_to submissions_url }
115 - # format.json { head :no_content }
116 - # end
117 - # end
118
63
119 protected
64 protected
120 def submission_authorization
65 def submission_authorization
121 #admin always has privileged
66 #admin always has privileged
122 if @current_user.admin?
67 if @current_user.admin?
123 return true
68 return true
124 end
69 end
125
70
126 sub = Submission.find(params[:id])
71 sub = Submission.find(params[:id])
127 if sub.problem.available?
72 if sub.problem.available?
128 puts "sub = #{sub.user.id}, current = #{@current_user.id}"
73 puts "sub = #{sub.user.id}, current = #{@current_user.id}"
129 return true if GraderConfiguration["right.user_view_submission"] or sub.user == @current_user
74 return true if GraderConfiguration["right.user_view_submission"] or sub.user == @current_user
130 end
75 end
131
76
132 #default to NO
77 #default to NO
133 unauthorized_redirect
78 unauthorized_redirect
134 return false
79 return false
135 end
80 end
81 +
136
82
137 end
83 end
@@ -73,97 +73,97
73 items = line.chomp.split(',')
73 items = line.chomp.split(',')
74 if items.length>=2
74 if items.length>=2
75 login = items[0]
75 login = items[0]
76 full_name = items[1]
76 full_name = items[1]
77
77
78 added_random_password = false
78 added_random_password = false
79 if items.length>=3
79 if items.length>=3
80 password = items[2].chomp(" ")
80 password = items[2].chomp(" ")
81 user_alias = (items.length>=4) ? items[3] : login
81 user_alias = (items.length>=4) ? items[3] : login
82 else
82 else
83 password = random_password
83 password = random_password
84 user_alias = (items.length>=4) ? items[3] : login
84 user_alias = (items.length>=4) ? items[3] : login
85 added_random_password = true
85 added_random_password = true
86 end
86 end
87
87
88 user = User.find_by_login(login)
88 user = User.find_by_login(login)
89 if (user)
89 if (user)
90 user.full_name = full_name
90 user.full_name = full_name
91 user.password = password
91 user.password = password
92 else
92 else
93 user = User.new({:login => login,
93 user = User.new({:login => login,
94 :full_name => full_name,
94 :full_name => full_name,
95 :password => password,
95 :password => password,
96 :password_confirmation => password,
96 :password_confirmation => password,
97 :alias => user_alias})
97 :alias => user_alias})
98 end
98 end
99 user.activated = true
99 user.activated = true
100 user.save
100 user.save
101
101
102 if added_random_password
102 if added_random_password
103 note << "'#{login}' (+)"
103 note << "'#{login}' (+)"
104 else
104 else
105 note << login
105 note << login
106 end
106 end
107 end
107 end
108 end
108 end
109 flash[:notice] = 'User(s) ' + note.join(', ') +
109 flash[:notice] = 'User(s) ' + note.join(', ') +
110 ' were successfully created. ' +
110 ' were successfully created. ' +
111 '( (+) - created with random passwords.)'
111 '( (+) - created with random passwords.)'
112 redirect_to :action => 'index'
112 redirect_to :action => 'index'
113 end
113 end
114
114
115 def edit
115 def edit
116 @user = User.find(params[:id])
116 @user = User.find(params[:id])
117 end
117 end
118
118
119 def update
119 def update
120 @user = User.find(params[:id])
120 @user = User.find(params[:id])
121 - if @user.update_attributes(params[:user])
121 + if @user.update_attributes(user_params)
122 flash[:notice] = 'User was successfully updated.'
122 flash[:notice] = 'User was successfully updated.'
123 redirect_to :action => 'show', :id => @user
123 redirect_to :action => 'show', :id => @user
124 else
124 else
125 render :action => 'edit'
125 render :action => 'edit'
126 end
126 end
127 end
127 end
128
128
129 def destroy
129 def destroy
130 User.find(params[:id]).destroy
130 User.find(params[:id]).destroy
131 redirect_to :action => 'index'
131 redirect_to :action => 'index'
132 end
132 end
133
133
134 def user_stat
134 def user_stat
135 if params[:commit] == 'download csv'
135 if params[:commit] == 'download csv'
136 @problems = Problem.all
136 @problems = Problem.all
137 else
137 else
138 @problems = Problem.find_available_problems
138 @problems = Problem.find_available_problems
139 end
139 end
140 @users = User.includes(:contests, :contest_stat).where(enabled: true) #find(:all, :include => [:contests, :contest_stat]).where(enabled: true)
140 @users = User.includes(:contests, :contest_stat).where(enabled: true) #find(:all, :include => [:contests, :contest_stat]).where(enabled: true)
141 @scorearray = Array.new
141 @scorearray = Array.new
142 @users.each do |u|
142 @users.each do |u|
143 ustat = Array.new
143 ustat = Array.new
144 ustat[0] = u
144 ustat[0] = u
145 @problems.each do |p|
145 @problems.each do |p|
146 sub = Submission.find_last_by_user_and_problem(u.id,p.id)
146 sub = Submission.find_last_by_user_and_problem(u.id,p.id)
147 if (sub!=nil) and (sub.points!=nil) and p and p.full_score
147 if (sub!=nil) and (sub.points!=nil) and p and p.full_score
148 ustat << [(sub.points.to_f*100/p.full_score).round, (sub.points>=p.full_score)]
148 ustat << [(sub.points.to_f*100/p.full_score).round, (sub.points>=p.full_score)]
149 else
149 else
150 ustat << [0,false]
150 ustat << [0,false]
151 end
151 end
152 end
152 end
153 @scorearray << ustat
153 @scorearray << ustat
154 end
154 end
155 if params[:commit] == 'download csv' then
155 if params[:commit] == 'download csv' then
156 csv = gen_csv_from_scorearray(@scorearray,@problems)
156 csv = gen_csv_from_scorearray(@scorearray,@problems)
157 send_data csv, filename: 'last_score.csv'
157 send_data csv, filename: 'last_score.csv'
158 else
158 else
159 render template: 'user_admin/user_stat'
159 render template: 'user_admin/user_stat'
160 end
160 end
161 end
161 end
162
162
163 def user_stat_max
163 def user_stat_max
164 if params[:commit] == 'download csv'
164 if params[:commit] == 'download csv'
165 @problems = Problem.all
165 @problems = Problem.all
166 else
166 else
167 @problems = Problem.find_available_problems
167 @problems = Problem.find_available_problems
168 end
168 end
169 @users = User.find(:all, :include => [:contests, :contest_stat])
169 @users = User.find(:all, :include => [:contests, :contest_stat])
@@ -490,49 +490,54
490 logger.info mail_body
490 logger.info mail_body
491 send_mail(user.email, mail_subject, mail_body)
491 send_mail(user.email, mail_subject, mail_body)
492 end
492 end
493
493
494 def find_contest_and_user_from_contest_id(id)
494 def find_contest_and_user_from_contest_id(id)
495 if id!='none'
495 if id!='none'
496 @contest = Contest.find(id)
496 @contest = Contest.find(id)
497 else
497 else
498 @contest = nil
498 @contest = nil
499 end
499 end
500 if @contest
500 if @contest
501 @users = @contest.users
501 @users = @contest.users
502 else
502 else
503 @users = User.find_users_with_no_contest
503 @users = User.find_users_with_no_contest
504 end
504 end
505 return [@contest, @users]
505 return [@contest, @users]
506 end
506 end
507
507
508 def gen_csv_from_scorearray(scorearray,problem)
508 def gen_csv_from_scorearray(scorearray,problem)
509 CSV.generate do |csv|
509 CSV.generate do |csv|
510 #add header
510 #add header
511 header = ['User','Name', 'Activated?', 'Logged in', 'Contest']
511 header = ['User','Name', 'Activated?', 'Logged in', 'Contest']
512 problem.each { |p| header << p.name }
512 problem.each { |p| header << p.name }
513 header += ['Total','Passed']
513 header += ['Total','Passed']
514 csv << header
514 csv << header
515 #add data
515 #add data
516 scorearray.each do |sc|
516 scorearray.each do |sc|
517 total = num_passed = 0
517 total = num_passed = 0
518 row = Array.new
518 row = Array.new
519 sc.each_index do |i|
519 sc.each_index do |i|
520 if i == 0
520 if i == 0
521 row << sc[i].login
521 row << sc[i].login
522 row << sc[i].full_name
522 row << sc[i].full_name
523 row << sc[i].activated
523 row << sc[i].activated
524 row << (sc[i].try(:contest_stat).try(:started_at).nil? ? 'no' : 'yes')
524 row << (sc[i].try(:contest_stat).try(:started_at).nil? ? 'no' : 'yes')
525 row << sc[i].contests.collect {|c| c.name}.join(', ')
525 row << sc[i].contests.collect {|c| c.name}.join(', ')
526 else
526 else
527 row << sc[i][0]
527 row << sc[i][0]
528 total += sc[i][0]
528 total += sc[i][0]
529 num_passed += 1 if sc[i][1]
529 num_passed += 1 if sc[i][1]
530 end
530 end
531 end
531 end
532 row << total
532 row << total
533 row << num_passed
533 row << num_passed
534 csv << row
534 csv << row
535 end
535 end
536 end
536 end
537 end
537 end
538 +
539 + private
540 + def user_params
541 + params.require(:user).permit(:login,:full_name,:hashed_password,:salt,:alias,:email,:site_id,:country_id,:activated,:enabled,:remark,:last_ip,:section)
542 + end
538 end
543 end
@@ -1,82 +1,82
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_many :test_requests, :order => "submitted_at DESC"
11 has_many :test_requests, :order => "submitted_at DESC"
12
12
13 has_many :messages,
13 has_many :messages,
14 :class_name => "Message",
14 :class_name => "Message",
15 :foreign_key => "sender_id",
15 :foreign_key => "sender_id",
16 :order => 'created_at DESC'
16 :order => 'created_at DESC'
17
17
18 has_many :replied_messages,
18 has_many :replied_messages,
19 :class_name => "Message",
19 :class_name => "Message",
20 :foreign_key => "receiver_id",
20 :foreign_key => "receiver_id",
21 :order => 'created_at DESC'
21 :order => 'created_at DESC'
22
22
23 has_one :contest_stat, :class_name => "UserContestStat", :dependent => :destroy
23 has_one :contest_stat, :class_name => "UserContestStat", :dependent => :destroy
24
24
25 belongs_to :site
25 belongs_to :site
26 belongs_to :country
26 belongs_to :country
27
27
28 has_and_belongs_to_many :contests, :uniq => true, :order => 'name'
28 has_and_belongs_to_many :contests, :uniq => true, :order => 'name'
29
29
30 scope :activated_users, :conditions => {:activated => true}
30 scope :activated_users, :conditions => {:activated => true}
31
31
32 validates_presence_of :login
32 validates_presence_of :login
33 validates_uniqueness_of :login
33 validates_uniqueness_of :login
34 - validates_format_of :login, :with => /^[\_A-Za-z0-9]+$/
34 + validates_format_of :login, :with => /\A[\_A-Za-z0-9]+\z/
35 validates_length_of :login, :within => 3..30
35 validates_length_of :login, :within => 3..30
36
36
37 validates_presence_of :full_name
37 validates_presence_of :full_name
38 validates_length_of :full_name, :minimum => 1
38 validates_length_of :full_name, :minimum => 1
39
39
40 validates_presence_of :password, :if => :password_required?
40 validates_presence_of :password, :if => :password_required?
41 validates_length_of :password, :within => 4..20, :if => :password_required?
41 validates_length_of :password, :within => 4..20, :if => :password_required?
42 validates_confirmation_of :password, :if => :password_required?
42 validates_confirmation_of :password, :if => :password_required?
43
43
44 validates_format_of :email,
44 validates_format_of :email,
45 :with => /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\Z/i,
45 :with => /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\Z/i,
46 :if => :email_validation?
46 :if => :email_validation?
47 validate :uniqueness_of_email_from_activated_users,
47 validate :uniqueness_of_email_from_activated_users,
48 :if => :email_validation?
48 :if => :email_validation?
49 validate :enough_time_interval_between_same_email_registrations,
49 validate :enough_time_interval_between_same_email_registrations,
50 :if => :email_validation?
50 :if => :email_validation?
51
51
52 # these are for ytopc
52 # these are for ytopc
53 # disable for now
53 # disable for now
54 #validates_presence_of :province
54 #validates_presence_of :province
55
55
56 attr_accessor :password
56 attr_accessor :password
57
57
58 before_save :encrypt_new_password
58 before_save :encrypt_new_password
59 before_save :assign_default_site
59 before_save :assign_default_site
60 before_save :assign_default_contest
60 before_save :assign_default_contest
61
61
62 # this is for will_paginate
62 # this is for will_paginate
63 cattr_reader :per_page
63 cattr_reader :per_page
64 @@per_page = 50
64 @@per_page = 50
65
65
66 def self.authenticate(login, password)
66 def self.authenticate(login, password)
67 user = find_by_login(login)
67 user = find_by_login(login)
68 if user
68 if user
69 return user if user.authenticated?(password)
69 return user if user.authenticated?(password)
70 if user.authenticated_by_cucas?(password) or user.authenticated_by_pop3?(password)
70 if user.authenticated_by_cucas?(password) or user.authenticated_by_pop3?(password)
71 user.password = password
71 user.password = password
72 user.save
72 user.save
73 return user
73 return user
74 end
74 end
75 end
75 end
76 end
76 end
77
77
78 def authenticated?(password)
78 def authenticated?(password)
79 if self.activated
79 if self.activated
80 hashed_password == User.encrypt(password,self.salt)
80 hashed_password == User.encrypt(password,self.salt)
81 else
81 else
82 false
82 false
@@ -1,42 +1,42
1 CafeGrader::Application.configure do
1 CafeGrader::Application.configure do
2 # Settings specified here will take precedence over those in config/application.rb
2 # Settings specified here will take precedence over those in config/application.rb
3
3
4 # In the development environment your application's code is reloaded on
4 # In the development environment your application's code is reloaded on
5 # every request. This slows down response time but is perfect for development
5 # every request. This slows down response time but is perfect for development
6 # since you don't have to restart the web server when you make code changes.
6 # since you don't have to restart the web server when you make code changes.
7 config.cache_classes = false
7 config.cache_classes = false
8
8
9 # Log error messages when you accidentally call methods on nil. //DEPRICATED
9 # Log error messages when you accidentally call methods on nil. //DEPRICATED
10 # config.whiny_nils = true // DEPRICATED
10 # config.whiny_nils = true // DEPRICATED
11
11
12 # Show full error reports and disable caching
12 # Show full error reports and disable caching
13 config.consider_all_requests_local = true
13 config.consider_all_requests_local = true
14 config.action_controller.perform_caching = false
14 config.action_controller.perform_caching = false
15
15
16 # Don't care if the mailer can't send
16 # Don't care if the mailer can't send
17 config.action_mailer.raise_delivery_errors = false
17 config.action_mailer.raise_delivery_errors = false
18
18
19 # Print deprecation notices to the Rails logger
19 # Print deprecation notices to the Rails logger
20 config.active_support.deprecation = :log
20 config.active_support.deprecation = :log
21
21
22 # Only use best-standards-support built into browsers
22 # Only use best-standards-support built into browsers
23 config.action_dispatch.best_standards_support = :builtin
23 config.action_dispatch.best_standards_support = :builtin
24
24
25 # Raise exception on mass assignment protection for Active Record models
25 # Raise exception on mass assignment protection for Active Record models
26 - config.active_record.mass_assignment_sanitizer = :strict
26 + # config.active_record.mass_assignment_sanitizer = :strict //DEPRICATED
27
27
28 # Log the query plan for queries taking more than this (works // DEPRICATED
28 # Log the query plan for queries taking more than this (works // DEPRICATED
29 # with SQLite, MySQL, and PostgreSQL) // DEPRICATED
29 # with SQLite, MySQL, and PostgreSQL) // DEPRICATED
30 # config.active_record.auto_explain_threshold_in_seconds = 0.5 // DEPRICATED
30 # config.active_record.auto_explain_threshold_in_seconds = 0.5 // DEPRICATED
31
31
32 # Do not compress assets
32 # Do not compress assets
33 config.assets.compress = false
33 config.assets.compress = false
34
34
35 # Expands the lines which load the assets
35 # Expands the lines which load the assets
36 config.assets.debug = true
36 config.assets.debug = true
37
37
38 # Prevents assets from rendering twice
38 # Prevents assets from rendering twice
39 config.serve_static_assets = true
39 config.serve_static_assets = true
40
40
41 config.eager_load = false
41 config.eager_load = false
42 end
42 end
@@ -1,39 +1,39
1 CafeGrader::Application.configure do
1 CafeGrader::Application.configure do
2 # Settings specified here will take precedence over those in config/application.rb
2 # Settings specified here will take precedence over those in config/application.rb
3
3
4 # The test environment is used exclusively to run your application's
4 # The test environment is used exclusively to run your application's
5 # test suite. You never need to work with it otherwise. Remember that
5 # test suite. You never need to work with it otherwise. Remember that
6 # your test database is "scratch space" for the test suite and is wiped
6 # your test database is "scratch space" for the test suite and is wiped
7 # and recreated between test runs. Don't rely on the data there!
7 # and recreated between test runs. Don't rely on the data there!
8 config.cache_classes = true
8 config.cache_classes = true
9
9
10 # Configure static asset server for tests with Cache-Control for performance
10 # Configure static asset server for tests with Cache-Control for performance
11 config.serve_static_assets = true
11 config.serve_static_assets = true
12 config.static_cache_control = "public, max-age=3600"
12 config.static_cache_control = "public, max-age=3600"
13
13
14 # Log error messages when you accidentally call methods on nil
14 # Log error messages when you accidentally call methods on nil
15 config.whiny_nils = true
15 config.whiny_nils = true
16
16
17 # Show full error reports and disable caching
17 # Show full error reports and disable caching
18 config.consider_all_requests_local = true
18 config.consider_all_requests_local = true
19 config.action_controller.perform_caching = false
19 config.action_controller.perform_caching = false
20
20
21 # Raise exceptions instead of rendering exception templates
21 # Raise exceptions instead of rendering exception templates
22 config.action_dispatch.show_exceptions = false
22 config.action_dispatch.show_exceptions = false
23
23
24 # Disable request forgery protection in test environment
24 # Disable request forgery protection in test environment
25 config.action_controller.allow_forgery_protection = false
25 config.action_controller.allow_forgery_protection = false
26
26
27 # Tell Action Mailer not to deliver emails to the real world.
27 # Tell Action Mailer not to deliver emails to the real world.
28 # The :test delivery method accumulates sent emails in the
28 # The :test delivery method accumulates sent emails in the
29 # ActionMailer::Base.deliveries array.
29 # ActionMailer::Base.deliveries array.
30 config.action_mailer.delivery_method = :test
30 config.action_mailer.delivery_method = :test
31
31
32 # Raise exception on mass assignment protection for Active Record models
32 # Raise exception on mass assignment protection for Active Record models
33 - config.active_record.mass_assignment_sanitizer = :strict
33 + #config.active_record.mass_assignment_sanitizer = :strict // DEPRICATED
34
34
35 # Print deprecation notices to the stderr
35 # Print deprecation notices to the stderr
36 config.active_support.deprecation = :stderr
36 config.active_support.deprecation = :stderr
37
37
38 config.eager_load = false
38 config.eager_load = false
39 end
39 end
You need to be logged in to leave comments. Login now