terrapop_models 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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
+