sbf 0.0.1

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