Implement offline POST method for starting an offline participation
This commit is contained in:
		| @@ -30,8 +30,12 @@ class ApplicationController < ActionController::Base | ||||
|   def user_not_authorized(exception) | ||||
|     policy_name = exception.policy.class.to_s.underscore | ||||
|  | ||||
|     flash[:error] = t "#{policy_name}.#{exception.query}", scope: "pundit", default: :default | ||||
|     redirect_back_or_to(root_path) | ||||
|     if current_user | ||||
|       flash[:error] = t "#{policy_name}.#{exception.query}", scope: "pundit", default: :default | ||||
|       redirect_back_or_to(root_path) | ||||
|     else | ||||
|       not_found | ||||
|     end | ||||
|   end | ||||
|  | ||||
|   def not_found | ||||
|   | ||||
| @@ -1,6 +1,7 @@ | ||||
| class ContestsController < ApplicationController | ||||
|   before_action :set_contest, only: %i[ destroy edit show update ] | ||||
|   skip_before_action :require_authentication, only: %i[ scoreboard offline_new ] | ||||
|   before_action :offline_setup, only: %i[ offline_new offline_create ] | ||||
|   skip_before_action :require_authentication, only: %i[ scoreboard offline_new offline_create ] | ||||
|  | ||||
|   def index | ||||
|     authorize :contest | ||||
| @@ -100,22 +101,30 @@ class ContestsController < ApplicationController | ||||
|   end | ||||
|  | ||||
|   def offline_new | ||||
|     @contest = Contest.find_by(slug: params[:id]) | ||||
|     unless @contest && @contest.offline_form | ||||
|       skip_authorization | ||||
|       not_found and return | ||||
|     end | ||||
|     authorize :contest | ||||
|  | ||||
|     I18n.locale = @contest.lang | ||||
|  | ||||
|     @title = I18n.t("contests.scoreboard.title", name: @contest.name) | ||||
|  | ||||
|     authorize @contest | ||||
|     @offline = Offline.new | ||||
|   end | ||||
|  | ||||
|   def offline_create | ||||
|     authorize @contest | ||||
|     @offline = Offline.new(offline_start_params) | ||||
|     @offline.contest = @contest | ||||
|     @offline.start_time = Time.now() | ||||
|     if @offline.save | ||||
|       redirect_to "/public/#{@contest.friendly_id}/offline/test" | ||||
|     else | ||||
|       render :offline_new, status: :unprocessable_entity | ||||
|     end | ||||
|   end | ||||
|  | ||||
|   private | ||||
|  | ||||
|   def offline_setup | ||||
|     @contest = Contest.find_by(slug: params[:id]) | ||||
|     I18n.locale = @contest.lang | ||||
|     @title = I18n.t("contests.scoreboard.title", name: @contest.name) | ||||
|   end | ||||
|  | ||||
|   def set_badges | ||||
|     @badges = [] | ||||
|     @badges.push(t("helpers.badges.team")) if @contest.team | ||||
| @@ -139,4 +148,8 @@ class ContestsController < ApplicationController | ||||
|       end | ||||
|     end | ||||
|   end | ||||
|  | ||||
|   def offline_start_params | ||||
|     params.expect(offline: [ :name, :start_image ]) | ||||
|   end | ||||
| end | ||||
|   | ||||
		Reference in New Issue
	
	Block a user