diff --git a/app/assets/javascripts/announcements.js.coffee b/app/assets/javascripts/announcements.js.coffee
--- a/app/assets/javascripts/announcements.js.coffee
+++ b/app/assets/javascripts/announcements.js.coffee
@@ -1,13 +1,5 @@
#js for announcement
$ ->
- $('.ajax-toggle').on 'click', (event) ->
- target = $(event.target)
- target.removeClass 'btn-default'
- target.removeClass 'btn-success'
- target.addClass 'btn-warning'
- target.text '...'
- return
-
$(document).ajaxError (event, jqxhr, settings, exception) ->
if jqxhr.status
alert 'We\'re sorry, but something went wrong (' + jqxhr.status + ')'
diff --git a/app/assets/javascripts/custom.js.coffee b/app/assets/javascripts/custom.js.coffee
--- a/app/assets/javascripts/custom.js.coffee
+++ b/app/assets/javascripts/custom.js.coffee
@@ -30,6 +30,12 @@
if url
window.location.href = url
return
- return
+ $('.ajax-toggle').on 'click', (event) ->
+ target = $(event.target)
+ target.removeClass 'btn-default'
+ target.removeClass 'btn-success'
+ target.addClass 'btn-warning'
+ target.text '...'
+ return
-
+ return
diff --git a/app/controllers/announcements_controller.rb b/app/controllers/announcements_controller.rb
--- a/app/controllers/announcements_controller.rb
+++ b/app/controllers/announcements_controller.rb
@@ -83,7 +83,8 @@
@announcement = Announcement.find(params[:id])
@announcement.update_attributes( published: !@announcement.published? )
respond_to do |format|
- format.js {}
+ format.js { render partial: 'toggle_button',
+ locals: {button_id: "#announcement_toggle_#{@announcement.id}",button_on: @announcement.published? } }
end
end
diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb
--- a/app/controllers/application_controller.rb
+++ b/app/controllers/application_controller.rb
@@ -47,12 +47,17 @@
# check if run in single user mode
if GraderConfiguration[SINGLE_USER_MODE_CONF_KEY]
- user = User.find(session[:user_id])
+ user = User.find_by_id(session[:user_id])
if user==nil or (not user.admin?)
flash[:notice] = 'You cannot log in at this time'
redirect_to :controller => 'main', :action => 'login'
return false
end
+ unless user.enabled?
+ flash[:notice] = 'Your account is disabled'
+ redirect_to :controller => 'main', :action => 'login'
+ return false
+ end
return true
end
diff --git a/app/controllers/problems_controller.rb b/app/controllers/problems_controller.rb
--- a/app/controllers/problems_controller.rb
+++ b/app/controllers/problems_controller.rb
@@ -123,7 +123,7 @@
@problem = Problem.find(params[:id])
@problem.update_attributes(available: !(@problem.available) )
respond_to do |format|
- format.js {}
+ format.js { }
end
end
diff --git a/app/controllers/user_admin_controller.rb b/app/controllers/user_admin_controller.rb
--- a/app/controllers/user_admin_controller.rb
+++ b/app/controllers/user_admin_controller.rb
@@ -17,7 +17,6 @@
def index
list
- render :action => 'list'
end
def list
diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb
--- a/app/controllers/users_controller.rb
+++ b/app/controllers/users_controller.rb
@@ -133,6 +133,24 @@
problem.each_value { |v| @summary[:solve] += 1 if v == 1 }
end
+ def toggle_activate
+ @user = User.find(params[:id])
+ @user.update_attributes( activated: !@user.activated? )
+ respond_to do |format|
+ format.js { render partial: 'toggle_button',
+ locals: {button_id: "#toggle_activate_user_#{@user.id}",button_on: @user.activated? } }
+ end
+ end
+
+ def toggle_enable
+ @user = User.find(params[:id])
+ @user.update_attributes( enabled: !@user.enabled? )
+ respond_to do |format|
+ format.js { render partial: 'toggle_button',
+ locals: {button_id: "#toggle_enable_user_#{@user.id}",button_on: @user.enabled? } }
+ end
+ end
+
protected
def verify_online_registration
@@ -192,4 +210,5 @@
admin_authorization
end
+
end
diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb
--- a/app/helpers/application_helper.rb
+++ b/app/helpers/application_helper.rb
@@ -107,16 +107,11 @@
end
end
- def problem_select(problems, options = {})
- prefix = options[:with_specific_in_header] ? [[(t 'main.specified_in_header'),'-1']] : []
- selected = options[:selected] || (options[:with_specific_in_header] ? -1 : nil)
- puts "selected = #{selected} hehe"
- html_options = {class: 'select2 form-control'}
- html_options[:id] = options[:id]if options[:id]
- select 'submission',
- 'problem_id', prefix + problems.collect {|p| ["[#{p.name}] #{p.full_name}", p.id]},
- (selected ? { selected: "#{selected}"} : {} ),
- html_options
+ def toggle_button(on,toggle_url,id)
+ link_to (on ? "Yes" : "No"), toggle_url,
+ {class: "btn btn-block btn-xs btn-#{on ? 'success' : 'default'} ajax-toggle",
+ id: id,
+ data: {remote: true, method: 'get'}}
end
def user_title_bar(user)
diff --git a/app/views/announcements/index.html.haml b/app/views/announcements/index.html.haml
--- a/app/views/announcements/index.html.haml
+++ b/app/views/announcements/index.html.haml
@@ -27,9 +27,8 @@
%br/
= h announcement.body
%td= h announcement.author
- // %td= check_box_tag :published, 1, announcement.published, { class: 'bootstrap-toggle', id: "published-#{announcement.id}", data: {remote: true, method: 'PUT', url: url_for(controller: :announcements, action: :toggle, id: announcement), size: 'small', toggle: 'toggle' } }
- //
in_place_editor_field :announcement, :published, {}, :rows => 1 |
- %td= link_to (announcement.published? ? "Yes" : "No"), url_for(controller: :announcements, action: :toggle, id: announcement), { class: "btn btn-block btn-sm btn-#{(announcement.published? ? 'success' : 'default')} ajax-toggle", id: "published-#{announcement.id}", data: {remote: true, method: 'post' } }
+ %td= toggle_button(announcement.published?, toggle_announcement_url(@announcement), "announcement_toggle_#{@announcement.id}")
+ //%td= link_to (announcement.published? ? "Yes" : "No"), url_for(controller: :announcements, action: :toggle, id: announcement), { class: "btn btn-block btn-sm btn-#{(announcement.published? ? 'success' : 'default')} ajax-toggle", id: "published-#{announcement.id}", data: {remote: true, method: 'post' } }
%td= link_to 'Edit', edit_announcement_path(announcement), class: 'btn btn-block btn-sm btn-info'
%td= link_to 'Destroy', announcement, :confirm => 'Are you sure?', :method => :delete, class: "btn btn-block btn-sm btn-danger"
%br
diff --git a/app/views/announcements/toggle.js.haml b/app/views/announcements/toggle.js.haml
deleted file mode 100644
--- a/app/views/announcements/toggle.js.haml
+++ /dev/null
@@ -1,8 +0,0 @@
-:plain
- var t = $("#published-#{@announcement.id}");
- t.removeClass('btn-default');
- t.removeClass('btn-success');
- t.removeClass('btn-warning');
- t.addClass("btn-#{@announcement.published? ? 'success' : 'default'}");
- t.attr("data-params","published=#{!@announcement.published?}");
- t.text("#{@announcement.published? ? "Yes" : "No"}");
diff --git a/app/views/application/_toggle_button.js.haml b/app/views/application/_toggle_button.js.haml
new file mode 100644
--- /dev/null
+++ b/app/views/application/_toggle_button.js.haml
@@ -0,0 +1,7 @@
+:plain
+ var t = $("#{button_id}");
+ t.removeClass('btn-default');
+ t.removeClass('btn-success');
+ t.removeClass('btn-warning');
+ t.addClass("btn-#{button_on ? 'success' : 'default'}");
+ t.text("#{button_on ? 'Yes' : 'No'}");
diff --git a/app/views/problems/index.html.haml b/app/views/problems/index.html.haml
--- a/app/views/problems/index.html.haml
+++ b/app/views/problems/index.html.haml
@@ -16,7 +16,7 @@
%label{:for => "problem_full_name"} Full name
= text_field 'problem', 'full_name'
= submit_tag "Create"
-%table.table.table-condensed.table-hover
+%table.table.table-condense.table-hover
%thead
%th Name
%th Full name
@@ -33,14 +33,15 @@
%td= in_place_editor_field :problem, :full_name, {}, :rows=>1
%td= in_place_editor_field :problem, :full_score, {}, :rows=>1
%td= problem.date_added
- %td{}= link_to (@problem.available? ? "Yes" : "No"), url_for(controller: :problems, action: :toggle, id: @problem), { class: "btn btn-block btn-sm btn-#{(@problem.available? ? 'success' : 'default')} ajax-toggle", id: "prob-#{@problem.id}-avail", data: {remote: true, method: 'post' } }
+ %td= toggle_button(@problem.available?, url_for(controller: :problems, action: :toggle, id: @problem), "problem-avail-#{@problem.id}")
+ //%td{}= link_to (@problem.available? ? "Yes" : "No"), url_for(controller: :problems, action: :toggle, id: @problem), { class: "btn btn-block btn-sm btn-#{(@problem.available? ? 'success' : 'default')} ajax-toggle", id: "problem-avail-#{@problem.id}", data: {remote: true, method: 'post' } }
%td= problem.test_allowed
- if GraderConfiguration.multicontests?
%td
= problem.contests.collect { |c| c.name }.join(', ')
- %td= link_to 'Stat', {:action => 'stat', :id => problem.id}, class: 'btn btn-primary btn-sm'
- %td= link_to 'Show', {:action => 'show', :id => problem}, class: 'btn btn-primary btn-sm'
- %td= link_to 'Edit', {:action => 'edit', :id => problem}, class: 'btn btn-primary btn-sm'
- %td= link_to 'Destroy', { :action => 'destroy', :id => problem }, :confirm => 'Are you sure?', :method => :post, class: 'btn btn-danger btn-sm'
+ %td= link_to 'Stat', {:action => 'stat', :id => problem.id}, class: 'btn btn-info btn-xs btn-block'
+ %td= link_to 'Show', {:action => 'show', :id => problem}, class: 'btn btn-info btn-xs btn-block'
+ %td= link_to 'Edit', {:action => 'edit', :id => problem}, class: 'btn btn-info btn-xs btn-block'
+ %td= link_to 'Destroy', { :action => 'destroy', :id => problem }, :confirm => 'Are you sure?', :method => :post, class: 'btn btn-danger btn-xs btn-block'
%br/
= link_to '[New problem]', :action => 'new'
diff --git a/app/views/problems/toggle.js.haml b/app/views/problems/toggle.js.haml
--- a/app/views/problems/toggle.js.haml
+++ b/app/views/problems/toggle.js.haml
@@ -1,10 +1,6 @@
+= render partial: 'toggle_button',
+ locals: {button_id: "#problem-avail-#{@problem.id}",button_on: @problem.available }
:plain
- b = $("#prob-#{@problem.id}-avail");
- b.removeClass('btn-default');
- b.removeClass('btn-success');
- b.removeClass('btn-warning');
- b.addClass("btn-#{@problem.available? ? 'success' : 'default'}");
- b.text("#{@problem.available? ? 'Yes' : 'No'}");
r = $("#prob-#{@problem.id}");
r.removeClass('success');
r.removeClass('danger');
diff --git a/app/views/user_admin/index.html.haml b/app/views/user_admin/index.html.haml
new file mode 100644
--- /dev/null
+++ b/app/views/user_admin/index.html.haml
@@ -0,0 +1,86 @@
+%h1 Listing users
+.submitbox
+ %b Quick add
+ = form_tag :action => 'create' do
+ %table{:border => "0"}
+ %tr
+ %td
+ %label{:for => "user_login"} Login
+ %td
+ %label{:for => "user_full_name"} Full name
+ %td
+ %label{:for => "user_password"} Password
+ %td
+ %label{:for => "user_password_confirmation"} Confirm
+ %td
+ %label{:for => "user_email"} Email
+ %tr
+ %td= text_field 'user', 'login', :size => 10
+ %td= text_field 'user', 'full_name', :size => 30
+ %td= password_field 'user', 'password', :size => 10
+ %td= password_field 'user', 'password_confirmation', :size => 10
+ %td= email_field 'user', 'email', :size => 15
+ %td= submit_tag "Create"
+ %br/
+ %b Import from site management
+ = form_tag({:action => 'import'}, :multipart => true) do
+ File: #{file_field_tag 'file'} #{submit_tag 'Import'}
+ %br/
+ %b What else:
+ = link_to 'New user', {:action => 'new'}, { class: 'btn btn-default btn-sm'}
+ = link_to 'New list of users',{ :action => 'new_list'}, { class: 'btn btn-default btn-sm'}
+ = link_to 'View administrators',{ :action => 'admin'}, { class: 'btn btn-default btn-sm'}
+ = link_to 'Random passwords',{ :action => 'random_all_passwords'}, { class: 'btn btn-default btn-sm'}
+ = link_to 'View active users',{ :action => 'active'}, { class: 'btn btn-default btn-sm'}
+ = link_to 'Mass mailing',{ :action => 'mass_mailing'}, { class: 'btn btn-default btn-sm'}
+ - if GraderConfiguration.multicontests?
+ %br/
+ %b Multi-contest:
+ = link_to '[Manage bulk users in contests]', :action => 'contest_management'
+ View users in:
+ - @contests.each do |contest|
+ = link_to "[#{contest.name}]", :action => 'contests', :id => contest.id
+ = link_to "[no contest]", :action => 'contests', :id => 'none'
+Total #{@user_count} users |
+- if !@paginated
+ Display all users.
+ \#{link_to '[show in pages]', :action => 'index', :page => '1'}
+- else
+ Display in pages.
+ \#{link_to '[display all]', :action => 'index', :page => 'all'} |
+ \#{will_paginate @users, :container => false}
+
+
+%table.table.table-hover.table-condense
+ %thead
+ %th Login
+ %th Full name
+ %th email
+ %th Remark
+ %th
+ Activated
+ %sup{class: 'text-primary',data: {toggle: 'tooltip', placement: 'top'}, title: 'User has already confirmed the email?' } [?]
+ %th
+ Enabled
+ %sup{class: 'text-primary',data: {toggle: 'tooltip', placement: 'top'}, title: 'Allow the user to login?' } [?]
+ %th Last IP
+ %th
+ %th
+ %th
+ %th
+ - for user in @users
+ %tr
+ %td= link_to user.login, controller: :users, :action => 'profile', :id => user
+ %td= user.full_name
+ %td= user.email
+ %td= user.remark
+ %td= toggle_button(user.activated?, toggle_activate_user_url(user),"toggle_activate_user_#{user.id}")
+ %td= toggle_button(user.enabled?, toggle_enable_user_url(user),"toggle_enable_user_#{user.id}")
+ %td= user.last_ip
+ %td= link_to 'Clear IP', {:action => 'clear_last_ip', :id => user, :page=>params[:page]}, :confirm => 'This will reset last logging in ip of the user, are you sure?', class: 'btn btn-default btn-xs btn-block'
+ %td= link_to 'Show', {:action => 'show', :id => user}, class: 'btn btn-default btn-xs btn-block'
+ %td= link_to 'Edit', {:action => 'edit', :id => user}, class: 'btn btn-default btn-xs btn-block'
+ %td= link_to 'Destroy', { :action => 'destroy', :id => user }, :confirm => 'Are you sure?', :method => :post, class: 'btn btn-danger btn-xs btn-block'
+%br/
+= link_to '[New user]', :action => 'new'
+= link_to '[New list of users]', :action => 'new_list'
diff --git a/config/routes.rb b/config/routes.rb
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -1,19 +1,39 @@
CafeGrader::Application.routes.draw do
root :to => 'main#login'
- get "report/login"
resources :contests
- resources :announcements
- match 'announcements/toggle/:id' => 'announcements#toggle'
-
resources :sites
- resources :problem
+ resources :announcements do
+ member do
+ get 'toggle'
+ end
+ end
+
+
+ resources :problems do
+ member do
+ get 'toggle'
+ end
+ collection do
+ get 'turn_all_off'
+ get 'turn_all_on'
+ get 'import'
+ get 'manage'
+ end
+ end
resources :grader_configuration, controller: 'configurations'
+ resources :users do
+ member do
+ get 'toggle_activate', 'toggle_enable'
+ end
+ end
+
+
match 'tasks/view/:file.:ext' => 'tasks#view'
match 'tasks/download/:id/:file.:ext' => 'tasks#download'
match 'heartbeat/:id/edit' => 'heartbeat#edit'
@@ -24,6 +44,7 @@
#report
get 'report/problem_hof(/:id)', to: 'report#problem_hof', as: 'report_problem_hof'
+ get "report/login"
# See how all your routes lay out with "rake routes"