alchemy_cms 3.3.3 → 3.4.0.rc1
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.
- checksums.yaml +4 -4
- data/.travis.yml +1 -1
- data/CHANGELOG.md +42 -4
- data/README.md +7 -3
- data/alchemy_cms.gemspec +1 -0
- data/app/assets/javascripts/alchemy/{alchemy.js → admin.js} +1 -2
- data/app/assets/javascripts/alchemy/alchemy.datepicker.js.coffee +28 -25
- data/app/assets/javascripts/alchemy/alchemy.dialog.js.coffee +1 -0
- data/app/assets/javascripts/alchemy/alchemy.i18n.js.coffee +7 -1
- data/app/assets/javascripts/alchemy/alchemy.link_dialog.js.coffee +1 -1
- data/app/assets/javascripts/alchemy/alchemy.sitemap.js.coffee +26 -0
- data/app/assets/javascripts/alchemy/alchemy.translations.js.coffee +56 -1
- data/app/assets/stylesheets/alchemy/_variables.scss +1 -0
- data/app/assets/stylesheets/alchemy/admin.scss +2 -1
- data/app/assets/stylesheets/alchemy/archive.scss +7 -0
- data/app/assets/stylesheets/alchemy/base.scss +0 -42
- data/app/assets/stylesheets/alchemy/buttons.scss +2 -1
- data/app/assets/stylesheets/alchemy/form_fields.scss +9 -0
- data/app/assets/stylesheets/alchemy/forms.scss +36 -10
- data/app/assets/stylesheets/alchemy/frame.scss +12 -1
- data/app/assets/stylesheets/alchemy/icons.scss +1 -1
- data/app/assets/stylesheets/alchemy/jquery-ui.scss +0 -260
- data/app/assets/stylesheets/alchemy/jquery.datetimepicker.scss +507 -0
- data/app/assets/stylesheets/alchemy/lists.scss +62 -0
- data/app/assets/stylesheets/alchemy/selects.scss +9 -2
- data/app/assets/stylesheets/alchemy/sitemap.scss +28 -51
- data/app/assets/stylesheets/alchemy/toolbar.scss +0 -2
- data/app/controllers/alchemy/admin/attachments_controller.rb +4 -6
- data/app/controllers/alchemy/admin/base_controller.rb +2 -2
- data/app/controllers/alchemy/admin/dashboard_controller.rb +2 -2
- data/app/controllers/alchemy/admin/languages_controller.rb +5 -0
- data/app/controllers/alchemy/admin/pages_controller.rb +14 -5
- data/app/controllers/alchemy/admin/resources_controller.rb +17 -1
- data/app/controllers/alchemy/base_controller.rb +1 -0
- data/app/controllers/alchemy/messages_controller.rb +1 -1
- data/app/controllers/alchemy/pages_controller.rb +16 -26
- data/app/controllers/alchemy/pictures_controller.rb +23 -10
- data/app/controllers/concerns/alchemy/page_redirects.rb +7 -7
- data/app/helpers/alchemy/admin/base_helper.rb +22 -19
- data/app/helpers/alchemy/admin/essences_helper.rb +26 -11
- data/app/helpers/alchemy/admin/pages_helper.rb +2 -1
- data/app/helpers/alchemy/essences_helper.rb +0 -35
- data/app/helpers/alchemy/url_helper.rb +1 -1
- data/app/mailers/alchemy/base_mailer.rb +18 -0
- data/app/mailers/alchemy/{messages.rb → messages_mailer.rb} +1 -1
- data/app/models/alchemy/attachment.rb +9 -0
- data/app/models/alchemy/cell.rb +1 -1
- data/app/models/alchemy/essence_picture.rb +4 -1
- data/app/models/alchemy/essence_picture_view.rb +68 -0
- data/app/models/alchemy/language.rb +8 -10
- data/app/models/alchemy/language/code.rb +4 -1
- data/app/models/alchemy/page.rb +69 -26
- data/app/models/alchemy/page/page_natures.rb +22 -0
- data/app/models/alchemy/page/page_scopes.rb +20 -6
- data/app/models/alchemy/picture.rb +37 -4
- data/app/models/alchemy/site.rb +8 -0
- data/app/serializers/alchemy/page_tree_serializer.rb +1 -1
- data/app/views/alchemy/admin/attachments/_archive_overlay.html.erb +9 -6
- data/app/views/alchemy/admin/attachments/_file_to_assign.html.erb +11 -9
- data/app/views/alchemy/admin/attachments/_filter_bar.html.erb +32 -0
- data/app/views/alchemy/admin/attachments/_overlay_file_list.html.erb +14 -2
- data/app/views/alchemy/admin/attachments/index.html.erb +10 -9
- data/app/views/alchemy/admin/dashboard/_locked_pages.html.erb +20 -9
- data/app/views/alchemy/admin/dashboard/_recent_pages.html.erb +11 -1
- data/app/views/alchemy/admin/languages/_form.html.erb +1 -0
- data/app/views/alchemy/admin/languages/index.html.erb +7 -8
- data/app/views/alchemy/admin/layoutpages/_layoutpage.html.erb +1 -1
- data/app/views/alchemy/admin/layoutpages/index.html.erb +2 -2
- data/app/views/alchemy/admin/pages/_current_page.html.erb +4 -0
- data/app/views/alchemy/admin/pages/_form.html.erb +16 -1
- data/app/views/alchemy/admin/pages/_locked_page.html.erb +2 -12
- data/app/views/alchemy/admin/pages/_page.html.erb +1 -1
- data/app/views/alchemy/admin/pages/_page_for_links.html.erb +2 -2
- data/app/views/alchemy/admin/pages/_page_status.html.erb +23 -11
- data/app/views/alchemy/admin/pages/edit.html.erb +2 -1
- data/app/views/alchemy/admin/pages/index.html.erb +2 -2
- data/app/views/alchemy/admin/partials/_language_tree_select.html.erb +3 -0
- data/app/views/alchemy/admin/partials/_site_select.html.erb +9 -0
- data/app/views/alchemy/admin/pictures/_picture.html.erb +6 -1
- data/app/views/alchemy/admin/pictures/_picture_to_assign.html.erb +2 -1
- data/app/views/alchemy/admin/pictures/show.html.erb +1 -1
- data/app/views/alchemy/admin/resources/_filter_bar.html.erb +31 -0
- data/app/views/alchemy/admin/resources/_form.html.erb +6 -0
- data/app/views/alchemy/admin/resources/_tag_list.html.erb +16 -0
- data/app/views/alchemy/admin/resources/index.html.erb +13 -1
- data/app/views/alchemy/essences/_essence_file_view.html.erb +2 -5
- data/app/views/alchemy/essences/_essence_picture_view.html.erb +5 -3
- data/app/views/alchemy/{messages → messages_mailer}/contact_form_mail.de.text.erb +0 -0
- data/app/views/alchemy/{messages → messages_mailer}/contact_form_mail.en.text.erb +0 -0
- data/app/views/alchemy/{messages → messages_mailer}/contact_form_mail.es.text.erb +0 -0
- data/app/views/alchemy/{messages → messages_mailer}/new.html.erb +0 -0
- data/app/views/layouts/alchemy/admin.html.erb +3 -8
- data/config/alchemy/config.yml +4 -3
- data/config/initializers/assets.rb +2 -2
- data/config/initializers/dragonfly.rb +3 -0
- data/config/initializers/mime_types.rb +1 -0
- data/config/locales/alchemy.de.yml +10 -2
- data/config/locales/alchemy.en.yml +6 -2
- data/config/locales/alchemy.es.yml +6 -3
- data/config/locales/alchemy.fr.yml +6 -2
- data/config/locales/alchemy.it.yml +937 -0
- data/config/locales/alchemy.nl.yml +6 -2
- data/config/locales/alchemy.ru.yml +3 -2
- data/config/locales/simple_form.it.yml +25 -0
- data/db/migrate/20160108174834_add_timebased_publishing_columns_to_pages.rb +32 -0
- data/db/migrate/20160422195310_add_image_file_format_to_alchemy_pictures.rb +21 -0
- data/db/migrate/20160617224938_change_alchemy_pages_locked_to_locked_at.rb +22 -0
- data/lib/alchemy/ability_helper.rb +23 -0
- data/lib/alchemy/configuration_methods.rb +2 -2
- data/lib/alchemy/controller_actions.rb +4 -33
- data/lib/alchemy/engine.rb +1 -0
- data/lib/alchemy/resource.rb +30 -13
- data/lib/alchemy/resources_helper.rb +17 -0
- data/lib/alchemy/test_support/factories/page_factory.rb +7 -2
- data/lib/alchemy/upgrader.rb +1 -0
- data/lib/alchemy/upgrader/tasks/install_asset_manifests.rb +15 -0
- data/lib/alchemy/upgrader/three_point_four.rb +16 -0
- data/lib/alchemy/version.rb +1 -1
- data/lib/rails/generators/alchemy/elements/elements_generator.rb +8 -7
- data/lib/rails/generators/alchemy/essence/essence_generator.rb +2 -6
- data/lib/rails/generators/alchemy/install/files/all.css +11 -0
- data/lib/rails/generators/alchemy/install/files/all.js +11 -0
- data/lib/rails/generators/alchemy/install/files/{alchemy.elements.css.scss → article.scss} +0 -0
- data/lib/rails/generators/alchemy/install/install_generator.rb +20 -19
- data/lib/rails/generators/alchemy/module/module_generator.rb +3 -5
- data/lib/rails/generators/alchemy/page_layouts/page_layouts_generator.rb +7 -6
- data/lib/rails/generators/alchemy/site_layouts/site_layouts_generator.rb +7 -6
- data/vendor/assets/javascripts/date-formatter.js +161 -0
- data/vendor/assets/javascripts/jquery_plugins/jquery.datetimepicker.full.min.js +2 -0
- data/vendor/assets/javascripts/tinymce/langs/it.js +219 -0
- metadata +48 -13
- data/app/assets/javascripts/alchemy/alchemy.custom.js +0 -1
- data/app/assets/stylesheets/alchemy/custom.scss +0 -1
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
module Alchemy
|
|
2
|
+
# Renders an essence picture view
|
|
3
|
+
class EssencePictureView
|
|
4
|
+
include ActionView::Helpers::AssetTagHelper
|
|
5
|
+
include ActionView::Helpers::UrlHelper
|
|
6
|
+
include Rails.application.routes.url_helpers
|
|
7
|
+
|
|
8
|
+
attr_reader :content, :essence, :html_options, :options, :picture
|
|
9
|
+
|
|
10
|
+
DEFAULT_OPTIONS = {
|
|
11
|
+
show_caption: true,
|
|
12
|
+
disable_link: false
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
def initialize(content, options = {}, html_options = {})
|
|
16
|
+
@content = content
|
|
17
|
+
@options = DEFAULT_OPTIONS.update(content.settings).update(options)
|
|
18
|
+
@html_options = html_options
|
|
19
|
+
@essence = content.essence
|
|
20
|
+
@picture = essence.picture
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def render
|
|
24
|
+
return if picture.blank?
|
|
25
|
+
|
|
26
|
+
output = caption ? img_tag + caption : img_tag
|
|
27
|
+
|
|
28
|
+
if is_linked?
|
|
29
|
+
output = link_to(output, url_for(essence.link), {
|
|
30
|
+
title: essence.link_title.presence,
|
|
31
|
+
target: essence.link_target == "blank" ? "_blank" : nil,
|
|
32
|
+
data: {link_target: essence.link_target.presence}
|
|
33
|
+
})
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
if caption
|
|
37
|
+
content_tag(:figure, output, {class: essence.css_class.presence}.merge(html_options))
|
|
38
|
+
else
|
|
39
|
+
output
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
private
|
|
44
|
+
|
|
45
|
+
def caption
|
|
46
|
+
return unless show_caption?
|
|
47
|
+
@_caption ||= content_tag(:figcaption, essence.caption)
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def img_tag
|
|
51
|
+
@_img_tag ||= image_tag(
|
|
52
|
+
essence.picture_url(options), {
|
|
53
|
+
alt: essence.alt_tag.presence,
|
|
54
|
+
title: essence.title.presence,
|
|
55
|
+
class: caption ? nil : essence.css_class.presence
|
|
56
|
+
}.merge(caption ? {} : html_options)
|
|
57
|
+
)
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def show_caption?
|
|
61
|
+
options[:show_caption] && essence.caption.present?
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def is_linked?
|
|
65
|
+
!options[:disable_link] && essence.link.present?
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
end
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
|
|
20
20
|
module Alchemy
|
|
21
21
|
class Language < ActiveRecord::Base
|
|
22
|
-
belongs_to :site
|
|
22
|
+
belongs_to :site, required: true
|
|
23
23
|
has_many :pages
|
|
24
24
|
|
|
25
25
|
before_validation :set_locale, if: -> { locale.blank? }
|
|
@@ -52,11 +52,10 @@ module Alchemy
|
|
|
52
52
|
before_destroy :check_for_default
|
|
53
53
|
after_destroy :delete_language_root_page
|
|
54
54
|
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
scope :
|
|
58
|
-
scope :
|
|
59
|
-
scope :on_site, ->(s) { s.present? ? where(site_id: s.id) : all }
|
|
55
|
+
scope :published, -> { where(public: true) }
|
|
56
|
+
scope :with_root_page, -> { joins(:pages).where(Page.table_name => {language_root: true}) }
|
|
57
|
+
scope :on_site, ->(s) { s ? where(site_id: s.id) : all }
|
|
58
|
+
scope :on_current_site, -> { on_site(Site.current) }
|
|
60
59
|
|
|
61
60
|
class << self
|
|
62
61
|
# Store the current language in the current thread.
|
|
@@ -74,11 +73,10 @@ module Alchemy
|
|
|
74
73
|
current.pages.language_roots.first
|
|
75
74
|
end
|
|
76
75
|
|
|
77
|
-
# Default language
|
|
76
|
+
# Default language for current site
|
|
78
77
|
def default
|
|
79
|
-
find_by(default: true)
|
|
78
|
+
on_current_site.find_by(default: true)
|
|
80
79
|
end
|
|
81
|
-
alias_method :get_default, :default
|
|
82
80
|
end
|
|
83
81
|
|
|
84
82
|
def label(attrib)
|
|
@@ -165,7 +163,7 @@ module Alchemy
|
|
|
165
163
|
end
|
|
166
164
|
|
|
167
165
|
def unpublish_pages
|
|
168
|
-
pages.update_all(
|
|
166
|
+
pages.update_all(public_on: nil, public_until: nil)
|
|
169
167
|
end
|
|
170
168
|
end
|
|
171
169
|
end
|
|
@@ -13,7 +13,10 @@ module Alchemy::Language::Code
|
|
|
13
13
|
def find_by_code(code)
|
|
14
14
|
codes = code.split('-')
|
|
15
15
|
codes << '' if codes.length == 1
|
|
16
|
-
|
|
16
|
+
on_current_site.find_by(
|
|
17
|
+
language_code: codes[0],
|
|
18
|
+
country_code: codes[1]
|
|
19
|
+
)
|
|
17
20
|
end
|
|
18
21
|
end
|
|
19
22
|
end
|
data/app/models/alchemy/page.rb
CHANGED
|
@@ -3,12 +3,12 @@
|
|
|
3
3
|
# Table name: alchemy_pages
|
|
4
4
|
#
|
|
5
5
|
# id :integer not null, primary key
|
|
6
|
-
# name :string
|
|
7
|
-
# urlname :string
|
|
8
|
-
# title :string
|
|
9
|
-
# language_code :string
|
|
6
|
+
# name :string
|
|
7
|
+
# urlname :string
|
|
8
|
+
# title :string
|
|
9
|
+
# language_code :string
|
|
10
10
|
# language_root :boolean
|
|
11
|
-
# page_layout :string
|
|
11
|
+
# page_layout :string
|
|
12
12
|
# meta_keywords :text
|
|
13
13
|
# meta_description :text
|
|
14
14
|
# lft :integer
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
# depth :integer
|
|
18
18
|
# visible :boolean default(FALSE)
|
|
19
19
|
# public :boolean default(FALSE)
|
|
20
|
-
#
|
|
20
|
+
# locked_at :datetime
|
|
21
21
|
# locked_by :integer
|
|
22
22
|
# restricted :boolean default(FALSE)
|
|
23
23
|
# robot_index :boolean default(TRUE)
|
|
@@ -31,6 +31,8 @@
|
|
|
31
31
|
# language_id :integer
|
|
32
32
|
# cached_tag_list :text
|
|
33
33
|
# published_at :datetime
|
|
34
|
+
# public_on :datetime
|
|
35
|
+
# public_until :datetime
|
|
34
36
|
#
|
|
35
37
|
|
|
36
38
|
module Alchemy
|
|
@@ -43,17 +45,32 @@ module Alchemy
|
|
|
43
45
|
do_not_autogenerate: true,
|
|
44
46
|
do_not_sweep: true,
|
|
45
47
|
visible: false,
|
|
46
|
-
|
|
47
|
-
|
|
48
|
+
public_on: nil,
|
|
49
|
+
public_until: nil,
|
|
50
|
+
locked_at: nil,
|
|
48
51
|
locked_by: nil
|
|
49
52
|
}
|
|
50
|
-
|
|
53
|
+
|
|
54
|
+
SKIPPED_ATTRIBUTES_ON_COPY = %w(
|
|
55
|
+
id
|
|
56
|
+
updated_at
|
|
57
|
+
created_at
|
|
58
|
+
creator_id
|
|
59
|
+
updater_id
|
|
60
|
+
lft
|
|
61
|
+
rgt
|
|
62
|
+
depth
|
|
63
|
+
urlname
|
|
64
|
+
cached_tag_list
|
|
65
|
+
)
|
|
66
|
+
|
|
51
67
|
PERMITTED_ATTRIBUTES = [
|
|
52
68
|
:meta_description,
|
|
53
69
|
:meta_keywords,
|
|
54
70
|
:name,
|
|
55
71
|
:page_layout,
|
|
56
|
-
:
|
|
72
|
+
:public_on,
|
|
73
|
+
:public_until,
|
|
57
74
|
:restricted,
|
|
58
75
|
:robot_index,
|
|
59
76
|
:robot_follow,
|
|
@@ -73,6 +90,7 @@ module Alchemy
|
|
|
73
90
|
belongs_to :language
|
|
74
91
|
|
|
75
92
|
has_one :site, through: :language
|
|
93
|
+
has_many :site_languages, through: :site, source: :languages
|
|
76
94
|
has_many :folded_pages
|
|
77
95
|
has_many :legacy_urls, class_name: 'Alchemy::LegacyPageUrl'
|
|
78
96
|
|
|
@@ -84,12 +102,29 @@ module Alchemy
|
|
|
84
102
|
attr_accessor :do_not_sweep
|
|
85
103
|
attr_accessor :do_not_validate_language
|
|
86
104
|
|
|
87
|
-
before_save :set_language_code,
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
105
|
+
before_save :set_language_code,
|
|
106
|
+
if: -> { language.present? },
|
|
107
|
+
unless: :systempage?
|
|
108
|
+
|
|
109
|
+
before_save :set_restrictions_to_child_pages,
|
|
110
|
+
if: :restricted_changed?,
|
|
111
|
+
unless: :systempage?
|
|
112
|
+
|
|
113
|
+
before_save :inherit_restricted_status,
|
|
114
|
+
if: -> { parent && parent.restricted? },
|
|
115
|
+
unless: :systempage?
|
|
116
|
+
|
|
117
|
+
before_save :set_published_at,
|
|
118
|
+
if: -> { public? && published_at.nil? },
|
|
119
|
+
unless: :systempage?
|
|
120
|
+
|
|
121
|
+
before_create :set_language_from_parent_or_default,
|
|
122
|
+
if: -> { language_id.blank? },
|
|
123
|
+
unless: :systempage?
|
|
124
|
+
|
|
125
|
+
after_update :create_legacy_url,
|
|
126
|
+
if: :urlname_changed?,
|
|
127
|
+
unless: :redirects_to_external?
|
|
93
128
|
|
|
94
129
|
# Concerns
|
|
95
130
|
include Alchemy::Page::PageScopes
|
|
@@ -99,6 +134,9 @@ module Alchemy
|
|
|
99
134
|
include Alchemy::Page::PageCells
|
|
100
135
|
include Alchemy::Page::PageElements
|
|
101
136
|
|
|
137
|
+
# site_name accessor
|
|
138
|
+
delegate :name, to: :site, prefix: true, allow_nil: true
|
|
139
|
+
|
|
102
140
|
# Class methods
|
|
103
141
|
#
|
|
104
142
|
class << self
|
|
@@ -281,16 +319,16 @@ module Alchemy
|
|
|
281
319
|
end
|
|
282
320
|
alias_method :next_page, :next
|
|
283
321
|
|
|
284
|
-
# Locks the page to given user
|
|
322
|
+
# Locks the page to given user
|
|
285
323
|
#
|
|
286
324
|
def lock_to!(user)
|
|
287
|
-
update_columns(
|
|
325
|
+
update_columns(locked_at: Time.current, locked_by: user.id)
|
|
288
326
|
end
|
|
289
327
|
|
|
290
328
|
# Unlocks the page without updating the timestamps
|
|
291
329
|
#
|
|
292
330
|
def unlock!
|
|
293
|
-
if update_columns(
|
|
331
|
+
if update_columns(locked_at: nil, locked_by: nil)
|
|
294
332
|
Page.current_preview = nil
|
|
295
333
|
end
|
|
296
334
|
end
|
|
@@ -335,12 +373,18 @@ module Alchemy
|
|
|
335
373
|
|
|
336
374
|
# Publishes the page.
|
|
337
375
|
#
|
|
338
|
-
# Sets +
|
|
376
|
+
# Sets +public_on+ and the +published_at+ value to current time
|
|
377
|
+
# and resets +public_until+ to nil
|
|
339
378
|
#
|
|
340
379
|
# The +published_at+ attribute is used as +cache_key+.
|
|
341
380
|
#
|
|
342
381
|
def publish!
|
|
343
|
-
|
|
382
|
+
current_time = Time.current
|
|
383
|
+
update_columns(
|
|
384
|
+
published_at: current_time,
|
|
385
|
+
public_on: current_time,
|
|
386
|
+
public_until: nil
|
|
387
|
+
)
|
|
344
388
|
end
|
|
345
389
|
|
|
346
390
|
# Updates an Alchemy::Page based on a new ordering to be applied to it
|
|
@@ -380,10 +424,9 @@ module Alchemy
|
|
|
380
424
|
public: true
|
|
381
425
|
}.update(options)
|
|
382
426
|
|
|
383
|
-
self_and_siblings
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
.where(restricted: options[:restricted])
|
|
427
|
+
pages = self_and_siblings.where(["#{Page.table_name}.lft #{dir} ?", lft])
|
|
428
|
+
pages = options[:public] ? pages.published : pages.not_public
|
|
429
|
+
pages.where(restricted: options[:restricted])
|
|
387
430
|
.reorder(dir == '>' ? 'lft' : 'lft DESC')
|
|
388
431
|
.limit(1).first
|
|
389
432
|
end
|
|
@@ -402,7 +445,7 @@ module Alchemy
|
|
|
402
445
|
legacy_urls.find_or_create_by(urlname: urlname_was)
|
|
403
446
|
end
|
|
404
447
|
|
|
405
|
-
def
|
|
448
|
+
def set_published_at
|
|
406
449
|
self.published_at = Time.current
|
|
407
450
|
end
|
|
408
451
|
end
|
|
@@ -2,6 +2,15 @@ module Alchemy
|
|
|
2
2
|
module Page::PageNatures
|
|
3
3
|
extend ActiveSupport::Concern
|
|
4
4
|
|
|
5
|
+
def public?
|
|
6
|
+
current_time = Time.current
|
|
7
|
+
already_public_for?(current_time) && still_public_for?(current_time)
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def expiration_time
|
|
11
|
+
public_until? ? public_until - Time.current : nil
|
|
12
|
+
end
|
|
13
|
+
|
|
5
14
|
def taggable?
|
|
6
15
|
definition['taggable'] == true
|
|
7
16
|
end
|
|
@@ -33,6 +42,11 @@ module Alchemy
|
|
|
33
42
|
!PageLayout.get(page_layout).nil? && !PageLayout.get(page_layout)["controller"].blank?
|
|
34
43
|
end
|
|
35
44
|
|
|
45
|
+
# True if page locked_at timestamp and locked_by id are set
|
|
46
|
+
def locked?
|
|
47
|
+
locked_by? && locked_at?
|
|
48
|
+
end
|
|
49
|
+
|
|
36
50
|
def controller_and_action
|
|
37
51
|
if has_controller?
|
|
38
52
|
{
|
|
@@ -144,5 +158,13 @@ module Alchemy
|
|
|
144
158
|
Alchemy::Config.get(:cache_pages) &&
|
|
145
159
|
Rails.application.config.action_controller.perform_caching
|
|
146
160
|
end
|
|
161
|
+
|
|
162
|
+
def already_public_for?(time)
|
|
163
|
+
!public_on.nil? && public_on <= time
|
|
164
|
+
end
|
|
165
|
+
|
|
166
|
+
def still_public_for?(time)
|
|
167
|
+
public_until.nil? || public_until >= time
|
|
168
|
+
end
|
|
147
169
|
end
|
|
148
170
|
end
|
|
@@ -15,7 +15,7 @@ module Alchemy
|
|
|
15
15
|
|
|
16
16
|
# All locked pages
|
|
17
17
|
#
|
|
18
|
-
scope :locked, -> { where(
|
|
18
|
+
scope :locked, -> { where.not(locked_at: nil, locked_by: nil) }
|
|
19
19
|
|
|
20
20
|
# All pages locked by given user
|
|
21
21
|
#
|
|
@@ -27,16 +27,12 @@ module Alchemy
|
|
|
27
27
|
|
|
28
28
|
# All not locked pages
|
|
29
29
|
#
|
|
30
|
-
scope :not_locked, -> { where(
|
|
30
|
+
scope :not_locked, -> { where(locked_at: nil, locked_by: nil) }
|
|
31
31
|
|
|
32
32
|
# All visible pages
|
|
33
33
|
#
|
|
34
34
|
scope :visible, -> { where(visible: true) }
|
|
35
35
|
|
|
36
|
-
# All public pages
|
|
37
|
-
#
|
|
38
|
-
scope :published, -> { where(public: true) }
|
|
39
|
-
|
|
40
36
|
# All not restricted pages
|
|
41
37
|
#
|
|
42
38
|
scope :not_restricted, -> { where(restricted: false) }
|
|
@@ -99,5 +95,23 @@ module Alchemy
|
|
|
99
95
|
#
|
|
100
96
|
scope :sitemap, -> { from_current_site.published.contentpages.where(sitemap: true) }
|
|
101
97
|
end
|
|
98
|
+
|
|
99
|
+
module ClassMethods
|
|
100
|
+
# All public pages
|
|
101
|
+
#
|
|
102
|
+
def published
|
|
103
|
+
where("#{table_name}.public_on <= :time AND " \
|
|
104
|
+
"(#{table_name}.public_until IS NULL " \
|
|
105
|
+
"OR #{table_name}.public_until >= :time)", time: Time.current)
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
# All not public pages
|
|
109
|
+
#
|
|
110
|
+
def not_public
|
|
111
|
+
where("#{table_name}.public_on IS NULL OR " \
|
|
112
|
+
"#{table_name}.public_on >= :time OR " \
|
|
113
|
+
"#{table_name}.public_until <= :time", time: Time.current)
|
|
114
|
+
end
|
|
115
|
+
end
|
|
102
116
|
end
|
|
103
117
|
end
|
|
@@ -3,22 +3,25 @@
|
|
|
3
3
|
# Table name: alchemy_pictures
|
|
4
4
|
#
|
|
5
5
|
# id :integer not null, primary key
|
|
6
|
-
# name :string
|
|
7
|
-
# image_file_name :string
|
|
6
|
+
# name :string
|
|
7
|
+
# image_file_name :string
|
|
8
8
|
# image_file_width :integer
|
|
9
9
|
# image_file_height :integer
|
|
10
10
|
# created_at :datetime not null
|
|
11
11
|
# updated_at :datetime not null
|
|
12
12
|
# creator_id :integer
|
|
13
13
|
# updater_id :integer
|
|
14
|
-
# upload_hash :string
|
|
14
|
+
# upload_hash :string
|
|
15
15
|
# cached_tag_list :text
|
|
16
|
-
# image_file_uid :string
|
|
16
|
+
# image_file_uid :string
|
|
17
17
|
# image_file_size :integer
|
|
18
|
+
# image_file_format :string
|
|
18
19
|
#
|
|
19
20
|
|
|
20
21
|
module Alchemy
|
|
21
22
|
class Picture < ActiveRecord::Base
|
|
23
|
+
CONVERTIBLE_FILE_FORMATS = %w(gif jpg jpeg png).freeze
|
|
24
|
+
|
|
22
25
|
include Alchemy::NameConversions
|
|
23
26
|
include Alchemy::Touching
|
|
24
27
|
include Alchemy::Picture::Sweeping
|
|
@@ -183,6 +186,36 @@ module Alchemy
|
|
|
183
186
|
convert_to_humanized_name(image_file_name, suffix)
|
|
184
187
|
end
|
|
185
188
|
|
|
189
|
+
# Returns the format the image should be rendered with
|
|
190
|
+
#
|
|
191
|
+
# Only returns a format differing from original if an +image_output_format+
|
|
192
|
+
# is set in config and the image has a convertible file format.
|
|
193
|
+
#
|
|
194
|
+
def default_render_format
|
|
195
|
+
if convertible?
|
|
196
|
+
Config.get(:image_output_format)
|
|
197
|
+
else
|
|
198
|
+
image_file_format
|
|
199
|
+
end
|
|
200
|
+
end
|
|
201
|
+
|
|
202
|
+
# Returns true if the image can be converted
|
|
203
|
+
#
|
|
204
|
+
# If the +image_output_format+ is set to +nil+ or +original+ or the
|
|
205
|
+
# image has not a convertible file format (i.e. SVG) this returns +false+
|
|
206
|
+
#
|
|
207
|
+
def convertible?
|
|
208
|
+
Config.get(:image_output_format) &&
|
|
209
|
+
Config.get(:image_output_format) != 'original' &&
|
|
210
|
+
has_convertible_format?
|
|
211
|
+
end
|
|
212
|
+
|
|
213
|
+
# Returns true if the image can be converted into other formats
|
|
214
|
+
#
|
|
215
|
+
def has_convertible_format?
|
|
216
|
+
image_file_format.in?(CONVERTIBLE_FILE_FORMATS)
|
|
217
|
+
end
|
|
218
|
+
|
|
186
219
|
# Checks if the picture is restricted.
|
|
187
220
|
#
|
|
188
221
|
# A picture is only restricted if it's assigned on restricted pages only.
|