alchemy_cms 2.1.4 → 2.1.5
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/Gemfile +1 -1
- data/README.md +11 -31
- data/app/assets/javascripts/alchemy/alchemy.elements_window.js +3 -1
- data/app/assets/javascripts/alchemy/alchemy.windows.js +1 -1
- data/app/assets/stylesheets/alchemy/base.css.scss +0 -4
- data/app/assets/stylesheets/alchemy/buttons.css.scss +7 -4
- data/app/assets/stylesheets/alchemy/icons.css.scss +7 -1
- data/app/assets/stylesheets/alchemy/tinymce_dialog.css.scss +11 -15
- data/app/assets/{javascripts → stylesheets}/tiny_mce/plugins/inlinepopups/skins/alchemy/window.css.scss +51 -18
- data/app/controllers/alchemy/admin/contents_controller.rb +5 -5
- data/app/controllers/alchemy/base_controller.rb +1 -1
- data/app/helpers/alchemy/admin/base_helper.rb +4 -7
- data/app/helpers/alchemy/admin/elements_helper.rb +2 -2
- data/app/models/alchemy/attachment.rb +1 -1
- data/app/models/alchemy/cell.rb +3 -3
- data/app/models/alchemy/content.rb +4 -4
- data/app/models/alchemy/element.rb +8 -8
- data/app/models/alchemy/essence_html.rb +1 -1
- data/app/models/alchemy/essence_richtext.rb +4 -4
- data/app/models/alchemy/essence_text.rb +1 -1
- data/app/models/alchemy/language.rb +10 -7
- data/app/models/alchemy/language/code.rb +19 -0
- data/app/models/alchemy/message.rb +6 -6
- data/app/models/alchemy/page.rb +26 -26
- data/app/models/alchemy/picture.rb +11 -13
- data/app/models/alchemy/user.rb +5 -5
- data/app/models/alchemy/user_session.rb +1 -1
- data/app/views/alchemy/admin/contents/destroy.js.erb +1 -1
- data/app/views/alchemy/admin/elements/create.js.erb +1 -0
- data/app/views/alchemy/admin/elements/fold.js.erb +2 -2
- data/app/views/alchemy/admin/elements/index.html.erb +1 -1
- data/app/views/alchemy/admin/essence_pictures/edit.html.erb +6 -6
- data/app/views/alchemy/admin/languages/_form.html.erb +47 -0
- data/app/views/alchemy/admin/languages/_language.html.erb +47 -0
- data/app/views/alchemy/admin/languages/_table.html.erb +33 -0
- data/app/views/alchemy/essences/_essence_picture_tools.html.erb +4 -1
- data/app/views/alchemy/essences/_essence_picture_view.html.erb +1 -3
- data/app/views/alchemy/essences/_essence_text_editor.html.erb +1 -1
- data/config/locales/alchemy.de.yml +26 -22
- data/config/locales/alchemy.en.yml +2 -0
- data/config/routes.rb +2 -2
- data/db/migrate/20120216135355_add_country_code_to_languages.rb +9 -0
- data/lib/alchemy/i18n.rb +21 -14
- data/lib/alchemy/seeder.rb +2 -2
- data/lib/alchemy/version.rb +1 -1
- data/spec/dummy/db/schema.rb +5 -3
- data/spec/factories.rb +2 -2
- data/spec/models/language_spec.rb +22 -4
- data/vendor/assets/javascripts/tiny_mce/langs/de.js +0 -0
- data/vendor/assets/javascripts/tiny_mce/langs/en.js +0 -0
- data/vendor/assets/javascripts/tiny_mce/license.txt +0 -0
- data/vendor/assets/javascripts/tiny_mce/plugins/autoresize/editor_plugin.js +1 -137
- data/vendor/assets/javascripts/tiny_mce/plugins/fullscreen/editor_plugin.js +0 -0
- data/vendor/assets/javascripts/tiny_mce/plugins/fullscreen/fullscreen.htm +0 -0
- data/vendor/assets/javascripts/tiny_mce/plugins/inlinepopups/editor_plugin.js +0 -0
- data/vendor/assets/javascripts/tiny_mce/plugins/inlinepopups/template.htm +0 -0
- data/vendor/assets/javascripts/tiny_mce/plugins/paste/editor_plugin.js +0 -0
- data/vendor/assets/javascripts/tiny_mce/plugins/paste/js/pastetext.js +0 -0
- data/vendor/assets/javascripts/tiny_mce/plugins/paste/js/pasteword.js +0 -0
- data/vendor/assets/javascripts/tiny_mce/plugins/paste/langs/de_dlg.js +0 -0
- data/vendor/assets/javascripts/tiny_mce/plugins/paste/langs/en_dlg.js +0 -0
- data/vendor/assets/javascripts/tiny_mce/plugins/paste/pastetext.htm +0 -0
- data/vendor/assets/javascripts/tiny_mce/plugins/paste/pasteword.htm +0 -0
- data/vendor/assets/javascripts/tiny_mce/plugins/table/cell.htm +0 -0
- data/vendor/assets/javascripts/tiny_mce/plugins/table/css/cell.css +0 -0
- data/vendor/assets/javascripts/tiny_mce/plugins/table/css/row.css +0 -0
- data/vendor/assets/javascripts/tiny_mce/plugins/table/css/table.css +0 -0
- data/vendor/assets/javascripts/tiny_mce/plugins/table/editor_plugin.js +0 -0
- data/vendor/assets/javascripts/tiny_mce/plugins/table/js/cell.js +0 -0
- data/vendor/assets/javascripts/tiny_mce/plugins/table/js/merge_cells.js +0 -0
- data/vendor/assets/javascripts/tiny_mce/plugins/table/js/row.js +0 -0
- data/vendor/assets/javascripts/tiny_mce/plugins/table/js/table.js +5 -1
- data/vendor/assets/javascripts/tiny_mce/plugins/table/langs/de_dlg.js +0 -0
- data/vendor/assets/javascripts/tiny_mce/plugins/table/langs/en_dlg.js +0 -0
- data/vendor/assets/javascripts/tiny_mce/plugins/table/merge_cells.htm +0 -0
- data/vendor/assets/javascripts/tiny_mce/plugins/table/row.htm +0 -0
- data/vendor/assets/javascripts/tiny_mce/plugins/table/table.htm +0 -0
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/about.htm +0 -0
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/anchor.htm +0 -0
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/charmap.htm +0 -0
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/color_picker.htm +0 -0
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/editor_template.js +1 -1
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/image.htm +0 -0
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/img/colorpicker.jpg +0 -0
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/img/flash.gif +0 -0
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/img/icons.gif +0 -0
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/img/iframe.gif +0 -0
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/img/pagebreak.gif +0 -0
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/img/quicktime.gif +0 -0
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/img/realmedia.gif +0 -0
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/img/shockwave.gif +0 -0
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/img/trans.gif +0 -0
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/img/video.gif +0 -0
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/img/windowsmedia.gif +0 -0
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/js/about.js +0 -0
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/js/anchor.js +0 -0
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/js/charmap.js +0 -0
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/js/color_picker.js +0 -0
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/js/image.js +0 -0
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/js/link.js +0 -0
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/js/source_editor.js +0 -0
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/langs/de.js +0 -0
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/langs/de_dlg.js +0 -0
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/langs/en.js +0 -0
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/langs/en_dlg.js +0 -0
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/link.htm +0 -0
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/shortcuts.htm +0 -0
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/default/content.css +0 -0
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/default/dialog.css +0 -0
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/default/img/buttons.png +0 -0
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/default/img/items.gif +0 -0
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/default/img/menu_arrow.gif +0 -0
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/default/img/menu_check.gif +0 -0
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/default/img/progress.gif +0 -0
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/default/img/tabs.gif +0 -0
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/default/ui.css +0 -0
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/highcontrast/content.css +0 -0
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/highcontrast/dialog.css +0 -0
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/highcontrast/ui.css +0 -0
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/o2k7/content.css +0 -0
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/o2k7/dialog.css +0 -0
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/o2k7/img/button_bg.png +0 -0
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/o2k7/img/button_bg_black.png +0 -0
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/o2k7/img/button_bg_silver.png +0 -0
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/o2k7/ui.css +0 -0
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/o2k7/ui_black.css +0 -0
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/o2k7/ui_silver.css +0 -0
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/source_editor.htm +0 -0
- data/vendor/assets/javascripts/tiny_mce/tiny_mce.js +1 -1
- data/vendor/assets/javascripts/tiny_mce/tiny_mce_popup.js +0 -0
- data/vendor/assets/javascripts/tiny_mce/utils/editable_selects.js +0 -0
- data/vendor/assets/javascripts/tiny_mce/utils/form_utils.js +0 -0
- data/vendor/assets/javascripts/tiny_mce/utils/mctabs.js +0 -0
- data/vendor/assets/javascripts/tiny_mce/utils/validate.js +0 -0
- metadata +39 -42
- data/vendor/assets/javascripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/alert.gif +0 -0
- data/vendor/assets/javascripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/button.gif +0 -0
- data/vendor/assets/javascripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/buttons.gif +0 -0
- data/vendor/assets/javascripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/confirm.gif +0 -0
- data/vendor/assets/javascripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/corners.gif +0 -0
- data/vendor/assets/javascripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/horizontal.gif +0 -0
- data/vendor/assets/javascripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/vertical.gif +0 -0
- data/vendor/assets/javascripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/window.css +0 -90
data/app/models/alchemy/cell.rb
CHANGED
|
@@ -18,8 +18,8 @@ module Alchemy
|
|
|
18
18
|
has_many :elements, :dependent => :destroy, :order => :position
|
|
19
19
|
|
|
20
20
|
def self.definitions
|
|
21
|
-
cell_yml = File.join(Rails.root, 'config', 'alchemy', 'cells.yml')
|
|
22
|
-
YAML.load_file(cell_yml) if File.exist?(cell_yml)
|
|
21
|
+
cell_yml = ::File.join(::Rails.root, 'config', 'alchemy', 'cells.yml')
|
|
22
|
+
::YAML.load_file(cell_yml) if ::File.exist?(cell_yml)
|
|
23
23
|
end
|
|
24
24
|
|
|
25
25
|
def self.definition_for(cellname)
|
|
@@ -55,7 +55,7 @@ module Alchemy
|
|
|
55
55
|
end
|
|
56
56
|
|
|
57
57
|
def self.translated_label_for(cell_name)
|
|
58
|
-
|
|
58
|
+
I18n.t(cell_name, :scope => :cell_names)
|
|
59
59
|
end
|
|
60
60
|
|
|
61
61
|
end
|
|
@@ -12,7 +12,7 @@ module Alchemy
|
|
|
12
12
|
"element_id = '#{element_id}' AND essence_type = '#{essence_type}'"
|
|
13
13
|
end
|
|
14
14
|
|
|
15
|
-
validates_uniqueness_of :name, :scope => :element_id
|
|
15
|
+
#validates_uniqueness_of :name, :scope => :element_id
|
|
16
16
|
validates_uniqueness_of :position, :scope => [:element_id, :essence_type]
|
|
17
17
|
|
|
18
18
|
scope :essence_pictures, where(:essence_type => "Alchemy::EssencePicture")
|
|
@@ -23,7 +23,7 @@ module Alchemy
|
|
|
23
23
|
def self.create_from_scratch(element, essences_hash)
|
|
24
24
|
if essences_hash[:name].blank? && !essences_hash[:essence_type].blank?
|
|
25
25
|
essences_of_same_type = element.contents.where(
|
|
26
|
-
:essence_type =>
|
|
26
|
+
:essence_type => Content.normalize_essence_type(essences_hash[:essence_type])
|
|
27
27
|
)
|
|
28
28
|
description = {
|
|
29
29
|
'type' => essences_hash[:essence_type],
|
|
@@ -34,7 +34,7 @@ module Alchemy
|
|
|
34
34
|
description = element.available_content_description_for(essences_hash[:name]) if description.blank?
|
|
35
35
|
end
|
|
36
36
|
raise "No description found in elements.yml for #{essences_hash.inspect} and #{element.inspect}" if description.blank?
|
|
37
|
-
essence_class =
|
|
37
|
+
essence_class = Content.normalize_essence_type(description['type']).constantize
|
|
38
38
|
content = self.new(:name => description['name'], :element_id => element.id)
|
|
39
39
|
if description['type'] == "EssenceRichtext" || description['type'] == "EssenceText"
|
|
40
40
|
essence = essence_class.create(:do_not_index => !description['do_not_index'].nil?)
|
|
@@ -43,7 +43,7 @@ module Alchemy
|
|
|
43
43
|
end
|
|
44
44
|
if essence
|
|
45
45
|
content.essence = essence
|
|
46
|
-
content.save
|
|
46
|
+
content.save!
|
|
47
47
|
else
|
|
48
48
|
content = nil
|
|
49
49
|
end
|
|
@@ -11,7 +11,7 @@ module Alchemy
|
|
|
11
11
|
has_and_belongs_to_many :to_be_sweeped_pages, :class_name => 'Alchemy::Page', :uniq => true, :join_table => 'alchemy_elements_alchemy_pages'
|
|
12
12
|
|
|
13
13
|
validates_uniqueness_of :position, :scope => [:page_id, :cell_id]
|
|
14
|
-
validates_presence_of :name, :on => :create, :message => '^'+
|
|
14
|
+
validates_presence_of :name, :on => :create, :message => '^' + I18n.t(:choose_element)
|
|
15
15
|
|
|
16
16
|
attr_accessor :create_contents_after_create
|
|
17
17
|
|
|
@@ -152,12 +152,12 @@ module Alchemy
|
|
|
152
152
|
# Place a elements.yml file inside your apps config/alchemy folder to define
|
|
153
153
|
# your own set of elements
|
|
154
154
|
def self.descriptions
|
|
155
|
-
if File.exists? "#{Rails.root}/config/alchemy/elements.yml"
|
|
156
|
-
element_definitions = YAML.load_file( "#{Rails.root}/config/alchemy/elements.yml" )
|
|
155
|
+
if ::File.exists? "#{::Rails.root}/config/alchemy/elements.yml"
|
|
156
|
+
element_definitions = ::YAML.load_file( "#{::Rails.root}/config/alchemy/elements.yml" )
|
|
157
157
|
end
|
|
158
158
|
if !element_definitions
|
|
159
|
-
if File.exists?(File.join(File.dirname(__FILE__), "../../../config/alchemy/elements.yml"))
|
|
160
|
-
element_definitions = YAML.load_file( File.join(File.dirname(__FILE__), "../../../config/alchemy/elements.yml") )
|
|
159
|
+
if ::File.exists?(::File.join(::File.dirname(__FILE__), "../../../config/alchemy/elements.yml"))
|
|
160
|
+
element_definitions = ::YAML.load_file( ::File.join(::File.dirname(__FILE__), "../../../config/alchemy/elements.yml") )
|
|
161
161
|
end
|
|
162
162
|
end
|
|
163
163
|
if !element_definitions
|
|
@@ -170,7 +170,7 @@ module Alchemy
|
|
|
170
170
|
def self.all_for_page(page)
|
|
171
171
|
raise TypeError if page.class.name != "Alchemy::Page"
|
|
172
172
|
# if page_layout has cells, collect elements from cells and group them by cellname
|
|
173
|
-
page_layout =
|
|
173
|
+
page_layout = PageLayout.get(page.page_layout)
|
|
174
174
|
if page_layout.blank?
|
|
175
175
|
logger.warn "\n++++++\nWARNING! Could not find page_layout description for page: #{page.name}\n++++++++\n"
|
|
176
176
|
return []
|
|
@@ -273,7 +273,7 @@ module Alchemy
|
|
|
273
273
|
#
|
|
274
274
|
def display_name
|
|
275
275
|
return name.capitalize if description.blank?
|
|
276
|
-
|
|
276
|
+
I18n.t(description['name'], :scope => :element_names)
|
|
277
277
|
end
|
|
278
278
|
|
|
279
279
|
# Gets the preview text from the first Content found in the +elements.yml+ Element description file.
|
|
@@ -435,7 +435,7 @@ module Alchemy
|
|
|
435
435
|
messages = []
|
|
436
436
|
essence_errors.each do |content_name, errors|
|
|
437
437
|
errors.each do |error|
|
|
438
|
-
messages <<
|
|
438
|
+
messages << I18n.t(
|
|
439
439
|
"content_validations.#{self.name}.#{content_name}.#{error}",
|
|
440
440
|
:default => [
|
|
441
441
|
"content_validations.fields.#{content_name}.#{error}".to_sym,
|
|
@@ -7,7 +7,7 @@ module Alchemy
|
|
|
7
7
|
|
|
8
8
|
# Returns the first x (default = 30) (HTML escaped) characters from self.source for the Element#preview_text method.
|
|
9
9
|
def preview_text(maxlength = 30)
|
|
10
|
-
CGI.escapeHTML(source.to_s)[0..maxlength]
|
|
10
|
+
::CGI.escapeHTML(source.to_s)[0..maxlength]
|
|
11
11
|
end
|
|
12
12
|
|
|
13
13
|
end
|
|
@@ -7,7 +7,7 @@ module Alchemy
|
|
|
7
7
|
|
|
8
8
|
# Require acts_as_ferret only if Ferret full text search is enabled (default).
|
|
9
9
|
# You can disable it in +config/alchemy/config.yml+
|
|
10
|
-
if
|
|
10
|
+
if Config.get(:ferret) == true
|
|
11
11
|
require 'acts_as_ferret'
|
|
12
12
|
acts_as_ferret(
|
|
13
13
|
:fields => {
|
|
@@ -37,11 +37,11 @@ module Alchemy
|
|
|
37
37
|
return html if html.blank?
|
|
38
38
|
if html.index("<")
|
|
39
39
|
text = ""
|
|
40
|
-
tokenizer = HTML::Tokenizer.new(html)
|
|
40
|
+
tokenizer = ::HTML::Tokenizer.new(html)
|
|
41
41
|
while token = tokenizer.next
|
|
42
|
-
node = HTML::Node.parse(nil, 0, 0, token, false)
|
|
42
|
+
node = ::HTML::Node.parse(nil, 0, 0, token, false)
|
|
43
43
|
# result is only the content of any Text nodes
|
|
44
|
-
text << node.to_s if node.class == HTML::Text
|
|
44
|
+
text << node.to_s if node.class == ::HTML::Text
|
|
45
45
|
end
|
|
46
46
|
# strip any comments, and if they have a newline at the end (ie. line with
|
|
47
47
|
# only a comment) strip that too
|
|
@@ -5,7 +5,7 @@ module Alchemy
|
|
|
5
5
|
|
|
6
6
|
# Require acts_as_ferret only if Ferret full text search is enabled (default).
|
|
7
7
|
# You can disable it in +config/alchemy/config.yml+
|
|
8
|
-
if
|
|
8
|
+
if Config.get(:ferret) == true
|
|
9
9
|
require 'acts_as_ferret'
|
|
10
10
|
acts_as_ferret(
|
|
11
11
|
:fields => {
|
|
@@ -2,17 +2,18 @@ module Alchemy
|
|
|
2
2
|
class Language < ActiveRecord::Base
|
|
3
3
|
|
|
4
4
|
validates_presence_of :name
|
|
5
|
-
validates_presence_of :
|
|
5
|
+
validates_presence_of :language_code
|
|
6
6
|
validates_presence_of :page_layout
|
|
7
7
|
validates_presence_of :frontpage_name
|
|
8
|
-
validates_uniqueness_of :
|
|
8
|
+
validates_uniqueness_of :language_code, :scope => :country_code
|
|
9
9
|
validate :presence_of_default_language
|
|
10
10
|
validate :publicity_of_default_language
|
|
11
11
|
has_many :pages
|
|
12
12
|
after_destroy :delete_language_root_page
|
|
13
|
-
validates_format_of :
|
|
13
|
+
validates_format_of :language_code, :with => /^[a-z]{2}$/, :if => proc { language_code.present? }
|
|
14
|
+
validates_format_of :country_code, :with => /^[a-z]{2}$/, :if => proc { country_code.present? }
|
|
14
15
|
before_destroy :check_for_default
|
|
15
|
-
after_update :set_pages_language, :if => proc { |m| m.
|
|
16
|
+
after_update :set_pages_language, :if => proc { |m| m.language_code_changed? }
|
|
16
17
|
after_update :unpublish_pages, :if => proc { changes[:public] == [true, false] }
|
|
17
18
|
before_save :remove_old_default, :if => proc { |m| m.default_changed? && m != Language.get_default }
|
|
18
19
|
|
|
@@ -36,15 +37,17 @@ module Alchemy
|
|
|
36
37
|
if attrib.to_sym == :code
|
|
37
38
|
self.code
|
|
38
39
|
else
|
|
39
|
-
|
|
40
|
+
I18n.t(self.code, :default => self.name)
|
|
40
41
|
end
|
|
41
42
|
end
|
|
42
43
|
|
|
44
|
+
include Code
|
|
45
|
+
|
|
43
46
|
private
|
|
44
47
|
|
|
45
48
|
def publicity_of_default_language
|
|
46
49
|
if self.default? && !self.public?
|
|
47
|
-
errors.add(:base,
|
|
50
|
+
errors.add(:base, I18n.t("Default language has to be public"))
|
|
48
51
|
return false
|
|
49
52
|
else
|
|
50
53
|
return true
|
|
@@ -53,7 +56,7 @@ module Alchemy
|
|
|
53
56
|
|
|
54
57
|
def presence_of_default_language
|
|
55
58
|
if Language.get_default == self && self.default_changed?
|
|
56
|
-
errors.add(:base,
|
|
59
|
+
errors.add(:base, I18n.t("We need at least one default."))
|
|
57
60
|
return false
|
|
58
61
|
else
|
|
59
62
|
return true
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
module Alchemy::Language::Code
|
|
2
|
+
extend ActiveSupport::Concern
|
|
3
|
+
|
|
4
|
+
def code
|
|
5
|
+
[language_code, country_code].select(&:present?).join('-')
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def code=(code)
|
|
9
|
+
self.language_code = code
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
module ClassMethods
|
|
13
|
+
def find_by_code(code)
|
|
14
|
+
codes = code.split('-')
|
|
15
|
+
codes << nil if codes.length == 1
|
|
16
|
+
find_by_language_code_and_country_code *codes
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
@@ -33,11 +33,11 @@
|
|
|
33
33
|
module Alchemy
|
|
34
34
|
class Message
|
|
35
35
|
|
|
36
|
-
@@config =
|
|
36
|
+
@@config = Config.get(:mailer)
|
|
37
37
|
|
|
38
|
-
extend ActiveModel::Naming
|
|
39
|
-
include ActiveModel::Validations
|
|
40
|
-
include ActiveModel::Conversion
|
|
38
|
+
extend ::ActiveModel::Naming
|
|
39
|
+
include ::ActiveModel::Validations
|
|
40
|
+
include ::ActiveModel::Conversion
|
|
41
41
|
|
|
42
42
|
attr_accessor :contact_form_id, :ip
|
|
43
43
|
@@config[:fields].each do |field|
|
|
@@ -45,9 +45,9 @@ module Alchemy
|
|
|
45
45
|
end
|
|
46
46
|
|
|
47
47
|
@@config[:validate_fields].each do |field|
|
|
48
|
-
validates_presence_of field[0], :message => '^' +
|
|
48
|
+
validates_presence_of field[0], :message => '^' + I18n.t(field[1][:message].to_s, :scope => "contactform.validations")
|
|
49
49
|
if field[0].to_s.include?('email')
|
|
50
|
-
validates_format_of field[0], :with => Authlogic::Regex.email, :message => '^' +
|
|
50
|
+
validates_format_of field[0], :with => ::Authlogic::Regex.email, :message => '^' + I18n.t('alchemy.contactform.validations.wrong_email_format'), :if => :email_is_filled
|
|
51
51
|
end
|
|
52
52
|
end
|
|
53
53
|
|
data/app/models/alchemy/page.rb
CHANGED
|
@@ -13,12 +13,12 @@ module Alchemy
|
|
|
13
13
|
has_and_belongs_to_many :to_be_sweeped_elements, :class_name => 'Alchemy::Element', :uniq => true, :join_table => 'alchemy_elements_alchemy_pages'
|
|
14
14
|
belongs_to :language
|
|
15
15
|
|
|
16
|
-
validates_presence_of :name, :message => '^'+
|
|
17
|
-
validates_presence_of :page_layout, :message => '^'+
|
|
18
|
-
validates_presence_of :parent_id, :message => '^'+
|
|
19
|
-
validates_length_of :urlname, :minimum => 3, :too_short =>
|
|
20
|
-
validates_uniqueness_of :urlname, :message => '^'+
|
|
21
|
-
validates :urlname, :exclusion => { :in => RESERVED_URLNAMES, :message => '^'+
|
|
16
|
+
validates_presence_of :name, :message => '^' + I18n.t("please enter a name")
|
|
17
|
+
validates_presence_of :page_layout, :message => '^' + I18n.t("Please choose a page layout."), :unless => :systempage?
|
|
18
|
+
validates_presence_of :parent_id, :message => '^' + I18n.t("No parent page was given."), :if => proc { Page.count > 1 }
|
|
19
|
+
validates_length_of :urlname, :minimum => 3, :too_short => I18n.t("urlname_to_short"), :if => :urlname_entered?
|
|
20
|
+
validates_uniqueness_of :urlname, :message => '^' + I18n.t("URL-Name already token"), :scope => 'language_id', :if => :urlname_entered?
|
|
21
|
+
validates :urlname, :exclusion => { :in => RESERVED_URLNAMES, :message => '^' + I18n.t("This urlname is reserved.") }
|
|
22
22
|
|
|
23
23
|
attr_accessor :do_not_autogenerate
|
|
24
24
|
attr_accessor :do_not_sweep
|
|
@@ -110,7 +110,7 @@ module Alchemy
|
|
|
110
110
|
end
|
|
111
111
|
|
|
112
112
|
def elements_grouped_by_cells
|
|
113
|
-
group = ActiveSupport::OrderedHash.new
|
|
113
|
+
group = ::ActiveSupport::OrderedHash.new
|
|
114
114
|
self.cells.each { |cell| group[cell] = cell.elements.not_trashed }
|
|
115
115
|
if element_names_not_in_cell.any?
|
|
116
116
|
group[Cell.new({:name => 'for_other_elements'})] = elements.not_trashed.not_in_cell
|
|
@@ -208,21 +208,21 @@ module Alchemy
|
|
|
208
208
|
# Returns the name of the creator of this page.
|
|
209
209
|
def creator
|
|
210
210
|
@page_creator ||= User.find_by_id(creator_id)
|
|
211
|
-
return
|
|
211
|
+
return I18n.t('unknown') if @page_creator.nil?
|
|
212
212
|
@page_creator.name
|
|
213
213
|
end
|
|
214
214
|
|
|
215
215
|
# Returns the name of the last updater of this page.
|
|
216
216
|
def updater
|
|
217
217
|
@page_updater = User.find_by_id(updater_id)
|
|
218
|
-
return
|
|
218
|
+
return I18n.t('unknown') if @page_updater.nil?
|
|
219
219
|
@page_updater.name
|
|
220
220
|
end
|
|
221
221
|
|
|
222
222
|
# Returns the name of the user currently editing this page.
|
|
223
223
|
def current_editor
|
|
224
224
|
@current_editor = User.find_by_id(locked_by)
|
|
225
|
-
return
|
|
225
|
+
return I18n.t('unknown') if @current_editor.nil?
|
|
226
226
|
@current_editor.name
|
|
227
227
|
end
|
|
228
228
|
|
|
@@ -251,21 +251,21 @@ module Alchemy
|
|
|
251
251
|
def humanized_status
|
|
252
252
|
case self.status
|
|
253
253
|
when 0
|
|
254
|
-
return
|
|
254
|
+
return I18n.t('page_status_visible_public_locked')
|
|
255
255
|
when 1
|
|
256
|
-
return
|
|
256
|
+
return I18n.t('page_status_visible_unpublic_locked')
|
|
257
257
|
when 2
|
|
258
|
-
return
|
|
258
|
+
return I18n.t('page_status_invisible_public_locked')
|
|
259
259
|
when 3
|
|
260
|
-
return
|
|
260
|
+
return I18n.t('page_status_invisible_unpublic_locked')
|
|
261
261
|
when 4
|
|
262
|
-
return
|
|
262
|
+
return I18n.t('page_status_visible_public')
|
|
263
263
|
when 5
|
|
264
|
-
return
|
|
264
|
+
return I18n.t('page_status_visible_unpublic')
|
|
265
265
|
when 6
|
|
266
|
-
return
|
|
266
|
+
return I18n.t('page_status_invisible_public')
|
|
267
267
|
when 7
|
|
268
|
-
return
|
|
268
|
+
return I18n.t('page_status_invisible_unpublic')
|
|
269
269
|
end
|
|
270
270
|
end
|
|
271
271
|
|
|
@@ -295,7 +295,7 @@ module Alchemy
|
|
|
295
295
|
end
|
|
296
296
|
|
|
297
297
|
def has_controller?
|
|
298
|
-
!
|
|
298
|
+
!PageLayout.get(self.page_layout).nil? && !PageLayout.get(self.page_layout)["controller"].blank?
|
|
299
299
|
end
|
|
300
300
|
|
|
301
301
|
def controller_and_action
|
|
@@ -307,7 +307,7 @@ module Alchemy
|
|
|
307
307
|
# Returns the self#page_layout description from config/alchemy/page_layouts.yml file.
|
|
308
308
|
def layout_description
|
|
309
309
|
return {} if self.systempage?
|
|
310
|
-
description =
|
|
310
|
+
description = PageLayout.get(self.page_layout)
|
|
311
311
|
if description.nil?
|
|
312
312
|
raise "Description could not be found for page layout named #{self.page_layout}. Please check page_layouts.yml file."
|
|
313
313
|
else
|
|
@@ -326,7 +326,7 @@ module Alchemy
|
|
|
326
326
|
# Page layout names are defined inside the config/alchemy/page_layouts.yml file.
|
|
327
327
|
# Translate the name in your config/locales language yml file.
|
|
328
328
|
def layout_display_name
|
|
329
|
-
|
|
329
|
+
I18n.t("alchemy.page_layout_names.#{page_layout}", :default => page_layout.camelize)
|
|
330
330
|
end
|
|
331
331
|
|
|
332
332
|
def renamed?
|
|
@@ -450,7 +450,7 @@ module Alchemy
|
|
|
450
450
|
new_child = Page.copy(child, {
|
|
451
451
|
:language_id => new_parent.language_id,
|
|
452
452
|
:language_code => new_parent.language_code,
|
|
453
|
-
:name => child.name + ' (' +
|
|
453
|
+
:name => child.name + ' (' + I18n.t('Copy') + ')',
|
|
454
454
|
:urlname => child.redirects_to_external? ? child.urlname : '',
|
|
455
455
|
:title => ''
|
|
456
456
|
})
|
|
@@ -470,17 +470,17 @@ module Alchemy
|
|
|
470
470
|
|
|
471
471
|
def self.link_target_options
|
|
472
472
|
options = [
|
|
473
|
-
[
|
|
473
|
+
[I18n.t('default', :scope => :link_target_options), '']
|
|
474
474
|
]
|
|
475
|
-
link_target_options =
|
|
475
|
+
link_target_options = Config.get(:link_target_options)
|
|
476
476
|
link_target_options.each do |option|
|
|
477
|
-
options << [
|
|
477
|
+
options << [I18n.t(option, :scope => :link_target_options), option]
|
|
478
478
|
end
|
|
479
479
|
options
|
|
480
480
|
end
|
|
481
481
|
|
|
482
482
|
def locker_name
|
|
483
|
-
return
|
|
483
|
+
return I18n.t('unknown') if self.locker.nil?
|
|
484
484
|
self.locker.name
|
|
485
485
|
end
|
|
486
486
|
|
|
@@ -2,17 +2,15 @@ module Alchemy
|
|
|
2
2
|
class Picture < ActiveRecord::Base
|
|
3
3
|
|
|
4
4
|
acts_as_fleximage do
|
|
5
|
-
image_directory
|
|
6
|
-
image_storage_format
|
|
7
|
-
require_image
|
|
8
|
-
missing_image_message
|
|
9
|
-
invalid_image_message
|
|
10
|
-
if
|
|
11
|
-
|
|
12
|
-
end
|
|
13
|
-
unless Alchemy::Config.get(:preprocess_image_resize).blank?
|
|
5
|
+
image_directory 'uploads/pictures'
|
|
6
|
+
image_storage_format Config.get(:image_store_format).to_sym
|
|
7
|
+
require_image true
|
|
8
|
+
missing_image_message I18n.t("missing_image")
|
|
9
|
+
invalid_image_message I18n.t("not a valid image")
|
|
10
|
+
output_image_jpg_quality Config.get(:output_image_jpg_quality) if Config.get(:image_output_format) == "jpg"
|
|
11
|
+
unless Config.get(:preprocess_image_resize).blank?
|
|
14
12
|
preprocess_image do |image|
|
|
15
|
-
image.resize
|
|
13
|
+
image.resize Config.get(:preprocess_image_resize)
|
|
16
14
|
end
|
|
17
15
|
end
|
|
18
16
|
end
|
|
@@ -28,14 +26,14 @@ module Alchemy
|
|
|
28
26
|
|
|
29
27
|
# Returning the filepath relative to Rails.root public folder.
|
|
30
28
|
def public_file_path
|
|
31
|
-
self.file_path.gsub("#{Rails.root}/public", '')
|
|
29
|
+
self.file_path.gsub("#{::Rails.root}/public", '')
|
|
32
30
|
end
|
|
33
31
|
|
|
34
32
|
def urlname
|
|
35
33
|
if self.name.blank?
|
|
36
34
|
"image_#{self.id}"
|
|
37
35
|
else
|
|
38
|
-
CGI.escape(self.name.gsub(/\.(gif|png|jpe?g|tiff?)/i, '').gsub(/\./, ' '))
|
|
36
|
+
::CGI.escape(self.name.gsub(/\.(gif|png|jpe?g|tiff?)/i, '').gsub(/\./, ' '))
|
|
39
37
|
end
|
|
40
38
|
end
|
|
41
39
|
|
|
@@ -48,7 +46,7 @@ module Alchemy
|
|
|
48
46
|
end
|
|
49
47
|
|
|
50
48
|
def humanized_name
|
|
51
|
-
(image_filename.to_s.downcase.gsub(/\.#{Regexp.quote(suffix)}$/, '')).humanize
|
|
49
|
+
(image_filename.to_s.downcase.gsub(/\.#{::Regexp.quote(suffix)}$/, '')).humanize
|
|
52
50
|
end
|
|
53
51
|
|
|
54
52
|
# Returning true if picture's width is greater than it's height
|
data/app/models/alchemy/user.rb
CHANGED
|
@@ -5,7 +5,7 @@ module Alchemy
|
|
|
5
5
|
stampable
|
|
6
6
|
acts_as_authentic do |c|
|
|
7
7
|
c.transition_from_restful_authentication = true
|
|
8
|
-
c.logged_in_timeout =
|
|
8
|
+
c.logged_in_timeout = Config.get(:auto_logout_time).minutes
|
|
9
9
|
end
|
|
10
10
|
|
|
11
11
|
has_many :folded_pages
|
|
@@ -14,7 +14,7 @@ module Alchemy
|
|
|
14
14
|
|
|
15
15
|
scope :admins, where(:role => 'admin')
|
|
16
16
|
|
|
17
|
-
ROLES =
|
|
17
|
+
ROLES = Config.get(:user_roles)
|
|
18
18
|
|
|
19
19
|
def role_symbols
|
|
20
20
|
[role.to_sym]
|
|
@@ -54,13 +54,13 @@ module Alchemy
|
|
|
54
54
|
end
|
|
55
55
|
|
|
56
56
|
def self.human_rolename(role)
|
|
57
|
-
|
|
57
|
+
I18n.t("user_roles.#{role}")
|
|
58
58
|
end
|
|
59
59
|
|
|
60
60
|
def self.genders_for_select
|
|
61
61
|
[
|
|
62
|
-
[
|
|
63
|
-
[
|
|
62
|
+
[I18n.t('male'), 'male'],
|
|
63
|
+
[I18n.t('female'), 'female']
|
|
64
64
|
]
|
|
65
65
|
end
|
|
66
66
|
|