mirror of
https://github.com/philomena-dev/philomena.git
synced 2024-11-23 20:18:00 +01:00
Return some BoR functionality to forums (#115)
* return some BoR functionality to forums - Added searching by forum slug - Display forum/topic/post-num in search results for each post - Display who locked topic for moderators * fix topic position bug (Fixes philomena-dev/philomena#110)
This commit is contained in:
parent
ecd29e0e0d
commit
269caabd5e
10 changed files with 63 additions and 9 deletions
|
@ -24,6 +24,7 @@ metadata: post_search_json
|
||||||
'referrer', p.referrer,
|
'referrer', p.referrer,
|
||||||
'fingerprint', p.fingerprint,
|
'fingerprint', p.fingerprint,
|
||||||
'topic_position', p.topic_position,
|
'topic_position', p.topic_position,
|
||||||
|
'forum', f.short_name,
|
||||||
'forum_id', t.forum_id,
|
'forum_id', t.forum_id,
|
||||||
'user_id', p.user_id,
|
'user_id', p.user_id,
|
||||||
'anonymous', p.anonymous,
|
'anonymous', p.anonymous,
|
||||||
|
|
|
@ -27,6 +27,7 @@ defmodule Philomena.Posts.ElasticsearchIndex do
|
||||||
subject: %{type: "text", analyzer: "snowball"},
|
subject: %{type: "text", analyzer: "snowball"},
|
||||||
author: %{type: "keyword"},
|
author: %{type: "keyword"},
|
||||||
topic_position: %{type: "integer"},
|
topic_position: %{type: "integer"},
|
||||||
|
forum: %{type: "keyword"},
|
||||||
forum_id: %{type: "keyword"},
|
forum_id: %{type: "keyword"},
|
||||||
topic_id: %{type: "keyword"},
|
topic_id: %{type: "keyword"},
|
||||||
user_id: %{type: "keyword"},
|
user_id: %{type: "keyword"},
|
||||||
|
@ -54,6 +55,7 @@ defmodule Philomena.Posts.ElasticsearchIndex do
|
||||||
referrer: post.referrer,
|
referrer: post.referrer,
|
||||||
fingerprint: post.fingerprint,
|
fingerprint: post.fingerprint,
|
||||||
topic_position: post.topic_position,
|
topic_position: post.topic_position,
|
||||||
|
forum: post.topic.forum.short_name,
|
||||||
forum_id: post.topic.forum_id,
|
forum_id: post.topic.forum_id,
|
||||||
user_id: post.user_id,
|
user_id: post.user_id,
|
||||||
anonymous: post.anonymous,
|
anonymous: post.anonymous,
|
||||||
|
|
|
@ -52,7 +52,7 @@ defmodule Philomena.Posts.Query do
|
||||||
[
|
[
|
||||||
int_fields: ~W(id topic_position),
|
int_fields: ~W(id topic_position),
|
||||||
date_fields: ~W(created_at updated_at),
|
date_fields: ~W(created_at updated_at),
|
||||||
literal_fields: ~W(forum_id topic_id),
|
literal_fields: ~W(forum forum_id topic_id),
|
||||||
ngram_fields: ~W(body subject),
|
ngram_fields: ~W(body subject),
|
||||||
custom_fields: ~W(author user_id),
|
custom_fields: ~W(author user_id),
|
||||||
default_field: {"body", :ngram},
|
default_field: {"body", :ngram},
|
||||||
|
@ -76,7 +76,7 @@ defmodule Philomena.Posts.Query do
|
||||||
fields = user_fields()
|
fields = user_fields()
|
||||||
|
|
||||||
Keyword.merge(fields,
|
Keyword.merge(fields,
|
||||||
literal_fields: ~W(forum_id topic_id user_id author fingerprint),
|
literal_fields: fields[:literal_fields] ++ ~W(user_id author fingerprint),
|
||||||
ip_fields: ~W(ip),
|
ip_fields: ~W(ip),
|
||||||
bool_fields: ~W(anonymous deleted),
|
bool_fields: ~W(anonymous deleted),
|
||||||
custom_fields: fields[:custom_fields] -- ~W(author user_id),
|
custom_fields: fields[:custom_fields] -- ~W(author user_id),
|
||||||
|
|
|
@ -15,7 +15,7 @@ defmodule PhilomenaWeb.LoadTopicPlug do
|
||||||
|
|
||||||
Topic
|
Topic
|
||||||
|> where(forum_id: ^forum.id, slug: ^to_string(conn.params[param]))
|
|> where(forum_id: ^forum.id, slug: ^to_string(conn.params[param]))
|
||||||
|> preload([:user, :forum, :deleted_by, poll: :options])
|
|> preload([:user, :forum, :deleted_by, :locked_by, poll: :options])
|
||||||
|> Repo.one()
|
|> Repo.one()
|
||||||
|> maybe_hide_topic(conn, show_hidden)
|
|> maybe_hide_topic(conn, show_hidden)
|
||||||
end
|
end
|
||||||
|
|
|
@ -1,7 +1,9 @@
|
||||||
h1 Discussion Forums
|
h1 Discussion Forums
|
||||||
.block
|
.block
|
||||||
.block__header
|
.block__header
|
||||||
/= icon_link 'Search Posts', 'fa fa-fw fa-search', posts_path
|
a href=Routes.post_path(@conn, :index)
|
||||||
|
i.fa.fa-fw.fa-search>
|
||||||
|
' Search Posts
|
||||||
span.block__header__item
|
span.block__header__item
|
||||||
=> @topic_count
|
=> @topic_count
|
||||||
' topics
|
' topics
|
||||||
|
|
|
@ -10,7 +10,9 @@ h1 = @forum.name
|
||||||
i.fa.fa-fw.fa-edit>
|
i.fa.fa-fw.fa-edit>
|
||||||
' New Topic
|
' New Topic
|
||||||
|
|
||||||
/= icon_link 'Search Posts', 'fa fa-fw fa-search', posts_path(forum_id: @forum.id)
|
a href=Routes.post_path(@conn, :index, pq: "forum:#{@forum.short_name}")
|
||||||
|
i.fa.fa-fw.fa-search>
|
||||||
|
' Search Posts
|
||||||
span.spacing-left
|
span.spacing-left
|
||||||
=> @forum.topic_count
|
=> @forum.topic_count
|
||||||
' topics
|
' topics
|
||||||
|
|
|
@ -18,7 +18,18 @@ h2 Search Results
|
||||||
- pagination = render PhilomenaWeb.PaginationView, "_pagination.html", page: @posts, route: route, params: [pq: @conn.params["pq"]], conn: @conn
|
- pagination = render PhilomenaWeb.PaginationView, "_pagination.html", page: @posts, route: route, params: [pq: @conn.params["pq"]], conn: @conn
|
||||||
|
|
||||||
= for {body, post} <- @posts, post.topic.hidden_from_users == false do
|
= for {body, post} <- @posts, post.topic.hidden_from_users == false do
|
||||||
= render PhilomenaWeb.PostView, "_post.html", body: body, post: post, conn: @conn
|
div
|
||||||
|
h3
|
||||||
|
=<> link post.topic.forum.name, to: Routes.forum_path(@conn, :show, post.topic.forum)
|
||||||
|
| »
|
||||||
|
=<> link post.topic.title, to: Routes.forum_topic_path(@conn, :show, post.topic.forum, post.topic)
|
||||||
|
| »
|
||||||
|
- post_link = Routes.forum_topic_path(@conn, :show, post.topic.forum, post.topic, post_id: post.id) <> "#post_#{post.id}"
|
||||||
|
= if post.topic_position == 0 do
|
||||||
|
=<> link "Topic Opener", to: post_link
|
||||||
|
- else
|
||||||
|
=<> link "Post #{post.topic_position}", to: post_link
|
||||||
|
= render PhilomenaWeb.PostView, "_post.html", body: body, post: post, conn: @conn
|
||||||
|
|
||||||
.block
|
.block
|
||||||
.block__header.block__header--light.page__header
|
.block__header.block__header--light.page__header
|
||||||
|
@ -134,3 +145,10 @@ table.table
|
||||||
td Matches posts with the specified user_id. Anonymous users will never match this term.
|
td Matches posts with the specified user_id. Anonymous users will never match this term.
|
||||||
td
|
td
|
||||||
code = link "user_id:211190", to: Routes.post_path(@conn, :index, pq: "user_id:211190")
|
code = link "user_id:211190", to: Routes.post_path(@conn, :index, pq: "user_id:211190")
|
||||||
|
tr
|
||||||
|
td
|
||||||
|
code forum
|
||||||
|
td Literal
|
||||||
|
td Matches the short name for the forum this post belongs to.
|
||||||
|
td
|
||||||
|
code = link "forum:meta", to: Routes.post_path(@conn, :index, pq: "forum:meta")
|
||||||
|
|
|
@ -81,6 +81,13 @@ h1 = @topic.title
|
||||||
' Lock reason:
|
' Lock reason:
|
||||||
em = @topic.lock_reason
|
em = @topic.lock_reason
|
||||||
|
|
||||||
|
= if can?(@conn, :hide, @topic) and not is_nil(@topic.locked_by) do
|
||||||
|
p
|
||||||
|
' Locked by:
|
||||||
|
em
|
||||||
|
strong
|
||||||
|
= link(@topic.locked_by.name, to: Routes.profile_path(@conn, :show, @topic.locked_by))
|
||||||
|
|
||||||
/ Post form
|
/ Post form
|
||||||
= cond do
|
= cond do
|
||||||
- @conn.assigns.current_ban ->
|
- @conn.assigns.current_ban ->
|
||||||
|
|
|
@ -0,0 +1,21 @@
|
||||||
|
defmodule Philomena.Repo.Migrations.AddIndexPostsOnTopicIdAndTopicPosition do
|
||||||
|
use Ecto.Migration
|
||||||
|
|
||||||
|
def up do
|
||||||
|
execute("drop index index_posts_on_topic_id_and_topic_position;");
|
||||||
|
execute(
|
||||||
|
"""
|
||||||
|
with mismatched_ranks as (select id,rank from (select id, topic_position, (rank() over (partition by topic_id order by created_at,id asc))-1 as rank from posts) s where s.topic_position <> s.rank)
|
||||||
|
update posts set topic_position=mismatched_ranks.rank
|
||||||
|
from mismatched_ranks
|
||||||
|
where posts.id=mismatched_ranks.id;
|
||||||
|
""");
|
||||||
|
execute("create unique index index_posts_on_topic_id_and_topic_position on posts (topic_id, topic_position);");
|
||||||
|
end
|
||||||
|
|
||||||
|
def down do
|
||||||
|
execute("drop index index_posts_on_topic_id_and_topic_position;");
|
||||||
|
execute("create index index_posts_on_topic_id_and_topic_position on public.posts (topic_id, topic_position);");
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
|
@ -2,8 +2,8 @@
|
||||||
-- PostgreSQL database dump
|
-- PostgreSQL database dump
|
||||||
--
|
--
|
||||||
|
|
||||||
-- Dumped from database version 13.1 (Debian 13.1-1.pgdg100+1)
|
-- Dumped from database version 13.2
|
||||||
-- Dumped by pg_dump version 13.1 (Debian 13.1-1.pgdg100+1)
|
-- Dumped by pg_dump version 13.2
|
||||||
|
|
||||||
SET statement_timeout = 0;
|
SET statement_timeout = 0;
|
||||||
SET lock_timeout = 0;
|
SET lock_timeout = 0;
|
||||||
|
@ -3503,7 +3503,7 @@ CREATE INDEX index_posts_on_topic_id_and_created_at ON public.posts USING btree
|
||||||
-- Name: index_posts_on_topic_id_and_topic_position; Type: INDEX; Schema: public; Owner: -
|
-- Name: index_posts_on_topic_id_and_topic_position; Type: INDEX; Schema: public; Owner: -
|
||||||
--
|
--
|
||||||
|
|
||||||
CREATE INDEX index_posts_on_topic_id_and_topic_position ON public.posts USING btree (topic_id, topic_position);
|
CREATE UNIQUE INDEX index_posts_on_topic_id_and_topic_position ON public.posts USING btree (topic_id, topic_position);
|
||||||
|
|
||||||
|
|
||||||
--
|
--
|
||||||
|
@ -4843,3 +4843,4 @@ INSERT INTO public."schema_migrations" (version) VALUES (20200905214139);
|
||||||
INSERT INTO public."schema_migrations" (version) VALUES (20201124224116);
|
INSERT INTO public."schema_migrations" (version) VALUES (20201124224116);
|
||||||
INSERT INTO public."schema_migrations" (version) VALUES (20210121200815);
|
INSERT INTO public."schema_migrations" (version) VALUES (20210121200815);
|
||||||
INSERT INTO public."schema_migrations" (version) VALUES (20210301012137);
|
INSERT INTO public."schema_migrations" (version) VALUES (20210301012137);
|
||||||
|
INSERT INTO public."schema_migrations" (version) VALUES (20210427022351);
|
||||||
|
|
Loading…
Reference in a new issue