diff --git a/Gemfile b/Gemfile index 76753b3..88b198c 100644 --- a/Gemfile +++ b/Gemfile @@ -32,10 +32,6 @@ gem "oauth" # for parsing incoming mail gem "mail" -# for planet rss aggregation -gem "feed-normalizer" -gem "loofah" - group :test, :development do gem "rspec-rails", "~> 2.6" gem "machinist" diff --git a/Gemfile.lock b/Gemfile.lock index d4c693b..bb49e40 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -39,11 +39,7 @@ GEM execjs (2.2.1) faker (1.4.2) i18n (~> 0.5) - feed-normalizer (1.5.2) - hpricot (>= 0.6) - simple-rss (>= 1.1) hike (1.2.3) - hpricot (0.8.6) htmlentities (4.3.2) i18n (0.6.11) innertube (1.1.0) @@ -52,8 +48,6 @@ GEM thor (>= 0.14, < 2.0) json (1.8.1) kgio (2.9.2) - loofah (2.0.0) - nokogiri (>= 1.5.9) machinist (2.0) mail (2.5.4) mime-types (~> 1.16) @@ -103,7 +97,6 @@ GEM rspec-core (~> 2.99.0) rspec-expectations (~> 2.99.0) rspec-mocks (~> 2.99.0) - simple-rss (1.3.1) sprockets (2.12.1) hike (~> 1.2) multi_json (~> 1.0) @@ -143,10 +136,8 @@ DEPENDENCIES dynamic_form exception_notification faker - feed-normalizer htmlentities jquery-rails - loofah machinist mail mysql2 (>= 0.3.14) diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css index 9860960..f440608 100644 --- a/app/assets/stylesheets/application.css +++ b/app/assets/stylesheets/application.css @@ -494,10 +494,6 @@ li .domain { font-size: 8.5pt; vertical-align: middle; } -li .domain a { - color: #888; - text-decoration: none; -} .merge { background: url(data:image/png;base64,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) no-repeat; @@ -1122,10 +1118,3 @@ div.fieldWithErrors { font-style: italic; padding-left: 0.5em; } - - - -div.weblog_content { - padding: 0 2em; - overflow-x: auto; -} diff --git a/app/controllers/settings_controller.rb b/app/controllers/settings_controller.rb index 7cbaed8..1804026 100644 --- a/app/controllers/settings_controller.rb +++ b/app/controllers/settings_controller.rb @@ -38,7 +38,7 @@ private :email_replies, :email_messages, :email_mentions, :pushover_replies, :pushover_messages, :pushover_mentions, :pushover_user_key, :pushover_device, :pushover_sound, - :mailing_list_mode, :weblog_feed_url + :mailing_list_mode ) end end diff --git a/app/controllers/weblogs_controller.rb b/app/controllers/weblogs_controller.rb deleted file mode 100644 index 8345690..0000000 --- a/app/controllers/weblogs_controller.rb +++ /dev/null @@ -1,24 +0,0 @@ -class WeblogsController < ApplicationController - before_filter { @page = page } - - WEBLOGS_PER_PAGE = 10 - - def index - @pages = (Weblog.count / WEBLOGS_PER_PAGE.to_f).ceil - if @page > @pages - @page = @pages - end - @show_more = @page < @pages - - @weblogs = Weblog.order("created_at DESC"). - offset((@page - 1) * WEBLOGS_PER_PAGE). - limit(WEBLOGS_PER_PAGE) - - render :action => "index" - end - -private - def page - params[:page].to_i > 0 ? params[:page].to_i : 1 - end -end diff --git a/app/models/user.rb b/app/models/user.rb index 81e8caa..876528c 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -19,7 +19,6 @@ class User < ActiveRecord::Base belongs_to :banned_by_user, :class_name => "User" has_many :invitations - has_many :weblogs has_many :votes has_many :voted_stories, -> { where('votes.comment_id' => nil) }, :through => :votes, @@ -40,10 +39,6 @@ class User < ActiveRecord::Base :format => { :with => /\A[A-Za-z0-9][A-Za-z0-9_-]{0,24}\Z/ }, :uniqueness => { :case_sensitive => false } - validates :weblog_feed_url, - :format => { :with => /\Ahttps?:\/\/([^\.]+\.)+[a-z]+(\/|\z)/ }, - :allow_blank => true - validates_each :username do |record,attr,value| if BANNED_USERNAMES.include?(value.to_s.downcase) record.errors.add(attr, "is not permitted") diff --git a/app/models/weblog.rb b/app/models/weblog.rb deleted file mode 100644 index 7bca796..0000000 --- a/app/models/weblog.rb +++ /dev/null @@ -1,9 +0,0 @@ -class Weblog < ActiveRecord::Base - belongs_to :user - - serialize :tags, Array - - def sanitized_content - Loofah.fragment(self.content).scrub!(:strip).scrub!(:nofollow).to_s.html_safe - end -end diff --git a/app/views/layouts/weblogs.html.erb b/app/views/layouts/weblogs.html.erb deleted file mode 100644 index 75da804..0000000 --- a/app/views/layouts/weblogs.html.erb +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - - - - - - - - <% if @short_url %> - - <% end %> - <%= @title.present? ? "#{@title} | " : "" %>Planet <%= - Rails.application.name %> - <%= stylesheet_link_tag "application", :media => "all" %> - <% if @user %> - <%= javascript_include_tag "application" %> - - <% end %> - <%= csrf_meta_tags %> - - -
- - -
- <% if flash[:error] %> -
<%= flash[:error] %>
- <% elsif flash[:success] %> -
<%= flash[:success] %>
- <% end %> - - <%= yield %> - -
-
-
- - - diff --git a/app/views/settings/index.html.erb b/app/views/settings/index.html.erb index b3b7578..e3b12fa 100644 --- a/app/views/settings/index.html.erb +++ b/app/views/settings/index.html.erb @@ -65,18 +65,6 @@
-
- <%= f.label :weblog_feed_url, "Weblog Feed URL:", - :class => "required" %> - <%= f.text_field :weblog_feed_url, :placeholder => "optional", - :size => 40 %> - - For RSS/Atom feed aggregation; restrict to a technical feed if possible - -
- -
-
<%= f.label :about, "About:", :class => "required" %> <%= f.text_area :about, :size => "100x5", :style => "width: 600px;" %> diff --git a/app/views/weblogs/index.html.erb b/app/views/weblogs/index.html.erb deleted file mode 100644 index 5a1968d..0000000 --- a/app/views/weblogs/index.html.erb +++ /dev/null @@ -1,44 +0,0 @@ -
    -<% @weblogs.each do |weblog| %> -
  1. -
    -
    - - <%= weblog.title %> - - - <% weblog.tags.map{|t| t.downcase }.sort.each do |tag| %> - <%= tag %> - <% end %> - - - <%= weblog.site_title %> - - -
    -
    -
    - <%= weblog.sanitized_content %> -
    -
  2. -<% end %> -
- - diff --git a/config/routes.rb b/config/routes.rb index 3f72ff3..195207b 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,128 +1,117 @@ Lobsters::Application.routes.draw do - constraints(:subdomain => "planet") do - root :to => "weblogs#index", - :subdomain => "planet", - :as => "weblogs_root", - :protocol => (Rails.env == "production" ? "https://" : "http://") + scope :format => "html" do + root :to => "home#index", + :protocol => (Rails.env == "production" ? "https://" : "http://"), + :as => "root" - get "/page/:page" => "weblogs#index" - end + get "/rss" => "home#index", :format => "rss" + get "/hottest" => "home#index", :format => "json" - constraints do - scope :format => "html" do - root :to => "home#index", - :protocol => (Rails.env == "production" ? "https://" : "http://"), - :as => "root" + get "/page/:page" => "home#index" - get "/rss" => "home#index", :format => "rss" - get "/hottest" => "home#index", :format => "json" + get "/newest" => "home#newest", :format => /html|json|rss/ + get "/newest/page/:page" => "home#newest" + get "/newest/:user" => "home#newest_by_user" + get "/newest/:user/page/:page" => "home#newest_by_user" + get "/recent" => "home#recent" + get "/recent/page/:page" => "home#recent" + get "/hidden" => "home#hidden" + get "/hidden/page/:page" => "home#hidden" - get "/page/:page" => "home#index" + get "/upvoted(.format)" => "home#upvoted" + get "/upvoted/page/:page" => "home#upvoted" - get "/newest" => "home#newest", :format => /html|json|rss/ - get "/newest/page/:page" => "home#newest" - get "/newest/:user" => "home#newest_by_user" - get "/newest/:user/page/:page" => "home#newest_by_user" - get "/recent" => "home#recent" - get "/recent/page/:page" => "home#recent" - get "/hidden" => "home#hidden" - get "/hidden/page/:page" => "home#hidden" + get "/top" => "home#top" + get "/top/page/:page" => "home#top" + get "/top/:length" => "home#top" + get "/top/:length/page/:page" => "home#top" - get "/upvoted(.format)" => "home#upvoted" - get "/upvoted/page/:page" => "home#upvoted" + get "/threads" => "comments#threads" + get "/threads/:user" => "comments#threads" - get "/top" => "home#top" - get "/top/page/:page" => "home#top" - get "/top/:length" => "home#top" - get "/top/:length/page/:page" => "home#top" + get "/login" => "login#index" + post "/login" => "login#login" + post "/logout" => "login#logout" - get "/threads" => "comments#threads" - get "/threads/:user" => "comments#threads" + get "/signup" => "signup#index" + post "/signup" => "signup#signup" + get "/signup/invite" => "signup#invite" - get "/login" => "login#index" - post "/login" => "login#login" - post "/logout" => "login#logout" + get "/login/forgot_password" => "login#forgot_password", + :as => "forgot_password" + post "/login/reset_password" => "login#reset_password", + :as => "reset_password" + match "/login/set_new_password" => "login#set_new_password", + :as => "set_new_password", :via => [:get, :post] - get "/signup" => "signup#index" - post "/signup" => "signup#signup" - get "/signup/invite" => "signup#invite" + get "/t/:tag" => "home#tagged", :as => "tag", :format => /html|rss/ + get "/t/:tag/page/:page" => "home#tagged" - get "/login/forgot_password" => "login#forgot_password", - :as => "forgot_password" - post "/login/reset_password" => "login#reset_password", - :as => "reset_password" - match "/login/set_new_password" => "login#set_new_password", - :as => "set_new_password", :via => [:get, :post] + get "/search" => "search#index" - get "/t/:tag" => "home#tagged", :as => "tag", :format => /html|rss/ - get "/t/:tag/page/:page" => "home#tagged" + resources :stories do + post "upvote" + post "downvote" + post "unvote" + post "undelete" + post "hide" + post "unhide" + end + post "/stories/fetch_url_title", :format => "json" + post "/stories/preview" => "stories#preview" - get "/search" => "search#index" - - resources :stories do + resources :comments do + member do + get "reply" post "upvote" post "downvote" post "unvote" + + post "delete" post "undelete" - post "hide" - post "unhide" end - post "/stories/fetch_url_title", :format => "json" - post "/stories/preview" => "stories#preview" - - resources :comments do - member do - get "reply" - post "upvote" - post "downvote" - post "unvote" - - post "delete" - post "undelete" - end - end - get "/comments/page/:page" => "comments#index" - - get "/messages/sent" => "messages#sent" - post "/messages/batch_delete" => "messages#batch_delete", - :as => "batch_delete_messages" - resources :messages do - post "keep_as_new" - end - - get "/s/:id/:title/comments/:comment_short_id" => "stories#show" - get "/s/:id/(:title)" => "stories#show", :format => /html|json/ - - get "/u" => "users#tree" - get "/u/:username" => "users#show", :as => "user" - - get "/settings" => "settings#index" - post "/settings" => "settings#update" - post "/settings/delete_account" => "settings#delete_account", - :as => "delete_account" - - get "/filters" => "filters#index" - post "/filters" => "filters#update" - - post "/invitations" => "invitations#create" - get "/invitations" => "invitations#index" - get "/invitations/request" => "invitations#build" - post "/invitations/create_by_request" => "invitations#create_by_request", - :as => "create_invitation_by_request" - get "/invitations/confirm/:code" => "invitations#confirm_email" - post "/invitations/send_for_request" => "invitations#send_for_request", - :as => "send_invitation_for_request" - get "/invitations/:invitation_code" => "signup#invited" - post "/invitations/delete_request" => "invitations#delete_request", - :as => "delete_invitation_request" - - get "/moderations" => "moderations#index" - get "/moderations/page/:page" => "moderations#index" - - get "/privacy" => "home#privacy" - get "/about" => "home#about" - - get "/resettraffic" => "home#resettraffic" end + get "/comments/page/:page" => "comments#index" + + get "/messages/sent" => "messages#sent" + post "/messages/batch_delete" => "messages#batch_delete", + :as => "batch_delete_messages" + resources :messages do + post "keep_as_new" + end + + get "/s/:id/:title/comments/:comment_short_id" => "stories#show" + get "/s/:id/(:title)" => "stories#show", :format => /html|json/ + + get "/u" => "users#tree" + get "/u/:username" => "users#show", :as => "user" + + get "/settings" => "settings#index" + post "/settings" => "settings#update" + post "/settings/delete_account" => "settings#delete_account", + :as => "delete_account" + + get "/filters" => "filters#index" + post "/filters" => "filters#update" + + post "/invitations" => "invitations#create" + get "/invitations" => "invitations#index" + get "/invitations/request" => "invitations#build" + post "/invitations/create_by_request" => "invitations#create_by_request", + :as => "create_invitation_by_request" + get "/invitations/confirm/:code" => "invitations#confirm_email" + post "/invitations/send_for_request" => "invitations#send_for_request", + :as => "send_invitation_for_request" + get "/invitations/:invitation_code" => "signup#invited" + post "/invitations/delete_request" => "invitations#delete_request", + :as => "delete_invitation_request" + + get "/moderations" => "moderations#index" + get "/moderations/page/:page" => "moderations#index" + + get "/privacy" => "home#privacy" + get "/about" => "home#about" + + get "/resettraffic" => "home#resettraffic" end end diff --git a/db/migrate/20140901013149_drop_weblogs.rb b/db/migrate/20140901013149_drop_weblogs.rb new file mode 100644 index 0000000..01fdc04 --- /dev/null +++ b/db/migrate/20140901013149_drop_weblogs.rb @@ -0,0 +1,6 @@ +class DropWeblogs < ActiveRecord::Migration + def change + drop_table :weblogs + remove_column :users, :weblog_feed_url + end +end diff --git a/db/schema.rb b/db/schema.rb index 54bccea..d6fa1ec 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,7 +11,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 20140825225915) do +ActiveRecord::Schema.define(version: 20140901013149) do create_table "comments", force: true do |t| t.datetime "created_at", null: false @@ -168,7 +168,6 @@ ActiveRecord::Schema.define(version: 20140825225915) do t.string "banned_reason", limit: 200 t.datetime "deleted_at" t.string "pushover_sound" - t.string "weblog_feed_url" end add_index "users", ["mailing_list_mode"], name: "mailing_list_enabled", using: :btree @@ -189,19 +188,4 @@ ActiveRecord::Schema.define(version: 20140825225915) do add_index "votes", ["user_id", "comment_id"], name: "user_id_comment_id", using: :btree add_index "votes", ["user_id", "story_id"], name: "user_id_story_id", using: :btree - create_table "weblogs", force: true do |t| - t.datetime "created_at" - t.datetime "updated_at" - t.integer "user_id" - t.string "title", limit: 512 - t.string "url", limit: 512 - t.string "site_title", limit: 512 - t.string "site_url", limit: 512 - t.text "content", limit: 16777215 - t.text "tags" - t.string "uuid", limit: 200 - end - - add_index "weblogs", ["user_id", "uuid"], name: "user_and_uuid", unique: true, using: :btree - end diff --git a/script/update_weblogs b/script/update_weblogs deleted file mode 100755 index b2e1cf8..0000000 --- a/script/update_weblogs +++ /dev/null @@ -1,58 +0,0 @@ -#!/usr/bin/env ruby - -ENV["RAILS_ENV"] ||= "production" - -APP_PATH = File.expand_path('../../config/application', __FILE__) -require File.expand_path('../../config/boot', __FILE__) -require APP_PATH -Rails.application.require_environment! - -require "feed-normalizer" - -User.where("weblog_feed_url <> ''").each do |u| - begin - s = Sponge.new - data = s.fetch(u.weblog_feed_url, :get, nil, nil, { - "User-Agent" => "Mozilla/5.0 (compatible; Planet Lobsters; " << - "https://#{Rails.application.domain}/)" }) - if !data - raise "no data returned" - end - - feed = FeedNormalizer::FeedNormalizer.parse(data) - if !feed - raise "could not parse feed" - end - rescue => e - puts "error updating user #{u.id} from #{u.weblog_feed_url}: #{e}" - # TODO: send the user a private message on failure, probably limit to every - # x tries/days - next - end - - feed.entries.each do |e| - w = u.weblogs.where(:uuid => e.id).first - if !w - w = u.weblogs.build(:uuid => e.id) - end - - # prevent entries with bogus or future times from dominating the front page - if e.last_updated > Time.now - puts "skipping future entry #{e.id} with time #{e.last_updated}" - next - end - - # TODO: compare these manually, AR seems to always mark them dirty even if - # the content is the same - w.created_at = e.last_updated - w.url = e.url - w.title = e.title - w.content = e.content - w.tags = e.categories - - w.site_url = feed.url - w.site_title = feed.title - - w.save - end -end