From d8640fd042d23ede3bbfbd4ae9a01fa16e5f2e0d Mon Sep 17 00:00:00 2001 From: Bianca Nenciu Date: Tue, 24 Mar 2020 11:12:52 +0200 Subject: [PATCH] DEV: Move requested_group_id custom field from post to topic (#9127) Follow-up-to accbbded15974846523c3aeca85a59454e3f2f05 --- .../discourse/lib/transform-post.js | 4 +++ .../javascripts/discourse/widgets/post.js | 21 ++++++++++++++ .../stylesheets/common/base/topic-post.scss | 4 +++ .../stylesheets/desktop/topic-post.scss | 3 ++ app/controllers/groups_controller.rb | 2 +- app/serializers/basic_post_serializer.rb | 29 +------------------ app/serializers/topic_view_serializer.rb | 20 ++++++++++++- config/locales/client.en.yml | 1 + config/locales/server.en.yml | 1 - lib/topic_view.rb | 2 +- spec/requests/groups_controller_spec.rb | 2 +- .../serializers/basic_post_serializer_spec.rb | 23 --------------- test/javascripts/widgets/post-test.js.es6 | 15 ++++++++++ 13 files changed, 71 insertions(+), 56 deletions(-) diff --git a/app/assets/javascripts/discourse/lib/transform-post.js b/app/assets/javascripts/discourse/lib/transform-post.js index 09cb6d967c3..585bb02af33 100644 --- a/app/assets/javascripts/discourse/lib/transform-post.js +++ b/app/assets/javascripts/discourse/lib/transform-post.js @@ -139,6 +139,10 @@ export default function transformPost( } } + if (post.post_number === 1 && topic.requested_group_name) { + postAtts.requestedGroupName = topic.requested_group_name; + } + const showPMMap = topic.archetype === "private_message" && post.post_number === 1; if (showPMMap) { diff --git a/app/assets/javascripts/discourse/widgets/post.js b/app/assets/javascripts/discourse/widgets/post.js index bd84bfb4288..c6fc4f33198 100644 --- a/app/assets/javascripts/discourse/widgets/post.js +++ b/app/assets/javascripts/discourse/widgets/post.js @@ -344,6 +344,22 @@ createWidget("expand-post-button", { } }); +createWidget("post-group-request", { + buildKey: attrs => `post-group-request-${attrs.id}`, + + buildClasses() { + return ["group-request"]; + }, + + html(attrs) { + const href = Discourse.getURL( + "/g/" + attrs.requestedGroupName + "/requests?filter=" + attrs.username + ); + + return h("a", { attributes: { href } }, I18n.t("groups.requests.handle")); + } +}); + createWidget("post-contents", { buildKey: attrs => `post-contents-${attrs.id}`, @@ -366,6 +382,11 @@ createWidget("post-contents", { let result = [ new PostCooked(attrs, new DecoratorHelper(this), this.currentUser) ]; + + if (attrs.requestedGroupName) { + result.push(this.attach("post-group-request", attrs)); + } + result = result.concat(applyDecorators(this, "after-cooked", attrs, state)); if (attrs.cooked_hidden) { diff --git a/app/assets/stylesheets/common/base/topic-post.scss b/app/assets/stylesheets/common/base/topic-post.scss index b458f04e372..2f028e3c5d8 100644 --- a/app/assets/stylesheets/common/base/topic-post.scss +++ b/app/assets/stylesheets/common/base/topic-post.scss @@ -552,6 +552,10 @@ blockquote { .cooked { overflow: hidden; } + .group-request { + border-top: 1px solid $primary-low; + padding-top: 0.5em; + } &.highlighted { animation: background-fade-highlight 2.5s ease-out; } diff --git a/app/assets/stylesheets/desktop/topic-post.scss b/app/assets/stylesheets/desktop/topic-post.scss index a23e46d3354..d404169fd8f 100644 --- a/app/assets/stylesheets/desktop/topic-post.scss +++ b/app/assets/stylesheets/desktop/topic-post.scss @@ -613,6 +613,9 @@ blockquote { .cooked { padding: 0 $topic-body-width-padding 0.25em $topic-body-width-padding; } + .group-request { + padding: 0.5em $topic-body-width-padding 0 $topic-body-width-padding; + } a.expand-hidden { padding-left: $topic-body-width-padding; } diff --git a/app/controllers/groups_controller.rb b/app/controllers/groups_controller.rb index 126d0910afd..0df1f490120 100644 --- a/app/controllers/groups_controller.rb +++ b/app/controllers/groups_controller.rb @@ -439,7 +439,7 @@ class GroupsController < ApplicationController raw: params[:reason], archetype: Archetype.private_message, target_usernames: usernames.join(','), - custom_fields: { requested_group_id: group.id }, + topic_opts: { custom_fields: { requested_group_id: group.id } }, skip_validations: true ).create! diff --git a/app/serializers/basic_post_serializer.rb b/app/serializers/basic_post_serializer.rb index 32c14b5c72d..3486c47bc2c 100644 --- a/app/serializers/basic_post_serializer.rb +++ b/app/serializers/basic_post_serializer.rb @@ -40,34 +40,7 @@ class BasicPostSerializer < ApplicationSerializer I18n.t('flagging.user_must_edit') end else - cooked = object.filter_quotes(@parent_post) - - if scope&.user - - # PERF: this should not run on every post, only specific ones - # also, why is this in basic post serializer? - requested_group_id = post_custom_fields['requested_group_id'].to_i - - if requested_group_id > 0 - group = Group - .joins('JOIN group_users ON groups.id = group_users.group_id') - .find_by( - id: object.custom_fields['requested_group_id'].to_i, - group_users: { user_id: scope.user.id, owner: true } - ) - - if group - cooked << <<~EOF -
- - #{I18n.t('groups.request_membership_pm.handle')} - - EOF - end - end - end - - cooked + object.filter_quotes(@parent_post) end end diff --git a/app/serializers/topic_view_serializer.rb b/app/serializers/topic_view_serializer.rb index a0f37d3d70e..824dfcb068f 100644 --- a/app/serializers/topic_view_serializer.rb +++ b/app/serializers/topic_view_serializer.rb @@ -70,7 +70,8 @@ class TopicViewSerializer < ApplicationSerializer :destination_category_id, :pm_with_non_human_user, :queued_posts_count, - :show_read_indicator + :show_read_indicator, + :requested_group_name ) has_one :details, serializer: TopicViewDetailsSerializer, root: false, embed: :objects @@ -255,4 +256,21 @@ class TopicViewSerializer < ApplicationSerializer def show_read_indicator object.show_read_indicator? end + + def requested_group_name + if scope&.user + group = Group + .joins('JOIN group_users ON groups.id = group_users.group_id') + .find_by( + id: object.topic.custom_fields['requested_group_id'].to_i, + group_users: { user_id: scope.user.id, owner: true } + ) + + group.name if group + end + end + + def include_requested_group_name? + object.personal_message + end end diff --git a/config/locales/client.en.yml b/config/locales/client.en.yml index 9f72e5b3d86..e9ad9aac7ce 100644 --- a/config/locales/client.en.yml +++ b/config/locales/client.en.yml @@ -614,6 +614,7 @@ en: deny: "Deny" denied: "denied" undone: "request undone" + handle: "handle membership request" manage: title: "Manage" name: "Name" diff --git a/config/locales/server.en.yml b/config/locales/server.en.yml index d034819d16a..6d1c849522a 100644 --- a/config/locales/server.en.yml +++ b/config/locales/server.en.yml @@ -427,7 +427,6 @@ en: trust_level_4: "trust_level_4" request_membership_pm: title: "Membership Request for @%{group_name}" - handle: "handle membership request" view_hidden_topic_request_reason: "I would like to join the group '%{group_name}', so I may access [this topic](%{topic_url})" education: diff --git a/lib/topic_view.rb b/lib/topic_view.rb index 3123e19b46e..94f31f44b18 100644 --- a/lib/topic_view.rb +++ b/lib/topic_view.rb @@ -35,7 +35,7 @@ class TopicView end def self.default_post_custom_fields - @default_post_custom_fields ||= [Post::NOTICE_TYPE, Post::NOTICE_ARGS, "action_code_who", "requested_group_id"] + @default_post_custom_fields ||= [Post::NOTICE_TYPE, Post::NOTICE_ARGS, "action_code_who"] end def self.post_custom_fields_whitelisters diff --git a/spec/requests/groups_controller_spec.rb b/spec/requests/groups_controller_spec.rb index f26f2483ee8..381e247e422 100644 --- a/spec/requests/groups_controller_spec.rb +++ b/spec/requests/groups_controller_spec.rb @@ -1479,7 +1479,7 @@ describe GroupsController do body = JSON.parse(response.body) expect(body['relative_url']).to eq(topic.relative_url) - expect(post.custom_fields['requested_group_id'].to_i).to eq(group.id) + expect(post.topic.custom_fields['requested_group_id'].to_i).to eq(group.id) expect(post.user).to eq(user) expect(topic.title).to eq(I18n.t('groups.request_membership_pm.title', diff --git a/spec/serializers/basic_post_serializer_spec.rb b/spec/serializers/basic_post_serializer_spec.rb index 04f70583c4d..c390527ca16 100644 --- a/spec/serializers/basic_post_serializer_spec.rb +++ b/spec/serializers/basic_post_serializer_spec.rb @@ -22,27 +22,4 @@ describe BasicPostSerializer do end - context "cooked" do - it "includes membership requests" do - user = Fabricate(:user) - member = Fabricate(:user) - owner = Fabricate(:user) - - group = Fabricate(:group) - group.add(member) - group.add_owner(owner) - - post = Fabricate(:post, custom_fields: { requested_group_id: group.id }) - - json = BasicPostSerializer.new(post, scope: Guardian.new(user), root: false).as_json - expect(json[:cooked]).not_to include(I18n.t('groups.request_membership_pm.handle')) - - json = BasicPostSerializer.new(post, scope: Guardian.new(member), root: false).as_json - expect(json[:cooked]).not_to include(I18n.t('groups.request_membership_pm.handle')) - - json = BasicPostSerializer.new(post, scope: Guardian.new(owner), root: false).as_json - expect(json[:cooked]).to include(I18n.t('groups.request_membership_pm.handle')) - end - end - end diff --git a/test/javascripts/widgets/post-test.js.es6 b/test/javascripts/widgets/post-test.js.es6 index 23a7b17bdf4..7c19c715e68 100644 --- a/test/javascripts/widgets/post-test.js.es6 +++ b/test/javascripts/widgets/post-test.js.es6 @@ -922,3 +922,18 @@ widgetTest("post notice - with name", { ); } }); + +widgetTest("show group request in post", { + template: '{{mount-widget widget="post" args=args}}', + beforeEach() { + this.set("args", { + username: "foo", + requestedGroupName: "testGroup" + }); + }, + test(assert) { + const link = find(".group-request a"); + assert.equal(link.text().trim(), I18n.t("groups.requests.handle")); + assert.equal(link.attr("href"), "/g/testGroup/requests?filter=foo"); + } +});