예제 #1
0
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)
예제 #2
0
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()