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 @@
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