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 @@
1
+ json.extract! @unit, :no, :price, :area, :flat_type, :block_id, :created_at, :updated_at
@@ -0,0 +1,203 @@
1
+ # RailsAdmin config file. Generated on July 22, 2013 15:10
2
+ # See github.com/sferik/rails_admin for more informations
3
+
4
+ RailsAdmin.config do |config|
5
+
6
+ ################ Global configuration ################
7
+
8
+ # Set the admin name here (optional second array element will appear in red). For example:
9
+ # config.main_app_name = ['Sbf2013', 'Admin']
10
+ # or for a more dynamic name:
11
+ # config.main_app_name = Proc.new { |controller| [Rails.application.engine_name.titleize, controller.params['action'].titleize] }
12
+ config.main_app_name = ['SBF', Rails.application.class.parent_name.split(/SBF/i).last.titleize]
13
+ # RailsAdmin may need a way to know who the current user is]
14
+ config.current_user_method {} # auto-generated
15
+ config.authenticate_with {}
16
+ config.authorize_with :cancan
17
+
18
+ # If you want to track changes on your models:
19
+ # config.audit_with :history, 'User'
20
+
21
+ # Or with a PaperTrail: (you need to install it first)
22
+ # config.audit_with :paper_trail, 'User'
23
+
24
+ # Display empty fields in show views:
25
+ config.compact_show_view = false
26
+
27
+ # Number of default rows per-page:
28
+ config.default_items_per_page = 50
29
+
30
+ # Exclude specific models (keep the others):
31
+ # config.excluded_models = ['Block', 'Estate', 'Unit']
32
+
33
+ # Include specific models (exclude the others):
34
+ # config.included_models = ['Block', 'Estate', 'Unit']
35
+
36
+ # Label methods for model instances:
37
+ # config.label_methods << :description # Default is [:name, :title]
38
+
39
+ # config.actions do
40
+ # index
41
+ # show
42
+ # update
43
+ # dashboard
44
+ # end
45
+
46
+ ################ Model configuration ################
47
+
48
+ # Each model configuration can alternatively:
49
+ # - stay here in a `config.model 'ModelName' do ... end` block
50
+ # - go in the model definition file in a `rails_admin do ... end` block
51
+
52
+ # This is your choice to make:
53
+ # - This initializer is loaded once at startup (modifications will show up when restarting the application) but all RailsAdmin configuration would stay in one place.
54
+ # - Models are reloaded at each request in development mode (when modified), which may smooth your RailsAdmin development workflow.
55
+
56
+
57
+ # Now you probably need to tour the wiki a bit: https://github.com/sferik/rails_admin/wiki
58
+ # Anyway, here is how RailsAdmin saw your application's models when you ran the initializer:
59
+
60
+
61
+
62
+ ### Block ###
63
+
64
+ # config.model 'Block' do
65
+
66
+ # # You can copy this to a 'rails_admin do ... end' block inside your block.rb model definition
67
+
68
+ # # Found associations:
69
+
70
+ # configure :estate, :belongs_to_association
71
+ # configure :units, :has_many_association
72
+
73
+ # # Found columns:
74
+
75
+ # configure :id, :integer
76
+ # configure :no, :string
77
+ # configure :street, :string
78
+ # configure :probable_date, :string
79
+ # configure :delivery_date, :string
80
+ # configure :lease_start, :string
81
+ # configure :ethnic_quota, :string
82
+ # configure :created_at, :datetime
83
+ # configure :updated_at, :datetime
84
+ # configure :estate_id, :integer # Hidden
85
+
86
+ # # Cross-section configuration:
87
+
88
+ # # object_label_method :name # Name of the method called for pretty printing an *instance* of ModelName
89
+ # # label 'My model' # Name of ModelName (smartly defaults to ActiveRecord's I18n API)
90
+ # # label_plural 'My models' # Same, plural
91
+ # # weight 0 # Navigation priority. Bigger is higher.
92
+ # # parent OtherModel # Set parent model for navigation. MyModel will be nested below. OtherModel will be on first position of the dropdown
93
+ # # navigation_label # Sets dropdown entry's name in navigation. Only for parents!
94
+
95
+ # # Section specific configuration:
96
+
97
+ # list do
98
+ # # filters [:id, :name] # Array of field names which filters should be shown by default in the table header
99
+ # # items_per_page 100 # Override default_items_per_page
100
+ # # sort_by :id # Sort column (default is primary key)
101
+ # # sort_reverse true # Sort direction (default is true for primary key, last created first)
102
+ # end
103
+ # show do; end
104
+ # edit do; end
105
+ # export do; end
106
+ # # 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)
107
+ # # you can override a cross-section field configuration in any section with the same syntax `configure :field_name do ... end`
108
+ # # using `field` instead of `configure` will exclude all other fields and force the ordering
109
+ # end
110
+
111
+
112
+ ### Estate ###
113
+
114
+ # config.model 'Estate' do
115
+
116
+ # # You can copy this to a 'rails_admin do ... end' block inside your estate.rb model definition
117
+
118
+ # # Found associations:
119
+
120
+ # configure :blocks, :has_many_association
121
+ # configure :units, :has_many_association
122
+
123
+ # # Found columns:
124
+
125
+ # configure :id, :integer
126
+ # configure :name, :string
127
+ # configure :total, :integer
128
+ # configure :created_at, :datetime
129
+ # configure :updated_at, :datetime
130
+
131
+ # # Cross-section configuration:
132
+
133
+ # # object_label_method :name # Name of the method called for pretty printing an *instance* of ModelName
134
+ # # label 'My model' # Name of ModelName (smartly defaults to ActiveRecord's I18n API)
135
+ # # label_plural 'My models' # Same, plural
136
+ # # weight 0 # Navigation priority. Bigger is higher.
137
+ # # parent OtherModel # Set parent model for navigation. MyModel will be nested below. OtherModel will be on first position of the dropdown
138
+ # # navigation_label # Sets dropdown entry's name in navigation. Only for parents!
139
+
140
+ # # Section specific configuration:
141
+
142
+ # list do
143
+ # # filters [:id, :name] # Array of field names which filters should be shown by default in the table header
144
+ # # items_per_page 100 # Override default_items_per_page
145
+ # # sort_by :id # Sort column (default is primary key)
146
+ # # sort_reverse true # Sort direction (default is true for primary key, last created first)
147
+ # end
148
+ # show do; end
149
+ # edit do; end
150
+ # export do; end
151
+ # # 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)
152
+ # # you can override a cross-section field configuration in any section with the same syntax `configure :field_name do ... end`
153
+ # # using `field` instead of `configure` will exclude all other fields and force the ordering
154
+ # end
155
+
156
+
157
+ ### Unit ###
158
+
159
+ # config.model 'Unit' do
160
+
161
+ # # You can copy this to a 'rails_admin do ... end' block inside your unit.rb model definition
162
+
163
+ # # Found associations:
164
+
165
+ # configure :block, :belongs_to_association
166
+
167
+ # # Found columns:
168
+
169
+ # configure :id, :integer
170
+ # configure :no, :string
171
+ # configure :price, :string
172
+ # configure :area, :string
173
+ # configure :flat_type, :string
174
+ # configure :block_id, :integer # Hidden
175
+ # configure :created_at, :datetime
176
+ # configure :updated_at, :datetime
177
+
178
+ # # Cross-section configuration:
179
+
180
+ # # object_label_method :name # Name of the method called for pretty printing an *instance* of ModelName
181
+ # # label 'My model' # Name of ModelName (smartly defaults to ActiveRecord's I18n API)
182
+ # # label_plural 'My models' # Same, plural
183
+ # # weight 0 # Navigation priority. Bigger is higher.
184
+ # # parent OtherModel # Set parent model for navigation. MyModel will be nested below. OtherModel will be on first position of the dropdown
185
+ # # navigation_label # Sets dropdown entry's name in navigation. Only for parents!
186
+
187
+ # # Section specific configuration:
188
+
189
+ # list do
190
+ # # filters [:id, :name] # Array of field names which filters should be shown by default in the table header
191
+ # # items_per_page 100 # Override default_items_per_page
192
+ # # sort_by :id # Sort column (default is primary key)
193
+ # # sort_reverse true # Sort direction (default is true for primary key, last created first)
194
+ # end
195
+ # show do; end
196
+ # edit do; end
197
+ # export do; end
198
+ # # 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)
199
+ # # you can override a cross-section field configuration in any section with the same syntax `configure :field_name do ... end`
200
+ # # using `field` instead of `configure` will exclude all other fields and force the ordering
201
+ # end
202
+
203
+ end
data/config/routes.rb ADDED
@@ -0,0 +1,3 @@
1
+ Rails.application.routes.draw do
2
+ mount RailsAdmin::Engine => '/', :as => 'rails_admin'
3
+ end
@@ -0,0 +1,17 @@
1
+ class CreateBlocks < ActiveRecord::Migration
2
+ def change
3
+ create_table :blocks do |t|
4
+ t.string :no, null: false
5
+ t.string :street, null: false
6
+ t.string :estate, null: false
7
+ t.string :probable_date
8
+ t.string :delivery_date, null: false
9
+ t.string :lease_start, null: false
10
+ t.string :ethnic_quota, null: false
11
+
12
+ t.timestamps
13
+ end
14
+
15
+ add_index :blocks, [:no, :street], unique: true
16
+ end
17
+ end
@@ -0,0 +1,16 @@
1
+ class CreateUnits < ActiveRecord::Migration
2
+ def change
3
+ create_table :units do |t|
4
+ t.string :no, null: false
5
+ t.string :price, null: false
6
+ t.string :area, null: false
7
+ t.string :flat_type, null: false
8
+ t.references :block, index: true, null: false
9
+
10
+ t.timestamps
11
+ end
12
+
13
+ add_index :units, [:no, :block_id], unique: true
14
+ add_index :units, :flat_type
15
+ end
16
+ end
@@ -0,0 +1,12 @@
1
+ class CreateEstates < ActiveRecord::Migration
2
+ def change
3
+ create_table :estates do |t|
4
+ t.string :name, null: false
5
+ t.integer :total, null: false
6
+
7
+ t.timestamps
8
+ end
9
+
10
+ add_index :estates, :name, unique: true
11
+ end
12
+ end
@@ -0,0 +1,5 @@
1
+ class AddEstateIdToBlock < ActiveRecord::Migration
2
+ def change
3
+ add_reference :blocks, :estate, index: true, null: false
4
+ end
5
+ end
@@ -0,0 +1,13 @@
1
+ class UpdateEstateIdForBlocks < ActiveRecord::Migration
2
+ def up
3
+ Estate.all.each do |e|
4
+ Block.where(estate: e.name).each { |r| r.update_attribute(:estate_id, e.id) }
5
+ end
6
+ end
7
+
8
+ def down
9
+ Estate.all.each do |e|
10
+ Block.where(estate_id: e.id).each { |r| r.update_attribute(:estate, e.name) }
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,5 @@
1
+ class RemoveEstateFromBlocks < ActiveRecord::Migration
2
+ def change
3
+ remove_column :blocks, :estate, :string
4
+ end
5
+ end
@@ -0,0 +1,39 @@
1
+ class FixNumericColumns < ActiveRecord::Migration
2
+ def change
3
+ reversible do |dir|
4
+ dir.up do
5
+ rename_column :units, :price, :price_str
6
+ rename_column :units, :area, :area_str
7
+ add_column :units, :price, :integer, null: false
8
+ add_column :units, :area, :integer, null: false
9
+
10
+ Unit.all.each do |u|
11
+ u.update_attributes({
12
+ price: u.price_str.gsub(/\D/,'').to_i,
13
+ area: u.area_str.gsub(/\D/,'').to_i
14
+ }, :without_protection => true)
15
+ end
16
+
17
+ remove_column :units, :price_str, :string
18
+ remove_column :units, :area_str, :string
19
+ end
20
+
21
+ dir.down do
22
+ add_column :units, :price_str, :string, null: false
23
+ add_column :units, :area_str, :string, null: false
24
+
25
+ Unit.all.each do |u|
26
+ u.update_attributes({
27
+ price_str: u.price.to_s,
28
+ area_str: u.area.to_s
29
+ }, :without_protection => true)
30
+ end
31
+
32
+ remove_column :units, :price, :integer
33
+ remove_column :units, :area, :integer
34
+ rename_column :units, :price_str, :price
35
+ rename_column :units, :area_str, :area
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,16 @@
1
+ class CreateQuota < ActiveRecord::Migration
2
+ def change
3
+ create_table :quota do |t|
4
+ t.string :flat_type, null: false
5
+ t.integer :malay, null: false
6
+ t.integer :chinese, null: false
7
+ t.integer :others, null: false
8
+ t.references :block, index: true, null: false
9
+
10
+ t.timestamps
11
+ end
12
+
13
+ add_index :quota, [:flat_type, :block_id], unique: true
14
+ add_reference :units, :quota, index: true, null: false
15
+ end
16
+ end
@@ -0,0 +1,35 @@
1
+ class PopulateQuotaTable < ActiveRecord::Migration
2
+ def up
3
+ quota_fields = ['malay','chinese','others','flat_type','block_id']
4
+
5
+ def parse_quota(quota_str)
6
+ r = quota_str.match /(\d+)\D+(\d+)\D+(\d+)/
7
+ r[1..3].map(&:to_i)
8
+ end
9
+
10
+ # for checking the affected blocks and flat types:
11
+ # r3 = Block.joins(:units).joins(:estate)
12
+ # .select([:flat_type,'blocks.no',:street,:name,'count(distinct flat_type) as total'])
13
+ # .group(['blocks.no',:street,:name])
14
+ # .having('count(distinct flat_type) > 1')
15
+ # .order(['estates.name','units.flat_type','blocks.no',:street])
16
+
17
+ blocks = Block.joins(:units).select('*') #.select('blocks.id',:street,'blocks.no',:flat_type,:ethnic_quota).distinct
18
+ blocks.each do |block|
19
+ next if Quota.where(flat_type: block.flat_type, block_id: block.block_id).first
20
+
21
+ quota_info = parse_quota(block.ethnic_quota) << block.flat_type << block.block_id
22
+ quota_hash = Hash[quota_fields.zip(quota_info)]
23
+
24
+ puts quota_hash
25
+
26
+ quota = Quota.where(quota_hash).first_or_create
27
+ units = Unit.where(block_id: block.block_id, flat_type: block.flat_type)
28
+ units.update_all(['quota_id = ?', quota.id])
29
+ end
30
+ end
31
+
32
+ def down
33
+
34
+ end
35
+ end
@@ -0,0 +1,5 @@
1
+ class RemoveEthnicQuotaFromBlocks < ActiveRecord::Migration
2
+ def change
3
+ remove_column :blocks, :ethnic_quota, :string
4
+ end
5
+ end
data/db/schema.rb ADDED
@@ -0,0 +1,68 @@
1
+ # encoding: UTF-8
2
+ # This file is auto-generated from the current state of the database. Instead
3
+ # of editing this file, please use the migrations feature of Active Record to
4
+ # incrementally modify your database, and then regenerate this schema definition.
5
+ #
6
+ # Note that this schema.rb definition is the authoritative source for your
7
+ # database schema. If you need to create the application database on another
8
+ # system, you should be using db:schema:load, not running all the migrations
9
+ # from scratch. The latter is a flawed and unsustainable approach (the more migrations
10
+ # you'll amass, the slower it'll run and the greater likelihood for issues).
11
+ #
12
+ # It's strongly recommended that you check this file into your version control system.
13
+
14
+ ActiveRecord::Schema.define(version: 20130912181314) do
15
+
16
+ create_table "blocks", force: true do |t|
17
+ t.string "no", null: false
18
+ t.string "street", null: false
19
+ t.string "probable_date"
20
+ t.string "delivery_date", null: false
21
+ t.string "lease_start", null: false
22
+ t.datetime "created_at"
23
+ t.datetime "updated_at"
24
+ t.integer "estate_id", null: false
25
+ end
26
+
27
+ add_index "blocks", ["estate_id"], name: "index_blocks_on_estate_id", using: :btree
28
+ add_index "blocks", ["no", "street"], name: "index_blocks_on_no_and_street", unique: true, using: :btree
29
+
30
+ create_table "estates", force: true do |t|
31
+ t.string "name", null: false
32
+ t.integer "total", null: false
33
+ t.datetime "created_at"
34
+ t.datetime "updated_at"
35
+ end
36
+
37
+ add_index "estates", ["name"], name: "index_estates_on_name", unique: true, using: :btree
38
+
39
+ create_table "quota", force: true do |t|
40
+ t.string "flat_type", null: false
41
+ t.integer "malay", null: false
42
+ t.integer "chinese", null: false
43
+ t.integer "others", null: false
44
+ t.integer "block_id", null: false
45
+ t.datetime "created_at"
46
+ t.datetime "updated_at"
47
+ end
48
+
49
+ add_index "quota", ["block_id"], name: "index_quota_on_block_id", using: :btree
50
+ add_index "quota", ["flat_type", "block_id"], name: "index_quota_on_flat_type_and_block_id", unique: true, using: :btree
51
+
52
+ create_table "units", force: true do |t|
53
+ t.string "no", null: false
54
+ t.string "flat_type", null: false
55
+ t.integer "block_id", null: false
56
+ t.datetime "created_at"
57
+ t.datetime "updated_at"
58
+ t.integer "price", null: false
59
+ t.integer "area", null: false
60
+ t.integer "quota_id", null: false
61
+ end
62
+
63
+ add_index "units", ["block_id"], name: "index_units_on_block_id", using: :btree
64
+ add_index "units", ["flat_type"], name: "index_units_on_flat_type", using: :btree
65
+ add_index "units", ["no", "block_id"], name: "index_units_on_no_and_block_id", unique: true, using: :btree
66
+ add_index "units", ["quota_id"], name: "index_units_on_quota_id", using: :btree
67
+
68
+ end