def test_primary_keys_custom_property(self): source_folder = tempfile.mkdtemp() export_folder = tempfile.mkdtemp() shutil.copytree(os.path.join(test_data_folder(), 'pk_project'), os.path.join(source_folder, 'pk_project')) project = self.load_project( os.path.join(source_folder, 'pk_project', 'project.qgs')) extent = QgsRectangle() offline_editing = QgsOfflineEditing() offline_converter = OfflineConverter(project, export_folder, extent, offline_editing) offline_converter.convert() exported_project = self.load_project( os.path.join(export_folder, 'project_qfield.qgs')) if Qgis.QGIS_VERSION_INT < 31601: layer = exported_project.mapLayersByName('somedata (offline)')[0] else: layer = exported_project.mapLayersByName('somedata')[0] self.assertEqual( layer.customProperty('QFieldSync/sourceDataPrimaryKeys'), 'pk') shutil.rmtree(export_folder) shutil.rmtree(source_folder)
def test_copy(self): source_folder = tempfile.mkdtemp() export_folder = tempfile.mkdtemp() shutil.copytree(os.path.join(test_data_folder(), 'simple_project'), os.path.join(source_folder, 'simple_project')) project = self.load_project( os.path.join(source_folder, 'simple_project', 'project.qgs')) extent = QgsRectangle() offline_editing = QgsOfflineEditing() offline_converter = OfflineConverter(project, export_folder, extent, offline_editing) offline_converter.convert() files = os.listdir(export_folder) self.assertIn('project_qfield.qgs', files) self.assertIn('france_parts_shape.shp', files) self.assertIn('france_parts_shape.dbf', files) self.assertIn('curved_polys.gpkg', files) self.assertIn('spatialite.db', files) dcim_folder = os.path.join(export_folder, "DCIM") dcim_files = os.listdir(dcim_folder) self.assertIn('qfield-photo_1.jpg', dcim_files) self.assertIn('qfield-photo_2.jpg', dcim_files) self.assertIn('qfield-photo_3.jpg', dcim_files) dcim_subfolder = os.path.join(dcim_folder, "subfolder") dcim_subfiles = os.listdir(dcim_subfolder) self.assertIn('qfield-photo_sub_1.jpg', dcim_subfiles) self.assertIn('qfield-photo_sub_2.jpg', dcim_subfiles) self.assertIn('qfield-photo_sub_3.jpg', dcim_subfiles) shutil.rmtree(export_folder) shutil.rmtree(source_folder)
def test_copy(self): source_folder = tempfile.mkdtemp() export_folder = tempfile.mkdtemp() shutil.copytree(os.path.join(test_data_folder(), 'simple_project'), os.path.join(source_folder, 'simple_project')) project = self.load_project(os.path.join(source_folder, 'simple_project', 'project.qgs')) extent = QgsRectangle() offline_editing = QgsOfflineEditing() offline_converter = OfflineConverter(project, export_folder, extent, offline_editing) offline_converter.convert() files = os.listdir(export_folder) self.assertIn('project_qfield.qgs', files) self.assertIn('france_parts_shape.shp', files) self.assertIn('france_parts_shape.dbf', files) self.assertIn('curved_polys.gpkg', files) self.assertIn('spatialite.db', files) shutil.rmtree(export_folder) shutil.rmtree(source_folder)
def convert_to_offline(self, db, surveyor_expression_dict, export_dir): sys.path.append(PLUGINS_DIR) from qfieldsync.core.layer import LayerSource, SyncAction from qfieldsync.core.offline_converter import OfflineConverter from qfieldsync.core.project import ProjectConfiguration project = QgsProject.instance() extent = QgsRectangle() offline_editing = QgsOfflineEditing() # Configure project project_configuration = ProjectConfiguration(project) project_configuration.create_base_map = False project_configuration.offline_copy_only_aoi = False project_configuration.use_layer_selection = True # Layer config layer_sync_action = LayerConfig.get_field_data_capture_layer_config( db.names) total_projects = len(surveyor_expression_dict) current_progress = 0 for surveyor, layer_config in surveyor_expression_dict.items(): export_folder = os.path.join(export_dir, surveyor) # Get layers (cannot be done out of this for loop because the project is closed and layers are deleted) layers = { layer_name: None for layer_name, _ in layer_sync_action.items() } self.app.core.get_layers(db, layers, True) if not layers: return False, QCoreApplication.translate( "FieldDataCapture", "At least one layer could not be found.") # Configure layers for layer_name, layer in layers.items(): layer_source = LayerSource(layer) layer_source.action = layer_sync_action[layer_name] if layer_name in layer_config: layer_source.select_expression = layer_config[layer_name] layer_source.apply() offline_converter = OfflineConverter(project, export_folder, extent, offline_editing) offline_converter.convert() offline_editing.layerProgressUpdated.disconnect( offline_converter.on_offline_editing_next_layer) offline_editing.progressModeSet.disconnect( offline_converter.on_offline_editing_max_changed) offline_editing.progressUpdated.disconnect( offline_converter.offline_editing_task_progress) current_progress += 1 self.total_progress_updated.emit( int(100 * current_progress / total_projects)) return True, QCoreApplication.translate( "FieldDataCapture", "{count} offline projects have been successfully created in <a href='file:///{normalized_path}'>{path}</a>!" ).format(count=total_projects, normalized_path=normalize_local_url(export_dir), path=export_dir)