def get(self): date_started = datetime.datetime.now() info_list = ExportService.get_table_info(get_date_arg()) # Remove items that are not exportable, or that are identifying info_list = [item for item in info_list if item.exportable] info_list = [item for item in info_list if item.question_type != ExportService.TYPE_IDENTIFYING] # Get a count of the records, and log it. log = DataTransferLog(type="export") total_records_for_export = 0 for item in info_list: total_records_for_export += item.size if item.size > 0: log_detail = DataTransferLogDetail(date_started=date_started, class_name=item.class_name, successful=True, success_count=item.size) log.details.append(log_detail) log.total_records = total_records_for_export; # If we find we aren't exporting anything, don't create a new log, just update the last one. if total_records_for_export == 0: log = db.session.query(DataTransferLog).filter(DataTransferLog.type == 'export')\ .order_by(desc(DataTransferLog.last_updated)).limit(1).first() if log is None: log = DataTransferLog(type="export", total_records=0) log.last_updated = datetime.datetime.now() db.session.add(log) db.session.commit() return self.schema.dump(info_list)
def test_retrieve_records_later_than(self): self.construct_everything() date = datetime.datetime.utcnow() + datetime.timedelta(seconds=1) # One second in the future exports = ExportService.get_table_info() params = "?after=" + date.strftime(ExportService.DATE_FORMAT) for export in exports: rv = self.app.get(export.url + params, follow_redirects=True, content_type="application/json", headers=self.logged_in_headers()) data = json.loads(rv.get_data(as_text=True)) self.assertEqual(0, len(data), msg=export.url + " does not respect 'after' param in get request.")
def test_sensitive_records_returned_can_be_deleted(self): self.construct_all_questionnaires() exports = ExportService.get_table_info() for export in exports: rv = self.app.get(export.url, follow_redirects=True, content_type="application/json", headers=self.logged_in_headers()) data = json.loads(rv.get_data(as_text=True)) for d in data: if export.question_type == ExportService.TYPE_SENSITIVE: del_rv = self.app.delete(d['_links']['self'], headers=self.logged_in_headers()) self.assert_success(del_rv)
def test_all_sensitive_exports_have_links_to_self(self): self.construct_everything() exports = ExportService.get_table_info() for export in exports: if export.question_type != ExportService.TYPE_SENSITIVE: continue rv = self.app.get(export.url, follow_redirects=True, content_type="application/json", headers=self.logged_in_headers()) data = json.loads(rv.get_data(as_text=True)) for d in data: self.assertTrue('_links' in d, msg="%s should have links in json." % export.class_name) self.assertTrue('self' in d['_links']) self.assert_success(self.app.get(d['_links']['self'], headers=self.logged_in_headers()))
def get(self): """ Lists available questionnaires. Used for data export to get meta without specifying flow and relationship. Returns: list[ExportInfoSchema] - A list of dict objects, including the following info for each questionnaire: table_name (str): Snake-case database table name. E.g., "chain_session_questionnaire", class_name (str): Pascal-case class name for Model class. E.g., "ChainSession", display_name (str): Questionnaire title. E.g., "Chain Session Assessment", size (int): Number of questionnaire records in the database, url (str): Export endpoint. E.g., "/api/export/chain_session_questionnaire", question_type (str): 'sensitive' | 'identifying' | 'unrestricted' | 'sub-table' sub_tables (list[ExportInfoSchema]): A list of sub-tables within this table, if applicable. """ info_list = ExportService.get_table_info() info_list = [item for item in info_list if item.question_type] info_list = sorted(info_list, key=lambda item: item.table_name) return ExportInfoSchema(many=True).dump(info_list)
def get(self): info_list = ExportService.get_table_info() info_list = [item for item in info_list if item.question_type] info_list = sorted(info_list, key=lambda item: item.table_name) return ExportInfoSchema(many=True).dump(info_list)