pageflow 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of pageflow might be problematic. Click here for more details.

Files changed (183) hide show
  1. checksums.yaml +8 -8
  2. data/admins/pageflow/accounts.rb +17 -49
  3. data/admins/pageflow/entry.rb +13 -6
  4. data/app/assets/fonts/pageflow/entypo.eot +0 -0
  5. data/app/assets/fonts/pageflow/entypo.svg +834 -0
  6. data/app/assets/fonts/pageflow/entypo.ttf +0 -0
  7. data/app/assets/fonts/pageflow/entypo.woff +0 -0
  8. data/app/assets/fonts/pageflow/fontawesome-webfont.eot +0 -0
  9. data/app/assets/fonts/pageflow/fontawesome-webfont.otf +0 -0
  10. data/app/assets/fonts/pageflow/fontawesome-webfont.svg +504 -0
  11. data/app/assets/fonts/pageflow/fontawesome-webfont.ttf +0 -0
  12. data/app/assets/fonts/pageflow/fontawesome-webfont.woff +0 -0
  13. data/app/assets/images/pageflow/themes/default/audio_sprite.png +0 -0
  14. data/app/assets/images/pageflow/themes/default/image_sprite.png +0 -0
  15. data/app/assets/images/pageflow/themes/default/internal_links_sprite.png +0 -0
  16. data/app/assets/images/pageflow/themes/default/loading_spinner.png +0 -0
  17. data/app/assets/images/pageflow/themes/default/loading_spinner_bg.png +0 -0
  18. data/app/assets/images/pageflow/themes/default/logo_header.png +0 -0
  19. data/app/assets/images/pageflow/themes/default/logo_header_invert.png +0 -0
  20. data/app/assets/images/pageflow/themes/default/scroll_indicator_sprite.png +0 -0
  21. data/app/assets/images/pageflow/themes/default/text_sprite.png +0 -0
  22. data/app/assets/images/pageflow/themes/default/video_sprite.png +0 -0
  23. data/app/assets/javascripts/pageflow/editor/base.js +1 -0
  24. data/app/assets/javascripts/pageflow/editor/collections/mixins/files_collection.js +11 -0
  25. data/app/assets/javascripts/pageflow/editor/collections/subset_collection.js +11 -0
  26. data/app/assets/javascripts/pageflow/editor/controllers/sidebar_controller.js +8 -1
  27. data/app/assets/javascripts/pageflow/editor/initializers/setup_config.js +3 -0
  28. data/app/assets/javascripts/pageflow/editor/models/audio_file.js +1 -0
  29. data/app/assets/javascripts/pageflow/editor/models/chapter.js +1 -0
  30. data/app/assets/javascripts/pageflow/editor/models/configuration.js +1 -0
  31. data/app/assets/javascripts/pageflow/editor/models/encoding_confirmation.js +45 -0
  32. data/app/assets/javascripts/pageflow/editor/models/entry.js +6 -14
  33. data/app/assets/javascripts/pageflow/editor/models/entry_publication.js +40 -0
  34. data/app/assets/javascripts/pageflow/editor/models/file_stage.js +5 -0
  35. data/app/assets/javascripts/pageflow/editor/models/image_file.js +5 -0
  36. data/app/assets/javascripts/pageflow/editor/models/mixins/encoded_file.js +31 -14
  37. data/app/assets/javascripts/pageflow/editor/models/mixins/files_count_watcher.js +4 -0
  38. data/app/assets/javascripts/pageflow/editor/models/mixins/stage_provider.js +2 -2
  39. data/app/assets/javascripts/pageflow/editor/models/other_entry.js +1 -0
  40. data/app/assets/javascripts/pageflow/editor/models/page.js +1 -0
  41. data/app/assets/javascripts/pageflow/editor/models/video_file.js +1 -0
  42. data/app/assets/javascripts/pageflow/editor/routers/sidebar_router.js +2 -0
  43. data/app/assets/javascripts/pageflow/editor/templates/confirm_encoding.jst.ejs +15 -0
  44. data/app/assets/javascripts/pageflow/editor/templates/confirmable_file_item.jst.ejs +7 -0
  45. data/app/assets/javascripts/pageflow/editor/templates/{quota_decorator.jst.ejs → entry_publication_quota_decorator.jst.ejs} +1 -1
  46. data/app/assets/javascripts/pageflow/editor/templates/files_explorer.jst.ejs +5 -3
  47. data/app/assets/javascripts/pageflow/editor/templates/notifications.jst.ejs +6 -1
  48. data/app/assets/javascripts/pageflow/editor/views/confirm_encoding_view.js +76 -0
  49. data/app/assets/javascripts/pageflow/editor/views/confirmable_file_item_view.js +42 -0
  50. data/app/assets/javascripts/pageflow/editor/views/entry_publication_quota_decorator_view.js +49 -0
  51. data/app/assets/javascripts/pageflow/editor/views/file_meta_data_item_view.js +1 -1
  52. data/app/assets/javascripts/pageflow/editor/views/file_stage_item_view.js +1 -0
  53. data/app/assets/javascripts/pageflow/editor/views/file_thumbnail_view.js +2 -1
  54. data/app/assets/javascripts/pageflow/editor/views/files_explorer_view.js +3 -3
  55. data/app/assets/javascripts/pageflow/editor/views/input_view.js +2 -2
  56. data/app/assets/javascripts/pageflow/editor/views/inputs/select_input_view.js +1 -1
  57. data/app/assets/javascripts/pageflow/editor/views/notifications_view.js +12 -1
  58. data/app/assets/javascripts/pageflow/editor/views/publish_entry_view.js +5 -4
  59. data/app/assets/javascripts/pageflow/page_types/video.js +0 -1
  60. data/app/assets/javascripts/pageflow/widgets/player_controls.js +1 -1
  61. data/app/assets/stylesheets/pageflow/editor/base.css.scss +1 -0
  62. data/app/assets/stylesheets/pageflow/editor/confirmable_files.css.scss +67 -0
  63. data/app/assets/stylesheets/pageflow/editor/file_stages.css.scss +5 -0
  64. data/app/assets/stylesheets/pageflow/editor/file_thumbnails.css.scss +10 -0
  65. data/app/assets/stylesheets/pageflow/editor/files.css.scss +3 -1
  66. data/app/assets/stylesheets/pageflow/editor/files_explorer.css.scss +30 -2
  67. data/app/assets/stylesheets/pageflow/editor/files_gallery.css.scss +1 -2
  68. data/app/assets/stylesheets/pageflow/editor/notifications.css.scss +18 -1
  69. data/app/assets/stylesheets/pageflow/editor/quotas.css.scss +1 -1
  70. data/app/assets/stylesheets/pageflow/editor/tabs_view.css.scss +2 -0
  71. data/app/assets/stylesheets/pageflow/mixins.css.scss +2 -1
  72. data/app/assets/stylesheets/pageflow/mixins/icons.css.scss +4 -308
  73. data/app/assets/stylesheets/pageflow/mixins/icons/entypo.css.scss +295 -0
  74. data/app/assets/stylesheets/pageflow/mixins/icons/fontawesome.css.scss +520 -0
  75. data/app/assets/stylesheets/pageflow/mixins/label.css.scss +5 -0
  76. data/app/assets/stylesheets/pageflow/themes/default.css.scss +11 -0
  77. data/app/assets/stylesheets/pageflow/themes/default/anchors.css.scss +3 -8
  78. data/app/assets/stylesheets/pageflow/themes/default/loading_spinner.css.scss +96 -9
  79. data/app/assets/stylesheets/pageflow/themes/default/navigation.css.scss +128 -183
  80. data/app/assets/stylesheets/pageflow/themes/default/overview.css.scss +48 -6
  81. data/app/assets/stylesheets/pageflow/themes/default/page.css.scss +3 -6
  82. data/app/assets/stylesheets/pageflow/themes/default/player_controls.css.scss +31 -0
  83. data/app/controllers/concerns/pageflow/quota_verification.rb +4 -4
  84. data/app/controllers/pageflow/editor/encoding_confirmations_controller.rb +45 -0
  85. data/app/controllers/pageflow/editor/entry_publications_controller.rb +48 -0
  86. data/app/controllers/pageflow/entries_controller.rb +8 -3
  87. data/app/controllers/pageflow/revisions_controller.rb +0 -10
  88. data/app/controllers/pageflow/video_files_controller.rb +7 -1
  89. data/app/helpers/pageflow/config_helper.rb +9 -0
  90. data/app/helpers/pageflow/entries_helper.rb +3 -3
  91. data/app/helpers/pageflow/pages_helper.rb +2 -2
  92. data/app/helpers/pageflow/quota_helper.rb +1 -1
  93. data/app/jobs/pageflow/poll_meta_data_from_zencoder_job.rb +9 -0
  94. data/app/jobs/pageflow/poll_zencoder_job.rb +3 -3
  95. data/app/jobs/pageflow/request_meta_data_from_zencoder_job.rb +14 -0
  96. data/app/jobs/pageflow/submit_file_to_zencoder_job.rb +0 -2
  97. data/app/models/pageflow/account.rb +9 -4
  98. data/app/models/pageflow/audio_file.rb +2 -0
  99. data/app/models/pageflow/draft_entry.rb +5 -1
  100. data/app/models/pageflow/edit_lock.rb +2 -0
  101. data/app/models/pageflow/encoding_confirmation.rb +40 -0
  102. data/app/models/pageflow/entry.rb +3 -3
  103. data/app/models/pageflow/entry_publication.rb +27 -0
  104. data/app/models/pageflow/page.rb +6 -6
  105. data/app/models/pageflow/published_entry.rb +3 -3
  106. data/app/models/pageflow/theming.rb +20 -0
  107. data/app/models/pageflow/video_file.rb +2 -0
  108. data/app/state_machines/pageflow/encoded_file_state_machine.rb +41 -1
  109. data/app/views/admin/accounts/_account_details.html.arb +5 -0
  110. data/app/views/admin/accounts/_entries_panel.html.arb +15 -0
  111. data/app/views/admin/accounts/_form.html.erb +18 -0
  112. data/app/views/admin/accounts/_theming_details.html.arb +6 -0
  113. data/app/views/admin/accounts/_users_panel.html.arb +15 -0
  114. data/app/views/admin/entries/_links.html.arb +3 -2
  115. data/app/views/admin/users/_form.html.erb +2 -2
  116. data/app/views/admin/users/_quota_exhausted.html.erb +1 -0
  117. data/app/views/pageflow/config/_editor_seeds.json.jbuilder +2 -0
  118. data/app/views/pageflow/editor/encoding_confirmations/_summary.html.erb +1 -0
  119. data/app/views/pageflow/editor/encoding_confirmations/check.json.jbuilder +3 -0
  120. data/app/views/pageflow/editor/entry_publications/check.json.jbuilder +11 -0
  121. data/app/views/pageflow/editor/quotas/{_published_entries_exceeded.html.erb → _published_entries_exhausted.html.erb} +1 -1
  122. data/app/views/pageflow/entries/_entry.html.erb +1 -1
  123. data/app/views/pageflow/entries/_navigation.html.erb +2 -2
  124. data/app/views/pageflow/entries/_social_meta_tags.html.erb +2 -2
  125. data/app/views/pageflow/entries/_theming.css.erb +1 -0
  126. data/app/views/pageflow/entries/edit.html.erb +3 -1
  127. data/app/views/pageflow/entries/navigation/_bar_top.html.erb +2 -2
  128. data/app/views/pageflow/entries/show.css.erb +3 -1
  129. data/app/views/pageflow/entries/show.html.erb +13 -13
  130. data/config/initializers/page_type_helpers.rb +1 -0
  131. data/config/locales/activerecord.de.yml +41 -22
  132. data/config/locales/admin/accounts.yml +0 -1
  133. data/config/locales/admin/entries.yml +6 -2
  134. data/config/locales/admin/themings.yml +7 -0
  135. data/config/locales/admin/users/me.de.yml +2 -2
  136. data/config/locales/editor.de.yml +9 -3
  137. data/config/locales/quotas.de.yml +1 -1
  138. data/config/routes.rb +34 -27
  139. data/db/migrate/20140624135420_create_themings.rb +15 -0
  140. data/db/migrate/20140624135421_create_themings_for_existing_accounts.rb +26 -0
  141. data/db/migrate/20140624135422_change_theme_references_to_theming_references.rb +45 -0
  142. data/db/migrate/20140624135423_remove_attributes_from_themes.rb +10 -0
  143. data/db/migrate/20140624135424_create_accounts_themes_join_table.rb +8 -0
  144. data/db/migrate/20140624135425_move_cname_from_account_to_theming.rb +21 -0
  145. data/db/migrate/20140625184800_drop_themes.rb +14 -0
  146. data/db/migrate/20140704110631_add_confirmed_by_to_encoded_files.rb +6 -0
  147. data/lib/generators/pageflow/initializer/templates/pageflow.rb +9 -0
  148. data/lib/generators/pageflow/theme/theme_generator.rb +28 -0
  149. data/lib/pageflow.rb +9 -2
  150. data/lib/pageflow/ability_mixin.rb +1 -1
  151. data/lib/pageflow/built_in_page_type.rb +1 -1
  152. data/lib/pageflow/configuration.rb +49 -6
  153. data/lib/pageflow/engine.rb +11 -1
  154. data/lib/pageflow/quota.rb +42 -15
  155. data/lib/pageflow/quotas.rb +15 -0
  156. data/lib/pageflow/seeds.rb +12 -16
  157. data/lib/pageflow/theme.rb +14 -0
  158. data/lib/pageflow/themes.rb +25 -0
  159. data/lib/pageflow/user_mixin.rb +1 -1
  160. data/lib/pageflow/version.rb +1 -1
  161. data/lib/pageflow/zencoder_meta_data_output_definition.rb +23 -0
  162. data/spec/factories/accounts.rb +9 -0
  163. data/spec/factories/audio_files.rb +46 -0
  164. data/spec/factories/chapters.rb +21 -0
  165. data/spec/factories/edit_locks.rb +11 -0
  166. data/spec/factories/entries.rb +33 -0
  167. data/spec/factories/file_usages.rb +8 -0
  168. data/spec/factories/folders.rb +8 -0
  169. data/spec/factories/image_files.rb +38 -0
  170. data/spec/factories/invited_user.rb +10 -0
  171. data/spec/factories/memberships.rb +8 -0
  172. data/spec/factories/pages.rb +14 -0
  173. data/spec/factories/revisions.rb +22 -0
  174. data/spec/factories/themings.rb +8 -0
  175. data/spec/factories/users.rb +39 -0
  176. data/spec/factories/video_files.rb +46 -0
  177. metadata +103 -39
  178. data/app/assets/javascripts/pageflow/editor/models/quota.js +0 -18
  179. data/app/assets/javascripts/pageflow/editor/views/quota_decorator_view.js +0 -45
  180. data/app/controllers/pageflow/editor/quotas_controller.rb +0 -13
  181. data/app/models/pageflow/theme.rb +0 -4
  182. data/app/views/admin/users/_quota_exceeded.html.erb +0 -1
  183. data/app/views/pageflow/editor/quotas/show.json.jbuilder +0 -5
@@ -0,0 +1,10 @@
1
+ class RemoveAttributesFromThemes < ActiveRecord::Migration
2
+ def change
3
+ remove_column :pageflow_themes, :copyright_link_url, :string
4
+ remove_column :pageflow_themes, :copyright_link_label, :string
5
+ remove_column :pageflow_themes, :imprint_link_url, :string
6
+ remove_column :pageflow_themes, :imprint_link_label, :string
7
+
8
+ rename_column :pageflow_themes, :name, :css_dir
9
+ end
10
+ end
@@ -0,0 +1,8 @@
1
+ class CreateAccountsThemesJoinTable < ActiveRecord::Migration
2
+ def change
3
+ create_table :pageflow_accounts_themes, id: false do |t|
4
+ t.belongs_to :account
5
+ t.belongs_to :theme
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,21 @@
1
+ class MoveCnameFromAccountToTheming < ActiveRecord::Migration
2
+ def up
3
+ add_column :pageflow_themings, :cname, :string, null: false, default: ''
4
+ add_index :pageflow_themings, :cname
5
+
6
+ execute("UPDATE pageflow_themings SET cname = (SELECT cname FROM pageflow_accounts WHERE pageflow_accounts.default_theming_id = pageflow_themings.id LIMIT 1);")
7
+
8
+ remove_index :pageflow_accounts, :cname
9
+ remove_column :pageflow_accounts, :cname
10
+ end
11
+
12
+ def down
13
+ add_column :pageflow_accounts, :cname, :string, null: false, default: ''
14
+ add_index :pageflow_accounts, :cname
15
+
16
+ execute("UPDATE pageflow_accounts SET cname = (SELECT cname FROM pageflow_themings WHERE pageflow_themings.id = pageflow_accounts.default_theming_id);")
17
+
18
+ remove_index :pageflow_themings, :cname
19
+ remove_column :pageflow_themings, :cname
20
+ end
21
+ end
@@ -0,0 +1,14 @@
1
+ class DropThemes < ActiveRecord::Migration
2
+ def up
3
+ rename_column :pageflow_accounts_themes, :theme_id, :theme_name
4
+ add_column :pageflow_themings, :theme_name, :string
5
+
6
+ execute(<<-SQL)
7
+ UPDATE pageflow_themings SET theme_name =
8
+ (SELECT css_dir FROM pageflow_themes WHERE pageflow_themes.id = pageflow_themings.theme_id);
9
+ SQL
10
+
11
+ remove_reference :pageflow_themings, :theme
12
+ drop_table :pageflow_themes
13
+ end
14
+ end
@@ -0,0 +1,6 @@
1
+ class AddConfirmedByToEncodedFiles < ActiveRecord::Migration
2
+ def change
3
+ add_reference :pageflow_video_files, :confirmed_by
4
+ add_reference :pageflow_audio_files, :confirmed_by
5
+ end
6
+ end
@@ -15,6 +15,15 @@ Pageflow.configure do |config|
15
15
  config.register_page_type(Pageflow::BuiltInPageType.internal_links)
16
16
  # config.register_page_type(Pageflow::Rainbow::PageType.new)
17
17
 
18
+ # Add custom themes by invoking the pageflow:theme generator and
19
+ # registering the theme here.
20
+ #
21
+ # $ rails generate pageflow:theme my_custom_theme
22
+ # => creates app/assets/stylesheets/pageflow/themes/my_custom_theme.css.scss
23
+ #
24
+ config.themes.register(:default)
25
+ # config.themes.register(:my_custom_theme)
26
+
18
27
  # String to interpolate into paths of files generated by paperclip
19
28
  # preprocessors. This allows to refresh cdn caches after
20
29
  # reprocessing attachments.
@@ -0,0 +1,28 @@
1
+ module Pageflow
2
+ module Generators
3
+ class ThemeGenerator < Rails::Generators::Base
4
+ desc 'Copies a theme template to the app.'
5
+
6
+ argument :name, required: false, default: 'custom',
7
+ desc: 'The scope to copy views to'
8
+
9
+ source_root File.expand_path("../../../../../app/assets", __FILE__)
10
+
11
+ def copy_template
12
+ directory('stylesheets/pageflow/themes/default', themes_path('stylesheets', name))
13
+ directory('images/pageflow/themes/default', themes_path('images', name))
14
+
15
+ template('stylesheets/pageflow/themes/default.css.scss', themes_path('stylesheets', "#{name}.css.scss")) do |content|
16
+ content.gsub!('$theme-name: "default";', %Q'$theme-name: "#{name}";')
17
+ content.gsub!('@import "./default/', %Q'@import "./#{name}/')
18
+ end
19
+ end
20
+
21
+ private
22
+
23
+ def themes_path(type, path)
24
+ File.join('app', 'assets', type, 'pageflow', 'themes', path)
25
+ end
26
+ end
27
+ end
28
+ end
@@ -1,8 +1,14 @@
1
1
  require "pageflow/engine"
2
2
 
3
3
  module Pageflow
4
- def self.config
5
- raise('Pageflow has not been configured yet') unless @config
4
+ def self.config(options = {})
5
+ unless @config
6
+ if options[:ignore_not_configured]
7
+ return Configuration.new
8
+ else
9
+ raise('Pageflow has not been configured yet')
10
+ end
11
+ end
6
12
  @config
7
13
  end
8
14
 
@@ -28,6 +34,7 @@ module Pageflow
28
34
 
29
35
  def self.finalize!
30
36
  @finalized = true
37
+ configure!
31
38
  end
32
39
 
33
40
  def self.after_configure(&block)
@@ -9,7 +9,7 @@ module Pageflow
9
9
 
10
10
  can [:read, :use_files], Entry, :id => user.entry_ids
11
11
 
12
- can [:edit, :update, :edit_outline, :publish, :restore, :snapshot], Entry do |entry|
12
+ can [:edit, :update, :edit_outline, :publish, :restore, :snapshot, :confirm_encoding], Entry do |entry|
13
13
  can_edit_entry?(user, entry)
14
14
  end
15
15
 
@@ -12,7 +12,7 @@ module Pageflow
12
12
  end
13
13
 
14
14
  def translation_key
15
- "activerecord.values.page.template.#{name}"
15
+ "activerecord.values.pageflow/page.template.#{name}"
16
16
  end
17
17
 
18
18
  # Factory methods to decouple Pageflow initializers from concrete
@@ -43,8 +43,50 @@ module Pageflow
43
43
  attr_reader :hooks
44
44
 
45
45
  # Limit the use of certain resources. Any object implementing the
46
- # interface of Pageflow::Quota is allowed.
47
- attr_accessor :quota
46
+ # interface of Pageflow::Quota can be registered.
47
+ #
48
+ # Example:
49
+ #
50
+ # config.quotas.register(:users, UserQuota)
51
+ #
52
+ attr_accessor :quotas
53
+
54
+ # Additional themes can be registered to use custom css.
55
+ #
56
+ # Example:
57
+ #
58
+ # config.themes.register(:custom)
59
+ #
60
+ # @return [Themes]
61
+ attr_reader :themes
62
+
63
+ # Either a lambda or an object with a `match?` method, to restrict
64
+ # access to the editor routes defined by Pageflow.
65
+ #
66
+ # This can be used if published entries shall be available under
67
+ # different CNAMES but the admin and the editor shall only be
68
+ # accessible via one official url.
69
+ attr_accessor :editor_routing_constraint
70
+
71
+ # Either a lambda or an object with a `call` method taking two
72
+ # parameters: An `ActiveRecord` scope of `Pageflow::Entry` records
73
+ # and an `ActionDispatch::Request` object. Has to return the scope
74
+ # in which to find entries.
75
+ #
76
+ # Used by all public actions that display entires to restrict the
77
+ # available entries by hostname or other request attributes.
78
+ #
79
+ # Example:
80
+ #
81
+ # # Only make entries of one account available under <account.name>.example.com
82
+ # config.public_entry_request_scope = lambda do |entries, request|
83
+ # entries.includes(:account).where(pageflow_accounts: {name: request.subdomain})
84
+ # end
85
+ attr_accessor :public_entry_request_scope
86
+
87
+ # Submit video/audio encoding jobs only after the user has
88
+ # explicitly confirmed in the editor. Defaults to false.
89
+ attr_accessor :confirm_encoding_jobs
48
90
 
49
91
  def initialize
50
92
  @paperclip_filesystem_default_options = {}
@@ -55,11 +97,12 @@ module Pageflow
55
97
  @mailer_sender = 'pageflow@example.com'
56
98
 
57
99
  @hooks = Hooks.new
58
- @quota = Quota::Unlimited.new
59
- end
100
+ @quotas = Quotas.new
101
+ @themes = Themes.new
102
+
103
+ @public_entry_request_scope = lambda { |entries, request| entries }
60
104
 
61
- def on(*args)
62
- hooks.on(*args)
105
+ @confirm_encoding_jobs = false
63
106
  end
64
107
 
65
108
  # Make a page type available for use in the system.
@@ -51,15 +51,25 @@ module Pageflow
51
51
  # provided by the main app.
52
52
  config.assets.precompile += %w(pageflow/editor.js pageflow/editor.css
53
53
  pageflow/print_view.css
54
- pageflow/themes/default.css
55
54
  pageflow/lt_ie9.js pageflow/lt_ie9.css pageflow/ie9.js pageflow/ie9.css
56
55
  video-js.swf vjs.eot vjs.svg vjs.ttf vjs.woff)
57
56
 
57
+ config.assets.precompile << lambda do |path|
58
+ Pageflow.config.themes.any? do |theme|
59
+ path == theme.stylesheet_path
60
+ end
61
+ end
62
+
58
63
  # Make sure the configuration is recreated when classes are
59
64
  # reloded. Otherwise registered page types might still point to
60
65
  # unloaded classes in development mode.
61
66
  config.to_prepare do
62
67
  Pageflow.configure!
63
68
  end
69
+
70
+ # Make pageflow factories available to main app specs
71
+ initializer "pageflow.factories", :after => "factory_girl.set_factory_paths" do
72
+ FactoryGirl.definition_file_paths.unshift(Engine.root.join('spec', 'factories')) if defined?(FactoryGirl)
73
+ end
64
74
  end
65
75
  end
@@ -1,33 +1,60 @@
1
1
  module Pageflow
2
- module Quota
3
- class ExceededError < RuntimeError
4
- attr_reader :quota_name
2
+ class Quota
3
+ class ExhaustedError < RuntimeError
4
+ attr_reader :quota
5
5
 
6
- def initialize(quota_name)
7
- @quota_name = quota_name
6
+ def initialize(quota)
7
+ @quota = quota
8
8
  end
9
9
  end
10
10
 
11
- def exceeded?(name, account)
12
- raise(NotImplementedError, 'Quota#exceeded? must be implemented.')
11
+ class ExceededError < ExhaustedError; end
12
+
13
+ attr_reader :name, :account
14
+
15
+ def initialize(name, account)
16
+ @name = name
17
+ @account = account
18
+ end
19
+
20
+ def state
21
+ raise(NotImplementedError, 'Quota#state must be implemented and return either "available", "exhausted" or "exceeded".')
13
22
  end
14
23
 
15
- def state_description(name, account)
24
+ def state_description
16
25
  raise(NotImplementedError, 'Quota#state_description must be implemented.')
17
26
  end
18
27
 
19
- def verify!(name, account)
20
- raise(ExceededError.new(name), "Quota #{name} exceeded.") if exceeded?(name, account)
28
+ def available?
29
+ state == 'available'
21
30
  end
22
31
 
23
- class Unlimited
24
- include Quota
32
+ def exhausted?
33
+ !available?
34
+ end
35
+
36
+ def exceeded?
37
+ state == 'exceeded'
38
+ end
39
+
40
+ def verify_available!
41
+ raise(ExhaustedError.new(self), "Quota '#{name}' exhausted.") unless available?
42
+ end
43
+
44
+ def verify_not_exceeded!
45
+ raise(ExceededError.new(self), "Quota '#{name}' exceeded.") if exceeded?
46
+ end
47
+
48
+ def assume(assumptions)
49
+ self
50
+ end
25
51
 
26
- def exceeded?(name, account)
27
- false
52
+ class Unlimited < Quota
53
+ def state
54
+ 'available'
28
55
  end
29
56
 
30
- def state_description(name, account)
57
+ def state_description
31
58
  nil
32
59
  end
33
60
  end
@@ -0,0 +1,15 @@
1
+ module Pageflow
2
+ class Quotas
3
+ def initialize
4
+ @factories = HashWithIndifferentAccess.new
5
+ end
6
+
7
+ def register(name, factory)
8
+ @factories[name] = factory
9
+ end
10
+
11
+ def get(name, account)
12
+ @factories.fetch(name, Quota::Unlimited).new(name, account)
13
+ end
14
+ end
15
+ end
@@ -3,25 +3,21 @@
3
3
  module Pageflow
4
4
  # Default Account
5
5
 
6
- if Theme.any?
7
- default_theme = Theme.first
8
- puts " Theme exists."
9
- else
10
- default_theme = Theme.create!(:name => 'default',
11
- :imprint_link_label => 'Impressum',
12
- :imprint_link_url => 'http://example.com/impressum.html',
13
- :copyright_link_label => '&copy; Pageflow 2014',
14
- :copyright_link_url => 'http://www.example.com/copyright.html')
15
- puts " Created theme."
16
- end
17
-
18
- # Default Account
19
-
20
6
  if Account.any?
21
7
  default_account = Account.first
22
8
  puts " Account exists."
23
9
  else
24
- default_account = Account.create!(:name => 'Pageflow', :default_theme_id => default_theme.id)
10
+ default_account = Account.create!(:name => 'Pageflow') do |account|
11
+ account.build_default_theming do |theming|
12
+ theming.theme_name = Pageflow.config.themes.names.first
13
+
14
+ theming.imprint_link_label = 'Impressum'
15
+ theming.imprint_link_url = 'http://example.com/impressum.html'
16
+ theming.copyright_link_label = '&copy; Pageflow 2014'
17
+ theming.copyright_link_url = 'http://www.example.com/copyright.html'
18
+ end
19
+ end
20
+
25
21
  puts " Created default account."
26
22
  end
27
23
 
@@ -64,7 +60,7 @@ module Pageflow
64
60
  # Sample entry
65
61
 
66
62
  unless Entry.any?
67
- entry = default_account.entries.create!(:title => 'Fiese Flut', :theme_id => default_theme.id)
63
+ entry = default_account.entries.create!(:title => 'Fiese Flut', :theming_id => default_account.default_theming.id)
68
64
 
69
65
  chapter = entry.draft.chapters.create!(:title => 'Kapitel 1')
70
66
  chapter.pages.create!(:template => 'background_image')
@@ -0,0 +1,14 @@
1
+ module Pageflow
2
+ class Theme
3
+ attr_reader :name, :directory_name
4
+
5
+ def initialize(name)
6
+ @name = name.to_s
7
+ @directory_name = name.to_s
8
+ end
9
+
10
+ def stylesheet_path
11
+ "pageflow/themes/#{name}.css"
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,25 @@
1
+ module Pageflow
2
+ class Themes
3
+ include Enumerable
4
+
5
+ def initialize
6
+ @themes = HashWithIndifferentAccess.new
7
+ end
8
+
9
+ def register(name)
10
+ @themes[name] = Theme.new(name)
11
+ end
12
+
13
+ def get(name)
14
+ @themes.fetch(name) { raise(ArgumentError, "Unknown theme '#{name}'.") }
15
+ end
16
+
17
+ def names
18
+ map(&:name)
19
+ end
20
+
21
+ def each(&block)
22
+ @themes.values.each(&block)
23
+ end
24
+ end
25
+ end
@@ -14,7 +14,7 @@ module Pageflow
14
14
  has_many :memberships, :dependent => :destroy, :class_name => 'Pageflow::Membership'
15
15
  has_many :entries, :through => :memberships, :class_name => 'Pageflow::Entry'
16
16
 
17
- has_many :revisions, :class_name => 'Pageflow::Revision'
17
+ has_many :revisions, :class_name => 'Pageflow::Revision', :foreign_key => :creator_id
18
18
 
19
19
  validates :first_name, :last_name, :presence => true
20
20
  validates :role, :inclusion => ROLES