camaleon_cms 2.4.5.7 → 2.4.5.8

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

Potentially problematic release.


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

Files changed (39) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +24 -26
  3. data/app/apps/plugins/visibility_post/visibility_post_helper.rb +1 -1
  4. data/app/assets/javascripts/camaleon_cms/admin/_post.js +14 -0
  5. data/app/assets/javascripts/camaleon_cms/admin/custom_fields_form.js +84 -61
  6. data/app/assets/javascripts/camaleon_cms/admin/uploader/_media_manager.js.coffee +8 -1
  7. data/app/controllers/camaleon_cms/admin/settings/custom_fields_controller.rb +14 -0
  8. data/app/controllers/camaleon_cms/frontend_controller.rb +3 -3
  9. data/app/decorators/camaleon_cms/site_decorator.rb +5 -4
  10. data/app/helpers/camaleon_cms/plugins_helper.rb +1 -0
  11. data/app/models/camaleon_cms/media.rb +1 -1
  12. data/app/models/camaleon_cms/post.rb +2 -2
  13. data/app/models/camaleon_cms/post_comment.rb +1 -1
  14. data/app/models/camaleon_cms/post_tag.rb +1 -1
  15. data/app/models/camaleon_cms/post_type.rb +1 -1
  16. data/app/models/camaleon_cms/term_taxonomy.rb +1 -1
  17. data/app/models/camaleon_cms/widget/main.rb +1 -1
  18. data/app/models/concerns/camaleon_cms/custom_fields_read.rb +23 -1
  19. data/app/models/concerns/camaleon_cms/user_methods.rb +2 -1
  20. data/app/views/camaleon_cms/admin/posts/_sidebar.html.erb +6 -1
  21. data/app/views/camaleon_cms/admin/settings/custom_fields/_get_items.html.erb +9 -3
  22. data/app/views/camaleon_cms/admin/settings/custom_fields/_render_category_simple.html.erb +25 -0
  23. data/app/views/camaleon_cms/admin/settings/custom_fields/form.html.erb +7 -0
  24. data/app/views/layouts/camaleon_cms/admin.html.erb +0 -1
  25. data/config/routes/admin.rb +1 -0
  26. data/lib/camaleon_cms/version.rb +1 -1
  27. data/lib/plugin_routes.rb +5 -0
  28. data/spec/dummy/config/application.rb +2 -2
  29. data/spec/factories/post.rb +44 -0
  30. data/spec/factories/post_type.rb +4 -12
  31. data/spec/factories/site.rb +13 -3
  32. data/spec/factories/user.rb +19 -0
  33. data/spec/features/admin/custom_fields_spec.rb +1 -0
  34. data/spec/features/frontend/pages_spec.rb +56 -6
  35. data/spec/models/post_spec.rb +29 -6
  36. metadata +26 -13
  37. data/spec/dummy/db/test.sqlite3 +0 -0
  38. data/spec/dummy/public/favicon.ico +0 -0
  39. data/spec/support/custom_admin.html.erb +0 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c40d70430d7edd9132d9ed5529735b8421054db1
4
- data.tar.gz: f34b54e713ca8a1d88a8de55e1cd3b5d048cc08b
3
+ metadata.gz: a8976824a5f6bd62eb80d61020ac7beb62be9c42
4
+ data.tar.gz: 4703e813d777c89caa0b00fd6ae1b72677de7288
5
5
  SHA512:
6
- metadata.gz: 4bdd8d1ce6f4a4ceaddd893c5ca4cf4d478ca3f5ede911b4cf86935ab39fcf6637abd300073a69dd194666366c90e2919bf65fabdba7fe21771e3b159bb68eb9
7
- data.tar.gz: f6c8551c32f86b304a0b328b725b5bb0efcd9546784b56151ebe70aaaaaaf5e2ec62b1d0f2b7183f48e4593504bac472be12418796f2c940f162a4e6a67833f7
6
+ metadata.gz: efaf8c70638bcc23e864e88341519a6065667d8c85ba324b2a23d8b8a9c2cd319256254d974a133993bffc9914006e63dfa6eaa92cf749273ff45135f1e44b8d
7
+ data.tar.gz: 62d294f76ddaf5cd089296e0be55db5eaa8eaecb0463ab7335705e82702e0eefc38fc131020b6c0673381790df991929c60915102124f290568703aba2b4fdc3
data/README.md CHANGED
@@ -1,11 +1,12 @@
1
- ![](https://img.shields.io/badge/Rails-4%2B-green.svg)
2
- ![](https://img.shields.io/badge/Ruby-1.9.3%2B-green.svg)
1
+ ![](https://img.shields.io/badge/Rails-4.2%2B-green.svg)
2
+ ![](https://img.shields.io/badge/Ruby-2.2%2B-green.svg)
3
3
  ![](https://img.shields.io/badge/SQLITE-100%25-green.svg)
4
4
  ![](https://img.shields.io/badge/Mysql-100%25-green.svg)
5
5
  ![](https://img.shields.io/badge/Postgres-100%25-green.svg)
6
6
  ![](https://img.shields.io/badge/TDD-70%25-yellowgreen.svg)
7
7
  ![](https://img.shields.io/badge/DOCS-60%25-yellow.svg)
8
8
  ![](https://img.shields.io/badge/Support-Inmediate-green.svg)
9
+ [![Build Status](https://travis-ci.org/owen2345/camaleon-cms.svg?branch=master)](https://travis-ci.org/owen2345/camaleon-cms)
9
10
 
10
11
  ![](http://camaleon.tuzitio.com/media/132/logo2.png)
11
12
 
@@ -14,22 +15,19 @@
14
15
 
15
16
  [Demonstration](http://camaleon.tuzitio.com/plugins/demo_manage/)
16
17
 
17
-
18
- # Sponsor
19
-
20
- [ButterCMS](https://buttercms.com/?utm_source=github&utm_medium=sponsorship-link&utm_campaign=camaleon) is an API-based CMS and blogging platform built for developers:
21
18
 
22
- [![Foo](https://dl.dropboxusercontent.com/u/598519/buttercms-banners/b-on-y.png)](https://buttercms.com/?utm_source=github&utm_medium=sponsorship-banner&utm_campaign=camaleon)
19
+ # Sponsor
23
20
 
21
+ [ButterCMS](https://buttercms.com/?utm_source=github&utm_medium=sponsorship-link&utm_campaign=camaleon) is an API-based CMS and blogging platform built for developers.
24
22
 
25
23
  # Requirements
26
- * Rails 4.1+
24
+ * Rails 4.2+
27
25
  * MySQL 5+ or SQlite or PostgreSQL
28
- * Ruby 1.9.3+
26
+ * Ruby 2.2+
29
27
  * Imagemagick
30
28
 
31
29
  # Installation
32
- * Install Ruby on Rails 4.1+
30
+ * Install Ruby on Rails 4.2+
33
31
  [Visit here.](http://railsapps.github.io/installing-rails.html)
34
32
  * Create your rails project
35
33
 
@@ -55,14 +53,14 @@
55
53
  ```
56
54
  rails generate camaleon_cms:install
57
55
  ```
58
- * (Optional) Before continue you can configure your cms settings in (my_app/config/system.json), [here](config/system.json) you can see the full settings.
56
+ * (Optional) Before continue you can configure your CMS settings in (my_app/config/system.json), [here](config/system.json) you can see the full settings.
59
57
  * Create database structure
60
58
  ```
61
59
  rake camaleon_cms:generate_migrations
62
- # before run migrations you can customize copied migration files
60
+ # before running migrations you can customize copied migration files
63
61
  rake db:migrate
64
62
  ```
65
-
63
+
66
64
  * Start your server
67
65
 
68
66
  ```
@@ -73,7 +71,7 @@
73
71
 
74
72
  # Camaleon CMS (It adapts to your needs)
75
73
 
76
- Camaleon CMS is a dynamic and advanced content management system based on Ruby on Rails 4+ and Ruby 1.9.3+. This CMS is an alternative to wordpress for Ruby on Rails developers to manage advanced contents easily.
74
+ Camaleon CMS is a dynamic and advanced content management system based on Ruby on Rails 4.2+ and Ruby 2.2+. This CMS is an alternative to Wordpress for Ruby on Rails developers to manage advanced contents easily.
77
75
  Camaleon CMS is a flexible manager where you can build your custom content structure without coding anything by custom fields and custom contents type.
78
76
 
79
77
  To download or publish themes go to themes store:
@@ -83,13 +81,13 @@ To download or publish plugins go to plugins store:
83
81
  http://camaleon.tuzitio.com/store/plugins
84
82
 
85
83
  ## Camaleon CMS is FREE and Open source
86
- It was released on July, 2015 and tested previously with more than 20 projects by 6 months and on august 22, 2015 was published as a gem.
84
+ It was released on July, 2015 and tested previously with more than 20 projects by 6 months and on August 22, 2015 was published as a gem.
87
85
 
88
86
  ![](screenshot.png)
89
87
 
90
88
  ## With Camaleon you can do:
91
89
  * Multiples sites in the same installation
92
- * Multilanguage sites
90
+ * Multi-language sites
93
91
  * Design and create the architecture of your project without programming by dynamic contents and fields
94
92
  * Extend or customize the functionalities by plugins
95
93
  * Manage your content visualization by themes
@@ -100,12 +98,12 @@ It was released on July, 2015 and tested previously with more than 20 projects b
100
98
  - Widgets
101
99
  - Drag and Drop / Sortable / Multi level menus
102
100
  - Templates/Layouts for pages
103
- - Easy migration from wordpress
101
+ - Easy migration from Wordpress
104
102
 
105
103
  ## Some features are:
106
104
  * Integrate into existent Ruby on Rails Projects
107
105
  * Easy administration
108
- Camaleon CMS permit you to adapt the CMS to all your needs and not you adapt to the CMS.
106
+ Camaleon CMS permits you to adapt the CMS to all your needs and not you adapt to the CMS.
109
107
  I.E. you can create your custom architecture with all attributes that you need for each kind of content.
110
108
  * Security
111
109
  - Remote code execution
@@ -122,16 +120,16 @@ I.E. you can create your custom architecture with all attributes that you need f
122
120
  - Customize your content visualization for Desktop, Mobile and Tablet
123
121
  * SEO & HTML5
124
122
  - Sitemap generations
125
- - Seo Configuration
123
+ - Seo configuration
126
124
  - Seo for social media
127
- - All generated content is compatible with HTML5 and bootstrap 3
125
+ - All generated content is compatible with HTML5 and Bootstrap 3
128
126
 
129
127
  ## Camaleon CMS come with basic and important plugins like:
130
- * Ecommerce
131
- * Visibility content
128
+ * E-commerce
129
+ * Visibility of content
132
130
  * Web attack control
133
131
  * Contact forms
134
- * Cache content
132
+ * Content cache
135
133
  * Content reorder
136
134
  * many others [here.](https://github.com/owen2345/Camaleon-CMS-Sample)
137
135
 
@@ -146,7 +144,7 @@ If you need support, need some extra functionality or need plugins, please conta
146
144
  * Email: owenperedo@gmail.com
147
145
  * Skype: owen-2345
148
146
  * Stack Overflow: Use "camaleon" as tag to ask questions related to this CMS (don't forget to include cms version + rails version).
149
- * Guitter: https://gitter.im/camaleoncms/Lobby
147
+ * Gitter: https://gitter.im/camaleoncms/Lobby
150
148
 
151
149
 
152
150
  ## Author
@@ -170,7 +168,7 @@ RAILS_ENV=test bundle exec rake app:db:test:prepare
170
168
 
171
169
  * Run testing
172
170
  ```
173
- rspec
171
+ bundle exec rspec
174
172
  ```
175
173
 
176
174
  ## Contributing
@@ -178,7 +176,7 @@ rspec
178
176
  * Create a branch (git checkout -b my_feature_branch)
179
177
  * Commit your changes (git commit -am "Added a sweet feature")
180
178
  * Push to the branch (git push origin my_feature_branch)
181
- * Create a pull request from your branch into master (Please be sure to provide enough detail for us to cipher what this change is doing)
179
+ * Create a pull request from your branch into master (Please be sure to provide enough detail for us to understand what this change is doing)
182
180
 
183
181
  Visit the web site for more information: http://camaleon.tuzitio.com/
184
182
 
@@ -29,7 +29,7 @@ module Plugins::VisibilityPost::VisibilityPostHelper
29
29
  post = args[:post]
30
30
  return args[:flag] = false if post.published_at.present? && post.published_at > Time.now
31
31
  return if post.visibility != 'private'
32
- args[:flag] = false unless signin? && post.visibility_value.split(",").include?(cama_current_user.get_role(current_site).id)
32
+ args[:flag] = false unless signin? && post.visibility_value.split(",").include?(current_site.visitor_role)
33
33
  end
34
34
 
35
35
  def plugin_visibility_extra_columns(args)
@@ -236,6 +236,20 @@ function cama_init_post(obj) {
236
236
  return false;
237
237
  });
238
238
 
239
+ $form.on("change", ".list-categories input", function () {
240
+ showLoading();
241
+ $.get(
242
+ $form.find("#post_add_new_category").data('fields-reload-url'), {
243
+ categories: $form.find("#post_right_bar .list-categories input[name='categories[]']:checked").map(function(i, el){ return $(this).val(); }).get(),
244
+ post_id: post_id
245
+ },
246
+ function (res) {
247
+ $form.find('.c-field-group').remove();
248
+ $form.find('.panel .panel-default').after(res);
249
+ hideLoading();
250
+ });
251
+ });
252
+
239
253
  // sidebar toggle
240
254
  //$("#admin_content #post_right_bar-toggle").on("click", function () {
241
255
  // $("#post_right_bar").is(":visible") ? $("#post_right_bar").hide() : $("#post_right_bar").show();
@@ -1,71 +1,94 @@
1
1
  // add actions to assign custom fields to any model selected
2
2
  jQuery(function($){
3
- var panel = $("#cama_custom_field_form");
4
- var group_class_name = panel.attr("data-group_class_name");
5
- var $content_fields = $( "#sortable-fields", panel);
6
- $content_fields.sortable({
7
- handle: ".panel-sortable"
8
- });
9
- var slugger_count = $content_fields.children().length;
10
- cama_custom_field_set_slug();
3
+ var panel = $("#cama_custom_field_form");
4
+ var group_class_name = panel.attr("data-group_class_name");
5
+ var $content_fields = $( "#sortable-fields", panel);
6
+ $content_fields.sortable({
7
+ handle: ".panel-sortable"
8
+ });
9
+ var slugger_count = $content_fields.children().length;
10
+ cama_custom_field_set_slug();
11
11
 
12
- $("#content-items-default > a", panel).click(function(){
13
- var href = $(this).attr('href');
14
- showLoading();
15
- $.post(href, function(html){
16
- hideLoading();
17
- var li = $('<li class="item">' + html + '</li>');
18
- $content_fields.append(li);
19
- cama_custom_field_set_slug(li);
20
- var title_field = li.find("input.text-title");
21
- title_field.val(title_field.val() + '-' + (slugger_count ++));
22
- title_field.trigger("keyup");
23
- $('[data-toggle="tooltip"], a[title!=""]', $content_fields).tooltip();
24
- });
25
- return false;
12
+ $("#content-items-default > a", panel).click(function(){
13
+ var href = $(this).attr('href');
14
+ showLoading();
15
+ $.post(href, function(html){
16
+ hideLoading();
17
+ var li = $('<li class="item">' + html + '</li>');
18
+ $content_fields.append(li);
19
+ cama_custom_field_set_slug(li);
20
+ var title_field = li.find("input.text-title");
21
+ title_field.val(title_field.val() + '-' + (slugger_count ++));
22
+ title_field.trigger("keyup");
23
+ $('[data-toggle="tooltip"], a[title!=""]', $content_fields).tooltip();
26
24
  });
25
+ return false;
26
+ });
27
27
 
28
- panel.on("click", ".panel-delete", function(){
29
- var parent = $(this).parents(".item:first");
30
- if(confirm(I18n("msg.delete_item"))){
31
- parent.remove()
32
- }
33
- return false;
34
- });
28
+ panel.on("click", ".panel-delete", function(){
29
+ var parent = $(this).parents(".item:first");
30
+ if(confirm(I18n("msg.delete_item"))){
31
+ parent.remove()
32
+ }
33
+ return false;
34
+ });
35
35
 
36
- $('#select_assign_group', panel).change(function(){
37
- var option = $(this).find('option:checked');
38
- if(option.attr('value') == '_post_simple'){
39
- $('#select_post_simple', panel).show().removeAttr('disabled');
40
- }else{
41
- $('#select_post_simple', panel).hide().attr('disabled','disabled');
42
- }
43
- var txt_help = option.data('help');
44
- if(txt_help) txt_help = '<div class="alert alert-info"><i class="fa fa-info-circle"></i>&nbsp; ' + txt_help + ' </div>';
45
- $('#select_assign_group_help', panel).html(txt_help);
46
- $('#select_assign_group_caption', panel).val(option.parent('optgroup').attr("label") + ' ' + option.text());
47
- }).val((group_class_name.search("Post,") == 0) ? '_post_simple': group_class_name).trigger('change');
36
+ $('#select_assign_group', panel).change(function(){
37
+ var option = $(this).find('option:checked');
38
+ _change_additional_select(option);
39
+ var txt_help = option.data('help');
40
+ if(txt_help) txt_help = '<div class="alert alert-info"><i class="fa fa-info-circle"></i>&nbsp; ' + txt_help + ' </div>';
41
+ $('#select_assign_group_help', panel).html(txt_help);
42
+ $('#select_assign_group_caption', panel).val(option.parent('optgroup').attr("label") + ' ' + option.text());
43
+ }).val(_search_group_class_name(group_class_name)).trigger('change');
44
+
45
+ $('#select_post_simple', panel).change(function(){
46
+ var option = $(this).find('option:checked');
47
+ var txt_help = option.data('help');
48
+ if(txt_help) txt_help = '<div class="alert alert-info"><i class="fa fa-info-circle"></i>&nbsp; ' + txt_help + ' </div>';
49
+ $('#select_assign_group_help', panel).html(txt_help);
50
+ $('#select_assign_group_caption', panel).val(option.parent('optgroup').attr("label") + ': ' + option.text());
51
+ }).val(group_class_name).trigger('change');
48
52
 
49
- $('#select_post_simple', panel).change(function(){
50
- var option = $(this).find('option:checked');
51
- var txt_help = option.data('help');
52
- if(txt_help) txt_help = '<div class="alert alert-info"><i class="fa fa-info-circle"></i>&nbsp; ' + txt_help + ' </div>';
53
- $('#select_assign_group_help', panel).html(txt_help);
54
- $('#select_assign_group_caption', panel).val(option.parent('optgroup').attr("label") + ': ' + option.text());
55
- }).val(group_class_name).trigger('change');
53
+ $('#select_category_simple', panel).change(function(){
54
+ var option = $(this).find('option:checked');
55
+ var txt_help = option.data('help');
56
+ if(txt_help) txt_help = '<div class="alert alert-info"><i class="fa fa-info-circle"></i>&nbsp; ' + txt_help + ' </div>';
57
+ $('#select_assign_group_help', panel).html(txt_help);
58
+ $('#select_assign_group_caption', panel).val(option.parent('optgroup').attr("label") + ': ' + option.text());
59
+ }).val(group_class_name).trigger('change');
56
60
 
57
- function cama_custom_field_set_slug(_panel){
58
- $('.text-slug:not(.runned)', _panel || panel).each(function(){
59
- var $parent = $(this).parents('.panel-item');
60
- var $label = $parent.find('.span-title');
61
- $(this).slugify($parent.find('.text-title'), {
62
- slugFunc: function(str, originalFunc) {
63
- $label.html(str);
64
- return originalFunc(str);
65
- }
66
- }
67
- );
68
- $(this).addClass('runned')
69
- });
61
+ function _change_additional_select(option){
62
+ var option_value = option.attr('value'),
63
+ additional_options = ['_post_simple', '_category_simple'];
64
+
65
+ for (key in additional_options) {
66
+ if (option_value === additional_options[key]){
67
+ $('#select'+additional_options[key], panel).show().removeAttr('disabled');
68
+ }else{
69
+ $('#select'+additional_options[key], panel).hide().attr('disabled','disabled');
70
+ }
70
71
  }
72
+ }
73
+
74
+ function _search_group_class_name(group_class_name) {
75
+ if (group_class_name.search("Post,") == 0) group_class_name = '_post_simple';
76
+ if (group_class_name.search("Category_Post,") == 0) group_class_name = '_category_simple';
77
+ return group_class_name;
78
+ }
79
+
80
+ function cama_custom_field_set_slug(_panel){
81
+ $('.text-slug:not(.runned)', _panel || panel).each(function(){
82
+ var $parent = $(this).parents('.panel-item');
83
+ var $label = $parent.find('.span-title');
84
+ $(this).slugify($parent.find('.text-title'), {
85
+ slugFunc: function(str, originalFunc) {
86
+ $label.html(str);
87
+ return originalFunc(str);
88
+ }
89
+ }
90
+ );
91
+ $(this).addClass('runned')
92
+ });
93
+ }
71
94
  });
@@ -5,6 +5,11 @@ window["cama_init_media"] = (media_panel) ->
5
5
  media_link_tab_upload = media_panel.find(".media_file_info_col .nav-tabs .link_media_upload")
6
6
 
7
7
  ################ visualize item
8
+ # loading last opened folder on current page
9
+ media_panel.ready ->
10
+ f = $('body').data('last-folder')
11
+ media_panel.trigger('navigate_to', {folder: f})
12
+
8
13
  # return the data of this file
9
14
  file_data = (item)->
10
15
  data = item.data('eval-data') || eval("("+item.find(".data_value").val()+")")
@@ -128,7 +133,9 @@ window["cama_init_media"] = (media_panel) ->
128
133
  f = media_panel.attr("data-folder")+"/"+$(this).attr("data-key")
129
134
  if $(this).attr("data-key").search('/') >= 0
130
135
  f = $(this).attr("data-key")
131
- media_panel.trigger("navigate_to", {folder: f.replace(/\/{2,}/g, '/')})
136
+ f = f.replace(/\/{2,}/g, '/')
137
+ media_panel.trigger("navigate_to", {folder: f})
138
+ $('body').attr('data-last-folder', f) # remembers last opened folder on current page
132
139
  )
133
140
  media_panel.bind("update_breadcrumb", ->
134
141
  folder = media_panel.attr("data-folder").replace("//", "/")
@@ -63,6 +63,20 @@ class CamaleonCms::Admin::Settings::CustomFieldsController < CamaleonCms::Admin:
63
63
  render json: json
64
64
  end
65
65
 
66
+ def list
67
+ p = params.permit(:post_type, :post_id, :categories => [])
68
+ args = {}
69
+ if p[:post_id].present?
70
+ post = @current_site.the_post(p[:post_id].to_i)
71
+ post.update_categories(p[:categories])
72
+ else
73
+ post = CamaleonCms::Post.new
74
+ post.taxonomy_id = p[:post_type].to_i
75
+ args[:cat_ids] = p[:categories]
76
+ end
77
+ render partial: 'camaleon_cms/admin/settings/custom_fields/render', :locals => {record: post, field_groups: post.get_field_groups(args), show_shortcode: true}
78
+ end
79
+
66
80
  private
67
81
 
68
82
  def set_post_data
@@ -162,21 +162,21 @@ class CamaleonCms::FrontendController < CamaleonCms::CamaleonController
162
162
  @post = post_or_slug_or_id
163
163
  end
164
164
 
165
- unless @post.present?
165
+ @post = @post.try(:decorate)
166
+ if !@post.present? || !@post.can_visit?
166
167
  if params[:format] == 'html' || !params[:format].present?
167
168
  page_not_found()
168
169
  else
169
170
  head 404
170
171
  end
171
172
  else
172
- @post = @post.decorate
173
173
  @object = @post
174
174
  @cama_visited_post = @post
175
175
  @post_type = @post.the_post_type
176
176
  @comments = @post.the_comments
177
177
  @categories = @post.the_categories
178
178
  @post.increment_visits!
179
- # todo: can_visit? if not redirect home page
179
+
180
180
  home_page = @_site_options[:home_page] rescue nil
181
181
  if lookup_context.template_exists?("page_#{@post.id}")
182
182
  r_file = "page_#{@post.id}"
@@ -112,17 +112,18 @@ class CamaleonCms::SiteDecorator < CamaleonCms::TermTaxonomyDecorator
112
112
  # draw languages configured for this site
113
113
  # list_class: (String) Custom css classes for ul list
114
114
  # current_page: (boolean) true: link with translation to current url, false: link with translation to root url
115
- def draw_languages(list_class = "language_list list-inline pull-right", current_page = false, current_class = "current_l")
115
+ # block permit to render custom link label, default: flag icon
116
+ def draw_languages(list_class = "language_list list-inline pull-right", current_page = false, current_class = "current_l", &block)
116
117
  lan = object.get_languages
117
118
  return if lan.size < 2
118
119
  res = ["<ul class='#{list_class}'>"]
119
120
  lan.each do |lang|
120
121
  path = lang.to_s+'.png'
121
- img = "<img src='#{h.asset_path("camaleon_cms/language/#{path}")}'/>"
122
- res << "<li class='#{ current_class if I18n.locale.to_s == lang.to_s}'> <a href='#{h.cama_url_to_fixed(current_page ? "url_for" : "cama_root_url", {locale: lang, cama_set_language: lang})}'>#{img}</a> </li>"
122
+ label = (block ? h.capture(lang, I18n.locale.to_s == lang.to_s, &block) : "<img src='#{h.asset_path("camaleon_cms/language/#{path}")}'/>")
123
+ res << "<li class='#{ current_class if I18n.locale.to_s == lang.to_s}'> <a href='#{h.cama_url_to_fixed(current_page ? "url_for" : "cama_root_url", {locale: lang, cama_set_language: lang})}'>#{label}</a> </li>"
123
124
  end
124
125
  res << "</ul>"
125
- res.join("")
126
+ res.join("").html_safe
126
127
  end
127
128
 
128
129
  # return Array of frontend languages configured for this site
@@ -1,4 +1,5 @@
1
1
  module CamaleonCms::PluginsHelper
2
+ include CamaleonCms::SiteHelper
2
3
  # load all plugins + theme installed for current site
3
4
  # METHOD IGNORED (is a partial solution to avoid load helpers and cache it for all sites)
4
5
  # this method try to load helpers for each request without caching
@@ -42,7 +42,7 @@ class CamaleonCms::Media < ActiveRecord::Base
42
42
  _p = []
43
43
  folder_path.split('/').each do |f_name|
44
44
  _path = ('/'+_p.join('/')).cama_fix_media_key
45
- coll.only_folder.where(name: f_name, folder_path: _path).first_or_create!() if "#{_path}/#{f_name}".cama_fix_media_key != '/'
45
+ coll.only_folder.where(name: f_name, folder_path: _path).first_or_create() if "#{_path}/#{f_name}".cama_fix_media_key != '/'
46
46
  _p.push(f_name)
47
47
  end
48
48
  end
@@ -43,7 +43,7 @@ class CamaleonCms::Post < CamaleonCms::PostDefault
43
43
  has_many :drafts, ->{where(status: 'draft_child')}, class_name: "CamaleonCms::Post", foreign_key: :post_parent, dependent: :destroy
44
44
  has_many :children, class_name: "CamaleonCms::Post", foreign_key: :post_parent, dependent: :destroy, primary_key: :id
45
45
 
46
- belongs_to :owner, class_name: PluginRoutes.static_system_info['user_model'].presence || 'CamaleonCms::User', foreign_key: :user_id
46
+ belongs_to :owner, class_name: CamaManager.get_user_class_name, foreign_key: :user_id
47
47
  belongs_to :parent, class_name: "CamaleonCms::Post", foreign_key: :post_parent
48
48
  belongs_to :post_type, class_name: "CamaleonCms::PostType", foreign_key: :taxonomy_id, inverse_of: :posts
49
49
 
@@ -245,7 +245,7 @@ class CamaleonCms::Post < CamaleonCms::PostDefault
245
245
  end
246
246
 
247
247
  # return the quantity of comments for this post
248
- # TODO comments count
248
+ # TODO comments count to move into cache counter
249
249
  def total_comments
250
250
  self.get_meta("comments_count", 0).to_i
251
251
  end
@@ -11,7 +11,7 @@ class CamaleonCms::PostComment < ActiveRecord::Base
11
11
  has_many :children, class_name: "CamaleonCms::PostComment", foreign_key: :comment_parent, dependent: :destroy
12
12
  belongs_to :post, class_name: "CamaleonCms::Post", foreign_key: :post_id
13
13
  belongs_to :parent, class_name: "CamaleonCms::PostComment", foreign_key: :comment_parent
14
- belongs_to :user, class_name: PluginRoutes.static_system_info['user_model'].presence || 'CamaleonCms::User', foreign_key: :user_id
14
+ belongs_to :user, class_name: CamaManager.get_user_class_name, foreign_key: :user_id
15
15
 
16
16
  default_scope {order("#{CamaleonCms::PostComment.table_name}.created_at DESC")}
17
17
 
@@ -3,5 +3,5 @@ class CamaleonCms::PostTag < CamaleonCms::TermTaxonomy
3
3
  cama_define_common_relationships('PostTag')
4
4
  has_many :posts, foreign_key: :objectid, through: :term_relationships, :source => :objects
5
5
  belongs_to :post_type, class_name: "CamaleonCms::PostType", foreign_key: :parent_id, inverse_of: :post_tags
6
- belongs_to :owner, class_name: PluginRoutes.static_system_info['user_model'].presence || 'CamaleonCms::User', foreign_key: :user_id
6
+ belongs_to :owner, class_name: CamaManager.get_user_class_name, foreign_key: :user_id
7
7
  end
@@ -10,7 +10,7 @@ class CamaleonCms::PostType < CamaleonCms::TermTaxonomy
10
10
  has_many :posts_draft, class_name: "CamaleonCms::Post", foreign_key: :taxonomy_id, dependent: :destroy, source: :drafts, inverse_of: :post_type
11
11
  has_many :field_group_taxonomy, -> {where("object_class LIKE ?","PostType_%")}, :class_name => "CamaleonCms::CustomField", foreign_key: :objectid, dependent: :destroy
12
12
 
13
- belongs_to :owner, class_name: PluginRoutes.static_system_info['user_model'].presence || 'CamaleonCms::User', foreign_key: :user_id
13
+ belongs_to :owner, class_name: CamaManager.get_user_class_name, foreign_key: :user_id
14
14
  belongs_to :site, :class_name => "CamaleonCms::Site", foreign_key: :parent_id
15
15
 
16
16
  scope :visible_menu, -> {where(term_group: nil)}
@@ -25,7 +25,7 @@ class CamaleonCms::TermTaxonomy < ActiveRecord::Base
25
25
  has_many :term_relationships, :class_name => "CamaleonCms::TermRelationship", :foreign_key => :term_taxonomy_id, dependent: :destroy
26
26
  # has_many :posts, foreign_key: :objectid, through: :term_relationships, :source => :objects
27
27
  belongs_to :parent, class_name: "CamaleonCms::TermTaxonomy", foreign_key: :parent_id
28
- belongs_to :owner, class_name: PluginRoutes.static_system_info['user_model'].presence || 'CamaleonCms::User', foreign_key: :user_id
28
+ belongs_to :owner, class_name: CamaManager.get_user_class_name, foreign_key: :user_id
29
29
 
30
30
  # return all children taxonomy
31
31
  # sample: sub categories of a category
@@ -9,7 +9,7 @@ class CamaleonCms::Widget::Main < CamaleonCms::TermTaxonomy
9
9
  # renderer: string (path to the template for render this widget)
10
10
 
11
11
  has_many :metas, ->{ where(object_class: 'Widget::Main')}, :class_name => "CamaleonCms::Meta", foreign_key: :objectid, dependent: :destroy
12
- belongs_to :owner, class_name: PluginRoutes.static_system_info['user_model'].presence || 'CamaleonCms::User', foreign_key: :user_id
12
+ belongs_to :owner, class_name: CamaManager.get_user_class_name, foreign_key: :user_id
13
13
  belongs_to :site, :class_name => "CamaleonCms::Site", foreign_key: :parent_id
14
14
 
15
15
  has_many :assigned, class_name: "CamaleonCms::Widget::Assigned", foreign_key: :visibility, dependent: :destroy
@@ -33,7 +33,19 @@ module CamaleonCms::CustomFieldsRead extend ActiveSupport::Concern
33
33
  when 'Category','PostTag'
34
34
  self.post_type.get_field_groups(class_name)
35
35
  when 'Post'
36
- CamaleonCms::CustomFieldGroup.where("(objectid = ? AND object_class = ?) OR (objectid = ? AND object_class = ?)", self.id || -1, class_name, self.post_type.id, "PostType_#{class_name}")
36
+ if self.term_relationships.size.zero? && args[:cat_ids].nil?
37
+ CamaleonCms::CustomFieldGroup.where("(objectid = ? AND object_class = ?) OR (objectid = ? AND object_class = ?)", self.id || -1, class_name, self.post_type.id, "PostType_#{class_name}")
38
+ else
39
+ cat_ids = self.categories.map(&:id)
40
+ cat_ids += args[:cat_ids] unless args[:cat_ids].nil?
41
+ cat_ids += CamaleonCms::Category.find(cat_ids).map {|category| _category_parents_ids(category)}.flatten.uniq
42
+ CamaleonCms::CustomFieldGroup.where("(objectid = ? AND object_class = ?) OR
43
+ (objectid = ? AND object_class = ?) OR
44
+ (objectid IN (?) AND object_class = ?)",
45
+ self.id || -1, class_name,
46
+ self.post_type.id, "PostType_#{class_name}",
47
+ cat_ids, "Category_#{class_name}")
48
+ end
37
49
  when 'NavMenuItem'
38
50
  self.main_menu.custom_field_groups
39
51
  when 'PostType'
@@ -285,4 +297,14 @@ module CamaleonCms::CustomFieldsRead extend ActiveSupport::Concern
285
297
  self.site
286
298
  end
287
299
  end
300
+
301
+ def _category_parents_ids(category)
302
+ @parents ||= []
303
+ if category.parent.nil?
304
+ return @parents
305
+ else
306
+ @parents << category.parent.id
307
+ _category_parents_ids(category.parent)
308
+ end
309
+ end
288
310
  end
@@ -15,7 +15,8 @@ module CamaleonCms::UserMethods extend ActiveSupport::Concern
15
15
  # relations
16
16
  cama_define_common_relationships('User')
17
17
  has_many :all_posts, class_name: "CamaleonCms::Post", foreign_key: :user_id
18
- has_many :all_comments, class_name: "CamaleonCms::PostComment"
18
+ has_many :all_comments, class_name: 'CamaleonCms::PostComment'
19
+ belongs_to :site, class_name: 'CamaleonCms::Site'
19
20
 
20
21
  #scopes
21
22
  scope :admin_scope, -> { where(:role => 'admin') }
@@ -90,7 +90,12 @@
90
90
  <div class="panel-heading">
91
91
  <h3 class="panel-title"><%= t('camaleon_cms.admin.post_type.categories')%> <em class="text-danger">*</em></h3>
92
92
  <ul class="panel-controls">
93
- <li><a id="post_add_new_category" data-reload-url="<%= list_cama_admin_post_type_categories_path(@post_type.id) %>" href="<%= cama_admin_post_type_categories_path(@post_type.id, cama_body_class: true) %>" title="<%= t("camaleon_cms.admin.post.create_category", default: 'Create New Category') %>" class="panel-add-category"><span class="fa fa-plus"></span></a></li>
93
+ <li><a id="post_add_new_category"
94
+ data-reload-url="<%= list_cama_admin_post_type_categories_path(@post_type.id) %>"
95
+ data-fields-reload-url="<%= list_cama_admin_settings_custom_fields_path(post_type: @post_type.id) %>"
96
+ href="<%= cama_admin_post_type_categories_path(@post_type.id, cama_body_class: true) %>"
97
+ title="<%= t("camaleon_cms.admin.post.create_category", default: 'Create New Category') %>"
98
+ class="panel-add-category"><span class="fa fa-plus"></span></a></li>
94
99
  <li><a href="#" class="panel-collapse"><span class="fa fa-angle-down"></span></a></li>
95
100
  </ul>
96
101
  </div>
@@ -4,10 +4,11 @@
4
4
  @item_id = @item_value[:id] || ''
5
5
  @index = "#{@item_id}_#{Time.now.to_i}_#{rand(999...99999)}"
6
6
  @field_config = cama_custom_field_elements[@key.to_sym]
7
+ @panel_id = "panel-field#{@index}"
7
8
  colors = ['primary','success','warning','colorful','info','danger']
8
9
  unless @field_config.nil?
9
10
  %>
10
- <div id="panel-field<%= @index %>" class="panel panel-default panel-<%= colors.sample %> panel-item <%= 'panel-toggled' if @item_options_value[:panel_hidden].to_s.to_bool %>">
11
+ <div id="<%= @panel_id %>" class="panel panel-default panel-<%= colors.sample %> panel-item <%= 'panel-toggled' if @item_options_value[:panel_hidden].to_s.to_bool %>">
11
12
  <div class="panel-heading">
12
13
  <h3 class="panel-title"><span class="span-title"><%= @item_value[:name]? @item_value[:name] : "#{t('camaleon_cms.admin.settings.untitled')}
13
14
  #{@field_config[:label]}" %>
@@ -155,7 +156,7 @@
155
156
  <% if @field_config[:options].key?(:default_value) %>
156
157
  <div class="form-group input-group-sm">
157
158
  <label><%= t('camaleon_cms.admin.table.default_value')%></label>
158
- <%= text_field(:field_options, 'default_value', index: @index, value: @item_options_value[:default_value] || @field_config[:options][:default_value], class: 'form-control') %>
159
+ <%= text_field(:field_options, 'default_value', index: @index, value: @item_options_value[:default_value] || @field_config[:options][:default_value], class: "form-control #{'translatable' if @field_config[:options][:translate]}") %>
159
160
  </div>
160
161
  <% end %>
161
162
 
@@ -176,4 +177,9 @@
176
177
  <% end %>
177
178
  </div>
178
179
  </div>
179
- <% end %>
180
+ <% end %>
181
+ <script>
182
+ jQuery(function () {
183
+ $('#<%= @panel_id %>').find('.translatable').Translatable();
184
+ })
185
+ </script>
@@ -0,0 +1,25 @@
1
+ <%
2
+ def _render_category_option_html(item, pos = 0)
3
+ category = item.decorate
4
+ value = "Category_Post,#{category.id}" %>
5
+ <option value="<%= value %>" data-help="<%= "#{t('camaleon_cms.admin.settings.tooltip.add_custom_field_posts')}"+ category.the_title %>"><%= "#{('—' * pos)} #{category.the_title}" %></option>
6
+ <% end
7
+
8
+ def _render_categories(categories, _level = 0)
9
+ categories.each do |term|
10
+ _render_category_option_html(term, _level)
11
+ children = term.children
12
+ _render_categories(children, _level + 1) if children.size > 0
13
+ end
14
+ end
15
+ %>
16
+
17
+
18
+ <select id="select_category_simple" name="custom_field_group[assign_group]" class="form-control required" style="display: none" disabled>
19
+ <% current_site.post_types.each do |pt| pt = pt.decorate
20
+ next unless pt.manage_categories? %>
21
+ <optgroup label="<%= pt.the_title %>">
22
+ <% _render_categories(pt.categories) %>
23
+ </optgroup>
24
+ <% end %>
25
+ </select>
@@ -91,7 +91,10 @@
91
91
  <%# end %>
92
92
  </optgroup -->
93
93
  <option value="_post_simple" >Select Post Simple</option>
94
+ <option value="_category_simple" >Select Category Posts Simple</option>
94
95
  </select>
96
+
97
+ <!-- select post -->
95
98
  <select id="select_post_simple" name="custom_field_group[assign_group]" class="form-control required" style="display: none" disabled>
96
99
  <% current_site.post_types.each do |pt| pt = pt.decorate %>
97
100
  <optgroup label="<%= pt.the_title %>">
@@ -101,6 +104,10 @@
101
104
  </optgroup>
102
105
  <% end %>
103
106
  </select>
107
+
108
+ <!-- select categories-->
109
+ <%= render partial: 'render_category_simple' %>
110
+
104
111
  <input id="select_assign_group_caption" type="hidden" name="custom_field_group[caption]"/>
105
112
  <div id="select_assign_group_help"></div>
106
113
  </div>
@@ -16,7 +16,6 @@
16
16
  var tinymce_global_settings = {language_url: "<%= asset_path("camaleon_cms/admin/tinymce/langs/#{current_locale}.js") %>", custom_css: [], custom_toolbar: [], post_render: [], init: [], setups: [], settings: []};
17
17
  var I18n_data = <%= I18n.backend.respond_to?(:translations) ? I18n.backend.send(:translations)[current_locale.to_sym][:camaleon_cms][:admin][:js].to_json.html_safe : !!(I18n.backend.backends[1] && I18n.backend.backends[1].backends[1]) ? I18n.backend.backends[1].backends[1].send(:translations)[current_locale.to_sym][:camaleon_cms][:admin][:js].to_json.html_safe : "{}" rescue "{}" %>
18
18
  </script>
19
- <%= render file: Rails.root.join('..', '..', 'spec/support/custom_admin') if Rails.env.test? %>
20
19
  <%= javascript_include_tag "camaleon_cms/admin/admin-manifest" %>
21
20
 
22
21
  <%= javascript_include_tag "camaleon_cms/admin/jquery_validate/#{current_locale}.js" if current_locale != 'en' %>
@@ -53,6 +53,7 @@ Rails.application.routes.draw do
53
53
  collection do
54
54
  post 'get_items/:key', action: :get_items, as: :get_items
55
55
  post "reorder"
56
+ get "list"
56
57
  end
57
58
  end
58
59
  get 'site'
@@ -1,3 +1,3 @@
1
1
  module CamaleonCms
2
- VERSION = '2.4.5.7'
2
+ VERSION = '2.4.5.8'
3
3
  end
@@ -135,6 +135,11 @@ class PluginRoutes
135
135
  def remove_anonymous_hook(hook_key, hook_id)
136
136
  (@@anonymous_hooks[hook_key.to_s] || []).delete_if{|item| item[:id] == hook_id }
137
137
  end
138
+
139
+ # return the class name for user model
140
+ def get_user_class_name
141
+ static_system_info['user_model'].presence || 'CamaleonCms::User'
142
+ end
138
143
  end
139
144
 
140
145
  # reload routes
@@ -21,6 +21,6 @@ module Dummy
21
21
 
22
22
  # Do not swallow errors in after_commit/after_rollback callbacks.
23
23
  # config.active_record.raise_in_transactional_callbacks = true
24
- config.active_record.sqlite3.represent_boolean_as_integer = true
24
+ config.active_record.sqlite3.represent_boolean_as_integer = true if Rails.version.to_f >= 5.2
25
25
  end
26
- end
26
+ end
@@ -0,0 +1,44 @@
1
+ FactoryBot.define do
2
+ factory :post, class: CamaleonCms::Post do
3
+ title Faker::Name.title
4
+ sequence(:slug) { |n| "post#{n}" }
5
+ content Faker::Lorem.sentence
6
+ published_at { Time.current }
7
+
8
+ transient do
9
+ site nil
10
+ end
11
+
12
+ post_type { association :post_type, site: site || create(:site) }
13
+ owner { association :user, site: site }
14
+
15
+ factory :pending_post do
16
+ status 'pending'
17
+ end
18
+
19
+ factory :draft_post do
20
+ status 'draft'
21
+ end
22
+
23
+ factory :children_post do
24
+ parent { post }
25
+ end
26
+
27
+ factory :private_post do
28
+ visibility 'private'
29
+ visibility_value { owner.role }
30
+ end
31
+
32
+ factory :password_post do
33
+ visibility 'password'
34
+ visibility_value '12345'
35
+ end
36
+
37
+ factory :featured_post do
38
+ is_feature true
39
+ end
40
+
41
+ # data_options {} # all attrs in Post#set_setting()
42
+ # data_metas {thumb: <String thumb full url>, layout: <String layout name>, template: <String template name>, summary: <Text summary>, has_comments: <0|1>}
43
+ end
44
+ end
@@ -1,17 +1,9 @@
1
- include CamaleonCms::SiteHelper
2
- include CamaleonCms::HooksHelper
3
1
  FactoryBot.define do
4
- factory :site, class: CamaleonCms::Site do
2
+ factory :post_type, class: CamaleonCms::PostType do
5
3
  name { Faker::Name.unique.name }
6
- slug { Capybara.current_session.server ? "#{Capybara.current_session.server.host}:#{Capybara.current_session.server.port}" : 'key' }
4
+ sequence(:slug) { |n| "posttyp#{n}" }
7
5
  description Faker::Lorem.sentence
8
- transient do
9
- theme PluginRoutes.all_themes.first['key']
10
- skip_intro true
11
- end
12
- after(:create) do |site, evaluator|
13
- site_after_install(site, evaluator.theme)
14
- site.set_option('save_intro', true) if evaluator.skip_intro
15
- end
6
+ data_options {}
7
+ site
16
8
  end
17
9
  end
@@ -1,8 +1,18 @@
1
+ include CamaleonCms::SiteHelper
2
+ include CamaleonCms::HooksHelper
1
3
  FactoryBot.define do
2
- factory :post_type, class: CamaleonCms::PostType do
4
+ factory :site, class: CamaleonCms::Site do
3
5
  name { Faker::Name.unique.name }
6
+ slug { Capybara.current_session.server ? "#{Capybara.current_session.server.host}:#{Capybara.current_session.server.port}" : 'key' }
7
+ # sequence(:slug) { |n| Capybara.current_session.server ? "#{Capybara.current_session.server.host}:#{Capybara.current_session.server.port}" : "site#{n}" }
4
8
  description Faker::Lorem.sentence
5
- data_options {}
6
- site
9
+ transient do
10
+ theme PluginRoutes.all_themes.first['key']
11
+ skip_intro true
12
+ end
13
+ after(:create) do |site, evaluator|
14
+ site_after_install(site, evaluator.theme)
15
+ site.set_option('save_intro', true) if evaluator.skip_intro
16
+ end
7
17
  end
8
18
  end
@@ -0,0 +1,19 @@
1
+ FactoryBot.define do
2
+ factory :user, class: CamaManager.get_user_class_name do
3
+ first_name Faker::Name.first_name
4
+ last_name Faker::Name.last_name
5
+ email { Faker::Internet.unique.email }
6
+ username { Faker::Internet.unique.user_name }
7
+ password '12345678'
8
+ password_confirmation '12345678'
9
+ site
10
+
11
+ factory :user_admin do
12
+ role 'admin'
13
+ end
14
+
15
+ factory :user_shared do
16
+ site_id nil
17
+ end
18
+ end
19
+ end
@@ -15,6 +15,7 @@ describe "the Custom Fields", js: true do
15
15
  fill_in "custom_field_group_description", with: 'Test name description'
16
16
  page.execute_script('$("#select_assign_group").val("PostType_Post,2")')
17
17
 
18
+ wait 2
18
19
  all('#content-items-default a').each do |link|
19
20
  link.click
20
21
  end
@@ -1,9 +1,7 @@
1
1
  require 'rails_helper'
2
+ include CamaleonCms::PluginsHelper
2
3
  describe "Post frontend", js: true do
3
- before(:each) do
4
- @site = create(:site).decorate
5
- @post = @site.the_post('sample-post').decorate
6
- end
4
+ init_site
7
5
 
8
6
  it 'visit post' do
9
7
  visit @post.the_url(as_path: true)
@@ -11,13 +9,13 @@ describe "Post frontend", js: true do
11
9
  end
12
10
 
13
11
  describe 'comments' do
14
-
12
+
15
13
  describe 'anonymous' do
16
14
  before(:each) do
17
15
  @post.set_meta('has_comments', '1') # enable comments for this post
18
16
  @site.set_option('permit_anonimos_comment', true) # enable anonymous comment
19
17
  end
20
-
18
+
21
19
  it 'anonymous comment' do
22
20
  visit @post.the_url(as_path: true)
23
21
  expect(page).to have_text('New Comment')
@@ -83,4 +81,56 @@ describe "Post frontend", js: true do
83
81
  expect(page).not_to have_text('New Comment')
84
82
  end
85
83
  end
84
+
85
+ describe 'post visibility' do
86
+ before(:each) do
87
+ current_site(@site)
88
+ plugin_install('visibility_post')
89
+ end
90
+
91
+ it 'public post' do
92
+ custom_post = create(:post, site: @site).decorate
93
+ visit custom_post.the_url(as_path: true)
94
+ expect(page).to have_http_status(:success)
95
+ end
96
+
97
+ it 'public future post with login' do
98
+ custom_post = create(:post, site: @site, published_at: 1.day.from_now).decorate
99
+ admin_sign_in(custom_post.owner.username, '12345678')
100
+ visit custom_post.the_url(as_path: true)
101
+ expect(page).to have_http_status(:not_found)
102
+ end
103
+
104
+ it 'public future post without login' do
105
+ custom_post = create(:post, site: @site, published_at: 1.day.from_now).decorate
106
+ visit custom_post.the_url(as_path: true)
107
+ expect(page).to have_http_status(:not_found)
108
+ end
109
+
110
+ it 'private post without login ' do
111
+ custom_post = create(:private_post, site: @site).decorate
112
+ visit custom_post.the_url(as_path: true)
113
+ expect(page).to have_http_status(:not_found)
114
+ end
115
+
116
+ it 'private post with login' do
117
+ user = create(:user, password: '12345678', password_confirmation: '12345678', site: @site)
118
+ custom_post = create(:private_post, site: @site, owner: user).decorate
119
+ admin_sign_in(user.username, '12345678')
120
+ visit custom_post.the_url(as_path: true)
121
+ expect(page).to have_http_status(:success)
122
+ end
123
+
124
+ it 'password post without password ' do
125
+ custom_post = create(:password_post, site: @site).decorate
126
+ visit custom_post.the_url(as_path: true)
127
+ expect(page).to have_text('Enter the password:')
128
+ end
129
+
130
+ it 'password post with password ' do
131
+ custom_post = create(:password_post, site: @site).decorate
132
+ visit custom_post.the_url(as_path: true, post_password: custom_post.visibility_value)
133
+ expect(page).to have_http_status(:success)
134
+ end
135
+ end
86
136
  end
@@ -1,13 +1,14 @@
1
1
  require 'rails_helper'
2
2
  include CamaleonCms::Frontend::ApplicationHelper
3
3
  RSpec.describe 'PostDecorator' do
4
+ init_site
4
5
  it "next and previous post related to post type" do
5
- post_type = create_test_post_type(slug: 'test-post-type')
6
- post3 = create_test_post(post_type, slug: 'test3', post_order: 3).decorate
7
- post1 = create_test_post(post_type, slug: 'test1', post_order: 1).decorate
8
- post2 = create_test_post(post_type, slug: 'test2', post_order: 2).decorate
9
- post2_1 = create_test_post(post_type, slug: 'test2_1', post_order: 2).decorate
10
- post4 = create_test_post(post_type, slug: 'test4', post_order: 4).decorate
6
+ post_type = create(:post_type, slug: 'test-post-type', site: @site)
7
+ post3 = create(:post, post_type: post_type, slug: 'test3', post_order: 3).decorate
8
+ post1 = create(:post, post_type: post_type, slug: 'test1', post_order: 1).decorate
9
+ post2 = create(:post, post_type: post_type, slug: 'test2', post_order: 2).decorate
10
+ post2_1 = create(:post, post_type: post_type, slug: 'test2_1', post_order: 2).decorate
11
+ post4 = create(:post, post_type: post_type, slug: 'test4', post_order: 4).decorate
11
12
 
12
13
  expect(post3.the_next_post.slug).to eq('test4')
13
14
  expect(post3.the_prev_post.slug).to eq('test2_1')
@@ -24,4 +25,26 @@ RSpec.describe 'PostDecorator' do
24
25
  expect(post4.the_prev_post.slug).to eq('test3')
25
26
  expect(post4.the_next_post).to eq(nil)
26
27
  end
28
+
29
+ it 'featured post' do
30
+ ptype = @site.post_types.last
31
+ bk = ptype.posts.featured.count
32
+ create(:featured_post, post_type: ptype)
33
+ expect(ptype.posts.reload.featured.count).to eql(bk + 1)
34
+ end
35
+
36
+ it 'post with extra data' do
37
+ ptype = @site.post_types.last
38
+ ptype.set_option('has_comments', true)
39
+ data = {
40
+ thumb: 'http://camaleon.tuzitio.com/media/132/slider/slider-camaleon.jpg',
41
+ summary: 'This is summary',
42
+ has_comments: 0
43
+ }
44
+ post = create(:post, post_type: ptype, data_metas: data).decorate
45
+ expect(post.get_meta("summary").present?).to eql(true)
46
+ expect(post.the_thumb_url).to include('slider-camaleon.jpg')
47
+ expect(post.has_thumb?).to eql(true)
48
+ expect(post.manage_comments?).to eql(true)
49
+ end
27
50
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: camaleon_cms
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.4.5.7
4
+ version: 2.4.5.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Owen Peredo Diaz
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-05-15 00:00:00.000000000 Z
11
+ date: 2018-06-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bcrypt
@@ -366,8 +366,22 @@ dependencies:
366
366
  - - ">="
367
367
  - !ruby/object:Gem::Version
368
368
  version: '0'
369
+ - !ruby/object:Gem::Dependency
370
+ name: rubocop
371
+ requirement: !ruby/object:Gem::Requirement
372
+ requirements:
373
+ - - ">="
374
+ - !ruby/object:Gem::Version
375
+ version: '0'
376
+ type: :development
377
+ prerelease: false
378
+ version_requirements: !ruby/object:Gem::Requirement
379
+ requirements:
380
+ - - ">="
381
+ - !ruby/object:Gem::Version
382
+ version: '0'
369
383
  description: Camaleon CMS is a dynamic and advanced content management system based
370
- on Ruby on Rails 4 as an alternative to Wordpress.
384
+ on Ruby on Rails 4+ as an alternative to Wordpress.
371
385
  email:
372
386
  - owenperedo@gmail.com
373
387
  executables: []
@@ -799,6 +813,7 @@ files:
799
813
  - app/views/camaleon_cms/admin/settings/custom_fields/_get_items.html.erb
800
814
  - app/views/camaleon_cms/admin/settings/custom_fields/_meta_data.html.erb
801
815
  - app/views/camaleon_cms/admin/settings/custom_fields/_render.html.erb
816
+ - app/views/camaleon_cms/admin/settings/custom_fields/_render_category_simple.html.erb
802
817
  - app/views/camaleon_cms/admin/settings/custom_fields/fields/_audio.html.erb
803
818
  - app/views/camaleon_cms/admin/settings/custom_fields/fields/_categories.html.erb
804
819
  - app/views/camaleon_cms/admin/settings/custom_fields/fields/_checkbox.html.erb
@@ -1045,10 +1060,10 @@ files:
1045
1060
  - spec/dummy/config/routes.rb
1046
1061
  - spec/dummy/config/secrets.yml
1047
1062
  - spec/dummy/db/schema.rb
1048
- - spec/dummy/db/test.sqlite3
1049
- - spec/dummy/public/favicon.ico
1063
+ - spec/factories/post.rb
1050
1064
  - spec/factories/post_type.rb
1051
1065
  - spec/factories/site.rb
1066
+ - spec/factories/user.rb
1052
1067
  - spec/features/admin/categories_spec.rb
1053
1068
  - spec/features/admin/comments_spec.rb
1054
1069
  - spec/features/admin/contact_form_spec.rb
@@ -1081,7 +1096,6 @@ files:
1081
1096
  - spec/routing/post_type_routes_spec.rb
1082
1097
  - spec/spec_helper.rb
1083
1098
  - spec/support/common.rb
1084
- - spec/support/custom_admin.html.erb
1085
1099
  - spec/support/fixtures/rails.png
1086
1100
  - spec/support/fixtures/rails_tmp.png
1087
1101
  - spec/support/wait_for_ajax.rb
@@ -1097,21 +1111,21 @@ required_ruby_version: !ruby/object:Gem::Requirement
1097
1111
  requirements:
1098
1112
  - - ">="
1099
1113
  - !ruby/object:Gem::Version
1100
- version: 1.9.3
1114
+ version: '2.2'
1101
1115
  required_rubygems_version: !ruby/object:Gem::Requirement
1102
1116
  requirements:
1103
1117
  - - ">="
1104
1118
  - !ruby/object:Gem::Version
1105
1119
  version: '0'
1106
1120
  requirements:
1107
- - rails >= 4.1
1108
- - ruby >= 1.9.3
1121
+ - rails >= 4.2
1122
+ - ruby >= 2.2
1109
1123
  - imagemagick
1110
1124
  rubyforge_project:
1111
1125
  rubygems_version: 2.6.10
1112
1126
  signing_key:
1113
1127
  specification_version: 4
1114
- summary: Camaleon is a cms for Ruby on Rails 4 as an alternative to wordpress.
1128
+ summary: Camaleon is a CMS for Ruby on Rails 4+ as an alternative to Wordpress.
1115
1129
  test_files:
1116
1130
  - spec/spec_helper.rb
1117
1131
  - spec/dummy/app/controllers/application_controller.rb
@@ -1143,9 +1157,7 @@ test_files:
1143
1157
  - spec/dummy/config/initializers/inflections.rb
1144
1158
  - spec/dummy/config.ru
1145
1159
  - spec/dummy/Rakefile
1146
- - spec/dummy/public/favicon.ico
1147
1160
  - spec/dummy/db/schema.rb
1148
- - spec/dummy/db/test.sqlite3
1149
1161
  - spec/dummy/README.rdoc
1150
1162
  - spec/mailers/send_mail_spec.rb
1151
1163
  - spec/features/frontend/post_type_spec.rb
@@ -1176,9 +1188,10 @@ test_files:
1176
1188
  - spec/support/wait_for_ajax.rb
1177
1189
  - spec/support/fixtures/rails_tmp.png
1178
1190
  - spec/support/fixtures/rails.png
1179
- - spec/support/custom_admin.html.erb
1180
1191
  - spec/factories/post_type.rb
1181
1192
  - spec/factories/site.rb
1193
+ - spec/factories/post.rb
1194
+ - spec/factories/user.rb
1182
1195
  - spec/routing/post_type_routes_spec.rb
1183
1196
  - spec/rails_helper.rb
1184
1197
  - spec/helpers/uploader_helper_spec.rb
Binary file
@@ -1,2 +0,0 @@
1
- <!--<style>.fa::before{ content: "i" !important; } </style>-->
2
- <script>window['URL'] = '';</script> <!--FIX for undefined URL on tinymce-->