formol 0.0.4
Sign up to get free protection for your applications and to get access to all the features.
- 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
|