Exemplo n.º 1
0
    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)
Exemplo n.º 2
0
 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.")
Exemplo n.º 3
0
 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)
Exemplo n.º 4
0
 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)