sunrise-core 0.1.0

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 (268) hide show
  1. data/README.rdoc +46 -0
  2. data/Rakefile +44 -0
  3. data/app/controllers/manage/assets_controller.rb +70 -0
  4. data/app/controllers/manage/base_controller.rb +24 -0
  5. data/app/controllers/manage/pages_controller.rb +37 -0
  6. data/app/controllers/manage/settings_controller.rb +24 -0
  7. data/app/controllers/manage/structures_controller.rb +45 -0
  8. data/app/controllers/manage/users_controller.rb +78 -0
  9. data/app/controllers/pages_controller.rb +22 -0
  10. data/app/views/layouts/manage.html.erb +40 -0
  11. data/app/views/manage/assets/_collection.html.erb +32 -0
  12. data/app/views/manage/assets/_picture.html.erb +10 -0
  13. data/app/views/manage/assets/_swfscript.html.erb +51 -0
  14. data/app/views/manage/headers/_form.html.erb +14 -0
  15. data/app/views/manage/pages/_form.html.erb +11 -0
  16. data/app/views/manage/pages/edit.html.erb +6 -0
  17. data/app/views/manage/pages/new.html.erb +6 -0
  18. data/app/views/manage/settings/_form.html.erb +22 -0
  19. data/app/views/manage/settings/index.html.erb +14 -0
  20. data/app/views/manage/shared/_head.html.erb +41 -0
  21. data/app/views/manage/shared/_locale.html.erb +8 -0
  22. data/app/views/manage/shared/_notice.html.erb +7 -0
  23. data/app/views/manage/shared/_panel.html.erb +34 -0
  24. data/app/views/manage/structures/_form.html.erb +28 -0
  25. data/app/views/manage/structures/_structure.html.erb +34 -0
  26. data/app/views/manage/structures/edit.html.erb +6 -0
  27. data/app/views/manage/structures/index.html.erb +51 -0
  28. data/app/views/manage/structures/new.html.erb +6 -0
  29. data/app/views/manage/users/_form.html.erb +15 -0
  30. data/app/views/manage/users/_model_filter.html.erb +33 -0
  31. data/app/views/manage/users/_user.html.erb +55 -0
  32. data/app/views/manage/users/edit.html.erb +6 -0
  33. data/app/views/manage/users/index.html.erb +36 -0
  34. data/app/views/manage/users/new.html.erb +6 -0
  35. data/app/views/manage/users/show.html.erb +19 -0
  36. data/config/locales/defaults/en.yml +149 -0
  37. data/config/locales/defaults/pluralize.rb +6 -0
  38. data/config/locales/defaults/ru.yml +170 -0
  39. data/config/locales/defaults/uk.yml +238 -0
  40. data/config/locales/devise.en.yml +39 -0
  41. data/config/locales/devise.ru.yml +41 -0
  42. data/config/locales/devise.uk.yml +41 -0
  43. data/config/locales/manage/en.yml +248 -0
  44. data/config/locales/manage/ru.yml +248 -0
  45. data/config/locales/manage/uk.yml +248 -0
  46. data/config/routes.rb +24 -0
  47. data/lib/generators/sunrise/USAGE +7 -0
  48. data/lib/generators/sunrise/install_generator.rb +120 -0
  49. data/lib/generators/sunrise/templates/config/application.yml +4 -0
  50. data/lib/generators/sunrise/templates/config/database.yml +34 -0
  51. data/lib/generators/sunrise/templates/config/logrotate-config +9 -0
  52. data/lib/generators/sunrise/templates/config/nginx-config-passenger +51 -0
  53. data/lib/generators/sunrise/templates/config/seeds.rb +25 -0
  54. data/lib/generators/sunrise/templates/config/sunrise.rb +7 -0
  55. data/lib/generators/sunrise/templates/helpers/manage/assets_helper.rb +16 -0
  56. data/lib/generators/sunrise/templates/helpers/manage/base_helper.rb +81 -0
  57. data/lib/generators/sunrise/templates/helpers/manage/pages_helper.rb +2 -0
  58. data/lib/generators/sunrise/templates/helpers/manage/settings_helper.rb +2 -0
  59. data/lib/generators/sunrise/templates/helpers/manage/structures_helper.rb +12 -0
  60. data/lib/generators/sunrise/templates/helpers/manage/users_helper.rb +6 -0
  61. data/lib/generators/sunrise/templates/images/manage/add_post_bot.gif +0 -0
  62. data/lib/generators/sunrise/templates/images/manage/add_post_top.gif +0 -0
  63. data/lib/generators/sunrise/templates/images/manage/add_white_bot.gif +0 -0
  64. data/lib/generators/sunrise/templates/images/manage/add_white_top.gif +0 -0
  65. data/lib/generators/sunrise/templates/images/manage/arrow.png +0 -0
  66. data/lib/generators/sunrise/templates/images/manage/back_but_lc.gif +0 -0
  67. data/lib/generators/sunrise/templates/images/manage/back_but_rc.gif +0 -0
  68. data/lib/generators/sunrise/templates/images/manage/bot_corn.gif +0 -0
  69. data/lib/generators/sunrise/templates/images/manage/bot_duo_corn.gif +0 -0
  70. data/lib/generators/sunrise/templates/images/manage/but_bg.png +0 -0
  71. data/lib/generators/sunrise/templates/images/manage/but_block_lc.gif +0 -0
  72. data/lib/generators/sunrise/templates/images/manage/but_block_rc.gif +0 -0
  73. data/lib/generators/sunrise/templates/images/manage/but_freze_lc.gif +0 -0
  74. data/lib/generators/sunrise/templates/images/manage/but_freze_rc.gif +0 -0
  75. data/lib/generators/sunrise/templates/images/manage/but_gr.gif +0 -0
  76. data/lib/generators/sunrise/templates/images/manage/but_gr_l.gif +0 -0
  77. data/lib/generators/sunrise/templates/images/manage/but_gr_r.gif +0 -0
  78. data/lib/generators/sunrise/templates/images/manage/but_search.gif +0 -0
  79. data/lib/generators/sunrise/templates/images/manage/but_unfreze_lc.gif +0 -0
  80. data/lib/generators/sunrise/templates/images/manage/but_unfreze_rc.gif +0 -0
  81. data/lib/generators/sunrise/templates/images/manage/button_add_foto.gif +0 -0
  82. data/lib/generators/sunrise/templates/images/manage/button_add_foto_ru.gif +0 -0
  83. data/lib/generators/sunrise/templates/images/manage/button_add_foto_ua.gif +0 -0
  84. data/lib/generators/sunrise/templates/images/manage/button_add_foto_uk.gif +0 -0
  85. data/lib/generators/sunrise/templates/images/manage/cancelbutton.gif +0 -0
  86. data/lib/generators/sunrise/templates/images/manage/dark_arr.gif +0 -0
  87. data/lib/generators/sunrise/templates/images/manage/dark_arr_left.gif +0 -0
  88. data/lib/generators/sunrise/templates/images/manage/dark_cross_ico.gif +0 -0
  89. data/lib/generators/sunrise/templates/images/manage/dot.gif +0 -0
  90. data/lib/generators/sunrise/templates/images/manage/duo_bg.gif +0 -0
  91. data/lib/generators/sunrise/templates/images/manage/duo_bg_small.gif +0 -0
  92. data/lib/generators/sunrise/templates/images/manage/duo_bg_small_blocked.gif +0 -0
  93. data/lib/generators/sunrise/templates/images/manage/duo_bg_small_frozed.gif +0 -0
  94. data/lib/generators/sunrise/templates/images/manage/duo_bg_small_notact.gif +0 -0
  95. data/lib/generators/sunrise/templates/images/manage/duo_bot_small.gif +0 -0
  96. data/lib/generators/sunrise/templates/images/manage/duo_bot_small_blocked.gif +0 -0
  97. data/lib/generators/sunrise/templates/images/manage/duo_bot_small_frozed.gif +0 -0
  98. data/lib/generators/sunrise/templates/images/manage/duo_bot_small_notact.gif +0 -0
  99. data/lib/generators/sunrise/templates/images/manage/duo_top_small.gif +0 -0
  100. data/lib/generators/sunrise/templates/images/manage/duo_top_small_blocked.gif +0 -0
  101. data/lib/generators/sunrise/templates/images/manage/duo_top_small_frozed.gif +0 -0
  102. data/lib/generators/sunrise/templates/images/manage/duo_top_small_notact.gif +0 -0
  103. data/lib/generators/sunrise/templates/images/manage/edit_white_top.gif +0 -0
  104. data/lib/generators/sunrise/templates/images/manage/empty.gif +0 -0
  105. data/lib/generators/sunrise/templates/images/manage/filter_bot_bg.gif +0 -0
  106. data/lib/generators/sunrise/templates/images/manage/filter_top_bg.gif +0 -0
  107. data/lib/generators/sunrise/templates/images/manage/flag_en.gif +0 -0
  108. data/lib/generators/sunrise/templates/images/manage/flag_en_nonact.gif +0 -0
  109. data/lib/generators/sunrise/templates/images/manage/flag_ru.gif +0 -0
  110. data/lib/generators/sunrise/templates/images/manage/flag_ru_nonact.gif +0 -0
  111. data/lib/generators/sunrise/templates/images/manage/flag_ua.gif +0 -0
  112. data/lib/generators/sunrise/templates/images/manage/flag_ua_nonact.gif +0 -0
  113. data/lib/generators/sunrise/templates/images/manage/foto.jpg +0 -0
  114. data/lib/generators/sunrise/templates/images/manage/ico_add.gif +0 -0
  115. data/lib/generators/sunrise/templates/images/manage/ico_del.gif +0 -0
  116. data/lib/generators/sunrise/templates/images/manage/ico_down.gif +0 -0
  117. data/lib/generators/sunrise/templates/images/manage/ico_edit.gif +0 -0
  118. data/lib/generators/sunrise/templates/images/manage/ico_settings.gif +0 -0
  119. data/lib/generators/sunrise/templates/images/manage/ico_up.gif +0 -0
  120. data/lib/generators/sunrise/templates/images/manage/input_bg.gif +0 -0
  121. data/lib/generators/sunrise/templates/images/manage/l_but_corn.gif +0 -0
  122. data/lib/generators/sunrise/templates/images/manage/minimise_but.gif +0 -0
  123. data/lib/generators/sunrise/templates/images/manage/mp3.png +0 -0
  124. data/lib/generators/sunrise/templates/images/manage/page_arr_hover.png +0 -0
  125. data/lib/generators/sunrise/templates/images/manage/page_next_arr.gif +0 -0
  126. data/lib/generators/sunrise/templates/images/manage/page_num_hover.gif +0 -0
  127. data/lib/generators/sunrise/templates/images/manage/page_prev_arr.gif +0 -0
  128. data/lib/generators/sunrise/templates/images/manage/panel/l_but_corn.gif +0 -0
  129. data/lib/generators/sunrise/templates/images/manage/panel/maximise_but.gif +0 -0
  130. data/lib/generators/sunrise/templates/images/manage/panel/r_but_corn.gif +0 -0
  131. data/lib/generators/sunrise/templates/images/manage/panel/top_menu_arr.gif +0 -0
  132. data/lib/generators/sunrise/templates/images/manage/panel/user_pic.gif +0 -0
  133. data/lib/generators/sunrise/templates/images/manage/preloader.gif +0 -0
  134. data/lib/generators/sunrise/templates/images/manage/r_but_corn.gif +0 -0
  135. data/lib/generators/sunrise/templates/images/manage/select_bg.gif +0 -0
  136. data/lib/generators/sunrise/templates/images/manage/select_corn.gif +0 -0
  137. data/lib/generators/sunrise/templates/images/manage/struct_corn_lg.gif +0 -0
  138. data/lib/generators/sunrise/templates/images/manage/struct_corn_llg.gif +0 -0
  139. data/lib/generators/sunrise/templates/images/manage/struct_corn_lw.gif +0 -0
  140. data/lib/generators/sunrise/templates/images/manage/struct_corn_rg.gif +0 -0
  141. data/lib/generators/sunrise/templates/images/manage/struct_corn_rlg.gif +0 -0
  142. data/lib/generators/sunrise/templates/images/manage/struct_corn_rw.gif +0 -0
  143. data/lib/generators/sunrise/templates/images/manage/tab_gl.gif +0 -0
  144. data/lib/generators/sunrise/templates/images/manage/tab_gr.gif +0 -0
  145. data/lib/generators/sunrise/templates/images/manage/tab_wl.gif +0 -0
  146. data/lib/generators/sunrise/templates/images/manage/tab_wr.gif +0 -0
  147. data/lib/generators/sunrise/templates/images/manage/top_corn.gif +0 -0
  148. data/lib/generators/sunrise/templates/images/manage/top_duo_corn.gif +0 -0
  149. data/lib/generators/sunrise/templates/images/manage/top_menu_arr.gif +0 -0
  150. data/lib/generators/sunrise/templates/images/manage/transp_cross.png +0 -0
  151. data/lib/generators/sunrise/templates/images/manage/upload_progress.gif +0 -0
  152. data/lib/generators/sunrise/templates/images/manage/user_act_lc.gif +0 -0
  153. data/lib/generators/sunrise/templates/images/manage/user_act_rc.gif +0 -0
  154. data/lib/generators/sunrise/templates/images/manage/user_ico.gif +0 -0
  155. data/lib/generators/sunrise/templates/images/manage/user_pic.gif +0 -0
  156. data/lib/generators/sunrise/templates/images/manage/user_pic_small.gif +0 -0
  157. data/lib/generators/sunrise/templates/images/manage/user_pic_thumb.gif +0 -0
  158. data/lib/generators/sunrise/templates/javascripts/datepicker/jquery-ui-i18n.js +1176 -0
  159. data/lib/generators/sunrise/templates/javascripts/datepicker/jquery.ui.datepicker-ru.js +37 -0
  160. data/lib/generators/sunrise/templates/javascripts/datepicker/jquery.ui.datepicker-uk.js +37 -0
  161. data/lib/generators/sunrise/templates/javascripts/jquery-ui-timepicker-addon.js +911 -0
  162. data/lib/generators/sunrise/templates/javascripts/jquery.cookie.js +97 -0
  163. data/lib/generators/sunrise/templates/javascripts/jquery.fancybox-1.3.4.pack.js +46 -0
  164. data/lib/generators/sunrise/templates/javascripts/jquery.tmpl.min.js +10 -0
  165. data/lib/generators/sunrise/templates/javascripts/manage.js +290 -0
  166. data/lib/generators/sunrise/templates/javascripts/preloader.js +47 -0
  167. data/lib/generators/sunrise/templates/javascripts/swfupload/fileprogress.js +114 -0
  168. data/lib/generators/sunrise/templates/javascripts/swfupload/handlers.js +164 -0
  169. data/lib/generators/sunrise/templates/javascripts/swfupload/swfupload.js +1134 -0
  170. data/lib/generators/sunrise/templates/javascripts/swfupload/swfupload.queue.js +98 -0
  171. data/lib/generators/sunrise/templates/javascripts/swfupload/swfupload.swf +0 -0
  172. data/lib/generators/sunrise/templates/migrate/create_assets.rb +28 -0
  173. data/lib/generators/sunrise/templates/migrate/create_headers.rb +20 -0
  174. data/lib/generators/sunrise/templates/migrate/create_pages.rb +17 -0
  175. data/lib/generators/sunrise/templates/migrate/create_roles.rb +16 -0
  176. data/lib/generators/sunrise/templates/migrate/create_structures.rb +27 -0
  177. data/lib/generators/sunrise/templates/migrate/create_users.rb +29 -0
  178. data/lib/generators/sunrise/templates/models/defaults/ability.rb +38 -0
  179. data/lib/generators/sunrise/templates/models/defaults/asset.rb +7 -0
  180. data/lib/generators/sunrise/templates/models/defaults/attachment_file.rb +33 -0
  181. data/lib/generators/sunrise/templates/models/defaults/avatar.rb +36 -0
  182. data/lib/generators/sunrise/templates/models/defaults/header.rb +5 -0
  183. data/lib/generators/sunrise/templates/models/defaults/page.rb +5 -0
  184. data/lib/generators/sunrise/templates/models/defaults/picture.rb +34 -0
  185. data/lib/generators/sunrise/templates/models/defaults/position_type.rb +7 -0
  186. data/lib/generators/sunrise/templates/models/defaults/role.rb +20 -0
  187. data/lib/generators/sunrise/templates/models/defaults/role_type.rb +8 -0
  188. data/lib/generators/sunrise/templates/models/defaults/structure.rb +11 -0
  189. data/lib/generators/sunrise/templates/models/defaults/structure_type.rb +9 -0
  190. data/lib/generators/sunrise/templates/models/defaults/user.rb +51 -0
  191. data/lib/generators/sunrise/templates/stylesheets/application.css +1 -0
  192. data/lib/generators/sunrise/templates/stylesheets/fancybox/images/blank.gif +0 -0
  193. data/lib/generators/sunrise/templates/stylesheets/fancybox/images/fancy_close.png +0 -0
  194. data/lib/generators/sunrise/templates/stylesheets/fancybox/images/fancy_loading.png +0 -0
  195. data/lib/generators/sunrise/templates/stylesheets/fancybox/images/fancy_nav_left.png +0 -0
  196. data/lib/generators/sunrise/templates/stylesheets/fancybox/images/fancy_nav_right.png +0 -0
  197. data/lib/generators/sunrise/templates/stylesheets/fancybox/images/fancy_shadow_e.png +0 -0
  198. data/lib/generators/sunrise/templates/stylesheets/fancybox/images/fancy_shadow_n.png +0 -0
  199. data/lib/generators/sunrise/templates/stylesheets/fancybox/images/fancy_shadow_ne.png +0 -0
  200. data/lib/generators/sunrise/templates/stylesheets/fancybox/images/fancy_shadow_nw.png +0 -0
  201. data/lib/generators/sunrise/templates/stylesheets/fancybox/images/fancy_shadow_s.png +0 -0
  202. data/lib/generators/sunrise/templates/stylesheets/fancybox/images/fancy_shadow_se.png +0 -0
  203. data/lib/generators/sunrise/templates/stylesheets/fancybox/images/fancy_shadow_sw.png +0 -0
  204. data/lib/generators/sunrise/templates/stylesheets/fancybox/images/fancy_shadow_w.png +0 -0
  205. data/lib/generators/sunrise/templates/stylesheets/fancybox/images/fancy_title_left.png +0 -0
  206. data/lib/generators/sunrise/templates/stylesheets/fancybox/images/fancy_title_main.png +0 -0
  207. data/lib/generators/sunrise/templates/stylesheets/fancybox/images/fancy_title_over.png +0 -0
  208. data/lib/generators/sunrise/templates/stylesheets/fancybox/images/fancy_title_right.png +0 -0
  209. data/lib/generators/sunrise/templates/stylesheets/fancybox/images/fancybox-x.png +0 -0
  210. data/lib/generators/sunrise/templates/stylesheets/fancybox/images/fancybox-y.png +0 -0
  211. data/lib/generators/sunrise/templates/stylesheets/fancybox/images/fancybox.png +0 -0
  212. data/lib/generators/sunrise/templates/stylesheets/fancybox/jquery.fancybox-1.3.4.css +359 -0
  213. data/lib/generators/sunrise/templates/stylesheets/manage/ie.css +16 -0
  214. data/lib/generators/sunrise/templates/stylesheets/manage/main.css +1074 -0
  215. data/lib/generators/sunrise/templates/stylesheets/manage/panel.css +126 -0
  216. data/lib/generators/sunrise/templates/stylesheets/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
  217. data/lib/generators/sunrise/templates/stylesheets/smoothness/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
  218. data/lib/generators/sunrise/templates/stylesheets/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
  219. data/lib/generators/sunrise/templates/stylesheets/smoothness/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  220. data/lib/generators/sunrise/templates/stylesheets/smoothness/images/ui-bg_glass_75_dadada_1x400.png +0 -0
  221. data/lib/generators/sunrise/templates/stylesheets/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
  222. data/lib/generators/sunrise/templates/stylesheets/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
  223. data/lib/generators/sunrise/templates/stylesheets/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
  224. data/lib/generators/sunrise/templates/stylesheets/smoothness/images/ui-icons_222222_256x240.png +0 -0
  225. data/lib/generators/sunrise/templates/stylesheets/smoothness/images/ui-icons_2e83ff_256x240.png +0 -0
  226. data/lib/generators/sunrise/templates/stylesheets/smoothness/images/ui-icons_454545_256x240.png +0 -0
  227. data/lib/generators/sunrise/templates/stylesheets/smoothness/images/ui-icons_888888_256x240.png +0 -0
  228. data/lib/generators/sunrise/templates/stylesheets/smoothness/images/ui-icons_cd0a0a_256x240.png +0 -0
  229. data/lib/generators/sunrise/templates/stylesheets/smoothness/jquery-ui-1.8.6.custom.css +572 -0
  230. data/lib/generators/sunrise/templates/sweepers/page_sweeper.rb +22 -0
  231. data/lib/generators/sunrise/templates/sweepers/structure_sweeper.rb +29 -0
  232. data/lib/generators/sunrise/templates/sweepers/user_sweeper.rb +17 -0
  233. data/lib/generators/sunrise/templates/views/layouts/application.html.erb +37 -0
  234. data/lib/generators/sunrise/templates/views/pages/show.html.erb +2 -0
  235. data/lib/generators/sunrise/templates/views/shared/_notice.html.erb +17 -0
  236. data/lib/sunrise/controllers/head_options.rb +40 -0
  237. data/lib/sunrise/core.rb +80 -0
  238. data/lib/sunrise/core_ext/array.rb +22 -0
  239. data/lib/sunrise/core_ext/i18n.rb +21 -0
  240. data/lib/sunrise/core_ext/string.rb +28 -0
  241. data/lib/sunrise/core_ext.rb +3 -0
  242. data/lib/sunrise/core_plugins.rb +32 -0
  243. data/lib/sunrise/engine.rb +45 -0
  244. data/lib/sunrise/model_filter.rb +158 -0
  245. data/lib/sunrise/models/asset.rb +102 -0
  246. data/lib/sunrise/models/header.rb +34 -0
  247. data/lib/sunrise/models/page.rb +27 -0
  248. data/lib/sunrise/models/position_type.rb +15 -0
  249. data/lib/sunrise/models/role.rb +28 -0
  250. data/lib/sunrise/models/role_type.rb +15 -0
  251. data/lib/sunrise/models/structure.rb +43 -0
  252. data/lib/sunrise/models/structure_type.rb +15 -0
  253. data/lib/sunrise/models/user.rb +124 -0
  254. data/lib/sunrise/plugin.rb +46 -0
  255. data/lib/sunrise/plugins.rb +56 -0
  256. data/lib/sunrise/system_settings.rb +65 -0
  257. data/lib/sunrise/utils/accessible_attributes.rb +32 -0
  258. data/lib/sunrise/utils/header.rb +29 -0
  259. data/lib/sunrise/utils/i18n_backend.rb +87 -0
  260. data/lib/sunrise/utils/mysql.rb +105 -0
  261. data/lib/sunrise/utils/settingslogic.rb +164 -0
  262. data/lib/sunrise/utils/transliteration.rb +72 -0
  263. data/lib/sunrise/version.rb +3 -0
  264. data/lib/sunrise/views/form_builder.rb +44 -0
  265. data/lib/sunrise/views/helpers.rb +190 -0
  266. data/lib/sunrise/views/inputs/date_time_input.rb +46 -0
  267. data/lib/sunrise-core.rb +2 -0
  268. metadata +492 -0
@@ -0,0 +1,28 @@
1
+ # encoding: utf-8
2
+ module Sunrise
3
+ module Models
4
+ module Role
5
+ def self.included(base)
6
+ base.send :include, InstanceMethods
7
+ base.send :extend, ClassMethods
8
+ end
9
+
10
+ module ClassMethods
11
+ def self.extended(base)
12
+ base.class_eval do
13
+ belongs_to :user
14
+
15
+ enumerated_attribute :role_type, :id_attribute => :role_type
16
+ attr_accessible :role_type
17
+ end
18
+ end
19
+ end
20
+
21
+ module InstanceMethods
22
+ def to_sym
23
+ role_type.code
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,15 @@
1
+ # encoding: utf-8
2
+ module Sunrise
3
+ module Models
4
+ class RoleType
5
+ def initialize(code)
6
+ @code = code.to_sym
7
+ end
8
+ attr_reader :code
9
+
10
+ def title
11
+ I18n.t(@code, :scope => [:manage, :role, :kind])
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,43 @@
1
+ # encoding: utf-8
2
+ module Sunrise
3
+ module Models
4
+ module Structure
5
+ def self.included(base)
6
+ base.send :include, InstanceMethods
7
+ base.send :extend, ClassMethods
8
+ end
9
+
10
+ module ClassMethods
11
+ def self.extended(base)
12
+ base.send(:include, Utils::Header)
13
+ base.class_eval do
14
+ enumerated_attribute :structure_type, :id_attribute => :kind
15
+ enumerated_attribute :position_type, :id_attribute => :position
16
+
17
+ validates_presence_of :title
18
+ validates_numericality_of :position, :only_integer => true
19
+
20
+ has_one :page, :dependent => :destroy
21
+ has_many :posts, :dependent => :destroy
22
+
23
+ scope :visible, where(:is_visible => true)
24
+ scope :with_kind, proc {|structure_type| where(:kind => structure_type.id) }
25
+ scope :with_depth, proc {|level| where(:depth => level.to_i) }
26
+ scope :with_position, proc {|position_type| where(:position => position_type.id) }
27
+ end
28
+ end
29
+
30
+ def find_by_permalink(value)
31
+ value.to_s.is_int? ? find(value) : where(:slug => value.to_s).first
32
+ end
33
+ end
34
+
35
+ module InstanceMethods
36
+ def moveable?
37
+ return true if new_record?
38
+ !root?
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,15 @@
1
+ # encoding: utf-8
2
+ module Sunrise
3
+ module Models
4
+ class StructureType
5
+ def initialize(value)
6
+ @kind = value
7
+ end
8
+ attr_reader :kind
9
+
10
+ def title
11
+ I18n.t(@kind, :scope => [:manage, :structure, :kind])
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,124 @@
1
+ # encoding: utf-8
2
+ module Sunrise
3
+ module Models
4
+ module User
5
+ def self.included(base)
6
+ base.send :include, InstanceMethods
7
+ base.send :extend, ClassMethods
8
+ end
9
+
10
+ module ClassMethods
11
+ def self.extended(base)
12
+ base.class_eval do
13
+ has_many :roles, :dependent => :delete_all
14
+ has_one :avatar, :as => :assetable, :dependent => :destroy, :autosave => true
15
+
16
+ scope :with_role, lambda {|role| joins(:roles).where(["`roles`.role_type = ?", role.id]) }
17
+ scope :defaults, with_role(::RoleType.default)
18
+ scope :moderators, with_role(::RoleType.moderator)
19
+ scope :admins, with_role(::RoleType.admin)
20
+
21
+ before_validation :generate_login, :if => :has_login?
22
+ before_create :set_default_role, :if => :roles_empty?
23
+ end
24
+ end
25
+ end
26
+
27
+ module InstanceMethods
28
+ def default?
29
+ has_role?(:default)
30
+ end
31
+
32
+ def moderator?
33
+ has_role?(:moderator)
34
+ end
35
+
36
+ def admin?
37
+ has_role?(:admin)
38
+ end
39
+
40
+ def has_role?(role_name)
41
+ role_symbols.include?(role_name.to_sym)
42
+ end
43
+
44
+ def roles_empty?
45
+ self.roles.empty?
46
+ end
47
+
48
+ def has_login?
49
+ respond_to?(:login)
50
+ end
51
+
52
+ def roles_attributes=(value)
53
+ options = value || {}
54
+ options.each do |k, v|
55
+ create_or_destroy_role(k.to_i, v.to_i == 1)
56
+ end
57
+ end
58
+
59
+ def role_symbols
60
+ (roles || []).map {|r| r.to_sym}
61
+ end
62
+
63
+ def current_role
64
+ self.roles.first
65
+ end
66
+
67
+ def role_type_id
68
+ if current_role
69
+ current_role.role_type.id
70
+ end
71
+ end
72
+
73
+ def role_type_id=(value)
74
+ role_id = value.blank? ? nil : value.to_i
75
+
76
+ if ::RoleType.all.map(&:id).include?(role_id)
77
+ ::RoleType.all.each do |role_type|
78
+ create_or_destroy_role(role_type.id, role_type.id == role_id)
79
+ end
80
+ end
81
+ end
82
+
83
+ def state
84
+ return 'active' if active_for_authentication?
85
+ return 'register' unless confirmed?
86
+ return 'suspend' if access_locked?
87
+ 'pending'
88
+ end
89
+
90
+ def events_for_current_state
91
+ events = []
92
+ events << 'activate' if state == 'register'
93
+ events
94
+ end
95
+
96
+ protected
97
+
98
+ def set_default_role
99
+ unless has_role?(:default)
100
+ self.roles.build(:role_type => ::RoleType.default)
101
+ end
102
+ end
103
+
104
+ def create_or_destroy_role(role_id, need_create = true)
105
+ role = self.roles.detect { |r| r.role_type.id == role_id }
106
+ if need_create
107
+ role ||= self.roles.build(:role_type => ::RoleType.find(role_id))
108
+ elsif !role.nil?
109
+ self.roles.delete(role)
110
+ end
111
+ end
112
+
113
+ def generate_login
114
+ self.login ||= begin
115
+ unless email.blank?
116
+ tmp_login = email.split('@').first
117
+ tmp_login.parameterize.downcase.gsub(/[^A-Za-z0-9-]+/, '-').gsub(/-+/, '-')
118
+ end
119
+ end
120
+ end
121
+ end
122
+ end
123
+ end
124
+ end
@@ -0,0 +1,46 @@
1
+ module Sunrise
2
+ class Plugin
3
+ attr_accessor :name, :model, :menu, :version, :klass, :klass_name
4
+
5
+ def initialize(name)
6
+ @name = name.to_s.downcase
7
+ @menu = false
8
+ @klass = nil
9
+ @klass_name = nil
10
+
11
+ Sunrise::Plugins.registered << self
12
+ end
13
+
14
+ def module_name
15
+ @module_name ||= @name.singularize.camelize.to_sym
16
+ end
17
+
18
+ def klass
19
+ @klass ||= klass_name.constantize
20
+ end
21
+
22
+ def klass_name
23
+ @klass_name ||= @name.singularize.camelize
24
+ end
25
+
26
+ def title
27
+ I18n.t(@name, :scope => [:manage, :plugins])
28
+ end
29
+
30
+ def self.register(name, &block)
31
+ plugin = self.new(name)
32
+
33
+ yield plugin
34
+
35
+ raise "A plugin MUST have a name!: #{plugin.inspect}" if plugin.name.blank?
36
+
37
+ plugin.version ||= Sunrise::VERSION.dup
38
+
39
+ if plugin.model
40
+ model_path = (plugin.model == true ? "sunrise/models/#{plugin.name}" : plugin.model)
41
+ Sunrise::Models.send(:autoload, plugin.module_name, model_path)
42
+ end
43
+ end
44
+ end
45
+
46
+ end
@@ -0,0 +1,56 @@
1
+ module Sunrise
2
+ class Plugins < Array
3
+
4
+ def initialize
5
+ @plugins = []
6
+ end
7
+
8
+ def find_by_name(name)
9
+ self.detect { |plugin| plugin.name == name.to_s.downcase }
10
+ end
11
+ alias :[] :find_by_name
12
+
13
+ def find_by_title(title)
14
+ self.detect { |plugin| plugin.title == title }
15
+ end
16
+
17
+ def menu(value)
18
+ self.select { |p| p.menu == value.to_s.downcase }
19
+ end
20
+
21
+ def names
22
+ self.map(&:name)
23
+ end
24
+
25
+ def titles
26
+ self.map(&:title)
27
+ end
28
+
29
+ class << self
30
+ def active
31
+ @active_plugins ||= self.new
32
+ end
33
+
34
+ def registered
35
+ @registered_plugins ||= self.new
36
+ end
37
+
38
+ def activate(name)
39
+ active << registered[name] if registered[name] && !active[name]
40
+ end
41
+
42
+ def deactivate(name)
43
+ active.delete_if {|p| p.name == name}
44
+ end
45
+
46
+ def set_active(names)
47
+ @active_plugins = self.new
48
+
49
+ names.each do |name|
50
+ activate(name)
51
+ end
52
+ end
53
+ end
54
+
55
+ end
56
+ end
@@ -0,0 +1,65 @@
1
+ # encoding: utf-8
2
+ require 'ostruct'
3
+
4
+ module Sunrise
5
+ class SystemSettings < Utils::Settingslogic
6
+ source Rails.root.join("config", "application.yml")
7
+ #namespace (Rails.env.to_s || 'development')
8
+
9
+ class << self
10
+ def ostruct
11
+ instance.serialize
12
+ end
13
+
14
+ def update_settings(attributes)
15
+ instance.update attributes
16
+ instance.save
17
+ end
18
+
19
+ def write(hash)
20
+ begin
21
+ File.open(source, 'w') do |file|
22
+ file.write hash.to_yaml
23
+ end
24
+ rescue Exception => e
25
+ return false
26
+ end
27
+ end
28
+
29
+ def hashes_to_openstructs(obj, memo={})
30
+ return obj unless Hash === obj
31
+
32
+ memo[obj.object_id] ||= OpenStruct.new( Hash[
33
+ *obj.inject( [] ) { |a, (k, v)|
34
+ a.push k, hashes_to_openstructs( v, memo )
35
+ }
36
+ ])
37
+ end
38
+ end
39
+
40
+ def save
41
+ if self.class.namespace
42
+ hash = YAML.load(ERB.new(File.read(self.class.source)).result).to_hash
43
+ hash[self.class.namespace] ||= {}
44
+ hash[self.class.namespace].update self
45
+ else
46
+ hash = self
47
+ end
48
+
49
+ self.class.write(hash)
50
+ reload
51
+ end
52
+
53
+ def reload
54
+ @instance = nil
55
+ @struct = nil
56
+
57
+ return true
58
+ end
59
+
60
+ def serialize
61
+ @struct ||= self.class.hashes_to_openstructs(self)
62
+ @struct
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,32 @@
1
+ # encoding: utf-8
2
+ module Sunrise
3
+ module Utils
4
+ module AccessibleAttributes
5
+ def self.included(base)
6
+ base.send(:extend, ClassMethods)
7
+ base.send(:include, InstanceMethods)
8
+ end
9
+
10
+ module ClassMethods
11
+ def self.extended(base)
12
+ base.class_eval do
13
+ attr_accessible
14
+ attr_accessor :accessible
15
+ end
16
+ end
17
+ end
18
+
19
+ module InstanceMethods
20
+ private
21
+
22
+ def mass_assignment_authorizer
23
+ if accessible == :all
24
+ self.class.protected_attributes
25
+ else
26
+ super + (accessible || [])
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,29 @@
1
+ # encoding: utf-8
2
+ module Sunrise
3
+ module Utils
4
+ module Header
5
+ def self.included(base)
6
+ base.send(:extend, ClassMethods)
7
+ base.send(:include, InstanceMethods)
8
+ end
9
+
10
+ module ClassMethods
11
+ def self.extended(base)
12
+ base.class_eval do
13
+ has_one :header, :as => :headerable, :dependent => :delete
14
+
15
+ attr_accessible :header_attributes
16
+
17
+ accepts_nested_attributes_for :header, :reject_if => :all_blank
18
+ end
19
+ end
20
+ end
21
+
22
+ module InstanceMethods
23
+ def default_header
24
+ header || build_header
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,87 @@
1
+ # encoding: utf-8
2
+ module Sunrise
3
+ module Utils
4
+
5
+ # "Продвинутый" бекэнд для I18n.
6
+ #
7
+ # Наследует Simple бекэнд и полностью с ним совместим. Добаляет поддержку
8
+ # для отдельностоящих/контекстных названий дней недели и месяцев.
9
+ # Также позволяет каждому языку использовать собственные правила плюрализации,
10
+ # объявленные как Proc (<tt>lambda</tt>).
11
+ #
12
+ #
13
+ # Advanced I18n backend.
14
+ #
15
+ # Extends Simple backend. Allows usage of "standalone" keys
16
+ # for DateTime localization and usage of user-defined Proc (lambda) pluralization
17
+ # methods in translation tables.
18
+ class I18nBackend < ::I18n::Backend::Simple
19
+ include ::I18n::Backend::Pluralization
20
+
21
+ LOCALIZE_ABBR_MONTH_NAMES_MATCH = /(%d|%e)(.*)(%b)/
22
+ LOCALIZE_MONTH_NAMES_MATCH = /(%d|%e)(.*)(%B)/
23
+ LOCALIZE_STANDALONE_ABBR_DAY_NAMES_MATCH = /^%a/
24
+ LOCALIZE_STANDALONE_DAY_NAMES_MATCH = /^%A/
25
+
26
+ # Acts the same as +strftime+, but returns a localized version of the
27
+ # formatted date string. Takes a key from the date/time formats
28
+ # translations as a format argument (<em>e.g.</em>, <tt>:short</tt> in <tt>:'date.formats'</tt>).
29
+ #
30
+ #
31
+ # Метод отличается от <tt>localize</tt> в Simple бекэнде поддержкой
32
+ # отдельностоящих/контекстных названий дней недели и месяцев.
33
+ #
34
+ #
35
+ # Note that it differs from <tt>localize</tt> in Simple< backend by checking for
36
+ # "standalone" month name/day name keys in translation and using them if available.
37
+ #
38
+ # <tt>options</tt> parameter added for i18n-0.3 compliance.
39
+ def localize(locale, object, format = :default, options = nil)
40
+ raise ArgumentError, "Object must be a Date, DateTime or Time object. #{object.inspect} given." unless object.respond_to?(:strftime)
41
+
42
+ type = object.respond_to?(:sec) ? 'time' : 'date'
43
+ # TODO only translate these if format is a String?
44
+ formats = translate(locale, :"#{type}.formats")
45
+ format = formats[format.to_sym] if formats && formats[format.to_sym]
46
+ # TODO raise exception unless format found?
47
+ format = format.to_s.dup
48
+
49
+ # TODO only translate these if the format string is actually present
50
+ # TODO check which format strings are present, then bulk translate then, then replace them
51
+
52
+ if lookup(locale, :"date.standalone_abbr_day_names")
53
+ format.gsub!(LOCALIZE_STANDALONE_ABBR_DAY_NAMES_MATCH,
54
+ translate(locale, :"date.standalone_abbr_day_names")[object.wday])
55
+ end
56
+ format.gsub!(/%a/, translate(locale, :"date.abbr_day_names")[object.wday])
57
+
58
+ if lookup(locale, :"date.standalone_day_names")
59
+ format.gsub!(LOCALIZE_STANDALONE_DAY_NAMES_MATCH,
60
+ translate(locale, :"date.standalone_day_names")[object.wday])
61
+ end
62
+ format.gsub!(/%A/, translate(locale, :"date.day_names")[object.wday])
63
+
64
+ if lookup(locale, :"date.standalone_abbr_month_names")
65
+ format.gsub!(LOCALIZE_ABBR_MONTH_NAMES_MATCH) do
66
+ $1 + $2 + translate(locale, :"date.abbr_month_names")[object.mon]
67
+ end
68
+ format.gsub!(/%b/, translate(locale, :"date.standalone_abbr_month_names")[object.mon])
69
+ else
70
+ format.gsub!(/%b/, translate(locale, :"date.abbr_month_names")[object.mon])
71
+ end
72
+
73
+ if lookup(locale, :"date.standalone_month_names")
74
+ format.gsub!(LOCALIZE_MONTH_NAMES_MATCH) do
75
+ $1 + $2 + translate(locale, :"date.month_names")[object.mon]
76
+ end
77
+ format.gsub!(/%B/, translate(locale, :"date.standalone_month_names")[object.mon])
78
+ else
79
+ format.gsub!(/%B/, translate(locale, :"date.month_names")[object.mon])
80
+ end
81
+
82
+ format.gsub!(/%p/, translate(locale, :"time.#{object.hour < 12 ? :am : :pm}")) if object.respond_to? :hour
83
+ object.strftime(format)
84
+ end
85
+ end
86
+ end
87
+ end
@@ -0,0 +1,105 @@
1
+ # encoding: utf-8
2
+ module Sunrise
3
+ module Utils
4
+ module Mysql
5
+ def self.included(base)
6
+ base.extend(ClassMethods)
7
+ end
8
+
9
+ module ClassMethods
10
+
11
+ def values(column = 'id')
12
+ query = scoped.select(column)
13
+ connection.select_values(query.to_sql).map(&:to_i).uniq
14
+ end
15
+
16
+ # Check if database exists
17
+ def database_exists?
18
+ _options = configurations[Rails.env].dup
19
+ _options.symbolize_keys!
20
+
21
+ begin
22
+ connection
23
+ return true
24
+ rescue Exception => e
25
+ return false
26
+ end
27
+ end
28
+
29
+ # Deletes all rows in table very fast, but without calling +destroy+ method
30
+ # nor any hooks.
31
+ def truncate_table
32
+ transaction { connection.execute("TRUNCATE TABLE #{quoted_table_name};") }
33
+ end
34
+
35
+ # Disables key updates for model table
36
+ def disable_keys
37
+ connection.execute("ALTER TABLE #{quoted_table_name} DISABLE KEYS")
38
+ end
39
+
40
+ # Enables key updates for model table
41
+ def enable_keys
42
+ connection.execute("ALTER TABLE #{quoted_table_name} ENABLE KEYS")
43
+ end
44
+
45
+ # Disables keys, yields block, enables keys.
46
+ def with_keys_disabled
47
+ disable_keys
48
+ yield
49
+ enable_keys
50
+ end
51
+
52
+ # Loads data from file(s) using MySQL native LOAD DATA INFILE query, disabling
53
+ # key updates for even faster import speed
54
+ #
55
+ # ==== Parameters
56
+ # * +files+ file(s) to import
57
+ # * +options+ (see <tt>load_data_infile</tt>)
58
+ def fast_import(files, options = {})
59
+ files = [files] unless files.is_a? Array
60
+ with_keys_disabled do
61
+ load_data_infile_multiple(files, options)
62
+ end
63
+ end
64
+
65
+ # Loads data from multiple files using MySQL native LOAD DATA INFILE query
66
+ def load_data_infile_multiple(files, options = {})
67
+ files.each do |file|
68
+ load_data_infile(file, options)
69
+ end
70
+ end
71
+
72
+ # Loads data from file using MySQL native LOAD DATA INFILE query
73
+ #
74
+ # ==== Parameters
75
+ # * +file+ the file to import
76
+ # * +options+
77
+ def load_data_infile(file, options = {})
78
+ sql = "LOAD DATA LOCAL INFILE '#{file}' "
79
+ sql << "#{options[:insert_method]} " if options[:insert_method]
80
+ sql << "INTO TABLE #{quoted_table_name} "
81
+ sql << "CHARACTER SET #{options[:charset_name]} " if options[:charset_name]
82
+
83
+ fields = ""
84
+ fields << "TERMINATED BY '#{options[:fields_terminated_by]}' " if options[:fields_terminated_by]
85
+ fields << "OPTIONALLY ENCLOSED BY '#{options[:fields_optionally_enclosed_by]}' " if options[:fields_optionally_enclosed_by]
86
+ fields << "ESCAPED BY '#{options[:fields_escaped_by]}' " if options[:fields_escaped_by]
87
+
88
+ sql << "FIELDS #{fields} " unless fields.empty?
89
+ sql << "LINES TERMINATED BY '#{options[:lines_terminated_by]}' " if options[:lines_terminated_by]
90
+ sql << "IGNORE #{options[:ignore_lines]} LINES " if options[:ignore_lines]
91
+ sql << "(" + options[:columns].join(', ') + ") " if options[:columns]
92
+ if options[:mapping]
93
+ mappings = []
94
+ options[:mapping].each_pair do |column, mapping|
95
+ mappings << "#{column} = #{mapping}"
96
+ end
97
+ sql << "SET #{mappings.join(', ')} " if mappings.size > 0
98
+ end
99
+ sql << ";"
100
+ connection.execute(sql)
101
+ end
102
+ end
103
+ end
104
+ end
105
+ end