def __init__(self, iface, toolbar, parent=None): CartoDBPluginUserDialog.__init__(self, toolbar, parent) self.iface = iface self.ui = Ui_Upload() self.ui.setupUi(self) self.ui.bar = QgsMessageBar() self.ui.bar.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed) self.ui.verticalLayout.insertWidget(0, self.ui.bar) self.ui.uploadBT.clicked.connect(self.upload) self.ui.cancelBT.clicked.connect(self.reject) self.ui.layersList.itemSelectionChanged.connect(self.validateButtons) layers = QgsMapLayerRegistry.instance().mapLayers() # TODO Implement add to project # self.ui.convertCH.hide() self.ui.overideCH.hide() self.ui.layersList.clear() self.ui.uploadBar.setValue(0) self.ui.uploadBar.hide() self.ui.uploadingLB.hide() for id_ly, ly in layers.iteritems(): qDebug('Layer id {}'.format(stripAccents(id_ly))) if ly.type() == QgsMapLayer.VectorLayer and not isinstance(ly, CartoDBLayer): item = QListWidgetItem(self.ui.layersList) widget = CartoDBLayerListItem(ly.name(), ly, getSize(ly), ly.dataProvider().featureCount()) item.setSizeHint(widget.sizeHint()) self.ui.layersList.setItemWidget(item, widget)
def __init__(self, toolbar, parent=None): QDialog.__init__(self, parent) self.toolbar = toolbar self.settings = QSettings() self.ui = Ui_Upload() self.ui.setupUi(self) self.ui.uploadBT.clicked.connect(self.upload) self.ui.cancelBT.clicked.connect(self.reject) self.currentUser = self.toolbar.currentUser self.currentApiKey = self.toolbar.currentApiKey self.currentMultiuser = self.toolbar.currentMultiuser layers = QgsMapLayerRegistry.instance().mapLayers() self.ui.layersList.clear() self.ui.uploadBar.setValue(0) self.ui.uploadBar.hide() self.ui.uploadingLB.hide() for id, ly in layers.iteritems(): if ly.type() == QgsMapLayer.VectorLayer and not isinstance(ly, CartoDBLayer): item = QListWidgetItem(self.ui.layersList) widget = CartoDBLayerListItem(ly.name(), ly, self.getSize(ly), ly.dataProvider().featureCount()) item.setSizeHint(widget.sizeHint()) self.ui.layersList.setItemWidget(item, widget) worker = CartoDBPluginWorker(self, 'connectUser') worker.start()
class CartoDBPluginUpload(QDialog): def __init__(self, toolbar, parent=None): QDialog.__init__(self, parent) self.toolbar = toolbar self.settings = QSettings() self.ui = Ui_Upload() self.ui.setupUi(self) self.ui.uploadBT.clicked.connect(self.upload) self.ui.cancelBT.clicked.connect(self.reject) self.currentUser = self.toolbar.currentUser self.currentApiKey = self.toolbar.currentApiKey self.currentMultiuser = self.toolbar.currentMultiuser layers = QgsMapLayerRegistry.instance().mapLayers() self.ui.layersList.clear() self.ui.uploadBar.setValue(0) self.ui.uploadBar.hide() self.ui.uploadingLB.hide() for id, ly in layers.iteritems(): if ly.type() == QgsMapLayer.VectorLayer and not isinstance(ly, CartoDBLayer): item = QListWidgetItem(self.ui.layersList) widget = CartoDBLayerListItem(ly.name(), ly, self.getSize(ly), ly.dataProvider().featureCount()) item.setSizeHint(widget.sizeHint()) self.ui.layersList.setItemWidget(item, widget) worker = CartoDBPluginWorker(self, 'connectUser') worker.start() @pyqtSlot() def connectUser(self): self.getUserData(self.currentUser, self.currentApiKey, self.currentMultiuser) def getUserData(self, cartodbUser, apiKey, multiuser=False): if self.toolbar.avatarImage is not None: pixMap = QPixmap.fromImage(self.toolbar.avatarImage).scaled(self.ui.avatarLB.size(), Qt.KeepAspectRatio) self.ui.avatarLB.setPixmap(pixMap) self.ui.avatarLB.show() if self.toolbar.currentUserData is not None: self.currentUserData = self.toolbar.currentUserData self.setUpUserData() def setUpUserData(self): usedQuota = (float(self.currentUserData['quota_in_bytes']) - float(self.currentUserData['remaining_byte_quota']))/1024/1024 quota = float(self.currentUserData['quota_in_bytes'])/1024/1024 self.ui.remainingBar.setValue(math.ceil(usedQuota/quota*100)) if usedQuota >= 1000: usedQuota = "{:.2f}".format(usedQuota/1024) + ' GB' else: usedQuota = "{:.2f}".format(usedQuota) + ' MB' if quota >= 1000: quota = "{:.2f}".format(quota/1024) + ' GB' else: quota = "{:.2f}".format(quota) + ' MB' self.ui.nameLB.setText(self.currentUserData['username']) self.ui.quotaLB.setText( QApplication.translate('CartoDBPlugin', 'Using {} of {}') .format(usedQuota, quota)) def upload(self): registry = QgsMapLayerRegistry.instance() for layerItem in self.ui.layersList.selectedItems(): widget = self.ui.layersList.itemWidget(layerItem) qDebug('Layer: ' + str(widget.layer.storageType())) if widget.layer.storageType() == 'ESRI Shapefile': zipPath = self.zipLayer(widget.layer) cartodbApi = CartoDBApi(self.currentUser, self.currentApiKey, self.currentMultiuser) cartodbApi.fetchContent.connect(self.completeUpload) cartodbApi.progress.connect(self.progressUpload) self.ui.uploadBar.show() self.ui.uploadBT.setEnabled(False) self.ui.uploadingLB.setText('Uploading {}'.format(widget.layer.name())) self.ui.uploadingLB.show() cartodbApi.upload(zipPath) def completeUpload(self, data): self.ui.uploadBar.hide() self.ui.uploadingLB.hide() self.ui.uploadBT.setEnabled(True) def progressUpload(self, current, total): self.ui.uploadBar.setValue(math.ceil(float(current)/float(total)*100)) def getSize(self, layer): filePath = layer.dataProvider().dataSourceUri() if filePath.find('|') != -1: filePath = filePath[0:filePath.find('|')] file = QFile(filePath) fileInfo = QFileInfo(file) dirName = fileInfo.dir().absolutePath() fileName = fileInfo.completeBaseName() size = 0 if layer.storageType() == 'ESRI Shapefile': for suffix in ['.shp', '.dbf', '.prj', '.shx']: file = QFile(os.path.join(dirName, fileName + suffix)) fileInfo = QFileInfo(file) size = size + fileInfo.size() return size def zipLayer(self, layer): filePath = layer.dataProvider().dataSourceUri() if filePath.find('|') != -1: filePath = filePath[0:filePath.find('|')] file = QFile(filePath) fileInfo = QFileInfo(file) dirName = fileInfo.dir().absolutePath() fileName = fileInfo.completeBaseName() zipPath = os.path.join(tempfile.tempdir, layer.name() + '.zip') zipFile = zipfile.ZipFile(zipPath, 'w') if os.path.exists(os.path.join(dirName, fileName + '.shp')): zipFile.write(os.path.join(dirName, fileName + '.shp'), fileName + '.shp', zipfile.ZIP_DEFLATED) if os.path.exists(os.path.join(dirName, fileName + '.dbf')): zipFile.write(os.path.join(dirName, fileName + '.dbf'), fileName + '.dbf', zipfile.ZIP_DEFLATED) if os.path.exists(os.path.join(dirName, fileName + '.prj')): zipFile.write(os.path.join(dirName, fileName + '.prj'), fileName + '.prj', zipfile.ZIP_DEFLATED) if os.path.exists(os.path.join(dirName, fileName + '.shx')): zipFile.write(os.path.join(dirName, fileName + '.shx'), fileName + '.shx', zipfile.ZIP_DEFLATED) zipFile.close() return zipPath def reject(self): # Back out of dialogue QDialog.reject(self)
class CartoDBPluginUpload(CartoDBPluginUserDialog): """Dialog for Upload data to CARTO""" addedLayer = pyqtSignal(str, str) def __init__(self, iface, toolbar, parent=None): CartoDBPluginUserDialog.__init__(self, toolbar, parent) self.iface = iface self.ui = Ui_Upload() self.ui.setupUi(self) self.ui.bar = QgsMessageBar() self.ui.bar.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed) self.ui.verticalLayout.insertWidget(0, self.ui.bar) self.ui.uploadBT.clicked.connect(self.upload) self.ui.cancelBT.clicked.connect(self.reject) self.ui.layersList.itemSelectionChanged.connect(self.validateButtons) layers = QgsMapLayerRegistry.instance().mapLayers() # TODO Implement add to project # self.ui.convertCH.hide() self.ui.overideCH.hide() self.ui.layersList.clear() self.ui.uploadBar.setValue(0) self.ui.uploadBar.hide() self.ui.uploadingLB.hide() for id_ly, ly in layers.iteritems(): qDebug('Layer id {}'.format(stripAccents(id_ly))) if ly.type() == QgsMapLayer.VectorLayer and not isinstance(ly, CartoDBLayer): item = QListWidgetItem(self.ui.layersList) widget = CartoDBLayerListItem(ly.name(), ly, getSize(ly), ly.dataProvider().featureCount()) item.setSizeHint(widget.sizeHint()) self.ui.layersList.setItemWidget(item, widget) def upload(self): """Init upload proccess""" for layer_item in self.ui.layersList.selectedItems(): widget = self.ui.layersList.itemWidget(layer_item) qDebug('Layer: ' + str(widget.layer.storageType())) layer = checkCartoDBId(widget.layer, self.ui.convertCH.isChecked()) zip_path = zipLayer(layer) self.uploadZip(zip_path, widget, layer, self.ui.convertCH.isChecked()) def uploadZip(self, zip_path, widget, convertLayer=None, convert=False): """Upload Zipfile""" def completeUpload(data): """On complete upload""" timer = QTimer(self) qDebug('data: {}'.format(str(data))) if 'error' in data and data['error'] is not None: self.ui.bar.clearWidgets() self.ui.bar.pushMessage(QApplication.translate('CartoDBPlugin', 'Error uploading layer: {}').format(data['error']), level=QgsMessageBar.CRITICAL, duration=5) widget.setStatus('Error', 0) return self.ui.uploadBar.hide() self.ui.uploadingLB.hide() self.ui.uploadBT.setEnabled(True) self.ui.bar.clearWidgets() self.ui.bar.pushMessage(QApplication.translate('CartoDBPlugin', 'Upload Complete'), level=QgsMessageBar.INFO, duration=5) def statusComplete(res): """On CARTO import proccess complete o fail""" if res['state'] == 'complete': timer.stop() self.ui.statusLB.setText(QApplication.translate('CartoDBPlugin', 'Ready')) widget.setStatus(res['state'], 100) self.ui.bar.clearWidgets() self.ui.bar.pushMessage(QApplication.translate('CartoDBPlugin', 'Table {} created').format(res['table_name']), level=QgsMessageBar.INFO, duration=5) if convert: self.convert2CartoDB(convertLayer if convertLayer is not None else widget.layer, res['table_name']) elif res['state'] == 'failure': timer.stop() self.ui.statusLB.setText(QApplication.translate('CartoDBPlugin', '{} failed, {}').format( widget.layer.name(), res['get_error_text']['title'])) widget.setStatus(res['state']) self.ui.bar.clearWidgets() self.ui.bar.pushMessage(QApplication.translate('CartoDBPlugin', 'Error uploading {}').format(widget.layer.name()), level=QgsMessageBar.WARNING, duration=5) else: widget.setStatus(res['state']) def timerComplete(): """On timer complete, check import process in CARTO Servers""" # pylint: disable-msg=E1101 cartodb_api = CartoDBApi(self.currentUser, self.currentApiKey, self.currentMultiuser) cartodb_api.fetchContent.connect(statusComplete) cartodb_api.checkUploadStatus(data['item_queue_id']) timer.timeout.connect(timerComplete) timer.start(500) # pylint: disable-msg=E1101 cartodb_api = CartoDBApi(self.currentUser, self.currentApiKey, self.currentMultiuser) cartodb_api.fetchContent.connect(completeUpload) cartodb_api.progress.connect(self.progressUpload) self.ui.uploadBar.show() self.ui.uploadBT.setEnabled(False) self.ui.uploadingLB.setText(QApplication.translate('CartoDBPlugin', 'Uploading {}').format(widget.layer.name())) self.ui.uploadingLB.show() self.ui.bar.clearWidgets() cartodb_api.upload(zip_path) def convert2CartoDB(self, layer, tableName): """Convert QGIS styles to CartoCSS""" checkTempDir() temp = tempfile.NamedTemporaryFile() qDebug('New file {}'.format(temp.name)) error = QgsVectorFileWriter.writeAsVectorFormat(layer, temp.name, "utf-8", None, "SQLite") if error == QgsVectorFileWriter.NoError: self.addedLayer.emit(temp.name + '.sqlite', tableName) else: self.ui.bar.pushMessage(QApplication.translate('CartoDBPlugin', 'Error loading CARTO layer {}').format(tableName), level=QgsMessageBar.WARNING, duration=5) def progressUpload(self, current, total): """Check upload proccess""" self.ui.uploadBar.setValue(math.ceil(float(current)/float(total)*100)) def reject(self): """Back out of dialogue""" QDialog.reject(self) def validateButtons(self): """Validate upload button""" enabled = self.ui.layersList.count() > 0 self.ui.uploadBT.setEnabled(enabled)
class CartoDBPluginUpload(CartoDBPluginUserDialog): def __init__(self, toolbar, parent=None): CartoDBPluginUserDialog.__init__(self, toolbar, parent) self.ui = Ui_Upload() self.ui.setupUi(self) self.ui.bar = QgsMessageBar() self.ui.bar.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed) self.ui.verticalLayout.insertWidget(0, self.ui.bar) self.ui.uploadBT.clicked.connect(self.upload) self.ui.cancelBT.clicked.connect(self.reject) layers = QgsMapLayerRegistry.instance().mapLayers() # TODO Implement add to project self.ui.convertCH.hide() self.ui.overideCH.hide() self.ui.layersList.clear() self.ui.uploadBar.setValue(0) self.ui.uploadBar.hide() self.ui.uploadingLB.hide() for id, ly in layers.iteritems(): if ly.type() == QgsMapLayer.VectorLayer and not isinstance(ly, CartoDBLayer): item = QListWidgetItem(self.ui.layersList) widget = CartoDBLayerListItem(ly.name(), ly, self.getSize(ly), ly.dataProvider().featureCount()) item.setSizeHint(widget.sizeHint()) self.ui.layersList.setItemWidget(item, widget) def upload(self): registry = QgsMapLayerRegistry.instance() for layerItem in self.ui.layersList.selectedItems(): widget = self.ui.layersList.itemWidget(layerItem) qDebug('Layer: ' + str(widget.layer.storageType())) storageType = widget.layer.storageType() # if storageType in ['ESRI Shapefile', 'GPX', 'GeoJSON', 'LIBKML', 'SQLite database with SpatiaLite extension']: zipPath = self.zipLayer(widget.layer) self.uploadZip(zipPath, widget) def uploadZip(self, zipPath, widget): cartodbApi = CartoDBApi(self.currentUser, self.currentApiKey, self.currentMultiuser) cartodbApi.fetchContent.connect(self.completeUpload) cartodbApi.progress.connect(self.progressUpload) self.ui.uploadBar.show() self.ui.uploadBT.setEnabled(False) self.ui.uploadingLB.setText(QApplication.translate('CartoDBPlugin', 'Uploading {}').format(widget.layer.name())) self.ui.uploadingLB.show() self.ui.bar.clearWidgets() cartodbApi.upload(zipPath) def completeUpload(self, data): self.ui.uploadBar.hide() self.ui.uploadingLB.hide() self.ui.uploadBT.setEnabled(True) self.ui.bar.clearWidgets() self.ui.bar.pushMessage(QApplication.translate('CartoDBPlugin', 'Upload Complete'), level=QgsMessageBar.INFO, duration=5) def progressUpload(self, current, total): self.ui.uploadBar.setValue(math.ceil(float(current)/float(total)*100)) def getSize(self, layer): filePath = layer.dataProvider().dataSourceUri() if filePath.find('|') != -1: filePath = filePath[0:filePath.find('|')] file = QFile(filePath) fileInfo = QFileInfo(file) dirName = fileInfo.dir().absolutePath() fileName = fileInfo.completeBaseName() size = 0 if layer.storageType() == 'ESRI Shapefile': for suffix in ['.shp', '.dbf', '.prj', '.shx']: file = QFile(os.path.join(dirName, fileName + suffix)) fileInfo = QFileInfo(file) size = size + fileInfo.size() elif layer.storageType() in ['GPX', 'GeoJSON', 'LIBKML']: size = size + fileInfo.size() return size def zipLayer(self, layer): filePath = layer.dataProvider().dataSourceUri() if filePath.find('|') != -1: filePath = filePath[0:filePath.find('|')] file = QFile(filePath) fileInfo = QFileInfo(file) dirName = fileInfo.dir().absolutePath() fileName = fileInfo.completeBaseName() tempdir = tempfile.tempdir if tempdir is None: tempdir = tempfile.mkdtemp() zipPath = os.path.join(tempdir, layer.name() + '.zip') zipFile = zipfile.ZipFile(zipPath, 'w') if layer.storageType() == 'ESRI Shapefile': for suffix in ['.shp', '.dbf', '.prj', '.shx']: if os.path.exists(os.path.join(dirName, fileName + suffix)): zipFile.write(os.path.join(dirName, fileName + suffix), fileName + suffix, zipfile.ZIP_DEFLATED) elif layer.storageType() == 'GeoJSON': zipFile.write(filePath, layer.name() + '.geojson', zipfile.ZIP_DEFLATED) else: geoJsonName = os.path.join(tempfile.tempdir, layer.name()) error = QgsVectorFileWriter.writeAsVectorFormat(layer, geoJsonName, "utf-8", None, "GeoJSON") if error == QgsVectorFileWriter.NoError: zipFile.write(geoJsonName + '.geojson', layer.name() + '.geojson', zipfile.ZIP_DEFLATED) ''' elif layer.storageType() == 'LIBKML': kmlName = os.path.join(tempfile.tempdir, layer.name()) error = QgsVectorFileWriter.writeAsVectorFormat(layer, kmlName, "utf-8", None, "GeoJSON") if error == QgsVectorFileWriter.NoError: zipFile.write(kmlName + '.geojson', layer.name() + '.geojson', zipfile.ZIP_DEFLATED) ''' zipFile.close() return zipPath def reject(self): # Back out of dialogue QDialog.reject(self)
class CartoDBPluginUpload(CartoDBPluginUserDialog): def __init__(self, toolbar, parent=None): CartoDBPluginUserDialog.__init__(self, toolbar, parent) self.ui = Ui_Upload() self.ui.setupUi(self) self.ui.bar = QgsMessageBar() self.ui.bar.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed) self.ui.verticalLayout.insertWidget(0, self.ui.bar) self.ui.uploadBT.clicked.connect(self.upload) self.ui.cancelBT.clicked.connect(self.reject) layers = QgsMapLayerRegistry.instance().mapLayers() # TODO Implement add to project self.ui.convertCH.hide() self.ui.overideCH.hide() self.ui.layersList.clear() self.ui.uploadBar.setValue(0) self.ui.uploadBar.hide() self.ui.uploadingLB.hide() for id, ly in layers.iteritems(): if ly.type() == QgsMapLayer.VectorLayer and not isinstance( ly, CartoDBLayer): item = QListWidgetItem(self.ui.layersList) widget = CartoDBLayerListItem(ly.name(), ly, self.getSize(ly), ly.dataProvider().featureCount()) item.setSizeHint(widget.sizeHint()) self.ui.layersList.setItemWidget(item, widget) def upload(self): registry = QgsMapLayerRegistry.instance() for layerItem in self.ui.layersList.selectedItems(): widget = self.ui.layersList.itemWidget(layerItem) qDebug('Layer: ' + str(widget.layer.storageType())) storageType = widget.layer.storageType() # if storageType in ['ESRI Shapefile', 'GPX', 'GeoJSON', 'LIBKML', 'SQLite database with SpatiaLite extension']: zipPath = self.zipLayer(widget.layer) self.uploadZip(zipPath, widget) def uploadZip(self, zipPath, widget): cartodbApi = CartoDBApi(self.currentUser, self.currentApiKey, self.currentMultiuser) cartodbApi.fetchContent.connect(self.completeUpload) cartodbApi.progress.connect(self.progressUpload) self.ui.uploadBar.show() self.ui.uploadBT.setEnabled(False) self.ui.uploadingLB.setText( QApplication.translate('CartoDBPlugin', 'Uploading {}').format(widget.layer.name())) self.ui.uploadingLB.show() self.ui.bar.clearWidgets() cartodbApi.upload(zipPath) def completeUpload(self, data): self.ui.uploadBar.hide() self.ui.uploadingLB.hide() self.ui.uploadBT.setEnabled(True) self.ui.bar.clearWidgets() self.ui.bar.pushMessage(QApplication.translate('CartoDBPlugin', 'Upload Complete'), level=QgsMessageBar.INFO, duration=5) def progressUpload(self, current, total): self.ui.uploadBar.setValue( math.ceil(float(current) / float(total) * 100)) def getSize(self, layer): filePath = layer.dataProvider().dataSourceUri() if filePath.find('|') != -1: filePath = filePath[0:filePath.find('|')] file = QFile(filePath) fileInfo = QFileInfo(file) dirName = fileInfo.dir().absolutePath() fileName = fileInfo.completeBaseName() size = 0 if layer.storageType() == 'ESRI Shapefile': for suffix in ['.shp', '.dbf', '.prj', '.shx']: file = QFile(os.path.join(dirName, fileName + suffix)) fileInfo = QFileInfo(file) size = size + fileInfo.size() elif layer.storageType() in ['GPX', 'GeoJSON', 'LIBKML']: size = size + fileInfo.size() return size def zipLayer(self, layer): filePath = layer.dataProvider().dataSourceUri() if filePath.find('|') != -1: filePath = filePath[0:filePath.find('|')] file = QFile(filePath) fileInfo = QFileInfo(file) dirName = fileInfo.dir().absolutePath() fileName = fileInfo.completeBaseName() tempdir = tempfile.tempdir if tempdir is None: tempdir = tempfile.mkdtemp() zipPath = os.path.join(tempdir, layer.name() + '.zip') zipFile = zipfile.ZipFile(zipPath, 'w') if layer.storageType() == 'ESRI Shapefile': for suffix in ['.shp', '.dbf', '.prj', '.shx']: if os.path.exists(os.path.join(dirName, fileName + suffix)): zipFile.write(os.path.join(dirName, fileName + suffix), fileName + suffix, zipfile.ZIP_DEFLATED) elif layer.storageType() == 'GeoJSON': zipFile.write(filePath, layer.name() + '.geojson', zipfile.ZIP_DEFLATED) else: geoJsonName = os.path.join(tempfile.tempdir, layer.name()) error = QgsVectorFileWriter.writeAsVectorFormat( layer, geoJsonName, "utf-8", None, "GeoJSON") if error == QgsVectorFileWriter.NoError: zipFile.write(geoJsonName + '.geojson', layer.name() + '.geojson', zipfile.ZIP_DEFLATED) ''' elif layer.storageType() == 'LIBKML': kmlName = os.path.join(tempfile.tempdir, layer.name()) error = QgsVectorFileWriter.writeAsVectorFormat(layer, kmlName, "utf-8", None, "GeoJSON") if error == QgsVectorFileWriter.NoError: zipFile.write(kmlName + '.geojson', layer.name() + '.geojson', zipfile.ZIP_DEFLATED) ''' zipFile.close() return zipPath def reject(self): # Back out of dialogue QDialog.reject(self)