Skip to content

Instantly share code, notes, and snippets.

@slarosa
Created February 11, 2017 07:29
Show Gist options
  • Save slarosa/828e5a882a6512a7a2630bf3f4074337 to your computer and use it in GitHub Desktop.
Save slarosa/828e5a882a6512a7a2630bf3f4074337 to your computer and use it in GitHub Desktop.
#!/usr/bin/env python
# -*- coding:utf-8 -*-
from PyQt4.QtCore import QFileInfo
import dropbox
import tempfile
import glob
import os
import datetime
import xml.etree.ElementTree as ET
def getPrjLayers():
vlayers = []
rlayers = []
prj = QgsProject.instance()
root = prj.layerTreeRoot()
layerNodes = root.findLayers()
for node in layerNodes:
if node.layer().type() == QgsVectorLayer.VectorLayer:
if node.layer().storageType() == 'ESRI Shapefile' or node.layer().providerType() == 'postgres':
vlayers.append(node.layer())
if node.layer().type() == QgsVectorLayer.RasterLayer:
rlayers.append(node.layer())
return vlayers, rlayers
def getPathLayers(vlayers, rlayers):
paths = []
for l in vlayers:
if l.providerType() == 'postgres':
crs = l.crs()
encoding = l.dataProvider().encoding()
out_file = '{0}/{1}.shp'.format(tempfile.gettempdir(), l.name())
error = QgsVectorFileWriter.writeAsVectorFormat(l, out_file, encoding, crs)
if error != QgsVectorFileWriter.NoError:
print 'Cannot copy layer {}'.format(l.name())
return
paths.append(out_file)
else:
paths.append(l.source())
for r in rlayers:
paths.append(r.source())
return paths
def copySourceLayersToDropbox(paths):
for path in paths:
dir = QFileInfo(path).path()
basename = QFileInfo(path).baseName()
files = glob.glob(os.path.join(dir, basename) + '.*')
for f in files:
dropbox_file_name = os.path.join(MAIN_FOLDER, 'data', QFileInfo(f).fileName())
with open(f, 'rb') as fd:
client.put_file(dropbox_file_name, fd)
def updateProjectFile():
with open(PRJ_FILEPATH, 'wb') as f:
f.write(open(SAVED_PRJ_FILE, 'r').read())
tree = ET.parse(PRJ_FILEPATH)
root = tree.getroot()
vlayers, rlayers = getPrjLayers()
layers = list(set(vlayers).union(rlayers))
for layer in layers:
for maplayer in root.iter('maplayer'):
if layer.id() == maplayer.find('id').text:
maplayer.find('datasource').text = u'./data/' + layer.name() + '.shp'
maplayer.find('provider').text = u'ogr'
tree.write(PRJ_FILEPATH)
with open(PRJ_FILEPATH, 'rb') as fd:
client.put_file(os.path.join(MAIN_FOLDER, PRJ_FILENAME), fd)
TOKEN = 'your_token_here'
SAVED_PRJ_FILE = QgsProject.instance().fileName()
PRJ_FILENAME = QFileInfo(SAVED_PRJ_FILE).fileName()
PRJ_FILEPATH = os.path.join(tempfile.gettempdir(), PRJ_FILENAME)
SUFFIX_PRJNAME = datetime.datetime.now().strftime("%Y%m%d%H%M%S")
MAIN_FOLDER = '-'.join([PRJ_FILENAME[:-4], SUFFIX_PRJNAME])
client = dropbox.client.DropboxClient(TOKEN)
vlayers, rlayers = getPrjLayers()
paths = getPathLayers(vlayers, rlayers)
copySourceLayersToDropbox(paths)
updateProjectFile()
shared_link = client.share(MAIN_FOLDER, short_url=True)
print shared_link['url']
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment