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)
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_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)
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)