Class: Optimacms::Template

Inherits:
ActiveRecord::Base
  • Object
show all
Defined in:
app/models/optimacms/template.rb

Constant Summary collapse

EXTENSION_DEFAULT =
'html'
EXTENSIONS =
{'blank'=>'', 'html'=>'html', 'erb'=>'html.erb', 'haml'=>'html.haml'}

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.base_dirObject

settings



55
56
57
# File 'app/models/optimacms/template.rb', line 55

def self.base_dir
  Rails.root.to_s + '/app/views/'
end

.create_folders_tree(dirpath) ⇒ Object

create folders if necessary - NOT WORKING



378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
# File 'app/models/optimacms/template.rb', line 378

def self.create_folders_tree(dirpath)
  a = dirpath.split /\//

  d = ''
  parent_current = nil
  prev_d = d
  a.each do |s|
    d = d + (d=='' ? '' : '/') +s
    r = Template.where(is_folder: true, basepath: d).first
    if r
      parent_current = r
      next
    end
    # create missing folder
    path_new = File.basename(d)
    basedirpath_new = prev_d
    r = Template.create(is_folder: true, basename: path_new, basedirpath: basedirpath_new, title: path_new, parent: parent_current)
    parent_current = r

    prev_d = d
  end

  parent_current

end

.filename_ext(format) ⇒ Object



225
226
227
# File 'app/models/optimacms/template.rb', line 225

def self.filename_ext(format)
  EXTENSIONS[format]
end

.filename_ext_with_dot(format) ⇒ Object



229
230
231
232
233
# File 'app/models/optimacms/template.rb', line 229

def self.filename_ext_with_dot(format)
  ext = filename_ext(format)
  ext = '.'+ext unless ext.blank?
  ext
end

.filename_lang_postfix(lang) ⇒ Object



219
220
221
222
223
# File 'app/models/optimacms/template.rb', line 219

def self.filename_lang_postfix(lang)
  lang = lang.to_s
  return '' if lang==''
  return '.'+lang
end

.where_parent(parent_id) ⇒ Object

search



114
115
116
117
118
119
120
# File 'app/models/optimacms/template.rb', line 114

def self.where_parent(parent_id)
  if parent_id==0
    roots
  elsif parent_id>0
    children_of(parent_id.to_s)
  end
end

Instance Method Details

#_before_createObject



300
301
302
303
304
305
306
307
308
309
310
311
312
313
# File 'app/models/optimacms/template.rb', line 300

def _before_create
  if self.is_folder
    # create dir on disk
    Fileutils::Fileutils.create_dir_if_not_exists self.folder_fullpath
  else
    # add folders if needed
    if self.parent_id.nil? && !self.basedirpath.blank?
      self.parent = Template.create_folders_tree(self.basedirpath)
    end


  end

end

#_before_destroyObject



355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
# File 'app/models/optimacms/template.rb', line 355

def _before_destroy
  if self.is_folder

    # cannot delete not empty dir
    if !self.folder_empty?
      return false
    end

    # delete dir
    folder_delete

  else
    # file


  end


  true
end

#_before_updateObject



315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
# File 'app/models/optimacms/template.rb', line 315

def _before_update
  if self.is_folder
    oldpath = self.folder_fullpath

    self.set_basepath

    # rename dir on disk
    if self.basename_changed?
      raise "cannot change folder path"

      require 'fileutils'
      newpath = self.folder_fullpath

      if Dir.exists?(newpath)
        errors.add(:basename, 'Folder already exists')
        return false
      end

      FileUtils.mv oldpath, newpath

      # TODO: change paths for child templates

    end

  else
    # file

    # TODO: rename file
    #self.make_basepath

    # remove translations if needed
    if !self.is_translated
      self.translations = self.translations.reject{|r| r.lang!=''}
      #self.translations.clear

    end
  end

end

#_before_validationObject

callbacks



286
287
288
289
290
291
292
293
294
295
296
297
# File 'app/models/optimacms/template.rb', line 286

def _before_validation
  fix_basedirpath

  # parent, basedirpath
  if self.parent_id.nil? && !self.basedirpath.blank?
    set_parent_from_basedirpath
  elsif self.basedirpath.nil? && !self.parent_id.nil?
    set_basedirpath_from_parent
  end

  set_basepath
end

#attachObject

operations



126
127
128
129
130
131
132
133
134
# File 'app/models/optimacms/template.rb', line 126

def attach
  # check if file exists
  if !content_file_exists?
    errors.add(:attach, "file not found")
    return false
  end

  save
end

#build_translationsObject

translations



94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
# File 'app/models/optimacms/template.rb', line 94

def build_translations
  #
  if is_translated
    langs = Language.list_with_default
  else
    langs = ['']
  end

  #
  langs_missing = langs - self.translations.all.map{|r| r.lang}

  langs_missing.each do |lang|
    self.translations.new(:lang=>lang)
  end

end

#check_parent_folder_existsObject

validations



167
168
169
170
171
# File 'app/models/optimacms/template.rb', line 167

def check_parent_folder_exists
  if self.parent_id.nil? && !self.basedirpath.blank?
    errors.add(:basedirpath, "folder not exists. create it first")
  end
end

#content(lang = '') ⇒ Object

content



193
194
195
196
197
198
# File 'app/models/optimacms/template.rb', line 193

def content(lang='')
  filename =  fullpath(lang)
  return nil if filename.nil?
  return '' if !File.exists? filename
  File.read(filename)
end

#content=(v, lang = '') ⇒ Object



200
201
202
203
204
# File 'app/models/optimacms/template.rb', line 200

def content=(v, lang='')
  File.open(self.fullpath(lang), "w+") do |f|
    f.write(v)
  end
end

#content_file_exists?(lang = '') ⇒ Boolean

Returns:

  • (Boolean)


151
152
153
154
155
156
157
158
159
160
161
162
# File 'app/models/optimacms/template.rb', line 151

def content_file_exists?(lang='')
  postfixes = EXTENSIONS.map{|k,v| '.'+v}

  found = false
  postfixes.each do |p|
    if File.exists?(self.fullpath(lang))
      found = true
      break
    end
  end
  found
end

#filename_baseObject

base filename depending on type for page = name for partial = _name



212
213
214
215
216
# File 'app/models/optimacms/template.rb', line 212

def filename_base
  return '_'+self.basename if self.is_type_partial?

  self.basename
end

#fix_basedirpathObject



250
251
252
253
254
255
# File 'app/models/optimacms/template.rb', line 250

def fix_basedirpath
  self.basedirpath ||= ''
  if !self.basedirpath.blank? && self.basedirpath[-1] !='/'
    self.basedirpath << '/'
  end
end

#folder_deleteObject

folders



407
408
409
410
# File 'app/models/optimacms/template.rb', line 407

def folder_delete
  dirpath = self.folder_fullpath
  FileUtils.remove_dir(dirpath) if Dir.exists? dirpath
end

#folder_empty?Boolean

Returns:

  • (Boolean)


412
413
414
415
416
417
418
419
# File 'app/models/optimacms/template.rb', line 412

def folder_empty?
  dirpath = self.folder_fullpath
  if !Dir.exists? dirpath
    return true
  end

  return Dir.entries(dirpath).size == 2
end

#folder_fullpathObject



183
184
185
186
187
# File 'app/models/optimacms/template.rb', line 183

def folder_fullpath
  f = self.folder_path
  return nil if f.nil?
  Template.base_dir + f
end

#folder_pathObject

folder



178
179
180
181
# File 'app/models/optimacms/template.rb', line 178

def folder_path
  return nil if self.basepath.nil?
  self.basepath+'/'
end

#fullpath(lang = '') ⇒ Object



145
146
147
148
149
# File 'app/models/optimacms/template.rb', line 145

def fullpath(lang='')
  f = self.path(lang)
  return nil if f.nil?
  Template.base_dir + f
end

#has_code?Boolean

Returns:

  • (Boolean)


70
71
72
# File 'app/models/optimacms/template.rb', line 70

def has_code?
  ['haml', 'erb', 'blank'].include?(self.tpl_format)
end

#is_folder?Boolean

Returns:

  • (Boolean)


74
75
76
# File 'app/models/optimacms/template.rb', line 74

def is_folder?
  self.is_folder
end

#is_layout?Boolean

Returns:

  • (Boolean)


78
79
80
# File 'app/models/optimacms/template.rb', line 78

def is_layout?
  return self.type_id==TemplateType::TYPE_LAYOUT
end

#is_type_page?Boolean

Returns:

  • (Boolean)


82
83
84
# File 'app/models/optimacms/template.rb', line 82

def is_type_page?
  return self.type_id==TemplateType::TYPE_PAGE
end

#is_type_partial?Boolean

Returns:

  • (Boolean)


86
87
88
# File 'app/models/optimacms/template.rb', line 86

def is_type_partial?
  return self.type_id==TemplateType::TYPE_PARTIAL
end

#parent_titleObject

properties



65
66
67
# File 'app/models/optimacms/template.rb', line 65

def parent_title
  self.parent.title
end

#path(lang = '') ⇒ Object

path



140
141
142
143
# File 'app/models/optimacms/template.rb', line 140

def path(lang='')
  return nil if self.basename.nil?
  self.basedirpath + filename_base + Template.filename_lang_postfix(lang) + Template.filename_ext_with_dot(self.tpl_format)
end

#set_basedirpath_from_parentObject



257
258
259
260
261
262
263
264
265
266
267
# File 'app/models/optimacms/template.rb', line 257

def set_basedirpath_from_parent
  v = ''
  if self.parent_id.nil?
    v = ''
  else
    v = self.parent.basepath+'/' if self.parent_id >0
  end

  self.basedirpath = v
  #v
end

#set_basepathObject

operations with path



238
239
240
241
242
243
244
245
246
247
# File 'app/models/optimacms/template.rb', line 238

def set_basepath
  if self.parent.nil?
    self.basepath = self.basename
    self.basedirpath ||= ''
  else
    self.basepath = self.parent.basepath+'/'+self.basename
    self.basedirpath ||= self.parent.basepath+'/'
  end

end

#set_parent_from_basedirpathObject



269
270
271
272
273
274
275
276
277
278
279
280
# File 'app/models/optimacms/template.rb', line 269

def set_parent_from_basedirpath
  v = self.basedirpath

  # set parent_id from dir
  d = v.chop
  r = Template.where(is_folder: true, basepath: d).first
  if r
    self.parent_id = r.id
  else
    self.parent_id = nil
  end
end

#to_sObject



48
49
50
# File 'app/models/optimacms/template.rb', line 48

def to_s
  "#{title} (#{basepath})"
end