def test_sharing(self):
     """
     saving, loading and sharing semantics
     """
     def _menu(cred, private=[], unit=[], public=[], quick=[]):
         opts = reports.ReportMenu(cred, 2, 'line').by_sharing
         self.assertEqual([i.label for i in opts['private']], private)
         self.assertEqual([i.label for i in opts['unit']], unit)
         self.assertEqual([i.label for i in opts['public']], public)
         self.assertEqual([i.label for i in opts['quick']], quick)
     cred_user = testcommon.DummyCredentials()
     cred_unit = testcommon.DummyCredentials(user_id=2)
     cred_other = testcommon.DummyCredentials(user_id=2,unit_id=2)
     params = reports.new_report(2, 'line')
     params.label = 'Test Save'
     # Only visible to us
     params.sharing = 'private'
     params.save(cred_user)
     _menu(cred_user, private=['Test Save'])
     _menu(cred_unit)
     _menu(cred_other)
     # Visible to our unit
     params.sharing = 'unit'
     params.save(cred_user)
     _menu(cred_user, unit=['Test Save'])
     _menu(cred_unit, unit=['Test Save'])
     _menu(cred_other)
     # Visible to all
     params.sharing = 'public'
     params.save(cred_user)
     _menu(cred_user, public=['Test Save'])
     _menu(cred_unit, public=['Test Save'])
     _menu(cred_other, public=['Test Save'])
     # Visible to all & on home page (quick reports)
     reports.reports_cache.load()
     qr = reports.reports_cache.get_synd_unit(2, 1)
     self.assertEqual([r.label for r in qr], [])
     params.sharing = 'quick'
     params.save(cred_user)
     _menu(cred_user, quick=['Test Save'])
     _menu(cred_unit, quick=['Test Save'])
     _menu(cred_other, quick=['Test Save'])
     reports.reports_cache.load()
     qr = reports.reports_cache.get_synd_unit(2, 1)
     self.assertEqual([r.label for r in qr], ['Test Save'])
     # Loading
     loaded_params = reports.load(params.loaded_from_id, cred_user)
     self.failIf(loaded_params.check().have_errors())
     reports.delete(loaded_params.loaded_from_id)
     _menu(cred_user)
     _menu(cred_unit)
     _menu(cred_other)
     # "last" autosave
     params.autosave(cred_user)
     _menu(cred_user, private=['Most recent: Test Save']) 
     _menu(cred_unit)
     _menu(cred_other)
 def test_query(self):
     params = reports.new_report(2)
     params.caseset_filter([1,2,3,9], 'Four cases')
     f_status = params.make_term(op='in', field='case_status', 
                                 values=['confirmed', 'suspected'])
     f_hosp = params.make_term(op='in', field='admission_hospitalised', 
                               form='hospital_admit', values=['True'])
     f_or = params.make_term(op='or')
     params.add_filter(f_or)
     f_or.add_filter(f_status)
     f_or.add_filter(f_hosp)
     query = globals.db.query('cases')
     params.filter_query(query)
     got_query = query.build_expr()[0]
     self.assertEqual(got_query, self.want_query)
Beispiel #3
0
 def test_order(self):
     """
     order by column parameter handling
     """
     params = reports.new_report(2, 'line')
     self.assertEqual(len(params.order_by), 0)
     self.assertEqual(params.query_order(), '')
     params.add_order()
     params.order_by[0].col = 'onset_datetime'
     params.order_by[0].rev = 'desc'
     params.add_order()
     params.order_by[1].col = 'surname'
     self.assertEqual(params.query_order(),
                      'onset_datetime desc,surname asc')
     params.del_order(0)
     self.assertEqual(params.query_order(), 'surname asc')
     self.assertEqual(params.order_cols(), expect_ordercols)
 def test_order(self):
     """
     order by column parameter handling
     """
     params = reports.new_report(2, 'line')
     self.assertEqual(len(params.order_by), 0)
     self.assertEqual(params.query_order(), '')
     params.add_order()
     params.order_by[0].col = 'onset_datetime'
     params.order_by[0].rev = 'desc'
     params.add_order()
     params.order_by[1].col = 'surname'
     self.assertEqual(params.query_order(), 
                      'onset_datetime desc,surname asc')
     params.del_order(0)
     self.assertEqual(params.query_order(), 'surname asc')
     self.assertEqual(params.order_cols(), expect_ordercols)
 def test_adder(self):
     params = reports.new_report(2)
     self.assertEqual(params.filter.children, [])
     # Test adder cancel
     adder = params.filter_adder(params.filter)
     adder.abort()
     self.assertEqual(params.filter.children, [])
     # Test add demog field
     adder = params.filter_adder(params.filter)
     self.assertEqual(adder.groups(), self.want_groups)
     available = [(group.name, group.available_filters())
                  for group in adder if group.has_field]
     self.assertEqual(available, self.want_avail)
     adder.group = 'demog'
     self.failIf(adder.is_complete())
     self.failUnless(adder.has_field())
     self.assertEqual(adder.fields(), self.want_avail[0][1])
     adder.field = 'surname'
     self.failIf(adder.is_complete())
     self.assertEqual(adder.field_ops(), ['pattern', 'phonetic'])
     adder.op = 'pattern'
     self.failUnless(adder.is_complete())
     surname = adder.add()
     self.assertEqual(params.filter.children, [surname])
     # Test add "OR" expr
     adder = params.filter_adder(params.filter)
     adder.group = 'orsubexpr'
     self.failIf(adder.has_field())
     self.failUnless(adder.is_complete())
     orexpr = adder.add()
     self.assertEqual(params.filter.children, [surname, orexpr])
     # Test subexpr add
     adder = params.filter_adder(orexpr)
     adder.group = 'sars_exposure'
     self.failIf(adder.is_complete())
     self.failUnless(adder.has_field())
     self.assertEqual(adder.fields(), self.want_avail[1][1])
     adder.field = 'close_contact'
     self.failUnless(adder.is_complete())
     ccontact = adder.add()
     self.assertEqual(params.filter.children, [surname, orexpr])
     self.assertEqual(orexpr.children, [ccontact])
     # While we are here, test deletion (and implicit trimming)
     params.del_filter(ccontact)
     self.assertEqual(params.filter.children, [surname])
 def test_adder(self):
     params = reports.new_report(2)
     self.assertEqual(params.filter.children, [])
     # Test adder cancel
     adder = params.filter_adder(params.filter)
     adder.abort()
     self.assertEqual(params.filter.children, [])
     # Test add demog field
     adder = params.filter_adder(params.filter)
     self.assertEqual(adder.groups(), self.want_groups)
     available = [(group.name, group.available_filters()) for group in adder
                  if group.has_field]
     self.assertEqual(available, self.want_avail)
     adder.group = 'demog'
     self.failIf(adder.is_complete())
     self.failUnless(adder.has_field())
     self.assertEqual(adder.fields(), self.want_avail[0][1])
     adder.field = 'surname'
     self.failIf(adder.is_complete())
     self.assertEqual(adder.field_ops(), ['pattern', 'phonetic'])
     adder.op = 'pattern'
     self.failUnless(adder.is_complete())
     surname = adder.add()
     self.assertEqual(params.filter.children, [surname])
     # Test add "OR" expr
     adder = params.filter_adder(params.filter)
     adder.group = 'orsubexpr'
     self.failIf(adder.has_field())
     self.failUnless(adder.is_complete())
     orexpr = adder.add()
     self.assertEqual(params.filter.children, [surname, orexpr])
     # Test subexpr add
     adder = params.filter_adder(orexpr)
     adder.group = 'sars_exposure'
     self.failIf(adder.is_complete())
     self.failUnless(adder.has_field())
     self.assertEqual(adder.fields(), self.want_avail[1][1])
     adder.field = 'close_contact'
     self.failUnless(adder.is_complete())
     ccontact = adder.add()
     self.assertEqual(params.filter.children, [surname, orexpr])
     self.assertEqual(orexpr.children, [ccontact])
     # While we are here, test deletion (and implicit trimming)
     params.del_filter(ccontact)
     self.assertEqual(params.filter.children, [surname])
 def test_query(self):
     params = reports.new_report(2)
     params.caseset_filter([1, 2, 3, 9], 'Four cases')
     f_status = params.make_term(op='in',
                                 field='case_status',
                                 values=['confirmed', 'suspected'])
     f_hosp = params.make_term(op='in',
                               field='admission_hospitalised',
                               form='hospital_admit',
                               values=['True'])
     f_or = params.make_term(op='or')
     params.add_filter(f_or)
     f_or.add_filter(f_status)
     f_or.add_filter(f_hosp)
     query = globals.db.query('cases')
     params.filter_query(query)
     got_query = query.build_expr()[0]
     self.assertEqual(got_query, self.want_query)
Beispiel #8
0
 def do_casesets_action(self, ctx, action):
     ctx.locals.casesets_action = None
     args = action.split(':')
     action = args.pop(0)
     if action == 'save':
         ctx.locals.casesets.save(ctx.locals.caseset)
         globals.db.commit()
         ctx.msg('info', 'Caseset saved')
     elif action == 'delete':
         ctx.locals.casesets.delete(ctx.locals.caseset)
         globals.db.commit()
         ctx.msg('info', 'Caseset deleted')
     elif action == 'load':
         if ctx.locals.case and ctx.locals.case.has_changed():
             raise ConfirmSave
         cs = ctx.locals.casesets.load(int(args[0]))
         use_caseset(ctx, cs)
     elif action == 'sort':
         ctx.locals.caseset.sort_by(*args)
     elif action == 'rename':
         ctx.locals.casesets.new_name = ctx.locals.caseset.name
     elif action == 'rename_okay':
         ctx.locals.casesets.rename(ctx.locals.caseset,
                                    ctx.locals.casesets.new_name)
         if ctx.locals.caseset.caseset_id is not None:
             globals.db.commit()
             ctx.msg('info', 'Caseset saved')
         ctx.locals.casesets.new_name = None
     elif action == 'rename_cancel':
         ctx.locals.casesets.new_name = None
     elif action == 'report':
         self.check_unsaved_or_confirmed(ctx)
         syndrome_id = ctx.locals.case.case_row.syndrome_id
         ctx.pop_page('main')
         ctx.push_page('report_menu', syndrome_id)
         reportparams = reports.new_report(syndrome_id)
         reportparams.label = ctx.locals.caseset.name
         reportparams.caseset_filter(ctx.locals.caseset.case_ids,
                                     ctx.locals.caseset.name)
         ctx.push_page('report_edit', reportparams)
 def do_new(self, ctx, ignore):
     if 'EXPORT' in ctx.locals._credentials.rights:
         reportparams = reports.new_report(ctx.locals.report_syndrome_id)
         ctx.push_page('report_edit', reportparams)
    def test_outgroup(self):
        """
        output column parameter handling
        """
        params = reports.new_report(2, 'line')
        # List of available demog fields
        self.assertEqual(len(params.outgroups), 2)
        availcols = [c[0] for c in params.outgroups[0].available_cols()]
        self.assertEqual(availcols, expect_availcols)
        self.assertEqual(len(params.outgroups[0]), 12)
        self.assertEqual(params.outgroups[0].labels(), common.expect_headings)

        # Group movement
        self.assertEqual(params.has_up(0), False)
        self.assertEqual(params.has_dn(0), False)
        self.assertEqual(params.has_up(1), False)
        self.assertEqual(params.has_dn(1), False)
        params.add_caseperson()
        self.assertEqual(len(params.outgroups), 3)
        self.assertEqual(params.has_dn(1), True)
        self.assertEqual(params.has_dn(2), False)
        self.assertEqual(params.has_up(2), True)
        params.colop('gdel', 2)
        # demog fields "float" to the top
        params.add_form('sars_exposure')
        params.add_caseperson()
        self.assertEqual(params.outgroups[2].form_name, None)
        self.assertEqual(params.outgroups[3].form_name, 'sars_exposure')
        params.add_form('hospital_admit')
        params.colop('gdn', 3)
        self.assertEqual(params.outgroups[3].form_name, 'hospital_admit')
        self.assertEqual(params.outgroups[4].form_name, 'sars_exposure')
        # no-op at end of list
        params.colop('gdn', 4)
        self.assertEqual(params.outgroups[3].form_name, 'hospital_admit')
        self.assertEqual(params.outgroups[4].form_name, 'sars_exposure')
        params.colop('gup', 4)
        self.assertEqual(params.outgroups[3].form_name, 'sars_exposure')
        self.assertEqual(params.outgroups[4].form_name, 'hospital_admit')
        # Can't move form above demog
        params.colop('gup', 3)
        self.assertEqual(params.outgroups[3].form_name, 'sars_exposure')
        self.assertEqual(params.outgroups[4].form_name, 'hospital_admit')

        # List of available form fields
        availcols = [c[0] for c in params.outgroups[3].available_cols()]
        self.assertEqual(availcols, available_form_fields)
        # Add "all" form fields
        self.assertEqual(params.outgroups[3].names(), [])
        params.outgroups[3].addcol = '!all'
        params.cols_update()
        self.assertEqual(params.outgroups[3].names(), expect_form_fields)
        # Add "summary" form fields
        params.colop('gdel', 3)
        params.add_form('sars_exposure')
        params.outgroups[4].addcol = '!summary'
        params.cols_update()
        self.assertEqual(params.outgroups[4].names(), expect_form_fields)
        # Add specific form fields
        params.colop('gdel', 4)
        params.add_form('sars_exposure')
        params.outgroups[4].addcol = 'contact_date_last,contact_favourite_food'
        params.cols_update()
        params.outgroups[4].addcol = 'close_contact'
        params.cols_update()
        self.assertEqual(params.outgroups[4].names(), 
            ['contact_date_last', 'contact_favourite_food', 'close_contact'])

        # Field movement
        # Move up or down should have no effect at ends of list
        params.colop('up', 0, 0)
        params.colop('dn', 0, len(params.outgroups[0]) - 1)
        self.assertEqual(params.outgroups[0].labels(), common.expect_headings)
        # Test up/dn/del
        expect = list(common.expect_headings)
        expect[0], expect[1] = expect[1], expect[0]
        params.colop('up', 0, 1)
        self.assertEqual(params.outgroups[0].labels(), expect)
        expect[2], expect[3] = expect[3], expect[2]
        params.colop('dn', 0, 2)
        self.assertEqual(params.outgroups[0].labels(), expect)
        del expect[4]
        params.colop('del', 0, 4)
        self.assertEqual(params.outgroups[0].labels(), expect)
        # Test clear
        params.colop('clear', 0)
        self.assertEqual(len(params.outgroups[0]), 0)
    def test_outgroup(self):
        """
        output column parameter handling
        """
        params = reports.new_report(2, 'line')
        # List of available demog fields
        self.assertEqual(len(params.outgroups), 2)
        availcols = [c[0] for c in params.outgroups[0].available_cols()]
        self.assertEqual(availcols, expect_availcols)
        self.assertEqual(len(params.outgroups[0]), 12)
        self.assertEqual(params.outgroups[0].labels(), common.expect_headings)

        # Group movement
        self.assertEqual(params.has_up(0), False)
        self.assertEqual(params.has_dn(0), False)
        self.assertEqual(params.has_up(1), False)
        self.assertEqual(params.has_dn(1), False)
        params.add_caseperson()
        self.assertEqual(len(params.outgroups), 3)
        self.assertEqual(params.has_dn(1), True)
        self.assertEqual(params.has_dn(2), False)
        self.assertEqual(params.has_up(2), True)
        params.colop('gdel', 2)
        # demog fields "float" to the top
        params.add_form('sars_exposure')
        params.add_caseperson()
        self.assertEqual(params.outgroups[2].form_name, None)
        self.assertEqual(params.outgroups[3].form_name, 'sars_exposure')
        params.add_form('hospital_admit')
        params.colop('gdn', 3)
        self.assertEqual(params.outgroups[3].form_name, 'hospital_admit')
        self.assertEqual(params.outgroups[4].form_name, 'sars_exposure')
        # no-op at end of list
        params.colop('gdn', 4)
        self.assertEqual(params.outgroups[3].form_name, 'hospital_admit')
        self.assertEqual(params.outgroups[4].form_name, 'sars_exposure')
        params.colop('gup', 4)
        self.assertEqual(params.outgroups[3].form_name, 'sars_exposure')
        self.assertEqual(params.outgroups[4].form_name, 'hospital_admit')
        # Can't move form above demog
        params.colop('gup', 3)
        self.assertEqual(params.outgroups[3].form_name, 'sars_exposure')
        self.assertEqual(params.outgroups[4].form_name, 'hospital_admit')

        # List of available form fields
        availcols = [c[0] for c in params.outgroups[3].available_cols()]
        self.assertEqual(availcols, available_form_fields)
        # Add "all" form fields
        self.assertEqual(params.outgroups[3].names(), [])
        params.outgroups[3].addcol = '!all'
        params.cols_update()
        self.assertEqual(params.outgroups[3].names(), expect_form_fields)
        # Add "summary" form fields
        params.colop('gdel', 3)
        params.add_form('sars_exposure')
        params.outgroups[4].addcol = '!summary'
        params.cols_update()
        self.assertEqual(params.outgroups[4].names(), expect_form_fields)
        # Add specific form fields
        params.colop('gdel', 4)
        params.add_form('sars_exposure')
        params.outgroups[4].addcol = 'contact_date_last,contact_favourite_food'
        params.cols_update()
        params.outgroups[4].addcol = 'close_contact'
        params.cols_update()
        self.assertEqual(
            params.outgroups[4].names(),
            ['contact_date_last', 'contact_favourite_food', 'close_contact'])

        # Field movement
        # Move up or down should have no effect at ends of list
        params.colop('up', 0, 0)
        params.colop('dn', 0, len(params.outgroups[0]) - 1)
        self.assertEqual(params.outgroups[0].labels(), common.expect_headings)
        # Test up/dn/del
        expect = list(common.expect_headings)
        expect[0], expect[1] = expect[1], expect[0]
        params.colop('up', 0, 1)
        self.assertEqual(params.outgroups[0].labels(), expect)
        expect[2], expect[3] = expect[3], expect[2]
        params.colop('dn', 0, 2)
        self.assertEqual(params.outgroups[0].labels(), expect)
        del expect[4]
        params.colop('del', 0, 4)
        self.assertEqual(params.outgroups[0].labels(), expect)
        # Test clear
        params.colop('clear', 0)
        self.assertEqual(len(params.outgroups[0]), 0)