def set_format(self, column): str_format = Qt.ISODate if self.have_date and self.have_time: self.setDisplayFormat("yyyy-MM-dd hh:mm:ss") c_format = "%Y-%m-%d %H:%M:%S" min_datetime, max_datetime = self.find_range(column, c_format) self.min_datetime = QDateTime.fromString(min_datetime, str_format) self.max_datetime = QDateTime.fromString(max_datetime, str_format) self.setCalendarPopup(True) self.calendarWidget = gui.CalendarWidgetWithTime( self, time=self.min_datetime.time()) self.calendarWidget.timeedit.timeChanged.connect(self.set_datetime) self.setCalendarWidget(self.calendarWidget) self.setDateTimeRange(self.min_datetime, self.max_datetime) elif self.have_date and not self.have_time: self.setDisplayFormat("yyyy-MM-dd") self.setCalendarPopup(True) min_datetime, max_datetime = self.find_range(column, "%Y-%m-%d") self.min_datetime = QDate.fromString(min_datetime, str_format) self.max_datetime = QDate.fromString(max_datetime, str_format) self.setDateRange(self.min_datetime, self.max_datetime) elif not self.have_date and self.have_time: self.setDisplayFormat("hh:mm:ss") min_datetime, max_datetime = self.find_range(column, "%H:%M:%S") self.min_datetime = QTime.fromString(min_datetime, str_format) self.max_datetime = QTime.fromString(max_datetime, str_format) self.setTimeRange(self.min_datetime, self.max_datetime)
def test_no_date_no_time(self): callback = Mock() editor = TimeVariableEditor(self.parent, TimeVariable("var"), callback) self.assertEqual(editor.value, 0) self.assertEqual(self.editor._edit.dateTime(), QDateTime(QDate(1970, 1, 1), QTime(0, 0, 0))) self.callback.assert_not_called() datetime = QDateTime(QDate(2001, 9, 9), QTime(1, 2, 3)) editor._edit.setDateTime(datetime) self.assertEqual(editor._edit.dateTime(), datetime) self.assertEqual(editor.value, 999993600 + 3723) callback.assert_called_once()
def __init__(self): box = gui.widgetBox(self.controlArea, 'Yahoo Finance Stock Data', orientation='horizontal') lbox = gui.widgetBox(box, orientation='vertical') hbox = gui.widgetBox(lbox, orientation='horizontal') gui.label(hbox, self, 'Ticker:') self.combo = combo = QComboBox(editable=True, insertPolicy=QComboBox.InsertAtTop) combo.addItems(self.symbols) hbox.layout().addWidget(combo) # combo = gui.comboBox( # lbox, self, 'symbol',#, items=self.symbols, # label='Ticker:', orientation='horizontal', # editable=True, maximumContentsLength=-1) gui.rubber(combo.parentWidget()) minDate = QDate.fromString(self.MIN_DATE.strftime(self.PY_DATE_FORMAT), self.QT_DATE_FORMAT) date_from = QDateEdit(QDate.fromString(self.date_from, self.QT_DATE_FORMAT), displayFormat=self.QT_DATE_FORMAT, minimumDate=minDate, calendarPopup=True) date_to = QDateEdit(QDate.fromString(self.date_to, self.QT_DATE_FORMAT), displayFormat=self.QT_DATE_FORMAT, minimumDate=minDate, calendarPopup=True) date_from.dateChanged.connect(lambda date: setattr( self, 'date_from', date.toString(self.QT_DATE_FORMAT))) date_to.dateChanged.connect(lambda date: setattr( self, 'date_to', date.toString(self.QT_DATE_FORMAT))) hbox = gui.hBox(lbox) gui.label(hbox, self, "From:") hbox.layout().addWidget(date_from) hbox = gui.hBox(lbox) gui.label(hbox, self, "To:") hbox.layout().addWidget(date_to) gui.radioButtons(box, self, 'data_granularity', btnLabels=[ i.name.capitalize().replace('_', ' ') for i in DataGranularity ], box='Resolution') self.button = gui.button(self.controlArea, self, 'Download', callback=self.download)
def test_edit(self): """ Edit datetimeedit by user. """ datetime = QDateTime(QDate(2001, 9, 9)) self.editor._edit.setDateTime(datetime) self.assertEqual(self.editor.value, 999993600) self.assertEqual(self.editor._edit.dateTime(), datetime) self.callback.assert_called_once()
def test_set_value(self): """ Programmatically set datetimeedit value. """ value = 999993600 self.editor.value = value self.assertEqual(self.editor._edit.dateTime(), QDateTime(QDate(2001, 9, 9))) self.assertEqual(self.editor.value, value) self.callback.assert_called_once()
def __init__(self): box = gui.widgetBox(self.controlArea, 'Yahoo Finance Stock Data', orientation='horizontal') lbox = gui.widgetBox(box, orientation='vertical') hbox = gui.widgetBox(lbox, orientation='horizontal') gui.label(hbox, self, 'Ticker:') self.combo = combo = QComboBox(editable=True, insertPolicy=QComboBox.InsertAtTop) combo.addItems(self.symbols) hbox.layout().addWidget(combo) # combo = gui.comboBox( # lbox, self, 'symbol',#, items=self.symbols, # label='Ticker:', orientation='horizontal', # editable=True, maximumContentsLength=-1) gui.rubber(combo.parentWidget()) minDate = QDate.fromString(self.MIN_DATE.strftime(self.PY_DATE_FORMAT), self.QT_DATE_FORMAT) date_from = QDateEdit( QDate.fromString(self.date_from, self.QT_DATE_FORMAT), displayFormat=self.QT_DATE_FORMAT, minimumDate=minDate, calendarPopup=True) date_to = QDateEdit( QDate.fromString(self.date_to, self.QT_DATE_FORMAT), displayFormat=self.QT_DATE_FORMAT, minimumDate=minDate, calendarPopup=True) date_from.dateChanged.connect( lambda date: setattr(self, 'date_from', date.toString(self.QT_DATE_FORMAT))) date_to.dateChanged.connect( lambda date: setattr(self, 'date_to', date.toString(self.QT_DATE_FORMAT))) hbox = gui.hBox(lbox) gui.label(hbox, self, "From:") hbox.layout().addWidget(date_from) hbox = gui.hBox(lbox) gui.label(hbox, self, "To:") hbox.layout().addWidget(date_to) self.button = gui.button(self.controlArea, self, 'Download', callback=self.download)
def test_have_time(self): callback = Mock() editor = TimeVariableEditor(self.parent, TimeVariable("var", have_time=1), callback) self.assertEqual(editor.value, 0) self.assertEqual(self.editor._edit.dateTime(), _datetime(1970, 1, 1)) self.callback.assert_not_called() datetime = QDateTime(QDate(1900, 1, 1), QTime(1, 2, 3)) editor._edit.setDateTime(datetime) self.assertEqual(editor._edit.dateTime(), datetime) self.assertEqual(editor.value, 3723) callback.assert_called_once()
def test_set_datetime(self): c = gui.DateTimeEditWCalendarTime(None) # default time (now) c.set_datetime() self.assertLessEqual( abs(c.dateTime().toSecsSinceEpoch() - time.time()), 2) # some date poeh = QDateTime(QDate(1961, 4, 12), QTime(6, 7)) c.set_datetime(poeh) self.assertEqual(c.dateTime(), poeh) # set a different time ali = QTime(8, 5) c.set_datetime(ali) poeh.setTime(ali) self.assertEqual(c.dateTime(), poeh)
def test_calendar_dates(self): data = Table(test_filename("datasets/cyber-security-breaches.tab")) self.send_signal(self.widget.Inputs.data, data) simulate.combobox_activate_item(self.widget.cond_list.cellWidget(0, 0), "Date_Posted_or_Updated", delay=0) value_combo = self.widget.cond_list.cellWidget(0, 2).children()[1] self.assertIsInstance(value_combo, DateTimeWidget) # first displayed date is min date self.assertEqual(value_combo.date(), QDate(2014, 1, 23)) self.assertEqual(len(self.get_output("Matching Data")), 691) self.widget.remove_all_button.click() self.enterFilter("Date_Posted_or_Updated", "is below", QDate(2014, 4, 17)) self.assertEqual(len(self.get_output("Matching Data")), 840) self.enterFilter("Date_Posted_or_Updated", "is greater than", QDate(2014, 6, 30)) self.assertIsNone(self.get_output("Matching Data")) self.widget.remove_all_button.click() # date is in range min-max date self.enterFilter("Date_Posted_or_Updated", "equals", QDate(2013, 1, 1)) self.assertEqual(self.widget.conditions[0][2][0], QDate(2014, 1, 23)) self.enterFilter("Date_Posted_or_Updated", "equals", QDate(2015, 1, 1)) self.assertEqual(self.widget.conditions[1][2][0], QDate(2014, 6, 30)) self.widget.remove_all_button.click() # no date crossings self.enterFilter("Date_Posted_or_Updated", "is between", QDate(2014, 4, 17), QDate(2014, 1, 23)) self.assertEqual(self.widget.conditions[0][2], (QDate(2014, 4, 17), QDate(2014, 4, 17))) self.widget.remove_all_button.click() self.enterFilter("Date_Posted_or_Updated", "is between", QDate(2014, 4, 17), QDate(2014, 4, 30)) self.assertEqual(len(self.get_output("Matching Data")), 58)
FilterString.Outside: ["aardwark"], FilterString.Contains: ["aa"], FilterString.StartsWith: ["aa"], FilterString.EndsWith: ["ark"], FilterString.IsDefined: [] } DFValues = { FilterDiscreteType.Equal: [0], FilterDiscreteType.NotEqual: [0], FilterDiscreteType.In: [0, 1], FilterDiscreteType.IsDefined: [], } TFValues = { FilterContinuous.Equal: [QDate(2013, 5, 5)], FilterContinuous.NotEqual: [QDate(2013, 5, 5)], FilterContinuous.Less: [QDate(2013, 5, 5)], FilterContinuous.LessEqual: [QDate(2013, 5, 5)], FilterContinuous.Greater: [QDate(2013, 5, 5)], FilterContinuous.GreaterEqual: [QDate(2013, 5, 5)], FilterContinuous.Between: [QDate(2013, 5, 5), QDate(2015, 5, 5)], FilterContinuous.Outside: [QDate(2013, 5, 5), QDate(2015, 5, 5)], FilterContinuous.IsDefined: [], } class TestOWSelectRows(WidgetTest): def setUp(self):
def _datetime(y, m, d) -> QDateTime: return QDateTime(QDate(y, m, d), QTime(0, 0))
def __init__(self): super().__init__() self.output_corpus = None self.pubmed_api = None self.progress = None self.email_is_valid = False self.record_count = 0 self.download_running = False # To hold all the controls. Makes access easier. self.pubmed_controls = [] h_box = gui.hBox(self.controlArea) label = gui.label(h_box, self, 'Email:') label.setMaximumSize(label.sizeHint()) # Drop-down for recent emails. self.email_combo = QComboBox(h_box) self.email_combo.setMinimumWidth(150) self.email_combo.setEditable(True) self.email_combo.lineEdit().textChanged.connect(self.sync_email) h_box.layout().addWidget(self.email_combo) self.email_combo.activated[int].connect(self.select_email) # RECORD SEARCH self.search_tabs = gui.tabWidget(self.controlArea) # --- Regular search --- regular_search_box = gui.widgetBox(self.controlArea, addSpace=True) # Author self.author_input = gui.lineEdit(regular_search_box, self, 'author', 'Author:', orientation=Qt.Horizontal) self.pubmed_controls.append(self.author_input) h_box = gui.hBox(regular_search_box) year_box = gui.widgetBox(h_box, orientation=Qt.Horizontal) min_date = QDate.fromString( self.MIN_DATE.strftime(self.PY_DATE_FORMAT), self.QT_DATE_FORMAT) if not self.pub_date_from: self.pub_date_from = self.MIN_DATE.strftime(self.PY_DATE_FORMAT) if not self.pub_date_to: self.pub_date_to = date.today().strftime(self.PY_DATE_FORMAT) self.date_from = QDateEdit(QDate.fromString(self.pub_date_from, self.QT_DATE_FORMAT), displayFormat=self.QT_DATE_FORMAT, minimumDate=min_date, calendarPopup=True) self.date_to = QDateEdit(QDate.fromString(self.pub_date_to, self.QT_DATE_FORMAT), displayFormat=self.QT_DATE_FORMAT, minimumDate=min_date, calendarPopup=True) self.date_from.dateChanged.connect(lambda date: setattr( self, 'pub_date_from', date.toString(self.QT_DATE_FORMAT))) self.date_to.dateChanged.connect(lambda date: setattr( self, 'pub_date_to', date.toString(self.QT_DATE_FORMAT))) self.pubmed_controls.append(self.date_from) self.pubmed_controls.append(self.date_to) gui.label(year_box, self, 'From:') year_box.layout().addWidget(self.date_from) gui.label(year_box, self, 'to:') year_box.layout().addWidget(self.date_to) # Keywords. h_box = gui.hBox(regular_search_box) label = gui.label(h_box, self, 'Query:') label.setMaximumSize(label.sizeHint()) self.keyword_combo = QComboBox(h_box) self.keyword_combo.setMinimumWidth(150) self.keyword_combo.setEditable(True) h_box.layout().addWidget(self.keyword_combo) self.keyword_combo.activated[int].connect(self.select_keywords) self.pubmed_controls.append(self.keyword_combo) tab_height = regular_search_box.sizeHint() regular_search_box.setMaximumSize(tab_height) # --- Advanced search --- advanced_search_box = gui.widgetBox(self.controlArea, addSpace=True) # Advanced search query. h_box = gui.hBox(advanced_search_box) self.advanced_query_input = QTextEdit(h_box) h_box.layout().addWidget(self.advanced_query_input) self.advanced_query_input.setMaximumSize(tab_height) self.pubmed_controls.append(self.advanced_query_input) gui.createTabPage(self.search_tabs, 'Regular search', regular_search_box) gui.createTabPage(self.search_tabs, 'Advanced search', advanced_search_box) # Search info label. self.search_info_label = gui.label(self.controlArea, self, 'Number of records found: /') # Search for records button. self.run_search_button = gui.button( self.controlArea, self, 'Find records', callback=self.run_search, tooltip='Performs a search for articles that fit the ' 'specified parameters.') self.pubmed_controls.append(self.run_search_button) h_line = QFrame() h_line.setFrameShape(QFrame.HLine) h_line.setFrameShadow(QFrame.Sunken) self.controlArea.layout().addWidget(h_line) # RECORD RETRIEVAL # Text includes box. text_includes_box = gui.widgetBox(self.controlArea, 'Text includes', addSpace=True) self.authors_checkbox = gui.checkBox(text_includes_box, self, 'includes_authors', 'Authors') self.title_checkbox = gui.checkBox(text_includes_box, self, 'includes_title', 'Article title') self.mesh_checkbox = gui.checkBox(text_includes_box, self, 'includes_mesh', 'Mesh headings') self.abstract_checkbox = gui.checkBox(text_includes_box, self, 'includes_abstract', 'Abstract') self.url_checkbox = gui.checkBox(text_includes_box, self, 'includes_url', 'URL') self.pubmed_controls.append(self.authors_checkbox) self.pubmed_controls.append(self.title_checkbox) self.pubmed_controls.append(self.mesh_checkbox) self.pubmed_controls.append(self.abstract_checkbox) self.pubmed_controls.append(self.url_checkbox) # Num. records. h_box = gui.hBox(self.controlArea) label = gui.label(h_box, self, 'Retrieve') label.setMaximumSize(label.sizeHint()) self.num_records_input = gui.spin(h_box, self, 'num_records', minv=1, maxv=10000) self.max_records_label = gui.label(h_box, self, 'records from /.') self.max_records_label.setMaximumSize( self.max_records_label.sizeHint()) self.pubmed_controls.append(self.num_records_input) # Download articles. # Search for records button. self.retrieve_records_button = gui.button( self.controlArea, self, 'Retrieve records', callback=self.retrieve_records, tooltip='Retrieves the specified documents.') self.pubmed_controls.append(self.retrieve_records_button) # Num. retrieved records info label. self.retrieval_info_label = gui.label( self.controlArea, self, 'Number of records retrieved: /') # Load the most recent emails. self.set_email_list() # Load the most recent queries. self.set_keyword_list() # Check the email and enable controls accordingly. if self.recent_emails: email = self.recent_emails[0] self.email_is_valid = validate_email(email) self.enable_controls()
def to_qdate(cls, date): return QDate.fromString(date.strftime(cls.PY_DATE_FORMAT), cls.QT_DATE_FORMAT)
def test_init(self): self.assertEqual(self.editor.value, 0) self.assertEqual(self.editor._edit.dateTime(), QDateTime(QDate(1970, 1, 1))) self.callback.assert_not_called()
def __init__(self): super().__init__() self.output_corpus = None self.pubmed_api = None self.progress = None self.email_is_valid = False self.record_count = 0 self.download_running = False # To hold all the controls. Makes access easier. self.pubmed_controls = [] h_box = gui.hBox(self.controlArea) label = gui.label(h_box, self, 'Email:') label.setMaximumSize(label.sizeHint()) # Drop-down for recent emails. self.email_combo = QComboBox(h_box) self.email_combo.setMinimumWidth(150) self.email_combo.setEditable(True) self.email_combo.lineEdit().textChanged.connect(self.sync_email) h_box.layout().addWidget(self.email_combo) self.email_combo.activated[int].connect(self.select_email) # RECORD SEARCH self.search_tabs = gui.tabWidget(self.controlArea) # --- Regular search --- regular_search_box = gui.widgetBox(self.controlArea, addSpace=True) # Author self.author_input = gui.lineEdit(regular_search_box, self, 'author', 'Author:', orientation=Qt.Horizontal) self.pubmed_controls.append(self.author_input) h_box = gui.hBox(regular_search_box) year_box = gui.widgetBox(h_box, orientation=Qt.Horizontal) min_date = QDate.fromString( self.MIN_DATE.strftime(self.PY_DATE_FORMAT), self.QT_DATE_FORMAT ) if not self.pub_date_from: self.pub_date_from = self.MIN_DATE.strftime(self.PY_DATE_FORMAT) if not self.pub_date_to: self.pub_date_to = date.today().strftime(self.PY_DATE_FORMAT) self.date_from = QDateEdit( QDate.fromString(self.pub_date_from, self.QT_DATE_FORMAT), displayFormat=self.QT_DATE_FORMAT, minimumDate=min_date, calendarPopup=True ) self.date_to = QDateEdit( QDate.fromString(self.pub_date_to, self.QT_DATE_FORMAT), displayFormat=self.QT_DATE_FORMAT, minimumDate=min_date, calendarPopup=True ) self.date_from.dateChanged.connect( lambda date: setattr(self, 'pub_date_from', date.toString(self.QT_DATE_FORMAT))) self.date_to.dateChanged.connect( lambda date: setattr(self, 'pub_date_to', date.toString(self.QT_DATE_FORMAT))) self.pubmed_controls.append(self.date_from) self.pubmed_controls.append(self.date_to) gui.label(year_box, self, 'From:') year_box.layout().addWidget(self.date_from) gui.label(year_box, self, 'to:') year_box.layout().addWidget(self.date_to) # Keywords. h_box = gui.hBox(regular_search_box) label = gui.label(h_box, self, 'Query:') label.setMaximumSize(label.sizeHint()) self.keyword_combo = QComboBox(h_box) self.keyword_combo.setMinimumWidth(150) self.keyword_combo.setEditable(True) h_box.layout().addWidget(self.keyword_combo) self.keyword_combo.activated[int].connect(self.select_keywords) self.pubmed_controls.append(self.keyword_combo) tab_height = regular_search_box.sizeHint() regular_search_box.setMaximumSize(tab_height) # --- Advanced search --- advanced_search_box = gui.widgetBox(self.controlArea, addSpace=True) # Advanced search query. h_box = gui.hBox(advanced_search_box) self.advanced_query_input = QTextEdit(h_box) h_box.layout().addWidget(self.advanced_query_input) self.advanced_query_input.setMaximumSize(tab_height) self.pubmed_controls.append(self.advanced_query_input) gui.createTabPage(self.search_tabs, 'Regular search', regular_search_box) gui.createTabPage(self.search_tabs, 'Advanced search', advanced_search_box) # Search info label. self.search_info_label = gui.label( self.controlArea, self, 'Number of records found: /') # Search for records button. self.run_search_button = gui.button( self.controlArea, self, 'Find records', callback=self.run_search, tooltip='Performs a search for articles that fit the ' 'specified parameters.') self.pubmed_controls.append(self.run_search_button) h_line = QFrame() h_line.setFrameShape(QFrame.HLine) h_line.setFrameShadow(QFrame.Sunken) self.controlArea.layout().addWidget(h_line) # RECORD RETRIEVAL # Text includes box. text_includes_box = gui.widgetBox(self.controlArea, 'Text includes', addSpace=True) self.authors_checkbox = gui.checkBox(text_includes_box, self, 'includes_authors', 'Authors') self.title_checkbox = gui.checkBox(text_includes_box, self, 'includes_title', 'Article title') self.mesh_checkbox = gui.checkBox(text_includes_box, self, 'includes_mesh', 'Mesh headings') self.abstract_checkbox = gui.checkBox(text_includes_box, self, 'includes_abstract', 'Abstract') self.url_checkbox = gui.checkBox(text_includes_box, self, 'includes_url', 'URL') self.pubmed_controls.append(self.authors_checkbox) self.pubmed_controls.append(self.title_checkbox) self.pubmed_controls.append(self.mesh_checkbox) self.pubmed_controls.append(self.abstract_checkbox) self.pubmed_controls.append(self.url_checkbox) # Num. records. h_box = gui.hBox(self.controlArea) label = gui.label(h_box, self, 'Retrieve') label.setMaximumSize(label.sizeHint()) self.num_records_input = gui.spin(h_box, self, 'num_records', minv=1, maxv=100000) self.max_records_label = gui.label(h_box, self, 'records from /.') self.max_records_label.setMaximumSize(self.max_records_label .sizeHint()) self.pubmed_controls.append(self.num_records_input) # Download articles. # Search for records button. self.retrieve_records_button = gui.button( self.controlArea, self, 'Retrieve records', callback=self.retrieve_records, tooltip='Retrieves the specified documents.') self.pubmed_controls.append(self.retrieve_records_button) # Num. retrieved records info label. self.retrieval_info_label = gui.label( self.controlArea, self, 'Number of records retrieved: /') # Load the most recent emails. self.set_email_list() # Load the most recent queries. self.set_keyword_list() # Check the email and enable controls accordingly. if self.recent_emails: email = self.recent_emails[0] self.email_is_valid = validate_email(email) self.enable_controls()