mirror of
https://github.com/philomena-dev/philomena.git
synced 2025-01-19 14:17:59 +01:00
add filters
This commit is contained in:
parent
abb6d148a3
commit
702381abc3
9 changed files with 165 additions and 3 deletions
|
@ -3,6 +3,7 @@ defimpl Canada.Can, for: [Atom, Philomena.Users.User] do
|
||||||
alias Philomena.Images.Image
|
alias Philomena.Images.Image
|
||||||
alias Philomena.Forums.Forum
|
alias Philomena.Forums.Forum
|
||||||
alias Philomena.Topics.Topic
|
alias Philomena.Topics.Topic
|
||||||
|
alias Philomena.Filters.Filter
|
||||||
|
|
||||||
# Admins can do anything
|
# Admins can do anything
|
||||||
def can?(%User{role: "admin"}, _action, _model), do: true
|
def can?(%User{role: "admin"}, _action, _model), do: true
|
||||||
|
@ -11,6 +12,9 @@ defimpl Canada.Can, for: [Atom, Philomena.Users.User] do
|
||||||
# Moderators can...
|
# Moderators can...
|
||||||
#
|
#
|
||||||
|
|
||||||
|
# View filters
|
||||||
|
def can?(%User{role: "moderator"}, :show, %Filter{}), do: true
|
||||||
|
|
||||||
# View images
|
# View images
|
||||||
def can?(%User{role: "moderator"}, :show, %Image{}), do: true
|
def can?(%User{role: "moderator"}, :show, %Image{}), do: true
|
||||||
|
|
||||||
|
@ -35,6 +39,10 @@ defimpl Canada.Can, for: [Atom, Philomena.Users.User] do
|
||||||
# Users and anonymous users can...
|
# Users and anonymous users can...
|
||||||
#
|
#
|
||||||
|
|
||||||
|
# View filters they own and system filters
|
||||||
|
def can?(_user, :show, %Filter{system: true}), do: true
|
||||||
|
def can?(%User{id: id}, :show, %Filter{user_id: id}), do: true
|
||||||
|
|
||||||
# View non-deleted images
|
# View non-deleted images
|
||||||
def can?(_user, action, Image)
|
def can?(_user, action, Image)
|
||||||
when action in [:new, :create, :index],
|
when action in [:new, :create, :index],
|
||||||
|
|
31
lib/philomena_web/controllers/filter/current_controller.ex
Normal file
31
lib/philomena_web/controllers/filter/current_controller.ex
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
defmodule PhilomenaWeb.Filter.CurrentController do
|
||||||
|
use PhilomenaWeb, :controller
|
||||||
|
|
||||||
|
alias Philomena.{Filters, Filters.Filter}
|
||||||
|
|
||||||
|
plug :load_resource, model: Filter
|
||||||
|
|
||||||
|
def update(conn, _params) do
|
||||||
|
filter = conn.assigns.filter
|
||||||
|
user = conn.assigns.current_user
|
||||||
|
|
||||||
|
filter =
|
||||||
|
if Canada.Can.can?(user, :show, filter) do
|
||||||
|
filter
|
||||||
|
else
|
||||||
|
Filters.default_filter()
|
||||||
|
end
|
||||||
|
|
||||||
|
conn =
|
||||||
|
if user do
|
||||||
|
nil
|
||||||
|
else
|
||||||
|
conn
|
||||||
|
|> put_session(:filter_id, filter.id)
|
||||||
|
end
|
||||||
|
|
||||||
|
conn
|
||||||
|
|> put_flash(:info, "Switched to filter #{filter.name}")
|
||||||
|
|> redirect(to: "/")
|
||||||
|
end
|
||||||
|
end
|
29
lib/philomena_web/controllers/filter_controller.ex
Normal file
29
lib/philomena_web/controllers/filter_controller.ex
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
defmodule PhilomenaWeb.FilterController do
|
||||||
|
use PhilomenaWeb, :controller
|
||||||
|
|
||||||
|
alias Philomena.Filters.Filter
|
||||||
|
alias Philomena.Repo
|
||||||
|
import Ecto.Query
|
||||||
|
|
||||||
|
def index(conn, _params) do
|
||||||
|
user = conn.assigns.current_user
|
||||||
|
|
||||||
|
my_filters =
|
||||||
|
if user do
|
||||||
|
Filter
|
||||||
|
|> where(user_id: ^user.id)
|
||||||
|
|> preload(:user)
|
||||||
|
|> Repo.all()
|
||||||
|
else
|
||||||
|
[]
|
||||||
|
end
|
||||||
|
|
||||||
|
system_filters =
|
||||||
|
Filter
|
||||||
|
|> where(system: true)
|
||||||
|
|> preload(:user)
|
||||||
|
|> Repo.all()
|
||||||
|
|
||||||
|
render(conn, "index.html", my_filters: my_filters, system_filters: system_filters)
|
||||||
|
end
|
||||||
|
end
|
|
@ -2,7 +2,8 @@ defmodule PhilomenaWeb.Plugs.CurrentFilter do
|
||||||
import Plug.Conn
|
import Plug.Conn
|
||||||
import Ecto.Query
|
import Ecto.Query
|
||||||
|
|
||||||
alias Philomena.Filters
|
alias Philomena.{Filters, Filters.Filter}
|
||||||
|
alias Philomena.Repo
|
||||||
alias Pow.Plug
|
alias Pow.Plug
|
||||||
|
|
||||||
# No options
|
# No options
|
||||||
|
@ -10,6 +11,7 @@ defmodule PhilomenaWeb.Plugs.CurrentFilter do
|
||||||
|
|
||||||
# Assign current filter
|
# Assign current filter
|
||||||
def call(conn, _opts) do
|
def call(conn, _opts) do
|
||||||
|
conn = conn |> fetch_session()
|
||||||
user = conn |> Plug.current_user()
|
user = conn |> Plug.current_user()
|
||||||
|
|
||||||
filter =
|
filter =
|
||||||
|
@ -17,7 +19,11 @@ defmodule PhilomenaWeb.Plugs.CurrentFilter do
|
||||||
user = user |> preload(:current_filter)
|
user = user |> preload(:current_filter)
|
||||||
user.current_filter
|
user.current_filter
|
||||||
else
|
else
|
||||||
Filters.default_filter()
|
filter_id = conn |> get_session(:filter_id)
|
||||||
|
|
||||||
|
filter = if filter_id, do: Repo.get(Filter, filter_id)
|
||||||
|
|
||||||
|
filter = filter || Filters.default_filter()
|
||||||
end
|
end
|
||||||
|
|
||||||
conn
|
conn
|
||||||
|
|
|
@ -35,6 +35,11 @@ defmodule PhilomenaWeb.Router do
|
||||||
resources "/topics", TopicController, only: [:show]
|
resources "/topics", TopicController, only: [:show]
|
||||||
end
|
end
|
||||||
|
|
||||||
|
scope "/filters", Filter, as: :filter do
|
||||||
|
resources "/current", CurrentController, only: [:update], singular: true
|
||||||
|
end
|
||||||
|
resources "/filters", FilterController, only: [:index, :show]
|
||||||
|
|
||||||
get "/:id", ImageController, :show
|
get "/:id", ImageController, :show
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
38
lib/philomena_web/templates/filter/_filter.html.slime
Normal file
38
lib/philomena_web/templates/filter/_filter.html.slime
Normal file
|
@ -0,0 +1,38 @@
|
||||||
|
.filter
|
||||||
|
h3
|
||||||
|
= @filter.name
|
||||||
|
|
||||||
|
= if @filter.user do
|
||||||
|
p
|
||||||
|
' Maintained by
|
||||||
|
= render PhilomenaWeb.UserAttributionView, "_user.html", object: @filter
|
||||||
|
' .
|
||||||
|
|
||||||
|
.filter-options
|
||||||
|
ul
|
||||||
|
li
|
||||||
|
' Spoilers
|
||||||
|
= length(@filter.spoilered_tag_ids)
|
||||||
|
' , hides
|
||||||
|
= length(@filter.hidden_tag_ids)
|
||||||
|
|
||||||
|
li
|
||||||
|
= link("View this filter", to: Routes.filter_path(@conn, :show, @filter), class: "button")
|
||||||
|
|
||||||
|
= if @filter.id == @conn.assigns.current_filter.id do
|
||||||
|
li
|
||||||
|
strong Your current filter
|
||||||
|
- else
|
||||||
|
li
|
||||||
|
= form_for nil, Routes.filter_current_path(@conn, :update, @filter), [method: "put", class: "button_to"], fn f ->
|
||||||
|
= submit "Use this filter", class: "button"
|
||||||
|
|
||||||
|
/- if can?(:edit, filter) && current_user && filter.user_id == current_user.id
|
||||||
|
/ li = link_to 'Edit this filter', edit_filter_path(filter), class: 'button'
|
||||||
|
/ - if can?(:delete, filter) && current_user && filter.user_id == current_user.id
|
||||||
|
/ li = button_to 'Delete this filter', filter_path(filter), data: { confirm: 'Are you sure you want to delete this filter?' }, method: :delete, class: 'button'
|
||||||
|
/- elsif can? :create, Filter
|
||||||
|
/ li = link_to 'Copy and Customize this filter', new_filter_path(based_on_filter_id: filter.id), class: 'button'
|
||||||
|
p
|
||||||
|
em
|
||||||
|
= @filter.description
|
40
lib/philomena_web/templates/filter/index.html.slime
Normal file
40
lib/philomena_web/templates/filter/index.html.slime
Normal file
|
@ -0,0 +1,40 @@
|
||||||
|
.walloftext
|
||||||
|
.block.block--fixed.block--warning
|
||||||
|
h2 Content Safety
|
||||||
|
p
|
||||||
|
' By default, content that is safe and suitable for all ages is all you'll see on the site, and how most of our users browse. The default filters focus on art, so filter out things like memes and what some users would consider "spam".
|
||||||
|
p
|
||||||
|
' Filters let you customize what content you see on the site. This means that with the appropriate filter selected, you can access content which is not suitable for everyone, such as sexually explicit, grimdark or gory material.
|
||||||
|
p
|
||||||
|
strong
|
||||||
|
' By changing away from the default filters, you accept you are legally permitted to view this content in your jurisdiction. If in doubt, stick with the recommended default filters.
|
||||||
|
h1 Browsing Filters
|
||||||
|
p
|
||||||
|
' Images posted on the site are tagged, allowing you to easily search for content. You can also filter out content you'd rather not see using filters. Filters are sets of tags - spoilered tags and hidden tags. Spoilers are images that show up as thumbnails instead of the image, letting you click through and find out more about an image before deciding to view it or not. Hidden tags will simply hide images.
|
||||||
|
p
|
||||||
|
' There are set of global filters to pick from which cover some common use-cases.
|
||||||
|
' If you're logged in you can also customize these filters and make your own, as well as quickly switch (via the menu on every page) between them.
|
||||||
|
|
||||||
|
h2 So how do these work?
|
||||||
|
p
|
||||||
|
' You can select any filter you can see. This will become your
|
||||||
|
strong
|
||||||
|
' active filter
|
||||||
|
' and will affect how you see the site. You can edit filters if you own them - you can create a filter from scratch with the link under "My Filters" (if you're logged in, of course) or by clicking "Customize", which will copy an existing filter for you to edit.
|
||||||
|
p
|
||||||
|
' By default all the filters you create are private and only visible by you. You can have as many as you like and switch between them instantly with no limits. You can also create a public filter, which can be seen and used by any user on the site, allowing you to share useful filters with others.
|
||||||
|
|
||||||
|
h2 My Filters
|
||||||
|
= if @current_user do
|
||||||
|
/- if can? :create, Filter
|
||||||
|
/ p
|
||||||
|
/ => link_to 'Click here to make a new filter from scratch', new_filter_path
|
||||||
|
/ | or click "Copy and Customize" on a global or shared filter to use as a starting point.
|
||||||
|
/= render partial: 'filter_list', locals: { filters: @user_filters }
|
||||||
|
- else
|
||||||
|
p
|
||||||
|
' If you're logged in, you can create and maintain custom filters here.
|
||||||
|
|
||||||
|
h2 Global Filters
|
||||||
|
= for filter <- @system_filters do
|
||||||
|
= render PhilomenaWeb.FilterView, "_filter.html", conn: @conn, filter: filter
|
|
@ -74,7 +74,9 @@ header.header
|
||||||
| Logout
|
| Logout
|
||||||
- else
|
- else
|
||||||
a.header__link.hide-mobile href="/filters"
|
a.header__link.hide-mobile href="/filters"
|
||||||
| Filters
|
| Filters (
|
||||||
|
= @current_filter.name
|
||||||
|
| )
|
||||||
span.js-burger-links.hide-mobile
|
span.js-burger-links.hide-mobile
|
||||||
a.header__link href='/settings/edit'
|
a.header__link href='/settings/edit'
|
||||||
i.fa.fa-fw.fa-cogs.hide-desktop>
|
i.fa.fa-fw.fa-cogs.hide-desktop>
|
||||||
|
|
3
lib/philomena_web/views/filter_view.ex
Normal file
3
lib/philomena_web/views/filter_view.ex
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
defmodule PhilomenaWeb.FilterView do
|
||||||
|
use PhilomenaWeb, :view
|
||||||
|
end
|
Loading…
Reference in a new issue