drg_cms 0.5.50.2 → 0.5.51.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (61) hide show
  1. checksums.yaml +4 -4
  2. data/History.log +47 -0
  3. data/README.md +2 -1
  4. data/app/assets/images/32px.png +0 -0
  5. data/app/assets/images/drg_cms/32px.png +0 -0
  6. data/app/assets/images/drg_cms/40px.png +0 -0
  7. data/app/assets/images/drg_cms/throbber.gif +0 -0
  8. data/app/assets/images/throbber.gif +0 -0
  9. data/app/assets/javascripts/drg_cms/drg_cms.js +3 -3
  10. data/app/assets/javascripts/drg_cms/jstree.min.js +6 -0
  11. data/app/assets/javascripts/drg_cms_cms.js +2 -1
  12. data/app/assets/stylesheets/drg_cms/drg_cms.css +9 -0
  13. data/app/assets/stylesheets/drg_cms/jstree.css +1108 -0
  14. data/app/assets/stylesheets/drg_cms_cms.css +1 -0
  15. data/app/controllers/cmsedit_controller.rb +14 -12
  16. data/app/controllers/dc_application_controller.rb +2 -2
  17. data/app/controllers/dc_common_controller.rb +15 -20
  18. data/app/controllers/dc_page_control.rb +8 -0
  19. data/app/controllers/design_element_settings_control.rb +135 -0
  20. data/app/forms/all_options.yml +7 -1
  21. data/app/forms/cms_menu.yml +1 -1
  22. data/app/forms/dc_browse_fields.yml +1 -1
  23. data/app/forms/dc_browse_models.yml +2 -2
  24. data/app/forms/dc_category.yml +4 -4
  25. data/app/forms/dc_menu.yml +6 -0
  26. data/app/forms/dc_page.yml +22 -12
  27. data/app/forms/dc_simple_menu.yml +6 -0
  28. data/app/forms/dc_site.yml +6 -0
  29. data/app/helpers/cmsedit_helper.rb +12 -8
  30. data/app/helpers/dc_application_helper.rb +79 -18
  31. data/app/helpers/dc_menu_renderer.rb +6 -1
  32. data/app/helpers/dc_part_renderer.rb +1 -1
  33. data/app/models/concerns/dc_page_concern.rb +133 -0
  34. data/app/models/concerns/dc_piece_concern.rb +57 -0
  35. data/app/models/concerns/dc_policy_rule_concern.rb +78 -0
  36. data/app/models/concerns/dc_site_concern.rb +94 -0
  37. data/app/models/concerns/dc_user_concern.rb +130 -0
  38. data/app/models/dc_ad.rb +1 -1
  39. data/app/models/dc_big_menu.rb +1 -1
  40. data/app/models/dc_category.rb +19 -4
  41. data/app/models/dc_dummy.rb +3 -2
  42. data/app/models/dc_link.rb +1 -1
  43. data/app/models/dc_memory.rb +127 -0
  44. data/app/models/dc_menu.rb +69 -3
  45. data/app/models/dc_menu_item.rb +17 -0
  46. data/app/models/dc_page.rb +0 -106
  47. data/app/models/dc_part.rb +0 -1
  48. data/app/models/dc_piece.rb +0 -35
  49. data/app/models/dc_policy_rule.rb +0 -56
  50. data/app/models/dc_simple_menu.rb +36 -0
  51. data/app/models/dc_simple_menu_item.rb +0 -0
  52. data/app/models/dc_site.rb +1 -71
  53. data/app/models/dc_user.rb +0 -108
  54. data/app/models/drgcms_form_fields.rb +187 -26
  55. data/app/views/cmsedit/_result.html.erb +3 -4
  56. data/config/locales/models_en.yml +11 -3
  57. data/config/locales/models_sl.yml +7 -0
  58. data/lib/drg_cms.rb +1 -0
  59. data/lib/drg_cms/version.rb +1 -1
  60. data/lib/tasks/log_statistics.rb +14 -8
  61. metadata +16 -2
@@ -56,10 +56,11 @@ class DcMenu
56
56
  field :created_by, type: BSON::ObjectId
57
57
  field :updated_by, type: BSON::ObjectId
58
58
 
59
- index( { name: 1 }, { unique: true } )
60
-
59
+ belongs_to :dc_site
61
60
  embeds_many :dc_menu_items
62
61
 
62
+ index( { name: 1 }, { unique: true } )
63
+
63
64
  validates :name, :length => { :minimum => 4 }
64
65
  validates :name, uniqueness: true
65
66
  validates_length_of :description, minimum: 10
@@ -77,7 +78,7 @@ class DcMenu
77
78
  # Returns:
78
79
  # Array. Of choices prepared for select input field.
79
80
  #######################################################################
80
- def self.choices4_menu(site)
81
+ def self.choices4_menu(site)
81
82
  rez = []
82
83
  menus = (site.menu_name.blank? ? all : where(name: site.menu_name)).to_a
83
84
  menus.each do |menu|
@@ -88,5 +89,70 @@ class DcMenu
88
89
  end
89
90
  rez
90
91
  end
92
+
93
+ #######################################################################
94
+ # Subroutine of choices4_menu_as_tree
95
+ #######################################################################
96
+ def self.do_sub_menu(menus, parent, ids) #:nodoc:
97
+ result = []
98
+ menus.each do |item|
99
+ long_id = "#{ids};#{item.id}"
100
+ result << [item.caption, long_id, parent, item.order]
101
+ sub_menus = item.dc_menu_items.order_by(order: 1).to_a
102
+ result += do_sub_menu(sub_menus, long_id, long_id) if sub_menus.size > 0
103
+ end
104
+ result
105
+ end
106
+
107
+ #######################################################################
108
+ # Will return menu structure for menus belonging to the site.
109
+ #
110
+ # Parameters:
111
+ # [Site] DcSite document. Site for which menu belongs to. If site is not specified
112
+ # all current menus in collection will be returned.
113
+ #
114
+ # Returns:
115
+ # Array. Of choices prepared for tree:select input field.
116
+ #######################################################################
117
+ def self.choices4_menu_as_tree(site_id=nil)
118
+ qry = where(active: true)
119
+ #
120
+ ar = [nil]
121
+ if site_id.class == BSON::ObjectId
122
+ ar << site_id
123
+ elsif site_id.respond_to?(:id)
124
+ ar << site_id.id
125
+ end
126
+ qry = qry.in(dc_site_id: ar)
127
+ #
128
+ result = []
129
+ qry.each do |menu|
130
+ result << [menu.name, menu.id, nil,0]
131
+ sub_menus = menu.dc_menu_items.order_by(order: 1).to_a
132
+ result += do_sub_menu(sub_menus, menu.id, menu.id.to_s) if sub_menus.size > 0
133
+ end
134
+ result
135
+ end
136
+
137
+ #######################################################################
138
+ # Will update link value of selected menu_item
139
+ #
140
+ # Parameters:
141
+ # [path] String. String path to MenuItem document, separated by ;
142
+ # [link] String. New value of the link field
143
+ #######################################################################
144
+ def self.update_menu_item_link(path, link)
145
+ return unless path and link
146
+ #
147
+ ar = path.split(';')
148
+ menu = find(ar.shift)
149
+ while (item = ar.shift) do
150
+ menu = menu.dc_menu_items.find(item)
151
+ end
152
+ return unless menu.respond_to?(:link) # top level selected
153
+ #
154
+ menu.link = link
155
+ menu.save
156
+ end
91
157
 
92
158
  end
@@ -63,4 +63,21 @@ class DcMenuItem
63
63
  field :updated_by, type: BSON::ObjectId
64
64
 
65
65
  embeds_many :dc_menu_items, :cyclic => true
66
+
67
+ #######################################################################
68
+ # Will return menu path for the item as array of id-s. Method can be used
69
+ # to determine all parents of current item.
70
+ #
71
+ # Returns:
72
+ # Array. Of parent items ids.
73
+ #######################################################################
74
+ def menu_path()
75
+ path, parent = [], self
76
+ while parent
77
+ path << parent.id
78
+ parent = parent._parent
79
+ end
80
+ path.reverse
81
+ end
82
+
66
83
  end
@@ -22,112 +22,6 @@
22
22
  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23
23
  #++
24
24
 
25
- #########################################################################
26
- # ActiveSupport::Concern definition for DcPage class.
27
- #########################################################################
28
- module DcPageConcern
29
- extend ActiveSupport::Concern
30
- included do
31
-
32
- include Mongoid::Document
33
- include Mongoid::Timestamps
34
-
35
- field :subject, type: String, default: ''
36
- field :title, type: String
37
- field :subject_link, type: String, default: ''
38
- field :alt_link, type: String, default: ''
39
- field :sub_subject, type: String, default: ''
40
- field :picture, type: String
41
- field :gallery, type: String
42
- field :body, type: String, default: ''
43
- field :css, type: String, default: ''
44
- field :script, type: String, default: ''
45
- field :params, type: String
46
- field :menu_id, type: BSON::ObjectId
47
- field :author_id, type: BSON::ObjectId
48
- field :dc_poll_id, type: BSON::ObjectId
49
- field :author_name, type: String
50
- field :publish_date, type: DateTime
51
- field :user_name, type: String
52
- field :valid_from, type: DateTime
53
- field :valid_to, type: DateTime
54
- field :comments, type: Integer, default: 1 # 0 => not allowed, 1 => allowed
55
- field :active, type: Boolean, default: true
56
- field :created_by, type: BSON::ObjectId
57
- field :updated_by, type: BSON::ObjectId
58
- field :kats, type: Array # Categories
59
-
60
- field :policy_id, type: BSON::ObjectId
61
-
62
- embeds_many :dc_parts
63
-
64
- belongs_to :dc_site
65
- belongs_to :dc_design
66
-
67
- index ({ dc_site_id: 1, subject_link: 1 })
68
- index kats: 1
69
- index alt_link: 1
70
-
71
- before_save :do_before_save
72
-
73
- validates :publish_date, presence: true
74
-
75
- ######################################################################
76
- protected
77
-
78
- ######################################################################
79
- # Clears subject link of chars that shouldn't be there and also takes care
80
- # than link size is not larger than 100 chars.
81
- ######################################################################
82
- def clear_link(link)
83
- link.gsub!(/\.|\?|\!\&|»|«|\,|\"|\'|\:/,'')
84
- link.gsub!('<br>','')
85
- link.gsub!(' ','-')
86
- link.gsub!('---','-')
87
- link.gsub!('--','-')
88
- # it shall not be greater than 100 chars. Don't break in the middle of words
89
- if link.size > 100
90
- link = link[0,100]
91
- link.chop! until link[-1,1] == '-' or link.size < 10 # delete until -
92
- end
93
- link.chop! if link[-1,1] == '-' # remove - at the end
94
- link
95
- end
96
-
97
- ######################################################################
98
- # Implementation of before_save callback.
99
- ######################################################################
100
- def do_before_save
101
- if self.subject_link.empty?
102
- self.subject_link = clear_link(self.subject.downcase.strip)
103
- # add date to link, but only if something is written in subject
104
- self.subject_link << self.publish_date.strftime('-%Y%m%d') if self.subject_link.size > 1
105
- end
106
- end
107
-
108
- ######################################################################
109
- # Return all pages belonging to site ready for select input field. Used
110
- # by dc_menu* forms, for selecting page which will be linked by menu option.
111
- #
112
- # Parameters:
113
- # [site] Site document.
114
- ######################################################################
115
- def self.all_pages_for_site(site)
116
- where(dc_site_id: site._id, active: true).order(subject: 1).
117
- inject([]) { |r,page| r << [ page.subject, page.subject_link] }
118
- end
119
-
120
- ########################################################################
121
- # Return filter options
122
- ########################################################################
123
- def self.dc_filters
124
- {'title' => 'drgcms.filters.this_site_only', 'operation' => 'eq',
125
- 'field' => 'dc_site_id', 'value' => '@current_site'}
126
- end
127
-
128
- end
129
- end
130
-
131
25
  #########################################################################
132
26
  # == Schema information
133
27
  #
@@ -20,7 +20,6 @@
20
20
  # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
21
21
  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22
22
  #++
23
- require_dependency DrgCms.model 'dc_piece'
24
23
 
25
24
  ########################################################################
26
25
  # == Schema information
@@ -21,41 +21,6 @@
21
21
  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22
22
  #++
23
23
 
24
-
25
- #########################################################################
26
- # ActiveSupport::Concern definition for DcPiece class.
27
- #########################################################################
28
- module DcPieceConcern
29
- extend ActiveSupport::Concern
30
- included do
31
-
32
- include Mongoid::Document
33
- include Mongoid::Timestamps
34
-
35
- field :name, type: String, default: ''
36
- field :description, type: String, default: ''
37
- field :picture, type: String
38
- field :thumbnail, type: String
39
- field :body, type: String, default: ''
40
- field :css, type: String, default: ''
41
- field :script, type: String, default: ''
42
- field :script_type, type: String, default: ''
43
- field :params, type: String, default: ''
44
- field :piece_id, type: BSON::ObjectId
45
- field :div_id, type: String
46
- field :site_id, type: BSON::ObjectId
47
- field :order, type: Integer, default: 0
48
- field :active, type: Boolean, default: true
49
- field :valid_from, type: DateTime
50
- field :valid_to, type: DateTime
51
-
52
- field :created_by, type: BSON::ObjectId
53
- field :updated_by, type: BSON::ObjectId
54
-
55
- validates :name, presence: true
56
- end
57
- end
58
-
59
24
  ########################################################################
60
25
  # == Schema information
61
26
  #
@@ -21,62 +21,6 @@
21
21
  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22
22
  #++
23
23
 
24
- #########################################################################
25
- # ActiveSupport::Concern definition for DcPolicyRule class.
26
- #########################################################################
27
- module DcPolicyRuleConcern
28
- extend ActiveSupport::Concern
29
- included do
30
-
31
- include Mongoid::Document
32
- include Mongoid::Timestamps
33
-
34
- belongs_to :dc_policy_role
35
-
36
- field :permission, type: Integer, default: 0
37
-
38
- embedded_in :policy_rules, polymorphic: true
39
-
40
- #########################################################################
41
- # Returns values for permissions ready to be used in select field.
42
- #
43
- # Example (as used in DRG CMS form):
44
- # 20:
45
- # name: permission
46
- # type: select
47
- # eval: DcPolicyRule.values_for_permissions
48
- #########################################################################
49
- def self.values_for_permissions
50
- key = 'helpers.label.dc_policy_rule.choices4_permission'
51
- c = I18n.t(key)
52
- c = I18n.t(key, locale: 'en') if c.class == Hash or c.match( 'translation missing' )
53
- c.split(',').inject([]) {|r,e| r << (ar = e.split(':'); [ar.first, ar.last.to_i]) }
54
- end
55
-
56
- #########################################################################
57
- # Will return translated permission name for value.
58
- #
59
- # Parameters:
60
- # [value] Integer. Permission value
61
- #
62
- # Example (as used in DRG CMS form):
63
- # result_set:
64
- # columns:
65
- # 2:
66
- # name: permission
67
- # eval: DcPolicyRule.permission_name_for_value
68
- #
69
- # Returns:
70
- # String. Name (description) for value
71
- #########################################################################
72
- def self.permission_name_for_value(value)
73
- values_for_permissions.each {|v| return v.first if v.last.to_i == value.to_i}
74
- 'error'
75
- end
76
-
77
- end
78
- end
79
-
80
24
  #########################################################################
81
25
  # == Schema information
82
26
  #
@@ -58,6 +58,7 @@ class DcSimpleMenu
58
58
  index( { name: 1 }, { unique: true } )
59
59
 
60
60
  embeds_many :dc_simple_menu_items
61
+ belongs_to :dc_site #, optional: true
61
62
 
62
63
  validates_length_of :description, minimum: 10
63
64
 
@@ -86,4 +87,39 @@ class DcSimpleMenu
86
87
  rez
87
88
  end
88
89
 
90
+ #######################################################################
91
+ # Will return menu structure for menus belonging to the site.
92
+ #
93
+ # Parameters:
94
+ # [Site] DcSite document. Site for which menu belongs to. If site is not specified
95
+ # all current menus in collection will be returned.
96
+ #
97
+ # Returns:
98
+ # Array. Of choices prepared for tree:select input field.
99
+ #######################################################################
100
+ def self.choices4_menu_as_tree(site_id=nil)
101
+ qry = where(active: true)
102
+ #
103
+ ar = [nil]
104
+ ar << (site_id.respond_to?(:id) ? site_id.id : site_id)
105
+ qry = qry.in(dc_site_id: ar)
106
+ #
107
+ result = []
108
+ qry.each do |menu|
109
+ result << [menu.name, menu.id, nil,0]
110
+ menu.dc_simple_menu_items.order_by(order: 1).each do |item|
111
+ result << [item.caption, item.id, menu.id, item.order]
112
+ end
113
+ end
114
+ result
115
+ end
116
+
117
+ #######################################################################
118
+ # Will update link value of selected menu_item.
119
+ #
120
+ # Do nothing. The method is defined only for compatibility.
121
+ #######################################################################
122
+ def self.update_menu_item_link(path, link)
123
+ end
124
+
89
125
  end
File without changes
@@ -21,77 +21,6 @@
21
21
  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22
22
  #++
23
23
 
24
- #########################################################################
25
- # ActiveSupport::Concern definition for DcSite class.
26
- #########################################################################
27
- module DcSiteConcern
28
- extend ActiveSupport::Concern
29
- included do
30
- include Mongoid::Document
31
- include Mongoid::Timestamps
32
-
33
- field :name, type: String
34
- field :description, type: String
35
- field :homepage_link, type: String
36
- field :error_link, type: String
37
- field :header, type: String, default: ''
38
- field :css, type: String, default: ''
39
- field :route_name, type: String, default: ''
40
- field :page_title, type: String
41
- field :document_extension, type: String
42
- field :page_table, type: String
43
- field :page_class, type: String, default: 'DcPage'
44
- field :site_layout, type: String, default: 'content'
45
- field :menu_class, type: String, default: 'DcSimpleMenu'
46
- field :request_processor, type: String
47
- field :files_directory, type: String
48
- field :logo, type: String
49
- field :active, type: Boolean, default: true
50
- field :created_by, type: BSON::ObjectId
51
- field :updated_by, type: BSON::ObjectId
52
- field :menu_name, type: String
53
- field :settings, type: String
54
- field :alias_for, type: String
55
- field :rails_view, type: String, default: ''
56
- field :design, type: String, default: ''
57
-
58
- embeds_many :dc_policies
59
- embeds_many :dc_parts
60
-
61
- index( { name: 1 }, { unique: true } )
62
-
63
- validates :name, presence: true
64
- validates :name, uniqueness: true
65
-
66
- ########################################################################
67
- # Returns value of site setting. If no value is send as parameter it returns
68
- # all settings hash object.
69
- ########################################################################
70
- def params(what=nil)
71
- @params ||= self.settings.to_s.size > 5 ? YAML.load(self.settings) : {}
72
- what.nil? ? @params : @params[what.to_s]
73
- end
74
-
75
- ########################################################################
76
- # Return choices for select for site_id
77
- ########################################################################
78
- def self.choices4_site
79
- all.inject([]) { |r,site| r << [ (site.active ? '' : t('drgcms.disabled') ) + site.name, site._id] }
80
- end
81
-
82
- ########################################################################
83
- # Return choices for selecting policies for the site
84
- ########################################################################
85
- def self.choices4_policies
86
- site = ApplicationController.dc_get_site_()
87
- #all.inject([]) { |r,site| r << [ (site.active ? '' : t('drgcms.disabled') ) + site.name, site._id] }
88
- [['a','b']]
89
- end
90
-
91
- end
92
- end
93
-
94
-
95
24
  ######################################################################
96
25
  # == Schema information
97
26
  #
@@ -123,6 +52,7 @@ end
123
52
  # alias_for String Is alias name for entered site name
124
53
  # rails_view String Rails view filename used as standard design
125
54
  # design String Standard design can also be defined at the site level
55
+ # inherit_policy BSON::ObjectId Use policy from other site
126
56
  # dc_policies Embedded:DcPolicy Access policies defined for the site
127
57
  # dc_parts Embedded:DcPart Parts contained in site
128
58
  #