FEATURE: support listing user solutions in user page

This commit is contained in:
Sam 2016-12-06 17:28:15 +11:00
parent 426480064d
commit 026f7a3ab0
7 changed files with 106 additions and 0 deletions

View File

@ -0,0 +1,3 @@
{{#link-to 'userActivity.solved'}}
<i class="glyph fa fa-check-square"></i>{{i18n 'solved.title'}}
{{/link-to}}

View File

@ -0,0 +1,3 @@
{{#link-to 'userActivity.solved'}}
{{user-stat value=model.solved_count label="solved.solution_summary"}}
{{/link-to}}

View File

@ -0,0 +1,6 @@
import UserActivityStreamRoute from "discourse/routes/user-activity-stream";
export default UserActivityStreamRoute.extend({
userActionType: 15,
noContentHelpKey: "solved.no_solutions"
});

View File

@ -0,0 +1,6 @@
export default {
resource: 'user.userActivity',
map() {
this.route('solved');
}
};

View File

@ -1,11 +1,15 @@
en:
js:
solved:
title: "Solved"
allow_accepted_answers: "Allow topic owner and staff to mark a reply as the solution"
accept_answer: "This reply solves the problem"
has_accepted_answer: "This topic has a solution"
unaccept_answer: "This reply no longer solves the problem"
accepted_answer: "Solution"
solution: "Solution"
solution_summary:
one: "solution <i class='fa fa-check-square'></i>"
other: "solutions <i class='fa fa-check-square'></i>"
accepted_html: "<i class='fa-check-square fa accepted'></i> Solved <span class='by'>by <a href data-user-card='{{username_lower}}'>{{username}}</a></span> in <a href='{{post_path}}'>post #{{post_number}}</a>"
accepted_notification: "<i title='accepted' class='fa fa-check-square'></i><p><span>{{username}}</span> {{description}}</p>"

View File

@ -7,3 +7,7 @@ en:
title: "Accepted solutions"
xaxis: "Day"
yaxis: "Total"
solved:
no_solutions:
self: "You have no accepted solutions yet."
others: "No accepted solutions."

View File

@ -9,6 +9,44 @@ register_asset 'stylesheets/solutions.scss'
after_initialize do
# we got to do a one time upgrade
if defined?(UserAction::SOLVED)
unless $redis.get('solved_already_upgraded')
unless UserAction.where(action_type: UserAction::SOLVED).exists?
Rails.logger.info("Upgrading storage for solved")
sql =<<SQL
INSERT INTO user_actions(action_type,
user_id,
target_topic_id,
target_post_id,
acting_user_id,
created_at,
updated_at)
SELECT :solved,
p.user_id,
p.topic_id,
p.id,
t.user_id,
pc.created_at,
pc.updated_at
FROM
post_custom_fields pc
JOIN
posts p ON p.id = pc.post_id
JOIN
topics t ON t.id = p.topic_id
WHERE
pc.name = 'is_accepted_answer' AND
pc.value = 'true' AND
p.user_id IS NOT NULL
SQL
UserAction.exec_sql(sql, solved: UserAction::SOLVED)
end
$redis.set("solved_already_upgraded", "true")
end
end
module ::DiscourseSolved
class Engine < ::Rails::Engine
engine_name PLUGIN_NAME
@ -18,6 +56,7 @@ after_initialize do
require_dependency "application_controller"
class DiscourseSolved::AnswerController < ::ApplicationController
def accept
limit_accepts
@ -31,6 +70,10 @@ after_initialize do
if p2 = Post.find_by(id: accepted_id)
p2.custom_fields["is_accepted_answer"] = nil
p2.save!
if defined?(UserAction::SOLVED)
UserAction.where(action_type: UserAction::SOLVED, target_post_id: p2.id).destroy_all
end
end
end
@ -39,6 +82,14 @@ after_initialize do
post.topic.save!
post.save!
if defined?(UserAction::SOLVED)
UserAction.log_action!(action_type: UserAction::SOLVED,
user_id: post.user_id,
acting_user_id: guardian.user.id,
target_post_id: post.id,
target_topic_id: post.topic_id)
end
unless current_user.id == post.user_id
Notification.create!(notification_type: Notification.types[:custom],
@ -71,6 +122,14 @@ after_initialize do
post.topic.save!
post.save!
# TODO remove_action! does not allow for this type of interface
if defined? UserAction::SOLVED
UserAction.where(
action_type: UserAction::SOLVED,
target_post_id: post.id
).destroy_all
end
# yank notification
notification = Notification.find_by(
notification_type: Notification.types[:custom],
@ -129,6 +188,27 @@ after_initialize do
end
end
if defined?(UserAction::SOLVED)
require_dependency 'user_summary'
class ::UserSummary
def solved_count
UserAction
.where(user: @user)
.where(action_type: UserAction::SOLVED)
.count
end
end
require_dependency 'user_summary_serializer'
class ::UserSummarySerializer
attributes :solved_count
def solved_count
object.solved_count
end
end
end
require_dependency 'topic_view_serializer'
class ::TopicViewSerializer
attributes :accepted_answer