Description:
add load button add more admin authorization
Commit status:
[Not Reviewed]
References:
Comments:
0 Commit comments 0 Inline Comments
Unresolved TODOs:
There are no unresolved TODOs
Add another comment

r711:a65ea018c51c - - 2 files changed: 26 inserted, 1 deleted

@@ -1,114 +1,117
1 1 require 'net/smtp'
2 2
3 3 class UsersController < ApplicationController
4 4
5 5 include MailHelperMethods
6 6
7 7 before_filter :authenticate, :except => [:new,
8 8 :register,
9 9 :confirm,
10 10 :forget,
11 11 :retrieve_password]
12 12
13 13 before_filter :verify_online_registration, :only => [:new,
14 14 :register,
15 15 :forget,
16 16 :retrieve_password]
17 17 before_filter :authenticate, :profile_authorization, only: [:profile]
18 18
19 + before_filter :admin_authorization, only: [:stat, :toggle_activate, :toggle_enable]
20 +
21 +
19 22 verify :method => :post, :only => [:chg_passwd],
20 23 :redirect_to => { :action => :index }
21 24
22 25 #in_place_edit_for :user, :alias_for_editing
23 26 #in_place_edit_for :user, :email_for_editing
24 27
25 28 def index
26 29 if !GraderConfiguration['system.user_setting_enabled']
27 30 redirect_to :controller => 'main', :action => 'list'
28 31 else
29 32 @user = User.find(session[:user_id])
30 33 end
31 34 end
32 35
33 36 def chg_passwd
34 37 user = User.find(session[:user_id])
35 38 user.password = params[:passwd]
36 39 user.password_confirmation = params[:passwd_verify]
37 40 if user.save
38 41 flash[:notice] = 'password changed'
39 42 else
40 43 flash[:notice] = 'Error: password changing failed'
41 44 end
42 45 redirect_to :action => 'index'
43 46 end
44 47
45 48 def new
46 49 @user = User.new
47 50 render :action => 'new', :layout => 'empty'
48 51 end
49 52
50 53 def register
51 54 if(params[:cancel])
52 55 redirect_to :controller => 'main', :action => 'login'
53 56 return
54 57 end
55 58 @user = User.new(user_params)
56 59 @user.password_confirmation = @user.password = User.random_password
57 60 @user.activated = false
58 61 if (@user.valid?) and (@user.save)
59 62 if send_confirmation_email(@user)
60 63 render :action => 'new_splash', :layout => 'empty'
61 64 else
62 65 @admin_email = GraderConfiguration['system.admin_email']
63 66 render :action => 'email_error', :layout => 'empty'
64 67 end
65 68 else
66 69 @user.errors.add(:base,"Email cannot be blank") if @user.email==''
67 70 render :action => 'new', :layout => 'empty'
68 71 end
69 72 end
70 73
71 74 def confirm
72 75 login = params[:login]
73 76 key = params[:activation]
74 77 @user = User.find_by_login(login)
75 78 if (@user) and (@user.verify_activation_key(key))
76 79 if @user.valid? # check uniquenss of email
77 80 @user.activated = true
78 81 @user.save
79 82 @result = :successful
80 83 else
81 84 @result = :email_used
82 85 end
83 86 else
84 87 @result = :failed
85 88 end
86 89 render :action => 'confirm', :layout => 'empty'
87 90 end
88 91
89 92 def forget
90 93 render :action => 'forget', :layout => 'empty'
91 94 end
92 95
93 96 def retrieve_password
94 97 email = params[:email]
95 98 user = User.find_by_email(email)
96 99 if user
97 100 last_updated_time = user.updated_at || user.created_at || (Time.now.gmtime - 1.hour)
98 101 if last_updated_time > Time.now.gmtime - 5.minutes
99 102 flash[:notice] = 'The account has recently created or new password has recently been requested. Please wait for 5 minutes'
100 103 else
101 104 user.password = user.password_confirmation = User.random_password
102 105 user.save
103 106 send_new_password_email(user)
104 107 flash[:notice] = 'New password has been mailed to you.'
105 108 end
106 109 else
107 110 flash[:notice] = I18n.t 'registration.password_retrieval.no_email'
108 111 end
109 112 redirect_to :action => 'forget'
110 113 end
111 114
112 115 def stat
113 116 @user = User.find(params[:id])
114 117 @submission = Submission.joins(:problem).where(user_id: params[:id])
@@ -1,152 +1,174
1 1 %h2 Live submit
2 2 %br
3 3
4 4 %textarea#text_sourcecode{style: "display:none"}~ @source
5 5 .container
6 6 .row
7 7 .col-md-12
8 8 .alert.alert-info
9 9 Write your code in the following box, choose language, and click submit button when finished
10 10 .row
11 11 .col-md-8
12 12 %div#editor{style: 'height: 500px; border-radius: 7px; font-size: 14px;'}
13 13 .col-md-4
14 14 - # submission form
15 15 = form_tag({controller: :main, :action => 'submit'}, :multipart => true, class: 'form') do
16 16
17 17 = hidden_field_tag 'editor_text', @source
18 18 = hidden_field_tag 'submission[problem_id]', @problem.id
19 19 .form-group
20 20 = label_tag "Task:"
21 21 = text_field_tag 'asdf', "#{@problem.long_name}", class: 'form-control', disabled: true
22 22 .form-group
23 23 = label_tag "Description:"
24 24 = link_to_description_if_any "[download] <span class='glyphicon glyphicon-file'></span>".html_safe, @problem
25 25
26 26 .form-group
27 27 = label_tag 'Language:'
28 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 29 .form-group
30 + .input-group
31 + %span.input-group-btn
32 + %span.btn.btn-default.btn-file
33 + Browse
34 + = file_field_tag 'load_file'
35 + = text_field_tag '' , nil, {readonly: true, class: 'form-control'}
36 + .form-group
30 37 = submit_tag 'Submit', class: 'btn btn-success', id: 'live_submit',
31 38 data: {confirm: "Submitting this source code for task #{@problem.long_name}?"}
32 39 - # latest submission status
33 40 .panel{class: (@submission && @submission.graded_at) ? "panel-info" : "panel-warning"}
34 41 .panel-heading
35 42 Latest Submission Status
36 43 = link_to "Refresh",get_latest_submission_status_submissions_path(@submission.user,@problem), class: "btn btn-default btn-sm", remote: true if @submission
37 44 .panel-body
38 45 %div#latest_status
39 46 - if @submission
40 47 = render :partial => 'submission_short',
41 48 :locals => {submission: @submission, problem_name: @problem.name, problem_id: @problem.id }
42 49 .row
43 50 .col-md-12
44 51 %h2 Console
45 52 %textarea#console{style: 'height: 100%; width: 100%;background-color:#000;color:#fff;font-family: consolas, monaco, "Droid Sans Mono";',rows: 20}
46 53
47 54 :javascript
48 55 $(document).ready(function() {
49 56 e = ace.edit("editor")
50 57 e.setValue($("#text_sourcecode").val());
51 58 e.gotoLine(1);
52 59 $("#language_id").trigger('change');
53 - brython();
60 +
61 + $("#load_file").on('change',function(evt) {
62 + var file = evt.target.files[0];
63 + var reader = new FileReader();
64 + reader.onload = function(theFile) {
65 + var e = ace.edit("editor")
66 + e.setValue(theFile.target.result);
67 + e.gotoLine(1);
68 + };
69 + reader.readAsText(file)
70 + });
71 +
72 + //brython();
54 73 });
55 74
56 75
76 +
77 +
78 +
57 79 %script#__main__{type:'text/python3'}
58 80 :plain
59 81 import sys
60 82 import traceback
61 83
62 84 from browser import document as doc
63 85 from browser import window, alert, console
64 86
65 87 _credits = """ Thanks to CWI, CNRI, BeOpen.com, Zope Corporation and a cast of thousands
66 88 for supporting Python development. See www.python.org for more information."""
67 89
68 90 _copyright = """Copyright (c) 2012, Pierre Quentel pierre.quentel@gmail.com
69 91 All Rights Reserved.
70 92
71 93 Copyright (c) 2001-2013 Python Software Foundation.
72 94 All Rights Reserved.
73 95
74 96 Copyright (c) 2000 BeOpen.com.
75 97 All Rights Reserved.
76 98
77 99 Copyright (c) 1995-2001 Corporation for National Research Initiatives.
78 100 All Rights Reserved.
79 101
80 102 Copyright (c) 1991-1995 Stichting Mathematisch Centrum, Amsterdam.
81 103 All Rights Reserved."""
82 104
83 105 _license = """Copyright (c) 2012, Pierre Quentel pierre.quentel@gmail.com
84 106 All rights reserved.
85 107
86 108 Redistribution and use in source and binary forms, with or without
87 109 modification, are permitted provided that the following conditions are met:
88 110
89 111 Redistributions of source code must retain the above copyright notice, this
90 112 list of conditions and the following disclaimer. Redistributions in binary
91 113 form must reproduce the above copyright notice, this list of conditions and
92 114 the following disclaimer in the documentation and/or other materials provided
93 115 with the distribution.
94 116 Neither the name of the <ORGANIZATION> nor the names of its contributors may
95 117 be used to endorse or promote products derived from this software without
96 118 specific prior written permission.
97 119
98 120 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
99 121 AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
100 122 IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
101 123 ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
102 124 LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
103 125 CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
104 126 SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
105 127 INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
106 128 CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
107 129 ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
108 130 POSSIBILITY OF SUCH DAMAGE.
109 131 """
110 132
111 133 def credits():
112 134 print(_credits)
113 135 credits.__repr__ = lambda:_credits
114 136
115 137 def copyright():
116 138 print(_copyright)
117 139 copyright.__repr__ = lambda:_copyright
118 140
119 141 def license():
120 142 print(_license)
121 143 license.__repr__ = lambda:_license
122 144
123 145 def write(data):
124 146 doc['console'].value += str(data)
125 147
126 148
127 149 sys.stdout.write = sys.stderr.write = write
128 150 history = []
129 151 current = 0
130 152 _status = "main" # or "block" if typing inside a block
131 153
132 154 # execution namespace
133 155 editor_ns = {'credits':credits,
134 156 'copyright':copyright,
135 157 'license':license,
136 158 '__name__':'__main__'}
137 159
138 160 def cursorToEnd(*args):
139 161 pos = len(doc['console'].value)
140 162 doc['console'].setSelectionRange(pos, pos)
141 163 doc['console'].scrollTop = doc['console'].scrollHeight
142 164
143 165 def get_col(area):
144 166 # returns the column num of cursor
145 167 sel = doc['console'].selectionStart
146 168 lines = doc['console'].value.split('\n')
147 169 for line in lines[:-1]:
148 170 sel -= len(line) + 1
149 171 return sel
150 172
151 173
152 174 def myKeyPress(event):
You need to be logged in to leave comments. Login now