def syncFeatures(self, features, vectorLayerDescriptor):        
     try:
         self.csvDataSourceHandler.syncFeaturesWithCsv(vectorLayerDescriptor, features)
         NotificationHandler.pushSuccess(QApplication.translate('VectorLayerController', 'CSV File updated'), QApplication.translate('VectorLayerController', 'Changes to layer "{}" successfully stored in csv file.').format(self.csvVectorLayer().qgsVectorLayer.name()))            
         return True
     except:                       
         VectorLayerSaveConflictController(self.csvVectorLayer(), self.csvDataSourceHandler).handleConflict()
         return False
 def _onConflictSaveAsButton(self):        
     filePath = QFileDialog.getSaveFileName(self.conflictDialog, QApplication.translate('VectorLayerSaveConflictController', 'Save File'), "", QApplication.translate('VectorLayerSaveConflictController', 'Files (*.csv *.tsv *.*)'));
     if filePath:
         self.conflictDialog.accept()
         try:
             self.csvDataSourceHandler.moveDataSourcesToPath(filePath)
             self.csvDataSourceHandler.syncFeaturesWithCsv(self.csvVectorLayer().vectorLayerDescriptor, self.features, filePath)
             self.csvVectorLayer().updateGeoCsvPath(filePath)
             NotificationHandler.pushSuccess(QApplication.translate('VectorLayerSaveConflictController', 'CSV File updated'), QApplication.translate('VectorLayerSaveConflictController', 'Changes to layer "{}" successfully stored in csv file.').format(self.csvVectorLayer().qgsVectorLayer.name()))
         except:                
             QMessageBox.information(None, QApplication.translate('VectorLayerSaveConflictController', 'Invalid path'), QApplication.translate('VectorLayerSaveConflictController', 'An error occured while trying to save file on new location. Please try again.'))            
 def _onCharsetConvert(self):
     csvFilePath = self.newDialog.filePath.text()
     encoding = self.newDialog.charsetDropDown.currentText()
     try:
         GeoCsvDataSourceHandler.createBackupFile(csvFilePath)
         NotificationHandler.pushInfo(QApplication.translate('GeoCsvNewController', 'backup created'), QApplication.translate('GeoCsvNewController', 'Created backup on "{}"').format(csvFilePath))
         GeoCsvDataSourceHandler.convertFileToUTF8(csvFilePath, encoding)
         NotificationHandler.pushSuccess(QApplication.translate('GeoCsvNewController', 'Converted'), QApplication.translate('GeoCsvNewController', 'Successfully converted to utf-8'))
         self._analyseCsv()
     except:
         self.newDialog.statusNotificationLabel.setText(QApplication.translate('GeoCsvNewController', 'error in converting'))
 def reconnectCsvVectorLayers(self, csvVectorLayers):
     layers = QgsMapLayerRegistry.instance().mapLayers()
     for qgsLayer in layers.itervalues():
         csvFilePath = qgsLayer.customProperty('editablegeocsv_path', '') 
         if csvFilePath:                
             try:        
                 dataSourceHandler = GeoCsvDataSourceHandler(csvFilePath)
                 vectorLayerDescriptor = dataSourceHandler.createCsvVectorDescriptorFromCsvt()
                 if not dataSourceHandler.hasPrj():
                     dataSourceHandler.updatePrjFile(qgsLayer.crs().toWkt())
                 csvVectorLayer = GeoCsvVectorLayerFactory.createCsvVectorLayer(dataSourceHandler, vectorLayerDescriptor, qgsLayer)
                 vectorLayerController = VectorLayerController(csvVectorLayer, dataSourceHandler)
                 csvVectorLayer.initController(vectorLayerController)                    
                 csvVectorLayers.append(csvVectorLayer)
                 NotificationHandler.pushSuccess(QApplication.translate('GeoCsvReconnectController', 'GeoCSV Layer reconnected'), QApplication.translate('GeoCsvReconnectController', 'Layer "{}" is successfully reconnected').format(qgsLayer.name()))                                                    
             except:                  
                 GeoCsvNewController.getInstance().createCsvVectorLayer(csvVectorLayers, qgsLayer, QApplication.translate('GeoCsvReconnectController', 'Couldn\'t automatically restore csv layer "{}"').format(qgsLayer.name()))
 def createCsvVectorLayer(self, csvVectorLayers, qgsVectorLayer=None, customTitle=None):
     if self.newDialog.isVisible():
         self.newDialog.reject()                                
     # enable help hyperlink
     self.newDialog.helpLabel.setOpenExternalLinks(True)                            
     self.dataSourceHandler = None
     self.vectorDescriptor = None 
     self.csvtFileIsDirty = False                       
     if customTitle:
         self.newDialog.setWindowTitle(customTitle)
     if qgsVectorLayer:
         csvPath = qgsVectorLayer.customProperty('editablegeocsv_path')
         if csvPath:
             self.newDialog.filePath.setText(csvPath)
     self._updateAcceptButton()
     self._analyseCsv()
     self.newDialog.show()        
     #wait for user input
     result = self.newDialog.exec_()
     #if user pressed ok
     if result == 1:
         if self.dataSourceHandler and self.vectorDescriptor:                                
             csvVectorLayer = GeoCsvVectorLayerFactory.createCsvVectorLayer(self.dataSourceHandler, self.vectorDescriptor, qgsVectorLayer)
             vectorLayerController = VectorLayerController(csvVectorLayer, self.dataSourceHandler)
             csvVectorLayer.initController(vectorLayerController)                                                                        
             QgsMapLayerRegistry.instance().addMapLayer(csvVectorLayer.qgsVectorLayer)
             NotificationHandler.pushSuccess(QApplication.translate('GeoCsvNewController', 'GeoCSV Layer created'), QApplication.translate('GeoCsvNewController', 'The layer "{}" was created successfully.').format(csvVectorLayer.qgsVectorLayer.name()))                
             csvVectorLayers.append(csvVectorLayer)
             if self.csvtFileIsDirty:
                 try:
                     self.dataSourceHandler.updateCsvtFile(self.vectorDescriptor.getAttributeTypes())
                     NotificationHandler.pushInfo(QApplication.translate('GeoCsvNewController', 'CSVT File created/updated.'), QApplication.translate('GeoCsvNewController', 'The CSVT file was successfully created/updated on disk.'))
                 except FileIOException:                                                
                     NotificationHandler.pushWarning(QApplication.translate('GeoCsvNewController', 'CSVT File Error'), QApplication.translate('GeoCsvNewController', 'The csvt file couldn\'t be updated on disk.'))         
             if not self.dataSourceHandler.hasPrj():
                 self.dataSourceHandler.updatePrjFile(csvVectorLayer.qgsVectorLayer.crs().toWkt())
                 NotificationHandler.pushInfo(QApplication.translate('GeoCsvNewController', 'PRJ File created.'), QApplication.translate('GeoCsvNewController', 'The PRJ file was successfully created on disk.'))