formol 0.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/MIT-LICENSE +20 -0
- data/README.md +147 -0
- data/Rakefile +29 -0
- data/app/assets/images/formol/read.png +0 -0
- data/app/assets/images/formol/unread.png +0 -0
- data/app/assets/javascripts/formol/admin/categories.js.coffee +55 -0
- data/app/assets/javascripts/formol/admin/forums.js +2 -0
- data/app/assets/javascripts/formol/application.js +9 -0
- data/app/assets/javascripts/formol/categories.js +2 -0
- data/app/assets/javascripts/formol/forums.js +2 -0
- data/app/assets/javascripts/formol/poll_votes.js +2 -0
- data/app/assets/javascripts/formol/posts.js.coffee +9 -0
- data/app/assets/javascripts/formol/preferences.js +2 -0
- data/app/assets/javascripts/formol/subscriptions.js.coffee +13 -0
- data/app/assets/javascripts/formol/topics.js.coffee +54 -0
- data/app/assets/javascripts/lib/jquery.prevent_double_submit.js.coffee +11 -0
- data/app/assets/javascripts/markitup/jquery.markitup.js +593 -0
- data/app/assets/javascripts/markitup/sets/markdown/set.js +53 -0
- data/app/assets/stylesheets/form_struct.css.scss +39 -0
- data/app/assets/stylesheets/formol/admin/categories.css.scss +30 -0
- data/app/assets/stylesheets/formol/admin/forums.css +4 -0
- data/app/assets/stylesheets/formol/categories.css.scss +3 -0
- data/app/assets/stylesheets/formol/development.css +4 -0
- data/app/assets/stylesheets/formol/forums.css.scss +3 -0
- data/app/assets/stylesheets/formol/mixins/after_clear.css.scss +7 -0
- data/app/assets/stylesheets/formol/partials/breadcrumb.css.scss +9 -0
- data/app/assets/stylesheets/formol/partials/categories/list.css.scss +101 -0
- data/app/assets/stylesheets/formol/partials/formol_lists.css.scss +6 -0
- data/app/assets/stylesheets/formol/partials/forums/list.css.scss +97 -0
- data/app/assets/stylesheets/formol/partials/polls/poll.css.scss +9 -0
- data/app/assets/stylesheets/formol/partials/posts/post.css.scss +116 -0
- data/app/assets/stylesheets/formol/posts.css.scss +8 -0
- data/app/assets/stylesheets/formol/topics.css.scss +42 -0
- data/app/assets/stylesheets/markitup/sets/markdown/images/block_code.png +0 -0
- data/app/assets/stylesheets/markitup/sets/markdown/images/bold.png +0 -0
- data/app/assets/stylesheets/markitup/sets/markdown/images/code.png +0 -0
- data/app/assets/stylesheets/markitup/sets/markdown/images/h1.png +0 -0
- data/app/assets/stylesheets/markitup/sets/markdown/images/h2.png +0 -0
- data/app/assets/stylesheets/markitup/sets/markdown/images/h3.png +0 -0
- data/app/assets/stylesheets/markitup/sets/markdown/images/h4.png +0 -0
- data/app/assets/stylesheets/markitup/sets/markdown/images/h5.png +0 -0
- data/app/assets/stylesheets/markitup/sets/markdown/images/h6.png +0 -0
- data/app/assets/stylesheets/markitup/sets/markdown/images/italic.png +0 -0
- data/app/assets/stylesheets/markitup/sets/markdown/images/link.png +0 -0
- data/app/assets/stylesheets/markitup/sets/markdown/images/list-bullet.png +0 -0
- data/app/assets/stylesheets/markitup/sets/markdown/images/list-numeric.png +0 -0
- data/app/assets/stylesheets/markitup/sets/markdown/images/picture.png +0 -0
- data/app/assets/stylesheets/markitup/sets/markdown/images/preview.png +0 -0
- data/app/assets/stylesheets/markitup/sets/markdown/images/quotes.png +0 -0
- data/app/assets/stylesheets/markitup/sets/markdown/style.css +57 -0
- data/app/assets/stylesheets/markitup/skins/markitup/images/bg-container.png +0 -0
- data/app/assets/stylesheets/markitup/skins/markitup/images/bg-editor-bbcode.png +0 -0
- data/app/assets/stylesheets/markitup/skins/markitup/images/bg-editor-dotclear.png +0 -0
- data/app/assets/stylesheets/markitup/skins/markitup/images/bg-editor-html.png +0 -0
- data/app/assets/stylesheets/markitup/skins/markitup/images/bg-editor-json.png +0 -0
- data/app/assets/stylesheets/markitup/skins/markitup/images/bg-editor-markdown.png +0 -0
- data/app/assets/stylesheets/markitup/skins/markitup/images/bg-editor-textile.png +0 -0
- data/app/assets/stylesheets/markitup/skins/markitup/images/bg-editor-wiki.png +0 -0
- data/app/assets/stylesheets/markitup/skins/markitup/images/bg-editor-xml.png +0 -0
- data/app/assets/stylesheets/markitup/skins/markitup/images/bg-editor.png +0 -0
- data/app/assets/stylesheets/markitup/skins/markitup/images/handle.png +0 -0
- data/app/assets/stylesheets/markitup/skins/markitup/images/menu.png +0 -0
- data/app/assets/stylesheets/markitup/skins/markitup/images/submenu.png +0 -0
- data/app/assets/stylesheets/markitup/skins/markitup/style.css +147 -0
- data/app/assets/stylesheets/markitup/skins/simple/images/handle.png +0 -0
- data/app/assets/stylesheets/markitup/skins/simple/images/menu.png +0 -0
- data/app/assets/stylesheets/markitup/skins/simple/images/submenu.png +0 -0
- data/app/assets/stylesheets/markitup/skins/simple/style.css +118 -0
- data/app/assets/stylesheets/pygments/autumn.css +58 -0
- data/app/assets/stylesheets/pygments/borland.css +46 -0
- data/app/assets/stylesheets/pygments/bw.css +34 -0
- data/app/assets/stylesheets/pygments/colorful.css +61 -0
- data/app/assets/stylesheets/pygments/default.css +62 -0
- data/app/assets/stylesheets/pygments/emacs.css +61 -0
- data/app/assets/stylesheets/pygments/friendly.css +61 -0
- data/app/assets/stylesheets/pygments/fruity.css +70 -0
- data/app/assets/stylesheets/pygments/manni.css +61 -0
- data/app/assets/stylesheets/pygments/murphy.css +61 -0
- data/app/assets/stylesheets/pygments/native.css +70 -0
- data/app/assets/stylesheets/pygments/pastie.css +60 -0
- data/app/assets/stylesheets/pygments/perldoc.css +58 -0
- data/app/assets/stylesheets/pygments/tango.css +69 -0
- data/app/assets/stylesheets/pygments/trac.css +59 -0
- data/app/assets/stylesheets/pygments/vim.css +70 -0
- data/app/assets/stylesheets/pygments/vs.css +33 -0
- data/app/controllers/formol/admin/admin_controller.rb +11 -0
- data/app/controllers/formol/admin/categories_controller.rb +60 -0
- data/app/controllers/formol/admin/forums_controller.rb +56 -0
- data/app/controllers/formol/application_controller.rb +47 -0
- data/app/controllers/formol/categories_controller.rb +21 -0
- data/app/controllers/formol/forums_controller.rb +19 -0
- data/app/controllers/formol/poll_votes_controller.rb +23 -0
- data/app/controllers/formol/posts_controller.rb +71 -0
- data/app/controllers/formol/preferences_controller.rb +32 -0
- data/app/controllers/formol/subscriptions_controller.rb +29 -0
- data/app/controllers/formol/topics_controller.rb +91 -0
- data/app/helpers/formol/admin/categories_helper.rb +4 -0
- data/app/helpers/formol/admin/forums_helper.rb +4 -0
- data/app/helpers/formol/application_helper.rb +35 -0
- data/app/helpers/formol/categories_helper.rb +15 -0
- data/app/helpers/formol/forums_helper.rb +19 -0
- data/app/helpers/formol/poll_votes_helper.rb +4 -0
- data/app/helpers/formol/posts_helper.rb +27 -0
- data/app/helpers/formol/preferences_helper.rb +4 -0
- data/app/helpers/formol/subscriptions_helper.rb +4 -0
- data/app/helpers/formol/topics_helper.rb +27 -0
- data/app/mailers/formol/subscription_mailer.rb +13 -0
- data/app/models/formol/category.rb +42 -0
- data/app/models/formol/forum.rb +77 -0
- data/app/models/formol/poll/option.rb +20 -0
- data/app/models/formol/poll/vote.rb +32 -0
- data/app/models/formol/poll.rb +107 -0
- data/app/models/formol/post.rb +162 -0
- data/app/models/formol/post_observer.rb +9 -0
- data/app/models/formol/topic/subscription.rb +16 -0
- data/app/models/formol/topic/track.rb +57 -0
- data/app/models/formol/topic.rb +185 -0
- data/app/models/formol/tracking.rb +45 -0
- data/app/models/formol/user_preference.rb +18 -0
- data/app/views/formol/admin/categories/_category.html.erb +9 -0
- data/app/views/formol/admin/categories/_form.html.erb +8 -0
- data/app/views/formol/admin/categories/edit.html.erb +3 -0
- data/app/views/formol/admin/categories/index.html.erb +3 -0
- data/app/views/formol/admin/categories/new.html.erb +3 -0
- data/app/views/formol/admin/forums/_form.html.erb +9 -0
- data/app/views/formol/admin/forums/_forum.html.erb +12 -0
- data/app/views/formol/admin/forums/edit.html.erb +3 -0
- data/app/views/formol/admin/forums/new.html.erb +3 -0
- data/app/views/formol/categories/_category.html.erb +5 -0
- data/app/views/formol/categories/index.html.erb +5 -0
- data/app/views/formol/categories/show.html.erb +3 -0
- data/app/views/formol/forums/_forum.html.erb +13 -0
- data/app/views/formol/forums/_list.html.erb +16 -0
- data/app/views/formol/forums/show.html.erb +18 -0
- data/app/views/formol/poll/options/_form.html.erb +1 -0
- data/app/views/formol/poll_votes/_form.html.erb +8 -0
- data/app/views/formol/polls/_form.html.erb +14 -0
- data/app/views/formol/polls/_poll.html.erb +24 -0
- data/app/views/formol/posts/_form.html.erb +7 -0
- data/app/views/formol/posts/_last_post.html.erb +9 -0
- data/app/views/formol/posts/_list.html.erb +3 -0
- data/app/views/formol/posts/_post.html.erb +47 -0
- data/app/views/formol/posts/edit.html.erb +10 -0
- data/app/views/formol/posts/new.html.erb +14 -0
- data/app/views/formol/preferences/show.html.erb +11 -0
- data/app/views/formol/subscription_mailer/topic_reply.en.html.erb +8 -0
- data/app/views/formol/subscription_mailer/topic_reply.fr.html.erb +8 -0
- data/app/views/formol/topics/_form.html.erb +20 -0
- data/app/views/formol/topics/_list.html.erb +16 -0
- data/app/views/formol/topics/_topic.html.erb +13 -0
- data/app/views/formol/topics/edit.html.erb +5 -0
- data/app/views/formol/topics/new.html.erb +5 -0
- data/app/views/formol/topics/show.html.erb +25 -0
- data/app/views/layouts/formol/mail.html.erb +9 -0
- data/config/locales/en.yml +3 -0
- data/config/locales/formol/views/forums/en.yml +13 -0
- data/config/locales/formol/views/forums/fr.yml +13 -0
- data/config/locales/formol/views/poll_votes/en.yml +5 -0
- data/config/locales/formol/views/polls/en.yml.yml +5 -0
- data/config/locales/formol/views/posts/en.yml +23 -0
- data/config/locales/formol/views/posts/fr.yml +20 -0
- data/config/locales/formol/views/topics/en.yml +23 -0
- data/config/locales/formol/views/topics/fr.yml +20 -0
- data/config/routes.rb +31 -0
- data/db/migrate/20111221101158_create_formol_categories.rb +7 -0
- data/db/migrate/20111221111417_create_formol_forums.rb +10 -0
- data/db/migrate/20111221121010_create_formol_topics.rb +9 -0
- data/db/migrate/20111221123515_create_formol_posts.rb +9 -0
- data/db/migrate/20111221151653_add_index_on_tables.rb +15 -0
- data/db/migrate/20120103163438_add_user_to_models.rb +13 -0
- data/db/migrate/20120104132631_add_counter_cache_to_models.rb +12 -0
- data/db/migrate/20120104163741_add_pinned_to_topics.rb +7 -0
- data/db/migrate/20120105133522_add_position_to_categories.rb +7 -0
- data/db/migrate/20120105190708_add_position_to_forums.rb +7 -0
- data/db/migrate/20120105212559_add_lock_to_topics.rb +7 -0
- data/db/migrate/20120106130944_add_first_post_and_last_post_to_topics.rb +8 -0
- data/db/migrate/20120106192951_change_forum_description_to_string.rb +9 -0
- data/db/migrate/20120107012517_add_last_post_to_forum.rb +7 -0
- data/db/migrate/20120107122921_add_missing_indexes.rb +12 -0
- data/db/migrate/20120107123654_add_default_on_forum_counters.rb +10 -0
- data/db/migrate/20120108114030_add_views_to_topics.rb +7 -0
- data/db/migrate/20120108131533_create_formol_topic_tracks.rb +13 -0
- data/db/migrate/20120109115141_create_formol_topic_subscriptions.rb +10 -0
- data/db/migrate/20120109220633_create_formol_user_preferences.rb +11 -0
- data/db/migrate/20120109223624_add_display_signature_to_posts.rb +7 -0
- data/db/migrate/20120109233054_add_display_signatures_and_avatars_to_user_preferences.rb +8 -0
- data/db/migrate/20120110152548_create_formol_polls.rb +14 -0
- data/db/migrate/20120110152618_create_formol_poll_options.rb +11 -0
- data/db/migrate/20120110152632_create_formol_poll_votes.rb +12 -0
- data/lib/formol/config.rb +12 -0
- data/lib/formol/controllers/auth.rb +9 -0
- data/lib/formol/controllers/nested/has_parent_category.rb +11 -0
- data/lib/formol/controllers/nested/has_parent_forum.rb +11 -0
- data/lib/formol/controllers/nested/has_parent_topic.rb +11 -0
- data/lib/formol/controllers.rb +5 -0
- data/lib/formol/engine.rb +18 -0
- data/lib/formol/formatters/redcarpet/formatter.rb +36 -0
- data/lib/formol/formatters/redcarpet/syntax_highlighter.rb +23 -0
- data/lib/formol/formatters.rb +2 -0
- data/lib/formol/generators/install/install_generator.rb +94 -0
- data/lib/formol/generators/install/templates/config/formol.yml +29 -0
- data/lib/formol/generators/install/templates/initializer/formol.rb.erb +21 -0
- data/lib/formol/generators/install/templates/lib/permissions/special_rights.rb +24 -0
- data/lib/formol/generators/install/templates/migrations/add_formol_profile_to_users.rb.erb +7 -0
- data/lib/formol/generators/install/templates/migrations/add_posts_count_to_user.rb.erb +7 -0
- data/lib/formol/generators.rb +1 -0
- data/lib/formol/integration/user.rb +76 -0
- data/lib/formol/integration.rb +1 -0
- data/lib/formol/permissions/controllers.rb +30 -0
- data/lib/formol/permissions/manager.rb +29 -0
- data/lib/formol/permissions/profile.rb +24 -0
- data/lib/formol/permissions/profiles.rb +44 -0
- data/lib/formol/permissions/user.rb +29 -0
- data/lib/formol/permissions.rb +5 -0
- data/lib/formol/rails/engine.rb +81 -0
- data/lib/formol/rails.rb +1 -0
- data/lib/formol/version.rb +10 -0
- data/lib/formol/view_helpers/assets_helper.rb +11 -0
- data/lib/formol/view_helpers/format_helper.rb +12 -0
- data/lib/formol/view_helpers.rb +2 -0
- data/lib/formol/will_paginate/list_link_renderer.rb +29 -0
- data/lib/formol/will_paginate.rb +1 -0
- data/lib/formol.rb +61 -0
- data/lib/formol_.rb +13 -0
- data/lib/tasks/formol_tasks.rake +0 -0
- metadata +348 -0
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
module Formol
|
|
2
|
+
module Integration
|
|
3
|
+
module User
|
|
4
|
+
extend ActiveSupport::Concern
|
|
5
|
+
|
|
6
|
+
included do
|
|
7
|
+
#Modules
|
|
8
|
+
include Formol::Permissions::User
|
|
9
|
+
|
|
10
|
+
#Associations
|
|
11
|
+
has_many :topics, :class_name => 'Formol::Topic'
|
|
12
|
+
has_many :posts, :class_name => 'Formol::Post'
|
|
13
|
+
has_many :subscriptions, :class_name => 'Formol::Topic::Subscription',
|
|
14
|
+
:foreign_key => 'subscriber_id',
|
|
15
|
+
:dependent => :destroy
|
|
16
|
+
has_many :subscribed_topics, :through => :subscriptions,
|
|
17
|
+
:source => :topic,
|
|
18
|
+
:class_name => 'Formol::Topic'
|
|
19
|
+
has_one :preference, :class_name => 'Formol::UserPreference'
|
|
20
|
+
|
|
21
|
+
#Aliasing
|
|
22
|
+
alias_method_chain :preference, :auto_allocate
|
|
23
|
+
|
|
24
|
+
#Privacy
|
|
25
|
+
private :subscribed_topic_ids
|
|
26
|
+
private :unread_forums
|
|
27
|
+
private :unread_topics
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
module InstanceMethods
|
|
31
|
+
# always return a preference object to avoid nil
|
|
32
|
+
# preference has all values defaulted for fallback behavior
|
|
33
|
+
def preference_with_auto_allocate
|
|
34
|
+
p = preference_without_auto_allocate
|
|
35
|
+
|
|
36
|
+
if p.nil?
|
|
37
|
+
p = build_preference
|
|
38
|
+
p.save
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
p
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def has_read_topic?(topic)
|
|
45
|
+
!unread_topics(topic.forum_id).include?(topic.id)
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def has_read_forum?(forum)
|
|
49
|
+
!unread_forums.include?(forum.id)
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def has_subscribed_to?(topic)
|
|
53
|
+
subscribed_topic_ids.include?(topic.id)
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
private
|
|
57
|
+
|
|
58
|
+
def subscribed_topic_ids
|
|
59
|
+
# we can load all subscribed topics instead of acting 'by forum'
|
|
60
|
+
# a user won't have 1 billion of subscriptions and we just collect ids
|
|
61
|
+
@subscribed_topic_ids ||= subscribed_topics.select('formol_topics.id').collect(&:id)
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def unread_forums
|
|
65
|
+
@read_forum_ids ||= Formol::Forum.unread(self).collect(&:id)
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def unread_topics(forum_id)
|
|
69
|
+
@unread_topic_ids ||= {}
|
|
70
|
+
|
|
71
|
+
@unread_topic_ids[forum_id] ||= Formol::Topic.unread(self, :forum_id => forum_id).collect(&:id)
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
end
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
require 'formol/integration/user'
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
module Formol
|
|
2
|
+
module Permissions
|
|
3
|
+
class NotAuthorizedError < Exception; end
|
|
4
|
+
|
|
5
|
+
module Controllers
|
|
6
|
+
extend ActiveSupport::Concern
|
|
7
|
+
|
|
8
|
+
included do
|
|
9
|
+
helper_method :formol_authorized?
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
module InstanceMethods
|
|
13
|
+
def formol_authorized?(user, rights, obj = nil)
|
|
14
|
+
user = Formol.config.user.new(:formol_profile => :default) if user.nil?
|
|
15
|
+
|
|
16
|
+
rights = [rights]
|
|
17
|
+
rights.flatten!
|
|
18
|
+
|
|
19
|
+
rights.any?{ |r| user.formol_allowed_to?(r, obj) }
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def formol_authorize!(user, rights, obj = nil)
|
|
23
|
+
unless formol_authorized?(user, rights, obj)
|
|
24
|
+
raise Formol::Permissions::NotAuthorizedError.new
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
module Formol
|
|
2
|
+
module Permissions
|
|
3
|
+
class Manager
|
|
4
|
+
attr_accessor :user
|
|
5
|
+
cattr_accessor :profiles
|
|
6
|
+
|
|
7
|
+
def initialize(user)
|
|
8
|
+
self.user = user
|
|
9
|
+
@profile_name = (user && user.persisted? ? user.formol_profile : :default).to_sym
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def able_to?(right, obj = nil)
|
|
13
|
+
return true if has_right?(:administrate)
|
|
14
|
+
|
|
15
|
+
respond_to?(m = :"able_to_#{right}?") ? send(m, obj) : has_right?(right)
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
protected
|
|
19
|
+
|
|
20
|
+
def profile
|
|
21
|
+
self.class.profiles[@profile_name]
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def has_right?(right)
|
|
25
|
+
profile.has_right?(right.to_sym)
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
module Formol
|
|
2
|
+
module Permissions
|
|
3
|
+
class Profile
|
|
4
|
+
attr_reader :rights
|
|
5
|
+
|
|
6
|
+
def initialize(name, rights = [])
|
|
7
|
+
@name = name.to_sym
|
|
8
|
+
@rights = rights.collect(&:to_sym)
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def has_right?(right)
|
|
12
|
+
@rights.include?(right.to_sym)
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def <<(right)
|
|
16
|
+
@rights << right.to_sym
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def delete(right)
|
|
20
|
+
@rights.delete(right.to_sym)
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
module Formol
|
|
2
|
+
module Permissions
|
|
3
|
+
class Profiles
|
|
4
|
+
def initialize
|
|
5
|
+
@profiles = {}
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def self.from_hash(hash)
|
|
9
|
+
p = Profiles.new
|
|
10
|
+
|
|
11
|
+
hash.each do |name, opts|
|
|
12
|
+
p.add_profile(name, opts)
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
p
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def add_right_to_profile(name, right)
|
|
19
|
+
@profiles[name.to_sym] << right.to_sym
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def delete_right_from_profile(name, right)
|
|
23
|
+
@profiles[name.to_sym].delete(right)
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def profiles
|
|
27
|
+
@profiles.keys
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def add_profile(name, opts = {})
|
|
31
|
+
r = []
|
|
32
|
+
|
|
33
|
+
r += self[opts[:extends]].rights if opts[:extends]
|
|
34
|
+
r += opts[:rights] if opts[:rights]
|
|
35
|
+
|
|
36
|
+
@profiles[name.to_sym] = Profile.new(name, r.uniq)
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def [](name)
|
|
40
|
+
@profiles[name.to_sym]
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
module Formol
|
|
2
|
+
module Permissions
|
|
3
|
+
module User
|
|
4
|
+
extend ActiveSupport::Concern
|
|
5
|
+
|
|
6
|
+
PROFILES = Proc.new{ Formol::Permissions::Manager.profiles.profiles }
|
|
7
|
+
|
|
8
|
+
included do
|
|
9
|
+
#Security
|
|
10
|
+
attr_accessible :formol_profile
|
|
11
|
+
|
|
12
|
+
#Default values
|
|
13
|
+
default_value_for :formol_profile, :registered
|
|
14
|
+
|
|
15
|
+
#Validations
|
|
16
|
+
validates :formol_profile, :presence => true,
|
|
17
|
+
:inclusion => { :in => PROFILES,
|
|
18
|
+
:allow_blank => true }
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
module InstanceMethods
|
|
22
|
+
def formol_allowed_to?(right, obj = nil)
|
|
23
|
+
@allower ||= Formol::Permissions::Manager.new(self)
|
|
24
|
+
@allower.able_to?(right, obj)
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
module Magic
|
|
2
|
+
module Rails
|
|
3
|
+
module Engine
|
|
4
|
+
##
|
|
5
|
+
# Automatically append all of the current engine's routes to the main
|
|
6
|
+
# application's route set. This needs to be done for ALL functional tests that
|
|
7
|
+
# use engine routes, since the mounted routes don't work during tests.
|
|
8
|
+
#
|
|
9
|
+
# @param [Symbol] engine_symbol Optional; if provided, uses this symbol to
|
|
10
|
+
# locate the engine class by name, otherwise uses the module of the calling
|
|
11
|
+
# test case as the presumed name of the engine.
|
|
12
|
+
#
|
|
13
|
+
# @author Jason Hamilton (jhamilton@greatherorift.com)
|
|
14
|
+
# @author Matthew Ratzloff (matt@urbaninfluence.com)
|
|
15
|
+
def load_engine_routes(engine_symbol = nil)
|
|
16
|
+
if engine_symbol
|
|
17
|
+
engine_name = engine_symbol.to_s.camelize
|
|
18
|
+
#else
|
|
19
|
+
# No engine provided, so presume the current engine is the one to load
|
|
20
|
+
#engine_name = self.class.name.split("::").first.split("(").last
|
|
21
|
+
end
|
|
22
|
+
engine = ("#{engine_name}::Engine").constantize
|
|
23
|
+
|
|
24
|
+
# Append the routes for this module to the existing routes
|
|
25
|
+
::Rails.application.routes.disable_clear_and_finalize = true
|
|
26
|
+
::Rails.application.routes.clear!
|
|
27
|
+
::Rails.application.routes_reloader.paths.each { |path| load(path) }
|
|
28
|
+
::Rails.application.routes.draw do
|
|
29
|
+
resourced_routes = []
|
|
30
|
+
|
|
31
|
+
named_routes = engine.routes.named_routes.routes
|
|
32
|
+
unnamed_routes = engine.routes.routes - named_routes.values
|
|
33
|
+
|
|
34
|
+
engine.routes.routes.each do |route|
|
|
35
|
+
# Call the method by hand based on the symbol
|
|
36
|
+
path = "/#{engine_name.underscore}#{route.path}"
|
|
37
|
+
verb = route.verb.to_s.downcase.to_sym
|
|
38
|
+
requirements = route.requirements
|
|
39
|
+
if path_helper = named_routes.key(route)
|
|
40
|
+
requirements[:as] = path_helper
|
|
41
|
+
elsif route.requirements[:controller].present?
|
|
42
|
+
# Presume that all controllers referenced in routes should also be
|
|
43
|
+
# resources and append that routing on the end so that *_path helpers
|
|
44
|
+
# will still work
|
|
45
|
+
resourced_routes << route.requirements[:controller].gsub("#{engine_name.downcase}/", "").to_sym
|
|
46
|
+
end
|
|
47
|
+
send(verb, path, requirements) if respond_to?(verb)
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def namespace!(sp_r, &block)
|
|
51
|
+
r = sp_r.shift
|
|
52
|
+
|
|
53
|
+
if sp_r.empty?
|
|
54
|
+
resources r.to_sym
|
|
55
|
+
else
|
|
56
|
+
namespace r.to_sym do
|
|
57
|
+
namespace!(sp_r)
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
# Add each route, once, to the end under a scope to trick path helpers.
|
|
63
|
+
# This will probably break as soon as there is route name overlap, but
|
|
64
|
+
# we'll cross that bridge when we get to it.
|
|
65
|
+
resourced_routes.uniq!
|
|
66
|
+
scope engine_name.downcase do
|
|
67
|
+
resourced_routes.each do |resource|
|
|
68
|
+
namespace!(resource.to_s.split('/'))
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
# Finalize the routes
|
|
74
|
+
::Rails.application.routes.finalize!
|
|
75
|
+
::Rails.application.routes.disable_clear_and_finalize = false
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
Rails::Engine.send(:include, Magic::Rails::Engine)
|
data/lib/formol/rails.rb
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
require 'formol/rails/engine'
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
require 'will_paginate/view_helpers/action_view'
|
|
2
|
+
|
|
3
|
+
module Formol
|
|
4
|
+
module WillPaginate
|
|
5
|
+
class ListLinkRenderer < ::WillPaginate::ActionView::LinkRenderer
|
|
6
|
+
protected
|
|
7
|
+
|
|
8
|
+
def page_number(page)
|
|
9
|
+
unless page == current_page
|
|
10
|
+
tag(:li, link(page, page, :rel => rel_value(page)))
|
|
11
|
+
else
|
|
12
|
+
tag(:li, page, :class => "current")
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def previous_or_next_page(page, text, classname)
|
|
17
|
+
if page
|
|
18
|
+
tag(:li, link(text, page), :class => classname)
|
|
19
|
+
else
|
|
20
|
+
tag(:li, text, :class => classname + ' disabled')
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def html_container(html)
|
|
25
|
+
tag(:ul, html, container_attributes)
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
require 'formol/will_paginate/list_link_renderer'
|
data/lib/formol.rb
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
#gems
|
|
2
|
+
require 'formol_'
|
|
3
|
+
|
|
4
|
+
module Formol
|
|
5
|
+
mattr_reader :config
|
|
6
|
+
|
|
7
|
+
class << self
|
|
8
|
+
def configure(&block)
|
|
9
|
+
@@config = Config.new
|
|
10
|
+
|
|
11
|
+
class_eval &block
|
|
12
|
+
|
|
13
|
+
load_config_from_file
|
|
14
|
+
set_formatter
|
|
15
|
+
|
|
16
|
+
load_formol_libs
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
private
|
|
20
|
+
|
|
21
|
+
# load formol libs located inside main app
|
|
22
|
+
def load_formol_libs
|
|
23
|
+
Dir[Rails.root.join('lib', 'formol', '**', '*.rb')].each do |f|
|
|
24
|
+
require f
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
Formol::Permissions::Manager.send(:include, Formol::Permissions::SpecialRights)
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
# set formatter
|
|
31
|
+
def set_formatter
|
|
32
|
+
config.formatter = Formol::Formatters::Redcarpet::Formatter
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
# load config.yml located inside main app
|
|
36
|
+
def load_config_from_file
|
|
37
|
+
file_path = Rails.root.join('config/formol.yml')
|
|
38
|
+
|
|
39
|
+
return unless File.exists?(file_path)
|
|
40
|
+
|
|
41
|
+
h = HashWithIndifferentAccess.new(YAML::load(File.open(file_path)))
|
|
42
|
+
|
|
43
|
+
return unless h[:formol]
|
|
44
|
+
|
|
45
|
+
h = h[:formol]
|
|
46
|
+
|
|
47
|
+
if h[:profiles]
|
|
48
|
+
profiles = Formol::Permissions::Profiles.from_hash(h[:profiles])
|
|
49
|
+
Formol::Permissions::Manager.profiles = profiles
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
require 'formol/engine'
|
|
56
|
+
|
|
57
|
+
ActionController::Base.send(:include, Formol::Controllers::Auth)
|
|
58
|
+
ActionController::Base.send(:include, Formol::Permissions::Controllers)
|
|
59
|
+
|
|
60
|
+
ActionView::Base.send(:include, Formol::ViewHelpers::FormatHelper)
|
|
61
|
+
ActionView::Base.send(:include, Formol::ViewHelpers::AssetsHelper)
|
data/lib/formol_.rb
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
#gems (needed when packaged as a gem)
|
|
2
|
+
require 'formtastic'
|
|
3
|
+
require 'attribute_normalizer'
|
|
4
|
+
require 'will_paginate'
|
|
5
|
+
require 'ranked-model'
|
|
6
|
+
require 'default_value_for'
|
|
7
|
+
require 'pygments.rb'
|
|
8
|
+
require 'redcarpet'
|
|
9
|
+
|
|
10
|
+
#libs
|
|
11
|
+
%w(config controllers formatters generators integration permissions rails view_helpers will_paginate).each do |lib|
|
|
12
|
+
require "formol/#{lib}"
|
|
13
|
+
end
|
|
File without changes
|