Advertisement
Guest User

Untitled

a guest
Apr 27th, 2017
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.67 KB | None | 0 0
  1. ##QGEP=group
  2. ##QGEP_translate=name
  3. ##Layers_config_source_table=table
  4. ##Reset_layer_name=boolean
  5. ##Reset_layer_title=boolean
  6. ##Fields_config_source_table=table
  7. ##Reset_field_alias=boolean
  8. from qgis.core import *
  9. import re
  10. import json
  11.  
  12. class tools:
  13.  
  14. @staticmethod
  15. def getLayerFromLegendByTableProps(tableName, geomCol='geom', sql=''):
  16. '''
  17. Get the layer from QGIS legend
  18. corresponding to a database
  19. table name (postgis or sqlite)
  20. '''
  21. layer = None
  22. lr = QgsMapLayerRegistry.instance()
  23. for lid,l in lr.mapLayers().items():
  24. if not hasattr(l, 'providerType'):
  25. continue
  26. if hasattr(l, 'type') and l.type() != 0:
  27. continue
  28. if not l.providerType() in (u'postgres', u'spatialite'):
  29. continue
  30.  
  31. connectionParams = getConnectionParameterFromDbLayer(l)
  32.  
  33. import re
  34.  
  35. reg = r'(\.| )?(%s)' % tableName
  36. if connectionParams and \
  37. ( \
  38. connectionParams['table'] == tableName or \
  39. ( re.findall(reg, '%s' % connectionParams['table']) and re.findall(reg, '%s' % connectionParams['table'])[0] ) \
  40. ) and \
  41. connectionParams['geocol'] == geomCol:
  42. #and connectionParams['sql'] == sql:
  43. return l
  44.  
  45. return layer
  46.  
  47. @staticmethod
  48. def getConnectionParameterFromDbLayer(layer):
  49. '''
  50. Get connection parameters
  51. from the layer datasource
  52. '''
  53. connectionParams = None
  54.  
  55. # Get params via regex
  56. uri = layer.dataProvider().dataSourceUri()
  57. reg = "(?:dbname='([^']+)' )?(?:service=([^ ]+) )?(?:host=([^ ]+) )?(?:port=([0-9]+) )?(?:user='([^ ]+)' )?(?:password='([^ ]+)' )?(?:sslmode=([^ ]+) )?(?:key='([^ ]+)' )?(?:estimatedmetadata=([^ ]+) )?(?:srid=([0-9]+) )?(?:type=([a-zA-Z]+) )?(?:table=\"(.+)\" )?(?:geomcol=([^ ]+)\) )?(?:sql=(.*))?"
  58. result = re.findall(r'%s' % reg, uri)
  59. if not result:
  60. return None
  61.  
  62. res = result[0]
  63. if not res:
  64. return None
  65.  
  66. dbname = res[0]
  67. service = res[1]
  68. host = res[2]
  69. port = res[3]
  70. user = res[4]
  71. password = res[5]
  72. sslmode = res[6]
  73. key = res[7]
  74. estimatedmetadata = res[8]
  75. srid = res[9]
  76. gtype = res[10]
  77. table = res[11]
  78. geocol = res[12]
  79. sql = res[13]
  80.  
  81. schema = ''
  82.  
  83. if ' FROM ' not in table:
  84. if re.search('"\."', table):
  85. table = '"' + table + '"'
  86. sp = table.replace('"', '').split('.')
  87. schema = sp[0]
  88. table = sp[1]
  89. else:
  90. reg = r'\* FROM ([^\)]+)?(\))?'
  91. f = re.findall(r'%s' % reg, table)
  92.  
  93. if f and f[0]:
  94. sp = f[0][0].replace('"', '').split('.')
  95. if len(sp) > 1:
  96. schema = sp[0].replace('\\', '')
  97. table = sp[1]
  98. else:
  99. table = sp[0]
  100. else:
  101. return None
  102.  
  103.  
  104. if layer.providerType() == u'postgres':
  105. dbType = 'postgis'
  106. else:
  107. dbType = 'spatialite'
  108.  
  109. connectionParams = {
  110. 'dbname' : dbname,
  111. 'service' : service,
  112. 'host' : host,
  113. 'port': port,
  114. 'user' : user,
  115. 'password': password,
  116. 'sslmode' : sslmode,
  117. 'key': key,
  118. 'estimatedmetadata' : estimatedmetadata,
  119. 'srid' : srid,
  120. 'type': gtype,
  121. 'schema': schema,
  122. 'table' : table,
  123. 'geocol' : geocol,
  124. 'sql' : sql,
  125. 'dbType': dbType
  126. }
  127.  
  128. return connectionParams
  129.  
  130. # Get vector layer objects
  131. ltable= processing.getObject(Layers_config_source_table)
  132. ftable= processing.getObject(Fields_config_source_table)
  133.  
  134. # Create dictionnary to store data to use
  135. fdata = {}
  136.  
  137. # Get layers
  138. layers = QgsMapLayerRegistry.instance().mapLayers().values()
  139.  
  140. # Read data to use and store it into data
  141. tableFeatures = ftable.getFeatures()
  142. for f in tableFeatures:
  143. d = f['field_name_fr']
  144. if len(f['field_description_fr']) < 5:
  145. d+= ' %s ' % f['field_description_fr']
  146. fdata[ f['field_name'] ] = d
  147.  
  148. # Apply aliases on layers
  149. for layer in layers:
  150. progress.setInfo( '===== LAYER FIELDS ALIASES: ' + layer.name())
  151. if not hasattr( layer, 'pendingFields'):
  152. continue
  153. for i, field in enumerate(layer.pendingFields()):
  154. fname = re.sub('^(fk_|ws_|_|co_|[a-z]+_fk_)', '', field.name())
  155. if fname in fdata:
  156. alias = ''
  157. if not Reset_field_alias:
  158. alias = fdata[fname]
  159. layer.addAttributeAlias(i, alias)
  160. progress.setInfo( ' * Field : ' + field.name() + ' -> %s' % alias )
  161.  
  162.  
  163. # Read data to use and store it into data
  164. tableFeatures = ltable.getFeatures()
  165. tdata = {}
  166. for f in tableFeatures:
  167. d = f['name_fr']
  168. tdata[ f['tablename'] ] = d
  169.  
  170. progress.setInfo( '')
  171. progress.setInfo( '===== LAYERS METADATA ===== ')
  172.  
  173. # Apply title and name on layers
  174. for layer in layers:
  175. progress.setInfo( '== LAYER : ' + layer.name())
  176. cp = {}
  177. cp = tools.getConnectionParameterFromDbLayer(layer)
  178. if not cp:
  179. continue
  180. table = cp['table']
  181. table = re.sub('^(vw(_qgep)?)?_', 'od_', table)
  182. if table in tdata:
  183. title = ''
  184. if not Reset_layer_title:
  185. title = tdata[table]
  186. layer.setTitle(title)
  187. lname = table
  188. if not Reset_layer_name:
  189. lname = tdata[table]
  190. layer.setName(lname)
  191. progress.setInfo( ' * Title : -> %s' % tdata[table] )
  192.  
  193.  
  194. output = 'test'
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement