optimacms 0.1.55 → 0.1.56

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (321) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/optimacms/admin.js +4 -4
  3. data/app/assets/stylesheets/optimacms/admin.css.scss +6 -6
  4. data/app/assets/stylesheets/optimacms/admin_tpl.css.scss +15 -15
  5. data/app/assets/stylesheets/optimacms/bootstrap_and_overrides.css.scss +52 -52
  6. data/app/assets/stylesheets/optimacms/bootstrap_custom.css.scss +49 -49
  7. data/app/assets/stylesheets/optimacms/bootstrap_variables.css.scss +860 -860
  8. data/app/assets/stylesheets/optimacms/colors.css.scss +68 -68
  9. data/app/assets/stylesheets/optimacms/skins/noskin.css.scss +95 -95
  10. data/app/assets/stylesheets/optimacms/tinymce.css.scss +54 -54
  11. data/app/assets/stylesheets/optimacms/tpl.css.scss +309 -309
  12. data/app/controllers/optimacms/admin/admin_base_controller.rb +44 -44
  13. data/app/controllers/optimacms/admin/dashboard_controller.rb +6 -6
  14. data/app/controllers/optimacms/admin/layouts_controller.rb +76 -76
  15. data/app/controllers/optimacms/admin/pages_controller.rb +229 -229
  16. data/app/controllers/optimacms/admin/templates_controller.rb +315 -315
  17. data/app/controllers/optimacms/dev_controller.rb +40 -40
  18. data/app/controllers/optimacms/elfinder_controller.rb +39 -39
  19. data/app/controllers/optimacms/page_base_controller.rb +6 -6
  20. data/app/controllers/optimacms/pages_controller.rb +170 -170
  21. data/app/controllers/optimacms/tinymce_assets_controller.rb +20 -20
  22. data/app/helpers/optimacms/application_helper.rb +111 -106
  23. data/app/helpers/optimacms/forms_helper.rb +75 -75
  24. data/app/inputs/textarea_tinymce_input.rb +27 -27
  25. data/app/models/concerns/optimacms/meta_content.rb +63 -63
  26. data/app/models/optimacms/language.rb +14 -14
  27. data/app/models/optimacms/layout.rb +53 -53
  28. data/app/models/optimacms/mediafile.rb +17 -17
  29. data/app/models/optimacms/page.rb +171 -171
  30. data/app/models/optimacms/page_translation.rb +10 -10
  31. data/app/models/optimacms/template.rb +390 -390
  32. data/app/models/optimacms/template_type.rb +20 -20
  33. data/app/views/optimacms/admin/common/_js_tinymce.html.haml +49 -49
  34. data/app/views/optimacms/admin/common/_modal_div.html.haml +16 -16
  35. data/app/views/optimacms/admin/dashboard/index.html.haml +18 -18
  36. data/app/views/optimacms/admin/layouts/_form.html.haml +22 -22
  37. data/app/views/optimacms/admin/layouts/edit.html.haml +5 -5
  38. data/app/views/optimacms/admin/layouts/index.html.haml +25 -25
  39. data/app/views/optimacms/admin/layouts/main.html.haml +6 -6
  40. data/app/views/optimacms/admin/layouts/new.html.haml +5 -5
  41. data/app/views/optimacms/admin/pages/_form.html.haml +78 -78
  42. data/app/views/optimacms/admin/pages/_form_folder.html.haml +14 -14
  43. data/app/views/optimacms/admin/pages/_form_old.html.haml +107 -107
  44. data/app/views/optimacms/admin/pages/_meta.html.haml +48 -48
  45. data/app/views/optimacms/admin/pages/edit.html.haml +5 -5
  46. data/app/views/optimacms/admin/pages/editfolder.html.haml +15 -15
  47. data/app/views/optimacms/admin/pages/index.html.haml +58 -58
  48. data/app/views/optimacms/admin/pages/new.html.haml +5 -5
  49. data/app/views/optimacms/admin/pages/newfolder.html.haml +15 -15
  50. data/app/views/optimacms/admin/shared/_breadcrumbs.html.haml +7 -7
  51. data/app/views/optimacms/admin/shared/_flash.html.haml +23 -23
  52. data/app/views/optimacms/admin/shared/_footer.html.haml +5 -5
  53. data/app/views/optimacms/admin/shared/_form_errors.html.haml +11 -11
  54. data/app/views/optimacms/admin/shared/_leftmenu.html.haml +49 -49
  55. data/app/views/optimacms/admin/shared/_top.html.haml +33 -33
  56. data/app/views/optimacms/admin/templates/_form.html.haml +61 -61
  57. data/app/views/optimacms/admin/templates/_js_form_modal.html.haml +43 -43
  58. data/app/views/optimacms/admin/templates/create.js.haml +3 -3
  59. data/app/views/optimacms/admin/templates/edit.html.haml +5 -5
  60. data/app/views/optimacms/admin/templates/editfolder.html.haml +31 -31
  61. data/app/views/optimacms/admin/templates/index.html.haml +48 -48
  62. data/app/views/optimacms/admin/templates/new.html.haml +37 -37
  63. data/app/views/optimacms/admin/templates/newattach.html.haml +32 -32
  64. data/app/views/optimacms/admin/templates/newfolder.html.haml +28 -28
  65. data/app/views/optimacms/elfinder/index.html.erb +54 -54
  66. data/config/initializers/assets.rb +2 -2
  67. data/config/initializers/kaminari.rb +10 -10
  68. data/config/initializers/paperclip.rb +11 -11
  69. data/config/initializers/paperclip_media_type_spoof_detector_override.rb +7 -7
  70. data/config/initializers/simple_form.rb +166 -166
  71. data/config/initializers/simple_form_bootstrap.rb +146 -146
  72. data/config/locales/simple_form.en.yml +3 -3
  73. data/config/locales/simple_form.ru.yml +3 -3
  74. data/config/tinymce.yml +6 -6
  75. data/lib/optimacms/fileutils/fileutils.rb +39 -39
  76. data/lib/optimacms/filters/form_filter.rb +226 -226
  77. data/lib/optimacms/mycontroller.rb +84 -82
  78. data/lib/optimacms/page_services/page_data.rb +97 -97
  79. data/lib/optimacms/page_services/page_process_service.rb +32 -32
  80. data/lib/optimacms/page_services/page_route_service.rb +175 -156
  81. data/lib/optimacms/simple_form_extensions/button_components.rb +33 -33
  82. data/lib/optimacms/version.rb +3 -3
  83. data/spec/dummy/app/assets/stylesheets/application.css.scss +11 -11
  84. data/spec/dummy/app/assets/stylesheets/bootstrap_and_overrides.css.scss +3 -3
  85. data/spec/dummy/app/assets/stylesheets/bootstrap_custom.css.scss +49 -49
  86. data/spec/dummy/app/assets/stylesheets/tpl.css.scss +62 -62
  87. data/spec/dummy/app/controllers/home_controller.rb +6 -6
  88. data/spec/dummy/app/controllers/my_controller.rb +6 -6
  89. data/spec/dummy/app/controllers/news_controller.rb +46 -46
  90. data/spec/dummy/app/models/news.rb +7 -7
  91. data/spec/dummy/app/views/home/index.html.haml +18 -18
  92. data/spec/dummy/app/views/my/hello.html.haml +4 -4
  93. data/spec/dummy/app/views/news/index.html.haml +13 -13
  94. data/spec/dummy/app/views/news/show.html.haml +6 -6
  95. data/spec/dummy/app/views/pages/1.html.erb +16 -16
  96. data/spec/dummy/app/views/pages/about.html.erb +12 -12
  97. data/spec/dummy/app/views/pages/text1.html +1 -1
  98. data/spec/dummy/app/views/services/index.html.haml +9 -9
  99. data/spec/dummy/app/views/services/service.html.haml +2 -2
  100. data/spec/dummy/app/views/temp/_part2.html.haml +1 -0
  101. data/spec/dummy/app/views/temp/html1.html +1 -1
  102. data/spec/dummy/app/views/temp/p1.html.haml +6 -6
  103. data/spec/dummy/app/views/temp/t1.html.haml +13 -13
  104. data/spec/dummy/app/views/temp9/t2.html +8 -8
  105. data/spec/dummy/app/views/workers/_breadcrumb_worker.html.haml +11 -11
  106. data/spec/dummy/app/views/workers/_breadcrumb_workers.html.haml +9 -9
  107. data/spec/dummy/app/views/workers/_contacts_our.html.haml +3 -3
  108. data/spec/dummy/app/views/workers/_list_worker.html.haml +46 -46
  109. data/spec/dummy/app/views/workers/_list_workers.html.haml +6 -6
  110. data/spec/dummy/app/views/workers/_share_js.html.haml +22 -22
  111. data/spec/dummy/app/views/workers/_share_worker.html.haml +11 -11
  112. data/spec/dummy/app/views/workers/_show_info.html.haml +53 -53
  113. data/spec/dummy/app/views/workers/_tabs.html.haml +11 -11
  114. data/spec/dummy/app/views/workers/contacts.html.haml +19 -19
  115. data/spec/dummy/app/views/workers/index.html.haml +49 -49
  116. data/spec/dummy/app/views/workers/portfolio.html.haml +20 -20
  117. data/spec/dummy/app/views/workers/services.html.haml +11 -11
  118. data/spec/dummy/app/views/workers/show.html.haml +53 -53
  119. data/spec/dummy/app/views/workers/show_notfound.html.haml +8 -8
  120. data/spec/dummy/app/views/workers/t2.html.haml +1 -1
  121. data/spec/dummy/app/views/workers/work.html.haml +43 -43
  122. data/spec/dummy/config/tinymce.yml +5 -5
  123. data/spec/dummy/db/schema.rb +164 -164
  124. data/spec/dummy/log/development.log +20396 -0
  125. data/spec/dummy/log/test.log +203 -0
  126. data/spec/dummy/tmp/cache/assets/development/sass/0abc660c880b2e10d695d713e519e6a4257cd348/application.css.scssc +0 -0
  127. data/spec/dummy/tmp/cache/assets/development/sass/0abc660c880b2e10d695d713e519e6a4257cd348/bootstrap_and_overrides.css.scssc +0 -0
  128. data/spec/dummy/tmp/cache/assets/development/sass/0abc660c880b2e10d695d713e519e6a4257cd348/bootstrap_custom.css.scssc +0 -0
  129. data/spec/dummy/tmp/cache/assets/development/sass/0abc660c880b2e10d695d713e519e6a4257cd348/bootstrap_variables.css.scssc +0 -0
  130. data/spec/dummy/tmp/cache/assets/development/sass/0abc660c880b2e10d695d713e519e6a4257cd348/tpl.css.scssc +0 -0
  131. data/spec/dummy/tmp/cache/assets/development/sass/18577b7353d72dbc7e81d46af07240af8557f987/_hacks.scssc +0 -0
  132. data/spec/dummy/tmp/cache/assets/development/sass/255a203cf5ecbb5470dfd267d6d4b923c8f1e5f0/_css3.scssc +0 -0
  133. data/spec/dummy/tmp/cache/assets/development/sass/255a203cf5ecbb5470dfd267d6d4b923c8f1e5f0/_support.scssc +0 -0
  134. data/spec/dummy/tmp/cache/assets/development/sass/4b8b59c3cee3225b46cdcaa54f7d0474421be9c6/_bootstrap-sprockets.scssc +0 -0
  135. data/spec/dummy/tmp/cache/assets/development/sass/7f871ea7e3a8127767d5a5868622ef2909611f26/noskin.css.scssc +0 -0
  136. data/spec/dummy/tmp/cache/assets/development/sass/a1b4b92b7663fe8c3e3678ca845c8a0566c3ca13/admin.css.scssc +0 -0
  137. data/spec/dummy/tmp/cache/assets/development/sass/a1b4b92b7663fe8c3e3678ca845c8a0566c3ca13/admin_tpl.css.scssc +0 -0
  138. data/spec/dummy/tmp/cache/assets/development/sass/a1b4b92b7663fe8c3e3678ca845c8a0566c3ca13/bootstrap_and_overrides.css.scssc +0 -0
  139. data/spec/dummy/tmp/cache/assets/development/sass/a1b4b92b7663fe8c3e3678ca845c8a0566c3ca13/bootstrap_custom.css.scssc +0 -0
  140. data/spec/dummy/tmp/cache/assets/development/sass/a1b4b92b7663fe8c3e3678ca845c8a0566c3ca13/bootstrap_variables.css.scssc +0 -0
  141. data/spec/dummy/tmp/cache/assets/development/sass/a1b4b92b7663fe8c3e3678ca845c8a0566c3ca13/colors.css.scssc +0 -0
  142. data/spec/dummy/tmp/cache/assets/development/sass/a1b4b92b7663fe8c3e3678ca845c8a0566c3ca13/tinymce.css.scssc +0 -0
  143. data/spec/dummy/tmp/cache/assets/development/sass/a1b4b92b7663fe8c3e3678ca845c8a0566c3ca13/tpl.css.scssc +0 -0
  144. data/spec/dummy/tmp/cache/assets/development/sass/bfa17faa2a4aa370d46a5900b72c48f05b4837d1/_alerts.scssc +0 -0
  145. data/spec/dummy/tmp/cache/assets/development/sass/bfa17faa2a4aa370d46a5900b72c48f05b4837d1/_background-variant.scssc +0 -0
  146. data/spec/dummy/tmp/cache/assets/development/sass/bfa17faa2a4aa370d46a5900b72c48f05b4837d1/_border-radius.scssc +0 -0
  147. data/spec/dummy/tmp/cache/assets/development/sass/bfa17faa2a4aa370d46a5900b72c48f05b4837d1/_buttons.scssc +0 -0
  148. data/spec/dummy/tmp/cache/assets/development/sass/bfa17faa2a4aa370d46a5900b72c48f05b4837d1/_center-block.scssc +0 -0
  149. data/spec/dummy/tmp/cache/assets/development/sass/bfa17faa2a4aa370d46a5900b72c48f05b4837d1/_clearfix.scssc +0 -0
  150. data/spec/dummy/tmp/cache/assets/development/sass/bfa17faa2a4aa370d46a5900b72c48f05b4837d1/_forms.scssc +0 -0
  151. data/spec/dummy/tmp/cache/assets/development/sass/bfa17faa2a4aa370d46a5900b72c48f05b4837d1/_gradients.scssc +0 -0
  152. data/spec/dummy/tmp/cache/assets/development/sass/bfa17faa2a4aa370d46a5900b72c48f05b4837d1/_grid-framework.scssc +0 -0
  153. data/spec/dummy/tmp/cache/assets/development/sass/bfa17faa2a4aa370d46a5900b72c48f05b4837d1/_grid.scssc +0 -0
  154. data/spec/dummy/tmp/cache/assets/development/sass/bfa17faa2a4aa370d46a5900b72c48f05b4837d1/_hide-text.scssc +0 -0
  155. data/spec/dummy/tmp/cache/assets/development/sass/bfa17faa2a4aa370d46a5900b72c48f05b4837d1/_image.scssc +0 -0
  156. data/spec/dummy/tmp/cache/assets/development/sass/bfa17faa2a4aa370d46a5900b72c48f05b4837d1/_labels.scssc +0 -0
  157. data/spec/dummy/tmp/cache/assets/development/sass/bfa17faa2a4aa370d46a5900b72c48f05b4837d1/_list-group.scssc +0 -0
  158. data/spec/dummy/tmp/cache/assets/development/sass/bfa17faa2a4aa370d46a5900b72c48f05b4837d1/_nav-divider.scssc +0 -0
  159. data/spec/dummy/tmp/cache/assets/development/sass/bfa17faa2a4aa370d46a5900b72c48f05b4837d1/_nav-vertical-align.scssc +0 -0
  160. data/spec/dummy/tmp/cache/assets/development/sass/bfa17faa2a4aa370d46a5900b72c48f05b4837d1/_opacity.scssc +0 -0
  161. data/spec/dummy/tmp/cache/assets/development/sass/bfa17faa2a4aa370d46a5900b72c48f05b4837d1/_pagination.scssc +0 -0
  162. data/spec/dummy/tmp/cache/assets/development/sass/bfa17faa2a4aa370d46a5900b72c48f05b4837d1/_panels.scssc +0 -0
  163. data/spec/dummy/tmp/cache/assets/development/sass/bfa17faa2a4aa370d46a5900b72c48f05b4837d1/_progress-bar.scssc +0 -0
  164. data/spec/dummy/tmp/cache/assets/development/sass/bfa17faa2a4aa370d46a5900b72c48f05b4837d1/_reset-filter.scssc +0 -0
  165. data/spec/dummy/tmp/cache/assets/development/sass/bfa17faa2a4aa370d46a5900b72c48f05b4837d1/_resize.scssc +0 -0
  166. data/spec/dummy/tmp/cache/assets/development/sass/bfa17faa2a4aa370d46a5900b72c48f05b4837d1/_responsive-visibility.scssc +0 -0
  167. data/spec/dummy/tmp/cache/assets/development/sass/bfa17faa2a4aa370d46a5900b72c48f05b4837d1/_size.scssc +0 -0
  168. data/spec/dummy/tmp/cache/assets/development/sass/bfa17faa2a4aa370d46a5900b72c48f05b4837d1/_tab-focus.scssc +0 -0
  169. data/spec/dummy/tmp/cache/assets/development/sass/bfa17faa2a4aa370d46a5900b72c48f05b4837d1/_table-row.scssc +0 -0
  170. data/spec/dummy/tmp/cache/assets/development/sass/bfa17faa2a4aa370d46a5900b72c48f05b4837d1/_text-emphasis.scssc +0 -0
  171. data/spec/dummy/tmp/cache/assets/development/sass/bfa17faa2a4aa370d46a5900b72c48f05b4837d1/_text-overflow.scssc +0 -0
  172. data/spec/dummy/tmp/cache/assets/development/sass/bfa17faa2a4aa370d46a5900b72c48f05b4837d1/_vendor-prefixes.scssc +0 -0
  173. data/spec/dummy/tmp/cache/assets/development/sass/e04ca948242d213270bfe676c8b96e7b33226468/_appearance.scssc +0 -0
  174. data/spec/dummy/tmp/cache/assets/development/sass/e04ca948242d213270bfe676c8b96e7b33226468/_background-clip.scssc +0 -0
  175. data/spec/dummy/tmp/cache/assets/development/sass/e04ca948242d213270bfe676c8b96e7b33226468/_background-origin.scssc +0 -0
  176. data/spec/dummy/tmp/cache/assets/development/sass/e04ca948242d213270bfe676c8b96e7b33226468/_background-size.scssc +0 -0
  177. data/spec/dummy/tmp/cache/assets/development/sass/e04ca948242d213270bfe676c8b96e7b33226468/_border-radius.scssc +0 -0
  178. data/spec/dummy/tmp/cache/assets/development/sass/e04ca948242d213270bfe676c8b96e7b33226468/_box-shadow.scssc +0 -0
  179. data/spec/dummy/tmp/cache/assets/development/sass/e04ca948242d213270bfe676c8b96e7b33226468/_box-sizing.scssc +0 -0
  180. data/spec/dummy/tmp/cache/assets/development/sass/e04ca948242d213270bfe676c8b96e7b33226468/_box.scssc +0 -0
  181. data/spec/dummy/tmp/cache/assets/development/sass/e04ca948242d213270bfe676c8b96e7b33226468/_columns.scssc +0 -0
  182. data/spec/dummy/tmp/cache/assets/development/sass/e04ca948242d213270bfe676c8b96e7b33226468/_filter.scssc +0 -0
  183. data/spec/dummy/tmp/cache/assets/development/sass/e04ca948242d213270bfe676c8b96e7b33226468/_font-face.scssc +0 -0
  184. data/spec/dummy/tmp/cache/assets/development/sass/e04ca948242d213270bfe676c8b96e7b33226468/_hyphenation.scssc +0 -0
  185. data/spec/dummy/tmp/cache/assets/development/sass/e04ca948242d213270bfe676c8b96e7b33226468/_images.scssc +0 -0
  186. data/spec/dummy/tmp/cache/assets/development/sass/e04ca948242d213270bfe676c8b96e7b33226468/_inline-block.scssc +0 -0
  187. data/spec/dummy/tmp/cache/assets/development/sass/e04ca948242d213270bfe676c8b96e7b33226468/_opacity.scssc +0 -0
  188. data/spec/dummy/tmp/cache/assets/development/sass/e04ca948242d213270bfe676c8b96e7b33226468/_regions.scssc +0 -0
  189. data/spec/dummy/tmp/cache/assets/development/sass/e04ca948242d213270bfe676c8b96e7b33226468/_shared.scssc +0 -0
  190. data/spec/dummy/tmp/cache/assets/development/sass/e04ca948242d213270bfe676c8b96e7b33226468/_text-shadow.scssc +0 -0
  191. data/spec/dummy/tmp/cache/assets/development/sass/e04ca948242d213270bfe676c8b96e7b33226468/_transform.scssc +0 -0
  192. data/spec/dummy/tmp/cache/assets/development/sass/e04ca948242d213270bfe676c8b96e7b33226468/_transition.scssc +0 -0
  193. data/spec/dummy/tmp/cache/assets/development/sass/e04ca948242d213270bfe676c8b96e7b33226468/_user-interface.scssc +0 -0
  194. data/spec/dummy/tmp/cache/assets/development/sass/e541a95436c6e387d69ff457c2fe7f7bd11c2069/_alerts.scssc +0 -0
  195. data/spec/dummy/tmp/cache/assets/development/sass/e541a95436c6e387d69ff457c2fe7f7bd11c2069/_badges.scssc +0 -0
  196. data/spec/dummy/tmp/cache/assets/development/sass/e541a95436c6e387d69ff457c2fe7f7bd11c2069/_breadcrumbs.scssc +0 -0
  197. data/spec/dummy/tmp/cache/assets/development/sass/e541a95436c6e387d69ff457c2fe7f7bd11c2069/_button-groups.scssc +0 -0
  198. data/spec/dummy/tmp/cache/assets/development/sass/e541a95436c6e387d69ff457c2fe7f7bd11c2069/_buttons.scssc +0 -0
  199. data/spec/dummy/tmp/cache/assets/development/sass/e541a95436c6e387d69ff457c2fe7f7bd11c2069/_carousel.scssc +0 -0
  200. data/spec/dummy/tmp/cache/assets/development/sass/e541a95436c6e387d69ff457c2fe7f7bd11c2069/_close.scssc +0 -0
  201. data/spec/dummy/tmp/cache/assets/development/sass/e541a95436c6e387d69ff457c2fe7f7bd11c2069/_code.scssc +0 -0
  202. data/spec/dummy/tmp/cache/assets/development/sass/e541a95436c6e387d69ff457c2fe7f7bd11c2069/_component-animations.scssc +0 -0
  203. data/spec/dummy/tmp/cache/assets/development/sass/e541a95436c6e387d69ff457c2fe7f7bd11c2069/_dropdowns.scssc +0 -0
  204. data/spec/dummy/tmp/cache/assets/development/sass/e541a95436c6e387d69ff457c2fe7f7bd11c2069/_forms.scssc +0 -0
  205. data/spec/dummy/tmp/cache/assets/development/sass/e541a95436c6e387d69ff457c2fe7f7bd11c2069/_glyphicons.scssc +0 -0
  206. data/spec/dummy/tmp/cache/assets/development/sass/e541a95436c6e387d69ff457c2fe7f7bd11c2069/_grid.scssc +0 -0
  207. data/spec/dummy/tmp/cache/assets/development/sass/e541a95436c6e387d69ff457c2fe7f7bd11c2069/_input-groups.scssc +0 -0
  208. data/spec/dummy/tmp/cache/assets/development/sass/e541a95436c6e387d69ff457c2fe7f7bd11c2069/_jumbotron.scssc +0 -0
  209. data/spec/dummy/tmp/cache/assets/development/sass/e541a95436c6e387d69ff457c2fe7f7bd11c2069/_labels.scssc +0 -0
  210. data/spec/dummy/tmp/cache/assets/development/sass/e541a95436c6e387d69ff457c2fe7f7bd11c2069/_list-group.scssc +0 -0
  211. data/spec/dummy/tmp/cache/assets/development/sass/e541a95436c6e387d69ff457c2fe7f7bd11c2069/_media.scssc +0 -0
  212. data/spec/dummy/tmp/cache/assets/development/sass/e541a95436c6e387d69ff457c2fe7f7bd11c2069/_mixins.scssc +0 -0
  213. data/spec/dummy/tmp/cache/assets/development/sass/e541a95436c6e387d69ff457c2fe7f7bd11c2069/_modals.scssc +0 -0
  214. data/spec/dummy/tmp/cache/assets/development/sass/e541a95436c6e387d69ff457c2fe7f7bd11c2069/_navbar.scssc +0 -0
  215. data/spec/dummy/tmp/cache/assets/development/sass/e541a95436c6e387d69ff457c2fe7f7bd11c2069/_navs.scssc +0 -0
  216. data/spec/dummy/tmp/cache/assets/development/sass/e541a95436c6e387d69ff457c2fe7f7bd11c2069/_normalize.scssc +0 -0
  217. data/spec/dummy/tmp/cache/assets/development/sass/e541a95436c6e387d69ff457c2fe7f7bd11c2069/_pager.scssc +0 -0
  218. data/spec/dummy/tmp/cache/assets/development/sass/e541a95436c6e387d69ff457c2fe7f7bd11c2069/_pagination.scssc +0 -0
  219. data/spec/dummy/tmp/cache/assets/development/sass/e541a95436c6e387d69ff457c2fe7f7bd11c2069/_panels.scssc +0 -0
  220. data/spec/dummy/tmp/cache/assets/development/sass/e541a95436c6e387d69ff457c2fe7f7bd11c2069/_popovers.scssc +0 -0
  221. data/spec/dummy/tmp/cache/assets/development/sass/e541a95436c6e387d69ff457c2fe7f7bd11c2069/_print.scssc +0 -0
  222. data/spec/dummy/tmp/cache/assets/development/sass/e541a95436c6e387d69ff457c2fe7f7bd11c2069/_progress-bars.scssc +0 -0
  223. data/spec/dummy/tmp/cache/assets/development/sass/e541a95436c6e387d69ff457c2fe7f7bd11c2069/_responsive-embed.scssc +0 -0
  224. data/spec/dummy/tmp/cache/assets/development/sass/e541a95436c6e387d69ff457c2fe7f7bd11c2069/_responsive-utilities.scssc +0 -0
  225. data/spec/dummy/tmp/cache/assets/development/sass/e541a95436c6e387d69ff457c2fe7f7bd11c2069/_scaffolding.scssc +0 -0
  226. data/spec/dummy/tmp/cache/assets/development/sass/e541a95436c6e387d69ff457c2fe7f7bd11c2069/_tables.scssc +0 -0
  227. data/spec/dummy/tmp/cache/assets/development/sass/e541a95436c6e387d69ff457c2fe7f7bd11c2069/_thumbnails.scssc +0 -0
  228. data/spec/dummy/tmp/cache/assets/development/sass/e541a95436c6e387d69ff457c2fe7f7bd11c2069/_tooltip.scssc +0 -0
  229. data/spec/dummy/tmp/cache/assets/development/sass/e541a95436c6e387d69ff457c2fe7f7bd11c2069/_type.scssc +0 -0
  230. data/spec/dummy/tmp/cache/assets/development/sass/e541a95436c6e387d69ff457c2fe7f7bd11c2069/_utilities.scssc +0 -0
  231. data/spec/dummy/tmp/cache/assets/development/sass/e541a95436c6e387d69ff457c2fe7f7bd11c2069/_variables.scssc +0 -0
  232. data/spec/dummy/tmp/cache/assets/development/sass/e541a95436c6e387d69ff457c2fe7f7bd11c2069/_wells.scssc +0 -0
  233. data/spec/dummy/tmp/cache/assets/development/sass/fc41a79de5ec40d34c8a83221f3f3da2c64f4153/font-awesome.css.erbc +0 -0
  234. data/spec/dummy/tmp/cache/assets/development/sprockets/002bd8f28c62a795a10ce5716ceffc21 +0 -0
  235. data/spec/dummy/tmp/cache/assets/development/sprockets/053f826d1ea01a2fac355de0755e5c40 +0 -0
  236. data/spec/dummy/tmp/cache/assets/development/sprockets/05e27d4921b00a0fdddb47a737a64494 +0 -0
  237. data/spec/dummy/tmp/cache/assets/development/sprockets/0a470277dd21c166b9dfb68b03d34d5c +0 -0
  238. data/spec/dummy/tmp/cache/assets/development/sprockets/0b1671e1bffda60e6a95f72b9176d628 +0 -0
  239. data/spec/dummy/tmp/cache/assets/development/sprockets/0c01383de62960e3667c7bf3788ecdb6 +0 -0
  240. data/spec/dummy/tmp/cache/assets/development/sprockets/0d2f255829ff9f72d98dead4f35ddf02 +0 -0
  241. data/spec/dummy/tmp/cache/assets/development/sprockets/11f54468370774efca0fe1afb2ebf1d9 +0 -0
  242. data/spec/dummy/tmp/cache/assets/development/sprockets/1c0ef71c34dc1d573e1b4b527116e3cc +0 -0
  243. data/spec/dummy/tmp/cache/assets/development/sprockets/2168c08c151d642aa46ea4bc6283929c +0 -0
  244. data/spec/dummy/tmp/cache/assets/development/sprockets/2a9369c8d28de014045a120b692e8139 +0 -0
  245. data/spec/dummy/tmp/cache/assets/development/sprockets/2f5173deea6c795b8fdde723bb4b63af +0 -0
  246. data/spec/dummy/tmp/cache/assets/development/sprockets/2f7d38a264678a2db4a0d569a3313cb1 +0 -0
  247. data/spec/dummy/tmp/cache/assets/development/sprockets/3240ef40c1dc9d13156bbd790ec2651a +0 -0
  248. data/spec/dummy/tmp/cache/assets/development/sprockets/332dfe4887cbad3adbd20e6609fa4960 +0 -0
  249. data/spec/dummy/tmp/cache/assets/development/sprockets/3347cc312918facec5bbac684ea65715 +0 -0
  250. data/spec/dummy/tmp/cache/assets/development/sprockets/3cd4037d8c32ad8fcdd5e3bbb8dfc35a +0 -0
  251. data/spec/dummy/tmp/cache/assets/development/sprockets/4016d2fd0b776ceb82fcbfbc5d2e26b1 +0 -0
  252. data/spec/dummy/tmp/cache/assets/development/sprockets/43dc3e92cd09deb0fc54dd97b46935e9 +0 -0
  253. data/spec/dummy/tmp/cache/assets/development/sprockets/452d7e35d5a012ae12fa7346fcf2239b +0 -0
  254. data/spec/dummy/tmp/cache/assets/development/sprockets/49c7cb5dd916ffc9e87ce3b989c92062 +0 -0
  255. data/spec/dummy/tmp/cache/assets/development/sprockets/529a74a4530de52f6c3ebbf107ffe9f2 +0 -0
  256. data/spec/dummy/tmp/cache/assets/development/sprockets/55a2847335c39261e1efe764deb18592 +0 -0
  257. data/spec/dummy/tmp/cache/assets/development/sprockets/56c7eb172a7423728c45d0a751d198e3 +0 -0
  258. data/spec/dummy/tmp/cache/assets/development/sprockets/6789fe765d536063c998330523bb12b9 +0 -0
  259. data/spec/dummy/tmp/cache/assets/development/sprockets/678a2e392e656b8132f0420e4ec28ed6 +0 -0
  260. data/spec/dummy/tmp/cache/assets/development/sprockets/6843f0414f73089579ae0f9fddf7b38f +0 -0
  261. data/spec/dummy/tmp/cache/assets/development/sprockets/6c7c58744c14732af9bf574870fdf07e +0 -0
  262. data/spec/dummy/tmp/cache/assets/development/sprockets/6cdbd6f171a27a578bcb07dd5bfa83a2 +0 -0
  263. data/spec/dummy/tmp/cache/assets/development/sprockets/6e431ed1dfb5bbcbd33a5f9e069dd3ab +0 -0
  264. data/spec/dummy/tmp/cache/assets/development/sprockets/6f943f22c610e6417422e4a13e0bcc0d +0 -0
  265. data/spec/dummy/tmp/cache/assets/development/sprockets/73fbaa501dc0b072cf2c27fa7dfe0d91 +0 -0
  266. data/spec/dummy/tmp/cache/assets/development/sprockets/7c886717bced4d59ab89e012b52f40de +0 -0
  267. data/spec/dummy/tmp/cache/assets/development/sprockets/821470da3272c8b99070972d4f4f58ca +0 -0
  268. data/spec/dummy/tmp/cache/assets/development/sprockets/88d843fcb07453d1057fac1e254fde0d +0 -0
  269. data/spec/dummy/tmp/cache/assets/development/sprockets/8956737a82f17db48d50e13f133aeefc +0 -0
  270. data/spec/dummy/tmp/cache/assets/development/sprockets/8ab512c9b33ac90e699b73469d71f061 +0 -0
  271. data/spec/dummy/tmp/cache/assets/development/sprockets/8b5a7992567ebbeb9a882d074778f8c8 +0 -0
  272. data/spec/dummy/tmp/cache/assets/development/sprockets/8d71fe4f0e2910900097bdc07bf2d6af +0 -0
  273. data/spec/dummy/tmp/cache/assets/development/sprockets/8e1785ddbfab42cd2df0416eb3932253 +0 -0
  274. data/spec/dummy/tmp/cache/assets/development/sprockets/9024d024c62c2668836b1e1b7b3b78cc +0 -0
  275. data/spec/dummy/tmp/cache/assets/development/sprockets/928ed298f875a25727ca516f5c03f344 +0 -0
  276. data/spec/dummy/tmp/cache/assets/development/sprockets/97c1e12a09973e0fb97f23a1dc496443 +0 -0
  277. data/spec/dummy/tmp/cache/assets/development/sprockets/991576185140a77411185839fd0533f1 +0 -0
  278. data/spec/dummy/tmp/cache/assets/development/sprockets/99e8d6370ba85ec4a61d953f5ed261af +0 -0
  279. data/spec/dummy/tmp/cache/assets/development/sprockets/9ee80730ab26986d507820ac7a288d5c +0 -0
  280. data/spec/dummy/tmp/cache/assets/development/sprockets/a3faca31eb11ba1a981535f9c8408282 +0 -0
  281. data/spec/dummy/tmp/cache/assets/development/sprockets/a5c68a2aec806face32c749f380f1e14 +0 -0
  282. data/spec/dummy/tmp/cache/assets/development/sprockets/a64dbcf0e4afe0985b1abd3e209d17cd +0 -0
  283. data/spec/dummy/tmp/cache/assets/development/sprockets/a6d357fbe03dae6f590180f6c5e0e148 +0 -0
  284. data/spec/dummy/tmp/cache/assets/development/sprockets/aa58fb159780a7200a1bc4c6844cc5c4 +0 -0
  285. data/spec/dummy/tmp/cache/assets/development/sprockets/aaba73a43e02d8c6550bae851f17e7a0 +0 -0
  286. data/spec/dummy/tmp/cache/assets/development/sprockets/af26c017afcf68f1edd44a4c9bb942e4 +0 -0
  287. data/spec/dummy/tmp/cache/assets/development/sprockets/b3defd466aec80b128284b8d85324630 +0 -0
  288. data/spec/dummy/tmp/cache/assets/development/sprockets/b48ed8a3de3ca66055ee4fd18b16421f +0 -0
  289. data/spec/dummy/tmp/cache/assets/development/sprockets/ba9859d0d2b7d4d7d5b03ff3a71ed478 +0 -0
  290. data/spec/dummy/tmp/cache/assets/development/sprockets/bcca522c6302f184f12fe0e8a7d7e71a +0 -0
  291. data/spec/dummy/tmp/cache/assets/development/sprockets/be8a0cd6c3605b9d7c22642609316a9f +0 -0
  292. data/spec/dummy/tmp/cache/assets/development/sprockets/c11c6d97cfc7ef7945fa87f14b44445c +0 -0
  293. data/spec/dummy/tmp/cache/assets/development/sprockets/c13fc73ceafa45876a901b3e775b83ae +0 -0
  294. data/spec/dummy/tmp/cache/assets/development/sprockets/c5f3450b5366b6fbdc4172ce089fba48 +0 -0
  295. data/spec/dummy/tmp/cache/assets/development/sprockets/c982bb1e71844744a60dc9b4afcb2f49 +0 -0
  296. data/spec/dummy/tmp/cache/assets/development/sprockets/cf24c3f1bb8adb1f168758f2bd9775c9 +0 -0
  297. data/spec/dummy/tmp/cache/assets/development/sprockets/cffd775d018f68ce5dba1ee0d951a994 +0 -0
  298. data/spec/dummy/tmp/cache/assets/development/sprockets/d3e5a199890ba7c706fc62c2b891714d +0 -0
  299. data/spec/dummy/tmp/cache/assets/development/sprockets/d584baf83d8a779d945f9668f902fa7c +0 -0
  300. data/spec/dummy/tmp/cache/assets/development/sprockets/d71b820ce5f8b310e466f517bd3a8e4b +0 -0
  301. data/spec/dummy/tmp/cache/assets/development/sprockets/d8dab59d17daf5a5081153e2ad7d09b4 +0 -0
  302. data/spec/dummy/tmp/cache/assets/development/sprockets/dd4a8658311b7a2cd8effa6479827559 +0 -0
  303. data/spec/dummy/tmp/cache/assets/development/sprockets/e11970a225a09526aac3f76d7ee91822 +0 -0
  304. data/spec/dummy/tmp/cache/assets/development/sprockets/e3dd086dd858b5bff9cfd60a031c2091 +0 -0
  305. data/spec/dummy/tmp/cache/assets/development/sprockets/e43bcf201d76cdf6e1fe345195c1cd9e +0 -0
  306. data/spec/dummy/tmp/cache/assets/development/sprockets/e945ca604ee0240455a5652953b3e495 +0 -0
  307. data/spec/dummy/tmp/cache/assets/development/sprockets/ec33505f0e2ed4dd12951ecceffa3695 +0 -0
  308. data/spec/dummy/tmp/cache/assets/development/sprockets/ee287313e28f341f83628dec0a353fa6 +0 -0
  309. data/spec/dummy/tmp/cache/assets/development/sprockets/ee9a23832dc2a49ee6ec6d3f1d6a0e1f +0 -0
  310. data/spec/dummy/tmp/cache/assets/development/sprockets/ef2d6862f5fd690c5387cafd88944a9f +0 -0
  311. data/spec/dummy/tmp/cache/assets/development/sprockets/ef8c3824b85ed745cad651aadda4f2b8 +0 -0
  312. data/spec/dummy/tmp/cache/assets/development/sprockets/f557612d05bb9fea499dce8352b3f0ca +0 -0
  313. data/spec/dummy/tmp/cache/assets/development/sprockets/f7cbd26ba1d28d48de824f0e94586655 +0 -0
  314. data/spec/dummy/tmp/cache/assets/development/sprockets/f7f3056583a2454471a4a5f7200dcefa +0 -0
  315. data/spec/dummy/tmp/cache/assets/development/sprockets/f9c51fa87975943d31bc1bfd7cb684c6 +0 -0
  316. data/spec/dummy/tmp/cache/assets/development/sprockets/ff9ed89418a3f78032b8f8184dd98e80 +0 -0
  317. data/spec/factories/page.rb +25 -25
  318. data/spec/models/page_spec.rb +92 -92
  319. data/spec/spec_helper.rb +89 -89
  320. data/spec/support/factory_girl.rb +15 -15
  321. metadata +1731 -1345
@@ -1,10 +1,10 @@
1
- module Optimacms
2
- class PageTranslation < ActiveRecord::Base
3
- self.table_name = 'cms_pages_translation'
4
-
5
- belongs_to :page, :foreign_key => 'item_id', :class_name => 'Page'
6
- belongs_to :page
7
-
8
-
9
- end
10
- end
1
+ module Optimacms
2
+ class PageTranslation < ActiveRecord::Base
3
+ self.table_name = 'cms_pages_translation'
4
+
5
+ belongs_to :page, :foreign_key => 'item_id', :class_name => 'Page'
6
+ belongs_to :page
7
+
8
+
9
+ end
10
+ end
@@ -1,390 +1,390 @@
1
- module Optimacms
2
- class Template < ActiveRecord::Base
3
- self.table_name = 'cms_templates'
4
-
5
- EXTENSION_DEFAULT = 'html'
6
- EXTENSIONS = {'blank'=>'', 'html'=>'html', 'erb'=>'html.erb', 'haml'=>'html.haml'}
7
-
8
-
9
- belongs_to :type, :foreign_key => 'type_id', :class_name => 'TemplateType'
10
-
11
- before_validation :_before_validation
12
- before_create :_before_create
13
- before_update :_before_update
14
- before_destroy :_before_destroy
15
-
16
- # tree
17
- has_ancestry
18
-
19
- #
20
- #validate :check_unique_path, unless: :is_folder?
21
- validates_uniqueness_of :basepath, :scope => :is_folder
22
-
23
- #validate :check_parent_folder_exists, unless: :is_folder?
24
-
25
- #
26
- paginates_per 10
27
-
28
-
29
- # scopes
30
- scope :folders, -> { where(is_folder: true) }
31
- scope :layouts, -> { where(is_folder: false, type_id: TemplateType::TYPE_LAYOUT) }
32
-
33
-
34
- # search
35
- scope :of_parent, lambda { |parent_id| where_parent(parent_id) }
36
-
37
- searchable_by_simple_filter
38
-
39
-
40
-
41
-
42
-
43
- ###
44
- def to_s
45
- "#{title} (#{basepath})"
46
- end
47
-
48
-
49
- ### settings
50
-
51
- def self.base_dir
52
- Rails.root.to_s + '/app/views/'
53
- end
54
-
55
-
56
-
57
-
58
-
59
- ### properties
60
-
61
- def parent_title
62
- self.parent.title
63
- end
64
-
65
-
66
- def has_code?
67
- ['haml', 'erb', 'blank'].include?(self.tpl_format)
68
- end
69
-
70
- def is_folder?
71
- self.is_folder
72
- end
73
-
74
- def is_layout?
75
- return self.type_id==TemplateType::TYPE_LAYOUT
76
- end
77
-
78
- def is_type_page?
79
- return self.type_id==TemplateType::TYPE_PAGE
80
- end
81
-
82
- def is_type_partial?
83
- return self.type_id==TemplateType::TYPE_PARTIAL
84
- end
85
-
86
-
87
-
88
- ##### search
89
-
90
- def self.where_parent(parent_id)
91
- if parent_id==0
92
- roots
93
- elsif parent_id>0
94
- children_of(parent_id.to_s)
95
- end
96
- end
97
-
98
-
99
-
100
- #### operations
101
-
102
- def attach
103
- # check if file exists
104
- if !content_file_exists?
105
- errors.add(:attach, "file not found")
106
- return false
107
- end
108
-
109
- save
110
- end
111
-
112
-
113
-
114
- #### path
115
-
116
- def path(lang='')
117
- return nil if self.basename.nil?
118
- self.basedirpath + filename_base + Template.filename_lang_postfix(lang) + Template.filename_ext_with_dot(self.tpl_format)
119
- end
120
-
121
- def fullpath(lang='')
122
- f = self.path(lang)
123
- return nil if f.nil?
124
- Template.base_dir + f
125
- end
126
-
127
- def content_file_exists?(lang='')
128
- postfixes = EXTENSIONS.map{|k,v| '.'+v}
129
-
130
- found = false
131
- postfixes.each do |p|
132
- if File.exists?(self.fullpath(lang))
133
- found = true
134
- break
135
- end
136
- end
137
- found
138
- end
139
-
140
-
141
- ### validations
142
-
143
- def check_parent_folder_exists
144
- if self.parent_id.nil? && !self.basedirpath.blank?
145
- errors.add(:basedirpath, "folder not exists. create it first")
146
- end
147
- end
148
-
149
-
150
-
151
-
152
- ##### folder
153
-
154
- def folder_path
155
- return nil if self.basepath.nil?
156
- self.basepath+'/'
157
- end
158
-
159
- def folder_fullpath
160
- f = self.folder_path
161
- return nil if f.nil?
162
- Template.base_dir + f
163
- end
164
-
165
-
166
-
167
- ### content
168
-
169
- def content(lang='')
170
- filename = fullpath(lang)
171
- return nil if filename.nil?
172
- return '' if !File.exists? filename
173
- File.read(filename)
174
- end
175
-
176
- def content=(v, lang='')
177
- File.open(self.fullpath(lang), "w+") do |f|
178
- f.write(v)
179
- end
180
- end
181
-
182
-
183
- ### helpers for path
184
-
185
- # base filename depending on type
186
- # for page = name
187
- # for partial = _name
188
- def filename_base
189
- return '_'+self.basename if self.is_type_partial?
190
-
191
- self.basename
192
- end
193
-
194
-
195
- def self.filename_lang_postfix(lang)
196
- return '' if lang==''
197
- return '.'+lang
198
- end
199
-
200
- def self.filename_ext(format)
201
- EXTENSIONS[format]
202
- end
203
-
204
- def self.filename_ext_with_dot(format)
205
- ext = filename_ext(format)
206
- ext = '.'+ext unless ext.blank?
207
- ext
208
- end
209
-
210
-
211
- ### operations with path
212
-
213
- def set_basepath
214
- if self.parent.nil?
215
- self.basepath = self.basename
216
- self.basedirpath ||= ''
217
- else
218
- self.basepath = self.parent.basepath+'/'+self.basename
219
- self.basedirpath ||= self.parent.basepath+'/'
220
- end
221
-
222
- end
223
-
224
-
225
- def fix_basedirpath
226
- self.basedirpath ||= ''
227
- if !self.basedirpath.blank? && self.basedirpath[-1] !='/'
228
- self.basedirpath << '/'
229
- end
230
- end
231
-
232
- def set_basedirpath_from_parent
233
- v = ''
234
- if self.parent_id.nil?
235
- v = ''
236
- else
237
- v = self.parent.basepath+'/' if self.parent_id >0
238
- end
239
-
240
- self.basedirpath = v
241
- #v
242
- end
243
-
244
- def set_parent_from_basedirpath
245
- v = self.basedirpath
246
-
247
- # set parent_id from dir
248
- d = v.chop
249
- r = Template.where(is_folder: true, basepath: d).first
250
- if r
251
- self.parent_id = r.id
252
- else
253
- self.parent_id = nil
254
- end
255
- end
256
-
257
-
258
-
259
- #### callbacks
260
-
261
- def _before_validation
262
- fix_basedirpath
263
-
264
- # parent, basedirpath
265
- if self.parent_id.nil? && !self.basedirpath.blank?
266
- set_parent_from_basedirpath
267
- elsif self.basedirpath.nil? && !self.parent_id.nil?
268
- set_basedirpath_from_parent
269
- end
270
-
271
- set_basepath
272
- end
273
-
274
-
275
- def _before_create
276
- if self.is_folder
277
- # create dir on disk
278
- Fileutils::Fileutils.create_dir_if_not_exists self.folder_fullpath
279
- else
280
- # add folders if needed
281
- if self.parent_id.nil? && !self.basedirpath.blank?
282
- self.parent = Template.create_folders_tree(self.basedirpath)
283
- end
284
-
285
- end
286
-
287
- end
288
-
289
- def _before_update
290
- if self.is_folder
291
- oldpath = self.folder_fullpath
292
-
293
- self.set_basepath
294
-
295
- # rename dir on disk
296
- if self.basename_changed?
297
- raise "cannot change folder path"
298
-
299
- require 'fileutils'
300
- newpath = self.folder_fullpath
301
-
302
- if Dir.exists?(newpath)
303
- errors.add(:basename, 'Folder already exists')
304
- return false
305
- end
306
-
307
- FileUtils.mv oldpath, newpath
308
-
309
- # TODO: change paths for child templates
310
-
311
- end
312
-
313
- else
314
- # file
315
-
316
- # TODO: rename file
317
- #self.make_basepath
318
-
319
- end
320
-
321
- end
322
-
323
- def _before_destroy
324
- if self.is_folder
325
-
326
- # cannot delete not empty dir
327
- if !self.folder_empty?
328
- return false
329
- end
330
-
331
- # delete dir
332
- folder_delete
333
-
334
- else
335
- # file
336
-
337
-
338
- end
339
-
340
-
341
- true
342
- end
343
-
344
-
345
- # create folders if necessary - NOT WORKING
346
- def self.create_folders_tree(dirpath)
347
- a = dirpath.split /\//
348
-
349
- d = ''
350
- parent_current = nil
351
- prev_d = d
352
- a.each do |s|
353
- d = d + (d=='' ? '' : '/') +s
354
- r = Template.where(is_folder: true, basepath: d).first
355
- if r
356
- parent_current = r
357
- next
358
- end
359
- # create missing folder
360
- path_new = File.basename(d)
361
- basedirpath_new = prev_d
362
- r = Template.create(is_folder: true, basename: path_new, basedirpath: basedirpath_new, title: path_new, parent: parent_current)
363
- parent_current = r
364
-
365
- prev_d = d
366
- end
367
-
368
- parent_current
369
-
370
- end
371
-
372
-
373
- #### folders
374
-
375
- def folder_delete
376
- dirpath = self.folder_fullpath
377
- FileUtils.remove_dir(dirpath) if Dir.exists? dirpath
378
- end
379
-
380
- def folder_empty?
381
- dirpath = self.folder_fullpath
382
- if !Dir.exists? dirpath
383
- return true
384
- end
385
-
386
- return Dir.entries(dirpath).size == 2
387
- end
388
-
389
- end
390
- end
1
+ module Optimacms
2
+ class Template < ActiveRecord::Base
3
+ self.table_name = 'cms_templates'
4
+
5
+ EXTENSION_DEFAULT = 'html'
6
+ EXTENSIONS = {'blank'=>'', 'html'=>'html', 'erb'=>'html.erb', 'haml'=>'html.haml'}
7
+
8
+
9
+ belongs_to :type, :foreign_key => 'type_id', :class_name => 'TemplateType'
10
+
11
+ before_validation :_before_validation
12
+ before_create :_before_create
13
+ before_update :_before_update
14
+ before_destroy :_before_destroy
15
+
16
+ # tree
17
+ has_ancestry
18
+
19
+ #
20
+ #validate :check_unique_path, unless: :is_folder?
21
+ validates_uniqueness_of :basepath, :scope => :is_folder
22
+
23
+ #validate :check_parent_folder_exists, unless: :is_folder?
24
+
25
+ #
26
+ paginates_per 10
27
+
28
+
29
+ # scopes
30
+ scope :folders, -> { where(is_folder: true) }
31
+ scope :layouts, -> { where(is_folder: false, type_id: TemplateType::TYPE_LAYOUT) }
32
+
33
+
34
+ # search
35
+ scope :of_parent, lambda { |parent_id| where_parent(parent_id) }
36
+
37
+ searchable_by_simple_filter
38
+
39
+
40
+
41
+
42
+
43
+ ###
44
+ def to_s
45
+ "#{title} (#{basepath})"
46
+ end
47
+
48
+
49
+ ### settings
50
+
51
+ def self.base_dir
52
+ Rails.root.to_s + '/app/views/'
53
+ end
54
+
55
+
56
+
57
+
58
+
59
+ ### properties
60
+
61
+ def parent_title
62
+ self.parent.title
63
+ end
64
+
65
+
66
+ def has_code?
67
+ ['haml', 'erb', 'blank'].include?(self.tpl_format)
68
+ end
69
+
70
+ def is_folder?
71
+ self.is_folder
72
+ end
73
+
74
+ def is_layout?
75
+ return self.type_id==TemplateType::TYPE_LAYOUT
76
+ end
77
+
78
+ def is_type_page?
79
+ return self.type_id==TemplateType::TYPE_PAGE
80
+ end
81
+
82
+ def is_type_partial?
83
+ return self.type_id==TemplateType::TYPE_PARTIAL
84
+ end
85
+
86
+
87
+
88
+ ##### search
89
+
90
+ def self.where_parent(parent_id)
91
+ if parent_id==0
92
+ roots
93
+ elsif parent_id>0
94
+ children_of(parent_id.to_s)
95
+ end
96
+ end
97
+
98
+
99
+
100
+ #### operations
101
+
102
+ def attach
103
+ # check if file exists
104
+ if !content_file_exists?
105
+ errors.add(:attach, "file not found")
106
+ return false
107
+ end
108
+
109
+ save
110
+ end
111
+
112
+
113
+
114
+ #### path
115
+
116
+ def path(lang='')
117
+ return nil if self.basename.nil?
118
+ self.basedirpath + filename_base + Template.filename_lang_postfix(lang) + Template.filename_ext_with_dot(self.tpl_format)
119
+ end
120
+
121
+ def fullpath(lang='')
122
+ f = self.path(lang)
123
+ return nil if f.nil?
124
+ Template.base_dir + f
125
+ end
126
+
127
+ def content_file_exists?(lang='')
128
+ postfixes = EXTENSIONS.map{|k,v| '.'+v}
129
+
130
+ found = false
131
+ postfixes.each do |p|
132
+ if File.exists?(self.fullpath(lang))
133
+ found = true
134
+ break
135
+ end
136
+ end
137
+ found
138
+ end
139
+
140
+
141
+ ### validations
142
+
143
+ def check_parent_folder_exists
144
+ if self.parent_id.nil? && !self.basedirpath.blank?
145
+ errors.add(:basedirpath, "folder not exists. create it first")
146
+ end
147
+ end
148
+
149
+
150
+
151
+
152
+ ##### folder
153
+
154
+ def folder_path
155
+ return nil if self.basepath.nil?
156
+ self.basepath+'/'
157
+ end
158
+
159
+ def folder_fullpath
160
+ f = self.folder_path
161
+ return nil if f.nil?
162
+ Template.base_dir + f
163
+ end
164
+
165
+
166
+
167
+ ### content
168
+
169
+ def content(lang='')
170
+ filename = fullpath(lang)
171
+ return nil if filename.nil?
172
+ return '' if !File.exists? filename
173
+ File.read(filename)
174
+ end
175
+
176
+ def content=(v, lang='')
177
+ File.open(self.fullpath(lang), "w+") do |f|
178
+ f.write(v)
179
+ end
180
+ end
181
+
182
+
183
+ ### helpers for path
184
+
185
+ # base filename depending on type
186
+ # for page = name
187
+ # for partial = _name
188
+ def filename_base
189
+ return '_'+self.basename if self.is_type_partial?
190
+
191
+ self.basename
192
+ end
193
+
194
+
195
+ def self.filename_lang_postfix(lang)
196
+ return '' if lang==''
197
+ return '.'+lang
198
+ end
199
+
200
+ def self.filename_ext(format)
201
+ EXTENSIONS[format]
202
+ end
203
+
204
+ def self.filename_ext_with_dot(format)
205
+ ext = filename_ext(format)
206
+ ext = '.'+ext unless ext.blank?
207
+ ext
208
+ end
209
+
210
+
211
+ ### operations with path
212
+
213
+ def set_basepath
214
+ if self.parent.nil?
215
+ self.basepath = self.basename
216
+ self.basedirpath ||= ''
217
+ else
218
+ self.basepath = self.parent.basepath+'/'+self.basename
219
+ self.basedirpath ||= self.parent.basepath+'/'
220
+ end
221
+
222
+ end
223
+
224
+
225
+ def fix_basedirpath
226
+ self.basedirpath ||= ''
227
+ if !self.basedirpath.blank? && self.basedirpath[-1] !='/'
228
+ self.basedirpath << '/'
229
+ end
230
+ end
231
+
232
+ def set_basedirpath_from_parent
233
+ v = ''
234
+ if self.parent_id.nil?
235
+ v = ''
236
+ else
237
+ v = self.parent.basepath+'/' if self.parent_id >0
238
+ end
239
+
240
+ self.basedirpath = v
241
+ #v
242
+ end
243
+
244
+ def set_parent_from_basedirpath
245
+ v = self.basedirpath
246
+
247
+ # set parent_id from dir
248
+ d = v.chop
249
+ r = Template.where(is_folder: true, basepath: d).first
250
+ if r
251
+ self.parent_id = r.id
252
+ else
253
+ self.parent_id = nil
254
+ end
255
+ end
256
+
257
+
258
+
259
+ #### callbacks
260
+
261
+ def _before_validation
262
+ fix_basedirpath
263
+
264
+ # parent, basedirpath
265
+ if self.parent_id.nil? && !self.basedirpath.blank?
266
+ set_parent_from_basedirpath
267
+ elsif self.basedirpath.nil? && !self.parent_id.nil?
268
+ set_basedirpath_from_parent
269
+ end
270
+
271
+ set_basepath
272
+ end
273
+
274
+
275
+ def _before_create
276
+ if self.is_folder
277
+ # create dir on disk
278
+ Fileutils::Fileutils.create_dir_if_not_exists self.folder_fullpath
279
+ else
280
+ # add folders if needed
281
+ if self.parent_id.nil? && !self.basedirpath.blank?
282
+ self.parent = Template.create_folders_tree(self.basedirpath)
283
+ end
284
+
285
+ end
286
+
287
+ end
288
+
289
+ def _before_update
290
+ if self.is_folder
291
+ oldpath = self.folder_fullpath
292
+
293
+ self.set_basepath
294
+
295
+ # rename dir on disk
296
+ if self.basename_changed?
297
+ raise "cannot change folder path"
298
+
299
+ require 'fileutils'
300
+ newpath = self.folder_fullpath
301
+
302
+ if Dir.exists?(newpath)
303
+ errors.add(:basename, 'Folder already exists')
304
+ return false
305
+ end
306
+
307
+ FileUtils.mv oldpath, newpath
308
+
309
+ # TODO: change paths for child templates
310
+
311
+ end
312
+
313
+ else
314
+ # file
315
+
316
+ # TODO: rename file
317
+ #self.make_basepath
318
+
319
+ end
320
+
321
+ end
322
+
323
+ def _before_destroy
324
+ if self.is_folder
325
+
326
+ # cannot delete not empty dir
327
+ if !self.folder_empty?
328
+ return false
329
+ end
330
+
331
+ # delete dir
332
+ folder_delete
333
+
334
+ else
335
+ # file
336
+
337
+
338
+ end
339
+
340
+
341
+ true
342
+ end
343
+
344
+
345
+ # create folders if necessary - NOT WORKING
346
+ def self.create_folders_tree(dirpath)
347
+ a = dirpath.split /\//
348
+
349
+ d = ''
350
+ parent_current = nil
351
+ prev_d = d
352
+ a.each do |s|
353
+ d = d + (d=='' ? '' : '/') +s
354
+ r = Template.where(is_folder: true, basepath: d).first
355
+ if r
356
+ parent_current = r
357
+ next
358
+ end
359
+ # create missing folder
360
+ path_new = File.basename(d)
361
+ basedirpath_new = prev_d
362
+ r = Template.create(is_folder: true, basename: path_new, basedirpath: basedirpath_new, title: path_new, parent: parent_current)
363
+ parent_current = r
364
+
365
+ prev_d = d
366
+ end
367
+
368
+ parent_current
369
+
370
+ end
371
+
372
+
373
+ #### folders
374
+
375
+ def folder_delete
376
+ dirpath = self.folder_fullpath
377
+ FileUtils.remove_dir(dirpath) if Dir.exists? dirpath
378
+ end
379
+
380
+ def folder_empty?
381
+ dirpath = self.folder_fullpath
382
+ if !Dir.exists? dirpath
383
+ return true
384
+ end
385
+
386
+ return Dir.entries(dirpath).size == 2
387
+ end
388
+
389
+ end
390
+ end