alchemy_cms 2.1.4 → 2.1.5
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
|