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,80 @@
1
+ class Quota < ActiveRecord::Base
2
+ belongs_to :block
3
+ has_many :units
4
+
5
+ has_one :estate, through: :block
6
+
7
+ # Warning: default_scope + join breaks update of records: https://github.com/rails/rails/issues/11199
8
+ default_scope { joins(:estate).readonly(false) }
9
+
10
+ # attr_accessible :malay, :chinese, :others
11
+
12
+ # include ActiveModel::ForbiddenAttributesProtection
13
+
14
+ def summary
15
+ "M:#{malay},C:#{chinese},I/O:#{others}"
16
+ end
17
+
18
+ def full_summary
19
+ "(#{flat_type}) #{summary}"
20
+ end
21
+
22
+ rails_admin do
23
+ object_label_method :full_summary
24
+
25
+ list do
26
+ filters [:estate, :flat_type]
27
+ # sort_by :estate
28
+
29
+ field :estate, :enum do
30
+ pretty_value do
31
+ bindings[:view].link_to bindings[:object].estate.name, bindings[:view].rails_admin.show_path(:estate, bindings[:object].estate)
32
+ end
33
+ enum do
34
+ Estate.all.map(&:name).uniq.to_a
35
+ end
36
+ sortable "estates.name, flat_type, #{Block.sql_by_address}"
37
+ searchable 'estates.name'
38
+ queryable :true
39
+
40
+ column_width 50
41
+ end
42
+ field :flat_type do
43
+ pretty_value do
44
+ block_id = bindings[:object].block_id
45
+ unit_count = Unit.where(block_id: block_id, flat_type: bindings[:object].flat_type).count
46
+ "#{bindings[:object].flat_type} (#{unit_count})"
47
+ end
48
+ column_width 50
49
+ end
50
+
51
+ field :block do
52
+ pretty_value do
53
+ bindings[:view].link_to "#{bindings[:object].block.no} #{bindings[:object].block.street}",
54
+ bindings[:view].rails_admin.show_path(:block, bindings[:object].block)
55
+ end
56
+ sortable Block.sql_by_address
57
+ searchable [:no, :street]
58
+ queryable :true
59
+
60
+ column_width 100
61
+ end
62
+
63
+ field :malay do
64
+ column_width 50
65
+ end
66
+ field :chinese do
67
+ column_width 50
68
+ end
69
+ field :others do
70
+ column_width 50
71
+ end
72
+ end
73
+
74
+ # edit do
75
+ # field :malay
76
+ # field :chinese
77
+ # field :others
78
+ # end
79
+ end
80
+ end
@@ -0,0 +1,4 @@
1
+ class Settings < Settingslogic
2
+ source "#{Rails.root}/config/application.yml"
3
+ namespace Rails.env
4
+ end
@@ -0,0 +1,121 @@
1
+ class Unit < ActiveRecord::Base
2
+ belongs_to :block
3
+ belongs_to :flat_block, foreign_key: :block_id, class_name: 'Block'
4
+ belongs_to :quota
5
+
6
+ # not intuitive, but this works better with rails_admin than delegate
7
+ has_one :estate, through: :flat_block
8
+
9
+ delegate :probable_date, :delivery_date, :lease_start, to: :flat_block
10
+
11
+ default_scope { includes(:estate) }
12
+
13
+ rails_admin do
14
+ # Found associations:
15
+
16
+ configure :estate, :has_one_association
17
+ configure :block, :belongs_to_association
18
+ configure :quota, :belongs_to_association
19
+
20
+ # Found columns:
21
+
22
+ # configure :id, :integer
23
+ configure :no, :string
24
+ configure :price, :integer
25
+ configure :area, :integer
26
+ configure :flat_type, :string
27
+ # configure :block_id, :integer # Hidden
28
+ configure :created_at, :datetime
29
+ configure :updated_at, :datetime
30
+
31
+ configure :probable_date, :string
32
+ configure :delivery_date, :string
33
+ configure :lease_start, :string
34
+
35
+ # Cross-section configuration:
36
+
37
+ object_label_method :no # Name of the method called for pretty printing an *instance* of ModelName
38
+ # label 'My model' # Name of ModelName (smartly defaults to ActiveRecord's I18n API)
39
+ # label_plural 'My models' # Same, plural
40
+ weight 2 # Navigation priority. Bigger is higher.
41
+ # parent OtherModel # Set parent model for navigation. MyModel will be nested below. OtherModel will be on first position of the dropdown
42
+ # navigation_label # Sets dropdown entry's name in navigation. Only for parents!
43
+
44
+ # Section specific configuration:
45
+
46
+ list do
47
+ filters [:estate, :flat_type, :price, :area] # Array of field names which filters should be shown by default in the table header
48
+ # items_per_page 100 # Override default_items_per_page
49
+ sort_by "flat_type desc, price" # Sort column (default is primary key)
50
+ sort_reverse false # Sort direction (default is true for primary key, last created first)
51
+
52
+ field :estate, :enum do
53
+ pretty_value do
54
+ bindings[:view].link_to bindings[:object].estate.name, bindings[:view].rails_admin.show_path(:estate, bindings[:object].estate)
55
+ end
56
+ enum do
57
+ Estate.all.map(&:name).uniq.to_a
58
+ end
59
+ sortable 'estates.name'
60
+ searchable 'estates.name'
61
+ queryable :true
62
+
63
+ column_width 50
64
+ end
65
+ field :flat_type do
66
+ column_width 50
67
+ end
68
+ field :block do
69
+ pretty_value do
70
+ bindings[:view].link_to "#{bindings[:object].block.no} #{bindings[:object].block.street}",
71
+ bindings[:view].rails_admin.show_path(:block, bindings[:object].block)
72
+ end
73
+ sortable Block.sql_by_address
74
+ searchable [:no, :street]
75
+ queryable :true
76
+
77
+ column_width 100
78
+ end
79
+ field :no do
80
+ column_width 50
81
+ end
82
+ field :price do
83
+ column_width 50
84
+ end
85
+ field :area do
86
+ column_width 10
87
+ end
88
+
89
+ field :probable_date do
90
+ pretty_value { bindings[:object].block.probable_date }
91
+ sortable 'blocks.probable_date'
92
+ column_width 50
93
+ end
94
+ field :delivery_date do
95
+ pretty_value { bindings[:object].block.delivery_date }
96
+ sortable Block.sql_by_delivery_date
97
+ column_width 50
98
+ end
99
+ field :lease_start do
100
+ pretty_value { bindings[:object].block.lease_start }
101
+ sortable Block.sql_by_lease_start
102
+ column_width 50
103
+ end
104
+
105
+ # field :ethnic_quota do
106
+ # pretty_value { bindings[:object].block.short_ethnic_quota }
107
+ # sortable 'blocks.ethnic_quota'
108
+ # column_width 25
109
+ # end
110
+
111
+ field :quota do
112
+ pretty_value { bindings[:object].quota.summary }
113
+ column_width 50
114
+ end
115
+ end
116
+
117
+ # 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)
118
+ # you can override a cross-section field configuration in any section with the same syntax `configure :field_name do ... end`
119
+ # using `field` instead of `configure` will exclude all other fields and force the ordering
120
+ end
121
+ end
@@ -0,0 +1,37 @@
1
+ <% content_for :head do %>
2
+
3
+ <!-- script src="http://maps.googleapis.com/maps/api/js?v=3.exp&libraries=places&sensor=false" type="text/javascript"></script -->
4
+
5
+ <!-- script src="http://serverapi.arcgisonline.com/jsapi/arcgis/?v=2.8"></script -->
6
+ <!-- script type='text/JavaScript' src="http://www.onemap.sg/API/JS?accessKEY=<%= Settings.onemap_api_key %>&v=2.8&type=full"></script -->
7
+ <!-- script src="http://t1.onemap.sg/om_js/arcgis_js_api/library/2.8/arcgis/js/default.js" type="text/javascript"></script -->
8
+ <!-- %= javascript_include_tag 'onemap' % -->
9
+ <!-- link rel="stylesheet" type="text/css" href="http://t1.onemap.sg/om_js/arcgis_js_api/library/2.8/arcgis/js/dojo/dijit/themes/tundra/tundra.css"/ -->
10
+ <% end %>
11
+
12
+ <div id="address" data-address="<%= address %>"><%= address %></div>
13
+ <div id="map_canvas" style="width: 100%; height: 1000px;"></div>
14
+ <div class="tundra">
15
+ <div id="div_onemap" style="width: 100%; height: 1000px;"></div>
16
+ </div>
17
+
18
+ <script type="text/javascript">
19
+ // var _OneMapGlobalToken = "KUWmLBEUle8AfnRqj2x1V7Pi06pXTwLdlNu94ltLSB0iqtypbv0/WWUxdoh0t0QxakK93PVbieR1OTBHQ3qxcaiWGbsfj3aj";
20
+ var infowindow;
21
+ var OneMap;
22
+ var mashup;
23
+ var address;
24
+
25
+ var themeGraphicsLayer;
26
+ var gra;
27
+
28
+ var omResults;
29
+
30
+ var onemap_path = "http://www.onemap.sg/API/JS?accessKEY=<%= Settings.onemap_api_key %>&v=2.8";
31
+
32
+ // below is the local version of onemap for debugging without interference of jquery conflicts,
33
+ // as the original embeds jquery 1.3.2
34
+ //onemap_path = "<%= asset_path('onemap.js') %>";
35
+ </script>
36
+
37
+ <%= javascript_include_tag 'map' %>
@@ -0,0 +1,8 @@
1
+ -# Link to the "First" page
2
+ -# available local variables
3
+ -# url: url to the first page
4
+ -# current_page: a page object for the currently displayed page
5
+ -# total_pages: total number of pages
6
+ -# per_page: number of items to fetch per page
7
+ -# remote: data-remote
8
+ %li.first= link_to raw(t 'admin.pagination.first'), url, :class => (remote ? 'pjax' : '')
@@ -0,0 +1,8 @@
1
+ -# Link to the "Last" page
2
+ -# available local variables
3
+ -# url: url to the last page
4
+ -# current_page: a page object for the currently displayed page
5
+ -# total_pages: total number of pages
6
+ -# per_page: number of items to fetch per page
7
+ -# remote: data-remote
8
+ %li.next= link_to raw(t 'admin.pagination.last'), url, :class => (remote ? 'pjax' : '')
@@ -0,0 +1,19 @@
1
+ -# The container tag
2
+ -# available local variables
3
+ -# current_page: a page object for the currently displayed page
4
+ -# total_pages: total number of pages
5
+ -# per_page: number of items to fetch per page
6
+ -# remote: data-remote
7
+ -# paginator: the paginator that renders the pagination tags inside
8
+ = paginator.render do
9
+ .pagination
10
+ %ul
11
+ = first_page_tag unless current_page.first?
12
+ = prev_page_tag
13
+ - each_page do |page|
14
+ - if page.left_outer? or page.right_outer? or page.inside_window?
15
+ = page_tag page
16
+ - elsif !page.was_truncated?
17
+ = gap_tag
18
+ = next_page_tag
19
+ = last_page_tag unless current_page.last?
@@ -0,0 +1,14 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>Sbf2013</title>
5
+ <%= stylesheet_link_tag "application", media: "all", "data-turbolinks-track" => true %>
6
+ <%= javascript_include_tag "application", "data-turbolinks-track" => true %>
7
+ <%= csrf_meta_tags %>
8
+ </head>
9
+ <body>
10
+
11
+ <%= yield %>
12
+
13
+ </body>
14
+ </html>
@@ -0,0 +1,31 @@
1
+ !!! 5
2
+ %html
3
+ %head
4
+ %meta{:content => "text/html; charset=utf-8", "http-equiv" => "Content-Type"}
5
+ %meta{:content => "NONE,NOARCHIVE", :name => "robots"}
6
+ = csrf_meta_tag
7
+ = stylesheet_link_tag "rails_admin/rails_admin.css", :media => :all
8
+ = javascript_include_tag "rails_admin/rails_admin.js"
9
+
10
+ = yield :head
11
+ %body.rails_admin
12
+ #loading.label.label-warning{:style => 'display:none; position:fixed; right:20px; bottom:20px; z-index:100000'}= t('admin.loading')
13
+ .navbar.navbar-fixed-top
14
+ .navbar-inner
15
+ .container-fluid
16
+ %a.brand.pjax{:href => dashboard_path}
17
+ = _get_plugin_name[0] || 'Rails'
18
+ %small= _get_plugin_name[1] || 'Admin'
19
+ .nav-collapse
20
+ = render :partial => 'layouts/rails_admin/secondary_navigation'
21
+ .container-fluid
22
+ .row-fluid
23
+ / .span3
24
+
25
+ .span12
26
+ .row-fluid
27
+ .well.sidebar-nav
28
+ %ul.nav.nav-list= main_navigation
29
+ %ul.nav.nav-list= static_navigation
30
+ .row-fluid
31
+ .content{:'data-pjax-container' => true}= render :template => 'layouts/rails_admin/pjax'
@@ -0,0 +1,37 @@
1
+ <%= form_for(@unit) do |f| %>
2
+ <% if @unit.errors.any? %>
3
+ <div id="error_explanation">
4
+ <h2><%= pluralize(@unit.errors.count, "error") %> prohibited this unit from being saved:</h2>
5
+
6
+ <ul>
7
+ <% @unit.errors.full_messages.each do |msg| %>
8
+ <li><%= msg %></li>
9
+ <% end %>
10
+ </ul>
11
+ </div>
12
+ <% end %>
13
+
14
+ <div class="field">
15
+ <%= f.label :no %><br>
16
+ <%= f.text_field :no %>
17
+ </div>
18
+ <div class="field">
19
+ <%= f.label :price %><br>
20
+ <%= f.text_field :price %>
21
+ </div>
22
+ <div class="field">
23
+ <%= f.label :area %><br>
24
+ <%= f.text_field :area %>
25
+ </div>
26
+ <div class="field">
27
+ <%= f.label :flat_type %><br>
28
+ <%= f.text_field :flat_type %>
29
+ </div>
30
+ <div class="field">
31
+ <%= f.label :block %><br>
32
+ <%= f.text_field :block %>
33
+ </div>
34
+ <div class="actions">
35
+ <%= f.submit %>
36
+ </div>
37
+ <% end %>
@@ -0,0 +1,6 @@
1
+ <h1>Editing unit</h1>
2
+
3
+ <%= render 'form' %>
4
+
5
+ <%= link_to 'Show', @unit %> |
6
+ <%= link_to 'Back', units_path %>
@@ -0,0 +1,30 @@
1
+ <h1>Listing units</h1>
2
+
3
+ <table>
4
+ <thead>
5
+ <tr>
6
+ <th>No</th>
7
+ <th>Price</th>
8
+ <th>Area</th>
9
+ <th>Flat type</th>
10
+ <th>Block</th>
11
+ <th>Estate</th>
12
+ </tr>
13
+ </thead>
14
+
15
+ <tbody>
16
+ <% @units.each do |unit| %>
17
+ <% block = unit.block %>
18
+ <tr>
19
+ <td><%= unit.no %></td>
20
+ <td><%= unit.price %></td>
21
+ <td><%= unit.area %></td>
22
+ <td><%= unit.flat_type %></td>
23
+ <td><%= block.id %></td>
24
+ <td><%= block.estate.name %></td>
25
+ </tr>
26
+ <% end %>
27
+ </tbody>
28
+ </table>
29
+
30
+ <br>
@@ -0,0 +1,4 @@
1
+ json.array!(@units) do |unit|
2
+ json.extract! unit, :no, :price, :area, :flat_type, :block_id
3
+ json.url unit_url(unit, format: :json)
4
+ end
@@ -0,0 +1,5 @@
1
+ <h1>New unit</h1>
2
+
3
+ <%= render 'form' %>
4
+
5
+ <%= link_to 'Back', units_path %>
@@ -0,0 +1,29 @@
1
+ <p id="notice"><%= notice %></p>
2
+
3
+ <p>
4
+ <strong>No:</strong>
5
+ <%= @unit.no %>
6
+ </p>
7
+
8
+ <p>
9
+ <strong>Price:</strong>
10
+ <%= @unit.price %>
11
+ </p>
12
+
13
+ <p>
14
+ <strong>Area:</strong>
15
+ <%= @unit.area %>
16
+ </p>
17
+
18
+ <p>
19
+ <strong>Flat type:</strong>
20
+ <%= @unit.flat_type %>
21
+ </p>
22
+
23
+ <p>
24
+ <strong>Block:</strong>
25
+ <%= @unit.block %>
26
+ </p>
27
+
28
+ <%= link_to 'Edit', edit_unit_path(@unit) %> |
29
+ <%= link_to 'Back', units_path %>