sbf 0.0.1

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 (369) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.rdoc +3 -0
  4. data/Rakefile +21 -0
  5. data/app/assets/javascripts/application.js +15 -0
  6. data/app/assets/javascripts/map.js +665 -0
  7. data/app/assets/javascripts/onemap.js +1928 -0
  8. data/app/assets/javascripts/units.js.coffee +3 -0
  9. data/app/assets/stylesheets/application.css +13 -0
  10. data/app/assets/stylesheets/rails_admin/custom/theming.css.scss +13 -0
  11. data/app/assets/stylesheets/scaffolds.css.scss +69 -0
  12. data/app/assets/stylesheets/units.css.scss +3 -0
  13. data/app/controllers/application_controller.rb +5 -0
  14. data/app/controllers/buses_controller.rb +5 -0
  15. data/app/controllers/units_controller.rb +74 -0
  16. data/app/helpers/application_helper.rb +2 -0
  17. data/app/helpers/units_helper.rb +2 -0
  18. data/app/models/ability.rb +39 -0
  19. data/app/models/block.rb +163 -0
  20. data/app/models/estate.rb +70 -0
  21. data/app/models/quota.rb +80 -0
  22. data/app/models/settings.rb +4 -0
  23. data/app/models/unit.rb +121 -0
  24. data/app/views/blocks/_map.html.erb +37 -0
  25. data/app/views/kaminari/twitter-bootstrap/_first_page.html.haml +8 -0
  26. data/app/views/kaminari/twitter-bootstrap/_last_page.html.haml +8 -0
  27. data/app/views/kaminari/twitter-bootstrap/_paginator.html.haml +19 -0
  28. data/app/views/layouts/application.html.erb +14 -0
  29. data/app/views/layouts/rails_admin/application.html.haml +31 -0
  30. data/app/views/units/_form.html.erb +37 -0
  31. data/app/views/units/edit.html.erb +6 -0
  32. data/app/views/units/index.html.erb +30 -0
  33. data/app/views/units/index.json.jbuilder +4 -0
  34. data/app/views/units/new.html.erb +5 -0
  35. data/app/views/units/show.html.erb +29 -0
  36. data/app/views/units/show.json.jbuilder +1 -0
  37. data/config/initializers/rails_admin.rb +203 -0
  38. data/config/routes.rb +3 -0
  39. data/db/migrate/20130721172422_create_blocks.rb +17 -0
  40. data/db/migrate/20130721173925_create_units.rb +16 -0
  41. data/db/migrate/20130721205526_create_estates.rb +12 -0
  42. data/db/migrate/20130722004104_add_estate_id_to_block.rb +5 -0
  43. data/db/migrate/20130722004318_update_estate_id_for_blocks.rb +13 -0
  44. data/db/migrate/20130722010900_remove_estate_from_blocks.rb +5 -0
  45. data/db/migrate/20130722105351_fix_numeric_columns.rb +39 -0
  46. data/db/migrate/20130910145656_create_quota.rb +16 -0
  47. data/db/migrate/20130910151554_populate_quota_table.rb +35 -0
  48. data/db/migrate/20130912181314_remove_ethnic_quota_from_blocks.rb +5 -0
  49. data/db/schema.rb +68 -0
  50. data/lib/kml/busstops-kml-105.kml +156 -0
  51. data/lib/kml/busstops-kml-106.kml +368 -0
  52. data/lib/kml/busstops-kml-108.kml +156 -0
  53. data/lib/kml/busstops-kml-135.kml +181 -0
  54. data/lib/kml/busstops-kml-136.kml +792 -0
  55. data/lib/kml/busstops-kml-137.kml +675 -0
  56. data/lib/kml/busstops-kml-138.kml +634 -0
  57. data/lib/kml/busstops-kml-139.kml +323 -0
  58. data/lib/kml/busstops-kml-140.kml +156 -0
  59. data/lib/kml/busstops-kml-165.kml +207 -0
  60. data/lib/kml/busstops-kml-166.kml +622 -0
  61. data/lib/kml/busstops-kml-167.kml +554 -0
  62. data/lib/kml/busstops-kml-168.kml +840 -0
  63. data/lib/kml/busstops-kml-169.kml +1401 -0
  64. data/lib/kml/busstops-kml-170.kml +1171 -0
  65. data/lib/kml/busstops-kml-171.kml +225 -0
  66. data/lib/kml/busstops-kml-187.kml +225 -0
  67. data/lib/kml/busstops-kml-188.kml +179 -0
  68. data/lib/kml/busstops-kml-196.kml +646 -0
  69. data/lib/kml/busstops-kml-197.kml +662 -0
  70. data/lib/kml/busstops-kml-198.kml +1005 -0
  71. data/lib/kml/busstops-kml-199.kml +1052 -0
  72. data/lib/kml/busstops-kml-200.kml +1331 -0
  73. data/lib/kml/busstops-kml-201.kml +1351 -0
  74. data/lib/kml/busstops-kml-218.kml +248 -0
  75. data/lib/kml/busstops-kml-219.kml +179 -0
  76. data/lib/kml/busstops-kml-220.kml +248 -0
  77. data/lib/kml/busstops-kml-221.kml +225 -0
  78. data/lib/kml/busstops-kml-225.kml +179 -0
  79. data/lib/kml/busstops-kml-226.kml +363 -0
  80. data/lib/kml/busstops-kml-227.kml +849 -0
  81. data/lib/kml/busstops-kml-228.kml +1015 -0
  82. data/lib/kml/busstops-kml-229.kml +759 -0
  83. data/lib/kml/busstops-kml-230.kml +557 -0
  84. data/lib/kml/busstops-kml-231.kml +998 -0
  85. data/lib/kml/busstops-kml-232.kml +2153 -0
  86. data/lib/kml/busstops-kml-233.kml +498 -0
  87. data/lib/kml/busstops-kml-234.kml +502 -0
  88. data/lib/kml/busstops-kml-235.kml +249 -0
  89. data/lib/kml/busstops-kml-249.kml +248 -0
  90. data/lib/kml/busstops-kml-250.kml +179 -0
  91. data/lib/kml/busstops-kml-251.kml +455 -0
  92. data/lib/kml/busstops-kml-252.kml +409 -0
  93. data/lib/kml/busstops-kml-253.kml +570 -0
  94. data/lib/kml/busstops-kml-254.kml +202 -0
  95. data/lib/kml/busstops-kml-256.kml +363 -0
  96. data/lib/kml/busstops-kml-257.kml +536 -0
  97. data/lib/kml/busstops-kml-258.kml +515 -0
  98. data/lib/kml/busstops-kml-259.kml +774 -0
  99. data/lib/kml/busstops-kml-260.kml +536 -0
  100. data/lib/kml/busstops-kml-261.kml +738 -0
  101. data/lib/kml/busstops-kml-262.kml +783 -0
  102. data/lib/kml/busstops-kml-263.kml +1044 -0
  103. data/lib/kml/busstops-kml-264.kml +543 -0
  104. data/lib/kml/busstops-kml-265.kml +624 -0
  105. data/lib/kml/busstops-kml-266.kml +934 -0
  106. data/lib/kml/busstops-kml-267.kml +883 -0
  107. data/lib/kml/busstops-kml-268.kml +187 -0
  108. data/lib/kml/busstops-kml-280.kml +271 -0
  109. data/lib/kml/busstops-kml-281.kml +248 -0
  110. data/lib/kml/busstops-kml-282.kml +639 -0
  111. data/lib/kml/busstops-kml-283.kml +501 -0
  112. data/lib/kml/busstops-kml-284.kml +432 -0
  113. data/lib/kml/busstops-kml-285.kml +432 -0
  114. data/lib/kml/busstops-kml-286.kml +363 -0
  115. data/lib/kml/busstops-kml-287.kml +272 -0
  116. data/lib/kml/busstops-kml-288.kml +792 -0
  117. data/lib/kml/busstops-kml-289.kml +801 -0
  118. data/lib/kml/busstops-kml-290.kml +673 -0
  119. data/lib/kml/busstops-kml-291.kml +474 -0
  120. data/lib/kml/busstops-kml-292.kml +256 -0
  121. data/lib/kml/busstops-kml-293.kml +748 -0
  122. data/lib/kml/busstops-kml-294.kml +999 -0
  123. data/lib/kml/busstops-kml-295.kml +769 -0
  124. data/lib/kml/busstops-kml-296.kml +1051 -0
  125. data/lib/kml/busstops-kml-297.kml +904 -0
  126. data/lib/kml/busstops-kml-298.kml +731 -0
  127. data/lib/kml/busstops-kml-299.kml +644 -0
  128. data/lib/kml/busstops-kml-300.kml +274 -0
  129. data/lib/kml/busstops-kml-302.kml +156 -0
  130. data/lib/kml/busstops-kml-311.kml +179 -0
  131. data/lib/kml/busstops-kml-312.kml +455 -0
  132. data/lib/kml/busstops-kml-313.kml +639 -0
  133. data/lib/kml/busstops-kml-314.kml +639 -0
  134. data/lib/kml/busstops-kml-315.kml +708 -0
  135. data/lib/kml/busstops-kml-316.kml +394 -0
  136. data/lib/kml/busstops-kml-317.kml +363 -0
  137. data/lib/kml/busstops-kml-318.kml +830 -0
  138. data/lib/kml/busstops-kml-319.kml +370 -0
  139. data/lib/kml/busstops-kml-320.kml +560 -0
  140. data/lib/kml/busstops-kml-321.kml +432 -0
  141. data/lib/kml/busstops-kml-322.kml +365 -0
  142. data/lib/kml/busstops-kml-323.kml +529 -0
  143. data/lib/kml/busstops-kml-324.kml +549 -0
  144. data/lib/kml/busstops-kml-325.kml +717 -0
  145. data/lib/kml/busstops-kml-326.kml +645 -0
  146. data/lib/kml/busstops-kml-327.kml +908 -0
  147. data/lib/kml/busstops-kml-328.kml +467 -0
  148. data/lib/kml/busstops-kml-329.kml +876 -0
  149. data/lib/kml/busstops-kml-330.kml +795 -0
  150. data/lib/kml/busstops-kml-331.kml +442 -0
  151. data/lib/kml/busstops-kml-342.kml +271 -0
  152. data/lib/kml/busstops-kml-343.kml +547 -0
  153. data/lib/kml/busstops-kml-344.kml +317 -0
  154. data/lib/kml/busstops-kml-345.kml +557 -0
  155. data/lib/kml/busstops-kml-346.kml +777 -0
  156. data/lib/kml/busstops-kml-347.kml +777 -0
  157. data/lib/kml/busstops-kml-348.kml +762 -0
  158. data/lib/kml/busstops-kml-349.kml +668 -0
  159. data/lib/kml/busstops-kml-350.kml +366 -0
  160. data/lib/kml/busstops-kml-351.kml +301 -0
  161. data/lib/kml/busstops-kml-352.kml +367 -0
  162. data/lib/kml/busstops-kml-353.kml +271 -0
  163. data/lib/kml/busstops-kml-354.kml +225 -0
  164. data/lib/kml/busstops-kml-355.kml +611 -0
  165. data/lib/kml/busstops-kml-356.kml +842 -0
  166. data/lib/kml/busstops-kml-357.kml +838 -0
  167. data/lib/kml/busstops-kml-358.kml +808 -0
  168. data/lib/kml/busstops-kml-359.kml +786 -0
  169. data/lib/kml/busstops-kml-360.kml +680 -0
  170. data/lib/kml/busstops-kml-361.kml +785 -0
  171. data/lib/kml/busstops-kml-362.kml +815 -0
  172. data/lib/kml/busstops-kml-363.kml +389 -0
  173. data/lib/kml/busstops-kml-374.kml +432 -0
  174. data/lib/kml/busstops-kml-376.kml +205 -0
  175. data/lib/kml/busstops-kml-377.kml +889 -0
  176. data/lib/kml/busstops-kml-378.kml +936 -0
  177. data/lib/kml/busstops-kml-379.kml +577 -0
  178. data/lib/kml/busstops-kml-380.kml +794 -0
  179. data/lib/kml/busstops-kml-381.kml +619 -0
  180. data/lib/kml/busstops-kml-382.kml +716 -0
  181. data/lib/kml/busstops-kml-383.kml +204 -0
  182. data/lib/kml/busstops-kml-385.kml +271 -0
  183. data/lib/kml/busstops-kml-386.kml +795 -0
  184. data/lib/kml/busstops-kml-387.kml +875 -0
  185. data/lib/kml/busstops-kml-388.kml +598 -0
  186. data/lib/kml/busstops-kml-389.kml +648 -0
  187. data/lib/kml/busstops-kml-390.kml +297 -0
  188. data/lib/kml/busstops-kml-391.kml +519 -0
  189. data/lib/kml/busstops-kml-392.kml +426 -0
  190. data/lib/kml/busstops-kml-393.kml +959 -0
  191. data/lib/kml/busstops-kml-394.kml +250 -0
  192. data/lib/kml/busstops-kml-395.kml +187 -0
  193. data/lib/kml/busstops-kml-405.kml +248 -0
  194. data/lib/kml/busstops-kml-407.kml +277 -0
  195. data/lib/kml/busstops-kml-408.kml +670 -0
  196. data/lib/kml/busstops-kml-409.kml +1094 -0
  197. data/lib/kml/busstops-kml-410.kml +1009 -0
  198. data/lib/kml/busstops-kml-411.kml +880 -0
  199. data/lib/kml/busstops-kml-412.kml +988 -0
  200. data/lib/kml/busstops-kml-413.kml +396 -0
  201. data/lib/kml/busstops-kml-417.kml +615 -0
  202. data/lib/kml/busstops-kml-418.kml +869 -0
  203. data/lib/kml/busstops-kml-419.kml +1174 -0
  204. data/lib/kml/busstops-kml-420.kml +463 -0
  205. data/lib/kml/busstops-kml-421.kml +253 -0
  206. data/lib/kml/busstops-kml-422.kml +180 -0
  207. data/lib/kml/busstops-kml-423.kml +865 -0
  208. data/lib/kml/busstops-kml-424.kml +664 -0
  209. data/lib/kml/busstops-kml-425.kml +457 -0
  210. data/lib/kml/busstops-kml-426.kml +179 -0
  211. data/lib/kml/busstops-kml-438.kml +157 -0
  212. data/lib/kml/busstops-kml-439.kml +388 -0
  213. data/lib/kml/busstops-kml-440.kml +248 -0
  214. data/lib/kml/busstops-kml-441.kml +409 -0
  215. data/lib/kml/busstops-kml-442.kml +411 -0
  216. data/lib/kml/busstops-kml-443.kml +795 -0
  217. data/lib/kml/busstops-kml-444.kml +321 -0
  218. data/lib/kml/busstops-kml-447.kml +226 -0
  219. data/lib/kml/busstops-kml-448.kml +668 -0
  220. data/lib/kml/busstops-kml-449.kml +508 -0
  221. data/lib/kml/busstops-kml-450.kml +796 -0
  222. data/lib/kml/busstops-kml-451.kml +783 -0
  223. data/lib/kml/busstops-kml-452.kml +157 -0
  224. data/lib/kml/busstops-kml-454.kml +670 -0
  225. data/lib/kml/busstops-kml-455.kml +1211 -0
  226. data/lib/kml/busstops-kml-456.kml +496 -0
  227. data/lib/kml/busstops-kml-457.kml +220 -0
  228. data/lib/kml/busstops-kml-470.kml +248 -0
  229. data/lib/kml/busstops-kml-473.kml +434 -0
  230. data/lib/kml/busstops-kml-474.kml +433 -0
  231. data/lib/kml/busstops-kml-475.kml +405 -0
  232. data/lib/kml/busstops-kml-478.kml +271 -0
  233. data/lib/kml/busstops-kml-479.kml +780 -0
  234. data/lib/kml/busstops-kml-480.kml +604 -0
  235. data/lib/kml/busstops-kml-481.kml +676 -0
  236. data/lib/kml/busstops-kml-482.kml +603 -0
  237. data/lib/kml/busstops-kml-483.kml +501 -0
  238. data/lib/kml/busstops-kml-484.kml +179 -0
  239. data/lib/kml/busstops-kml-485.kml +317 -0
  240. data/lib/kml/busstops-kml-486.kml +460 -0
  241. data/lib/kml/busstops-kml-487.kml +887 -0
  242. data/lib/kml/busstops-kml-488.kml +210 -0
  243. data/lib/kml/busstops-kml-501.kml +455 -0
  244. data/lib/kml/busstops-kml-502.kml +317 -0
  245. data/lib/kml/busstops-kml-503.kml +317 -0
  246. data/lib/kml/busstops-kml-504.kml +411 -0
  247. data/lib/kml/busstops-kml-505.kml +461 -0
  248. data/lib/kml/busstops-kml-506.kml +544 -0
  249. data/lib/kml/busstops-kml-509.kml +256 -0
  250. data/lib/kml/busstops-kml-510.kml +869 -0
  251. data/lib/kml/busstops-kml-511.kml +1146 -0
  252. data/lib/kml/busstops-kml-512.kml +963 -0
  253. data/lib/kml/busstops-kml-513.kml +1307 -0
  254. data/lib/kml/busstops-kml-514.kml +437 -0
  255. data/lib/kml/busstops-kml-515.kml +363 -0
  256. data/lib/kml/busstops-kml-516.kml +599 -0
  257. data/lib/kml/busstops-kml-517.kml +1078 -0
  258. data/lib/kml/busstops-kml-518.kml +709 -0
  259. data/lib/kml/busstops-kml-519.kml +179 -0
  260. data/lib/kml/busstops-kml-520.kml +225 -0
  261. data/lib/kml/busstops-kml-532.kml +363 -0
  262. data/lib/kml/busstops-kml-534.kml +179 -0
  263. data/lib/kml/busstops-kml-535.kml +989 -0
  264. data/lib/kml/busstops-kml-536.kml +1196 -0
  265. data/lib/kml/busstops-kml-537.kml +631 -0
  266. data/lib/kml/busstops-kml-540.kml +346 -0
  267. data/lib/kml/busstops-kml-541.kml +984 -0
  268. data/lib/kml/busstops-kml-542.kml +256 -0
  269. data/lib/kml/busstops-kml-543.kml +496 -0
  270. data/lib/kml/busstops-kml-544.kml +855 -0
  271. data/lib/kml/busstops-kml-545.kml +612 -0
  272. data/lib/kml/busstops-kml-546.kml +225 -0
  273. data/lib/kml/busstops-kml-547.kml +645 -0
  274. data/lib/kml/busstops-kml-548.kml +363 -0
  275. data/lib/kml/busstops-kml-549.kml +386 -0
  276. data/lib/kml/busstops-kml-550.kml +225 -0
  277. data/lib/kml/busstops-kml-551.kml +271 -0
  278. data/lib/kml/busstops-kml-566.kml +436 -0
  279. data/lib/kml/busstops-kml-567.kml +461 -0
  280. data/lib/kml/busstops-kml-568.kml +253 -0
  281. data/lib/kml/busstops-kml-571.kml +241 -0
  282. data/lib/kml/busstops-kml-572.kml +630 -0
  283. data/lib/kml/busstops-kml-573.kml +430 -0
  284. data/lib/kml/busstops-kml-574.kml +625 -0
  285. data/lib/kml/busstops-kml-575.kml +1110 -0
  286. data/lib/kml/busstops-kml-576.kml +1082 -0
  287. data/lib/kml/busstops-kml-577.kml +205 -0
  288. data/lib/kml/busstops-kml-581.kml +735 -0
  289. data/lib/kml/busstops-kml-582.kml +248 -0
  290. data/lib/kml/busstops-kml-594.kml +179 -0
  291. data/lib/kml/busstops-kml-595.kml +179 -0
  292. data/lib/kml/busstops-kml-597.kml +436 -0
  293. data/lib/kml/busstops-kml-598.kml +458 -0
  294. data/lib/kml/busstops-kml-601.kml +179 -0
  295. data/lib/kml/busstops-kml-602.kml +389 -0
  296. data/lib/kml/busstops-kml-603.kml +157 -0
  297. data/lib/kml/busstops-kml-605.kml +456 -0
  298. data/lib/kml/busstops-kml-606.kml +298 -0
  299. data/lib/kml/busstops-kml-607.kml +792 -0
  300. data/lib/kml/busstops-kml-608.kml +463 -0
  301. data/lib/kml/busstops-kml-626.kml +248 -0
  302. data/lib/kml/busstops-kml-628.kml +157 -0
  303. data/lib/kml/busstops-kml-629.kml +501 -0
  304. data/lib/kml/busstops-kml-630.kml +340 -0
  305. data/lib/kml/busstops-kml-631.kml +249 -0
  306. data/lib/kml/busstops-kml-632.kml +202 -0
  307. data/lib/kml/busstops-kml-633.kml +319 -0
  308. data/lib/kml/busstops-kml-635.kml +225 -0
  309. data/lib/kml/busstops-kml-636.kml +317 -0
  310. data/lib/kml/busstops-kml-638.kml +667 -0
  311. data/lib/kml/busstops-kml-656.kml +156 -0
  312. data/lib/kml/busstops-kml-657.kml +271 -0
  313. data/lib/kml/busstops-kml-660.kml +432 -0
  314. data/lib/kml/busstops-kml-662.kml +227 -0
  315. data/lib/kml/busstops-kml-663.kml +271 -0
  316. data/lib/kml/busstops-kml-664.kml +202 -0
  317. data/lib/kml/busstops-kml-665.kml +718 -0
  318. data/lib/kml/busstops-kml-666.kml +179 -0
  319. data/lib/kml/busstops-kml-667.kml +206 -0
  320. data/lib/kml/busstops-kml-669.kml +225 -0
  321. data/lib/kml/busstops-kml-688.kml +271 -0
  322. data/lib/kml/busstops-kml-690.kml +179 -0
  323. data/lib/kml/busstops-kml-691.kml +496 -0
  324. data/lib/kml/busstops-kml-692.kml +179 -0
  325. data/lib/kml/busstops-kml-693.kml +271 -0
  326. data/lib/kml/busstops-kml-695.kml +363 -0
  327. data/lib/kml/busstops-kml-696.kml +842 -0
  328. data/lib/kml/busstops-kml-697.kml +265 -0
  329. data/lib/kml/busstops-kml-698.kml +179 -0
  330. data/lib/kml/busstops-kml-700.kml +156 -0
  331. data/lib/kml/busstops-kml-719.kml +294 -0
  332. data/lib/kml/busstops-kml-721.kml +319 -0
  333. data/lib/kml/busstops-kml-722.kml +460 -0
  334. data/lib/kml/busstops-kml-723.kml +843 -0
  335. data/lib/kml/busstops-kml-724.kml +989 -0
  336. data/lib/kml/busstops-kml-725.kml +297 -0
  337. data/lib/kml/busstops-kml-726.kml +447 -0
  338. data/lib/kml/busstops-kml-727.kml +942 -0
  339. data/lib/kml/busstops-kml-728.kml +179 -0
  340. data/lib/kml/busstops-kml-75.kml +156 -0
  341. data/lib/kml/busstops-kml-750.kml +271 -0
  342. data/lib/kml/busstops-kml-751.kml +225 -0
  343. data/lib/kml/busstops-kml-752.kml +271 -0
  344. data/lib/kml/busstops-kml-753.kml +180 -0
  345. data/lib/kml/busstops-kml-754.kml +887 -0
  346. data/lib/kml/busstops-kml-755.kml +1067 -0
  347. data/lib/kml/busstops-kml-756.kml +609 -0
  348. data/lib/kml/busstops-kml-757.kml +448 -0
  349. data/lib/kml/busstops-kml-758.kml +391 -0
  350. data/lib/kml/busstops-kml-785.kml +341 -0
  351. data/lib/kml/busstops-kml-786.kml +365 -0
  352. data/lib/kml/busstops-kml-787.kml +662 -0
  353. data/lib/kml/busstops-kml-788.kml +1180 -0
  354. data/lib/kml/busstops-kml-789.kml +180 -0
  355. data/lib/kml/busstops-kml-816.kml +179 -0
  356. data/lib/kml/busstops-kml-817.kml +179 -0
  357. data/lib/kml/busstops-kml-818.kml +478 -0
  358. data/lib/kml/busstops-kml-819.kml +604 -0
  359. data/lib/kml/busstops-kml-820.kml +318 -0
  360. data/lib/kml/busstops-kml-849.kml +503 -0
  361. data/lib/kml/busstops-kml-850.kml +157 -0
  362. data/lib/kml/busstops-kml-877.kml +156 -0
  363. data/lib/kml/busstops-kml-908.kml +156 -0
  364. data/lib/kml/busstops-kml-969.kml +156 -0
  365. data/lib/sbf.rb +6 -0
  366. data/lib/sbf/engine.rb +19 -0
  367. data/lib/sbf/version.rb +3 -0
  368. data/lib/tasks/sbf_tasks.rake +4 -0
  369. metadata +467 -0
@@ -0,0 +1,3 @@
1
+ # Place all the behaviors and hooks related to the matching controller here.
2
+ # All this logic will automatically be available in application.js.
3
+ # You can use CoffeeScript in this file: http://coffeescript.org/
@@ -0,0 +1,13 @@
1
+ /*
2
+ * This is a manifest file that'll be compiled into application.css, which will include all the files
3
+ * listed below.
4
+ *
5
+ * Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets,
6
+ * or vendor/assets/stylesheets of plugins, if any, can be referenced here using a relative path.
7
+ *
8
+ * You're free to add application-wide styles to this file and they'll appear at the top of the
9
+ * compiled file, but it's generally better to create a new file per style scope.
10
+ *
11
+ *= require_self
12
+ *= require_tree .
13
+ */
@@ -0,0 +1,13 @@
1
+ /*
2
+ Customize RailsAdmin theme here.
3
+ Copy this file to your app/assets/stylesheets/rails_admin/custom/theming.css.scss, leave this one untouched
4
+ Don't require it in your application.rb
5
+
6
+ Look at the markup in RailsAdmin and go there to get inspiration from:
7
+
8
+ http://twitter.github.com/bootstrap/
9
+
10
+ Test me: (actual color should be the one defined in variables.css.scss if you did)
11
+
12
+ body{ background-color: $linkColor; }
13
+ */
@@ -0,0 +1,69 @@
1
+ body {
2
+ background-color: #fff;
3
+ color: #333;
4
+ font-family: verdana, arial, helvetica, sans-serif;
5
+ font-size: 13px;
6
+ line-height: 18px;
7
+ }
8
+
9
+ p, ol, ul, td {
10
+ font-family: verdana, arial, helvetica, sans-serif;
11
+ font-size: 13px;
12
+ line-height: 18px;
13
+ }
14
+
15
+ pre {
16
+ background-color: #eee;
17
+ padding: 10px;
18
+ font-size: 11px;
19
+ }
20
+
21
+ a {
22
+ color: #000;
23
+ &:visited {
24
+ color: #666;
25
+ }
26
+ &:hover {
27
+ color: #fff;
28
+ background-color: #000;
29
+ }
30
+ }
31
+
32
+ div {
33
+ &.field, &.actions {
34
+ margin-bottom: 10px;
35
+ }
36
+ }
37
+
38
+ #notice {
39
+ color: green;
40
+ }
41
+
42
+ .field_with_errors {
43
+ padding: 2px;
44
+ background-color: red;
45
+ display: table;
46
+ }
47
+
48
+ #error_explanation {
49
+ width: 450px;
50
+ border: 2px solid red;
51
+ padding: 7px;
52
+ padding-bottom: 0;
53
+ margin-bottom: 20px;
54
+ background-color: #f0f0f0;
55
+ h2 {
56
+ text-align: left;
57
+ font-weight: bold;
58
+ padding: 5px 5px 5px 15px;
59
+ font-size: 12px;
60
+ margin: -7px;
61
+ margin-bottom: 0px;
62
+ background-color: #c00;
63
+ color: #fff;
64
+ }
65
+ ul li {
66
+ font-size: 12px;
67
+ list-style: square;
68
+ }
69
+ }
@@ -0,0 +1,3 @@
1
+ // Place all the styles related to the Units controller here.
2
+ // They will automatically be included in application.css.
3
+ // You can use Sass (SCSS) here: http://sass-lang.com/
@@ -0,0 +1,5 @@
1
+ class ApplicationController < ActionController::Base
2
+ # Prevent CSRF attacks by raising an exception.
3
+ # For APIs, you may want to use :null_session instead.
4
+ protect_from_forgery with: :exception
5
+ end
@@ -0,0 +1,5 @@
1
+ class BusesController < ApplicationController
2
+ def getRoute
3
+ render json: open("http://www.onemap.sg/BusServiceAPI/Service1.svc/getBR?svc=#{params[:service]}&dir=1&stp=1").read
4
+ end
5
+ end
@@ -0,0 +1,74 @@
1
+ class UnitsController < ApplicationController
2
+ before_action :set_unit, only: [:show, :edit, :update, :destroy]
3
+
4
+ # GET /units
5
+ # GET /units.json
6
+ def index
7
+ @units = Unit.all
8
+ end
9
+
10
+ # GET /units/1
11
+ # GET /units/1.json
12
+ def show
13
+ end
14
+
15
+ # GET /units/new
16
+ def new
17
+ @unit = Unit.new
18
+ end
19
+
20
+ # GET /units/1/edit
21
+ def edit
22
+ end
23
+
24
+ # POST /units
25
+ # POST /units.json
26
+ def create
27
+ @unit = Unit.new(unit_params)
28
+
29
+ respond_to do |format|
30
+ if @unit.save
31
+ format.html { redirect_to @unit, notice: 'Unit was successfully created.' }
32
+ format.json { render action: 'show', status: :created, location: @unit }
33
+ else
34
+ format.html { render action: 'new' }
35
+ format.json { render json: @unit.errors, status: :unprocessable_entity }
36
+ end
37
+ end
38
+ end
39
+
40
+ # PATCH/PUT /units/1
41
+ # PATCH/PUT /units/1.json
42
+ def update
43
+ respond_to do |format|
44
+ if @unit.update(unit_params)
45
+ format.html { redirect_to @unit, notice: 'Unit was successfully updated.' }
46
+ format.json { head :no_content }
47
+ else
48
+ format.html { render action: 'edit' }
49
+ format.json { render json: @unit.errors, status: :unprocessable_entity }
50
+ end
51
+ end
52
+ end
53
+
54
+ # DELETE /units/1
55
+ # DELETE /units/1.json
56
+ def destroy
57
+ @unit.destroy
58
+ respond_to do |format|
59
+ format.html { redirect_to units_url }
60
+ format.json { head :no_content }
61
+ end
62
+ end
63
+
64
+ private
65
+ # Use callbacks to share common setup or constraints between actions.
66
+ def set_unit
67
+ @unit = Unit.find(params[:id])
68
+ end
69
+
70
+ # Never trust parameters from the scary internet, only allow the white list through.
71
+ def unit_params
72
+ params.require(:unit).permit(:no, :price, :area, :flat_type, :block_id)
73
+ end
74
+ end
@@ -0,0 +1,2 @@
1
+ module ApplicationHelper
2
+ end
@@ -0,0 +1,2 @@
1
+ module UnitsHelper
2
+ end
@@ -0,0 +1,39 @@
1
+ class Ability
2
+ include CanCan::Ability
3
+
4
+ def initialize(user)
5
+ can :access, :rails_admin
6
+ can :dashboard
7
+
8
+ can :read, :all
9
+ # can :edit, Quota
10
+ # can :update, Quota
11
+
12
+ # Define abilities for the passed in user here. For example:
13
+ #
14
+ # user ||= User.new # guest user (not logged in)
15
+ # if user.admin?
16
+ # can :manage, :all
17
+ # else
18
+ # can :read, :all
19
+ # end
20
+ #
21
+ # The first argument to `can` is the action you are giving the user
22
+ # permission to do.
23
+ # If you pass :manage it will apply to every action. Other common actions
24
+ # here are :read, :create, :update and :destroy.
25
+ #
26
+ # The second argument is the resource the user can perform the action on.
27
+ # If you pass :all it will apply to every resource. Otherwise pass a Ruby
28
+ # class of the resource.
29
+ #
30
+ # The third argument is an optional hash of conditions to further filter the
31
+ # objects.
32
+ # For example, here the user can only update published articles.
33
+ #
34
+ # can :update, Article, :published => true
35
+ #
36
+ # See the wiki for details:
37
+ # https://github.com/ryanb/cancan/wiki/Defining-Abilities
38
+ end
39
+ end
@@ -0,0 +1,163 @@
1
+ class Block < ActiveRecord::Base
2
+ has_many :units, -> { order(:no) }
3
+ has_many :quotas, -> { order(:flat_type) }
4
+
5
+ belongs_to :estate
6
+
7
+ default_scope { includes(:quotas).joins(:estate) }
8
+
9
+ def address
10
+ "#{no} #{street}"
11
+ end
12
+
13
+ def long_address
14
+ address
15
+ .gsub('Rd','Road')
16
+ .gsub('Nth','North')
17
+ .gsub('Ave','Avenue')
18
+ .gsub('St','Street')
19
+ .gsub('Ctrl','Central')
20
+ .gsub('Jln','Jalan')
21
+ .gsub('Lor ','Lorong ')
22
+ .gsub('Upp ','Upper ')
23
+ .gsub('Hts','Heights')
24
+ .gsub('Gdn','Garden')
25
+ .gsub('Bt','Bukit')
26
+ .gsub("C'Wealth","Commonwealth")
27
+ end
28
+
29
+ class << self
30
+ def sort_by_delivery_date(collection=self.all)
31
+ collection.sort { |a,b| compare_delivery_date(a,b) }
32
+ end
33
+
34
+ def compare_delivery_date(a,b)
35
+ begin
36
+ date_a = a.delivery_date.to_date
37
+ rescue
38
+ date_a = Date.new
39
+ end
40
+
41
+ begin
42
+ date_b = b.delivery_date.to_date
43
+ rescue
44
+ date_b = Date.new
45
+ end
46
+
47
+ date_a <=> date_b
48
+ end
49
+
50
+ def psql_date_regex
51
+ '\'\d{1,2}\s+\w{3}\s+\d{2,4}\''
52
+ end
53
+
54
+ def sql_by_delivery_date
55
+ case ActiveRecord::Base.connection.instance_values["config"][:adapter].to_sym
56
+ when :mysql2
57
+ # mysql does not support (col1, col2) asc|desc
58
+ 'str_to_date(blocks.delivery_date, \'%d %M %Y\'), str_to_date(blocks.lease_start, \'%d %M %Y\')'
59
+ when :postgresql
60
+ # trick to allow non-dates to be sorted ahead
61
+ %Q{(
62
+ to_date(substring(blocks.delivery_date || \'01 Jan 1900\' from #{psql_date_regex}), \'DD Mon YYYY\'),
63
+ to_date(substring(blocks.lease_start from #{psql_date_regex}), \'DD Mon YYYY\')
64
+ )}
65
+ end
66
+ end
67
+
68
+ def sql_by_lease_start
69
+ case ActiveRecord::Base.connection.instance_values["config"][:adapter].to_sym
70
+ when :mysql2
71
+ 'str_to_date(blocks.lease_start, \'%d %M %Y\')'
72
+ when :postgresql
73
+ %Q{(
74
+ to_date(substring(blocks.lease_start from #{psql_date_regex}), \'DD Mon YYYY\'),
75
+ substring(blocks.lease_start from \'\\w+\')
76
+ )}
77
+ end
78
+ end
79
+
80
+ def sql_by_address
81
+ case ActiveRecord::Base.connection.instance_values["config"][:adapter].to_sym
82
+ when :mysql2
83
+ 'concat(blocks.street, blocks.no)'
84
+ when :postgresql
85
+ '(blocks.street || blocks.no)'
86
+ end
87
+ end
88
+ end
89
+
90
+ rails_admin do
91
+ # Found associations:
92
+
93
+ configure :estate, :belongs_to_association
94
+ configure :units, :has_many_association
95
+ configure :quotas, :has_many_association
96
+
97
+ # Found columns:
98
+
99
+ configure :id, :integer
100
+ configure :no, :string
101
+ configure :street, :string
102
+ configure :probable_date, :string
103
+ configure :delivery_date, :string
104
+ configure :lease_start, :string
105
+ configure :created_at, :datetime
106
+ configure :updated_at, :datetime
107
+ configure :estate_id, :integer # Hidden
108
+
109
+ # Cross-section configuration:
110
+
111
+ object_label_method :no # Name of the method called for pretty printing an *instance* of ModelName
112
+ # label 'My model' # Name of ModelName (smartly defaults to ActiveRecord's I18n API)
113
+ # label_plural 'My models' # Same, plural
114
+ weight 1 # Navigation priority. Bigger is higher.
115
+ # parent OtherModel # Set parent model for navigation. MyModel will be nested below. OtherModel will be on first position of the dropdown
116
+ # navigation_label # Sets dropdown entry's name in navigation. Only for parents!
117
+
118
+ # Section specific configuration:
119
+
120
+ list do
121
+ # filters [:id, :name] # Array of field names which filters should be shown by default in the table header
122
+ # items_per_page 100 # Override default_items_per_page
123
+ # sort_by :id # Sort column (default is primary key)
124
+ # sort_reverse true # Sort direction (default is true for primary key, last created first)
125
+
126
+ field :estate
127
+ field :no
128
+ field :street
129
+ field :probable_date do
130
+ column_width 100
131
+ end
132
+ field :delivery_date do
133
+ column_width 100
134
+ sortable Block.sql_by_delivery_date
135
+ end
136
+ field :lease_start do
137
+ column_width 100
138
+ sortable Block.sql_by_lease_start
139
+ end
140
+ field :quotas
141
+ end
142
+
143
+ show do
144
+ field :estate
145
+ field :address do
146
+ pretty_value do
147
+ # inline javascript for loading of libraries should be placed in <head>
148
+ bindings[:view].render :partial => 'blocks/map', :locals => {address: bindings[:object].long_address}
149
+ end
150
+ end
151
+
152
+ field :probable_date
153
+ field :delivery_date
154
+ field :lease_start
155
+ field :quotas
156
+ field :units
157
+ end
158
+
159
+ # also see the create, update, modal and nested sections, which override edit in specific cases (resp. when creating, updating, modifying from another model in a popup modal or modifying from another model nested form)
160
+ # you can override a cross-section field configuration in any section with the same syntax `configure :field_name do ... end`
161
+ # using `field` instead of `configure` will exclude all other fields and force the ordering
162
+ end
163
+ end
@@ -0,0 +1,70 @@
1
+ class Estate < ActiveRecord::Base
2
+ has_many :blocks, -> { order(:no) }
3
+ has_many :units, -> { order(:no) }, through: :blocks
4
+
5
+ default_scope { includes(:blocks) }
6
+
7
+ rails_admin do
8
+ # Found associations:
9
+
10
+ configure :blocks, :has_many_association
11
+ configure :units, :has_many_association
12
+
13
+ # Found columns:
14
+
15
+ configure :id, :integer
16
+ configure :name, :string
17
+ configure :total, :integer
18
+ configure :created_at, :datetime
19
+ configure :updated_at, :datetime
20
+
21
+ # Cross-section configuration:
22
+
23
+ # object_label_method :name # Name of the method called for pretty printing an *instance* of ModelName
24
+ # label 'My model' # Name of ModelName (smartly defaults to ActiveRecord's I18n API)
25
+ # label_plural 'My models' # Same, plural
26
+ # weight 0 # Navigation priority. Bigger is higher.
27
+ # parent OtherModel # Set parent model for navigation. MyModel will be nested below. OtherModel will be on first position of the dropdown
28
+ # navigation_label # Sets dropdown entry's name in navigation. Only for parents!
29
+
30
+ # Section specific configuration:
31
+
32
+ list do
33
+ # filters [:id, :name] # Array of field names which filters should be shown by default in the table header
34
+ # items_per_page 100 # Override default_items_per_page
35
+ sort_by :name # Sort column (default is primary key)
36
+ # sort_reverse true # Sort direction (default is true for primary key, last created first)
37
+
38
+ field :name do
39
+ pretty_value do
40
+ bindings[:view].link_to bindings[:object].name, bindings[:view].rails_admin.show_path(:estate, bindings[:object])
41
+ end
42
+ end
43
+ field :total
44
+ field :blocks
45
+ end
46
+
47
+ show do
48
+ field :id
49
+ field :name
50
+ field :total do
51
+ pretty_value do
52
+ e = bindings[:object]
53
+ r = Quota.where(block_id: e.blocks).select('flat_type, sum(malay) as m, sum(chinese) as c, sum(others) as o').group(:flat_type)
54
+ h = Hash.new
55
+ r.each do |q|
56
+ h[q.flat_type] = [q.m,q.c,q.o]
57
+ end
58
+
59
+ "#{bindings[:object].total} #{h}"
60
+ end
61
+ end
62
+ field :blocks
63
+ field :units
64
+ end
65
+
66
+ # also see the create, update, modal and nested sections, which override edit in specific cases (resp. when creating, updating, modifying from another model in a popup modal or modifying from another model nested form)
67
+ # you can override a cross-section field configuration in any section with the same syntax `configure :field_name do ... end`
68
+ # using `field` instead of `configure` will exclude all other fields and force the ordering
69
+ end
70
+ end