class TestObjectListView(wtc.WidgetTestCase): """ Setup of all base tests used for all types of ObjectListView's and do test the normal ObjectListView. The other ObjectListView tests just override setUp to create the appropriate ListView. """ def setUp(self): super(TestObjectListView, self).setUp() panel = wx.Panel(self.frame, -1) self.objectListView = ObjectListView(panel, -1, style=wx.LC_REPORT | wx.SUNKEN_BORDER) sizerPanel = wx.BoxSizer(wx.VERTICAL) sizerPanel.Add(self.objectListView, 1, wx.ALL | wx.EXPAND, 4) panel.SetSizer(sizerPanel) sizerFrame = wx.BoxSizer(wx.VERTICAL) sizerFrame.Add(panel, 1, wx.ALL | wx.EXPAND, 4) self.frame.SetSizer(sizerFrame) loadOLV(self.objectListView) def testInitialState(self): self.objectListView.ClearAll() self.assertEqual(self.objectListView.GetColumnCount(), 0) self.assertEqual(self.objectListView.GetItemCount(), 0) self.assertEqual(len(self.objectListView.modelObjects), 0) loadOLV(self.objectListView) def testBasicState(self): self.assertEqual(self.objectListView.GetColumnCount(), len(personColumns)) self.assertEqual(self.objectListView.GetItemCount(), len(persons)) def testSelectObject(self): self.objectListView.SelectObject(persons[0]) self.assertEqual(self.objectListView.GetSelectedObject(), persons[0]) males = [x for x in persons if x.sex == "Male"] self.objectListView.SelectObjects(males) self.assertEqual(set(self.objectListView.GetSelectedObjects()), set(males)) def testSelectAll(self): self.objectListView.SelectAll() for i in range(0, self.objectListView.GetItemCount()): self.assertTrue(self.objectListView.IsSelected(i)) def testDeSelectAll(self): self.objectListView.SelectAll() self.objectListView.DeselectAll() for i in range(0, self.objectListView.GetItemCount()): self.assertFalse(self.objectListView.IsSelected(i)) def testGetSelectedObject(self): self.objectListView.SelectAll() self.assertEqual(self.objectListView.GetSelectedObject(), None) self.objectListView.DeselectAll() self.assertEqual(self.objectListView.GetSelectedObject(), None) self.objectListView.SelectObject(persons[0]) self.assertEqual(self.objectListView.GetSelectedObject(), persons[0]) self.objectListView.SelectObject(persons[1], False) self.assertEqual(self.objectListView.GetSelectedObject(), None) def testGetSelectedObjects(self): self.objectListView.SelectAll() self.assertEqual(set(self.objectListView.GetSelectedObjects()), set(persons)) self.objectListView.SelectObject(persons[0]) self.assertEqual(len(self.objectListView.GetSelectedObjects()), 1) self.objectListView.DeselectAll() self.assertEqual(len(self.objectListView.GetSelectedObjects()), 0) def testRefresh(self): rowIndex = 1 primaryColumn = self.objectListView.GetPrimaryColumnIndex() person = self.objectListView[rowIndex] nameInList = self.objectListView.GetItem(rowIndex, primaryColumn).GetText() self.assertEqual(nameInList, person.name) person.name = "Some different name" self.assertNotEqual(nameInList, person.name) self.objectListView.RefreshObject(person) self.assertEqual( self.objectListView.GetItem(rowIndex, primaryColumn).GetText(), person.name) person.name = nameInList def testSorting(self): self.objectListView.SortBy(0, False) self.assertEqual( self.objectListView.GetItem(0).GetText(), "Zoe Meliko") self.objectListView.SortBy(0, True) self.assertEqual( self.objectListView.GetItem(0).GetText(), "ae cummings") self.objectListView.SortBy(2, False) self.assertEqual( self.objectListView.GetItem(0).GetText(), "Ginger Hawk") self.objectListView.SortBy(2, True) self.assertEqual( self.objectListView.GetItem(0).GetText(), "Ian Janide") def testColumnResizing(self): widths = [ self.objectListView.GetColumnWidth(i) for i in range(len(self.objectListView.columns)) ] self.frame.SetSize(self.frame.GetSize() + (100, 100)) self.objectListView.Layout() # The space filling columns should have increased in width, but the # others should be the same for (colIndex, oldWidth) in enumerate(widths): if self.objectListView.columns[colIndex].isSpaceFilling: self.assertTrue( oldWidth < self.objectListView.GetColumnWidth(colIndex)) else: self.assertEqual(oldWidth, self.objectListView.GetColumnWidth(colIndex)) def testEditing(self): rowIndex = 1 primaryColumnIndex = self.objectListView.GetPrimaryColumnIndex() self.objectListView.cellEditMode = ObjectListView.CELLEDIT_F2ONLY # self.objectListView.SortBy(primaryColumnIndex+1) originalName = self.objectListView[rowIndex].name self.assertEqual( self.objectListView.GetItem(rowIndex, primaryColumnIndex).GetText(), originalName) self.objectListView.DeselectAll() self.objectListView.SetItemState( rowIndex, wx.LIST_STATE_SELECTED | wx.LIST_STATE_FOCUSED, wx.LIST_STATE_SELECTED | wx.LIST_STATE_FOCUSED) # Fake an F2, change the value of the edit, and then fake a Return to # commit the change evt = wx.KeyEvent(wx.EVT_CHAR.evtType[0]) evt.m_keyCode = wx.WXK_F2 self.objectListView._HandleChar(evt) self.objectListView.StartCellEdit(rowIndex, primaryColumnIndex) self.objectListView.cellEditor.SetValue("new name for X") self.objectListView.FinishCellEdit() evt.m_keyCode = wx.WXK_RETURN self.objectListView._HandleChar(evt) self.assertEqual( self.objectListView.GetItem(rowIndex, primaryColumnIndex).GetText(), "new name for X") # Put the original value back evt.m_keyCode = wx.WXK_F2 self.objectListView._HandleChar(evt) self.objectListView.StartCellEdit(rowIndex, primaryColumnIndex) self.objectListView.cellEditor.SetValue(originalName) self.objectListView.FinishCellEdit() evt.m_keyCode = wx.WXK_RETURN self.objectListView._HandleChar(evt) self.assertEqual( self.objectListView.GetItem(rowIndex, primaryColumnIndex).GetText(), originalName) def testLackOfCheckboxes(self): self.objectListView.InstallCheckStateColumn(None) firstObject = self.objectListView[0] self.assertIn(self.objectListView.IsChecked(firstObject), (None, False)) self.assertEqual(self.objectListView.GetCheckedObjects(), list()) self.objectListView.Check(firstObject) self.assertIn(self.objectListView.IsChecked(firstObject), (None, False)) def testCreateCheckStateColumn(self): self.objectListView.InstallCheckStateColumn(None) firstObject = self.objectListView[0] self.assertIn(self.objectListView.IsChecked(firstObject), (False, None)) self.objectListView.CreateCheckStateColumn() self.objectListView.Check(firstObject) self.assertEqual(self.objectListView.IsChecked(firstObject), True) def testAutoCheckboxes(self): col = ColumnDefn("Check") self.objectListView.AddColumnDefn(col) self.assertTrue(col.checkStateGetter is None) self.assertTrue(col.checkStateSetter is None) self.objectListView.InstallCheckStateColumn(col) self.assertTrue(col.checkStateGetter is not None) self.assertTrue(col.checkStateSetter is not None) object = self.objectListView[0] self.assertEqual(self.objectListView.IsChecked(object), False) self.objectListView.Check(object) self.assertEqual(self.objectListView.IsChecked(object), True) def testCheckboxes(self): def myGetter(modelObject): return getattr(modelObject, "isChecked", False) def mySetter(modelObject, newValue): modelObject.isChecked = newValue self.objectListView.SetImageLists() col = ColumnDefn("Check", checkStateGetter=myGetter, checkStateSetter=mySetter) self.objectListView.AddColumnDefn(col) self.assertEqual(self.objectListView.checkStateColumn, col) firstObject = self.objectListView[1] lastObject = self.objectListView[4] self.assertEqual(self.objectListView.IsChecked(firstObject), False) self.assertEqual(self.objectListView.IsChecked(lastObject), False) self.objectListView.Check(firstObject) self.assertEqual(self.objectListView.IsChecked(firstObject), True) self.assertEqual(self.objectListView.IsChecked(lastObject), False) self.objectListView.Check(lastObject) self.assertEqual(self.objectListView.IsChecked(firstObject), True) self.assertEqual(self.objectListView.IsChecked(lastObject), True) if not isinstance(self.objectListView, VirtualObjectListView): self.assertEqual(set(self.objectListView.GetCheckedObjects()), set([firstObject, lastObject])) self.objectListView.Uncheck(firstObject) self.assertEqual(self.objectListView.IsChecked(firstObject), False) self.assertEqual(self.objectListView.IsChecked(lastObject), True) self.objectListView.ToggleCheck(lastObject) self.assertEqual(self.objectListView.IsChecked(firstObject), False) self.assertEqual(self.objectListView.IsChecked(lastObject), False) def testNoAlternateColours(self): # When there is no alternate colors, each row's background colour # should be invalid self.objectListView.useAlternateBackColors = False self.objectListView.RepopulateList() bkgdColours = [ self.getBackgroundColour(i) for i in range(self.objectListView.GetItemCount()) ] self.assertFalse( self.objectListView.oddRowsBackColor in set(bkgdColours)) self.assertFalse( self.objectListView.evenRowsBackColor in set(bkgdColours)) def testAlternateColours(self): self.objectListView.useAlternateBackColors = True self.objectListView.RepopulateList() for i in range(self.objectListView.GetItemCount()): if i & 1: self.assertEqual(self.objectListView.oddRowsBackColor, self.getBackgroundColour(i)) else: self.assertEqual(self.objectListView.evenRowsBackColor, self.getBackgroundColour(i)) def getBackgroundColour(self, i): # There is no consistent way to get the background color of an item (i.e. one that # works on both normal and virtual lists) so we have to split this into a method # so we can change it for a virtual list return self.objectListView.GetItemBackgroundColour(i) def testEmptyListMsg(self): self.objectListView.SetObjects(None) self.assertTrue(self.objectListView.stEmptyListMsg.IsShown()) self.objectListView.SetObjects(persons) self.assertFalse(self.objectListView.stEmptyListMsg.IsShown()) def testFilteringHead(self): self.objectListView.SetFilter(Filter.Head(1)) self.objectListView.SetObjects(persons) self.assertEqual(len(self.objectListView.GetFilteredObjects()), 1) self.assertEqual(self.objectListView.GetFilteredObjects()[0], persons[0]) self.objectListView.SetFilter(None) def testFilteringTail(self): self.objectListView.SetFilter(Filter.Tail(1)) self.objectListView.SetObjects(persons) # The group list will have a group header at row 0 so skip it if isinstance(self.objectListView, GroupListView): firstDataIndex = 1 else: firstDataIndex = 0 self.assertEqual(len(self.objectListView.GetFilteredObjects()), 1) self.assertEqual(self.objectListView.GetFilteredObjects()[0], persons[-1]) self.objectListView.SetFilter(None) def testFilteringPredicate(self): males = [x for x in persons if x.sex == "Male"] self.objectListView.SetFilter( Filter.Predicate(lambda person: person.sex == "Male")) self.objectListView.SetSortColumn(personColumns[-1]) self.objectListView.SetObjects(persons) self.assertEqual(set(self.objectListView.GetFilteredObjects()), set(males)) self.objectListView.SetFilter(None) def testFilteringTextSearch(self): containsF = [ x for x in persons if "f" in x.sex.lower() or "f" in x.name.lower() ] self.objectListView.SetFilter( Filter.TextSearch(self.objectListView, text="f")) self.objectListView.SetObjects(persons) self.assertEqual(set(self.objectListView.GetFilteredObjects()), set(containsF)) self.objectListView.SetFilter(None) def testFilteringChain(self): filterMale = Filter.Predicate(lambda person: person.sex == "Male") filterContainsF = Filter.TextSearch(self.objectListView, text="f") self.objectListView.SetFilter(Filter.Chain(filterMale, filterContainsF)) self.objectListView.SetObjects(persons) self.assertEqual(len(self.objectListView.GetFilteredObjects()), 1) self.assertEqual(self.objectListView.GetFilteredObjects()[0].name, "Eric Fandango") self.objectListView.SetFilter(None)
class SkeletonPanel(wx.Panel): """ Skeleton panel widget """ def __init__(self, parent): super().__init__(parent) self.db_name = "" self.skeleton_results = [] self.session = None self.parent = parent # self.session = controller.connect_to_database() main_sizer = wx.BoxSizer(wx.VERTICAL) search_sizer = wx.BoxSizer(wx.HORIZONTAL) btn_sizer = wx.BoxSizer(wx.HORIZONTAL) font = wx.Font(10, wx.SWISS, wx.NORMAL, wx.NORMAL) # create the search related widgets categories = ["Site", "Location", "Observer", "Skeleton"] search_label = wx.StaticText(self, label=" Filter By:") search_label.SetFont(font) search_sizer.Add(search_label, 0, wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_RIGHT, 5) search_sizer.AddSpacer(5) if platform.system().lower() == 'linux': self.categories = wx.ComboBox(self, value="Skeleton", choices=categories, style=wx.CB_READONLY, size=(150, -1)) else: self.categories = wx.ComboBox(self, value="Skeleton", choices=categories, style=wx.CB_READONLY) search_sizer.Add(self.categories, 0, wx.ALL, 5) search_sizer.AddSpacer(5) if platform.system().lower() == 'linux': self.search_ctrl = wx.SearchCtrl(self, style=wx.TE_PROCESS_ENTER, size=(200, 27)) else: self.search_ctrl = wx.SearchCtrl(self, style=wx.TE_PROCESS_ENTER, size=(200, -1)) # self.search_ctrl.ShowCancelButton(True) self.search_ctrl.SetDescriptiveText('Filter') self.search_ctrl.Bind(wx.EVT_TEXT_ENTER, self.search) search_sizer.Add(self.search_ctrl, 0, wx.ALIGN_CENTER_VERTICAL, 5) search_sizer.AddSpacer(5) self.show_all_btn = wx.Button(self, label="Show All") self.show_all_btn.Bind(wx.EVT_BUTTON, self.on_show_all) search_sizer.Add(self.show_all_btn, 0, wx.ALL, 5) lfont = self.GetFont() lfont.SetPointSize(10) self.skeleton_results_olv = ObjectListView( self, style=wx.LC_REPORT | wx.SUNKEN_BORDER | wx.LC_SINGLE_SEL) self.skeleton_results_olv.Bind(wx.EVT_LIST_ITEM_ACTIVATED, self.onDoubleClick) self.skeleton_results_olv.EnableBellOnNoMatch(on=False) self.skeleton_results_olv.SetFont(lfont) self.skeleton_results_olv.SetEmptyListMsg("No Records Found") self.update_skeleton_results() # create the button row self.add_record_btn = wx.Button(self, label="&Add") self.add_record_btn.Bind(wx.EVT_BUTTON, self.add_record) btn_sizer.Add(self.add_record_btn, 0, wx.ALL, 5) self.edit_record_btn = wx.Button(self, label="&Edit") self.edit_record_btn.Bind(wx.EVT_BUTTON, self.edit_record) btn_sizer.Add(self.edit_record_btn, 0, wx.ALL, 5) self.pre_record_btn = wx.Button(self, label="&Preservation") self.pre_record_btn.Bind(wx.EVT_BUTTON, self.edit_preservation) btn_sizer.Add(self.pre_record_btn, 0, wx.ALL, 5) self.delete_record_btn = wx.Button(self, label="&Delete") self.delete_record_btn.Bind(wx.EVT_BUTTON, self.delete_record) btn_sizer.Add(self.delete_record_btn, 0, wx.ALL, 5) self.report_btn = wx.Button(self, label="&Create a report") self.report_btn.Bind(wx.EVT_BUTTON, self.create_report) btn_sizer.Add(self.report_btn, 0, wx.ALL, 5) self.controls_state(False) main_sizer.Add(search_sizer) main_sizer.Add(self.skeleton_results_olv, 1, wx.ALL | wx.EXPAND, 5) main_sizer.Add(btn_sizer, 0, wx.CENTER) self.SetSizer(main_sizer) def controls_state(self, state): self.add_record_btn.Enable(state) self.edit_record_btn.Enable(state) self.pre_record_btn.Enable(state) self.delete_record_btn.Enable(state) self.report_btn.Enable(state) self.show_all_btn.Enable(state) self.search_ctrl.Enable(state) def on_open_file(self, event): wildcard = "DATABASE files (*.db)|*.db" with wx.FileDialog(self, "Choose a file", wildcard=wildcard, style=wx.FD_OPEN | wx.FD_FILE_MUST_EXIST) as dialog: if dialog.ShowModal() == wx.ID_OK: self.db_name = dialog.GetPath() # zapis w ostatnio używanych plikach self.parent.filehistory.AddFileToHistory(dialog.GetPath()) self.parent.filehistory.Save(self.parent.config) self.parent.config.Flush() if self.session != None: self.skeleton_results_olv.DeleteAllItems() self.parent.SetTitle("{}: ".format(APP_NAME)) self.session.close() self.session = controller.connect_to_database(self.db_name) self.parent.SetTitle("{}: ".format(APP_NAME) + self.db_name) self.controls_state(True) self.show_all_records() def on_create_file(self, event): wildcard = "DATABASE files (*.db)|*.db" with wx.FileDialog(self, "Create a file", wildcard=wildcard, style=wx.FD_SAVE | wx.FD_OVERWRITE_PROMPT) as dialog: if dialog.ShowModal() == wx.ID_OK: self.db_name = dialog.GetPath() # zapis w ostatnio używanych plikach self.parent.filehistory.AddFileToHistory(dialog.GetPath()) self.parent.filehistory.Save(self.parent.config) self.parent.config.Flush() if self.session != None: self.skeleton_results_olv.DeleteAllItems() self.parent.SetTitle("{}: ".format(APP_NAME)) self.session.close() self.session = controller.connect_to_database(self.db_name) self.parent.SetTitle("{}: ".format(APP_NAME) + self.db_name) self.controls_state(True) self.show_all_records() def on_export_file(self, event): """ export db to xlsx """ if self.session == None: dialogs.show_message('No data available for export.', 'Error') return wildcard = "XLSX files (*.xlsx)|*.xlsx" with wx.FileDialog(self, "Export to XLSX", wildcard=wildcard, style=wx.FD_SAVE | wx.FD_OVERWRITE_PROMPT) as dialog: if dialog.ShowModal() == wx.ID_OK: self.xlsx_name = dialog.GetPath() result = controller.export_xlsx(self.session, self.xlsx_name) if result != '': dialogs.show_message(result, 'Error') self.skeleton_results_olv.SetFocus() def add_record(self, event): """ Add a record to the database """ with dialogs.RecordDialog(self.session) as dlg: dlg.CenterOnScreen() dlg.ShowModal() if dlg.result == 1: data = {} data['skeleton_id'] = dlg.skeleton_id data['site'] = dlg.skeleton_dict['site'] data['location'] = dlg.skeleton_dict['location'] data['skeleton'] = dlg.skeleton_dict['skeleton'] data['observer'] = dlg.skeleton_dict['observer'] data['obs_date'] = dlg.skeleton_dict['obs_date'] new_skeleton = olvSkeleton(data) self.skeleton_results_olv.AddObject(new_skeleton) idx = self.skeleton_results_olv.GetIndexOf(new_skeleton) self.skeleton_results_olv.Select(idx) self.skeleton_results_olv.SelectObject(new_skeleton) self.skeleton_results_olv.SetFocus() def edit_skeleton(self): selected_row = self.skeleton_results_olv.GetSelectedObject() active_row = self.skeleton_results_olv.GetIndexOf(selected_row) if selected_row is None: dialogs.show_message('No record selected!', 'Error') return with dialogs.RecordDialog(self.session, selected_row, title='Modify', addRecord=False) as dlg: dlg.CenterOnScreen() dlg.ShowModal() if dlg.result == 1: self.skeleton_results_olv.RefreshObject(selected_row) self.skeleton_results_olv.SetFocus() def edit_record(self, event): """ Edit a record """ self.edit_skeleton() def onDoubleClick(self, event): self.edit_skeleton() def delete_record(self, event): """ Delete a record """ selected_row = self.skeleton_results_olv.GetSelectedObject() row_index = self.skeleton_results_olv.GetIndexOf(selected_row) if selected_row is None: dialogs.show_message('No record selected!', 'Error') return info = 'Delete current record?\n\nSite: {}\nLocation: {}\nSkeleton: {}'.format( selected_row.site, selected_row.location, selected_row.skeleton) if dialogs.ask_message(info, 'Delete record'): controller.delete_record(self.session, selected_row.skeleton_id) self.skeleton_results_olv.RemoveObject(selected_row) if row_index > 0: row_index -= 1 self.skeleton_results_olv.Select(row_index) self.skeleton_results_olv.SetFocus() def edit_preservation(self, event): selected_row = self.skeleton_results_olv.GetSelectedObject() active_row = self.skeleton_results_olv.GetIndexOf(selected_row) if selected_row is None: dialogs.show_message('No record selected!', 'Error') return with dialogs.PreservationDialog(self.session, selected_row) as dlg: dlg.CenterOnScreen() dlg.ShowModal() self.skeleton_results_olv.SetFocus() def show_all_records(self, active_row=0): """ Updates the record list to show all of them """ self.skeleton_results = controller.get_all_records(self.session) self.update_skeleton_results(active_row) def create_report(self, event): """ select report """ dlg = wx.SingleChoiceDialog(self, 'Select report:', 'Create report', [ 'Skull report', 'Skull report - SVG', 'Inventory sheet', 'Full report' ], wx.CHOICEDLG_STYLE) if dlg.ShowModal() == wx.ID_OK: selected = dlg.GetStringSelection() else: selected = '' dlg.Destroy() if selected == '': return if selected == 'Skull report': self.create_report_skull() elif selected == 'Skull report - SVG': self.create_report_skull_svg() else: dialogs.show_message( 'Sorry, report "{}" not ready yet.'.format(selected), 'Error') def create_report_skull(self): """ generating a skeleton report """ filename = "" wildcard = "PDF files (*.pdf)|*.pdf" with wx.FileDialog(self, "Create a report", wildcard=wildcard, style=wx.FD_SAVE | wx.FD_OVERWRITE_PROMPT) as dialog: if dialog.ShowModal() == wx.ID_OK: filename = dialog.GetPath() if filename == "": return my_id = self.skeleton_results_olv.GetSelectedObject().skeleton_id rekord = controller.find_skeleton(self.session, my_id) if rekord == None: dialogs.show_message('No record was found', 'Error') return data = {} data['site'] = rekord.site data['location'] = rekord.location data['skeleton'] = rekord.skeleton data['observer'] = rekord.observer data['obs_date'] = rekord.obs_date # rekord.frontal if rekord.frontal != None else 0 data['frontal'] = rekord.frontal data['sphenoid'] = rekord.sphenoid data['mandible'] = rekord.mandible data['ethmoid'] = rekord.ethmoid data['parietal_l'] = rekord.parietal_l data['parietal_r'] = rekord.parietal_r data['nasal_l'] = rekord.nasal_l data['nasal_r'] = rekord.nasal_r data['palatine_l'] = rekord.palatine_l data['palatine_r'] = rekord.palatine_r data['thyroid'] = rekord.thyroid data['occipital'] = rekord.occipital data['maxilla_l'] = rekord.maxilla_l data['maxilla_r'] = rekord.maxilla_r data['lacrimal_l'] = rekord.lacrimal_l data['lacrimal_r'] = rekord.lacrimal_r data['hyoid'] = rekord.hyoid data['temporal_l'] = rekord.temporal_l data['temporal_r'] = rekord.temporal_r data['zygomatic_l'] = rekord.zygomatic_l data['zygomatic_r'] = rekord.zygomatic_r data['orbit_l'] = rekord.orbit_l data['orbit_r'] = rekord.orbit_r data['calotte'] = rekord.calotte report = SheetExport() result = report.export_sheet(filename, data) if result != '': dialogs.show_message( 'Problems occurred during the creation of the report:\n{}'. format(result), 'Error') self.skeleton_results_olv.SetFocus() def create_report_skull_svg(self): """ generating a skull picture """ filename = "" wildcard = "SVG files (*.svg)|*.svg" with wx.FileDialog(self, "Create a picture", wildcard=wildcard, style=wx.FD_SAVE | wx.FD_OVERWRITE_PROMPT) as dialog: if dialog.ShowModal() == wx.ID_OK: filename = dialog.GetPath() if filename == "": return my_id = self.skeleton_results_olv.GetSelectedObject().skeleton_id rekord = controller.find_skeleton(self.session, my_id) if rekord == None: dialogs.show_message('No record was found', 'Error') return data = {} data['site'] = rekord.site data['location'] = rekord.location data['skeleton'] = rekord.skeleton data['observer'] = rekord.observer data['obs_date'] = rekord.obs_date data['frontal'] = rekord.frontal data['sphenoid'] = rekord.sphenoid data['mandible'] = rekord.mandible data['ethmoid'] = rekord.ethmoid data['parietal_l'] = rekord.parietal_l data['parietal_r'] = rekord.parietal_r data['nasal_l'] = rekord.nasal_l data['nasal_r'] = rekord.nasal_r data['palatine_l'] = rekord.palatine_l data['palatine_r'] = rekord.palatine_r data['thyroid'] = rekord.thyroid data['occipital'] = rekord.occipital data['maxilla_l'] = rekord.maxilla_l data['maxilla_r'] = rekord.maxilla_r data['lacrimal_l'] = rekord.lacrimal_l data['lacrimal_r'] = rekord.lacrimal_r data['hyoid'] = rekord.hyoid data['temporal_l'] = rekord.temporal_l data['temporal_r'] = rekord.temporal_r data['zygomatic_l'] = rekord.zygomatic_l data['zygomatic_r'] = rekord.zygomatic_r data['orbit_l'] = rekord.orbit_l data['orbit_r'] = rekord.orbit_r data['calotte'] = rekord.calotte report = SheetExport() result = report.export_skull_svg(filename, data) if result != '': dialogs.show_message( 'Problems occurred during the creation of the picture:\n{}'. format(result), 'Error') self.skeleton_results_olv.SetFocus() def search(self, event): """ Searches database based on the user's filter choice and keyword """ filter_choice = self.categories.GetValue() keyword = self.search_ctrl.GetValue() self.skeleton_results = controller.search_records( self.session, filter_choice, keyword) self.update_skeleton_results() def on_show_all(self, event): """ Updates the record list to show all the records """ self.show_all_records() def update_skeleton_results(self, active_row=0): """ Updates the ObjectListView's contents """ self.skeleton_results_olv.SetColumns([ ColumnDefn("Site", "left", 350, "site", isSpaceFilling=True, minimumWidth=50), ColumnDefn("Location", "left", 150, "location", isSpaceFilling=True, minimumWidth=50), ColumnDefn("Skeleton", "left", 150, "skeleton", isSpaceFilling=True, minimumWidth=50), ColumnDefn("Observer", "left", 150, "observer", isSpaceFilling=True, minimumWidth=50), ColumnDefn("Observation date", "center", 80, "obs_date", isSpaceFilling=True, minimumWidth=50) ]) self.skeleton_results_olv.SetObjects(self.skeleton_results) if self.skeleton_results_olv.GetItemCount() > 0: self.skeleton_results_olv.Select(active_row) self.skeleton_results_olv.SetFocus()