drg_cms 0.6.0.8 → 0.6.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (63) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/drg_cms/drg_cms.js +100 -58
  3. data/app/assets/stylesheets/drg_cms/drg_cms.css +177 -43
  4. data/app/controllers/cmsedit_controller.rb +149 -145
  5. data/app/controllers/dc_application_controller.rb +235 -113
  6. data/app/controllers/dc_common_controller.rb +32 -3
  7. data/app/controls/dc_help_control.rb +126 -0
  8. data/app/controls/dc_report.rb +5 -7
  9. data/app/forms/all_options.yml +10 -4
  10. data/app/forms/cms_menu.yml +7 -1
  11. data/app/forms/dc_category.yml +2 -1
  12. data/app/forms/dc_design.yml +1 -0
  13. data/app/forms/dc_help_1.yml +109 -0
  14. data/app/forms/dc_journal.yml +3 -1
  15. data/app/forms/dc_link.yml +1 -1
  16. data/app/forms/dc_menu.yml +2 -0
  17. data/app/forms/dc_menu_item.yml +1 -0
  18. data/app/forms/dc_page.yml +2 -0
  19. data/app/forms/dc_part.yml +1 -0
  20. data/app/forms/dc_piece.yml +1 -0
  21. data/app/forms/dc_poll.yml +3 -0
  22. data/app/forms/dc_simple_menu.yml +2 -0
  23. data/app/forms/dc_site.yml +2 -6
  24. data/app/forms/dc_user.yml +27 -11
  25. data/app/forms/dc_user_role.yml +3 -0
  26. data/app/helpers/cms_common_helper.rb +69 -4
  27. data/app/helpers/cms_edit_helper.rb +32 -24
  28. data/app/helpers/cms_helper.rb +64 -26
  29. data/app/helpers/cms_index_helper.rb +84 -72
  30. data/app/helpers/dc_application_helper.rb +33 -24
  31. data/app/models/concerns/dc_page_concern.rb +11 -2
  32. data/app/models/concerns/dc_policy_rule_concern.rb +20 -8
  33. data/app/models/concerns/dc_site_concern.rb +56 -44
  34. data/app/models/concerns/dc_user_concern.rb +57 -18
  35. data/app/models/dc_design.rb +29 -19
  36. data/app/models/dc_key_value_store.rb +1 -0
  37. data/app/models/dc_permission.rb +19 -9
  38. data/app/models/dc_policy.rb +25 -14
  39. data/app/models/dc_policy_role.rb +22 -11
  40. data/app/models/dc_temp.rb +1 -1
  41. data/app/models/dc_user_role.rb +2 -2
  42. data/app/models/drgcms_form_fields/embedded.rb +5 -8
  43. data/app/models/drgcms_form_fields/file_field.rb +1 -1
  44. data/app/models/drgcms_form_fields/file_select.rb +2 -2
  45. data/app/models/drgcms_form_fields/hash_field.rb +11 -7
  46. data/app/models/drgcms_form_fields/link_to.rb +2 -2
  47. data/app/models/drgcms_form_fields/method.rb +5 -4
  48. data/app/models/drgcms_form_fields/multitext_autocomplete.rb +1 -1
  49. data/app/models/drgcms_form_fields/select.rb +10 -9
  50. data/app/models/drgcms_form_fields/text_autocomplete.rb +2 -2
  51. data/app/views/cmsedit/edit.html.erb +2 -0
  52. data/app/views/cmsedit/index.html.erb +2 -1
  53. data/app/views/cmsedit/new.html.erb +2 -0
  54. data/app/views/dc_common/_help.html.erb +8 -0
  55. data/app/views/layouts/models.html.erb +2 -1
  56. data/config/locales/drgcms_en.yml +12 -0
  57. data/config/locales/drgcms_sl.yml +15 -0
  58. data/config/locales/models_en.yml +5 -5
  59. data/config/locales/models_sl.yml +7 -6
  60. data/lib/drg_cms.rb +58 -0
  61. data/lib/drg_cms/version.rb +1 -1
  62. metadata +5 -3
  63. data/app/models/__dc_dummy.rb +0 -102
@@ -243,8 +243,8 @@ end
243
243
  # Helper for adding additional css and javascript code added by documents
244
244
  # and renderers during page rendering.
245
245
  ########################################################################
246
- def dc_page_bottom()
247
- %Q[<style type="text/css">#{@css}</style>#{javascript_tag @js}].html_safe
246
+ def dc_page_bottom
247
+ %(<style type="text/css">#{@css}</style>#{javascript_tag @js}).html_safe
248
248
  end
249
249
 
250
250
  ############################################################################
@@ -258,10 +258,16 @@ end
258
258
  # Returns:
259
259
  # String. HTML code for title.
260
260
  ############################################################################
261
- def dc_table_title(text, result_set=nil)
262
- c = %Q[<div class="dc-title">#{text}]
261
+ def dc_table_title(text, result_set = nil)
262
+ c = %(<div class="dc-title">#{text})
263
+ # help button
264
+ type = result_set.nil? ? 'form' : 'index'
265
+ form_name = params[:form_name] || params[:table]
266
+ url = url_for(controller: :dc_common, action: :help, type: type, form_name: form_name)
267
+ c << %(<div class="dc-help dc-link-ajax" data-url=#{url}>#{fa_icon('question-circle')}</div>)
268
+
263
269
  if result_set and result_set.respond_to?(:current_page)
264
- c << %Q[<div class="dc-paginate">#{paginate(result_set, :params => {action: 'index', clear: 'no', filter: nil})}</div>]
270
+ c << %(<div class="dc-paginate">#{paginate(result_set, :params => {action: 'index', clear: 'no', filter: nil})}</div>)
265
271
  end
266
272
  c << '<div style="clear: both;"></div></div>'
267
273
  c.html_safe
@@ -273,7 +279,7 @@ end
273
279
  # Returns:
274
280
  # String. HTML code for title.
275
281
  ############################################################################
276
- def dc_edit_title()
282
+ def dc_edit_title
277
283
  session[:form_processing] = "form:title:"
278
284
  title = @form['form']['title']
279
285
  # defined as form:title:edit
@@ -1083,12 +1089,13 @@ def dc_iframe_edit(table, opts={})
1083
1089
  end
1084
1090
 
1085
1091
  ########################################################################
1086
- # Will return value from internal DRG variables.
1087
- # This objects can be params, session, ...
1092
+ # Will return value from Rails and DRG internal objects.
1093
+ # This objects can be params, session, record, site, page
1088
1094
  #
1089
1095
  # Parameters:
1090
- # [object] String: Internal object holding variable. Current values can be session, params, site, page, class
1096
+ # [object] String: Internal object holding variable. Possible values are session, params, record, site, page, class
1091
1097
  # [var_name] String[symbol]: Variable name (:user_name, 'user_id', ...)
1098
+ # [current_document] Object: If passed and object is 'record' then it will be used for retrieving data.
1092
1099
  #
1093
1100
  # Example:
1094
1101
  # # called when constructing iframe for display
@@ -1100,26 +1107,28 @@ end
1100
1107
  #
1101
1108
  #
1102
1109
  # Returns:
1103
- # Value of variable or nil when not found
1110
+ # Value of variable or error when not found
1104
1111
  ########################################################################
1105
- def dc_internal_var(object, var_name)
1112
+ def dc_internal_var(object, var_name, current_document = nil)
1106
1113
  begin
1107
1114
  case
1108
- when object == 'session' then _origin.session[var_name]
1109
- when object == 'params' then _origin.params[var_name]
1110
- when object == 'site' then _origin.dc_get_site.send(var_name)
1111
- when object == 'page' then _origin.page.send(var_name)
1112
- when object == 'record' then _origin.record.send(var_name)
1113
- when object == 'class' then
1114
- clas, method_name = var_name.split('.')
1115
- klas = clas.classify.constantize
1116
- # call method. Error will be cought below.
1117
- klas.send(method_name)
1118
- else
1119
- 'VARIABLE: UNKNOWN OBJECT'
1115
+ when object == 'session' then _origin.session[var_name]
1116
+ when object == 'params' then _origin.params[var_name]
1117
+ when object == 'site' then _origin.dc_get_site.send(var_name)
1118
+ when object == 'page' then _origin.page.send(var_name)
1119
+ when object == 'record' then
1120
+ current_document ? current_document.send(var_name) : _origin.record.send(var_name)
1121
+ when object == 'class' then
1122
+ clas, method_name = var_name.split('.')
1123
+ klas = clas.classify.constantize
1124
+ # call method. Error will be caught below.
1125
+ klas.send(method_name)
1126
+ else
1127
+ 'VARIABLE: UNKNOWN OBJECT'
1120
1128
  end
1121
1129
  rescue Exception => e
1122
- logger.error "Method dc_internal_var. Runtime error. #{e.message}"
1130
+ Rails.logger.debug "\ndc_internal_var. Runtime error. #{e.message}\n"
1131
+ Rails.logger.debug(e.backtrace.join($/)) if Rails.env.development?
1123
1132
  'VARIABLE: ERROR'
1124
1133
  end
1125
1134
  end
@@ -1,4 +1,3 @@
1
- #coding: utf-8
2
1
  #--
3
2
  # Copyright (c) 2012+ Damjan Rems
4
3
  #
@@ -83,6 +82,16 @@ before_save :do_before_save
83
82
 
84
83
  validates :publish_date, presence: true
85
84
  validate :validate_images_alt_present
85
+
86
+ after_save :cache_clear
87
+ after_destroy :cache_clear
88
+
89
+ ####################################################################
90
+ # Clear cache if cache is configured
91
+ ####################################################################
92
+ def cache_clear
93
+ DrgCms.cache_clear(:dc_page)
94
+ end
86
95
 
87
96
  ######################################################################
88
97
  # Will return subject_link. Field name link should be common for all documents
@@ -94,7 +103,7 @@ end
94
103
 
95
104
  ######################################################################
96
105
  # Will return validation error if all images in body field do not have
97
- # alt attribute pressent.
106
+ # alt attribute present.
98
107
  ######################################################################
99
108
  def validate_images_alt_present
100
109
  errors.add('body', I18n.t('drgcms.img_alt_not_present')) unless DcPage.images_alt_present?(self.body)
@@ -25,17 +25,20 @@
25
25
  # ActiveSupport::Concern definition for DcPolicyRule class.
26
26
  #########################################################################
27
27
  module DcPolicyRuleConcern
28
- extend ActiveSupport::Concern
29
- included do
28
+ extend ActiveSupport::Concern
29
+ included do
30
30
 
31
- include Mongoid::Document
32
- include Mongoid::Timestamps
31
+ include Mongoid::Document
32
+ include Mongoid::Timestamps
33
33
 
34
- belongs_to :dc_policy_role
34
+ belongs_to :dc_policy_role
35
35
 
36
- field :permission, type: Integer, default: 0
36
+ field :permission, type: Integer, default: 0
37
37
 
38
- embedded_in :policy_rules, polymorphic: true
38
+ embedded_in :policy_rules, polymorphic: true
39
+
40
+ after_save :cache_clear
41
+ after_destroy :cache_clear
39
42
 
40
43
  #########################################################################
41
44
  # Returns values for permissions ready to be used in select field.
@@ -50,7 +53,7 @@ def self.values_for_permissions
50
53
  key = 'helpers.label.dc_policy_rule.choices4_permission'
51
54
  c = I18n.t(key)
52
55
  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]) }
56
+ c.split(',').inject([]) { |r,e| r << (ar = e.split(':'); [ar.first, ar.last.to_i]) }
54
57
  end
55
58
 
56
59
  #########################################################################
@@ -74,5 +77,14 @@ def self.permission_name_for_value(value)
74
77
  'error'
75
78
  end
76
79
 
80
+ private
81
+
82
+ ####################################################################
83
+ # Clear cache if cache is configured
84
+ ####################################################################
85
+ def cache_clear
86
+ _parent.send(:cache_clear) if _parent.respond_to?(:cache_clear)
87
+ end
88
+
77
89
  end
78
90
  end
@@ -27,44 +27,55 @@
27
27
  module DcSiteConcern
28
28
  extend ActiveSupport::Concern
29
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 :menu_id, type: BSON::ObjectId
54
- field :settings, type: String
55
- field :alias_for, type: String
56
- field :rails_view, type: String, default: ''
57
- field :design, type: String, default: ''
58
- field :inherit_policy, type: BSON::ObjectId
59
-
60
- embeds_many :dc_policies
61
- embeds_many :dc_parts
62
-
63
- index( { name: 1 }, { unique: true } )
64
- index( { alias_for: 1 } )
65
-
66
- validates :name, presence: true
67
- validates :name, uniqueness: true
30
+
31
+ include Mongoid::Document
32
+ include Mongoid::Timestamps
33
+
34
+ field :name, type: String
35
+ field :description, type: String
36
+ field :homepage_link, type: String
37
+ field :error_link, type: String
38
+ field :header, type: String, default: ''
39
+ field :css, type: String, default: ''
40
+ field :route_name, type: String, default: ''
41
+ field :page_title, type: String
42
+ field :document_extension, type: String
43
+ field :page_table, type: String
44
+ field :page_class, type: String, default: 'DcPage'
45
+ field :site_layout, type: String, default: 'content'
46
+ field :menu_class, type: String, default: 'DcSimpleMenu'
47
+ field :request_processor, type: String
48
+ field :files_directory, type: String
49
+ field :logo, type: String
50
+ field :active, type: Boolean, default: true
51
+ field :created_by, type: BSON::ObjectId
52
+ field :updated_by, type: BSON::ObjectId
53
+ field :menu_name, type: String
54
+ field :menu_id, type: BSON::ObjectId
55
+ field :settings, type: String
56
+ field :alias_for, type: String
57
+ field :rails_view, type: String, default: ''
58
+ field :design, type: String, default: ''
59
+ field :inherit_policy, type: BSON::ObjectId
60
+
61
+ embeds_many :dc_policies
62
+ embeds_many :dc_parts
63
+
64
+ index( { name: 1 }, { unique: true } )
65
+ index( { alias_for: 1 } )
66
+
67
+ validates :name, presence: true
68
+ validates :name, uniqueness: true
69
+
70
+ after_save :cache_clear
71
+ after_destroy :cache_clear
72
+
73
+ ####################################################################
74
+ # Clear cache if cache is configured
75
+ ####################################################################
76
+ def cache_clear
77
+ DrgCms.cache_clear(:dc_site)
78
+ end
68
79
 
69
80
  ########################################################################
70
81
  # Returns value of site setting. If no value is send as parameter it returns
@@ -78,14 +89,14 @@ end
78
89
  ########################################################################
79
90
  # Returns class object of collection name
80
91
  ########################################################################
81
- def page_klass()
92
+ def page_klass
82
93
  (self.page_table.blank? ? self.page_class : self.page_table).classify.constantize
83
94
  end
84
95
 
85
96
  ########################################################################
86
97
  # Returns class object of menu collection name
87
98
  ########################################################################
88
- def menu_klass()
99
+ def menu_klass
89
100
  (menu_class.blank? ? 'DcMenu' : menu_class).classify.constantize
90
101
  end
91
102
 
@@ -99,12 +110,13 @@ end
99
110
 
100
111
  ########################################################################
101
112
  # Return choices for selecting policies for the site
113
+ # @deprecated
102
114
  ########################################################################
103
- def self.choices4_policies
104
- site = ApplicationController.dc_get_site_()
115
+ #def self.choices4_policies
116
+ # site = ApplicationController.dc_get_site_()
105
117
  #all.inject([]) { |r,site| r << [ (site.active ? '' : t('drgcms.disabled') ) + site.name, site._id] }
106
- [['a','b']]
107
- end
118
+ # [['a','b']]
119
+ #end
108
120
 
109
121
  ########################################################################
110
122
  # Return choices for selecting policies for the site
@@ -56,8 +56,8 @@ field :valid_to, type: Date
56
56
  field :created_by, type: BSON::ObjectId
57
57
  field :updated_by, type: BSON::ObjectId
58
58
 
59
- field :type, type: Integer, default: 0 # 0 => User, 1 => Group
60
- field :members, type: Array
59
+ field :group, type: Boolean, default: false # false => User, true => Group
60
+ field :member, type: Array
61
61
 
62
62
  embeds_many :dc_user_roles
63
63
 
@@ -73,23 +73,17 @@ has_secure_password
73
73
 
74
74
  index( { username: 1 }, { unique: true } )
75
75
  index( { email: 1 }, { unique: true } )
76
- index 'dc_user_roles.dc_policy_role_id' => 1
77
- index 'members' => 1
76
+ index 'dc_user_roles.dc_policy_role_id' => 1
77
+ index member: 1
78
+ index group: 1
78
79
 
79
80
  validates_length_of :username, minimum: 4
80
81
  validates :username, uniqueness: true
81
- validates :email, uniqueness: true
82
- before_save :do_before_save
82
+ validates :email, uniqueness: true
83
+ validate :do_validate
83
84
 
84
- ##########################################################################
85
- # before_save callback takes care of name field and ensures that e-mail is unique
86
- # when entry is left empty.
87
- ##########################################################################
88
- def do_before_save
89
- self.name = "#{self.title} #{self.first_name} #{self.middle_name + ' ' unless self.middle_name.blank?}#{self.last_name}".strip
90
- # to ensure unique e-mail
91
- self.email = "unknown@#{self.id}" if self.email.to_s.strip.size < 5
92
- end
85
+ before_save :do_before_save
86
+ before_validation :do_before_validation
93
87
 
94
88
  ##########################################################################
95
89
  # Checks if user has role 'role_id' defined in his roles.
@@ -98,7 +92,7 @@ end
98
92
  ##########################################################################
99
93
  def has_role?(role_id)
100
94
  return false unless role_id
101
- #
95
+
102
96
  unless BSON::ObjectId.legal?(role_id)
103
97
  role = DcPolicyRole.get_role(role_id)
104
98
  role_id = role.id if role
@@ -111,7 +105,7 @@ end
111
105
  # Will return all possible values for country field ready for input in select field.
112
106
  # Values are loaded from github when method is first called.
113
107
  ##########################################################################
114
- def self.choices4_country()
108
+ def self.choices4_country
115
109
  if @@countries.nil?
116
110
  uri = URI.parse("https://raw.githubusercontent.com/umpirsky/country-list/master/country/cldr/en/country.json")
117
111
  http = Net::HTTP.new(uri.host, uri.port)
@@ -125,7 +119,7 @@ def self.choices4_country()
125
119
  end
126
120
 
127
121
  ##########################################################################
128
- # Performs ligically test on passed email parameter.
122
+ # Performs logically test on passed email parameter.
129
123
  #
130
124
  # Parameters:
131
125
  # [email] String: e-mail address
@@ -143,5 +137,50 @@ def self.is_email?(email)
143
137
  email.to_s =~ /^[a-zA-Z0-9][\w\.-]*[a-zA-Z0-9]@[a-zA-Z0-9][\w\.-]*[a-zA-Z0-9]\.[a-zA-Z][a-zA-Z\.]*[a-zA-Z]$/
144
138
  end
145
139
 
140
+ ##########################################################################
141
+ # Will return list of available groups
142
+ ##########################################################################
143
+ def self.groups_for_select
144
+ where(group: true, active: true).order_by(name: 1).inject([]) { |r, e| r << [e.name, e.id] }
145
+ end
146
+
147
+ private
148
+
149
+ ##########################################################################
150
+ # before_save callback takes care of name field and ensures that e-mail is unique
151
+ # when entry is left empty.
152
+ ##########################################################################
153
+ def do_before_save
154
+ self.name = "#{title} #{first_name} #{middle_name + ' ' unless middle_name.blank?}#{last_name}".strip
155
+ # to ensure unique e-mail
156
+ self.email = "unknown@#{id}" if email.blank?
157
+ end
158
+
159
+ ##########################################################################
160
+ # Create random password for groups. Must be done before validation
161
+ ##########################################################################
162
+ def do_before_validation
163
+ if new_record? && group
164
+ self.password = DcUser.random_password(30)
165
+ self.password_confirmation = password
166
+ end
167
+ end
168
+
169
+ ##########################################################################
170
+ # Perform some additional validations
171
+ ##########################################################################
172
+ def do_validate
173
+ if group && member.present?
174
+ errors.add('member', I18n.t('errors.messages.present'))
175
+ end
176
+ end
177
+ ##########################################################################
178
+ # Will create random password
179
+ ##########################################################################
180
+ def self.random_password(number)
181
+ charset = Array('A'..'Z') + Array('0'..'9') + Array('a'..'z')
182
+ Array.new(number) { charset.sample }.join
183
+ end
184
+
146
185
  end
147
186
  end
@@ -87,25 +87,35 @@
87
87
  # <style type="text/css"><%= @css.html_safe %></style><%= javascript_tag @js %>
88
88
  ########################################################################
89
89
  class DcDesign
90
- include Mongoid::Document
91
- include Mongoid::Timestamps
92
-
93
- field :description, type: String, default: ''
94
- field :body, type: String, default: ''
95
- field :css, type: String, default: ''
96
- field :rails_view, type: String, default: ''
97
- field :control, type: String, default: ''
98
- field :params, type: String, default: ''
99
- field :control_method, type: String, default: ''
100
- field :author, type: String
101
- field :active, type: Boolean, default: true
102
- field :created_by, type: BSON::ObjectId
103
- field :updated_by, type: BSON::ObjectId
104
- field :site_id, type: BSON::ObjectId
105
-
106
- embeds_many :dc_parts
107
-
108
- validates_length_of :description, minimum: 5
90
+ include Mongoid::Document
91
+ include Mongoid::Timestamps
92
+
93
+ field :description, type: String, default: ''
94
+ field :body, type: String, default: ''
95
+ field :css, type: String, default: ''
96
+ field :rails_view, type: String, default: ''
97
+ field :control, type: String, default: ''
98
+ field :params, type: String, default: ''
99
+ field :control_method, type: String, default: ''
100
+ field :author, type: String
101
+ field :active, type: Boolean, default: true
102
+ field :created_by, type: BSON::ObjectId
103
+ field :updated_by, type: BSON::ObjectId
104
+ field :site_id, type: BSON::ObjectId
105
+
106
+ embeds_many :dc_parts
107
+
108
+ validates_length_of :description, minimum: 5
109
+
110
+ after_save :cache_clear
111
+ after_destroy :cache_clear
112
+
113
+ ####################################################################
114
+ # Clear cache if cache is configured
115
+ ####################################################################
116
+ def cache_clear
117
+ DrgCms.cache_clear(:dc_design)
118
+ end
109
119
 
110
120
  ########################################################################
111
121
  # Return choices for select for design_id.