simple_forum 0.0.2 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (50) hide show
  1. data/README.rdoc +17 -16
  2. data/app/assets/images/simple_forum/galdomedia-logo.png +0 -0
  3. data/app/assets/javascripts/simple_forum/application.js +5 -1
  4. data/app/assets/javascripts/simple_forum/moderators.js +40 -0
  5. data/app/assets/stylesheets/simple_forum/admin.css +15 -0
  6. data/app/assets/stylesheets/simple_forum/base.css +10 -0
  7. data/app/controllers/simple_forum/admin/base_controller.rb +7 -0
  8. data/app/controllers/simple_forum/admin/categories_controller.rb +70 -0
  9. data/app/controllers/simple_forum/admin/forums_controller.rb +88 -0
  10. data/app/controllers/simple_forum/application_controller.rb +29 -6
  11. data/app/controllers/simple_forum/forums_controller.rb +4 -4
  12. data/app/controllers/simple_forum/posts_controller.rb +2 -2
  13. data/app/controllers/simple_forum/topics_controller.rb +3 -3
  14. data/app/models/simple_forum/forum.rb +2 -10
  15. data/app/models/simple_forum/moderatorship.rb +1 -1
  16. data/app/models/simple_forum/post.rb +3 -3
  17. data/app/models/simple_forum/topic.rb +1 -9
  18. data/app/models/simple_forum/user_activity.rb +68 -61
  19. data/app/views/layouts/simple_forum.html.erb +22 -3
  20. data/app/views/layouts/simple_forum/admin.html.erb +70 -0
  21. data/app/views/simple_forum/admin/categories/_form.html.erb +9 -0
  22. data/app/views/simple_forum/admin/categories/edit.html.erb +18 -0
  23. data/app/views/simple_forum/admin/categories/index.html.erb +45 -0
  24. data/app/views/simple_forum/admin/categories/new.html.erb +17 -0
  25. data/app/views/simple_forum/admin/categories/show.html.erb +35 -0
  26. data/app/views/simple_forum/admin/forums/_form.html.erb +45 -0
  27. data/app/views/simple_forum/admin/forums/_moderator.html.erb +5 -0
  28. data/app/views/simple_forum/admin/forums/edit.html.erb +21 -0
  29. data/app/views/simple_forum/admin/forums/index.html.erb +77 -0
  30. data/app/views/simple_forum/admin/forums/new.html.erb +20 -0
  31. data/app/views/simple_forum/admin/forums/show.html.erb +55 -0
  32. data/app/views/simple_forum/forums/index.html.erb +4 -4
  33. data/app/views/simple_forum/forums/show.html.erb +4 -4
  34. data/app/views/simple_forum/posts/edit.html.erb +4 -10
  35. data/app/views/simple_forum/topics/_post.html.erb +4 -4
  36. data/app/views/simple_forum/topics/new.html.erb +1 -1
  37. data/app/views/simple_forum/topics/show.html.erb +3 -3
  38. data/config/locales/simple_forum.en.yml +130 -0
  39. data/config/locales/simple_forum.pl.yml +1 -0
  40. data/config/routes.rb +8 -0
  41. data/db/migrate/20110330123461_create_simple_forum_user_activities.rb +17 -0
  42. data/lib/generators/simple_forum/install_generator.rb +4 -5
  43. data/lib/generators/simple_forum/views_generator.rb +18 -0
  44. data/lib/generators/templates/simple_forum.rb +28 -24
  45. data/lib/simple_forum.rb +53 -30
  46. data/lib/simple_forum/configuration.rb +39 -0
  47. data/lib/simple_forum/engine.rb +8 -1
  48. data/lib/simple_forum/extensions/user.rb +18 -0
  49. data/lib/simple_forum/version.rb +2 -2
  50. metadata +97 -74
@@ -4,7 +4,7 @@ module SimpleForum
4
4
  :class_name => "SimpleForum::Forum"
5
5
 
6
6
  belongs_to :user,
7
- :class_name => instance_eval(&AbstractAuth.invoke(:user_class)).name
7
+ :class_name => instance_eval(&SimpleForum.invoke(:user_class)).name
8
8
 
9
9
  validates :forum, :user, :presence => true
10
10
  validates :user_id, :uniqueness => {:scope => :forum_id, :allow_nil => true}
@@ -1,13 +1,13 @@
1
1
  module SimpleForum
2
2
  class Post < ::ActiveRecord::Base
3
3
  belongs_to :user,
4
- :class_name => instance_eval(&AbstractAuth.invoke(:user_class)).name
4
+ :class_name => instance_eval(&SimpleForum.invoke(:user_class)).name
5
5
 
6
6
  belongs_to :edited_by,
7
- :class_name => instance_eval(&AbstractAuth.invoke(:user_class)).name
7
+ :class_name => instance_eval(&SimpleForum.invoke(:user_class)).name
8
8
 
9
9
  belongs_to :deleted_by,
10
- :class_name => instance_eval(&AbstractAuth.invoke(:user_class)).name
10
+ :class_name => instance_eval(&SimpleForum.invoke(:user_class)).name
11
11
 
12
12
  belongs_to :topic,
13
13
  :counter_cache => true,
@@ -1,6 +1,6 @@
1
1
  module SimpleForum
2
2
  class Topic < ::ActiveRecord::Base
3
- belongs_to :user, :class_name => instance_eval(&AbstractAuth.invoke(:user_class)).name
3
+ belongs_to :user, :class_name => instance_eval(&SimpleForum.invoke(:user_class)).name
4
4
 
5
5
  belongs_to :forum,
6
6
  :class_name => "SimpleForum::Forum", :counter_cache => true
@@ -98,14 +98,6 @@ module SimpleForum
98
98
  update_attribute(:is_closed, true)
99
99
  end
100
100
 
101
- def recent_activity?(user)
102
- SimpleForum::UserActivity.new(user).recent_activity?(self)
103
- end
104
-
105
- def bang_recent_activity(user)
106
- SimpleForum::UserActivity.new(user).bang(self)
107
- end
108
-
109
101
  def increment_views_count
110
102
  self.class.increment_counter(:views_count, self)
111
103
  end
@@ -1,80 +1,87 @@
1
- require 'pstore'
1
+ module SimpleForum
2
+ class UserActivity < ::ActiveRecord::Base
2
3
 
3
- class SimpleForum::UserActivity
4
+ class Checker
5
+ attr_reader :user, :hash
4
6
 
5
- PATH = Rails.root.join("file_store")
6
- FILE = "simple_forum_activity"
7
- FileUtils.mkdir_p(PATH)
7
+ def initialize(user, hash)
8
+ @user = user
9
+ @hash = hash
10
+ end
8
11
 
9
- attr_reader :user
12
+ def recent_activity?(object)
13
+ type = object.class.base_class.name.to_sym
14
+ hash[type] ||= {}
15
+ read_at = hash[type][object.id]
16
+ return unless read_at
10
17
 
11
- def recent_activity?(object)
12
- self[object] > Time.now
13
- return false unless user.try(:id)
14
- if object.is_a?(SimpleForum::Forum)
15
- if recent_post = object.recent_post
16
- recent_post.created_at > self[object]
17
- else
18
- false
18
+ if object.is_a?(SimpleForum::Forum)
19
+ recent_post = object.recent_post
20
+ recent_post && recent_post.created_at > read_at
21
+ elsif object.is_a?(SimpleForum::Topic)
22
+ object.last_updated_at && object.last_updated_at > read_at
23
+ elsif object.respond_to?(:updated_at)
24
+ object.updated_at > self[object]
25
+ end
19
26
  end
20
- else #SimpleForum::Topic
21
- if object.last_updated_at
22
- object.last_updated_at > self[object]
23
- else
24
- false
27
+
28
+ def bang(object)
29
+ return unless user
30
+ UserActivity.bang(object, user)
25
31
  end
32
+
26
33
  end
27
- end
28
34
 
29
- def initialize(user)
30
- @user = user
31
- end
35
+ belongs_to :user,
36
+ :class_name => instance_eval(&SimpleForum.invoke(:user_class)).name
32
37
 
33
- def self.store
34
- @@store ||= PStore.new(File.join(PATH, FILE))
35
- end
38
+ belongs_to :memoryable, :polymorphic => true
36
39
 
37
- def store
38
- self.class.store
39
- end
40
+ scope :only_read, where("#{quoted_table_name}.read_at IS NOT NULL")
40
41
 
41
- def [](object, default=Time.now)
42
- ret = nil
43
- store.transaction(true) do
44
- user_hash = store[user.id] || {}
45
- object_hash = user_hash[key_for_object(object)] || {}
46
- ret = object_hash[object.id]
47
- end if user.try(:id)
48
- ret || default
49
- end
42
+ def self.recent_activity_for_user(user)
43
+ if user && user.persisted?
44
+ u = user
45
+ hash = self.where(:user_id => user.try(:id)).to_hash
46
+ else
47
+ u = nil
48
+ hash = {}
49
+ end
50
+ Checker.new(u, hash)
51
+ end
50
52
 
51
- def bang(object)
52
- store.transaction do
53
- user_hash = store[user.id] || {}
54
- object_hash = (user_hash[key_for_object(object)] ||= {})
55
- object_hash[object.id] = Time.now
56
- store[user.id] = user_hash
57
- end if user.try(:id)
58
- nil
59
- end
53
+ def self.to_hash(collection=nil)
54
+ collection ||= only_read.all
55
+ {}.tap do |hash|
56
+ collection.each do |a|
57
+ hash[a.memoryable_type.to_sym] ||= {}
58
+ hash[a.memoryable_type.to_sym][a.memoryable_id] = a.read_at
59
+ end
60
+ end
61
+ end
60
62
 
61
- def destroy
62
- store.transaction do
63
- store.delete(user.id)
63
+ def self.bang(object, user)
64
+ if am = load(object, user)
65
+ update_all({:read_at => Time.now}, {:id => am.id})
66
+ else
67
+ am = create_for(object, user)
68
+ end
69
+ am
64
70
  end
65
- end
66
71
 
67
- private
72
+ def self.load(object, user, conditions=nil)
73
+ scope = self.where({:memoryable_type => object.class.name, :memoryable_id => object.id, :user_id => user.id})
74
+ scope = scope.where(conditions) if conditions
75
+ scope.first
76
+ end
68
77
 
69
- def key_for_object(object)
70
- case object
71
- when SimpleForum::Forum then
72
- :f
73
- when SimpleForum::Topic then
74
- :t
75
- else
76
- object.model_name.cache_key
78
+ def self.create_for(object, user, time=Time.now)
79
+ SimpleForum::UserActivity.create do |m|
80
+ m.memoryable = object
81
+ m.user = user
82
+ m.read_at = time
83
+ end
77
84
  end
78
- end
79
85
 
86
+ end
80
87
  end
@@ -1,8 +1,10 @@
1
1
  <!DOCTYPE html>
2
2
  <html lang="<%= I18n.locale %>">
3
3
  <head>
4
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
4
+ <meta charset="utf-8">
5
+
5
6
  <title><%= yield(:title) || '' %></title>
7
+
6
8
  <%= favicon_link_tag %>
7
9
 
8
10
  <%= stylesheet_link_tag "simple_forum/application" %>
@@ -20,9 +22,26 @@
20
22
  <body>
21
23
 
22
24
  <p class="logo">
23
- <%= link_to image_tag('http://galdomedia.pl/images/logo.gif', :alt => 'Galdomedia'), "http://galdomedia.pl", :title => "Galdomedia" %>
25
+ <%= link_to image_tag('simple_forum/galdomedia-logo.png', :alt => 'GaldoMedia'), "http://galdomedia.pl", :title => "GaldoMedia" %>
24
26
  </p>
25
27
 
28
+ <ul class="links">
29
+ <% if user_authenticated? %>
30
+ <li>
31
+ <%= link_to t('simple_forum.sign_out'), main_app.send(:"#{SimpleForum.sign_out_path}_path"), :method => main_app.routes.routes.named_routes["#{SimpleForum.sign_out_path}"].verb === "DELETE" ? :delete : :get %>
32
+ </li>
33
+ <% if forum_admin? %>
34
+ <li>
35
+ <%= link_to t('simple_forum.forum_administration'), simple_forum.admin_forums_path %>
36
+ </li>
37
+ <% end %>
38
+ <% else %>
39
+ <li>
40
+ <%= link_to t('simple_forum.sign_in'), main_app.send(:"#{SimpleForum.sign_in_path}_path") %>
41
+ </li>
42
+ <% end %>
43
+ </ul>
44
+
26
45
  <% if flash.present? %>
27
46
  <div id="flash_messages">
28
47
  <% flash.each do |key, val| %>
@@ -46,4 +65,4 @@
46
65
  </div>
47
66
 
48
67
  </body>
49
- </html>
68
+ </html>
@@ -0,0 +1,70 @@
1
+ <!DOCTYPE html>
2
+ <html lang="<%= I18n.locale %>">
3
+ <head>
4
+ <meta charset="utf-8">
5
+
6
+ <title><%= yield(:title) || '' %></title>
7
+
8
+ <%= favicon_link_tag %>
9
+
10
+ <%= stylesheet_link_tag "simple_forum/admin" %>
11
+
12
+ <%= yield :stylesheets %>
13
+
14
+ <%= csrf_meta_tag %>
15
+
16
+ <%= javascript_include_tag "simple_forum/application" %>
17
+
18
+ <%= yield :javascripts %>
19
+
20
+ <%= yield :head %>
21
+ </head>
22
+ <body>
23
+ <div id="container">
24
+ <div id="header">
25
+ <h1>
26
+ <%= link_to "Forum", simple_forum.root_path %>
27
+ </h1>
28
+
29
+ <div id="user-navigation">
30
+ <!--<ul class="wat-cf"></ul>-->
31
+ </div>
32
+ <div id="main-navigation">
33
+ <ul class="wat-cf">
34
+ <%= content_tag(:li, :class => controller.controller_path == 'simple_forum/admin/forums' ? 'active' : '') do %>
35
+ <%= link_to SimpleForum::Forum.model_name.human(:count => 3), simple_forum.admin_forums_path %>
36
+ <% end %>
37
+ <%= content_tag(:li, :class => controller.controller_path == 'simple_forum/admin/categories' ? 'active' : '') do %>
38
+ <%= link_to SimpleForum::Category.model_name.human(:count => 3), simple_forum.admin_categories_path %>
39
+ <% end %>
40
+ </ul>
41
+ </div>
42
+ </div>
43
+ <div id="wrapper" class="wat-cf">
44
+ <div class="flash">
45
+ <% flash.each do |type, message| %>
46
+ <%= content_tag(:div, :class => "message #{type}") do %>
47
+ <p>
48
+ <%= message %>
49
+ </p>
50
+ <% end %>
51
+ <% end %>
52
+ </div>
53
+ <div id="main">
54
+ <%= yield %>
55
+
56
+ <div id="footer">
57
+ <div class="block">
58
+ <p>
59
+ Copyright &copy; #{Time.current.year}.
60
+ </p>
61
+ </div>
62
+ </div>
63
+ </div>
64
+ <div id="sidebar">
65
+ <%= yield :sidebar %>
66
+ </div>
67
+ </div>
68
+ </div>
69
+ </body>
70
+ </html>
@@ -0,0 +1,9 @@
1
+ <%= semantic_form_for [:admin, resource], :html => {:class => 'form'} do |f| %>
2
+ <%= f.semantic_errors %>
3
+ <%= f.inputs do %>
4
+ <%= f.input :name %>
5
+ <%= f.input :body %>
6
+ <%= f.input :position %>
7
+ <% end %>
8
+ <%= f.actions(:submit) %>
9
+ <% end %>
@@ -0,0 +1,18 @@
1
+ <div class="block">
2
+ <div class="secondary-navigation">
3
+ <ul class="wat-cf">
4
+ <li>
5
+ <%= link_to "#{t("web-app-theme.list", :default => "List")}", simple_forum.admin_categories_path %>
6
+ </li>
7
+ </ul>
8
+ </div>
9
+ <div class="content">
10
+ <h2 class="title">
11
+ Edit
12
+ </h2>
13
+
14
+ <div class="inner">
15
+ <%= render :partial => "form" %>
16
+ </div>
17
+ </div>
18
+ </div>
@@ -0,0 +1,45 @@
1
+ <div class="block">
2
+ <div class="secondary-navigation">
3
+ <ul class="wat-cf">
4
+ <li>
5
+ <%= link_to "#{t("web-app-theme.new", :default => "New")}", simple_forum.new_admin_category_path %>
6
+ </li>
7
+ </ul>
8
+ </div>
9
+ <div class="content">
10
+ <h2 class="title">
11
+ <%= SimpleForum::Category.model_name.human(:count => 3) %>
12
+ </h2>
13
+
14
+ <div class="inner">
15
+ <table class="table">
16
+ <thead>
17
+ <tr>
18
+ <th>ID</th>
19
+ <th><%= SimpleForum::Category.human_attribute_name :name %></th>
20
+ <th class="last">&nbsp;</th>
21
+ </tr>
22
+ </thead>
23
+ <tbody>
24
+ <% @categories.each do |c| %>
25
+ <tr>
26
+ <td><%= c.id %></td>
27
+ <td><%= c.name %></td>
28
+ <td class="last">
29
+ <%= link_to t("web-app-theme.show", :default => "Show"), simple_forum.admin_category_path(c) %>
30
+ |
31
+ <%= link_to t("web-app-theme.edit", :default => "Edit"), simple_forum.edit_admin_category_path(c) %>
32
+ |
33
+ <%= link_to t("web-app-theme.delete", :default => "Delete"), simple_forum.admin_category_path(c), :method => :delete, :confirm => t('simple_forum.are_you_sure', :default => 'Are you sure?') %>
34
+
35
+ </td>
36
+ </tr>
37
+ <% end %>
38
+ </tbody>
39
+ </table>
40
+ </div>
41
+ </div>
42
+
43
+ </div>
44
+
45
+
@@ -0,0 +1,17 @@
1
+ <div class="block">
2
+ <div class="secondary-navigation">
3
+ <ul class="wat-cf">
4
+ <li>
5
+ <%= link_to "#{t("web-app-theme.list", :default => "List")}", simple_forum.admin_categories_path %>
6
+ </li>
7
+ </ul>
8
+ </div>
9
+ <div class="content">
10
+ <h2 class="title">
11
+ New
12
+ </h2>
13
+ <div class="inner">
14
+ <%= render :partial => "form" %>
15
+ </div>
16
+ </div>
17
+ </div>
@@ -0,0 +1,35 @@
1
+ <div class="block">
2
+ <div class="secondary-navigation">
3
+ <ul class="wat-cf">
4
+ <li>
5
+ <%= link_to "#{t("web-app-theme.list", :default => "List")}", simple_forum.admin_categories_path %>
6
+ </li>
7
+ <li>
8
+ <%= link_to "#{t("web-app-theme.edit", :default => "Edit")}", simple_forum.edit_admin_category_path(resource) %>
9
+ </li>
10
+ </ul>
11
+ </div>
12
+ <div class="content">
13
+ <h2 class="title">
14
+ <%= SimpleForum::Category.model_name.human %>
15
+ </h2>
16
+
17
+ <div class="inner">
18
+ <p>
19
+ <strong><%= resource.class.human_attribute_name :name %></strong>:
20
+ <%= resource.name %>
21
+ </p>
22
+
23
+ <p>
24
+ <strong><%= resource.class.human_attribute_name :body %></strong>:
25
+ <%= simple_format(resource.body) %>
26
+ </p>
27
+
28
+ <p>
29
+ <strong><%= resource.class.human_attribute_name :position %></strong>:
30
+ <%= resource.position %>
31
+ </p>
32
+
33
+ </div>
34
+ </div>
35
+ </div>