zen 0.4.2 → 0.4.3
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/.gems +17 -15
- data/.gitignore +1 -1
- data/.travis.yml +1 -1
- data/MANIFEST +470 -0
- data/README.md +5 -3
- data/Rakefile +8 -6
- data/bin/zen +2 -7
- data/guide/asset_management.md +1 -0
- data/guide/autosaving_forms.md +1 -0
- data/guide/changelog.md +22 -0
- data/guide/faq.md +1 -0
- data/guide/getting_started.md +1 -0
- data/guide/hacking.md +1 -0
- data/guide/images/sections/revisions.png +0 -0
- data/guide/images/sections/revisions_diff.png +0 -0
- data/guide/images/sections/revisions_diff_multiple.png +0 -0
- data/guide/installation.md +4 -3
- data/guide/javascript.md +1 -0
- data/guide/javascript/zen_autosave.md +1 -0
- data/guide/javascript/zen_editor.md +1 -0
- data/guide/javascript/zen_form.md +1 -0
- data/guide/javascript/zen_hash.md +1 -0
- data/guide/javascript/zen_htmltable.md +1 -0
- data/guide/javascript/zen_tabs.md +1 -0
- data/guide/javascript/zen_window.md +1 -0
- data/guide/zen_compared.md +1 -0
- data/lib/zen.rb +10 -12
- data/lib/zen/event.rb +2 -2
- data/lib/zen/helper/controller.rb +13 -13
- data/lib/zen/helper/message.rb +3 -3
- data/lib/zen/helper/search.rb +4 -4
- data/lib/zen/helper/stacked_aspect.rb +9 -9
- data/lib/zen/html_diff.rb +151 -0
- data/lib/zen/language.rb +9 -7
- data/lib/zen/language/translation.rb +8 -8
- data/lib/zen/markup.rb +1 -1
- data/lib/zen/migrator.rb +2 -2
- data/lib/zen/model/helper.rb +4 -4
- data/lib/zen/model/plugin/events.rb +16 -16
- data/lib/zen/package.rb +2 -2
- data/lib/zen/package/all.rb +1 -1
- data/lib/zen/package/categories/lib/categories/controller/categories.rb +4 -4
- data/lib/zen/package/categories/lib/categories/controller/category_groups.rb +4 -4
- data/lib/zen/package/categories/lib/categories/helper/category.rb +3 -3
- data/lib/zen/package/categories/lib/categories/model/category.rb +9 -9
- data/lib/zen/package/categories/lib/categories/model/category_group.rb +9 -9
- data/lib/zen/package/comments/lib/comments/controller/comments.rb +4 -4
- data/lib/zen/package/comments/lib/comments/controller/comments_form.rb +2 -2
- data/lib/zen/package/comments/lib/comments/helper/comment.rb +1 -1
- data/lib/zen/package/comments/lib/comments/model/comment.rb +13 -13
- data/lib/zen/package/custom_fields/lib/custom_fields/blue_form_parameters.rb +1 -1
- data/lib/zen/package/custom_fields/lib/custom_fields/controller/custom_field_groups.rb +4 -4
- data/lib/zen/package/custom_fields/lib/custom_fields/controller/custom_field_types.rb +6 -6
- data/lib/zen/package/custom_fields/lib/custom_fields/controller/custom_fields.rb +5 -5
- data/lib/zen/package/custom_fields/lib/custom_fields/helper/custom_field.rb +3 -3
- data/lib/zen/package/custom_fields/lib/custom_fields/model/custom_field.rb +9 -9
- data/lib/zen/package/custom_fields/lib/custom_fields/model/custom_field_group.rb +9 -9
- data/lib/zen/package/custom_fields/lib/custom_fields/model/custom_field_type.rb +9 -9
- data/lib/zen/package/custom_fields/lib/custom_fields/model/custom_field_value.rb +8 -3
- data/lib/zen/package/custom_fields/migrations/1336171490_revisions.rb +41 -0
- data/lib/zen/package/dashboard/lib/dashboard/controller/dashboard.rb +6 -6
- data/lib/zen/package/dashboard/lib/dashboard/model/widget.rb +3 -3
- data/lib/zen/package/dashboard/lib/dashboard/widget.rb +12 -12
- data/lib/zen/package/extensions/lib/extensions/controller/extensions.rb +3 -3
- data/lib/zen/package/menus/lib/menus/controller/menu_items.rb +5 -5
- data/lib/zen/package/menus/lib/menus/controller/menus.rb +4 -4
- data/lib/zen/package/menus/lib/menus/helper/menu.rb +4 -4
- data/lib/zen/package/menus/lib/menus/model/menu.rb +11 -11
- data/lib/zen/package/menus/lib/menus/model/menu_item.rb +10 -10
- data/lib/zen/package/menus/lib/menus/public/admin/menus/js/lib/nested_sortables.js +13 -13
- data/lib/zen/package/menus/lib/menus/public/admin/menus/js/menu_items.js +1 -1
- data/lib/zen/package/sections/lib/sections.rb +19 -0
- data/lib/zen/package/sections/lib/sections/controller/revisions.rb +184 -0
- data/lib/zen/package/sections/lib/sections/controller/section_entries.rb +5 -5
- data/lib/zen/package/sections/lib/sections/controller/sections.rb +9 -6
- data/lib/zen/package/sections/lib/sections/helper/revision.rb +124 -0
- data/lib/zen/package/sections/lib/sections/helper/section.rb +17 -15
- data/lib/zen/package/sections/lib/sections/helper/section_frontend.rb +104 -6
- data/lib/zen/package/sections/lib/sections/language/en/revisions.rb +34 -0
- data/lib/zen/package/sections/lib/sections/language/en/sections.rb +1 -0
- data/lib/zen/package/sections/lib/sections/language/nl/revisions.rb +35 -0
- data/lib/zen/package/sections/lib/sections/language/nl/sections.rb +1 -0
- data/lib/zen/package/sections/lib/sections/model/revision.rb +76 -0
- data/lib/zen/package/sections/lib/sections/model/section.rb +9 -9
- data/lib/zen/package/sections/lib/sections/model/section_entry.rb +47 -12
- data/lib/zen/package/sections/lib/sections/view/admin/revisions/index.xhtml +89 -0
- data/lib/zen/package/sections/lib/sections/view/admin/section-entries/form.xhtml +1 -1
- data/lib/zen/package/sections/lib/sections/view/admin/section-entries/index.xhtml +14 -0
- data/lib/zen/package/sections/migrations/1335711557_revisions.rb +40 -0
- data/lib/zen/package/settings/lib/settings/controller/settings.rb +12 -4
- data/lib/zen/package/settings/lib/settings/setting.rb +6 -6
- data/lib/zen/package/users/lib/users/controller/user_groups.rb +4 -4
- data/lib/zen/package/users/lib/users/controller/users.rb +12 -12
- data/lib/zen/package/users/lib/users/helper/access.rb +1 -1
- data/lib/zen/package/users/lib/users/helper/acl.rb +4 -4
- data/lib/zen/package/users/lib/users/helper/users.rb +2 -2
- data/lib/zen/package/users/lib/users/model/permission.rb +1 -1
- data/lib/zen/package/users/lib/users/model/user.rb +11 -11
- data/lib/zen/package/users/lib/users/model/user_group.rb +9 -9
- data/lib/zen/package/users/lib/users/model/user_status.rb +2 -2
- data/lib/zen/public/admin/zen/css/general.css +54 -0
- data/lib/zen/public/admin/zen/css/messages.css +6 -3
- data/lib/zen/public/admin/zen/css/tables.css +10 -0
- data/lib/zen/public/admin/zen/images/icons/undo.png +0 -0
- data/lib/zen/public/admin/zen/js/lib/autosave.js +8 -8
- data/lib/zen/public/admin/zen/js/lib/base.js +2 -2
- data/lib/zen/public/admin/zen/js/lib/events.js +2 -2
- data/lib/zen/public/admin/zen/js/lib/form.js +7 -7
- data/lib/zen/public/admin/zen/js/lib/hash.js +7 -7
- data/lib/zen/public/admin/zen/js/lib/tabs.js +3 -3
- data/lib/zen/public/admin/zen/js/lib/window.js +1 -1
- data/lib/zen/security.rb +2 -2
- data/lib/zen/spec/helper.rb +3 -9
- data/lib/zen/spec/helper/capybara.rb +4 -4
- data/lib/zen/spec/helper/general.rb +1 -1
- data/lib/zen/spec/simplecov.rb +1 -5
- data/lib/zen/task/build.rake +22 -16
- data/lib/zen/task/db.rake +3 -2
- data/lib/zen/task/spelling.rake +10 -10
- data/lib/zen/task/test.rake +27 -19
- data/lib/zen/theme.rb +6 -6
- data/lib/zen/version.rb +1 -1
- data/spec/zen/all.rb +4 -0
- data/spec/zen/package/sections/controller/revisions.rb +235 -0
- data/spec/zen/package/sections/model/revision.rb +76 -0
- data/zen.gemspec +23 -21
- metadata +88 -29
- data/lib/zen/model/methods.rb +0 -27
- data/lib/zen/task/clean.rake +0 -20
- data/lib/zen/task/setup.rake +0 -4
- data/pkg/.gitkeep +0 -0
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
module Ramaze
|
|
2
|
+
module Helper
|
|
3
|
+
##
|
|
4
|
+
# Helper for the controller {Sections::Controller::Revisions}.
|
|
5
|
+
#
|
|
6
|
+
# @since 2012-04-30
|
|
7
|
+
#
|
|
8
|
+
module Revision
|
|
9
|
+
##
|
|
10
|
+
# Validates a revision ID. If the ID is invalid the user will be
|
|
11
|
+
# redirected back to the previous page and a message will be displayed.
|
|
12
|
+
#
|
|
13
|
+
# If the revision ID resulted in a valid Revision object then that object
|
|
14
|
+
# is returned.
|
|
15
|
+
#
|
|
16
|
+
# @since 2012-05-05
|
|
17
|
+
# @param [Fixnum|String] revision_id The ID of the revision.
|
|
18
|
+
# @return [Sections::Model::Revision]
|
|
19
|
+
#
|
|
20
|
+
def validate_revision(revision_id)
|
|
21
|
+
unless revision_id =~ /\d+/
|
|
22
|
+
message(:error, lang('revisions.errors.invalid'))
|
|
23
|
+
redirect_referer
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
revision = Sections::Model::Revision[revision_id]
|
|
27
|
+
|
|
28
|
+
if revision
|
|
29
|
+
return revision
|
|
30
|
+
else
|
|
31
|
+
message(:error, lang('revisions.errors.invalid'))
|
|
32
|
+
redirect_referer
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
##
|
|
37
|
+
# Returns a hash containing the difference between the values of two
|
|
38
|
+
# section entries.
|
|
39
|
+
#
|
|
40
|
+
# @since 2012-04-30
|
|
41
|
+
# @param [Sections::Model::SectionEntry] entry The entry for which to
|
|
42
|
+
# generate the diff.
|
|
43
|
+
# @param [Fixnum|String] old_revision The old revision ID.
|
|
44
|
+
# @param [Fixnum|String] new_revision The new revision ID.
|
|
45
|
+
# @return [Hash]
|
|
46
|
+
#
|
|
47
|
+
def revision_diff(entry, old_revision, new_revision)
|
|
48
|
+
validate_revision(old_revision)
|
|
49
|
+
validate_revision(new_revision)
|
|
50
|
+
|
|
51
|
+
old_values = entry.custom_fields_and_values(old_revision)
|
|
52
|
+
new_values = entry.custom_fields_and_values(new_revision)
|
|
53
|
+
diff = {}
|
|
54
|
+
|
|
55
|
+
old_values.each do |field_id, hash|
|
|
56
|
+
new_hash = new_values[field_id]
|
|
57
|
+
|
|
58
|
+
if hash[:value] != new_hash[:value]
|
|
59
|
+
diff[hash[:name]] = Zen::HTMLDiff.diff(
|
|
60
|
+
hash[:value],
|
|
61
|
+
new_hash[:value]
|
|
62
|
+
)
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
return diff
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
##
|
|
70
|
+
# Generates a radio button for an old revision ID.
|
|
71
|
+
#
|
|
72
|
+
# @since 2012-05-01
|
|
73
|
+
# @param [Fixnum|String] rev_id The revision ID.
|
|
74
|
+
# @param [Fixnum|String] current_rev_id The currently active old revision
|
|
75
|
+
# ID.
|
|
76
|
+
# @return [String]
|
|
77
|
+
#
|
|
78
|
+
def old_revision_radio(rev_id, current_rev_id)
|
|
79
|
+
g = Ramaze::Gestalt.new
|
|
80
|
+
attrs = {
|
|
81
|
+
:name => 'old_revision_id',
|
|
82
|
+
:id => "old_revision_id_#{rev_id}",
|
|
83
|
+
:type => 'radio',
|
|
84
|
+
:value => rev_id
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
if rev_id.to_i == current_rev_id.to_i
|
|
88
|
+
attrs[:checked] = 'checked'
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
g.input(attrs)
|
|
92
|
+
|
|
93
|
+
return g.to_s
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
##
|
|
97
|
+
# Generates a radio button for a new revision ID.
|
|
98
|
+
#
|
|
99
|
+
# @since 2012-05-01
|
|
100
|
+
# @param [Fixnum|String] rev_id The revision ID.
|
|
101
|
+
# @param [Fixnum|String] current_rev_id The currently active new revision
|
|
102
|
+
# ID.
|
|
103
|
+
# @return [String]
|
|
104
|
+
#
|
|
105
|
+
def new_revision_radio(rev_id, current_rev_id)
|
|
106
|
+
g = Ramaze::Gestalt.new
|
|
107
|
+
attrs = {
|
|
108
|
+
:name => 'new_revision_id',
|
|
109
|
+
:id => "new_revision_id_#{rev_id}",
|
|
110
|
+
:type => 'radio',
|
|
111
|
+
:value => rev_id
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
if rev_id.to_i == current_rev_id.to_i
|
|
115
|
+
attrs[:checked] = 'checked'
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
g.input(attrs)
|
|
119
|
+
|
|
120
|
+
return g.to_s
|
|
121
|
+
end
|
|
122
|
+
end # Revision
|
|
123
|
+
end # Helper
|
|
124
|
+
end # Ramaze
|
|
@@ -52,7 +52,7 @@ module Ramaze
|
|
|
52
52
|
##
|
|
53
53
|
# Creates or updates a set of custom fields for a given section entry.
|
|
54
54
|
#
|
|
55
|
-
# @since
|
|
55
|
+
# @since 2012-02-17
|
|
56
56
|
# @param [Sections::Model::SectionEntry] entry The entry for which to
|
|
57
57
|
# create or update the fields.
|
|
58
58
|
# @return [Hash] Hash containing any errors for the custom fields.
|
|
@@ -62,10 +62,9 @@ module Ramaze
|
|
|
62
62
|
|
|
63
63
|
field_values = {}
|
|
64
64
|
field_errors = {}
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
end
|
|
65
|
+
revision = entry.add_revision(
|
|
66
|
+
:user_id => (user.id rescue entry.user_id)
|
|
67
|
+
)
|
|
69
68
|
|
|
70
69
|
entry.custom_fields.each do |field|
|
|
71
70
|
key = "custom_field_value_#{field.id}"
|
|
@@ -80,14 +79,17 @@ module Ramaze
|
|
|
80
79
|
|
|
81
80
|
next unless request.POST.key?(key)
|
|
82
81
|
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
82
|
+
entry.add_custom_field_value(
|
|
83
|
+
:custom_field_id => field.id,
|
|
84
|
+
:value => request.POST[key],
|
|
85
|
+
:revision_id => revision.id
|
|
86
|
+
)
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
if field_errors.empty?
|
|
90
|
+
entry.update(:revision_id => revision.id)
|
|
91
|
+
else
|
|
92
|
+
revision.destroy
|
|
91
93
|
end
|
|
92
94
|
|
|
93
95
|
return field_errors
|
|
@@ -97,7 +99,7 @@ module Ramaze
|
|
|
97
99
|
# Redirects the user to the sections overview and shows a message
|
|
98
100
|
# informing the user that the section he/she tried to access is invalid.
|
|
99
101
|
#
|
|
100
|
-
# @since
|
|
102
|
+
# @since 2012-04-09
|
|
101
103
|
#
|
|
102
104
|
def redirect_invalid_section
|
|
103
105
|
message(:error, lang('sections.errors.invalid_section'))
|
|
@@ -109,7 +111,7 @@ module Ramaze
|
|
|
109
111
|
# section and shows a message informing the user that the section entry
|
|
110
112
|
# he/she tried to access is invalid.
|
|
111
113
|
#
|
|
112
|
-
# @since
|
|
114
|
+
# @since 2012-04-09
|
|
113
115
|
# @param [Fixnum] section_id The ID of the section.
|
|
114
116
|
#
|
|
115
117
|
def redirect_invalid_section_entry(section_id)
|
|
@@ -1,13 +1,101 @@
|
|
|
1
1
|
module Ramaze
|
|
2
2
|
module Helper
|
|
3
3
|
##
|
|
4
|
-
# Helper for retrieving section entries in your templates.
|
|
4
|
+
# Helper for retrieving section entries in your templates. See
|
|
5
|
+
# {Ramaze::Helper::SectionFrontend#get\_entries} and
|
|
6
|
+
# {Ramaze::Helper::SectionFrontend#get\_entry}.
|
|
5
7
|
#
|
|
6
8
|
# @since 0.3
|
|
7
9
|
#
|
|
8
10
|
module SectionFrontend
|
|
9
11
|
##
|
|
10
12
|
# Retrieves a number of entries for a given section ID or section slug.
|
|
13
|
+
# The return value is a Sequel dataset or an empty array in case no rows
|
|
14
|
+
# were found.
|
|
15
|
+
#
|
|
16
|
+
# Each row returned by this method is an instance of
|
|
17
|
+
# {Sections::Model::SectionEntry}. The custom fields and their values of
|
|
18
|
+
# each row are stored as a hash (the keys are symbols) in the "fields"
|
|
19
|
+
# attribute. For example, if you want to access the value of the "body"
|
|
20
|
+
# custom field you can do so as following:
|
|
21
|
+
#
|
|
22
|
+
# get_entries('pages').each do |page|
|
|
23
|
+
# puts page.fields[:body]
|
|
24
|
+
# end
|
|
25
|
+
#
|
|
26
|
+
# Because the returned value is a Sequel dataset paginating content is
|
|
27
|
+
# very easy. This can be done by setting the option `:paginate` to true
|
|
28
|
+
# and calling `#navigation()` on the result set to generate a list of
|
|
29
|
+
# pagination links:
|
|
30
|
+
#
|
|
31
|
+
# pages = get_entries('pages', :paginate => true)
|
|
32
|
+
#
|
|
33
|
+
# pages.each do |page|
|
|
34
|
+
# # ...
|
|
35
|
+
# end
|
|
36
|
+
#
|
|
37
|
+
# pages.navigation
|
|
38
|
+
#
|
|
39
|
+
# ## Lazy Loading
|
|
40
|
+
#
|
|
41
|
+
# To increase performance this method does not automatically retrieve
|
|
42
|
+
# related data such as comments and categories until they are used.
|
|
43
|
+
# However, if you plan on using this data for each returned row it is
|
|
44
|
+
# recommended to eager load this data as you'll otherwise have to execute
|
|
45
|
+
# a number of extra queries for each row.
|
|
46
|
+
#
|
|
47
|
+
# For example, this code block would generate a query for every row in
|
|
48
|
+
# order to retrieve user data:
|
|
49
|
+
#
|
|
50
|
+
# get_entries('pages').each do |page|
|
|
51
|
+
# page.user.email
|
|
52
|
+
# end
|
|
53
|
+
#
|
|
54
|
+
# To work around this problem you can set the option `:user` (or another
|
|
55
|
+
# option depending on the related data you plan on using) to `true`. Doing
|
|
56
|
+
# so will make it possible to retrieve all related rows in a single query:
|
|
57
|
+
#
|
|
58
|
+
# get_entries('pages', :user => true).each do |page|
|
|
59
|
+
# page.user.email
|
|
60
|
+
# end
|
|
61
|
+
#
|
|
62
|
+
# The following options can be set to `true` to enable eager loading
|
|
63
|
+
# (these are set to `false` by default):
|
|
64
|
+
#
|
|
65
|
+
# * comments
|
|
66
|
+
# * categories
|
|
67
|
+
# * user
|
|
68
|
+
#
|
|
69
|
+
# ## Disabling Markup
|
|
70
|
+
#
|
|
71
|
+
# By default each row's markup will be converted to HTML. If you don't
|
|
72
|
+
# need the markup you can disable this to speed things up a bit. This can
|
|
73
|
+
# be done by setting `:markup` to `false`:
|
|
74
|
+
#
|
|
75
|
+
# get_entries('pages', :markup => false).each do |page|
|
|
76
|
+
# page.title
|
|
77
|
+
# end
|
|
78
|
+
#
|
|
79
|
+
# ## Etanni Example
|
|
80
|
+
#
|
|
81
|
+
# Below is an example on how to use this method inside an Etanni template.
|
|
82
|
+
#
|
|
83
|
+
# <?r entries = get_entries('blog', :user => true) ?>
|
|
84
|
+
#
|
|
85
|
+
# <?r entries.each do |entry| ?>
|
|
86
|
+
# <article>
|
|
87
|
+
# <header>
|
|
88
|
+
# <h1>#{entry.title}</h1>
|
|
89
|
+
# <p>Written by #{entry.user.name}</p>
|
|
90
|
+
# </header>
|
|
91
|
+
#
|
|
92
|
+
# <div class="body">
|
|
93
|
+
# #{entry.fields[:body]}
|
|
94
|
+
# </div>
|
|
95
|
+
# </article>
|
|
96
|
+
# <?r end ?>
|
|
97
|
+
#
|
|
98
|
+
# #{entries.navigation}
|
|
11
99
|
#
|
|
12
100
|
# @example Retrieving all entries by a section's ID
|
|
13
101
|
# get_entries(2)
|
|
@@ -45,15 +133,15 @@ module Ramaze
|
|
|
45
133
|
# results should be paginated.
|
|
46
134
|
# @option options [String] :var The name of the query string item that
|
|
47
135
|
# contains the current page number.
|
|
48
|
-
# @option options [TrueClass|FalseClass] :
|
|
49
|
-
# custom fields and their values should be eager loaded. When set to
|
|
136
|
+
# @option options [TrueClass|FalseClass] :custom_field_values Whether or
|
|
137
|
+
# not custom fields and their values should be eager loaded. When set to
|
|
50
138
|
# false the hash ``fields`` on each entry will **not** be filled.
|
|
51
139
|
# @option options [TrueClass|FalseClass] :user Whether or not the user
|
|
52
140
|
# objects should be eager loaded for all entries. Set to ``false`` by
|
|
53
141
|
# default.
|
|
54
142
|
# @option options [TrueClass|FalseClass] :markup When set to true
|
|
55
143
|
# (default) the values of custom fields are processed using
|
|
56
|
-
# {Zen::Markup}
|
|
144
|
+
# {Zen::Markup}.
|
|
57
145
|
# @return [Mixed]
|
|
58
146
|
#
|
|
59
147
|
def get_entries(section, options = {})
|
|
@@ -127,12 +215,22 @@ module Ramaze
|
|
|
127
215
|
end
|
|
128
216
|
|
|
129
217
|
##
|
|
130
|
-
# Retrieves the details of a single section entry.
|
|
218
|
+
# Retrieves the details of a single section entry. Due to the nature of
|
|
219
|
+
# this method all related data such as user details and categories are
|
|
220
|
+
# lazy loaded.
|
|
131
221
|
#
|
|
132
|
-
# @example Get a single entry
|
|
222
|
+
# @example Get a single entry by the entry slug.
|
|
133
223
|
# entry = get_entry('home')
|
|
134
224
|
#
|
|
225
|
+
# puts entry.title
|
|
226
|
+
#
|
|
227
|
+
# @example Get an entry by its ID.
|
|
228
|
+
# entry = get_entry(10)
|
|
229
|
+
#
|
|
230
|
+
# puts entry.title
|
|
231
|
+
#
|
|
135
232
|
# @since 0.3
|
|
233
|
+
# @see Ramaze::Helper::SectionFrontend#get_entries()
|
|
136
234
|
# @param [String|Fixnum] entry The ID or slug of an entry to retrieve.
|
|
137
235
|
# @param [Hash] options A hash containing various options to customize
|
|
138
236
|
# the return value.
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
Zen::Language::Translation.add do |trans|
|
|
2
|
+
trans.language = 'en'
|
|
3
|
+
trans.name = 'revisions'
|
|
4
|
+
|
|
5
|
+
trans.translate do |t|
|
|
6
|
+
t['titles.index'] = 'Revisions'
|
|
7
|
+
t['titles.differences'] = 'Differences'
|
|
8
|
+
t['titles.revisions_for'] = 'Revisions for %s'
|
|
9
|
+
|
|
10
|
+
t['labels.old'] = 'Old'
|
|
11
|
+
t['labels.new'] = 'New'
|
|
12
|
+
t['labels.id'] = '#'
|
|
13
|
+
t['labels.user'] = 'User'
|
|
14
|
+
t['labels.created_at'] = 'Created at'
|
|
15
|
+
t['labels.restore'] = 'Restore'
|
|
16
|
+
t['labels.maximum'] = 'Revision amount'
|
|
17
|
+
|
|
18
|
+
t['descriptions.maximum'] = 'The maximum amount of revisions to keep.'
|
|
19
|
+
|
|
20
|
+
t['buttons.compare'] = 'Compare'
|
|
21
|
+
|
|
22
|
+
t['messages.no_differences'] = 'There are no differences between the ' \
|
|
23
|
+
'two specified revisions.'
|
|
24
|
+
|
|
25
|
+
t['messages.no_revisions'] = 'There are no revisions for this entry.'
|
|
26
|
+
|
|
27
|
+
t['success.restore'] = 'The revision has been restored'
|
|
28
|
+
t['errors.restore'] = 'The revision could not be restored'
|
|
29
|
+
t['errors.invalid'] = 'The specified revision is invalid'
|
|
30
|
+
|
|
31
|
+
t['permissions.show'] = 'Show revision'
|
|
32
|
+
t['permissions.restore'] = 'Restore revision'
|
|
33
|
+
end
|
|
34
|
+
end
|
|
@@ -27,6 +27,7 @@ Zen::Language::Translation.add do |trans|
|
|
|
27
27
|
t['tabs.general'] = 'General'
|
|
28
28
|
t['tabs.comment_settings'] = 'Comment Settings'
|
|
29
29
|
t['tabs.group_assignments'] = 'Group Assignments'
|
|
30
|
+
t['tabs.content'] = 'Content'
|
|
30
31
|
|
|
31
32
|
t['messages.no_sections'] = 'No sections have been created yet.'
|
|
32
33
|
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
Zen::Language::Translation.add do |trans|
|
|
2
|
+
trans.language = 'nl'
|
|
3
|
+
trans.name = 'revisions'
|
|
4
|
+
|
|
5
|
+
trans.translate do |t|
|
|
6
|
+
t['titles.index'] = 'Revisies'
|
|
7
|
+
t['titles.differences'] = 'Verschillen'
|
|
8
|
+
t['titles.revisions_for'] = 'Revisies voor %s'
|
|
9
|
+
|
|
10
|
+
t['labels.old'] = 'Oud'
|
|
11
|
+
t['labels.new'] = 'Nieuw'
|
|
12
|
+
t['labels.id'] = '#'
|
|
13
|
+
t['labels.user'] = 'Gebruiker'
|
|
14
|
+
t['labels.created_at'] = 'Aangemaak datum'
|
|
15
|
+
t['labels.restore'] = 'Herstel'
|
|
16
|
+
t['labels.maximum'] = 'Aantal revisies'
|
|
17
|
+
|
|
18
|
+
t['descriptions.maximum'] = 'Het maximale aantal revisies dat behouden ' \
|
|
19
|
+
'moet blijven.'
|
|
20
|
+
|
|
21
|
+
t['buttons.compare'] = 'Vergelijk'
|
|
22
|
+
|
|
23
|
+
t['messages.no_differences'] = 'Er zijn geen verschillen tussen de twee ' \
|
|
24
|
+
'geselecteerde revisies.'
|
|
25
|
+
|
|
26
|
+
t['messages.no_revisions'] = 'Er zijn geen revisies voor dit item.'
|
|
27
|
+
|
|
28
|
+
t['success.restore'] = 'De revisie is hersteld'
|
|
29
|
+
t['errors.restore'] = 'De revisie kon niet worden hersteld'
|
|
30
|
+
t['errors.invalid'] = 'De opgegeven revisie is ongeldig'
|
|
31
|
+
|
|
32
|
+
t['permissions.show'] = 'Revisie weergeven'
|
|
33
|
+
t['permissions.restore'] = 'Revisie herstellen'
|
|
34
|
+
end
|
|
35
|
+
end
|
|
@@ -27,6 +27,7 @@ Zen::Language::Translation.add do |trans|
|
|
|
27
27
|
t['tabs.general'] = 'Algemeen'
|
|
28
28
|
t['tabs.comment_settings'] = 'Reactie instellingen'
|
|
29
29
|
t['tabs.group_assignments'] = 'Groepen'
|
|
30
|
+
t['tabs.content'] = 'Inhoud'
|
|
30
31
|
|
|
31
32
|
t['messages.no_sections'] = 'Er konden geen secties worden gevonden.'
|
|
32
33
|
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
module Sections
|
|
2
|
+
module Model
|
|
3
|
+
##
|
|
4
|
+
# Model for storing section entry revisions and linking these to custom
|
|
5
|
+
# field values.
|
|
6
|
+
#
|
|
7
|
+
# @since 2012-04-29
|
|
8
|
+
#
|
|
9
|
+
class Revision < Sequel::Model
|
|
10
|
+
many_to_one :section_entry,
|
|
11
|
+
:class => 'Sections::Model::SectionEntry'
|
|
12
|
+
|
|
13
|
+
many_to_one :user,
|
|
14
|
+
:class => 'Users::Model::User'
|
|
15
|
+
|
|
16
|
+
one_to_many :custom_field_values,
|
|
17
|
+
:class => 'CustomFields::Model::CustomFieldValue'
|
|
18
|
+
|
|
19
|
+
plugin :timestamps, :create => :created_at
|
|
20
|
+
|
|
21
|
+
plugin :association_dependencies,
|
|
22
|
+
:custom_field_values => :delete
|
|
23
|
+
|
|
24
|
+
##
|
|
25
|
+
# Hook executed before inserting a new row. This hook is used to purge
|
|
26
|
+
# for a section entry if the amount of revisions for such an entry exceeds
|
|
27
|
+
# the maximum amount.
|
|
28
|
+
#
|
|
29
|
+
# @since 2012-05-01
|
|
30
|
+
#
|
|
31
|
+
def before_create
|
|
32
|
+
amount = Revision.filter(:section_entry_id => section_entry_id).count
|
|
33
|
+
max = get_setting(:maximum_revisions).value.to_i
|
|
34
|
+
|
|
35
|
+
if amount >= max
|
|
36
|
+
Revision.filter(:section_entry_id => section_entry_id) \
|
|
37
|
+
.order(:id.asc) \
|
|
38
|
+
.first \
|
|
39
|
+
.delete
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
super
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
##
|
|
46
|
+
# Hook that is executed before deleting the revision. This hook is used to
|
|
47
|
+
# prevent the last revision of an entry from being deleted.
|
|
48
|
+
#
|
|
49
|
+
# @since 2012-04-29
|
|
50
|
+
#
|
|
51
|
+
def before_destroy
|
|
52
|
+
entry = section_entry
|
|
53
|
+
_id = id
|
|
54
|
+
|
|
55
|
+
# Set the revision ID of the entry to the previous revision.
|
|
56
|
+
if entry.revision_id == _id
|
|
57
|
+
prev_revision = Revision \
|
|
58
|
+
.filter(:section_entry_id => entry.id) { id < _id } \
|
|
59
|
+
.limit(1) \
|
|
60
|
+
.first
|
|
61
|
+
|
|
62
|
+
if prev_revision
|
|
63
|
+
entry.update(:revision_id => prev_revision.id)
|
|
64
|
+
else
|
|
65
|
+
raise(
|
|
66
|
+
Sequel::Error::InvalidOperation,
|
|
67
|
+
'You can not delete the last revision'
|
|
68
|
+
)
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
super
|
|
73
|
+
end
|
|
74
|
+
end # Revision
|
|
75
|
+
end # Model
|
|
76
|
+
end # Sections
|