Add admin panel for users and votes

Closes #2
This commit is contained in:
ricola 2025-06-08 20:46:37 -06:00
parent 9993d04ab0
commit 5fa73da51a
12 changed files with 484 additions and 82 deletions

View file

@ -0,0 +1,5 @@
class AddAdminToUsers < ActiveRecord::Migration[7.2]
def change
add_column :users, :admin, :boolean
end
end

View file

@ -10,7 +10,7 @@
#
# It's strongly recommended that you check this file into your version control system.
ActiveRecord::Schema[7.2].define(version: 2025_06_07_233053) do
ActiveRecord::Schema[7.2].define(version: 2025_06_08_223006) do
create_table "candidates", force: :cascade do |t|
t.integer "vote_id"
t.string "name"
@ -45,6 +45,7 @@ ActiveRecord::Schema[7.2].define(version: 2025_06_07_233053) do
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.string "reset"
t.boolean "admin"
end
create_table "votes", force: :cascade do |t|

View file

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-06-08 15:49-0600\n"
"POT-Creation-Date: 2025-06-08 20:44-0600\n"
"PO-Revision-Date: 2025-03-29 20:41-0600\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@ -41,46 +41,140 @@ msgstr "Bé"
msgid "Very good"
msgstr "Molt bé"
#: ../vedia.rb:118
#: ../vedia.rb:119
msgid "Incorrect email or password."
msgstr "Correu o contrasenya incorrecte."
#: ../vedia.rb:140
#: ../vedia.rb:141
msgid "Reset your password"
msgstr "Reiniciar contrasenya"
#: ../views/home.erb:1 ../views/layout.erb:23
msgid "Home"
msgstr "Inici"
#: ../views/admin.erb:1 ../views/admin_users.erb:1 ../views/admin_votes.erb:1
#: ../views/layout.erb:26
msgid "Admin"
msgstr "Admin"
#: ../views/home.erb:3
#: ../views/admin.erb:3
msgid "Users"
msgstr "Usuàries"
#: ../views/admin.erb:13 ../views/home.erb:3
msgid "Votes"
msgstr "Votacions"
#: ../views/admin.erb:21 ../views/home.erb:12 ../views/votes_show_draft.erb:1
msgid "(Draft)"
msgstr "(Esborrany)"
#: ../views/admin.erb:23 ../views/home.erb:16
msgid "(Open)"
msgstr "(Oberta)"
#: ../views/admin.erb:25 ../views/home.erb:20
msgid "(Closed)"
msgstr "(Tancada)"
#: ../views/admin_users.erb:5 ../views/admin_votes.erb:7
msgid "Created: %{date}"
msgstr "Creada: %{date}"
#: ../views/admin_users.erb:7 ../views/admin_votes.erb:9
msgid "Updated: %{date}"
msgstr "Modificada: %{date}"
#: ../views/admin_users.erb:9
msgid "Admin: %{admin}"
msgstr "Admin: %{admin}"
#: ../views/admin_users.erb:9
msgid "Yes"
msgstr "Sí"
#: ../views/admin_users.erb:9
msgid "No"
msgstr "No"
#: ../views/admin_users.erb:11
msgid "Organized votes"
msgstr "Votacions organitzades"
#: ../views/admin_users.erb:19 ../views/admin_users.erb:38
#: ../views/admin_votes.erb:27 ../views/admin_votes.erb:46
#: ../views/votes_edit.erb:21
msgid "Delete"
msgstr "Suprimir"
#: ../views/admin_users.erb:26
msgid "No vote organized."
msgstr "Cap votació organitzada."
#: ../views/admin_users.erb:30 ../views/admin_votes.erb:38
msgid "Ratings"
msgstr "Valoracions"
#: ../views/admin_users.erb:45 ../views/admin_votes.erb:53
msgid "No rating."
msgstr "Cap valoració."
#: ../views/admin_users.erb:52
msgid "Delete user"
msgstr "Suprimir usuària"
#: ../views/admin_votes.erb:5
msgid "View vote"
msgstr "Veure votació"
#: ../views/admin_votes.erb:11
msgid "Secure ID: %{secure_id}"
msgstr "ID segura"
#: ../views/admin_votes.erb:13
msgid "Description: %{description}"
msgstr "Descripció: %{description}"
#: ../views/admin_votes.erb:15 ../views/votes_open.erb:3
#: ../views/votes_show_closed.erb:4 ../views/votes_show_open.erb:4
msgid "Closing date: %{date}"
msgstr "Data de tancament: %{date}"
#: ../views/admin_votes.erb:15
msgid "None"
msgstr "Cap"
#: ../views/admin_votes.erb:17
msgid "State: %{state}"
msgstr "Estat: %{state}"
#: ../views/admin_votes.erb:19 ../views/votes_edit.erb:39
#: ../views/votes_show_closed.erb:79 ../views/votes_show_draft.erb:5
#: ../views/votes_show_open.erb:40
msgid "Organizers"
msgstr "Organitzadores"
#: ../views/admin_votes.erb:34
msgid "No organizer."
msgstr "Cap organitzadora."
#: ../views/admin_votes.erb:60 ../views/votes_edit.erb:68
msgid "Delete vote"
msgstr "Suprimir la votació"
#: ../views/home.erb:1 ../views/layout.erb:24
msgid "Home"
msgstr "Inici"
#: ../views/home.erb:11
msgid "(Draft, organized by you)"
msgstr "(Esborrany, organitzada per tu)"
#: ../views/home.erb:12 ../views/votes_show_draft.erb:1
msgid "(Draft)"
msgstr "(Esborrany)"
#: ../views/home.erb:15
msgid "(Open, organized by you)"
msgstr "(Oberta, organitzada per tu)"
#: ../views/home.erb:16
msgid "(Open)"
msgstr "(Oberta)"
#: ../views/home.erb:19
msgid "(Closed, organized by you)"
msgstr "(Tancada, organitzada per tu)"
#: ../views/home.erb:20
msgid "(Closed)"
msgstr "(Tancada)"
#: ../views/home.erb:28 ../views/votes_new.erb:12
msgid "Create new vote"
msgstr "Crear una nova votació"
@ -93,13 +187,13 @@ msgstr "Estàs connectada com a %{email}."
msgid "Logout"
msgstr "Desconnexió"
#: ../views/layout.erb:25 ../views/login.erb:1 ../views/login.erb:16
#: ../views/layout.erb:30 ../views/login.erb:1 ../views/login.erb:16
msgid "Login"
msgstr "Connexió"
#: ../views/login.erb:9 ../views/reset.erb:5 ../views/reset_change.erb:13
#: ../views/signup.erb:24 ../views/votes_edit.erb:51
#: ../views/votes_show_closed.erb:99 ../views/votes_show_open.erb:62
#: ../views/votes_show_closed.erb:99 ../views/votes_show_open.erb:66
msgid "Email"
msgstr "Correu"
@ -183,10 +277,6 @@ msgstr "Guardar"
msgid "Candidates"
msgstr "Opcions"
#: ../views/votes_edit.erb:21
msgid "Delete"
msgstr "Suprimir"
#: ../views/votes_edit.erb:25 ../views/votes_edit.erb:36
msgid "Add candidate"
msgstr "Afegeix una opció"
@ -195,19 +285,14 @@ msgstr "Afegeix una opció"
msgid "Name"
msgstr "Nom"
#: ../views/votes_edit.erb:39 ../views/votes_show_closed.erb:79
#: ../views/votes_show_draft.erb:5 ../views/votes_show_open.erb:38
msgid "Organizers"
msgstr "Organitzadores"
#: ../views/votes_edit.erb:47 ../views/votes_edit.erb:54
#: ../views/votes_show_closed.erb:95 ../views/votes_show_closed.erb:102
#: ../views/votes_show_open.erb:58 ../views/votes_show_open.erb:65
#: ../views/votes_show_open.erb:62 ../views/votes_show_open.erb:69
msgid "Add organizer"
msgstr "Afegeix organitzadora"
#: ../views/votes_edit.erb:57 ../views/votes_show_closed.erb:89
#: ../views/votes_show_open.erb:48
#: ../views/votes_show_open.erb:52
msgid "Actions for organizers"
msgstr "Accions per les organitzadores"
@ -220,10 +305,6 @@ msgstr "Obrir la votació als votants"
msgid "Add at least 2 candidates before opening the vote to participants."
msgstr "Afegeix com a mínim 2 opcions abans d'obrir la votació als votants."
#: ../views/votes_edit.erb:68
msgid "Delete vote"
msgstr "Suprimir la votació"
#: ../views/votes_new.erb:1
msgid "New vote"
msgstr "Nova votació"
@ -298,10 +379,10 @@ msgstr "Les teves valoracions"
msgid "Participants"
msgstr "Votants"
#: ../views/votes_show_open.erb:51
#: ../views/votes_show_open.erb:55
msgid "Change back to draft vote"
msgstr "Tornar a l'esborrany de votació"
#: ../views/votes_show_open.erb:55
#: ../views/votes_show_open.erb:59
msgid "Close votes and show results"
msgstr "Tancar la votació i veure els resultats"

View file

@ -8,8 +8,8 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-06-08 15:49-0600\n"
"PO-Revision-Date: 2025-06-08 15:49-0600\n"
"POT-Creation-Date: 2025-06-08 20:44-0600\n"
"PO-Revision-Date: 2025-06-08 20:44-0600\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n"
@ -42,46 +42,140 @@ msgstr ""
msgid "Very good"
msgstr ""
#: ../vedia.rb:118
#: ../vedia.rb:119
msgid "Incorrect email or password."
msgstr ""
#: ../vedia.rb:140
#: ../vedia.rb:141
msgid "Reset your password"
msgstr ""
#: ../views/home.erb:1 ../views/layout.erb:23
msgid "Home"
#: ../views/admin.erb:1 ../views/admin_users.erb:1 ../views/admin_votes.erb:1
#: ../views/layout.erb:26
msgid "Admin"
msgstr ""
#: ../views/home.erb:3
#: ../views/admin.erb:3
msgid "Users"
msgstr ""
#: ../views/admin.erb:13 ../views/home.erb:3
msgid "Votes"
msgstr ""
#: ../views/admin.erb:21 ../views/home.erb:12 ../views/votes_show_draft.erb:1
msgid "(Draft)"
msgstr ""
#: ../views/admin.erb:23 ../views/home.erb:16
msgid "(Open)"
msgstr ""
#: ../views/admin.erb:25 ../views/home.erb:20
msgid "(Closed)"
msgstr ""
#: ../views/admin_users.erb:5 ../views/admin_votes.erb:7
msgid "Created: %{date}"
msgstr ""
#: ../views/admin_users.erb:7 ../views/admin_votes.erb:9
msgid "Updated: %{date}"
msgstr ""
#: ../views/admin_users.erb:9
msgid "Admin: %{admin}"
msgstr ""
#: ../views/admin_users.erb:9
msgid "Yes"
msgstr ""
#: ../views/admin_users.erb:9
msgid "No"
msgstr ""
#: ../views/admin_users.erb:11
msgid "Organized votes"
msgstr ""
#: ../views/admin_users.erb:19 ../views/admin_users.erb:38
#: ../views/admin_votes.erb:27 ../views/admin_votes.erb:46
#: ../views/votes_edit.erb:21
msgid "Delete"
msgstr ""
#: ../views/admin_users.erb:26
msgid "No vote organized."
msgstr ""
#: ../views/admin_users.erb:30 ../views/admin_votes.erb:38
msgid "Ratings"
msgstr ""
#: ../views/admin_users.erb:45 ../views/admin_votes.erb:53
msgid "No rating."
msgstr ""
#: ../views/admin_users.erb:52
msgid "Delete user"
msgstr ""
#: ../views/admin_votes.erb:5
msgid "View vote"
msgstr ""
#: ../views/admin_votes.erb:11
msgid "Secure ID: %{secure_id}"
msgstr ""
#: ../views/admin_votes.erb:13
msgid "Description: %{description}"
msgstr ""
#: ../views/admin_votes.erb:15 ../views/votes_open.erb:3
#: ../views/votes_show_closed.erb:4 ../views/votes_show_open.erb:4
msgid "Closing date: %{date}"
msgstr ""
#: ../views/admin_votes.erb:15
msgid "None"
msgstr ""
#: ../views/admin_votes.erb:17
msgid "State: %{state}"
msgstr ""
#: ../views/admin_votes.erb:19 ../views/votes_edit.erb:39
#: ../views/votes_show_closed.erb:79 ../views/votes_show_draft.erb:5
#: ../views/votes_show_open.erb:40
msgid "Organizers"
msgstr ""
#: ../views/admin_votes.erb:34
msgid "No organizer."
msgstr ""
#: ../views/admin_votes.erb:60 ../views/votes_edit.erb:68
msgid "Delete vote"
msgstr ""
#: ../views/home.erb:1 ../views/layout.erb:24
msgid "Home"
msgstr ""
#: ../views/home.erb:11
msgid "(Draft, organized by you)"
msgstr ""
#: ../views/home.erb:12 ../views/votes_show_draft.erb:1
msgid "(Draft)"
msgstr ""
#: ../views/home.erb:15
msgid "(Open, organized by you)"
msgstr ""
#: ../views/home.erb:16
msgid "(Open)"
msgstr ""
#: ../views/home.erb:19
msgid "(Closed, organized by you)"
msgstr ""
#: ../views/home.erb:20
msgid "(Closed)"
msgstr ""
#: ../views/home.erb:28 ../views/votes_new.erb:12
msgid "Create new vote"
msgstr ""
@ -94,13 +188,13 @@ msgstr ""
msgid "Logout"
msgstr ""
#: ../views/layout.erb:25 ../views/login.erb:1 ../views/login.erb:16
#: ../views/layout.erb:30 ../views/login.erb:1 ../views/login.erb:16
msgid "Login"
msgstr ""
#: ../views/login.erb:9 ../views/reset.erb:5 ../views/reset_change.erb:13
#: ../views/signup.erb:24 ../views/votes_edit.erb:51
#: ../views/votes_show_closed.erb:99 ../views/votes_show_open.erb:62
#: ../views/votes_show_closed.erb:99 ../views/votes_show_open.erb:66
msgid "Email"
msgstr ""
@ -182,10 +276,6 @@ msgstr ""
msgid "Candidates"
msgstr ""
#: ../views/votes_edit.erb:21
msgid "Delete"
msgstr ""
#: ../views/votes_edit.erb:25 ../views/votes_edit.erb:36
msgid "Add candidate"
msgstr ""
@ -194,19 +284,14 @@ msgstr ""
msgid "Name"
msgstr ""
#: ../views/votes_edit.erb:39 ../views/votes_show_closed.erb:79
#: ../views/votes_show_draft.erb:5 ../views/votes_show_open.erb:38
msgid "Organizers"
msgstr ""
#: ../views/votes_edit.erb:47 ../views/votes_edit.erb:54
#: ../views/votes_show_closed.erb:95 ../views/votes_show_closed.erb:102
#: ../views/votes_show_open.erb:58 ../views/votes_show_open.erb:65
#: ../views/votes_show_open.erb:62 ../views/votes_show_open.erb:69
msgid "Add organizer"
msgstr ""
#: ../views/votes_edit.erb:57 ../views/votes_show_closed.erb:89
#: ../views/votes_show_open.erb:48
#: ../views/votes_show_open.erb:52
msgid "Actions for organizers"
msgstr ""
@ -219,10 +304,6 @@ msgstr ""
msgid "Add at least 2 candidates before opening the vote to participants."
msgstr ""
#: ../views/votes_edit.erb:68
msgid "Delete vote"
msgstr ""
#: ../views/votes_new.erb:1
msgid "New vote"
msgstr ""
@ -295,10 +376,10 @@ msgstr ""
msgid "Participants"
msgstr ""
#: ../views/votes_show_open.erb:51
#: ../views/votes_show_open.erb:55
msgid "Change back to draft vote"
msgstr ""
#: ../views/votes_show_open.erb:55
#: ../views/votes_show_open.erb:59
msgid "Close votes and show results"
msgstr ""

View file

@ -91,6 +91,7 @@ post '/signup' do
@user.password = hash_password(params[:password])
end
if @errors.empty? and @user.valid?
@user.admin = true if @user.id == 1
@user.save
session.clear
session[:user_id] = @user.id
@ -192,6 +193,71 @@ post '/logout' do
redirect '/login'
end
get '/admin' do
require_admin
@users = User.all
@votes = Vote.all
erb :admin
end
get '/admin/users/:id' do
require_admin
@user = User.find(params[:id])
erb :admin_users
end
get '/admin/users/:id/organizers/:vote/delete' do
require_admin
rating = Organizer.where(user: params[:id]).where(vote: params[:vote]).each do |organizer|
organizer.destroy
end
redirect "/admin/users/#{params[:id]}"
end
get '/admin/users/:id/ratings/:vote/delete' do
require_admin
rating = Rating.where(user: params[:id]).where(vote: params[:vote]).each do |rating|
rating.destroy
end
redirect "/admin/users/#{params[:id]}"
end
post '/admin/users/:id/delete' do
require_admin
@user = User.find(params[:id])
@user.destroy
redirect '/admin'
end
get '/admin/votes/:id' do
require_admin
@vote = Vote.find(params[:id])
erb :admin_votes
end
get '/admin/votes/:id/organizers/:user/delete' do
require_admin
rating = Organizer.where(vote: params[:id]).where(user: params[:user]).each do |organizer|
organizer.destroy
end
redirect "/admin/votes/#{params[:id]}"
end
get '/admin/votes/:id/ratings/:user/delete' do
require_admin
rating = Rating.where(vote: params[:id]).where(user: params[:user]).each do |rating|
rating.destroy
end
redirect "/admin/votes/#{params[:id]}"
end
post '/admin/votes/:id/delete' do
require_admin
@vote = Vote.find(params[:id])
@vote.destroy
redirect '/admin'
end
get '/votes/new' do
require_login
erb :votes_new
@ -370,10 +436,18 @@ helpers do
end
end
def is_admin
current_user and current_user.admin
end
def require_login
redirect '/login' unless current_user
end
def require_admin
redirect '/' unless is_admin
end
def find_vote
@vote = Vote.find_by(secure_id: params[:id])
end
@ -399,6 +473,10 @@ helpers do
end
def format_date(timestamp)
"#{TZInfo::Timezone.get(session[:timezone]).to_local(timestamp).strftime('%F')}"
end
def format_date_and_time(timestamp)
"#{TZInfo::Timezone.get(session[:timezone]).to_local(timestamp).strftime('%F %R')} (#{session[:timezone].gsub('_', ' ')})"
end
end

29
views/admin.erb Normal file
View file

@ -0,0 +1,29 @@
<h1><%= _("Admin") %></h1>
<h2><%= _("Users") %></h2>
<ul>
<% @users.reverse.each do |user| %>
<li>
<a href="/admin/users/<%= user.id %>"><%= user.email %></a>
</li>
<% end %>
</ul>
<h2><%= _("Votes") %></h2>
<ul>
<% @votes.reverse.each do |vote| %>
<li>
<a href="/admin/votes/<%= vote.id %>"><%= vote.title %></a>
<% case vote.state
when 'draft' %>
<%= _("(Draft)") %>
<% when 'open' %>
<%= _("(Open)") %>
<% when 'closed' %>
<%= _("(Closed)") %>
<% end %>
</li>
<% end %>
</ul>

55
views/admin_users.erb Normal file
View file

@ -0,0 +1,55 @@
<h1><%= _("Admin") %></h1>
<h2><%= @user.email %></h2>
<p><%= _("Created: %{date}") % { date: format_date(@user.created_at) } %></p>
<p><%= _("Updated: %{date}") % { date: format_date(@user.updated_at) } %></p>
<p><%= _("Admin: %{admin}") % { admin: @user.admin ? _("Yes") : _("No") } %></p>
<h2><%= _("Organized votes") %></h2>
<% unless @user.organizers.blank? %>
<ul>
<% @user.organizers.each do |organizer| %>
<li>
<%= organizer.user.email %>
<a href="/admin/users/<%= @user.id %>/organizers/<%= organizer.vote.id %>/delete"><%= _("Delete") %></a>
</li>
<% end %>
</ul>
<% else %>
<p><%= _("No vote organized.") %></p>
<% end %>
<h2><%= _("Ratings") %></h2>
<% unless @user.ratings.blank? %>
<ul>
<% @user.ratings.collect { |rating| rating.vote }.uniq.each do |vote| %>
<li>
<%= vote.title %>
<a href="/admin/users/<%= @user.id %>/ratings/<%= vote.id %>/delete"><%= _("Delete") %></a>
</li>
<% end %>
</ul>
<% else %>
<p><%= _("No rating.") %></p>
<% end %>
<% if @user.ratings.blank? and @user.organizers.blank? %>
<form action="/admin/users/<%= @user.id %>/delete" method="post">
<button type="submit"><%= _("Delete user") %></button>
</form>
<% end %>

63
views/admin_votes.erb Normal file
View file

@ -0,0 +1,63 @@
<h1><%= _("Admin") %></h1>
<h2><%= @vote.title %></h2>
<p><a href="/votes/<%= @vote.secure_id %>"><%= _("View vote") %></a></p>
<p><%= _("Created: %{date}") % { date: format_date(@vote.created_at) } %></p>
<p><%= _("Updated: %{date}") % { date: format_date(@vote.updated_at) } %></p>
<p><%= _("Secure ID: %{secure_id}") % { secure_id: @vote.secure_id } %></p>
<p><%= _("Description: %{description}") % { description: @vote.description } %></p>
<p><%= _("Closing date: %{date}") % { date: @vote.expire_on ? format_date_and_time(@vote.expire_on) : _("None") } %></p>
<p><%= _("State: %{state}") % { state: @vote.state } %></p>
<h2><%= _("Organizers") %></h2>
<% unless @vote.organizers.blank? %>
<ul>
<% @vote.organizers.each do |organizer| %>
<li>
<%= organizer.user.email %>
<a href="/admin/votes/<%= @vote.id %>/organizers/<%= organizer.user.id %>/delete"><%= _("Delete") %></a>
</li>
<% end %>
</ul>
<% else %>
<p><%= _("No organizer.") %></p>
<% end %>
<h2><%= _("Ratings") %></h2>
<% unless @vote.ratings.blank? %>
<ul>
<% @vote.ratings.collect { |rating| rating.user }.uniq.each do |user| %>
<li>
<%= user.email %>
<a href="/admin/votes/<%= @vote.id %>/ratings/<%= user.id %>/delete"><%= _("Delete") %></a>
</li>
<% end %>
</ul>
<% else %>
<p><%= _("No rating.") %></p>
<% end %>
<% if @vote.ratings.blank? and @vote.organizers.blank? %>
<form action="/admin/votes/<%= @vote.id %>/delete" method="post">
<button type="submit"><%= _("Delete vote") %></button>
</form>
<% end %>

View file

@ -20,7 +20,12 @@
<body>
<% if current_user %>
<p><%= _("Logged in as %{email}.") % { email: current_user.email } %> <a href="/logout"><%= _("Logout") %></a></p>
<p><a href="/"><%= _("Home") %></a></p>
<p>
<a href="/"><%= _("Home") %></a>
<% if is_admin %>
<a href="/admin"><%= _("Admin") %></a>
<% end %>
</p>
<% else %>
<p><a href="/login"><%= _("Login") %></a></p>
<% end %>

View file

@ -1,6 +1,6 @@
<h1><%= _("Open vote") %></h1>
<p><%= _("Closing date: #{format_date(@expire_on)}") %></p>
<p><%= _("Closing date: %{date}" % { date: format_date_and_time(@expire_on) }) %></p>
<p><%= _("The vote will automatically close on that date and the results will
be sent to all users by email.") %></p>

View file

@ -1,12 +1,12 @@
<h1><%= @vote.title %></h1>
<% if @vote.expire_on %>
<p><%= _("Closing date: #{format_date(@vote.expire_on)}") %></p>
<p><%= _("Closing date: %{date}" % { date: format_date_and_time(@vote.expire_on) }) %></p>
<% end %>
<p><%= @vote.description %></p>
<% if @vote.ratings.length > 0 %>
<% unless @vote.ratings.blank? %>
<h2><%= _("All ratings") %></h2>

View file

@ -1,7 +1,7 @@
<h1><%= @vote.title %></h1>
<% if @vote.expire_on %>
<p><%= _("Closing date: #{format_date(@vote.expire_on)}") %></p>
<p><%= _("Closing date: %{date}" % { date: format_date_and_time(@vote.expire_on) }) %></p>
<% end %>
<p><%= @vote.description %></p>
@ -35,6 +35,8 @@
<% end %>
</ul>
<% unless @vote.organizers.blank? %>
<h2><%= _("Organizers") %></h2>
<ul>
@ -43,6 +45,8 @@
<% end %>
</ul>
<% end %>
<% if @vote.users.exists?(current_user.id) and @vote.expire_on.nil? %>
<h3><%= _("Actions for organizers") %></h3>