class FoursquarePOIGrabberDialogTest(unittest.TestCase): """Test dialog works.""" def setUp(self): """Runs before each test.""" self.dialog = FoursquarePOIGrabberDialog(None) def tearDown(self): """Runs after each test.""" self.dialog = None def test_dialog_ok(self): """Test we can click OK.""" button = self.dialog.button_box.button(QDialogButtonBox.Ok) button.click() result = self.dialog.result() self.assertEqual(result, QDialog.Accepted) def test_dialog_cancel(self): """Test we can click cancel.""" button = self.dialog.button_box.button(QDialogButtonBox.Cancel) button.click() result = self.dialog.result() self.assertEqual(result, QDialog.Rejected)
def __init__(self, iface): """Constructor. :param iface: An interface instance that will be passed to this class which provides the hook by which you can manipulate the QGIS application at run time. :type iface: QgsInterface """ # Save reference to the QGIS interface global validator self.iface = iface # initialize plugin directory self.plugin_dir = os.path.dirname(__file__) # initialize locale locale = QSettings().value('locale/userLocale')[0:2] locale_path = os.path.join( self.plugin_dir, 'i18n', 'FoursquarePOIGrabber_{}.qm'.format(locale)) if os.path.exists(locale_path): self.translator = QTranslator() self.translator.load(locale_path) if qVersion() > '4.3.3': QCoreApplication.installTranslator(self.translator) # Create the dialog (after translation) and keep reference self.dlg = FoursquarePOIGrabberDialog() self.dlg.setFixedSize(640, 320) self.foo = Foo() # Declare instance attributes self.actions = [] self.menu = self.tr(u'&4sq POI Grabber') # TODO: We are going to let the user set this up in a future iteration self.toolbar = self.iface.addToolBar(u'FoursquarePOIGrabber') self.toolbar.setObjectName(u'FoursquarePOIGrabber') validator = QIntValidator() self.dlg.lineEdit_radius.setValidator(validator) self.dlg.lineEdit_radius.setMaxLength(6) self.dlg.lineEdit_radius.textChanged.connect(self.check_state) self.dlg.lineEdit_radius.editingFinished.connect(self.check_radius) self.dlg.webView_gmap.loadFinished.connect(self.enableJavaScript) self.dlg.webView_gmap.load(QUrl('http://yilmazturk.info/poigrabber/gmap.html')) self.dlg.pushButton_fetchPOI.clicked.connect(self.get_poi) self.populate_combobox()
def setUp(self): """Runs before each test.""" self.dialog = FoursquarePOIGrabberDialog(None)
class FoursquarePOIGrabber: """QGIS Plugin Implementation.""" def enableJavaScript(self): self.dlg.webView_gmap.page().mainFrame().addToJavaScriptWindowObject("foo", self.foo) def __init__(self, iface): """Constructor. :param iface: An interface instance that will be passed to this class which provides the hook by which you can manipulate the QGIS application at run time. :type iface: QgsInterface """ # Save reference to the QGIS interface global validator self.iface = iface # initialize plugin directory self.plugin_dir = os.path.dirname(__file__) # initialize locale locale = QSettings().value('locale/userLocale')[0:2] locale_path = os.path.join( self.plugin_dir, 'i18n', 'FoursquarePOIGrabber_{}.qm'.format(locale)) if os.path.exists(locale_path): self.translator = QTranslator() self.translator.load(locale_path) if qVersion() > '4.3.3': QCoreApplication.installTranslator(self.translator) # Create the dialog (after translation) and keep reference self.dlg = FoursquarePOIGrabberDialog() self.dlg.setFixedSize(640, 320) self.foo = Foo() # Declare instance attributes self.actions = [] self.menu = self.tr(u'&4sq POI Grabber') # TODO: We are going to let the user set this up in a future iteration self.toolbar = self.iface.addToolBar(u'FoursquarePOIGrabber') self.toolbar.setObjectName(u'FoursquarePOIGrabber') validator = QIntValidator() self.dlg.lineEdit_radius.setValidator(validator) self.dlg.lineEdit_radius.setMaxLength(6) self.dlg.lineEdit_radius.textChanged.connect(self.check_state) self.dlg.lineEdit_radius.editingFinished.connect(self.check_radius) self.dlg.webView_gmap.loadFinished.connect(self.enableJavaScript) self.dlg.webView_gmap.load(QUrl('http://yilmazturk.info/poigrabber/gmap.html')) self.dlg.pushButton_fetchPOI.clicked.connect(self.get_poi) self.populate_combobox() def check_state(self): state = validator.validate(self.dlg.lineEdit_radius.text(), 0)[0] if state == QValidator.Acceptable: color = '#c4df9b' self.dlg.lineEdit_radius.setStyleSheet('QLineEdit { background-color: %s }' % color) elif state == QValidator.Intermediate: color = '#fff79a' self.dlg.lineEdit_radius.setStyleSheet('QLineEdit { background-color: %s }' % color) else: color = '#f6989d' self.dlg.lineEdit_radius.setStyleSheet('QLineEdit { background-color: %s }' % color) def check_radius(self): if int(self.dlg.lineEdit_radius.text()) > 100000: color = '#f6989d' self.dlg.lineEdit_radius.setStyleSheet('QLineEdit { background-color: %s }' % color) iface.messageBar().pushMessage(u"Error:", u" The maximum supported radius is currently 100,000 meters.", level=QgsMessageBar.CRITICAL, duration=5) else: pass def get_poi(self): try: client_id = self.dlg.lineEdit_clientID.text() client_secret = self.dlg.lineEdit_clientSecret.text() radius = self.dlg.lineEdit_radius.text() category_name = self.dlg.comboBox_category.currentText() category_id = foursquare_categories[category_name] current_date = str(datetime.datetime.now().date()).replace("-", "") url = "https://api.foursquare.com/v2/venues/search?ll=%s,%s&radius=%s&intent=browse&categoryId=%s&limit=50&client_id=%s&client_secret=%s&v=%s" % (lat, lon, radius, category_id, client_id, client_secret, current_date) req = urllib2.Request(url) opener = urllib2.build_opener() f = opener.open(req) data = json.loads(f.read()) json_object_count = len(data['response']['venues']) if json_object_count == 0: iface.messageBar().pushMessage(u"Info:", "Unfortunately, there is no POI at the specified location...", level=QgsMessageBar.INFO, duration=5) else: iface.messageBar().pushMessage(u"Info:", str(json_object_count) + " POI(s) fetched for " + category_name + " category", level=QgsMessageBar.SUCCESS, duration=5) poi_id = [] poi_name = [] poi_lon = [] poi_lat = [] for i in range(0, json_object_count): poi_id.append(data['response']['venues'][i]['id']) poi_name.append(data['response']['venues'][i]['name']) poi_lon.append(data['response']['venues'][i]['location']['lng']) poi_lat.append(data['response']['venues'][i]['location']['lat']) coord_pairs = [] layer_name = "POI - %s" % category_name memory_layer = QgsVectorLayer("Point?crs=epsg:4326", layer_name, "memory") memory_layer.startEditing() provider = memory_layer.dataProvider() provider.addAttributes([QgsField("FoursqID", QVariant.String), QgsField("Name", QVariant.String), QgsField("Category", QVariant.String), QgsField("Date", QVariant.String)]) for fsid, name, x, y in zip(poi_id, poi_name, poi_lon, poi_lat): geometry = QgsGeometry.fromPoint(QgsPoint(x, y)) feature = QgsFeature() feature.setGeometry(geometry) feature.setAttributes([fsid, name, category_name, current_date]) coord_pairs.append(feature) memory_layer.dataProvider().addFeatures(coord_pairs) memory_layer.updateExtents() memory_layer.commitChanges() QgsMapLayerRegistry.instance().addMapLayer(memory_layer) except: iface.messageBar().pushMessage(u"Error:", "Please make sure to drop a pin on Google Map or fill in all \ the fields!", level=QgsMessageBar.CRITICAL, duration=5) def populate_combobox(self): global foursquare_categories foursquare_categories = { "Medical - Hospital": "4bf58dd8d48988d196941735", "Medical - Dentist's Office": "4bf58dd8d48988d178941735", "Medical - Veterinarian": "4d954af4a243a5684765b473", "Education - University": "4bf58dd8d48988d1ae941735", "Education - High School": "4bf58dd8d48988d13d941735", "Education - Elementary School": "4f4533804b9074f6e4fb0105", "Culture & Arts - Museum": "4bf58dd8d48988d181941735", "Culture & Arts - Theater": "4bf58dd8d48988d137941735", "Culture & Arts - Movie Theater": "4bf58dd8d48988d17f941735", "Food": "4d4b7105d754a06374d81259", "Food - Cafe": "4bf58dd8d48988d16d941735", "Food - Bar": "4bf58dd8d48988d116941735", "Office": "4bf58dd8d48988d124941735", "Finance - ATM": "52f2ab2ebcbc57f1066b8b56", "Finance - Bank": "4bf58dd8d48988d10a951735", "Spiritual - Mosque": "4bf58dd8d48988d138941735", "Spiritual - Church": "4bf58dd8d48988d132941735", "Spiritual - Synagogue": "4bf58dd8d48988d139941735", "Hotel": "4bf58dd8d48988d1fa931735", "Service - Gas Station": "4bf58dd8d48988d113951735", "Service - Supermarket": "52f2ab2ebcbc57f1066b8b46", "Service - Barbershop": "4bf58dd8d48988d110951735", "Service - Laundry Service": "4bf58dd8d48988d1fc941735", "Service - Car Wash": "4f04ae1f2fb6e1c99f3db0ba", "Service - Rental Car": "4bf58dd8d48988d1ef941735", "Transport - Bus Stop": "52f2ab2ebcbc57f1066b8b4f", "Transport - Metro Station": "4bf58dd8d48988d1fd931735", "Transport - Tram Station": "52f2ab2ebcbc57f1066b8b51", "Transport - Taxi": "4bf58dd8d48988d130951735", "Transport - Parking": "4c38df4de52ce0d596b336e1" } category_list = [] for category in foursquare_categories.keys(): category_list.append(category) self.dlg.comboBox_category.addItems(sorted(category_list)) # noinspection PyMethodMayBeStatic def tr(self, message): """Get the translation for a string using Qt translation API. We implement this ourselves since we do not inherit QObject. :param message: String for translation. :type message: str, QString :returns: Translated version of message. :rtype: QString """ # noinspection PyTypeChecker,PyArgumentList,PyCallByClass return QCoreApplication.translate('FoursquarePOIGrabber', message) def add_action( self, icon_path, text, callback, enabled_flag=True, add_to_menu=True, add_to_toolbar=True, status_tip=None, whats_this=None, parent=None): """Add a toolbar icon to the toolbar. :param icon_path: Path to the icon for this action. Can be a resource path (e.g. ':/plugins/foo/bar.png') or a normal file system path. :type icon_path: str :param text: Text that should be shown in menu items for this action. :type text: str :param callback: Function to be called when the action is triggered. :type callback: function :param enabled_flag: A flag indicating if the action should be enabled by default. Defaults to True. :type enabled_flag: bool :param add_to_menu: Flag indicating whether the action should also be added to the menu. Defaults to True. :type add_to_menu: bool :param add_to_toolbar: Flag indicating whether the action should also be added to the toolbar. Defaults to True. :type add_to_toolbar: bool :param status_tip: Optional text to show in a popup when mouse pointer hovers over the action. :type status_tip: str :param parent: Parent widget for the new action. Defaults None. :type parent: QWidget :param whats_this: Optional text to show in the status bar when the mouse pointer hovers over the action. :returns: The action that was created. Note that the action is also added to self.actions list. :rtype: QAction """ icon = QIcon(icon_path) action = QAction(icon, text, parent) action.triggered.connect(callback) action.setEnabled(enabled_flag) if status_tip is not None: action.setStatusTip(status_tip) if whats_this is not None: action.setWhatsThis(whats_this) if add_to_toolbar: self.toolbar.addAction(action) if add_to_menu: self.iface.addPluginToMenu( self.menu, action) self.actions.append(action) return action def initGui(self): """Create the menu entries and toolbar icons inside the QGIS GUI.""" icon_path = ':/plugins/FoursquarePOIGrabber/icon.png' self.add_action( icon_path, text=self.tr(u'4sq POI Grabber'), callback=self.run, parent=self.iface.mainWindow()) def unload(self): """Removes the plugin menu item and icon from QGIS GUI.""" for action in self.actions: self.iface.removePluginMenu( self.tr(u'&4sq POI Grabber'), action) self.iface.removeToolBarIcon(action) # remove the toolbar del self.toolbar def run(self): """Run method that performs all the real work""" # show the dialog self.dlg.show() # Run the dialog event loop result = self.dlg.exec_() # See if OK was pressed if result: pass