From d52a058328fc29c0c22f551a57c8c6025d68e736 Mon Sep 17 00:00:00 2001 From: sto Date: Tue, 28 Jul 2026 13:13:46 +0200 Subject: [PATCH] Events: implement creation of new contests --- app/controllers/contests_controller.rb | 19 +++++++++++++++++-- app/views/contests/new.html.slim | 1 + app/views/events/show.html.slim | 6 +++--- config/locales/en.yml | 2 ++ config/locales/fr.yml | 2 ++ 5 files changed, 25 insertions(+), 5 deletions(-) diff --git a/app/controllers/contests_controller.rb b/app/controllers/contests_controller.rb index c355cfa..5ac25e6 100644 --- a/app/controllers/contests_controller.rb +++ b/app/controllers/contests_controller.rb @@ -10,7 +10,7 @@ class ContestsController < ApplicationController def index authorize :contest - @contests = current_user.contests.includes([ :contestants, puzzles: [ :image_attachment ] ]).order(created_at: :desc) + @contests = current_user.contests.where(event: nil).includes([ :contestants, puzzles: [ :image_attachment ] ]).order(created_at: :desc) @title = I18n.t("contests.index.title", username: current_user.username) end @@ -125,6 +125,9 @@ class ContestsController < ApplicationController authorize :contest @contest = Contest.new + if params.key?(:event) + @contest.event_id = params[:event] + end @title = I18n.t("contests.new.title") @nonav = true end @@ -136,6 +139,18 @@ class ContestsController < ApplicationController @contest.lang = @current_user.lang @contest.ranking_mode = "actual" @contest.user_id = current_user.id + + # Check if the provided event_id exists and belongs to the current user. If not, remove + # the link to the event. + begin + event = Event.find(@contest.event_id) + if current_user != event.user + @contest.event_id = nil + end + rescue + @contest.event_id = nil + end + if @contest.save redirect_to "/contests/#{@contest.id}/settings/general", notice: t("contests.new.notice") else @@ -274,7 +289,7 @@ class ContestsController < ApplicationController end def new_contest_params - params.expect(contest: [ :name, :duration ]) + params.expect(contest: [ :name, :duration, :event_id ]) end def settings_general_params diff --git a/app/views/contests/new.html.slim b/app/views/contests/new.html.slim index 2834e52..265726f 100644 --- a/app/views/contests/new.html.slim +++ b/app/views/contests/new.html.slim @@ -1,4 +1,5 @@ = form_with model: @contest do |form| + = form.hidden_field :event_id .row.mb-3 .col .form-floating diff --git a/app/views/events/show.html.slim b/app/views/events/show.html.slim index b091cee..ff27fa5 100644 --- a/app/views/events/show.html.slim +++ b/app/views/events/show.html.slim @@ -1,10 +1,10 @@ .row .col h4.mb-3 - = t("contests.index.manage_contests") + = t("events.index.manage_contests") .float-end - a.btn.btn-primary.mb-4 href=new_contest_path - = t("contests.index.new_contest") + a.btn.btn-primary.mb-4 href=new_contest_path(event: @event.id) + = t("events.index.new_contest") .row.row-cols-1.row-cols-md-3.g-4 - @contests.each do |contest| diff --git a/config/locales/en.yml b/config/locales/en.yml index 7d16948..bac8961 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -293,9 +293,11 @@ en: index: contest: contest contests: contests + manage_contests: Contests in this event message: New feature! Events offer to groupe multiple contests in one management space. This also offers, if activated, to have a single scoreboard link for all contests of an event. my_contests_outside_events: My contests not linked to any event new: Create a new event + new_contest: Add a contest to this event subtitle: My events title: Welcome %{username}! new: diff --git a/config/locales/fr.yml b/config/locales/fr.yml index 669c72e..f1de311 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -264,9 +264,11 @@ fr: index: contest: épreuve contests: épreuves + manage_contests: Épreuves de cet événement message: Nouvelle fonctionalité ! Les événements permettent de regrouper plusieurs concours/épreuves en un seul espace de gestion. Cela permet aussi, si souhaité, d'avoir un lien de classement commun à toutes les épreuces d'un même événement. my_contests_outside_events: Mes concours non associés à un événement new: Créer un nouvel événement + new_contest: Ajouter une épreuve à cet événement subtitle: Mes événements title: Bienvenue %{username} ! new: