mirror of
https://github.com/philomena-dev/philomena.git
synced 2024-11-27 13:47:58 +01:00
Fix being able to vote on polls past their end date (#13)
This commit is contained in:
parent
75e07bfb13
commit
9a8b5a7ea7
5 changed files with 24 additions and 3 deletions
|
@ -7,6 +7,7 @@ defmodule Philomena.PollVotes do
|
||||||
alias Ecto.Multi
|
alias Ecto.Multi
|
||||||
alias Philomena.Repo
|
alias Philomena.Repo
|
||||||
|
|
||||||
|
alias Philomena.Polls
|
||||||
alias Philomena.Polls.Poll
|
alias Philomena.Polls.Poll
|
||||||
alias Philomena.PollVotes.PollVote
|
alias Philomena.PollVotes.PollVote
|
||||||
alias Philomena.PollOptions.PollOption
|
alias Philomena.PollOptions.PollOption
|
||||||
|
@ -53,6 +54,13 @@ defmodule Philomena.PollVotes do
|
||||||
|
|
||||||
{:ok, poll}
|
{:ok, poll}
|
||||||
end)
|
end)
|
||||||
|
|> Multi.run(:ended, fn _repo, _changes ->
|
||||||
|
# Bail if poll is no longer active
|
||||||
|
case Polls.active?(poll) do
|
||||||
|
false -> {:error, []}
|
||||||
|
_true -> {:ok, []}
|
||||||
|
end
|
||||||
|
end)
|
||||||
|> Multi.run(:existing_votes, fn _repo, _changes ->
|
|> Multi.run(:existing_votes, fn _repo, _changes ->
|
||||||
# Don't proceed if any votes exist
|
# Don't proceed if any votes exist
|
||||||
case voted?(poll, user) do
|
case voted?(poll, user) do
|
||||||
|
|
|
@ -101,4 +101,12 @@ defmodule Philomena.Polls do
|
||||||
def change_poll(%Poll{} = poll) do
|
def change_poll(%Poll{} = poll) do
|
||||||
Poll.changeset(poll, %{})
|
Poll.changeset(poll, %{})
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def active?(%{id: poll_id}) do
|
||||||
|
now = DateTime.utc_now()
|
||||||
|
|
||||||
|
Poll
|
||||||
|
|> where([p], p.id == ^poll_id and p.active_until > ^now)
|
||||||
|
|> Repo.exists?()
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -5,7 +5,9 @@ defmodule Philomena.Polls.Poll do
|
||||||
alias Philomena.Topics.Topic
|
alias Philomena.Topics.Topic
|
||||||
alias Philomena.Users.User
|
alias Philomena.Users.User
|
||||||
alias Philomena.PollOptions.PollOption
|
alias Philomena.PollOptions.PollOption
|
||||||
|
alias Philomena.Polls.Poll
|
||||||
alias Philomena.Schema.Time
|
alias Philomena.Schema.Time
|
||||||
|
import Ecto.Query
|
||||||
|
|
||||||
schema "polls" do
|
schema "polls" do
|
||||||
belongs_to :topic, Topic
|
belongs_to :topic, Topic
|
||||||
|
|
|
@ -3,7 +3,7 @@ defmodule PhilomenaWeb.TopicController do
|
||||||
|
|
||||||
alias PhilomenaWeb.NotificationCountPlug
|
alias PhilomenaWeb.NotificationCountPlug
|
||||||
alias Philomena.{Forums.Forum, Topics.Topic, Posts.Post, Polls.Poll, PollOptions.PollOption}
|
alias Philomena.{Forums.Forum, Topics.Topic, Posts.Post, Polls.Poll, PollOptions.PollOption}
|
||||||
alias Philomena.{Forums, Topics, Posts}
|
alias Philomena.{Forums, Topics, Polls, Posts}
|
||||||
alias Philomena.PollVotes
|
alias Philomena.PollVotes
|
||||||
alias PhilomenaWeb.TextileRenderer
|
alias PhilomenaWeb.TextileRenderer
|
||||||
alias Philomena.Repo
|
alias Philomena.Repo
|
||||||
|
@ -76,6 +76,8 @@ defmodule PhilomenaWeb.TopicController do
|
||||||
|
|
||||||
voted = PollVotes.voted?(topic.poll, conn.assigns.current_user)
|
voted = PollVotes.voted?(topic.poll, conn.assigns.current_user)
|
||||||
|
|
||||||
|
poll_active = Polls.active?(topic.poll)
|
||||||
|
|
||||||
changeset =
|
changeset =
|
||||||
%Post{}
|
%Post{}
|
||||||
|> Posts.change_post()
|
|> Posts.change_post()
|
||||||
|
@ -90,7 +92,8 @@ defmodule PhilomenaWeb.TopicController do
|
||||||
changeset: changeset,
|
changeset: changeset,
|
||||||
topic_changeset: topic_changeset,
|
topic_changeset: topic_changeset,
|
||||||
watching: watching,
|
watching: watching,
|
||||||
voted: voted
|
voted: voted,
|
||||||
|
poll_active: poll_active
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -16,7 +16,7 @@
|
||||||
strong
|
strong
|
||||||
= @poll.deletion_reason || "Unknown (likely deleted in error). Please contact a moderator."
|
= @poll.deletion_reason || "Unknown (likely deleted in error). Please contact a moderator."
|
||||||
|
|
||||||
- not @voted and not is_nil(@conn.assigns.current_user) ->
|
- @poll_active and not @voted and not is_nil(@conn.assigns.current_user) ->
|
||||||
.poll
|
.poll
|
||||||
.poll-area
|
.poll-area
|
||||||
= render PhilomenaWeb.Topic.PollView, "_vote_form.html", assigns
|
= render PhilomenaWeb.Topic.PollView, "_vote_form.html", assigns
|
||||||
|
|
Loading…
Reference in a new issue