예제 #1
0
class TruckListView(wx.Panel):
    """
    This will the first component in our app, displaying the truck inventory and a form to add new ones
    """
    def __init__(self, parent):

        wx.Panel.__init__(self, parent=parent)
        self.dataOlv = Olv(self, wx.ID_ANY, style=wx.LC_REPORT)

        done = wx.Bitmap("data/Checkmark.png", wx.BITMAP_TYPE_ANY)
        progress = wx.Bitmap("data/Progress.png", wx.BITMAP_TYPE_ANY)
        self.done = self.dataOlv.AddImages(wx.Icon(done))
        self.progress = self.dataOlv.AddImages(wx.Icon(progress))

        self.dataOlv.SetColumns([
            ColumnDefn("Buyer",
                       "left",
                       180,
                       "current_buyer",
                       imageGetter=self.image_getter),
            ColumnDefn("VIN", "right", 180, "vin_number"),
            ColumnDefn("Year", "right", 70, "year"),
            ColumnDefn("Make", "right", 70, "make"),
            ColumnDefn("Description", "right", 140, "description"),
            ColumnDefn("Previous Owner", "right", 140, "prev_owner"),
            ColumnDefn("Purchase Cost",
                       "right",
                       140,
                       "purchase_cost",
                       stringConverter=numbers_with_commas)
        ])

        self.dataOlv.rowFormatter = truck_row_formatter

        self.dataOlv.cellEditMode = Olv.CELLEDIT_SINGLECLICK

        sizer = wx.BoxSizer(wx.HORIZONTAL)
        sizer.Add(self.dataOlv, 1, wx.ALL | wx.EXPAND, 5)

        self.SetSizer(sizer)

    def set_trucks(self, truck_list):
        self.dataOlv.SetObjects(truck_list)

    def add_truck(self, truck):
        self.dataOlv.AddObject(truck)

    def get_selected(self):
        return self.dataOlv.GetSelectedObject()

    def image_getter(self, truck):
        if truck.status == Truck.COMPLETED:
            return self.done
        elif truck.status == Truck.RENTED or truck.status == Truck.FINANCED:
            return self.progress
예제 #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()
class BooksDBPanel(wx.Panel):
    """
    A panel for Books database construction.
    """
    def __init__(self, parent):

        self.engine = None
        if not os.path.exists("books.db"):
            self.CreateDB("books.db")
        else:
            self.engine = create_engine("sqlite:///books.db")
        self.session = sqlafuns.getsqlsess(self.engine)

        super().__init__(parent)
        vsizer = VBoxSizer()

        hsizer1 = wx.BoxSizer()
        combolab = wx.StaticText(self, label="Pick a table:")
        self.tablenames = [BookTable.__tablename__, SeriesTable.__tablename__]
        self.tablecombo = wx.Choice(self, choices=self.tablenames)
        self.tablecombo.SetSelection(0)
        self.tablecombo.Bind(wx.EVT_CHOICE, self.OnChoice)
        self.current_table = self.tablecombo.GetStringSelection()
        hsizer1.Add(combolab)
        hsizer1.Add(self.tablecombo)
        vsizer.Add(hsizer1, 0, wx.CENTER)

        self.olvtable = ObjectListView(self, style=wx.LC_REPORT)
        vsizer.Add(self.olvtable, 1, wx.EXPAND)

        hsizer2 = wx.BoxSizer()
        addbtn = wx.Button(self, label="Add a row")
        addbtn.Bind(wx.EVT_BUTTON, self.OnAdd)
        hsizer2.Add(addbtn)
        editbtn = wx.Button(self, label="Edit a row")
        editbtn.Bind(wx.EVT_BUTTON, self.OnEdit)
        hsizer2.Add(editbtn)
        delbtn = wx.Button(self, label="Delete a row")
        delbtn.Bind(wx.EVT_BUTTON, self.OnDelete)
        hsizer2.Add(delbtn)
        vsizer.Add(hsizer2, 0, wx.CENTER)

        self.SetSizer(vsizer)

        self.AddCols("book")

    def CreateDB(self, dbfilename):

        self.engine = create_engine(f"sqlite:///{dbfilename}")
        Base.metadata.create_all(self.engine)

    def AddCols(self, current_table):

        self.olvtable.ClearAll()
        if current_table == "book":
            self.olvtable.SetColumns([
                ColumnDefn("Book Id", "left", 50, "book_id"),
                ColumnDefn("Title", "left", 200, "title"),
                ColumnDefn("Author", "left", 200, "author"),
                ColumnDefn("Copyright Year", 'left', 200, "copyright_year"),
                ColumnDefn("Series", "left", 200, "seriesname")
            ])
        elif current_table == "series":
            self.olvtable.SetColumns([
                ColumnDefn("Series Id", "left", 50, "series_id"),
                ColumnDefn("Series Name", "left", 200, "seriesname"),
                ColumnDefn("Books Total", "left", 200, "bookstotal")
            ])
        self.ShowAll(current_table)

    def ShowAll(self, current_table):

        self.olvtable.DeleteAllItems()
        if current_table == "book":
            result = self.session.query(
                BookTable.book_id, BookTable.title, BookTable.author,
                BookTable.copyright_year,
                SeriesTable.seriesname).join(SeriesTable)
            for row in result:
                rowinstance = OlvBookTable(row.book_id, row.title, row.author,
                                           row.copyright_year, row.seriesname)
                self.olvtable.AddObject(rowinstance)
        elif current_table == "series":
            result = self.session.query(SeriesTable)
            for row in result:
                rowinstance = OlvSeriesTable(row.series_id, row.seriesname,
                                             row.bookstotal)
                self.olvtable.AddObject(rowinstance)

    def OnChoice(self, event):

        self.current_table = self.tablecombo.GetStringSelection()
        self.AddCols(self.current_table)
        event.Skip()

    def OnAdd(self, event):

        if self.current_table == "book":
            AddRowtoBookDBDialog(self).ShowModal()
        elif self.current_table == "series":
            AddRowtoSeriesDBDialog(self).ShowModal()
        self.ShowAll(self.current_table)
        event.Skip()

    def OnEdit(self, event):

        rowobj = self.olvtable.GetSelectedObject()
        if self.current_table == "book":
            EditBookRowDialog(self, rowobj=rowobj).ShowModal()
        elif self.current_table == "series":
            EditSeriesRowDialog(self, rowobj=rowobj).ShowModal()
        self.ShowAll(self.current_table)
        event.Skip()

    def OnDelete(self, event):

        rowobj = self.olvtable.GetSelectedObject()
        if self.current_table == "book":
            target = self.session.query(BookTable).filter_by(
                book_id=rowobj.book_id).one()
            self.session.delete(target)
            self.session.commit()
            self.session.close()
        if self.current_table == "series":
            target = self.session.query(SeriesTable).filter_by(
                book_id=rowobj.book_id).one()
            self.session.delete(target)
            self.session.commit()
            self.session.close()
        self.ShowAll(self.current_table)
        event.Skip()