optimacms 0.1.55 → 0.1.56

Sign up to get free protection for your applications and to get access to all the features.
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