From 739e28919a01e6c239ea244594b6e9d708ef779a Mon Sep 17 00:00:00 2001 From: albert Date: Sat, 25 Jun 2011 19:31:39 -0400 Subject: [PATCH] refactoring --- app/controllers/favorites_controller.rb | 2 +- app/helpers/application_helper.rb | 3 + app/logical/post_sets/base.rb | 12 +-- app/logical/post_sets/favorite.rb | 22 +++--- app/logical/post_sets/post.rb | 18 +++-- app/models/user.rb | 73 +++++++++++++------ .../post_set_presenters/favorite.rb | 33 +++++++++ app/presenters/post_set_presenters/post.rb | 36 +++++++++ app/views/favorites/index.html.erb | 6 +- app/views/users/new.html.erb | 2 +- db/migrate/20100204211522_create_users.rb | 6 +- 11 files changed, 159 insertions(+), 54 deletions(-) create mode 100644 app/presenters/post_set_presenters/favorite.rb create mode 100644 app/presenters/post_set_presenters/post.rb diff --git a/app/controllers/favorites_controller.rb b/app/controllers/favorites_controller.rb index 7bba9dc16..da5ca2d47 100644 --- a/app/controllers/favorites_controller.rb +++ b/app/controllers/favorites_controller.rb @@ -3,7 +3,7 @@ class FavoritesController < ApplicationController if params[:tags] redirect_to(posts_path(:tags => "fav:#{CurrentUser.name} #{params[:tags]}")) else - @post_set = PostSets::Favorite.new(CurrentUser.user) + @favorite_set = PostSets::Favorite.new(CurrentUser.user, params[:page]) end end diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index c2a5e2c7c..27eec3318 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -44,6 +44,9 @@ protected when "forum_posts" /^\/forum_topics/ + when "uploads" + /^\/post/ + else /^\/#{controller}/ end diff --git a/app/logical/post_sets/base.rb b/app/logical/post_sets/base.rb index 53d292aaa..cef6b5b8e 100644 --- a/app/logical/post_sets/base.rb +++ b/app/logical/post_sets/base.rb @@ -1,7 +1,7 @@ module PostSets class Base def has_wiki? - is_single_tag? + false end def wiki_page @@ -9,20 +9,20 @@ module PostSets end def has_artist? - is_single_tag? + false end def artist end - def presenter - @presenter ||= PostSetPresenter.new(self) - end - def is_single_tag? false end + def presenter + raise NotImplementedError + end + def arbitrary_sql_order_clause(ids, table_name) if ids.empty? return "#{table_name}.id desc" diff --git a/app/logical/post_sets/favorite.rb b/app/logical/post_sets/favorite.rb index 8981f29b4..325a9b9e4 100644 --- a/app/logical/post_sets/favorite.rb +++ b/app/logical/post_sets/favorite.rb @@ -1,20 +1,10 @@ module PostSets class Favorite < Base - attr_reader :user, :page, :favorites, :posts + attr_reader :user, :page, :favorites def initialize(user_id, page) @user = ::User.find(user_id) - @page = [page.to_i, 1].max - @favorites = ::Favorite.model_for(user.id).for_user(user.id).page(page) - @posts = ::Post.where("id in (?)", post_ids).order(arbitrary_sql_order_clause(post_ids, "posts")).page("b0") - end - - def post_ids - @post_ids ||= favorites.map(&:post_id) - end - - def offset - (page - 1) * records_per_page + @favorites = ::Favorite.model_for(user.id).for_user(user.id).paginate(page) end def tag_array @@ -24,5 +14,13 @@ module PostSets def tag_string tag_array.join(" ") end + + def posts + favorites.map(&:post) + end + + def presenter + @presenter ||= ::PostSetPresenters::Favorite.new(self) + end end end diff --git a/app/logical/post_sets/post.rb b/app/logical/post_sets/post.rb index 5fbabb23e..3a668c3e8 100644 --- a/app/logical/post_sets/post.rb +++ b/app/logical/post_sets/post.rb @@ -13,11 +13,7 @@ module PostSets end def has_wiki? - if tag_array.any? - ::WikiPage.titled(tag_string).exists? - else - false - end + tag_array.any? && ::WikiPage.titled(tag_string).exists? end def wiki_page @@ -28,8 +24,20 @@ module PostSets end end + def has_artist? + tag_array.any? && ::Artist.name_equals(tag_string).exists? + end + + def artist + ::Artist.name_equals(tag_string).first + end + def is_single_tag? tag_array.size == 1 end + + def presenter + @presenter ||= ::PostSetPresenters::Post.new(self) + end end end diff --git a/app/models/user.rb b/app/models/user.rb index f5bd18e4e..a84d05dbb 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -4,6 +4,15 @@ class User < ActiveRecord::Base class Error < Exception ; end class PrivilegeError < Exception ; end + module Levels + MEMBER = 0 + PRIVILEGED = 100 + CONTRIBUTOR = 200 + JANITOR = 300 + MODERATOR = 400 + ADMIN = 500 + end + attr_accessor :password, :old_password attr_accessible :password, :old_password, :password_confirmation, :password_hash, :email, :last_logged_in_at, :last_forum_read_at, :has_mail, :receive_email_notifications, :comment_threshold, :always_resize_images, :favorite_tags, :blacklisted_tags, :name, :ip_addr validates_length_of :name, :within => 2..20, :on => :create @@ -18,7 +27,6 @@ class User < ActiveRecord::Base before_save :encrypt_password after_save :update_cache before_create :promote_to_admin_if_first_user - before_create :normalize_level has_many :feedback, :class_name => "UserFeedback", :dependent => :destroy has_one :ban has_many :subscriptions, :class_name => "TagSubscription" @@ -140,33 +148,32 @@ class User < ActiveRecord::Base return if Rails.env.test? if User.count == 0 - self.is_admin = true + self.level = Levels::ADMIN end end def level_string - if is_admin? - "Admin" - elsif is_moderator? + case level + when Levels::MEMBER + "Member" + + when Levels::PRIVILEGED + "Privileged" + + when Levels::CONTRIBUTOR + "Contributor" + + when Levels::JANITOR + "Janitor" + + when Levels::MODERATOR "Moderator" - end - - def normalize_level - if is_admin? - self.is_moderator = true - self.is_janitor = true - self.is_contributor = true - self.is_privileged = true - elsif is_moderator? - self.is_janitor = true - self.is_privileged = true - elsif is_janitor? - self.is_privileged = true - elsif is_contributor? - self.is_privileged = true + + when Levels::ADMIN + "Admin" end end - + def is_anonymous? false end @@ -174,6 +181,30 @@ class User < ActiveRecord::Base def is_member? true end + + def is_privileged? + level >= Levels::PRIVILEGED + end + + def is_contributor? + level >= Levels::CONTRIBUTOR + end + + def is_janitor? + level >= Levels::JANITOR + end + + def is_moderator? + level >= Levels::MODERATOR + end + + def is_mod? + level >= Levels::MODERATOR + end + + def is_admin? + level >= Levels::ADMIN + end end module EmailVerificationMethods diff --git a/app/presenters/post_set_presenters/favorite.rb b/app/presenters/post_set_presenters/favorite.rb new file mode 100644 index 000000000..1b7fb7b5e --- /dev/null +++ b/app/presenters/post_set_presenters/favorite.rb @@ -0,0 +1,33 @@ +module PostSetPresenters + class Favorite + attr_accessor :favorite_set, :tag_set_presenter + delegate :favorites, :posts, :to => :favorite_set + + def initialize(favorite_set) + @favorite_set = favorite_set + @tag_set_presenter = TagSetPresenter.new( + RelatedTagCalculator.calculate_from_sample_to_array( + favorite_set.tag_string + ).map {|x| x[0]} + ) + end + + def tag_list_html(template) + tag_set_presenter.tag_list_html(template) + end + + def post_previews_html(template) + html = "" + + if favorites.empty? + return template.render(:partial => "post_sets/blank") + end + + favorites.each do |favorite| + html << PostPresenter.preview(favorite.post) + end + + html.html_safe + end + end +end diff --git a/app/presenters/post_set_presenters/post.rb b/app/presenters/post_set_presenters/post.rb new file mode 100644 index 000000000..0ce1a4b46 --- /dev/null +++ b/app/presenters/post_set_presenters/post.rb @@ -0,0 +1,36 @@ +module PostSetPresenters + class Post + attr_accessor :post_set, :tag_set_presenter + + def initialize(post_set) + @post_set = post_set + @tag_set_presenter = TagSetPresenter.new( + RelatedTagCalculator.calculate_from_sample_to_array( + post_set.tag_string + ).map {|x| x[0]} + ) + end + + def posts + post_set.posts + end + + def tag_list_html(template) + tag_set_presenter.tag_list_html(template) + end + + def post_previews_html(template) + html = "" + + if posts.empty? + return template.render(:partial => "post_sets/blank") + end + + posts.each do |post| + html << PostPresenter.preview(post) + end + + html.html_safe + end + end +end diff --git a/app/views/favorites/index.html.erb b/app/views/favorites/index.html.erb index 0d09ac3dd..dff51ddd4 100644 --- a/app/views/favorites/index.html.erb +++ b/app/views/favorites/index.html.erb @@ -4,7 +4,7 @@ @@ -25,12 +25,12 @@

Posts

- <%= @post_set.presenter.post_previews_html %> + <%= @favorite_set.presenter.post_previews_html(self) %>
- <%= sequential_paginator(@post_set.favorites) %> + <%= sequential_paginator(@favorite_set.favorites) %>
diff --git a/app/views/users/new.html.erb b/app/views/users/new.html.erb index 0b46b418d..9b56e4a60 100644 --- a/app/views/users/new.html.erb +++ b/app/views/users/new.html.erb @@ -70,7 +70,7 @@ <%= f.input :name %> <%= f.input :password %> <%= f.input :password_confirmation %> - <%= f.input :email %> + <%= f.input :email, :required => false %> <%= f.button :submit %> <% end %> diff --git a/db/migrate/20100204211522_create_users.rb b/db/migrate/20100204211522_create_users.rb index fae1ec44f..d3c9eb896 100644 --- a/db/migrate/20100204211522_create_users.rb +++ b/db/migrate/20100204211522_create_users.rb @@ -9,11 +9,7 @@ class CreateUsers < ActiveRecord::Migration t.column :email_verification_key, :string t.column :inviter_id, :integer t.column :is_banned, :boolean, :null => false, :default => false - t.column :is_privileged, :boolean, :null => false, :default => false - t.column :is_contributor, :boolean, :null => false, :default => false - t.column :is_janitor, :boolean, :null => false, :default => false - t.column :is_moderator, :boolean, :null => false, :default => false - t.column :is_admin, :boolean, :null => false, :default => false + t.column :level, :integer, :null => false, :default => 0 t.column :base_upload_limit, :integer, :null => false, :default => 10 # Cached data