diff --git a/Changelog.md b/Changelog.md index 38efeec22..9e8fed394 100644 --- a/Changelog.md +++ b/Changelog.md @@ -262,6 +262,7 @@ everything is set up. * Show the service username in a tooltip next to the publisher icons [#4126](https://github.com/diaspora/diaspora/pull/4126) * Ability to add location when creating a post [#3803](https://github.com/diaspora/diaspora/pull/3803) * Added oEmbed provider for MixCloud. [#4131](https://github.com/diaspora/diaspora/pull/4131) +* Added Wordpress service ability for posts. [#4321](https://github.com/diaspora/diaspora/pull/4321) ## Gem updates diff --git a/Gemfile b/Gemfile index 59087dbd4..b19daf0a2 100644 --- a/Gemfile +++ b/Gemfile @@ -77,6 +77,7 @@ gem 'omniauth-facebook', '1.4.1' gem 'omniauth-tumblr', '1.1' gem 'omniauth-twitter', '1.0.0' gem 'twitter', '4.8.1' +gem 'omniauth-wordpress','0.1.1', github: 'readmill/omniauth-wordpress' # Tags diff --git a/Gemfile.lock b/Gemfile.lock index 2f89ad7a8..2ff4301b3 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,3 +1,10 @@ +GIT + remote: git://github.com/readmill/omniauth-wordpress.git + revision: 32ac451f564e5189a863cb5db16aad2d48f7a638 + specs: + omniauth-wordpress (0.1.1) + omniauth-oauth2 (~> 1.1.0) + GEM remote: https://rubygems.org/ specs: @@ -464,6 +471,7 @@ DEPENDENCIES omniauth-facebook (= 1.4.1) omniauth-tumblr (= 1.1) omniauth-twitter (= 1.0.0) + omniauth-wordpress (= 0.1.1)! rack-cors (= 0.2.8) rack-google-analytics (= 0.11.0) rack-piwik (= 0.2.2) diff --git a/app/assets/images/social_media_logos/wordpress-16x16.png b/app/assets/images/social_media_logos/wordpress-16x16.png new file mode 100644 index 000000000..8935e416f Binary files /dev/null and b/app/assets/images/social_media_logos/wordpress-16x16.png differ diff --git a/app/assets/images/social_media_logos/wordpress-24x24.png b/app/assets/images/social_media_logos/wordpress-24x24.png new file mode 100644 index 000000000..ee13ecb3a Binary files /dev/null and b/app/assets/images/social_media_logos/wordpress-24x24.png differ diff --git a/app/assets/images/social_media_logos/wordpress-32x32.png b/app/assets/images/social_media_logos/wordpress-32x32.png new file mode 100644 index 000000000..d54abc98a Binary files /dev/null and b/app/assets/images/social_media_logos/wordpress-32x32.png differ diff --git a/app/assets/images/social_media_logos/wordpress-48x48.png b/app/assets/images/social_media_logos/wordpress-48x48.png new file mode 100644 index 000000000..9b4635172 Binary files /dev/null and b/app/assets/images/social_media_logos/wordpress-48x48.png differ diff --git a/app/assets/stylesheets/application.css.sass b/app/assets/stylesheets/application.css.sass index 9c7ea04bc..9a94e339b 100644 --- a/app/assets/stylesheets/application.css.sass +++ b/app/assets/stylesheets/application.css.sass @@ -797,6 +797,7 @@ form p.checkbox_select .social_media_logos-facebook-16x16, .social_media_logos-twitter-16x16, .social_media_logos-tumblr-16x16, + .social_media_logos-wordpress-16x16, .social_media_logos-email-16x16, .social_media_logos-feed-16x16, .social_media_logos-website-16x16 @@ -2867,6 +2868,7 @@ a.toggle_selector .social_media_logos-facebook-24x24, .social_media_logos-twitter-24x24, .social_media_logos-tumblr-24x24, + .social_media_logos-wordpress-24x24, .social_media_logos-email-24x24, .social_media_logos-feed-24x24, .social_media_logos-website-24x24 diff --git a/app/models/services/wordpress.rb b/app/models/services/wordpress.rb new file mode 100644 index 000000000..048cf03f5 --- /dev/null +++ b/app/models/services/wordpress.rb @@ -0,0 +1,32 @@ +class Services::Wordpress < Service + include ActionView::Helpers::TextHelper + include MarkdownifyHelper + + MAX_CHARACTERS = 1000 + + attr_accessor :username, :password, :host, :path + + # uid = blog_id + + def provider + "wordpress" + end + + def post(post, url='') + res = Faraday.new(:url => "https://public-api.wordpress.com").post do |req| + req.url "/rest/v1/sites/#{self.uid}/posts/new" + req.body = post_body(post).to_json + req.headers['Authorization'] = "Bearer #{self.access_token}" + req.headers['Content-Type'] = 'application/json' + end + JSON.parse res.env[:body] + end + + def post_body(post, url='') + post_text = markdownify(post.text) + post_title = truncate(strip_markdown(post.text(:plain_text => true)), :length => 40, :separator => ' ') + + {:title => post_title, :content => post_text.html_safe} + end + +end diff --git a/config/defaults.yml b/config/defaults.yml index 7454595bf..5ab5f71ae 100644 --- a/config/defaults.yml +++ b/config/defaults.yml @@ -92,6 +92,10 @@ defaults: enable: false key: secret: + wordpress: + enable: false + key: + secret: mail: enable: false sender_address: 'no-reply@example.org' diff --git a/config/diaspora.yml.example b/config/diaspora.yml.example index 2395d468d..18c1ff3fd 100644 --- a/config/diaspora.yml.example +++ b/config/diaspora.yml.example @@ -328,6 +328,12 @@ configuration: ## Section #enable: true #key: 'abcdef' #secret: 'changeme' + + ## OAuth credentials for Wordpress + wordpress: ## Section + #enable: true + #client_id: 'abcdef' + #secret: 'changeme' ## Settings relevant to administrators admins: ## Section diff --git a/config/initializers/omniauth.rb b/config/initializers/omniauth.rb index 67ec29747..63b54f4e8 100644 --- a/config/initializers/omniauth.rb +++ b/config/initializers/omniauth.rb @@ -26,4 +26,8 @@ Rails.application.config.middleware.use OmniAuth::Builder do } } end + + if AppConfig.services.wordpress.enable? + provider :wordpress, AppConfig.services.wordpress.client_id, AppConfig.services.wordpress.secret + end end diff --git a/lib/configuration_methods.rb b/lib/configuration_methods.rb index 4b08dfec0..60bdda8bb 100644 --- a/lib/configuration_methods.rb +++ b/lib/configuration_methods.rb @@ -24,7 +24,7 @@ module Configuration return @configured_services unless @configured_services.nil? @configured_services = [] - [:twitter, :tumblr, :facebook].each do |service| + [:twitter, :tumblr, :facebook, :wordpress].each do |service| @configured_services << service if services.send(service).enable? end diff --git a/spec/lib/configuration_methods_spec.rb b/spec/lib/configuration_methods_spec.rb index a87038de2..e1ba743f1 100644 --- a/spec/lib/configuration_methods_spec.rb +++ b/spec/lib/configuration_methods_spec.rb @@ -61,10 +61,12 @@ describe Configuration::Methods do services.stub(:twitter).and_return(enabled) services.stub(:tumblr).and_return(enabled) services.stub(:facebook).and_return(disabled) + services.stub(:wordpress).and_return(disabled) @settings.stub(:services).and_return(services) @settings.configured_services.should include :twitter @settings.configured_services.should include :tumblr @settings.configured_services.should_not include :facebook + @settings.configured_services.should_not include :wordpress end end diff --git a/spec/models/services/wordpress_spec.rb b/spec/models/services/wordpress_spec.rb new file mode 100644 index 000000000..fd970d839 --- /dev/null +++ b/spec/models/services/wordpress_spec.rb @@ -0,0 +1,33 @@ +require 'spec_helper' + +describe Services::Wordpress do + + before do + @user = alice + @post = @user.post(:status_message, + :text => "Hello there. This is a **Wordpress** post that we hope to turn into something else.", + :to => @user.aspects.first.id) + + @service = Services::Wordpress.new(:nickname => "andrew", + :access_token => "abc123", + :uid => "123") + @user.services << @service + end + + describe "#post" do + it 'posts a status message to wordpress' do + stub_request(:post, "https://public-api.wordpress.com/rest/v1/sites/123/posts/new").to_return(:status => 200, :body => {:ID => 68}.to_json, :headers => {}) + @service.post(@post) + end + end + + describe "#post_body" do + it "truncates content for use in title" do + @service.post_body(@post)[:title].should eq("Hello there. This is a Wordpress post...") + end + it "converts markdown tags" do + @service.post_body(@post)[:content].should match("Wordpress") + end + end + +end