Bläddra i källkod

zmeny poradi hromadne, oprava vrstvy katastry

Honza 5 år sedan
förälder
incheckning
80c5f0eab0

+ 33 - 19
Atlas.py

@@ -404,6 +404,7 @@ class Atlas:
         self.dlg.pushButton_defaultExtent.setStyleSheet("#pushButton_defaultExtent {color: #fff !important;text-transform: uppercase;  text-decoration: none;   background: #72c02c;   padding: 20px;  border-radius: 50px;    display: inline-block; border: none;transition: all 0.4s ease 0s;} #pushButton_defaultExtent:hover{background: #66ab27 ;}#pushButton_defaultExtent:disabled{background: #64818b ;}")
         self.dlg.pushButton_CreateComposition.setStyleSheet("#pushButton_CreateComposition {color: #fff !important;text-transform: uppercase;  text-decoration: none;   background: #72c02c;   padding: 20px;  border-radius: 50px;    display: inline-block; border: none;transition: all 0.4s ease 0s;} #pushButton_CreateComposition:hover{background: #66ab27 ;}#pushButton_CreateComposition:disabled{background: #64818b ;}")
         self.dlg.pushButton_close.setStyleSheet("#pushButton_close {color: #fff !important;text-transform: uppercase;  text-decoration: none;   background: #72c02c;   padding: 20px;  border-radius: 50px;    display: inline-block; border: none;transition: all 0.4s ease 0s;} #pushButton_close:hover{background: #66ab27 ;}")
+        
         self.dlg.setStyleSheet("#DialogBase {background: #f0f0f0 ;}")
 
         self.dlg.show()
@@ -426,6 +427,7 @@ class Atlas:
        # self.dlg.pushButton_deleteMap.clicked.connect(lambda: self.deleteMapFromCanvas(self.dlg.listWidget.currentRow())) 
         self.dlg.pushButton_up.clicked.connect(lambda: self.reorderLayers(self.dlg.listWidget_listLayers.currentRow(), 1, self.dlg.listWidget.currentRow()))
         self.dlg.pushButton_down.clicked.connect(lambda: self.reorderLayers(self.dlg.listWidget_listLayers.currentRow(), -1, self.dlg.listWidget.currentRow()))
+        self.dlg.pushButton_saveOrder.clicked.connect(lambda: self.saveReorder(self.dlg.listWidget.currentRow()))
 
 
         if not self.loadedInMemory:
@@ -482,7 +484,7 @@ class Atlas:
         self.dlg.pushButton_deleteLayers.clicked.connect(lambda: self.deteteLayerFromComposite(self.dlg.listWidget.currentRow(),self.dlg.listWidget_listLayers.currentRow(), self.dlg.listWidget_listLayers.currentItem().text()))    
         self.dlg.show()
         self.dlg.pushButton_close.clicked.connect(lambda: self.dlg.close())
-
+        self.dlg.pushButton_saveOrder.setEnabled(False)
         self.dlg.pushButton_down.setStyleSheet("#pushButton_down {color: #fff !important;text-transform: uppercase;  text-decoration: none;   background: #72c02c;   padding: 20px;  border-radius: 50px;    display: inline-block; border: none;transition: all 0.4s ease 0s;} #pushButton_down:hover{background: #66ab27 ;}#pushButton_down:disabled{background: #64818b ;}")
         self.dlg.pushButton_up.setStyleSheet("#pushButton_up {color: #fff !important;text-transform: uppercase;  text-decoration: none;   background: #72c02c;   padding: 20px;  border-radius: 50px;    display: inline-block; border: none;transition: all 0.4s ease 0s;} #pushButton_up:hover{background: #66ab27 ;}#pushButton_up:disabled{background: #64818b ;}")
         self.dlg.pushButton.setStyleSheet("#pushButton {color: #fff !important;text-transform: uppercase;  text-decoration: none;   background: #72c02c;   padding: 20px;  border-radius: 50px;    display: inline-block; border: none;transition: all 0.4s ease 0s;} #pushButton:hover{background: #66ab27 ;}#pushButton:disabled{background: #64818b ;}")
@@ -495,6 +497,7 @@ class Atlas:
         self.dlg.pushButton_loadMapWFS.setStyleSheet("#pushButton_loadMapWFS {color: #fff !important;text-transform: uppercase;  text-decoration: none;   background: #72c02c;   padding: 20px;  border-radius: 50px;    display: inline-block; border: none;transition: all 0.4s ease 0s;} #pushButton_loadMapWFS:hover{background: #66ab27 ;}#pushButton_loadMapWFS:disabled{background: #64818b ;}")
         self.dlg.pushButton_loadMap.setStyleSheet("#pushButton_loadMap {color: #fff !important;text-transform: uppercase;  text-decoration: none;   background: #72c02c;   padding: 20px;  border-radius: 50px;    display: inline-block; border: none;transition: all 0.4s ease 0s;} #pushButton_loadMap:hover{background: #66ab27 ;}#pushButton_loadMap:disabled{background: #64818b ;}")
         self.dlg.setStyleSheet("#DialogBase {background: #f0f0f0 ;}")
+        self.dlg.pushButton_saveOrder.setStyleSheet("#pushButton_saveOrder {color: #fff !important;text-transform: uppercase;  text-decoration: none;   background: #72c02c;   padding: 20px;  border-radius: 50px;    display: inline-block; border: none;transition: all 0.4s ease 0s;} #pushButton_saveOrder:hover{background: #66ab27 ;}#pushButton_saveOrder:disabled{background: #64818b ;}")
         
 
 
@@ -696,8 +699,9 @@ class Atlas:
         self.dlg.pushButton_editMeta.setEnabled(True)
         self.dlg.pushButton_addRaster.setEnabled(True)       
 
-            
-
+    def saveReorder(self, x):
+        self.importMap(x, 'mod')
+        self.dlg.pushButton_saveOrder.setEnabled(False)
     def checkUsername(self, name):
         n = name.split("@")
         if(len(n[0]) > 0):
@@ -878,6 +882,7 @@ class Atlas:
             return True
 
     def reorderLayers(self, pos, order, x):
+        self.dlg.pushButton_saveOrder.setEnabled(True)
         self.compositeList[x]['layers']
         i = 0
         compositeLength = len(self.compositeList[x]['layers'])
@@ -899,7 +904,7 @@ class Atlas:
 
                 i = i + 1
             print(self.compositeList[x]['layers'])
-            self.importMap(x, 'mod')
+            
             self.refreshLayerList()
             self.dlg.listWidget_listLayers.setCurrentRow(pos + order)
 
@@ -909,7 +914,7 @@ class Atlas:
         except:
             layer = it.text()##pro listWidget
         try:
-            url = self.URI+'/rest/' +self.laymanUsername+'/layers/'+str(layer).lower()+'/thumbnail'    
+            url = self.URI+'/rest/' +self.laymanUsername+'/layers/'+str(layer).lower().replace(" ","_")+'/thumbnail'    
             data = urlopen(url).read()
             pixmap = QPixmap(200, 200)
             pixmap.loadFromData(data)
@@ -924,7 +929,7 @@ class Atlas:
         except:
             layer = it.text()##pro listWidget
         try:
-            url = self.URI+'/rest/'+self.laymanUsername+'/layers/'+str(layer).lower()+'/thumbnail'    
+            url = self.URI+'/rest/'+self.laymanUsername+'/layers/'+str(layer).lower().replace(" ","_")+'/thumbnail'    
             data = urlopen(url).read()
             pixmap = QPixmap(170, 170)
             pixmap.loadFromData(data)
@@ -1262,7 +1267,8 @@ class Atlas:
         
     def saveLocalFile(self):
         
-        layer = self.iface.activeLayer() 
+        layer = self.iface.activeLayer()       
+        print(layer.commitChanges()) ## změny uloženy
         path = iface.activeLayer().dataProvider().dataSourceUri()
         path = path.split("|")[0].replace("'","")
         if (layer == None):
@@ -1278,7 +1284,8 @@ class Atlas:
             dialog.setDirectory(defaultDir)
             print(dialog.directory().path())
            # layer_name = dialog.getSaveFileName(None, "Save file", QDir().homePath() +os.sep+ str(layer.name()) + ".geojson", "*.geojson")        
-            layer_name = dialog.getSaveFileName(None, "Save file", defaultDir +os.sep+ str(layer.name()) + ".geojson", "*.geojson")        
+            layer_name = dialog.getSaveFileName(None, "Save file", defaultDir +os.sep+ str(layer.name()) + ".geojson", "*.geojson")   
+            
             self.json_export_local(layer_name[0], layer)
 
     def json_export_local(self, layer_name, lay):     
@@ -1323,7 +1330,7 @@ class Atlas:
                     print(tempFile, layer_name)
                     shutil.copy(tempFile, layer_name)
                     shutil.copy(sld_temp_filename, layer_name.replace(".geojson", ".sld"))
-                    shutil.copy(sld_temp_filename, layer_name.replace(".geojson", ".qml"))
+                    shutil.copy(qml_temp_filename, layer_name.replace(".geojson", ".qml"))
                     self.loadJsonLayer(layer_name)
                 
             else:                
@@ -1473,6 +1480,7 @@ class Atlas:
         #if not (re.match('[a-zA-Z0-9]', layer_name)): ## není povolena diakritika
         #    QMessageBox.information(None, "Layman", "Diacritics is not allowed.")
         #    nameCheck = False
+
         if (re.match('[0-9]{1}', layer_name)): ## nesmí být nesmysl v názvu na prvním místě
             QMessageBox.information(None, "Layman", "Number in first character is not allowed.")
             nameCheck = False
@@ -1493,6 +1501,7 @@ class Atlas:
             
             if (self.checkValidAttributes(layer_name)):
                 if (self.checkExistingLayer(layer_name)):
+                    
                     print("vrstva již existuje")
                     msgbox = QMessageBox(QMessageBox.Question, "Layman", "Layer "+layer_name+" already exists in server. Do you want overwrite it´s geometry?")
                     msgbox.addButton(QMessageBox.Yes)
@@ -1863,10 +1872,13 @@ class Atlas:
 
 
     def patchLayer(self, layer_name, data):
-        self.layerName = layer_name
+        print("patch layer")
         self.json_export(layer_name)
+        self.layerName = layer_name.lower()
+        
         sldPath = self.getTempPath(self.layerName).replace("geojson", "sld")
         geoPath = self.getTempPath(self.layerName)
+        ##self.layerName = self.layerName
         print(sldPath)
         if(os.path.isfile(sldPath)): ## existuje sld?
             files = [('file', open(geoPath, 'rb')), ('sld', open(sldPath, 'rb'))]
@@ -1874,6 +1886,8 @@ class Atlas:
         else:
             files = {'file': (geoPath, open(geoPath, 'rb')),}  
             print("ne sld")
+        layer_name = layer_name.lower()
+        layer_name = layer_name.replace(" ", "_")
         url = self.URI+'/rest/'+self.laymanUsername+"/layers/" + layer_name
         print(url)
         r = requests.patch(url, files=files, data = data, headers = self.authHeader, verify=False)
@@ -2143,12 +2157,12 @@ class Atlas:
     def postInChunks(self, layer_name, reqType):
         print(reqType)
         if (reqType == "patch"):
-            url = self.URI+'/rest/'+self.laymanUsername+'/layers/'+layer_name
+            url = self.URI+'/rest/'+self.laymanUsername+'/layers/'+layer_name.lower().replace(" ", "_")
             r = requests.delete(url,headers = self.authHeader)
            # print(r.content)
-         
+        
         self.registerLayer(layer_name)
-
+        layer_name = str(layer_name).lower() 
         filePath = os.path.join(tempfile.gettempdir(), "atlas_chunks" ) ## chunky se ukládají do adresáře v tempu
         
         if not (os.path.exists(filePath)):
@@ -2158,8 +2172,8 @@ class Atlas:
         arr = []
         for piece in self.read_in_chunks(f):
             arr.append(piece)
-        layer_name = layer_name.lower()
-        url = self.URI+'/rest/'+self.laymanUsername+'/layers/'+layer_name+'/chunk'     
+        ##layer_name = layer_name.lower()
+        url = self.URI+'/rest/'+self.laymanUsername+'/layers/'+layer_name.lower().replace(" ", "_")+'/chunk'     
         resumableFilename = layer_name+'.geojson'
         layman_original_parameter = "file"  
         resumableTotalChunks = len(arr)
@@ -2179,7 +2193,7 @@ class Atlas:
                 f = open(filePath + os.sep+"chunk"+str(i)+".geojson", "wb")
                 f.write(bytearray(arr[i-1]))
                 f.close()              
-                files = {'file': (layer_name+".geojson", open(filePath +os.sep+ "chunk"+str(i)+".geojson", 'rb')),}              
+                files = {'file': (layer_name.lower().replace(" ", "_")+".geojson", open(filePath +os.sep+ "chunk"+str(i)+".geojson", 'rb')),}              
                 response = requests.post(url, files = files, data=payload, headers = self.authHeader)
 
                 print(response.content)
@@ -2209,9 +2223,9 @@ class Atlas:
                
                 data = {'grant_type':'refresh_token',
                         'refresh_token': self.refresh_token,
-                        'client_id':'id-3462f94b-875c-9185-4ced-b69841f24b3', 
+                        'client_id': self.client_id,   ##'id-3462f94b-875c-9185-4ced-b69841f24b3', 
                         'redirect_uri':'http://localhost:3000/client/authn/oauth2-liferay/callback', 
-                        'code_verifier':'test'
+                        'code_verifier':self.code_verifier  ##'test'
                         } 
                 
                 r = requests.post(url = tokenEndpoint, data = data, headers = self.authHeader) 
@@ -2236,7 +2250,7 @@ class Atlas:
         self.dlg.pushButton_Continue.setEnabled(True)
 
         self.menu_Connection.setEnabled(True)
-        self.menu_saveLocalFile.setEnabled(True)
+        self.menu_saveLocalFile.setEnabled(False)
         self.menu_loadJson.setEnabled(True)
         self.menu_ImportLayerDialog.setEnabled(True)
         self.menu_AddLayerDialog.setEnabled(True) 

BIN
__pycache__/Atlas.cpython-37.pyc


+ 44 - 0
dlg_importMap (2).py

@@ -0,0 +1,44 @@
+# -*- coding: utf-8 -*-
+"""
+/***************************************************************************
+ CartoDBDialog
+                                 A QGIS plugin
+ CartoDB plugin
+ Generated by Plugin Builder: http://g-sherman.github.io/Qgis-Plugin-Builder/
+                             -------------------
+        begin                : 2019-03-19
+        git sha              : $Format:%H$
+        copyright            : (C) 2019 by Ondřej Tomančák, Jan Vrobel
+        email                : vrobel.jan@seznam.cz
+ ***************************************************************************/
+
+/***************************************************************************
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU General Public License as published by  *
+ *   the Free Software Foundation; either version 2 of the License, or     *
+ *   (at your option) any later version.                                   *
+ *                                                                         *
+ ***************************************************************************/
+"""
+
+import os
+
+from PyQt5 import uic
+from PyQt5 import QtWidgets
+
+# This loads your .ui file so that PyQt can populate your plugin with the elements from Qt Designer
+FORM_CLASS, _ = uic.loadUiType(os.path.join(
+    os.path.dirname(__file__), 'dlg_importLayer.ui'))
+
+
+class ImportLayerDialog(QtWidgets.QDialog, FORM_CLASS):
+    def __init__(self, parent=None):
+        """Constructor."""
+        super(ImportLayerDialog, self).__init__(parent)
+        # Set up the user interface from Designer through FORM_CLASS.
+        # After self.setupUi() you can access any designer object by doing
+        # self.<objectname>, and you can use autoconnect slots - see
+        # http://qt-project.org/doc/qt-4.8/designer-using-a-ui-file.html
+        # #widgets-and-dialogs-with-auto-connect
+        self.setupUi(self)

+ 55 - 0
dlg_importMap (2).ui

@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>CartoDBDialogBase</class>
+ <widget class="QDialog" name="CartoDBDialogBase">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>400</width>
+    <height>300</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Layman</string>
+  </property>
+  <widget class="QListWidget" name="listWidget_listLayers">
+   <property name="geometry">
+    <rect>
+     <x>10</x>
+     <y>10</y>
+     <width>381</width>
+     <height>191</height>
+    </rect>
+   </property>
+  </widget>
+  <widget class="QPushButton" name="pushButton_importLayer">
+   <property name="geometry">
+    <rect>
+     <x>70</x>
+     <y>220</y>
+     <width>88</width>
+     <height>27</height>
+    </rect>
+   </property>
+   <property name="text">
+    <string>Import layer</string>
+   </property>
+  </widget>
+  <widget class="QPushButton" name="pushButton_close">
+   <property name="geometry">
+    <rect>
+     <x>230</x>
+     <y>220</y>
+     <width>93</width>
+     <height>28</height>
+    </rect>
+   </property>
+   <property name="text">
+    <string>Close</string>
+   </property>
+  </widget>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>

+ 19 - 2
dlg_importMap.ui

@@ -101,7 +101,7 @@
     <property name="geometry">
      <rect>
       <x>22</x>
-      <y>290</y>
+      <y>330</y>
       <width>161</width>
       <height>27</height>
      </rect>
@@ -134,7 +134,7 @@
     <property name="geometry">
      <rect>
       <x>52</x>
-      <y>370</y>
+      <y>390</y>
       <width>181</width>
       <height>16</height>
      </rect>
@@ -284,6 +284,23 @@
      <string>Down</string>
     </property>
    </widget>
+   <widget class="QPushButton" name="pushButton_saveOrder">
+    <property name="geometry">
+     <rect>
+      <x>20</x>
+      <y>290</y>
+      <width>161</width>
+      <height>27</height>
+     </rect>
+    </property>
+    <property name="text">
+     <string>Save order</string>
+    </property>
+    <property name="icon">
+     <iconset>
+      <normaloff>../../../../../../../Users/Honza/.designer/backup/icons/minus.png</normaloff>../../../../../../../Users/Honza/.designer/backup/icons/minus.png</iconset>
+    </property>
+   </widget>
   </widget>
   <widget class="QGroupBox" name="groupBox_2">
    <property name="geometry">

+ 47 - 0
flask/flask.py

@@ -0,0 +1,47 @@
+# -*- coding: utf-8 -*-
+"""
+Created on Wed Nov 20 16:17:30 2019
+
+@author: Honza
+"""
+
+from flask import Flask, request, jsonify
+import requests
+import json
+import tempfile
+import os
+
+app = Flask(__name__)
+
+def writeCode(value):
+    path = tempfile.gettempdir() + os.sep + "atlas" + os.sep + "auth.txt" 
+    #path = r'C:\Users\Honza\AppData\Local\Temp\test.txt'
+    f = open(path, "w")
+    f.write(value)
+    f.close()
+
+@app.route('/')
+def hello():
+    return "Hello World!"
+
+
+@app.route('/<name>')
+def hello_name(name):
+    return "Hello {}!".format(name)
+
+@app.route("/client/authn/oauth2-liferay/callback", methods=['POST', 'GET', 'HEAD', 'OPTIONS'])
+def form_to_json():
+    data = request.form.to_dict(flat=False)
+    code = request.args.get('code')
+    writeCode(code)
+    #return (code)
+    return "Authorize code optained. Please continue with QGIS plugin."
+
+#@app.route("/client/authn/oauth2-liferay/code", methods=['POST', 'GET', 'HEAD', 'OPTIONS'])
+#def sendCode():   
+#    API_ENDPOINT = "http://localhost:3000/client/authn/oauth2-liferay/callback"
+#    return (authCode)    
+#  #  return jsonify(c)
+
+if __name__ == '__main__':
+    app.run(host='0.0.0.0', port=3000)

+ 47 - 0
flask_listener/flask_test.py

@@ -0,0 +1,47 @@
+# -*- coding: utf-8 -*-
+"""
+Created on Wed Nov 20 16:17:30 2019
+
+@author: Honza
+"""
+
+from flask import Flask, request, jsonify
+import requests
+import json
+import tempfile
+import os
+
+app = Flask(__name__)
+
+def writeCode(value):
+    path = tempfile.gettempdir() + os.sep + "atlas" + os.sep + "auth.txt" 
+    #path = r'C:\Users\Honza\AppData\Local\Temp\test.txt'
+    f = open(path, "w")
+    f.write(value)
+    f.close()
+
+@app.route('/')
+def hello():
+    return "Hello World!"
+
+
+@app.route('/<name>')
+def hello_name(name):
+    return "Hello {}!".format(name)
+
+@app.route("/client/authn/oauth2-liferay/callback", methods=['POST', 'GET', 'HEAD', 'OPTIONS'])
+def form_to_json():
+    data = request.form.to_dict(flat=False)
+    code = request.args.get('code')
+    writeCode(code)
+    #return (code)
+    return "Authorize code optained. Please continue with QGIS plugin."
+
+#@app.route("/client/authn/oauth2-liferay/code", methods=['POST', 'GET', 'HEAD', 'OPTIONS'])
+#def sendCode():   
+#    API_ENDPOINT = "http://localhost:3000/client/authn/oauth2-liferay/callback"
+#    return (authCode)    
+#  #  return jsonify(c)
+
+if __name__ == '__main__':
+    app.run(host='0.0.0.0', port=3000)

BIN
icons/layers.png


BIN
icons/map_download.png


BIN
icons/map_upload.png