terrapop_models 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (490) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.rdoc +3 -0
  4. data/Rakefile +34 -0
  5. data/app/assets/javascripts/terrapop_models/application.js +13 -0
  6. data/app/assets/stylesheets/terrapop_models/application.css +15 -0
  7. data/app/controllers/terrapop_models/application_controller.rb +4 -0
  8. data/app/helpers/terrapop_models/application_helper.rb +4 -0
  9. data/app/models/api_log.rb +2 -0
  10. data/app/models/area_data_raster.rb +126 -0
  11. data/app/models/area_data_raster_variable_mnemonic_lookup.rb +4 -0
  12. data/app/models/area_data_statistic.rb +6 -0
  13. data/app/models/area_data_table.rb +25 -0
  14. data/app/models/area_data_table_group.rb +8 -0
  15. data/app/models/area_data_table_group_membership.rb +7 -0
  16. data/app/models/area_data_value.rb +37 -0
  17. data/app/models/area_data_variable.rb +140 -0
  18. data/app/models/area_data_variable_construction.rb +6 -0
  19. data/app/models/attached_variable_pointer.rb +5 -0
  20. data/app/models/bare_user.rb +7 -0
  21. data/app/models/boundary.rb +6 -0
  22. data/app/models/build_status.rb +2 -0
  23. data/app/models/category.rb +17 -0
  24. data/app/models/codebook.rb +242 -0
  25. data/app/models/common_variable.rb +2 -0
  26. data/app/models/country.rb +45 -0
  27. data/app/models/country_comparability.rb +6 -0
  28. data/app/models/country_level.rb +8 -0
  29. data/app/models/ddi2_codebook.rb +541 -0
  30. data/app/models/error_event.rb +2 -0
  31. data/app/models/extract_data_artifact.rb +4 -0
  32. data/app/models/extract_request.rb +817 -0
  33. data/app/models/extract_request_area_data_raster_variable_mnemonic_lookup.rb +4 -0
  34. data/app/models/extract_request_error_event.rb +4 -0
  35. data/app/models/extract_request_submission.rb +19 -0
  36. data/app/models/extract_status.rb +55 -0
  37. data/app/models/extract_type.rb +2 -0
  38. data/app/models/extract_variable_stub.rb +17 -0
  39. data/app/models/frequency.rb +7 -0
  40. data/app/models/geog_instance.rb +18 -0
  41. data/app/models/geog_unit.rb +5 -0
  42. data/app/models/global_region.rb +6 -0
  43. data/app/models/global_region_type.rb +5 -0
  44. data/app/models/heartbeat.rb +8 -0
  45. data/app/models/heartbeat_pulse.rb +3 -0
  46. data/app/models/insert_html_fragment.rb +3 -0
  47. data/app/models/ipums_academic_status.rb +9 -0
  48. data/app/models/ipums_anticipated_result.rb +9 -0
  49. data/app/models/ipums_department.rb +9 -0
  50. data/app/models/ipums_registration.rb +72 -0
  51. data/app/models/ipums_user.rb +15 -0
  52. data/app/models/label.rb +7 -0
  53. data/app/models/link.rb +21 -0
  54. data/app/models/map.rb +255 -0
  55. data/app/models/map_unit.rb +4 -0
  56. data/app/models/map_unit_raster_dataset.rb +4 -0
  57. data/app/models/markup_transform.rb +240 -0
  58. data/app/models/measurement_type.rb +5 -0
  59. data/app/models/nhgis/agg_data_var.rb +120 -0
  60. data/app/models/nhgis/breakdown_combo.rb +84 -0
  61. data/app/models/nhgis/breakdown_var.rb +8 -0
  62. data/app/models/nhgis/data_file.rb +43 -0
  63. data/app/models/nhgis/data_file_type.rb +17 -0
  64. data/app/models/nhgis/data_group.rb +125 -0
  65. data/app/models/nhgis/data_record_range.rb +22 -0
  66. data/app/models/nhgis/data_table.rb +8 -0
  67. data/app/models/nhgis/dataset.rb +76 -0
  68. data/app/models/nhgis/dataset_group.rb +6 -0
  69. data/app/models/nhgis/geog_level.rb +14 -0
  70. data/app/models/nhgis/geog_level_collection.rb +15 -0
  71. data/app/models/nhgis/geog_level_geog_level_group.rb +10 -0
  72. data/app/models/nhgis/geog_level_group.rb +87 -0
  73. data/app/models/nhgis/geog_name.rb +12 -0
  74. data/app/models/nhgis/geog_unit.rb +11 -0
  75. data/app/models/nhgis/geog_var 2.rb +10 -0
  76. data/app/models/nhgis/geog_var.rb +6 -0
  77. data/app/models/nhgis/geog_var_geog_level.rb +8 -0
  78. data/app/models/nhgis/geotime.rb +21 -0
  79. data/app/models/nhgis/integ_geog_instance.rb +6 -0
  80. data/app/models/nhgis/integ_geog_instance_source_geog_instance.rb +9 -0
  81. data/app/models/nhgis/integ_geog_level.rb +9 -0
  82. data/app/models/nhgis/integ_geog_name.rb +12 -0
  83. data/app/models/nhgis/shape_file.rb +203 -0
  84. data/app/models/nhgis/shape_file_x_dataset.rb +8 -0
  85. data/app/models/nhgis/tabulation_type.rb +8 -0
  86. data/app/models/nhgis/time_instance.rb +6 -0
  87. data/app/models/nhgis/time_instance_integ_geog_level.rb +9 -0
  88. data/app/models/nhgis/time_series.rb +12 -0
  89. data/app/models/nhgis/time_series_component.rb +9 -0
  90. data/app/models/nhgis/time_series_release.rb +6 -0
  91. data/app/models/nhgis/time_series_table.rb +13 -0
  92. data/app/models/nhgis/time_series_table_dataset.rb +9 -0
  93. data/app/models/nhgis/time_series_table_geog_level.rb +9 -0
  94. data/app/models/nhgis/time_series_table_time_instance.rb +9 -0
  95. data/app/models/nhgis/time_series_table_time_series_release.rb +7 -0
  96. data/app/models/nhgis/time_series_table_topic.rb +9 -0
  97. data/app/models/nhgis/time_series_table_x_time_series.rb +9 -0
  98. data/app/models/nhgis_metadata_store.rb +2 -0
  99. data/app/models/raster.rb +5 -0
  100. data/app/models/raster_category.rb +6 -0
  101. data/app/models/raster_category_statistic.rb +7 -0
  102. data/app/models/raster_data_type.rb +6 -0
  103. data/app/models/raster_dataset.rb +130 -0
  104. data/app/models/raster_dataset_group.rb +3 -0
  105. data/app/models/raster_dataset_raster_data_type.rb +4 -0
  106. data/app/models/raster_dataset_raster_dataset_unit.rb +4 -0
  107. data/app/models/raster_dataset_raster_variable.rb +4 -0
  108. data/app/models/raster_dataset_unit.rb +4 -0
  109. data/app/models/raster_group.rb +87 -0
  110. data/app/models/raster_metadata.rb +6 -0
  111. data/app/models/raster_operation.rb +10 -0
  112. data/app/models/raster_raster_variable.rb +2 -0
  113. data/app/models/raster_statistic.rb +6 -0
  114. data/app/models/raster_value.rb +83 -0
  115. data/app/models/raster_variable.rb +440 -0
  116. data/app/models/raster_variable_classification.rb +4 -0
  117. data/app/models/raster_variable_group_membership.rb +4 -0
  118. data/app/models/request_area_data_variable.rb +57 -0
  119. data/app/models/request_geog_unit.rb +6 -0
  120. data/app/models/request_raster_dataset.rb +4 -0
  121. data/app/models/request_raster_variable.rb +147 -0
  122. data/app/models/request_sample.rb +34 -0
  123. data/app/models/request_sample_geog_level.rb +4 -0
  124. data/app/models/request_terrapop_sample.rb +6 -0
  125. data/app/models/request_variable.rb +104 -0
  126. data/app/models/resolution.rb +5 -0
  127. data/app/models/sample.rb +81 -0
  128. data/app/models/sample_design.rb +300 -0
  129. data/app/models/sample_detail_field.rb +7 -0
  130. data/app/models/sample_detail_group.rb +3 -0
  131. data/app/models/sample_detail_value.rb +11 -0
  132. data/app/models/sample_details.rb +90 -0
  133. data/app/models/sample_geog_level.rb +150 -0
  134. data/app/models/sample_level_area_data_variable.rb +13 -0
  135. data/app/models/sample_variable.rb +11 -0
  136. data/app/models/status_definition.rb +2 -0
  137. data/app/models/system_statistic.rb +5 -0
  138. data/app/models/tag.rb +7 -0
  139. data/app/models/terrapop_configuration.rb +75 -0
  140. data/app/models/terrapop_extract_information.rb +64 -0
  141. data/app/models/terrapop_raster_summary_cache.rb +6 -0
  142. data/app/models/terrapop_sample.rb +313 -0
  143. data/app/models/terrapop_setting.rb +11 -0
  144. data/app/models/topic.rb +7 -0
  145. data/app/models/ui_text_snippet.rb +2 -0
  146. data/app/models/universe.rb +5 -0
  147. data/app/models/user.rb +262 -0
  148. data/app/models/user_role.rb +5 -0
  149. data/app/models/variable.rb +127 -0
  150. data/app/models/variable_availability_cach.rb +3 -0
  151. data/app/models/variable_group.rb +14 -0
  152. data/app/models/variable_source.rb +8 -0
  153. data/app/views/layouts/terrapop_models/application.html.erb +14 -0
  154. data/config/routes.rb +2 -0
  155. data/db/migrate/00000000000100_create_countries.rb +15 -0
  156. data/db/migrate/00000000000200_create_universes.rb +11 -0
  157. data/db/migrate/00000000000300_create_geog_units.rb +9 -0
  158. data/db/migrate/00000000000400_create_measurement_types.rb +9 -0
  159. data/db/migrate/00000000000500_create_area_data_table_groups.rb +13 -0
  160. data/db/migrate/00000000000600_create_area_data_tables.rb +14 -0
  161. data/db/migrate/00000000000700_create_area_data_table_group_memberships.rb +12 -0
  162. data/db/migrate/00000000000800_create_tags.rb +9 -0
  163. data/db/migrate/00000000000900_create_topics.rb +9 -0
  164. data/db/migrate/00000000001000_create_variable_groups.rb +18 -0
  165. data/db/migrate/00000000001100_create_samples.rb +32 -0
  166. data/db/migrate/00000000001200_create_terrapop_samples.rb +12 -0
  167. data/db/migrate/00000000001300_create_variables.rb +52 -0
  168. data/db/migrate/00000000001400_create_country_levels.rb +17 -0
  169. data/db/migrate/00000000001450_variable_topics.rb +19 -0
  170. data/db/migrate/00000000001500_create_sample_geog_levels.rb +20 -0
  171. data/db/migrate/00000000002000_create_area_data_variables.rb +19 -0
  172. data/db/migrate/00000000002050_area_data_variable_topics.rb +22 -0
  173. data/db/migrate/00000000002100_create_sample_level_area_data_variables.rb +16 -0
  174. data/db/migrate/00000000002200_create_sample_level_area_variable_constructions.rb +12 -0
  175. data/db/migrate/00000000003000_create_maps.rb +22 -0
  176. data/db/migrate/00000000003100_create_boundaries.rb +14 -0
  177. data/db/migrate/00000000004000_create_geog_instances.rb +20 -0
  178. data/db/migrate/00000000004100_create_area_data_values.rb +18 -0
  179. data/db/migrate/00000000005000_create_sample_variables.rb +21 -0
  180. data/db/migrate/00000000005100_create_categories.rb +20 -0
  181. data/db/migrate/00000000005200_create_frequencies.rb +16 -0
  182. data/db/migrate/00000000005300_create_variable_sources.rb +16 -0
  183. data/db/migrate/00000000006000_create_user_roles.rb +8 -0
  184. data/db/migrate/00000000006100_create_users.rb +43 -0
  185. data/db/migrate/00000000006300_create_samples_tags.rb +15 -0
  186. data/db/migrate/00000000006400_create_terrapop_samples_tags.rb +15 -0
  187. data/db/migrate/00000000007000_create_raster_data_types.rb +9 -0
  188. data/db/migrate/00000000007050_create_resolutions.rb +8 -0
  189. data/db/migrate/00000000007100_create_raster_datasets.rb +26 -0
  190. data/db/migrate/00000000007200_create_raster_groups.rb +20 -0
  191. data/db/migrate/00000000007250_create_raster_groups_tags.rb +19 -0
  192. data/db/migrate/00000000007300_create_raster_variables.rb +28 -0
  193. data/db/migrate/00000000007325_create_raster_variable_group_memberships.rb +12 -0
  194. data/db/migrate/00000000007350_raster_variable_topics.rb +22 -0
  195. data/db/migrate/00000000007400_create_rasters.rb +22 -0
  196. data/db/migrate/00000000007500_create_raster_operations.rb +11 -0
  197. data/db/migrate/00000000010000_create_status_definitions.rb +8 -0
  198. data/db/migrate/00000000010050_create_extract_types.rb +10 -0
  199. data/db/migrate/00000000010100_create_build_statuses.rb +10 -0
  200. data/db/migrate/00000000010200_create_extract_requests.rb +14 -0
  201. data/db/migrate/00000000010300_create_extract_requests_labels_join_table.rb +20 -0
  202. data/db/migrate/00000000010400_create_extract_statuses.rb +13 -0
  203. data/db/migrate/00000000010500_create_request_geog_units.rb +13 -0
  204. data/db/migrate/00000000010600_create_request_terrapop_samples.rb +15 -0
  205. data/db/migrate/00000000011000_create_request_variable.rb +16 -0
  206. data/db/migrate/00000000011100_create_request_area_data_variables.rb +18 -0
  207. data/db/migrate/00000000011200_create_request_raster_variables.rb +20 -0
  208. data/db/migrate/00000000012000_create_raster_summary_functions.rb +130 -0
  209. data/db/migrate/00000000013000_create_terrapop_settings.rb +24 -0
  210. data/db/migrate/20121218190647_create_attached_variable_pointer.rb +18 -0
  211. data/db/migrate/20121218191609_add_attached_variable_pointer_id.rb +9 -0
  212. data/db/migrate/20121218205322_add_wants_attached.rb +9 -0
  213. data/db/migrate/20121219145142_add_attributes_to_terrapop_sample.rb +68 -0
  214. data/db/migrate/20130125155216_add_default_order_index_to_variables.rb +5 -0
  215. data/db/migrate/20130129204515_create_request_samples.rb +14 -0
  216. data/db/migrate/20130129204718_create_request_raster_datasets.rb +13 -0
  217. data/db/migrate/20130205195304_create_error_events.rb +10 -0
  218. data/db/migrate/20130206202006_add_country_index_for_continent.rb +8 -0
  219. data/db/migrate/20130207202628_create_raster_metadata.rb +13 -0
  220. data/db/migrate/20130208192415_add_extents_to_raster_dataset.rb +6 -0
  221. data/db/migrate/20130209182800_create_global_regions.rb +11 -0
  222. data/db/migrate/20130209182858_add_global_region_id_country.rb +13 -0
  223. data/db/migrate/20130211183221_add_type_to_global_regions.rb +5 -0
  224. data/db/migrate/20130212190940_create_global_region_types.rb +8 -0
  225. data/db/migrate/20130212192357_remove_classification_add_global_region_type_id_to_global_region.rb +13 -0
  226. data/db/migrate/20130304181054_add_code_to_boundaries.rb +5 -0
  227. data/db/migrate/20130305223407_add_ipumsi_user_flagto_users.rb +15 -0
  228. data/db/migrate/20130305224906_add_ipumsi_user_date_flagto_users.rb +11 -0
  229. data/db/migrate/20130308214537_create_request_sample_geog_levels.rb +14 -0
  230. data/db/migrate/20130312191726_create_raster_statistics.rb +23 -0
  231. data/db/migrate/20130312192100_create_raster_categories.rb +14 -0
  232. data/db/migrate/20130312192158_create_raster_category_statistics.rb +22 -0
  233. data/db/migrate/20130312203045_create_area_data_statistics.rb +15 -0
  234. data/db/migrate/20130401161222_add_summary_to_raster_variable.rb +11 -0
  235. data/db/migrate/20130402203508_add_global_region_sort_order_column.rb +8 -0
  236. data/db/migrate/20130402211553_add_weighted_to_terrapop_samples.rb +5 -0
  237. data/db/migrate/20130408022218_add_period_to_raster_datasets.rb +5 -0
  238. data/db/migrate/20130409161950_create_area_data_variable_constructions.rb +17 -0
  239. data/db/migrate/20130409162731_add_opcode_to_raster_operations.rb +5 -0
  240. data/db/migrate/20130412141109_update_raster_summary_functions.rb +39 -0
  241. data/db/migrate/20130415174823_create_insert_html_fragments.rb +13 -0
  242. data/db/migrate/20130415185523_create_common_variables.rb +13 -0
  243. data/db/migrate/20130416144840_add_columns_to_request_samples.rb +6 -0
  244. data/db/migrate/20130416150151_add_revision_of_column_to_extract_request.rb +8 -0
  245. data/db/migrate/20130416151200_add_file_type_to_extract_request.rb +5 -0
  246. data/db/migrate/20130416161440_add_column_general_detailed_selection_to_request_variables.rb +5 -0
  247. data/db/migrate/20130416170551_add_wants_case_selection_to_request_variable.rb +5 -0
  248. data/db/migrate/20130613185642_add_indexes_to_tables.rb +7 -0
  249. data/db/migrate/20130614193857_add_more_column_indexes.rb +11 -0
  250. data/db/migrate/20130618141508_create_raster_dataset_raster_data_types.rb +17 -0
  251. data/db/migrate/20130618185528_add_circa_to_raster_dataset.rb +5 -0
  252. data/db/migrate/20130619160555_create_raster_dataset_units.rb +9 -0
  253. data/db/migrate/20130619161934_create_raster_dataset_raster_dataset_units.rb +17 -0
  254. data/db/migrate/20130621184015_add_raster_dataset_process_summary.rb +8 -0
  255. data/db/migrate/20130621203809_add_source_information_column_to_raster_dataset.rb +5 -0
  256. data/db/migrate/20130624144333_add_temporal_extent_description_to_raster_dataset.rb +5 -0
  257. data/db/migrate/20130624154952_add_provider_to_raster_dataset.rb +5 -0
  258. data/db/migrate/20130624175342_add_use_constraints_column_to_raster_dataset.rb +5 -0
  259. data/db/migrate/20130624175632_drop_use_constraints_column_from_raster_dataset.rb +8 -0
  260. data/db/migrate/20130624192654_add_north_south_east_west_columns_to_raster_dataset.rb +8 -0
  261. data/db/migrate/20130625193303_add_sort_operation_identifier_to_raster_group.rb +5 -0
  262. data/db/migrate/20130702190659_add_raster_group_id_to_raster_variable.rb +9 -0
  263. data/db/migrate/20130708184410_create_country_comparabilities.rb +14 -0
  264. data/db/migrate/20130711191704_add_ipumsi_user_id_to_user.rb +8 -0
  265. data/db/migrate/20130712150252_add_data_settings_column_to_user.rb +8 -0
  266. data/db/migrate/20130719183620_add_visible_and_map_to_columns_to_raster_operations.rb +13 -0
  267. data/db/migrate/20130812194537_create_extract_request_submissions.rb +12 -0
  268. data/db/migrate/20130813165221_remove_ipums_user_id_from_user.rb +8 -0
  269. data/db/migrate/20130814161802_add_uuid_field_to_extract_request.rb +6 -0
  270. data/db/migrate/20130816204002_add_country_id_to_terrapop_sample.rb +8 -0
  271. data/db/migrate/20130816204214_add_year_to_terrapop_sample.rb +8 -0
  272. data/db/migrate/20130816205324_add_indexes_to_country.rb +9 -0
  273. data/db/migrate/20130819145802_add_foreign_key_to_terrapop_sample.rb +5 -0
  274. data/db/migrate/20130819155712_add_indexes_to_sample_level_area_data_variable.rb +5 -0
  275. data/db/migrate/20130819163013_add_short_country_name_to_terrapop_sample.rb +8 -0
  276. data/db/migrate/20130820195420_add_is_erf_to_country.rb +7 -0
  277. data/db/migrate/20130821221743_fix_raster_summary_function_num_classes.rb +39 -0
  278. data/db/migrate/20130830192340_add_more_user_registration_columns.rb +51 -0
  279. data/db/migrate/20130904205306_add_raster_variable_sort_order_weight.rb +8 -0
  280. data/db/migrate/20130912145522_add_localized_label_to_country_levels.rb +5 -0
  281. data/db/migrate/20130913194351_create_terrapop_raster_summary_caches.rb +27 -0
  282. data/db/migrate/20130916212710_add_year_range_to_map.rb +11 -0
  283. data/db/migrate/20130917154553_create_sample_designs.rb +14 -0
  284. data/db/migrate/20130924210303_add_raster_only_to_extract_request.rb +5 -0
  285. data/db/migrate/20131001220437_add_mnemonic_and_codebook_description_to_area_data_value.rb +11 -0
  286. data/db/migrate/20131002213443_add_ipums_email_sent_at_column.rb +8 -0
  287. data/db/migrate/20131020154130_remove_index_if_exists.rb +9 -0
  288. data/db/migrate/20131020170642_remove_ui_snippet_table_if_exists.rb +8 -0
  289. data/db/migrate/20131021204227_create_ui_text_snippet.rb +11 -0
  290. data/db/migrate/20131022190227_rename_table_fix_ui_text_snippets.rb +9 -0
  291. data/db/migrate/20131119154817_add_unique_index_on_uuid_on.rb +9 -0
  292. data/db/migrate/20131202161911_add_send_toi_rods_flag_to_extract_request.rb +13 -0
  293. data/db/migrate/20140122150020_add_geographic_levelto_geog_instance.rb +11 -0
  294. data/db/migrate/20140124184809_add_zip_file_location.rb +8 -0
  295. data/db/migrate/20140205205539_add_api_related_fields_to_user.rb +5 -0
  296. data/db/migrate/20140206213258_create_extract_request_error_events.rb +14 -0
  297. data/db/migrate/20140206222630_add_requesting_url_to_extract_request.rb +5 -0
  298. data/db/migrate/20140207153005_create_api_logs.rb +14 -0
  299. data/db/migrate/20140228182300_change_user_institutional_affiliation_to_bool.rb +50 -0
  300. data/db/migrate/20140312143201_add_start_and_end_time_and_total_time_to_extract_request.rb +7 -0
  301. data/db/migrate/20140318212913_remove_add_index_to_area_data_value.rb +12 -0
  302. data/db/migrate/20140319155819_add_long_mnemonic_to_area_data_value.rb +7 -0
  303. data/db/migrate/20140319200718_drop_mnemonic_column_area_data_value.rb +10 -0
  304. data/db/migrate/20140320184210_add_show_in_ui_column_in_raster_variable.rb +8 -0
  305. data/db/migrate/20140328150435_rename_revision_of_column_to_rabl_usable_column_name.rb +8 -0
  306. data/db/migrate/20140331142153_add_revision_of_column.rb +8 -0
  307. data/db/migrate/20140402181324_add_new_raster_summary_functions.rb +191 -0
  308. data/db/migrate/20140403185242_add_raster_variable_area_reference_id.rb +12 -0
  309. data/db/migrate/20140410145305_add_raster_area_column_to_terrapop_raster_summary_cache.rb +6 -0
  310. data/db/migrate/20140414170802_add_new_raster_summarization.rb +85 -0
  311. data/db/migrate/20140421150330_add_second_reference_column_to_raster_variable.rb +9 -0
  312. data/db/migrate/20140506165634_add_deactivated_at_and_deleted_at_to_user.rb +6 -0
  313. data/db/migrate/20140507142843_add_column_to_frequencies.rb +5 -0
  314. data/db/migrate/20140513143055_add_sample_geog_level_id_to_request_models.rb +11 -0
  315. data/db/migrate/20140521160554_create_links.rb +9 -0
  316. data/db/migrate/20140522214508_add_ipumsi_salt_and_ipumsi_crypted_password_to_user.rb +13 -0
  317. data/db/migrate/20140604192953_add_name_to_terrapop_setting.rb +47 -0
  318. data/db/migrate/20140609163907_create_variable_availability_caches.rb +9 -0
  319. data/db/migrate/20140609210447_add_foreign_index_to_variable_availability_cache.rb +8 -0
  320. data/db/migrate/20140609213300_create_area_data_variable_availability_caches.rb +13 -0
  321. data/db/migrate/20140610135849_create_nhgis_metadata_stores.rb +30 -0
  322. data/db/migrate/20140610211138_add_dataset_id_to_nhgis_metadata.rb +5 -0
  323. data/db/migrate/20140611181543_add_replicate_weight_variable_id_to_variables.rb +5 -0
  324. data/db/migrate/20140618200741_add_key_column_toraster_variable_group_memberships.rb +7 -0
  325. data/db/migrate/20140618202053_add_key_column_toraster_variable_group_memberships2.rb +8 -0
  326. data/db/migrate/20140701134952_create_system_statistics.rb +12 -0
  327. data/db/migrate/20140804161242_add_fields_to_terrapop_sample.rb +7 -0
  328. data/db/migrate/20140806173750_add_geometry_column_to_boundaries.rb +5 -0
  329. data/db/migrate/20140821205836_add_git_hash_field_to_extract_request.rb +5 -0
  330. data/db/migrate/20140822140106_create_map_units.rb +9 -0
  331. data/db/migrate/20140822140358_create_map_unit_raster_datasets.rb +17 -0
  332. data/db/migrate/20140822143517_redefine_short_unit_on_map_unit_to_longer_string.rb +5 -0
  333. data/db/migrate/20140825135403_add_finger_print_hash_to_maps.rb +5 -0
  334. data/db/migrate/20140826163359_add_source_field_to_terrapop_sample.rb +8 -0
  335. data/db/migrate/20140827153014_add_microdata_file_size_to_sample.rb +5 -0
  336. data/db/migrate/20140828161647_add_raster_band_index_to_raster_categories.rb +5 -0
  337. data/db/migrate/20140828162650_add_post_gis_raster_output_indicator_to_raster_variable.rb +5 -0
  338. data/db/migrate/20140829150251_create_raster_dataset_raster_variables.rb +17 -0
  339. data/db/migrate/20140902194529_add_raster_band_to_raster_dataset_model.rb +7 -0
  340. data/db/migrate/20140903202609_create_heartbeats.rb +9 -0
  341. data/db/migrate/20140903204113_create_heartbeat_pulse.rb +10 -0
  342. data/db/migrate/20140904164247_create_raster_raster_variables.rb +16 -0
  343. data/db/migrate/20140908193007_add_area_level_rasterization_functions.rb +103 -0
  344. data/db/migrate/20140908194021_create_area_data_rasters.rb +39 -0
  345. data/db/migrate/20140909143933_rename_valid_column_on_area_data_raster.rb +5 -0
  346. data/db/migrate/20140911201639_add_columns_to_area_data_raster.rb +11 -0
  347. data/db/migrate/20140911211923_alter_area_data_raster_indexes.rb +12 -0
  348. data/db/migrate/20140919144305_create_raster_variable_classifications.rb +29 -0
  349. data/db/migrate/20140925140810_add_other_raster_variables_to_raster_variable_classification.rb +9 -0
  350. data/db/migrate/20140925172245_add_grouping_indicator_to_raster_classifications.rb +5 -0
  351. data/db/migrate/20140925175157_add_classification_indicator_to_raster_variable.rb +5 -0
  352. data/db/migrate/20140930142006_remove_boundary_id_from_geog_instance.rb +6 -0
  353. data/db/migrate/20141003164150_add_terrapop_sample_id_to_map_and_geog_instance.rb +11 -0
  354. data/db/migrate/20141029202813_add_nhgis_dat_file_to_sample_geog_level.rb +5 -0
  355. data/db/migrate/20141029204521_add_columns_to_sample_level_area_data_variable.rb +6 -0
  356. data/db/migrate/20141104212652_create_categorical_raster_summarization.rb +39 -0
  357. data/db/migrate/20141105202744_add_margin_file_to_sample_geog_level.rb +5 -0
  358. data/db/migrate/20141105205347_add_margin_field_to_area_data_value.rb +5 -0
  359. data/db/migrate/20141105205607_add_join_fields_to_sample_geog_level.rb +8 -0
  360. data/db/migrate/20141202180411_add_new_categorical_summarization_function.rb +62 -0
  361. data/db/migrate/20141212172044_add_continuous_raster_summarization0.rb +51 -0
  362. data/db/migrate/20141212195611_add_indexes_to_boundaries.rb +10 -0
  363. data/db/migrate/20141212202521_add_indexes_to_frequencies.rb +7 -0
  364. data/db/migrate/20141229150743_add_special_value_to_area_data_value.rb +5 -0
  365. data/db/migrate/20141230153550_add_field_to_global_regions.rb +8 -0
  366. data/db/migrate/20150107142518_add_restriction_indicated_to_sample.rb +5 -0
  367. data/db/migrate/20150114161817_add_raster_to_tiff_function.rb +35 -0
  368. data/db/migrate/20150115204303_add_hide_nhgis_datasets_to_users.rb +11 -0
  369. data/db/migrate/20150126192918_add_new_gli_post_gis_functions.rb +99 -0
  370. data/db/migrate/20150126223419_add_short_label_to_terrapop_samples.rb +11 -0
  371. data/db/migrate/20150127172953_add_another_raster_summarization_function.rb +44 -0
  372. data/db/migrate/20150130163215_new_glc_summarization_function.rb +40 -0
  373. data/db/migrate/20150211221354_create_cache_items.rb +23 -0
  374. data/db/migrate/20150212223011_add_microdata_access_expired_date_to_users.rb +11 -0
  375. data/db/migrate/20150217221940_add_new_band_aware_categorical_to_binary_summarization.rb +177 -0
  376. data/db/migrate/20150302145459_removeuse_postgis_procedure_for_geotiff.rb +5 -0
  377. data/db/migrate/20150313194752_add_color_map_to_tiff_output.rb +34 -0
  378. data/db/migrate/20150313202158_add_color_map_to_jpeg_output.rb +34 -0
  379. data/db/migrate/20150318183314_add_non_color_map_cookie_cutter_functions.rb +65 -0
  380. data/db/migrate/20150324160629_add_categorical_multi_band_summarization.rb +62 -0
  381. data/db/migrate/20150324161827_add_index_to_rasters_raster_variable_id.rb +5 -0
  382. data/db/migrate/20150327203257_add_band_to_terrapop_raster_summary_cache.rb +5 -0
  383. data/db/migrate/20150331142232_add_xml_field_to_map.rb +5 -0
  384. data/db/migrate/20150331153703_add_new_continous_summarization.rb +38 -0
  385. data/db/migrate/20150409153145_categorical_to_binary_as_raster.rb +49 -0
  386. data/db/migrate/20150413204130_generic_categorical_to_binary_raster_output_function.rb +92 -0
  387. data/db/migrate/20150416133743_ratio_area_level_data_to_raster_function.rb +55 -0
  388. data/db/migrate/20150416143838_projection_function_for_single_band_rasters.rb +27 -0
  389. data/db/migrate/20150419203614_add_raster_dataset_to_terrapop_raster_summary_cache.rb +12 -0
  390. data/db/migrate/20150419232521_add_raster_dataset_to_request_raster_variable.rb +9 -0
  391. data/db/migrate/20150427163939_create_single_binary_from_categorical_to_tiff_function.rb +51 -0
  392. data/db/migrate/20150518200435_add_new_binary_cookie_cutter_functions.rb +95 -0
  393. data/db/migrate/20150520195145_revised_glc_binary_summarization_function.rb +64 -0
  394. data/db/migrate/20150526205918_new_categorical_to_binary_summarization.rb +72 -0
  395. data/db/migrate/20150527144243_even_newer_glc_binary_function.rb +79 -0
  396. data/db/migrate/20150527191853_add_even_newer_glc_category_to_binary_function.rb +74 -0
  397. data/db/migrate/20150528141915_yancat_to_bin_summarization_function.rb +66 -0
  398. data/db/migrate/20150529182542_add_indexes_to_geog_instances.rb +9 -0
  399. data/db/migrate/20150601160855_drop_area_data_variable_availability_caches.rb +5 -0
  400. data/db/migrate/20150625150152_add_geog_instance_f_key_on_boundaries.rb +5 -0
  401. data/db/migrate/20150626144305_geog_instance_geog_code_wider.rb +6 -0
  402. data/db/migrate/20150709161201_glc_summarization_version5.rb +79 -0
  403. data/db/migrate/20150713165442_glc_summarization_version6.rb +82 -0
  404. data/db/migrate/20150713185652_tp_jpeg_raster_clip_color_map_v2.rb +34 -0
  405. data/db/migrate/20150716182438_new_rasters_table.rb +18 -0
  406. data/db/migrate/20150716184828_new_stored_procedures_for_new_rasters.rb +70 -0
  407. data/db/migrate/20150721161943_remove_ownership_statement_from_function.rb +69 -0
  408. data/db/migrate/20150727134942_rename_rasters_new_to_new_rasters.rb +19 -0
  409. data/db/migrate/20150727135614_update_table_name_in_make_jpeg2.rb +70 -0
  410. data/db/migrate/20150727143159_jpeg_clip_experiment.rb +36 -0
  411. data/db/migrate/20150727145556_create_new_tiff_raster_clip_with_buffer.rb +34 -0
  412. data/db/migrate/20150727161508_update_table_name_in_make_jpeg2_part_deux.rb +77 -0
  413. data/db/migrate/20150727193403_drop_rasters_new.rb +5 -0
  414. data/db/migrate/20150728184718_make_jpeg2_part_deux.rb +70 -0
  415. data/db/migrate/20150728214344_correct_new_rasters_table_in_new_make_jpeg2_function.rb +79 -0
  416. data/db/migrate/20150729144526_even_more_correct_new_rasters_table_in_new_make_jpeg2_function.rb +78 -0
  417. data/db/migrate/20150729160936_fixingterrapop_reclassify_categorical_raster_to_binary_summariz_v3.rb +68 -0
  418. data/db/migrate/20150730141036_adjust_jpeg_clip_for_categorical.rb +67 -0
  419. data/db/migrate/20150730153216_ststandardize_terrapop_reclassify_categorical_raster_to_binary_summariz_v3.rb +69 -0
  420. data/db/migrate/20150730163446_add_origin_to_extract_requests.rb +5 -0
  421. data/db/migrate/20150731151304_consistent_return_fieldsterrapop_gli_yield_areal_summarization.rb +99 -0
  422. data/db/migrate/20150731192327_add_boundary_only_field_to_terrapop_sample.rb +5 -0
  423. data/db/migrate/20150803213048_add_function_to_detect_boundaries_that_wrap_globe.rb +50 -0
  424. data/db/migrate/20150814154127_add_processing_flag_to_extract_request.rb +5 -0
  425. data/db/migrate/20150814165605_add_colormapped_categorical_to_binary_jpeg_cookie_cutteringizing_function.rb +49 -0
  426. data/db/migrate/20150814183708_around_the_world_wrap_a_raster_function.rb +157 -0
  427. data/db/migrate/20150910194333_add_extract_grouping_field_to_extract_request.rb +5 -0
  428. data/db/migrate/20150915194808_drop_sessions_table.rb +5 -0
  429. data/db/migrate/20150915215426_add_sessions_table.rb +12 -0
  430. data/db/migrate/20151009203606_create_sample_detail_groups.rb +8 -0
  431. data/db/migrate/20151009203855_create_sample_detail_fields.rb +13 -0
  432. data/db/migrate/20151009204052_create_sample_detail_values.rb +12 -0
  433. data/db/migrate/20151016152953_add_indexes_to_area_data_values.rb +7 -0
  434. data/db/migrate/20151023160555_add_data_to_extract_requests.rb +8 -0
  435. data/db/migrate/20151026155953_rename_description_add_title_to_extract_requests.rb +8 -0
  436. data/db/migrate/20151029144017_create_raster_dataset_groups.rb +9 -0
  437. data/db/migrate/20151029144147_add_raster_dataset_group_to_raster_dataset.rb +9 -0
  438. data/db/migrate/20151029182802_add_mnemonic_to_raster_dataset_group.rb +5 -0
  439. data/db/migrate/20151029184642_change_field_type_on_raster_dataset_group.rb +5 -0
  440. data/db/migrate/20151029210539_remove_unnecessary_fields_from_terrapop_sample.rb +60 -0
  441. data/db/migrate/20151102205254_create_data_artifacts.rb +17 -0
  442. data/db/migrate/20151102211601_add_json_field_to_extract_data_artifacts.rb +8 -0
  443. data/db/migrate/20151103152754_add_file_name_field_to_extract_request.rb +5 -0
  444. data/db/migrate/20151106155249_add_submitted_at_to_extract_request.rb +5 -0
  445. data/db/migrate/20151110204826_add_terra_pop_build_number_to_extract_request.rb +12 -0
  446. data/db/migrate/20151119213428_create_area_data_raster_variable_mnemonic_lookups.rb +18 -0
  447. data/db/migrate/20151120140757_create_extract_request_area_data_raster_variable_mnemonic_lookups.rb +16 -0
  448. data/db/migrate/20151130212011_add_new_raster_summarization_v7.rb +90 -0
  449. data/lib/tasks/terrapop_models_tasks.rake +4 -0
  450. data/lib/terrapop_models.rb +4 -0
  451. data/lib/terrapop_models/engine.rb +13 -0
  452. data/lib/terrapop_models/version.rb +3 -0
  453. data/test/dummy/README.rdoc +28 -0
  454. data/test/dummy/Rakefile +6 -0
  455. data/test/dummy/app/assets/javascripts/application.js +13 -0
  456. data/test/dummy/app/assets/stylesheets/application.css +15 -0
  457. data/test/dummy/app/controllers/application_controller.rb +5 -0
  458. data/test/dummy/app/helpers/application_helper.rb +2 -0
  459. data/test/dummy/app/views/layouts/application.html.erb +14 -0
  460. data/test/dummy/bin/bundle +3 -0
  461. data/test/dummy/bin/rails +4 -0
  462. data/test/dummy/bin/rake +4 -0
  463. data/test/dummy/config.ru +4 -0
  464. data/test/dummy/config/application.rb +23 -0
  465. data/test/dummy/config/boot.rb +5 -0
  466. data/test/dummy/config/database.yml +68 -0
  467. data/test/dummy/config/environment.rb +5 -0
  468. data/test/dummy/config/environments/development.rb +37 -0
  469. data/test/dummy/config/environments/production.rb +78 -0
  470. data/test/dummy/config/environments/test.rb +39 -0
  471. data/test/dummy/config/initializers/assets.rb +8 -0
  472. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  473. data/test/dummy/config/initializers/cookies_serializer.rb +3 -0
  474. data/test/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  475. data/test/dummy/config/initializers/inflections.rb +16 -0
  476. data/test/dummy/config/initializers/mime_types.rb +4 -0
  477. data/test/dummy/config/initializers/session_store.rb +3 -0
  478. data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
  479. data/test/dummy/config/locales/en.yml +23 -0
  480. data/test/dummy/config/routes.rb +4 -0
  481. data/test/dummy/config/secrets.yml +22 -0
  482. data/test/dummy/log/development.log +62 -0
  483. data/test/dummy/public/404.html +67 -0
  484. data/test/dummy/public/422.html +67 -0
  485. data/test/dummy/public/500.html +66 -0
  486. data/test/dummy/public/favicon.ico +0 -0
  487. data/test/integration/navigation_test.rb +10 -0
  488. data/test/terrapop_models_test.rb +7 -0
  489. data/test/test_helper.rb +19 -0
  490. metadata +597 -0
@@ -0,0 +1,6 @@
1
+ class AreaDataVariableConstruction < ActiveRecord::Base
2
+
3
+ belongs_to :variable
4
+ belongs_to :area_data_variable
5
+
6
+ end
@@ -0,0 +1,5 @@
1
+ class AttachedVariablePointer < ActiveRecord::Base
2
+
3
+
4
+
5
+ end
@@ -0,0 +1,7 @@
1
+ class BareUser < ActiveRecord::Base
2
+ store_accessor :data
3
+ belongs_to :user_role
4
+
5
+ self.table_name = 'users'
6
+
7
+ end
@@ -0,0 +1,6 @@
1
+ class Boundary < ActiveRecord::Base
2
+
3
+ belongs_to :geog_instance
4
+ belongs_to :map
5
+
6
+ end
@@ -0,0 +1,2 @@
1
+ class BuildStatus < ActiveRecord::Base
2
+ end
@@ -0,0 +1,17 @@
1
+ class Category < ActiveRecord::Base
2
+
3
+ has_many :frequencies
4
+ belongs_to :variable
5
+
6
+
7
+ def general_code
8
+ informational? ? '' : (variable.general_column_width.nil? ? code : code[0, variable.general_column_width])
9
+ end
10
+
11
+
12
+ def formatted_label
13
+ syntax_label || label
14
+ end
15
+
16
+
17
+ end
@@ -0,0 +1,242 @@
1
+ # Provisional codebook generator
2
+ # This might better live in /lib/extract_engine or /app/classes.
3
+ class Codebook
4
+ include ExtractEngine::FileManagement
5
+
6
+ def initialize(request)
7
+ @request = request
8
+ end
9
+
10
+
11
+ def extra_files
12
+ @extra_files || []
13
+ end
14
+
15
+
16
+ def generate_file
17
+ @extra_files = []
18
+ create_directories(request)
19
+ codebook_text = generate
20
+ Rails.logger.debug codebook_text
21
+
22
+ begin
23
+ File.open(codebook_filename, 'w:UTF-8') {|f| f.puts(codebook_text.force_encoding("UTF-8"))}
24
+ rescue Exception => e
25
+ Rails.logger.debug e.backtrace
26
+
27
+ begin
28
+ File.open(codebook_filename, 'w') {|f| f.puts(codebook_text)}
29
+ rescue Exception => ee
30
+ Rails.logger.debug ee.backtrace
31
+ end
32
+ end
33
+
34
+ Rails.logger.debug "Codebook for " + @request.extract_type.to_s
35
+
36
+ if request.samples.count > 0
37
+ # Microdata Citation(s) needed
38
+ end
39
+
40
+ if request.terrapop_samples.count > 0
41
+ # Area-data Citation(s) needed
42
+ end
43
+
44
+ if request.raster_datasets.count > 0
45
+ # raster citation(s) needed
46
+ end
47
+
48
+ if @request.extract_type == ExtractRequest::ExtractTypeConst::RASTER
49
+ Rails.logger.debug "Write raster codebook #{@request.name}"
50
+ xml_metadata_file = @request.location # File.join(@request.location,@request.name)
51
+ write_original_raster_metadata(xml_metadata_file)
52
+ end
53
+
54
+ end
55
+
56
+ def generate_codebook
57
+ @extra_files = []
58
+ create_directories(request)
59
+
60
+ str = File.open(File.join(Rails.root, 'app/views/codebooks/arealevel_with_raster.txt.erb'), 'r:UTF-8'){|f| f.read}
61
+ b = binding
62
+
63
+ File.open(new_codebook_filename, 'w:UTF-8') do |f|
64
+ f.write(ERB.new(str).result(b))
65
+ end
66
+
67
+ end
68
+
69
+ def build
70
+ b = binding
71
+ # create and run templates, filling member data variables
72
+ ERB.new(" <%= PRODUCT[:name] %>
73
+ <%= PRODUCT[:desc] %>
74
+ ".gsub(/^\s+/, ""), 0, "", "@product").result b
75
+ ERB.new(" <%= PRODUCT[:name] %> -- <%= PRODUCT[:cost] %>
76
+ <%= PRODUCT[:desc] %>
77
+ ".gsub(/^\s+/, ""), 0, "", "@price").result b
78
+ end
79
+
80
+ def codebook_filename
81
+ File.join(request.location, request.name + ".txt")
82
+ end
83
+
84
+ def new_codebook_filename
85
+ File.join(request.location, request.name + "_.txt")
86
+ end
87
+
88
+ def generate
89
+ @request.extract_type == ExtractRequest::ExtractTypeConst::RASTER ? generate_raster_codebook : generate_micro_or_area_data_codebook
90
+ end
91
+
92
+
93
+ def generate_raster_codebook
94
+ output = ["Code book generated on #{Time.now.to_s}."]
95
+ output += ["filename\tmnemonic\tvariable name\tsource dataset"]
96
+
97
+ @request.expanded_request_raster_variables.each do |v|
98
+ v.raster_variable.raster_datasets.each{|rd|
99
+ output << "#{v.raster_variable.filename}\t#{v.mnemonic}\t#{v.raster_variable.long_mnemonic}\t#{rd.source}"
100
+ }
101
+ end
102
+
103
+ output << ""
104
+
105
+ @request.expanded_request_raster_variables.each do |v|
106
+ unless v.raster_variable.raster_categories.empty?
107
+ output << "#{v.mnemonic} codes and labels"
108
+ output << ""
109
+ begin
110
+ v.raster_variable.raster_categories.each do |category|
111
+ output << "#{category.code}\t#{category.label}"
112
+ end
113
+ rescue
114
+ $stderr.puts "RasterVariable does not have contain RasterCategories"
115
+ end
116
+
117
+ end
118
+ end
119
+
120
+ output.join("\n")
121
+ end
122
+
123
+
124
+ def write_original_raster_metadata(codebook_name_location)
125
+ @request.expanded_request_raster_variables.each {|v|
126
+ variable_metadata_file = File.join(codebook_name_location, v.mnemonic + ".tiff.xml")
127
+ f = File.open(variable_metadata_file,"w:UTF-8")
128
+ metadata = v.raster_variable.raster_metadata
129
+ metadata ? f.write(v.raster_variable.raster_metadata.original_metadata) : f.write("No metadata available")
130
+ f.close
131
+ @extra_files << variable_metadata_file
132
+ }
133
+ end
134
+
135
+
136
+ def generate_micro_or_area_data_codebook
137
+ output = ["Code book generated on #{Time.now.to_s}."]
138
+ output += [heading]
139
+ output << ""
140
+ output << "Datasets: "
141
+ output << "Name\tDescription\tDensity"
142
+ output << samples_used
143
+ output << ""
144
+
145
+ if request.has_area_data_variables?
146
+ output << "Area-level Variables"
147
+ output << "Mnemonic\tLabel\tMeasurement Type"
148
+ output << area_variables
149
+ end
150
+
151
+ if request.has_raster_variables?
152
+ output << ""
153
+ output << "Raster Variables"
154
+ output << "Mnemonic\tLabel\tOperation\tUnits"
155
+ output << raster_variables
156
+ end
157
+
158
+ if request.has_microdata_variables?
159
+ output << ""
160
+ output << "Microdata Variables"
161
+ output << "Mnemonic\tLabel\tRecord Type\tImplied Decimals"
162
+ output << microdata_variables
163
+ output << ""
164
+ output << variable_categories
165
+ end
166
+
167
+ lines = ""
168
+
169
+ begin
170
+ lines = output.flatten.map { |ele|
171
+ ele.force_encoding("UTF-8")
172
+ }.join("\n")
173
+ rescue Exception => e
174
+ Rails.logger.debug "======================================================\n\n\n"
175
+ output.flatten.each{|line| Rails.logger.debug line.encoding.to_s + " == '" + line + "'"}
176
+ raise e
177
+ end
178
+
179
+ lines
180
+ end
181
+
182
+
183
+
184
+ private
185
+
186
+
187
+ def request
188
+ @request
189
+ end
190
+
191
+
192
+ def samples_used
193
+ request.terrapop_samples.map do |sample|
194
+ sample_line(sample)
195
+ end
196
+ end
197
+
198
+
199
+ def sample_line(terrapop_sample)
200
+ unless terrapop_sample.sample.nil?
201
+ ([] << terrapop_sample.sample.name << terrapop_sample.sample.long_description << terrapop_sample.sample.density.to_s ).join("\t")
202
+ else
203
+ "N/A\tN/A\tN/A"
204
+ end
205
+ end
206
+
207
+
208
+ def area_variables
209
+ request.expanded_request_area_data_variables.map do |v|
210
+ "#{v.mnemonic.to_s}\t#{v.label}\t#{v.measurement_type.label}"
211
+ end
212
+ end
213
+
214
+ def raster_variables
215
+ request.expanded_request_raster_variables.map do |rrv|
216
+ rv = rrv.raster_variable
217
+ "#{rrv.mnemonic}\t#{rv.long_mnemonic}\t#{rrv.operation}\t#{rv.units}"
218
+ end
219
+ end
220
+
221
+
222
+ def microdata_variables
223
+ request.variables.map do |v|
224
+ "#{v.mnemonic}\t#{v.label}\t#{v.record_type}\t#{v.implied_decimal_places}"
225
+ end
226
+ end
227
+
228
+
229
+ def variable_categories
230
+ request.variables.map do |v|
231
+ ["#{v.mnemonic} codes and categories:",
232
+ v.categories.map{|c| "#{c.code}\t#{c.label}"}].flatten
233
+ end.flatten
234
+ end
235
+
236
+
237
+ def heading
238
+ "Extract Type: #{request.extract_type.to_s.gsub("_"," ").upcase}"
239
+ end
240
+
241
+
242
+ end
@@ -0,0 +1,2 @@
1
+ class CommonVariable < ActiveRecord::Base
2
+ end
@@ -0,0 +1,45 @@
1
+ class Country < ActiveRecord::Base
2
+
3
+ has_many :samples
4
+ has_one :sample_design
5
+ has_many :country_levels
6
+ has_many :maps
7
+ has_many :terrapop_samples
8
+ belongs_to :global_region
9
+
10
+
11
+ def country_year_and_highest_geography
12
+ all_country_years_and_ranked_geography(true)
13
+ end
14
+
15
+
16
+ def all_country_years_and_ranked_geography(once = false, scoped = true)
17
+ geog_unit_codes = ['NAT', 'HFLAD', 'HSLAD', 'FLAD', 'SLAD']
18
+ geog_units = GeogUnit.all.map{ |gu| {gu.code => gu} }.reduce Hash.new, :merge
19
+ if scoped
20
+ tps = terrapop_samples.where.not(year: nil).order(year: :desc).to_a
21
+ else
22
+ tps = TerrapopSample.unscoped.load.where(country_id: id).where().not(year: nil).order(year: :desc).to_a
23
+ end
24
+ results = []
25
+ tps.each do |terrapop_sample|
26
+ temp_geog_unit_codes = geog_unit_codes.clone
27
+ year = terrapop_sample.year
28
+ countryyear = short_name.upcase + year.to_s
29
+ until temp_geog_unit_codes.empty?
30
+ geog_unit_code = temp_geog_unit_codes.shift
31
+ geog_unit_code.nil? && next
32
+ map = terrapop_sample.maps.joins("INNER JOIN country_levels cl ON maps.country_level_id = cl.id").where(["cl.geog_unit_id = ?", geog_units[geog_unit_code].id]).first
33
+ map.nil? && next
34
+ sample_geog_level = terrapop_sample.sample_geog_level_for_country_level(map.country_level)
35
+ if !sample_geog_level.nil?
36
+ once && (return {countryyear: countryyear, sample_geog_level: sample_geog_level})
37
+ results << {countryyear: countryyear, sample_geog_level: sample_geog_level}
38
+ end
39
+ end
40
+ end
41
+ results
42
+ end
43
+
44
+
45
+ end
@@ -0,0 +1,6 @@
1
+ class CountryComparability < ActiveRecord::Base
2
+
3
+ belongs_to :country
4
+ belongs_to :variable
5
+
6
+ end
@@ -0,0 +1,8 @@
1
+ class CountryLevel < ActiveRecord::Base
2
+
3
+ belongs_to :geog_unit
4
+ belongs_to :country
5
+ has_many :sample_geog_levels
6
+ has_many :maps
7
+
8
+ end
@@ -0,0 +1,541 @@
1
+ # Renders a DDI 2 codebook for an extract request.
2
+ # In contrast with other codebooks, the DDI 2 codebook should be UTF-8 encoded.
3
+ require 'yaml'
4
+
5
+ class Ddi2Codebook
6
+ include DdiHelper
7
+
8
+ def initialize(extract_request)
9
+ @er = extract_request
10
+
11
+ common_variables = CommonVariable.all
12
+ @exclude_common = common_variables.select { |v| v.record_type != "household" }.map { |cv| cv.variable_name.upcase }
13
+ @include_common = common_variables.select { |v| v.record_type == "household" }.map { |cv| cv.variable_name.upcase }
14
+ end
15
+
16
+ def generate_file
17
+ path = @er.extract_file_path('xml')
18
+
19
+ # Pre-encode the string, ignoring invalid or undefined source characters
20
+ rendered_xml = to_xml.encode("UTF-8", :invalid => :replace, :undef => :replace)
21
+
22
+ #tf = Tempfile.open('terrapop_ddi2codebook', "w:UTF-8")
23
+
24
+ #path = tf.path
25
+
26
+ File.open(path, "w:UTF-8") { |f| f.write(rendered_xml) }
27
+
28
+ #tf.write(rendered_xml)
29
+
30
+ #tf.path
31
+
32
+ path
33
+ end
34
+
35
+ private
36
+
37
+ def doc_id
38
+ @codebook_id ||= "ddi2-#{@er.user.id}_#{data_filename}-#{DNAME}"
39
+ end
40
+
41
+ def doc_subtitle
42
+ TXT['docDscr_subTitl'] + " '#{data_filename}'"
43
+ end
44
+
45
+ def data_filename
46
+ @data_filename ||= File.basename(@er.extract_file_path('dat'))
47
+ end
48
+
49
+ def date
50
+ # we need to keep this around because the XML rendering could begin and
51
+ # end on different days, but we want the codebook to have a consistent date
52
+ @date ||= Date.today
53
+ end
54
+
55
+ def prod_date_eng
56
+ @prod_date_eng ||=
57
+ "#{Date::MONTHNAMES[date.month]} #{date.mday}, #{date.year}"
58
+ end
59
+
60
+ def prod_date_iso
61
+ @prod_date_iso ||= @date.to_s
62
+ end
63
+
64
+ def study_subjects
65
+ @study_subjects ||= @er.request_variables.map do |v|
66
+ v.variable.variable_group.ddi2_subject
67
+ end.uniq
68
+ end
69
+
70
+ # This code is largely duplicated from Codebook.rb which is a bad thing. (Non-D.R.Y.)
71
+ # However, for the moment I'd rather not change codebook.rb, which is working just fine.
72
+ # TODO -- revisit this.
73
+ def describe_case_selection(req_var)
74
+ ranges = []
75
+ req_var.request_case_selections.each do |this_case|
76
+ categories = this_case.categories(req_var)
77
+
78
+ low_cat = categories.first
79
+ high_cat = categories.last
80
+
81
+ if low_cat && high_cat
82
+ if low_cat == high_cat
83
+ if req_var.general?
84
+ ranges << low_cat.general_code + " " + (low_cat.syntax_label ? low_cat.syntax_label : low_cat.label)
85
+ else
86
+ ranges << low_cat.code + " " + low_cat.label
87
+ end
88
+ else
89
+ ranges << low_cat.code + "-" + high_cat.code + " " + low_cat.label + "-" + high_cat.label
90
+ end
91
+ end
92
+ end
93
+
94
+ "Case selection#{(ranges.length > 1) ? 's' : ''}: #{ranges.join(', ')}"
95
+ end
96
+
97
+ def stylesheet_url
98
+ 'ipums-ddi-xslt.xsl'
99
+ end
100
+
101
+ def to_xml
102
+ result = ''
103
+ xml = Builder::XmlMarkup.new :target => result, :indent => 2
104
+
105
+ xml.instruct! # <?xml version="1.0" encoding="UTF-8"?>
106
+ xml.instruct!(:'xml-stylesheet', :type => 'text/xsl', :href => stylesheet_url)
107
+ xml.codeBook TXT['codeBook_attrs'], :ID => doc_id do
108
+ xml.docDscr do
109
+ describe_document(xml)
110
+ end
111
+
112
+ xml.stdyDscr do
113
+ describe_study(xml)
114
+ end
115
+
116
+ xml.fileDscr :ID => TXT['fileDscr_ID'] do
117
+ describe_file(xml)
118
+ end
119
+
120
+ xml.dataDscr do
121
+ @er.request_variables.each do |rv|
122
+ describe_variable(rv, xml) unless exclude_rv?(rv)
123
+ end
124
+ end
125
+ end
126
+ end
127
+
128
+ def exclude_rv?(rv)
129
+ @exclude_common.include?(rv.variable.mnemonic)
130
+ end
131
+
132
+ def describe_document(xml)
133
+ xml.citation do
134
+ xml.titlStmt do
135
+ xml.titl TXT['docDscr_titl']
136
+ xml.subTitl doc_subtitle
137
+ xml.IDNo doc_id
138
+ end
139
+ xml.rspStmt do
140
+ xml.AuthEnty TXT['docDscr_rspStmt'],
141
+ {:affiliation => TXT['docDscr_rspStmt_affil']}
142
+ end
143
+ xml.prodStmt do
144
+ xml.producer TXT['docDscr_producer'],
145
+ {:abbr => TXT['docDscr_producer_abbr'],
146
+ :affiliation => TXT['docDscr_producer_affil'],
147
+ :role => TXT['docDscr_producer_role']}
148
+ xml.prodDate prod_date_eng,
149
+ {:date => prod_date_iso}
150
+ xml.prodPlac TXT['docDscr_prodPlac']
151
+ end
152
+ xml.distStmt do
153
+ xml.contact TXT['docDscr_distStmt'],
154
+ {:affiliation => TXT['docDscr_distStmt_affil'],
155
+ :URI => TXT['docDscr_distStmt_URI']}
156
+ end
157
+ end
158
+ end
159
+
160
+ # Yes, this is duplicative of describe_document for common elements.
161
+ # It's a tradeoff between clarity and D.R.Y.
162
+ def describe_study(xml)
163
+ xml.citation do
164
+ xml.titlStmt do
165
+ xml.titl "User Extract #{data_filename}"
166
+ end
167
+ xml.rspStmt do
168
+ xml.AuthEnty TXT['stdyDscr_rspStmt'],
169
+ {:affiliation => TXT['stdyDscr_rspStmt_affil']}
170
+ end
171
+ xml.prodStmt do
172
+ xml.producer TXT['stdyDscr_producer'],
173
+ {:abbr => TXT['stdyDscr_producer_abbr'],
174
+ :affiliation => TXT['stdyDscr_producer_affil'],
175
+ :role => TXT['stdyDscr_producer_role']}
176
+ xml.prodDate prod_date_eng,
177
+ {:date => prod_date_iso}
178
+ xml.prodPlac TXT['stdyDscr_prodPlac']
179
+ end
180
+ xml.distStmt do
181
+ xml.contact TXT['stdyDscr_distStmt'],
182
+ {:affiliation => TXT['stdyDscr_distStmt_affil'],
183
+ :URI => TXT['stdyDscr_distStmt_URI']}
184
+ end
185
+ xml.verStmt do
186
+ xml.version :date => date
187
+ end
188
+ end
189
+ xml.stdyInfo do
190
+ xml.subject do
191
+ study_subjects.each do |subject|
192
+ xml.topcClas subject, {:vocab => TXT['VOCAB']}
193
+ end
194
+ end
195
+ @er.request_samples.each do |rs|
196
+ describe_summary_data rs, xml
197
+ end
198
+ notes_for_all_samples(xml)
199
+ end
200
+ xml.dataAccs do
201
+ xml.useStmt do
202
+ xml.no_ws! do |out|
203
+ out.confDec :required => TXT['confDec_req'] do
204
+ out.cdata! TXT['confDec']
205
+ end
206
+ end
207
+ xml.contact TXT['dataAccs_use_contact'],
208
+ {:affiliation => TXT['dataAccs_use_contact_affil'],
209
+ :URI => TXT['dataAccs_use_contact_uri']}
210
+ xml.no_ws! do |out|
211
+ out.citReq do
212
+ out.cdata! TXT['dataAccs_use_citReq']
213
+ end
214
+ end
215
+ xml.no_ws! do |out|
216
+ out.conditions do
217
+ out.cdata! TXT['dataAccs_use_conditions']
218
+ end
219
+ end
220
+ xml.disclaimer TXT['dataAccs_use_disclaimer']
221
+ end
222
+ end
223
+
224
+ # Put it in CDATA because it is tainted.
225
+ xml.optional_cdata! :notes, @er.ddi2_title
226
+
227
+ describe_revision_of(xml) if @er.revision_of_id
228
+ end
229
+
230
+ def describe_revision_of(xml)
231
+ revised_er = ExtractRequest.find_by_id(@er.revision_of_id)
232
+ xml.notes "This extract is a revision of the user's previous extract, number #{revised_er.revision_of.to_i}."
233
+ end
234
+
235
+ def describe_file(xml)
236
+ xml.fileTxt do
237
+ xml.fileName data_filename
238
+ xml.fileCont TXT['fileDscr_fileCont']
239
+ xml.fileStrc :type => @er.ddi2_fileStrc_type do
240
+ if @er.hierarchical?
241
+ TXT['hierarchical_groups'].each do |grp|
242
+ xml.recGrp grp['attrs'] do
243
+ xml.labl grp['labl']
244
+ end
245
+ end
246
+ end
247
+ end
248
+ xml.fileType TXT['fileDscr_fileType'], {:charset => TXT['fileDscr_charset']}
249
+ xml.format TXT['fileDscr_format']
250
+ xml.filePlac TXT['fileDscr_filePlac']
251
+ # xml.software '', {:version => ''} TODO-Ben
252
+ end
253
+ end
254
+
255
+ def sdatref(sample)
256
+ sample.nil? ? nil : "sdatref-#{sample.id}"
257
+ end
258
+
259
+ def describe_summary_data(req_sample, xml)
260
+ if sample = req_sample.sample
261
+ xml.sumDscr :ID => sdatref(sample) do
262
+
263
+ xml.timePrd sample.year, {:event => 'single'}
264
+
265
+ if country = sample.country
266
+ xml.nation country.full_name, {:abbr => country.short_name}
267
+ end
268
+ end
269
+ end
270
+ end
271
+
272
+ def notes_for_all_samples(xml)
273
+ @er.request_samples.each do |request_sample|
274
+ xml.optional_cdata! :notes, notes_for_a_sample(request_sample)
275
+ end
276
+ end
277
+
278
+ # TODO-Ben -- this code is largely copied from Codebook.rb, and should be cleaned up.
279
+ def notes_for_a_sample(request_sample)
280
+ sample = request_sample.sample
281
+ out = 'Additional notes on a sample that is part of this study: '
282
+ #if IPUMS::project.has_custom_density
283
+ if sample.long_description.blank?
284
+ out += "#{sample.country.full_name} #{sample.year.to_s}\n"
285
+ else
286
+ out += sample.long_description + '\n'
287
+ end
288
+ if sample.note && !sample.note.empty?
289
+ out += " Note: #{sample.note}\n"
290
+ end
291
+ out += " Density of the full data file: #{request_sample.sample.density}%\n"
292
+ out += " Density of this extract: " +
293
+ (request_sample.custom_percent_density == request_sample.sample.density ?
294
+ request_sample.sample.density.to_s : "%.1f" % request_sample.custom_percent_density) +
295
+ "%"
296
+ #else
297
+
298
+ # display_name = sample.note
299
+
300
+ # out += display_name + '; '
301
+ # out += @er.use_small_samples? ? "small size" : "regular size"
302
+ #end
303
+ out += "\n"
304
+ out
305
+ end
306
+
307
+ def describe_variable(req_var, xml)
308
+ var = req_var.variable
309
+
310
+ attrs = {:ID => req_var.long_mnemonic,
311
+ :files => TXT['fileDscr_ID'],
312
+ :name => @er.mnemonic(req_var),
313
+ :intrvl => var.ddi2_interval}
314
+ attrs[:dcml] = var.implied_decimal_places if var.implied_decimal_places
315
+
316
+ if @er.hierarchical?
317
+ if @include_common.include?(var.mnemonic)
318
+ attrs[:rectype] = 'H P'
319
+ else
320
+ attrs[:rectype] = var.record_type
321
+ end
322
+ end
323
+
324
+ xml.var(attrs) do
325
+ xml.location :StartPos => req_var.start, :width => req_var.width,
326
+ :EndPos => (req_var.start + req_var.width - 1)
327
+ xml.labl req_var.full_label
328
+
329
+ if var.ddi2_has_qstn
330
+ xml.no_ws! do |out|
331
+ out.qstn do
332
+ out.optional_cdata! :qstnLit, var.ddi2_qstn_lit
333
+ out.optional_cdata! :ivuInstr, var.ddi2_ivu_instr
334
+ end
335
+ end
336
+ end
337
+
338
+ xml.optional! :universe, var.ddi2_universe, {:clusion => 'I'}
339
+
340
+ xml.no_ws! do |out|
341
+ out.txt do
342
+ out.cdata! var.ddi2_txt
343
+ end
344
+ end
345
+
346
+ if var.nontabulated
347
+ xml.optional_cdata! :codInstr, var.ddi2_code_instr
348
+ else
349
+ req_var.ddi2_categories(@er).each do |cat|
350
+ xml.catgry do
351
+ xml.catValu cat[:valu]
352
+ xml.labl cat[:labl]
353
+ xml.optional! :txt, cat[:txt]
354
+ if cat[:freq]
355
+ xml.catStat(cat[:freq], {:type => 'freq'})
356
+ end
357
+ end
358
+ end
359
+ end
360
+
361
+ xml.concept var.variable_group.ddi2_subject, {:vocab => TXT['VOCAB']}
362
+ xml.varFormat :schema => 'other', :type => var.ddi2_format_type
363
+
364
+ if req_var.variable.is_dq_flag?
365
+ xml.notes 'This variable functions as a data quality flag.'
366
+ end
367
+ if req_var.wants_case_selection?
368
+ xml.notes describe_case_selection(req_var)
369
+ end
370
+ end
371
+ end
372
+
373
+ def Ddi2Codebook.load_constant_text
374
+ metadata_path = "#{Rails.root}/lib/metadata2"
375
+ common_filepath = "#{metadata_path}/ddi_txt_common.yml"
376
+ specific_filepath = "#{metadata_path}/ddi_txt_terrapop.yml"
377
+ common_text = YAML::load_file common_filepath
378
+ specific_text = YAML::load_file specific_filepath
379
+ common_text.merge(specific_text)
380
+ end
381
+
382
+ DNAME = TerrapopConfiguration['application']['environments'][Rails.env]['ddi']['domain']
383
+ TXT = load_constant_text
384
+ end
385
+
386
+ ########
387
+ ###
388
+ ### FOLLOWING §: MIX-INS to other models to support DDI.
389
+ ###
390
+
391
+ VariableGroup.class_eval do
392
+ def ddi2_subject
393
+ "#{name} Variables -- #{rectype_long}"
394
+ end
395
+ end
396
+
397
+ ExtractRequest.class_eval do
398
+ def ddi2_fileStrc_type
399
+ hierarchical? ? 'hierarchical' : 'rectangular'
400
+ end
401
+
402
+ def ddi2_title
403
+ (title && !title.empty?) ? "User-provided title: #{title}" : nil
404
+ end
405
+
406
+ def ddi2_freq_sample
407
+
408
+ return nil unless user and user.user_role == UserRole.where({:role => :ADMIN}).first and
409
+ title.starts_with?('full_sample') and
410
+ request_samples and (request_samples.length == 1)
411
+ request_samples[0].sample
412
+ end
413
+ end
414
+
415
+ RequestVariable.class_eval do
416
+ def ddi2_categories(extract_request)
417
+ return [] if variable.nontabulated
418
+
419
+ freqs_sample = extract_request.ddi2_freq_sample
420
+ freqs = freqs_sample.present? ? variable.ddi2_get_freqs(freqs_sample) : nil
421
+
422
+ return categories.map do |c|
423
+ if !c.informational?
424
+ cat_code = extract_request.category_code(self, c)
425
+ cat_label = (self.general? && c.general_label) ? c.general_label : c.formatted_label
426
+ if cat_label && (cat_label.length > 255)
427
+ lbl = cat_label[0, 250] + "[...]"
428
+ txt = "Full label: " + cat_label
429
+ else
430
+ lbl = cat_label
431
+ txt = nil
432
+ end
433
+
434
+ result = {:valu => cat_code, :labl => lbl}
435
+ result[:txt] = txt if txt
436
+
437
+ if freqs && !general? && cat_code
438
+ frequency = freqs[cat_code.strip]
439
+ result[:freq] = frequency ? frequency.to_s : nil
440
+ end
441
+ result
442
+ else
443
+ nil # filter out merely informational categories
444
+ end
445
+ end.reject { |c| c.nil? }
446
+ end
447
+ end
448
+
449
+ Variable.class_eval do
450
+ def ddi2_get_freqs(this_sample)
451
+ filepath = "/web/#{IPUMS::project.config[:domain_name]}" \
452
+ "/share/htdocs/frequencies/#{mnemonic}.json"
453
+ is_available = File.file?(filepath)
454
+ if is_available
455
+ freqs = JSON.parse(IO.read(filepath))
456
+ return freqs[this_sample.name] if freqs
457
+ end
458
+ nil
459
+ end
460
+
461
+ def ddi2_format_type
462
+ data_type == "alphabetical" ? "character" : "numeric"
463
+ end
464
+
465
+ def ddi2_code_instr
466
+ if manual_codes_display.nil?
467
+ result = "This is a #{column_width}-digit numeric variable"
468
+ if implied_decimal_places
469
+ result += " with #{implied_decimal_places} implied decimal places"
470
+ end
471
+ else
472
+ result = ddi2_transform_markup(manual_codes_display)
473
+ end
474
+ result
475
+ end
476
+
477
+ def ddi2_transform_markup(s)
478
+ return '' if s.nil?
479
+
480
+ s.gsub!(/\r\n?/, "\n") # CR(LF) -> LF
481
+
482
+ doc = IpumsXmlParsing.build_xml_doc_from_fragment(s)
483
+ doc.search('insert_image').each do |e|
484
+ e.swap "[Image omitted from DDI.]"
485
+ end
486
+ doc.search('insert_html').each do |e|
487
+ e.swap ddi2_insert_html(e[:id])
488
+ end
489
+ doc.search('link').each do |e|
490
+ e.swap(e.inner_html + ' [URL omitted from DDI.]')
491
+ end
492
+ s = doc.to_s
493
+
494
+ s.gsub!(/\n\n\n/, "\n\n") # Tighten up the text
495
+
496
+ s.gsub(/<\/?[^>]*>/, '') # strip tags
497
+ end
498
+
499
+ def ddi2_insert_html(id)
500
+ # dir = IPUMS::project.config[:included_html_dir]
501
+ # path = dir + Link.hash[id]
502
+ #str = File.open(path, "r:#{METADATA_FILE_ENCODING}:UTF-8") { |f| f.read }
503
+ str = InsertHtmlFragment.find_by_name(id)
504
+ if str.nil?
505
+ raise "Problem creating DDI codebook, no insert_html_fragment with name #{id}"
506
+ end
507
+
508
+ return ddi2_transform_markup(str) # transform the inserted HTML
509
+ end
510
+
511
+ def ddi2_universe
512
+ if sample && (sv = SampleVariable.find_by_sample_id_and_variable_id(sample.id, id))
513
+ univ = sv.universe
514
+ return (univ ? univ.universe_statement : nil)
515
+ end
516
+ nil
517
+ end
518
+
519
+ def ddi2_has_qstn
520
+ sample != nil
521
+ end
522
+
523
+ def ddi2_txt
524
+ ddi2_transform_markup(description)
525
+ end
526
+
527
+ def ddi2_interval
528
+ nontabulated? ? 'contin' : 'discrete'
529
+ end
530
+
531
+ def ddi2_qstn_lit
532
+ #ddi2_transform_markup(enumeration_form_text(true))
533
+ ddi2_transform_markup(nil)
534
+ end
535
+
536
+ def ddi2_ivu_instr
537
+ #ddi2_transform_markup(enum_instruct_text(true))
538
+ ddi2_transform_markup(nil)
539
+ end
540
+ end
541
+