diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index d21a50b79..fb11abb21 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -9,12 +9,14 @@ You can find more information about our code of conduct on: https://github.com/G
As well as Giswater is developed in Python (qgis plugin) and PL/SQL(PostgreSQL database) there are three main repositories to manage it (QGIS-PLUGIN, DB-MODEL and DOCS). Right now this is the repository for the QGIS-PLUGIN.
## TABLE OF CONTENTS
+
1- Bug report.
2- Working with issues.
3- Make new code contribution.
4- Contributors list.
## BUG REPORT
+
If you’re experiencing a problem while working with Giswater, please, report it so our developers can revise and fix it, by submitting the following information and sending an e-mail to bugreport@giswater.org
1. Contact Information: name and e-mail address.
@@ -27,18 +29,22 @@ This report is generated by clicking on the button ‘Check project' on utilitie
After a few seconds an extensive report for project status is generated within a dialog. Screenshot of this dialog should be sent such that (at least errors & warnings).
More information: https://www.giswater.org/bug-report
-
## WORKING WITH ISSUES
+
### Create a new issue:
+
If you spot a problem with the docs, search if an issue already exists. If a related issue doesn't exist, you can open a new issue using a relevant issue form.
### Solve an issue:
+
Scan through our existing issues to find one that interests you. You can narrow down the search using labels as filters. See Labels for more information. As a general rule, we don’t assign issues to anyone. If you find an issue to work on, you are welcome to open a PR with a fix.
## MAKE NEW CODE CONTRIBUTION
+
To get an overview of the project, read the README. Here are some resources to help you get started with open source contributions.
### Finding ways to contribute with project:
+
- Set up Git.
- GitHub flow.
- Collaborating with pull requests.
@@ -46,14 +52,15 @@ To get an overview of the project, read the README. Here are some resources to h
- To navigate our codebase with confidence, see the introduction to working in the docs repository.
### Choose te repo:
+
To make new code you need to choose what repo are you looking for:
Use the https://github.com/Giswater/docs repository to work with DOCS
Use the https://github.com/Giswater/giswater_qgis_plugin repository to work with PYTHON QGIS PLUGIN.
Use the https://github.com/Giswater/giswater_dbmodel repository to work with DATABASE MODEL.
Rest of repositories are no significant. Some of them they are deprecated or some of them are not used yet.
-
### Make changes locally:
+
1- Install Git LFS.
2- Fork the repository.
3- Using GitHub Desktop.
@@ -66,6 +73,7 @@ Rest of repositories are no significant. Some of them they are deprecated or som
10- Once your changes are ready, don't forget to self-review to speed up the review process.
### Create Pull Request:
+
When you're finished with the changes, create a pull request, also known as a PR.
Fill the "Ready for review" template so that we can review your PR. This template helps reviewers understand your changes as well as the purpose of your pull request. Don't forget to link PR to issue if you are solving one.
Enable the checkbox to allow maintainer edits so the branch can be updated for a merge. Once you submit your PR, a team member will review your proposal. We may ask questions or request for additional information.
@@ -73,6 +81,7 @@ We may ask for changes to be made before a PR can be merged, either using sugges
As you update your PR and apply changes, mark each conversation as resolved. Once your PR is merged, your contributions will be publicly visible on the GitHub.
## CONTRIBUTORS LIST
+
Nicole Aguiar, Frelance GIS consultant.
Jordi Blanch, Stagier on BGEO OPEN GIS.
Guillem Esteve, Stagier on BGEO OPEN GIS.
@@ -94,4 +103,5 @@ Edgar Fuste, GIS developer on BGEO OPEN GIS.
Albert Bofill, GIS analyst on BGEO OPEN GIS.
Barbara Rzepka, GIS analyst on BGEO OPEN GIS.
Xavier Torret, GIS analyst on BGEO OPEN GIS.
-
+Daniel Marín, Backend on BGEO OPEN GIS.
+Ferran Martínez, Frontend on BGEO OPEN GIS.
diff --git a/config/giswater.config b/config/giswater.config
index 23840c6a8..808b7d3ca 100644
--- a/config/giswater.config
+++ b/config/giswater.config
@@ -71,7 +71,6 @@ ud = 26, 27, 219
# plan
45 = GwPsectorButton
46 = GwPsectorManagerButton
-50 = GwPriceManagerButton
219 = GwNetscenarioManagerButton
# utilities
58 = GwPrintButton
@@ -83,7 +82,7 @@ ud = 26, 27, 219
217 = GwUtilsManagerButton
# toc
306 = GwAddChildLayerButton
-308 = GwEpaWorldButton
+308 = GwLayerStyleChangeButton
[menu]
load = true
@@ -137,7 +136,6 @@ dlg_plan_psector = 5.-giswater-plugin#5-2-5-1-new-planification-sector
#dlg_psector_rapport = None
dlg_psector_manager = 5.-giswater-plugin#5-2-5-2-psector-manager
#dlg_psector_duplicate = None
-dlg_price_manager = 5.-giswater-plugin#5-2-5-3-network-cost-manager
#plan_estimate_result_new = None
#price_result_selector = None
#utils
diff --git a/config/user_params.config b/config/user_params.config
index 006705039..5c3adc898 100644
--- a/config/user_params.config
+++ b/config/user_params.config
@@ -8,6 +8,7 @@ force_superuser = False #Forces the main Giswater dialog to be enabled, even if
disable_updateall_attributetable = False #Disables button "Update all" from attribute table
show_psector_ruberband_duration = 5 #Manage rubberband duration
force_create_qgis_group_layer = False #Creates missing groups in ToC when adding layers
+force_commit = None
[init.log]
log_level = 20 #Default log level. CRITICAL = 50, FATAL = CRITICAL, ERROR = 40, WARNING = 30, WARN = WARNING, INFO = 20, DEBUG = 10, NOTSET = 0
@@ -68,7 +69,6 @@ shortcut_toggle_log_db = Alt+1 #Shortcut to show DB&Notify logs
# plan
45 = None #GwPsectorButton
46 = None #GwPsectorManagerButton
-50 = None #GwPriceManagerButton
# utilities
58 = None #GwPrintButton
59 = None #GwProjectCheckButton
@@ -92,6 +92,7 @@ _psector_manager_keep_open = True
_search_open_loadproject = None
_curselectors_open_loadproject = False
_mincut_manager_keep_open = False
+_workcat_manager_keep_open = True
[init.user_edit_tricks]
_keep_maptool_active = False
@@ -320,6 +321,14 @@ _dlg_nonvisual_pattern_ws_width = None
_dlg_nonvisual_pattern_ws_height = None
_dlg_psector_repair_width = None
_dlg_psector_repair_height = None
+_dlg_comp_x_pages_width = None
+_dlg_comp_x_pages_height = None
+_dlg_workcat_manager_width = None
+_dlg_workcat_manager_height = None
+_dlg_style_manager_width = None
+_dlg_style_manager_height = None
+_dlg_feature_add_width = None
+_dlg_feature_add_height = None
[session.dialogs_position]
dlg_admin_translation_x = None
@@ -520,6 +529,14 @@ _dlg_nonvisual_pattern_ws_x = None
_dlg_nonvisual_pattern_ws_y = None
_dlg_psector_repair_x = None
_dlg_psector_repair_y = None
+_dlg_comp_x_pages_x = None
+_dlg_comp_x_pages_y = None
+_dlg_workcat_manager_x = None
+_dlg_workcat_manager_y = None
+_dlg_style_manager_x = None
+_dlg_style_manager_y = None
+_dlg_feature_add_x = None
+_dlg_feature_add_y = None
[session.dialogs_tab]
_dlg_selector_basic = None
@@ -929,6 +946,9 @@ _gw_fct_create_hydrology_scenario_empty_infiltration = None
_gw_fct_create_hydrology_scenario_empty_text = None
_gw_fct_create_hydrology_scenario_empty_expl = None
_gw_fct_create_hydrology_scenario_empty_active = None
+_gw_fct_graphanalytics_mapzones_advanced_checkdata = None
+_gw_fct_waterbalance_method = None
+_gw_fct_graphanalytics_mapzones_plan_exploitation = None
[session.docker]
_position = None
@@ -1066,3 +1086,9 @@ _cmb_expl_id = None
_cmb_sector_id = None
_chk_active = None
+[session.composer_pages]
+_last_composer = None
+_folder_path = None
+_prefix = None
+_single = None
+
diff --git a/core/admin/admin_btn.py b/core/admin/admin_btn.py
index 45f529880..6c2751ff4 100644
--- a/core/admin/admin_btn.py
+++ b/core/admin/admin_btn.py
@@ -465,7 +465,7 @@ def load_base(self, dict_folders):
""""""
for folder in dict_folders.keys():
status = self._execute_files(folder, set_progress_bar=True)
- if not status and self.dev_commit is False:
+ if not tools_os.set_boolean(status, False) and tools_os.set_boolean(self.dev_commit, False) is False:
return False
return True
@@ -479,11 +479,11 @@ def load_locale(self):
return False
else:
status = self._execute_files(folder_locale, True, set_progress_bar=True)
- if status is False and self.dev_commit is False:
+ if tools_os.set_boolean(status, False) is False and tools_os.set_boolean(self.dev_commit, False) is False:
return False
else:
status = self._execute_files(self.folder_locale, True, set_progress_bar=True)
- if status is False and self.dev_commit is False:
+ if tools_os.set_boolean(status, False) is False and tools_os.set_boolean(self.dev_commit, False) is False:
return False
return True
@@ -494,7 +494,7 @@ def update_minor_dict_folders(self, folder_update, new_project, project_type, no
folder_utils = os.path.join(folder_update, 'utils')
if self._process_folder(folder_utils) is True:
status = self._load_sql(folder_utils, no_ct, set_progress_bar=True)
- if status is False:
+ if tools_os.set_boolean(status, False) is False:
return False
if new_project:
@@ -504,13 +504,13 @@ def update_minor_dict_folders(self, folder_update, new_project, project_type, no
folder_project_type = os.path.join(folder_update, folder_project)
if self._process_folder(folder_project_type):
status = self._load_sql(folder_project_type, no_ct, set_progress_bar=True)
- if status is False:
+ if tools_os.set_boolean(status, False) is False:
return False
folder_locale = os.path.join(folder_update, 'i18n', self.locale)
if self._process_folder(folder_locale) is True:
status = self._execute_files(folder_locale, True, set_progress_bar=True)
- if status is False:
+ if tools_os.set_boolean(status, False) is False:
return False
return True
@@ -529,27 +529,15 @@ def update_dict_folders(self, new_project=False, project_type=False, no_ct=False
for sub_folder in sub_folders:
folder_update = os.path.join(self.folder_updates, folder, sub_folder)
if new_project:
- if self.dev_commit is True:
- if str(sub_folder) > '31100':
- status = self.update_minor_dict_folders(folder_update, new_project, project_type, no_ct)
- if status is False:
- return False
- else:
- if str(sub_folder) > '31100' and str(sub_folder) <= str(self.plugin_version).replace('.', ''):
- status = self.update_minor_dict_folders(folder_update, new_project, project_type, no_ct)
- if status is False:
- return False
+ if str(sub_folder) > '31100' and str(sub_folder) <= str(self.plugin_version).replace('.', ''):
+ status = self.update_minor_dict_folders(folder_update, new_project, project_type, no_ct)
+ if tools_os.set_boolean(status, False) is False:
+ return False
else:
- if self.dev_commit is True:
- if str(sub_folder) > str(self.project_version).replace('.', '') and str(sub_folder) > '31100':
- status = self.update_minor_dict_folders(folder_update, new_project, project_type, no_ct)
- if status is False:
- return False
- else:
- if str(sub_folder) > str(self.project_version).replace('.', '') and str(sub_folder) > '31100' and str(sub_folder) <= str(self.plugin_version).replace('.', ''):
- status = self.update_minor_dict_folders(folder_update, new_project, project_type, no_ct)
- if status is False:
- return False
+ if str(sub_folder) > str(self.project_version).replace('.', '') and str(sub_folder) > '31100' and str(sub_folder) <= str(self.plugin_version).replace('.', ''):
+ status = self.update_minor_dict_folders(folder_update, new_project, project_type, no_ct)
+ if tools_os.set_boolean(status, False) is False:
+ return False
return True
def load_childviews(self):
@@ -559,11 +547,11 @@ def load_childviews(self):
return False
else:
status = self._execute_files(folder_childviews, True, set_progress_bar=True)
- if status is False and self.dev_commit is False:
+ if tools_os.set_boolean(status, False) is False and tools_os.set_boolean(self.dev_commit, False) is False:
return False
else:
status = self._execute_files(self.folder_childviews, True, set_progress_bar=True)
- if status is False and self.dev_commit is False:
+ if tools_os.set_boolean(status, False) is False and tools_os.set_boolean(self.dev_commit, False) is False:
return False
return True
@@ -573,7 +561,7 @@ def load_sample_data(self, project_type):
tools_db.dao.commit()
folder = os.path.join(self.folder_example, 'user', project_type)
status = self._execute_files(folder, set_progress_bar=True)
- if not status and self.dev_commit is False:
+ if not tools_os.set_boolean(status, False) and tools_os.set_boolean(self.dev_commit, False) is False:
return False
return True
@@ -583,7 +571,7 @@ def load_inv_data(self, project_type):
tools_db.dao.commit()
folder = os.path.join(self.folder_example, 'inv', project_type)
status = self._execute_files(folder, set_progress_bar=True)
- if not status and self.dev_commit is False:
+ if not tools_os.set_boolean(status, False) and tools_os.set_boolean(self.dev_commit, False) is False:
return False
return True
@@ -594,7 +582,7 @@ def load_dev_data(self, project_type):
folder = os.path.join(self.folder_example, 'dev', project_type)
status = self._execute_files(folder, set_progress_bar=True)
- if not status and self.dev_commit is False:
+ if not tools_os.set_boolean(status, False) and tools_os.set_boolean(self.dev_commit, False) is False:
return False
return True
@@ -678,7 +666,7 @@ def _init_show_database(self):
self.folder_example = os.path.join(self.sql_dir, 'example')
# Variable to commit changes even if schema creation fails
- self.dev_commit = global_vars.gw_dev_mode
+ self.dev_commit = tools_gw.get_config_parser('system', 'force_commit', "user", "init", prefix=True)
# Create dialog object
self.dlg_readsql = GwAdminUi(self)
@@ -1082,7 +1070,7 @@ def _load_sql(self, path_folder, no_ct=False, utils_schema_name=None, set_progre
for (path, ficheros, archivos) in os.walk(path_folder):
status = self._execute_files(path, no_ct=no_ct, utils_schema_name=utils_schema_name,
set_progress_bar=set_progress_bar)
- if not status:
+ if not tools_os.set_boolean(status, False):
return False
return True
@@ -1170,7 +1158,7 @@ def _rename_project_data_schema(self, schema, create_project=None):
# Check if the new project name already exists
sql = "SELECT schema_name, schema_name FROM information_schema.schemata"
- rows = tools_db.get_rows(sql)
+ rows = tools_db.get_rows(sql, commit=self.dev_commit)
for row in rows:
if str(self.schema) == str(row[0]):
msg = "This project name alredy exist."
@@ -1248,22 +1236,22 @@ def _load_fct_ftrg(self):
folder = os.path.join(self.folder_utils, self.file_pattern_fct)
status = self._execute_files(folder)
- if not status and self.dev_commit is False:
+ if not tools_os.set_boolean(status, False) and tools_os.set_boolean(self.dev_commit, False) is False:
return False
folder = os.path.join(self.folder_utils, self.file_pattern_ftrg)
status = self._execute_files(folder)
- if not status and self.dev_commit is False:
+ if not tools_os.set_boolean(status, False) and tools_os.set_boolean(self.dev_commit, False) is False:
return False
folder = os.path.join(self.folder_software, self.file_pattern_fct)
status = self._execute_files(folder)
- if not status and self.dev_commit is False:
+ if not tools_os.set_boolean(status, False) and tools_os.set_boolean(self.dev_commit, False) is False:
return False
folder = os.path.join(self.folder_software, self.file_pattern_ftrg)
status = self._execute_files(folder)
- if not status and self.dev_commit is False:
+ if not tools_os.set_boolean(status, False) and tools_os.set_boolean(self.dev_commit, False) is False:
return False
return True
@@ -1514,7 +1502,7 @@ def _populate_data_schema_name(self, widget):
return
# Populate Project data schema Name
sql = "SELECT schema_name FROM information_schema.schemata"
- rows = tools_db.get_rows(sql)
+ rows = tools_db.get_rows(sql, commit=self.dev_commit)
if rows is None:
return
@@ -1568,7 +1556,7 @@ def _filter_srid_changed(self):
"FROM public.spatial_ref_sys "
"WHERE CAST(srid AS TEXT) LIKE '" + str(filter_value))
sql += "%' AND srtext ILIKE 'PROJCS%' ORDER BY substr(srtext, 1, 6), srid"
- self.last_srids = tools_db.get_rows(sql)
+ self.last_srids = tools_db.get_rows(sql, commit=self.dev_commit)
# Populate Table
self.model_srid = QSqlQueryModel()
@@ -1685,7 +1673,13 @@ def _reload_fct_ftrg(self):
self.task1.setProgress(100)
status = (self.error_count == 0)
- self._manage_result_message(status, parameter="Reload")
+ if status:
+ tools_qt.show_info_box("Reload completed successfully", title="Success")
+ tools_db.dao.commit()
+ else:
+ tools_qt.show_info_box("Reload failed", title="Error")
+ tools_db.dao.rollback()
+
if status:
tools_db.dao.commit()
else:
@@ -1797,7 +1791,7 @@ def _execute_files(self, filedir, i18n=False, no_ct=False, utils_schema_name=Non
tools_log.log_info(os.path.join(filedir, file))
self.current_sql_file += 1
status = self._read_execute_file(filedir, file, schema_name, self.project_epsg, set_progress_bar)
- if not status and self.dev_commit is False:
+ if not tools_os.set_boolean(status, False) and tools_os.set_boolean(self.dev_commit, False) is False:
return False
else:
@@ -1807,7 +1801,7 @@ def _execute_files(self, filedir, i18n=False, no_ct=False, utils_schema_name=Non
tools_log.log_info(os.path.join(filedir, file))
self.current_sql_file += 1
status = self._read_execute_file(filedir, file, schema_name, self.project_epsg, set_progress_bar)
- if not status and self.dev_commit is False:
+ if not tools_os.set_boolean(status, False) and not tools_os.set_boolean(self.dev_commit, False):
return False
return status
@@ -1835,13 +1829,12 @@ def _read_execute_file(self, filedir, file, schema_name, project_epsg, set_progr
if f:
f_to_read = str(f.read().replace("SCHEMA_NAME", schema_name).replace("SRID_VALUE", project_epsg))
status = tools_db.execute_sql(str(f_to_read), filepath=filepath, commit=self.dev_commit, is_thread=True)
-
- if status is False:
+ if tools_os.set_boolean(status, False) is False:
self.error_count = self.error_count + 1
tools_log.log_info(f"_read_execute_file error {filepath}")
tools_log.log_info(f"Message: {lib_vars.session_vars['last_error']}")
self.message_infolog = f"_read_execute_file error {filepath}\nMessage: {lib_vars.session_vars['last_error']}"
- if self.dev_commit is False:
+ if tools_os.set_boolean(self.dev_commit, False) is False:
tools_db.dao.rollback()
if hasattr(self, 'task_create_schema') and not isdeleted(self.task_create_schema):
@@ -1855,7 +1848,7 @@ def _read_execute_file(self, filedir, file, schema_name, project_epsg, set_progr
tools_log.log_info(f"_read_execute_file exception: {file}")
tools_log.log_info(str(e))
self.message_infolog = f"_read_execute_file exception: {file}\n {str(e)}"
- if self.dev_commit is False:
+ if tools_os.set_boolean(self.dev_commit, False) is False:
tools_db.dao.rollback()
if hasattr(self, 'task_create_schema') and not isdeleted(self.task_create_schema):
self.task_create_schema.cancel()
@@ -1919,7 +1912,7 @@ def _copy_project_start(self, schema):
new_schema_name = tools_qt.get_text(self.dlg_readsql_copy, self.dlg_readsql_copy.schema_rename_copy)
sql = "SELECT schema_name, schema_name FROM information_schema.schemata"
- rows = tools_db.get_rows(sql)
+ rows = tools_db.get_rows(sql, commit=self.dev_commit)
for row in rows:
if str(new_schema_name) == str(row[0]):
@@ -2303,7 +2296,7 @@ def _update_manage_ui(self):
sql = (f"SELECT cat_feature.id, cat_feature.id "
f"FROM {schema_name}.cat_feature WHERE id <> 'LINK' "
f"AND active IS TRUE ORDER BY id")
- rows = tools_db.get_rows(sql)
+ rows = tools_db.get_rows(sql, commit=self.dev_commit)
tools_qt.fill_combo_values(self.dlg_readsql.cmb_formname_fields, rows)
@@ -2432,19 +2425,19 @@ def _manage_create_field(self, form_name, is_multi_addfield):
# Populate widgettype combo
sql = (f"SELECT DISTINCT(id), idval FROM {schema_name}.config_typevalue "
f"WHERE typevalue = 'widgettype_typevalue' AND addparam->>'createAddfield' = 'TRUE'")
- rows = tools_db.get_rows(sql)
+ rows = tools_db.get_rows(sql, commit=self.dev_commit)
tools_qt.fill_combo_values(self.dlg_manage_fields.widgettype, rows)
# Populate datatype combo
sql = (f"SELECT id, idval FROM {schema_name}.config_typevalue "
f"WHERE typevalue = 'datatype_typevalue' AND addparam->>'createAddfield' = 'TRUE'")
- rows = tools_db.get_rows(sql)
+ rows = tools_db.get_rows(sql, commit=self.dev_commit)
tools_qt.fill_combo_values(self.dlg_manage_fields.datatype, rows)
# Populate layoutname combo
sql = (f"SELECT id, idval FROM {schema_name}.config_typevalue "
f"WHERE typevalue = 'layout_name_typevalue' AND addparam->>'createAddfield' = 'TRUE'")
- rows = tools_db.get_rows(sql)
+ rows = tools_db.get_rows(sql, commit=self.dev_commit)
tools_qt.fill_combo_values(self.dlg_manage_fields.layoutname, rows)
# Set default value for formtype widget
@@ -2497,7 +2490,7 @@ def _manage_delete_field(self, form_name, is_multi_addfield):
f"FROM {schema_name}.ve_config_addfields "
f"WHERE cat_feature_id = '{form_name}'")
- rows = tools_db.get_rows(sql)
+ rows = tools_db.get_rows(sql, commit=self.dev_commit)
tools_qt.fill_combo_values(self.dlg_manage_fields.cmb_fields, rows)
@@ -2521,7 +2514,7 @@ def _manage_accept(self, action, form_name, is_multi=False):
sql = (f"UPDATE {schema_name}.config_param_system "
f"SET value = 'TRUE'"
f"WHERE parameter = 'admin_config_control_trigger'")
- tools_db.execute_sql(sql)
+ tools_db.execute_sql(sql, commit=self.dev_commit)
# Execute manage add fields function
@@ -2591,13 +2584,13 @@ def _manage_accept(self, action, form_name, is_multi=False):
body = body.replace('""', 'null')
# Execute manage add fields function
- json_result = tools_gw.execute_procedure('gw_fct_admin_manage_addfields', body, schema_name)
+ json_result = tools_gw.execute_procedure('gw_fct_admin_manage_addfields', body, schema_name, commit=self.dev_commit)
if not json_result or json_result['status'] == 'Failed':
# set admin_config_control_trigger with prev user value
sql = (f"UPDATE {schema_name}.config_param_system "
f"SET value = '{config_trg_user_value}'"
f"WHERE parameter = 'admin_config_control_trigger'")
- tools_db.execute_sql(sql)
+ tools_db.execute_sql(sql, commit=self.dev_commit)
return
self._manage_json_message(json_result, parameter="Field configured in 'config_form_fields'")
@@ -2669,7 +2662,7 @@ def _manage_accept(self, action, form_name, is_multi=False):
sql = (f"UPDATE {schema_name}.config_param_system "
f"SET value = '{config_trg_user_value}'"
f"WHERE parameter = 'admin_config_control_trigger'")
- tools_db.execute_sql(sql)
+ tools_db.execute_sql(sql, commit=self.dev_commit)
def _change_project_type(self, widget):
""" Take current project type changed """
@@ -2788,12 +2781,10 @@ def _insert_inp_into_db(self, folder_path=None):
sql += values
if progress % 500 == 0:
- # TODO:: Use dev_commit or dev_user?
tools_db.execute_sql(sql, commit=self.dev_commit)
sql = ""
if sql != "":
- # TODO:: Use dev_commit or dev_user?
tools_db.execute_sql(sql, commit=self.dev_commit)
_file.close()
@@ -2928,7 +2919,7 @@ def _manage_user_params(self):
sql = (f"UPDATE {self.schema_name}.config_param_user "
f"SET value = '{composers_path_vdef}' "
f"WHERE parameter = 'qgis_composers_folderpath' AND cur_user = current_user")
- tools_db.execute_sql(sql)
+ tools_db.execute_sql(sql, commit=self.dev_commit)
def _select_active_locales(self, sqlite_cursor):
@@ -3068,19 +3059,19 @@ def _load_base_utils(self):
folder = os.path.join(self.sql_dir, 'corporate', 'utils', 'utils')
status = self._execute_files(folder, utils_schema_name='utils')
- if not status and self.dev_commit is False:
+ if not tools_os.set_boolean(status, False) and tools_os.set_boolean(self.dev_commit, False) is False:
return False
folder = os.path.join(self.sql_dir, 'corporate', 'utils', 'utils', 'fct')
status = self._execute_files(folder, utils_schema_name='utils')
- if not status and self.dev_commit is False:
+ if not tools_os.set_boolean(status, False) and tools_os.set_boolean(self.dev_commit, False) is False:
return False
folder = os.path.join(self.sql_dir, 'corporate', 'utils', 'ws')
status = self._execute_files(folder, utils_schema_name=self.ws_project_name)
- if not status and self.dev_commit is False:
+ if not tools_os.set_boolean(status, False) and tools_os.set_boolean(self.dev_commit, False) is False:
return False
folder = os.path.join(self.sql_dir, 'corporate', 'utils', 'ud')
status = self._execute_files(folder, utils_schema_name=self.ud_project_name)
- if not status and self.dev_commit is False:
+ if not tools_os.set_boolean(status, False) and tools_os.set_boolean(self.dev_commit, False) is False:
return False
return True
@@ -3105,7 +3096,7 @@ def _update_utils_schema(self, schema_version=None, schema_name=None):
folder_update = os.path.join(folder_utils_updates, folder, sub_folder, 'utils')
if self._process_folder(folder_update):
status = self._load_sql(folder_update, utils_schema_name='utils')
- if status is False:
+ if tools_os.set_boolean(status, False) is False:
return False
if self.project_type_selected == 'ws':
folder_update = os.path.join(folder_utils_updates, folder, sub_folder, 'ws')
@@ -3113,7 +3104,7 @@ def _update_utils_schema(self, schema_version=None, schema_name=None):
if schema_name is None:
schema_name = self.ws_project_name
status = self._load_sql(folder_update, utils_schema_name=schema_name)
- if status is False:
+ if tools_os.set_boolean(status, False) is False:
return False
if self.project_type_selected == 'ud':
folder_update = os.path.join(folder_utils_updates, folder, sub_folder, 'ud')
@@ -3121,12 +3112,12 @@ def _update_utils_schema(self, schema_version=None, schema_name=None):
if schema_name is None:
schema_name = self.ud_project_name
status = self._load_sql(folder_update, utils_schema_name=schema_name)
- if status is False:
+ if tools_os.set_boolean(status, False) is False:
return False
folder_update = os.path.join(folder_utils_updates, folder, sub_folder, 'i18n', self.locale)
if self._process_folder(folder_update) is True:
status = self._execute_files(folder_update, True)
- if status is False:
+ if tools_os.set_boolean(status, False) is False:
return False
return True
diff --git a/core/load_project.py b/core/load_project.py
index e5acd2b47..5b0029532 100644
--- a/core/load_project.py
+++ b/core/load_project.py
@@ -46,7 +46,7 @@ def project_read(self, show_warning=True, main=None):
# Check if loaded project is valid for Giswater
if not self._check_project(show_warning):
- return
+ return False
# Force commit before opening project and set new database connection
if not self._check_database_connection(show_warning):
@@ -143,9 +143,6 @@ def project_read(self, show_warning=True, main=None):
if tools_os.set_boolean(force_tab_expl, False):
self._force_tab_exploitation()
- # Manage epa POV
- tools_gw.set_epa_world(False, is_init=True)
-
# Set lib_vars.project_epsg
lib_vars.project_epsg = tools_qgis.get_epsg()
tools_gw.connect_signal(QgsProject.instance().crsChanged, tools_gw.set_epsg,
@@ -510,7 +507,7 @@ def _check_user_roles(self):
self._enable_toolbar("epa")
self._hide_button("308", False)
- elif lib_vars.project_vars['project_role'] == 'role_master' or lib_vars.project_vars['project_role'] == 'role_admin':
+ elif lib_vars.project_vars['project_role'] == 'role_master' or lib_vars.project_vars['project_role'] == 'role_admin' or lib_vars.project_vars['project_role'] == 'role_system':
self._enable_toolbar("om")
self._enable_toolbar("edit")
self._enable_toolbar("cad")
diff --git a/core/shared/dimensioning.py b/core/shared/dimensioning.py
index c0a09bfa5..7ebf373b6 100644
--- a/core/shared/dimensioning.py
+++ b/core/shared/dimensioning.py
@@ -513,8 +513,7 @@ def _set_widgets(self, dialog, db_return, field):
widget = tools_gw.add_tableview(db_return, field, dialog)
widget = tools_gw.add_tableview_header(widget, field)
widget = tools_gw.fill_tableview_rows(widget, field)
- widget = tools_gw.set_tablemodel_config(dialog, widget, field['widgetname'], sort_order=1,
- isQStandardItemModel=True)
+ widget = tools_gw.set_tablemodel_config(dialog, widget, field['widgetname'], sort_order=1)
tools_qt.set_tableview_config(widget)
widget.setObjectName(widget.property('columnname'))
diff --git a/core/shared/document.py b/core/shared/document.py
index ecea711fd..c69c5febb 100644
--- a/core/shared/document.py
+++ b/core/shared/document.py
@@ -8,13 +8,17 @@
import os
import webbrowser
from functools import partial
+from osgeo import gdal
+from pyproj import CRS, Transformer
-from qgis.PyQt.QtWidgets import QAbstractItemView, QTableView, QFileDialog
-from qgis.PyQt.QtCore import pyqtSignal, QObject
+from qgis.PyQt.QtGui import QStandardItemModel, QStandardItem
+from qgis.PyQt.QtWidgets import QAbstractItemView, QTableView, QFileDialog, QCompleter, QWidget
+from qgis.PyQt.QtCore import pyqtSignal, QObject, Qt
from ..utils import tools_gw
from ..ui.ui_manager import GwDocUi, GwDocManagerUi
from ... import global_vars
+from ..utils.snap_manager import GwSnapManager
from ...libs import lib_vars, tools_qt, tools_db, tools_qgis, tools_os
@@ -30,11 +34,15 @@ def __init__(self, single_tool=True):
self.single_tool_mode = single_tool
self.previous_dialog = None
self.iface = global_vars.iface
+ self.snapper_manager = GwSnapManager(self.iface)
+ self.vertex_marker = self.snapper_manager.vertex_marker
self.canvas = global_vars.canvas
self.schema_name = lib_vars.schema_name
self.files_path = []
self.project_type = tools_gw.get_project_type()
- self.doc_tables = ["doc_x_node","doc_x_arc","doc_x_connec","doc_x_gully"]
+ self.doc_tables = ["doc_x_node", "doc_x_arc", "doc_x_connec", "doc_x_gully", "doc_x_workcat", "doc_x_psector", "doc_x_visit"]
+ self.point_xy = {"x": None, "y": None}
+ self.is_new = False
@@ -46,6 +54,7 @@ def get_document(self, tablename=None, qtable=None, item_id=None, feature=None,
self.dlg_add_doc = GwDocUi(self)
tools_gw.load_settings(self.dlg_add_doc)
self.doc_id = None
+ self.doc_name = None
self.files_path = []
# Capture the current layer to return it at the end of the operation
@@ -60,10 +69,7 @@ def get_document(self, tablename=None, qtable=None, item_id=None, feature=None,
# Setting lists
self.ids = []
self.list_ids = {'arc': [], 'node': [], 'connec': [], 'gully': [], 'element': []}
-
- # Setting layers
self.layers = {'arc': [], 'node': [], 'connec': [], 'gully': [], 'element': []}
-
self.layers['arc'] = tools_gw.get_layers_from_feature_type('arc')
self.layers['node'] = tools_gw.get_layers_from_feature_type('node')
self.layers['connec'] = tools_gw.get_layers_from_feature_type('connec')
@@ -92,25 +98,44 @@ def get_document(self, tablename=None, qtable=None, item_id=None, feature=None,
layer.selectByIds([feature.id()])
# Set icons
+ tools_gw.add_icon(self.dlg_add_doc.btn_add_geom, "133")
tools_gw.add_icon(self.dlg_add_doc.btn_insert, "111", sub_folder="24x24")
+ tools_gw.add_icon(self.dlg_add_doc.btn_insert_workcat, "111", sub_folder="24x24")
+ tools_gw.add_icon(self.dlg_add_doc.btn_insert_psector, "111", sub_folder="24x24")
+ tools_gw.add_icon(self.dlg_add_doc.btn_insert_visit, "111", sub_folder="24x24")
tools_gw.add_icon(self.dlg_add_doc.btn_delete, "112", sub_folder="24x24")
+ tools_gw.add_icon(self.dlg_add_doc.btn_delete_workcat, "112", sub_folder="24x24")
+ tools_gw.add_icon(self.dlg_add_doc.btn_delete_psector, "112", sub_folder="24x24")
+ tools_gw.add_icon(self.dlg_add_doc.btn_delete_visit, "112", sub_folder="24x24")
tools_gw.add_icon(self.dlg_add_doc.btn_snapping, "137")
- self.dlg_add_doc.tabWidget.setTabEnabled(1, False)
# Fill combo boxes
self._fill_combo_doc_type(self.dlg_add_doc.doc_type)
- # Set current/selected date and link
- if row:
- tools_qt.set_calendar(self.dlg_add_doc, 'date', row.value('date'))
- tools_qt.set_widget_text(self.dlg_add_doc, 'path', row.value('path'))
- self.files_path.append(row.value('path'))
+ # If document exists
+ if item_id:
+ self.is_new = False
+ # Enable tabs
+ for n in range(1, 5):
+ self.dlg_add_doc.tabWidget.setTabEnabled(n, True)
+
+ self._fill_dialog_document(self.dlg_add_doc, "doc", None, doc_id=item_id)
+ self._activate_relations()
+ self._fill_table_doc_workcat()
+ self._fill_table_doc_psector()
+ self._fill_table_doc_visit()
+ # If document is new
else:
+ self.is_new = True
+ # Disable tabs
+ for n in range(1, 5):
+ self.dlg_add_doc.tabWidget.setTabEnabled(n, False)
+
tools_qt.set_calendar(self.dlg_add_doc, 'date', None)
# Adding auto-completion to a QLineEdit
table_object = "doc"
- tools_gw.set_completer_object(self.dlg_add_doc, table_object)
+ tools_gw.set_completer_object(self.dlg_add_doc, table_object, field_id="name")
# Adding auto-completion to a QLineEdit for default feature
if feature_type is None:
@@ -118,27 +143,61 @@ def get_document(self, tablename=None, qtable=None, item_id=None, feature=None,
viewname = f"v_edit_{feature_type}"
tools_gw.set_completer_widget(viewname, self.dlg_add_doc.feature_id, str(feature_type) + "_id")
+ # Config Workcat
+ tools_gw.set_completer_widget("cat_work", self.dlg_add_doc.feature_id_workcat, "id")
+
+ self.dlg_add_doc.btn_insert_workcat.clicked.connect(partial(self._insert_workcat, self.dlg_add_doc))
+ self.dlg_add_doc.btn_delete_workcat.clicked.connect(partial(self._delete_workcat, self.dlg_add_doc))
+ self.dlg_add_doc.feature_id_workcat.textChanged.connect(
+ partial(tools_gw.set_completer_object, self.dlg_add_doc, "workcat"))
+
+ # Config Psector
+ tools_gw.set_completer_widget("plan_psector", self.dlg_add_doc.feature_id_psector, "name")
+
+ self.dlg_add_doc.btn_insert_psector.clicked.connect(partial(self._insert_psector, self.dlg_add_doc))
+ self.dlg_add_doc.btn_delete_psector.clicked.connect(partial(self._delete_psector, self.dlg_add_doc))
+ self.dlg_add_doc.feature_id_psector.textChanged.connect(
+ partial(tools_gw.set_completer_object, self.dlg_add_doc, "psector"))
+
+ # Config Visit
+ tools_gw.set_completer_widget("om_visit", self.dlg_add_doc.feature_id_visit, "id")
+
+ self.dlg_add_doc.btn_insert_visit.clicked.connect(partial(self._insert_visit, self.dlg_add_doc))
+ self.dlg_add_doc.btn_delete_visit.clicked.connect(partial(self._delete_visit, self.dlg_add_doc))
+ self.dlg_add_doc.feature_id_visit.textChanged.connect(
+ partial(tools_gw.set_completer_object, self.dlg_add_doc, "visit"))
+
# Set signals
self.excluded_layers = ["v_edit_arc", "v_edit_node", "v_edit_connec", "v_edit_element", "v_edit_gully",
"v_edit_element"]
layers_visibility = tools_gw.get_parent_layers_visibility()
+ # Dialog
self.dlg_add_doc.rejected.connect(lambda: tools_gw.reset_rubberband(self.rubber_band))
self.dlg_add_doc.rejected.connect(partial(tools_gw.restore_parent_layers_visibility, layers_visibility))
+ self.dlg_add_doc.rejected.connect(
+ lambda: setattr(self, 'layers', tools_gw.manage_close(self.dlg_add_doc, table_object, cur_active_layer, self.single_tool_mode, self.layers))
+ )
+ # Widgets
+ self.dlg_add_doc.doc_name.textChanged.connect(partial(self._check_doc_exists))
self.dlg_add_doc.doc_type.currentIndexChanged.connect(self._activate_relations)
self.dlg_add_doc.btn_path_url.clicked.connect(partial(self._open_web_browser, self.dlg_add_doc, "path"))
self.dlg_add_doc.btn_path_doc.clicked.connect(
- lambda: setattr(self, 'files_path', self._get_file_dialog(self.dlg_add_doc, "path")))
+ lambda: setattr(self, 'files_path', self._get_file_dialog(self.dlg_add_doc, "path"))
+ )
+ self.dlg_add_doc.btn_add_geom.clicked.connect(self._get_point_xy)
+ # Dialog buttons
self.dlg_add_doc.btn_accept.clicked.connect(
- partial(self._manage_document_accept, table_object, tablename, qtable, item_id))
- self.dlg_add_doc.btn_cancel.clicked.connect(lambda: setattr(self, 'layers', tools_gw.manage_close(
- self.dlg_add_doc, table_object, cur_active_layer, self.single_tool_mode, self.layers)))
- self.dlg_add_doc.rejected.connect(lambda: setattr(self, 'layers', tools_gw.manage_close(
- self.dlg_add_doc, table_object, cur_active_layer, self.single_tool_mode, self.layers)))
+ partial(self._manage_document_accept, table_object, tablename, qtable, item_id, True)
+ )
+ self.dlg_add_doc.btn_cancel.clicked.connect(
+ lambda: setattr(self, 'layers', tools_gw.manage_close(self.dlg_add_doc, table_object, cur_active_layer, self.single_tool_mode, self.layers))
+ )
+ self.dlg_add_doc.btn_apply.clicked.connect(
+ partial(self._manage_document_accept, table_object, tablename, qtable, item_id, False)
+ )
+ # Tab relations
self.dlg_add_doc.tab_feature.currentChanged.connect(
partial(tools_gw.get_signal_change_tab, self.dlg_add_doc, self.excluded_layers))
-
- self.dlg_add_doc.doc_id.textChanged.connect(
- partial(self._fill_dialog_document, self.dlg_add_doc, table_object, None))
self.dlg_add_doc.btn_insert.clicked.connect(
partial(tools_gw.insert_feature, self, self.dlg_add_doc, table_object, False, False, None, None))
self.dlg_add_doc.btn_delete.clicked.connect(
@@ -170,6 +229,194 @@ def get_document(self, tablename=None, qtable=None, item_id=None, feature=None,
return self.dlg_add_doc
+ def _fill_table_doc_workcat(self):
+ expr_filter = f"name = '{self.doc_name}'"
+ table_name = "v_ui_doc_x_workcat"
+
+ tools_qt.fill_table(self.dlg_add_doc.tbl_doc_x_workcat, table_name, expr_filter)
+
+
+ def _insert_workcat(self, dialog):
+ """Associate an existing workcat with the current document, ensuring no duplicates and clearing the input field"""
+ workcat_id = tools_qt.get_text(dialog, "feature_id_workcat")
+
+ if workcat_id == 'null':
+ message = "You need to enter a workcat id"
+ tools_qgis.show_warning(message, dialog=dialog)
+ return
+
+ sql = f"INSERT INTO doc_x_workcat (doc_id, workcat_id) VALUES ('{self.doc_id}', '{workcat_id}')"
+ result = tools_db.execute_sql(sql)
+
+ if result:
+ dialog.feature_id_workcat.clear()
+ self._fill_table_doc_workcat()
+
+
+ def _delete_workcat(self, dialog):
+ """Delete the selected workcat from the document"""
+ qtable = dialog.tbl_doc_x_workcat
+ # Get selected rows
+ selected_list = qtable.selectionModel().selectedRows()
+ if len(selected_list) == 0:
+ message = "Any record selected"
+ tools_qgis.show_warning(message, dialog=dialog)
+ return
+
+ col_idx = tools_qt.get_col_index_by_col_name(qtable, "workcat_id")
+ workcat_ids = []
+ for row in selected_list:
+ workcat_id = qtable.model().index(row.row(), col_idx).data()
+ workcat_ids.append(workcat_id)
+
+ inf_text = ", ".join(workcat_ids)
+ message = "Are you sure you want to delete these records?"
+ title = "Delete records"
+ answer = tools_qt.show_question(message, title, inf_text)
+
+ if not answer:
+ return
+
+ for workcat_id in workcat_ids:
+ sql = f"DELETE FROM doc_x_workcat WHERE doc_id = '{self.doc_id}' AND workcat_id = '{workcat_id}'"
+ tools_db.execute_sql(sql)
+
+ self._fill_table_doc_workcat()
+
+
+ def _fill_table_doc_psector(self):
+ expr_filter = f"doc_name = '{self.doc_name}'"
+ table_name = "v_ui_doc_x_psector"
+
+ tools_qt.fill_table(self.dlg_add_doc.tbl_doc_x_psector, table_name, expr_filter)
+
+
+ def _insert_psector(self, dialog):
+ """Associate an existing psector with the current document, ensuring no duplicates and clearing the input field"""
+ psector_name = tools_qt.get_text(dialog, "feature_id_psector")
+
+ if psector_name == 'null' or not psector_name:
+ message = "You need to enter a psector name"
+ tools_qgis.show_warning(message, dialog=dialog)
+ return
+
+ sql = f"SELECT psector_id FROM plan_psector WHERE name = '{psector_name}'"
+ row = tools_db.get_row(sql)
+ if not row:
+ message = "Psector name not found"
+ tools_qgis.show_warning(message, dialog=dialog)
+ return
+ psector_id = row[0]
+
+ sql = f"INSERT INTO doc_x_psector (doc_id, psector_id) VALUES ('{self.doc_id}', '{psector_id}')"
+ result = tools_db.execute_sql(sql)
+
+ if result:
+ dialog.feature_id_psector.clear()
+ self._fill_table_doc_psector()
+
+
+ def _delete_psector(self, dialog):
+ """Delete the selected psector from the document"""
+ qtable = dialog.tbl_doc_x_psector
+ selected_list = qtable.selectionModel().selectedRows()
+ if len(selected_list) == 0:
+ message = "No record selected"
+ tools_qgis.show_warning(message, dialog=dialog)
+ return
+
+ col_idx = tools_qt.get_col_index_by_col_name(qtable, "psector_name")
+ psector_names = []
+ psector_ids = []
+ for row in selected_list:
+ psector_name = qtable.model().index(row.row(), col_idx).data()
+ psector_names.append(psector_name)
+
+ for psector_name in psector_names:
+ sql = f"SELECT psector_id FROM plan_psector WHERE name = '{psector_name}'"
+ row = tools_db.get_row(sql)
+ if row:
+ psector_ids.append(row[0])
+
+ if not psector_ids:
+ message = "No valid psector IDs found"
+ tools_qgis.show_warning(message, dialog=dialog)
+ return
+
+ inf_text = ", ".join(map(str, psector_names))
+ message = "Are you sure you want to delete these records?"
+ title = "Delete records"
+ answer = tools_qt.show_question(message, title, inf_text)
+
+ if not answer:
+ return
+
+ for psector_id in psector_ids:
+ sql = f"DELETE FROM doc_x_psector WHERE doc_id = '{self.doc_id}' AND psector_id = '{psector_id}'"
+ tools_db.execute_sql(sql)
+
+ self._fill_table_doc_psector()
+
+ def _fill_table_doc_visit(self):
+ expr_filter = f"doc_name = '{self.doc_name}'"
+ table_name = "v_ui_doc_x_visit"
+
+ tools_qt.fill_table(self.dlg_add_doc.tbl_doc_x_visit, table_name, expr_filter)
+
+ def _insert_visit(self, dialog):
+ """Associate an existing visit with the current document, ensuring no duplicates and clearing the input field"""
+ visit_id = tools_qt.get_text(dialog, "feature_id_visit")
+
+ if visit_id == 'null' or not visit_id:
+ message = "You need to enter a visit ID"
+ tools_qgis.show_warning(message, dialog=dialog)
+ return
+
+ sql = f"INSERT INTO doc_x_visit (doc_id, visit_id) VALUES ('{self.doc_id}', '{visit_id}')"
+ result = tools_db.execute_sql(sql)
+
+ if result:
+ dialog.feature_id_visit.clear()
+ self._fill_table_doc_visit()
+
+
+ def _delete_visit(self, dialog):
+ """Delete the selected visit from the document"""
+ qtable = dialog.tbl_doc_x_visit
+ selected_list = qtable.selectionModel().selectedRows()
+ if len(selected_list) == 0:
+ message = "No record selected"
+ tools_qgis.show_warning(message, dialog=dialog)
+ return
+
+ col_idx = tools_qt.get_col_index_by_col_name(qtable, "visit_id")
+ visit_ids = []
+ for row in selected_list:
+ visit_id = qtable.model().index(row.row(), col_idx).data()
+ visit_ids.append(visit_id)
+
+ inf_text = ", ".join(map(str, visit_ids))
+ message = "Are you sure you want to delete these records?"
+ title = "Delete records"
+ answer = tools_qt.show_question(message, title, inf_text)
+
+ if not answer:
+ return
+
+ for visit_id in visit_ids:
+ sql = f"DELETE FROM doc_x_visit WHERE doc_id = '{self.doc_id}' AND visit_id = '{visit_id}'"
+ tools_db.execute_sql(sql)
+
+ self._fill_table_doc_visit()
+
+
+ def _get_existing_doc_names(self):
+ """ list of existing names """
+ sql = "SELECT name FROM doc ORDER BY name;"
+ rows = tools_db.get_rows(sql)
+ return [row['name'] for row in rows if 'name' in row]
+
+
def manage_documents(self):
""" Button 66: Edit document """
@@ -182,29 +429,54 @@ def manage_documents(self):
# Adding auto-completion to a QLineEdit
table_object = "doc"
- tools_gw.set_completer_object(self.dlg_man, table_object)
+ tools_gw.set_completer_object(self.dlg_man, table_object, field_id="name")
- # Set a model with selected filter. Attach that model to selected table
- message = tools_qt.fill_table(self.dlg_man.tbl_document, f"{self.schema_name}.{table_object}")
- if message:
- tools_qgis.show_warning(message)
- tools_gw.set_tablemodel_config(self.dlg_man, self.dlg_man.tbl_document, table_object)
+ status = self._fill_table()
+ if not status:
+ return False, False
- # Set dignals
- self.dlg_man.doc_id.textChanged.connect(
- partial(tools_qt.filter_by_id, self.dlg_man, self.dlg_man.tbl_document, self.dlg_man.doc_id, table_object, "id"))
+ # Set signals
+ self.dlg_man.doc_name.textChanged.connect(self._fill_table)
self.dlg_man.tbl_document.doubleClicked.connect(
partial(self._open_selected_object_document, self.dlg_man, self.dlg_man.tbl_document, table_object))
self.dlg_man.btn_cancel.clicked.connect(partial(tools_gw.close_dialog, self.dlg_man))
self.dlg_man.rejected.connect(partial(tools_gw.close_dialog, self.dlg_man))
- self.dlg_man.btn_delete.clicked.connect(
- partial(tools_gw.delete_selected_rows, self.dlg_man.tbl_document, table_object))
+ self.dlg_man.btn_delete.clicked.connect(self._handle_delete)
self.dlg_man.btn_create.clicked.connect(partial(self.open_document_dialog))
# Open form
tools_gw.open_dialog(self.dlg_man, dlg_name='doc_manager')
+ def _handle_delete(self):
+ tools_gw.delete_selected_rows(self.dlg_man.tbl_document, "doc")
+ self._refresh_manager_table()
+
+
+ def _fill_table(self, filter_text=None):
+ # Set a model with selected filter. Attach that model to selected table
+ view = "v_ui_doc"
+ if filter_text is None:
+ filter_text = ""
+ complet_list = tools_gw.get_list(view, filter_name=filter_text, id_field="name")
+ if complet_list is False:
+ return False
+ for field in complet_list['body']['data']['fields']:
+ if field.get('hidden'): continue
+ model = self.dlg_man.tbl_document.model()
+ if model is None:
+ model = QStandardItemModel()
+ self.dlg_man.tbl_document.setModel(model)
+ model.removeRows(0, model.rowCount())
+
+ if field['value']:
+ self.dlg_man.tbl_document = tools_gw.add_tableview_header(self.dlg_man.tbl_document, field)
+ self.dlg_man.tbl_document = tools_gw.fill_tableview_rows(self.dlg_man.tbl_document, field)
+ tools_gw.set_tablemodel_config(self.dlg_man, self.dlg_man.tbl_document, 'v_ui_doc', 0)
+ tools_qt.set_tableview_config(self.dlg_man.tbl_document, sectionResizeMode=0)
+
+ return True
+
# region private functions
def open_document_dialog(self):
@@ -212,11 +484,13 @@ def open_document_dialog(self):
def _refresh_manager_table(self):
+ """ Refresh the manager table """
try:
- if getattr(self, 'dlg_man') and self.dlg_man:
- self.dlg_man.tbl_document.model().select()
- except:
- pass
+ if getattr(self, 'dlg_man', None):
+ # Use the existing _fill_table method to refresh the table
+ self._fill_table()
+ except Exception as e:
+ print(f"Error refreshing manager table: {e}")
def _fill_combo_doc_type(self, widget):
@@ -233,7 +507,6 @@ def _fill_combo_doc_type(self, widget):
self._activate_relations()
-
def _activate_relations(self):
""" Force user to set doc_id and doc_type """
@@ -244,9 +517,14 @@ def _activate_relations(self):
else:
self.dlg_add_doc.tabWidget.setTabEnabled(1, True)
+ def _activate_tabs(self, activate):
+
+ # Enable tabs
+ for n in range(2, 5):
+ self.dlg_add_doc.tabWidget.setTabEnabled(n, activate)
- def _fill_table_doc(self, dialog, feature_type, feature_id):
+ def _fill_table_doc(self, dialog, feature_type, feature_id):
widget = "tbl_doc_x_" + feature_type
widget = dialog.findChild(QTableView, widget)
widget.setSelectionBehavior(QAbstractItemView.SelectRows)
@@ -259,126 +537,161 @@ def _fill_table_doc(self, dialog, feature_type, feature_id):
tools_qgis.show_warning(message)
- def _manage_document_accept(self, table_object, tablename=None, qtable=None, item_id=None):
+ def _manage_document_accept(self, table_object, tablename=None, qtable=None, item_id=None, close_dlg=True):
""" Insert or update table 'document'. Add document to selected feature """
# Get values from dialog
- doc_id = tools_qt.get_text(self.dlg_add_doc, "doc_id", False, False)
+ name = tools_qt.get_text(self.dlg_add_doc, "doc_name", False, False)
doc_type = tools_qt.get_combo_value(self.dlg_add_doc, self.dlg_add_doc.doc_type)
date = tools_qt.get_calendar_date(self.dlg_add_doc, "date", datetime_format="yyyy/MM/dd")
path = tools_qt.get_text(self.dlg_add_doc, "path", return_string_null=False)
observ = tools_qt.get_text(self.dlg_add_doc, "observ", False, False)
+ # Validations
+ if not name:
+ message = "The 'name' field is mandatory."
+ tools_qgis.show_warning(message, dialog=self.dlg_add_doc)
+ return
+
if doc_type in (None, '', -1):
message = "You need to insert doc_type"
tools_qgis.show_warning(message, dialog=self.dlg_add_doc)
return
+ # Get SRID
+ srid = lib_vars.data_epsg
+
+ # Prepare the_geom value
+ the_geom = None
+ if self.point_xy["x"] is not None and self.point_xy["y"] is not None:
+ the_geom = f"ST_SetSRID(ST_MakePoint({self.point_xy['x']},{self.point_xy['y']}), {srid})"
+
# Check if this document already exists
- sql = (f"SELECT DISTINCT(id)"
- f" FROM {table_object}"
- f" WHERE id = '{doc_id}'")
+ if item_id is None:
+ item_id = self.doc_id
+ sql = f"SELECT DISTINCT(id) FROM {table_object} WHERE id = '{item_id}'"
row = tools_db.get_row(sql, log_info=False)
# If document not exists perform an INSERT
- if row is None:
+ if row is None and self.is_new:
if len(self.files_path) <= 1:
- if doc_id in (None, ''):
- sql, doc_id = self._insert_doc_sql(doc_type, observ, date, path)
- else:
- sql = (f"INSERT INTO doc (id, doc_type, path, observ, date)"
- f" VALUES ('{doc_id}', '{doc_type}', '{path}', '{observ}', '{date}');")
- self._update_doc_tables(sql, doc_id, table_object, tablename, item_id, qtable)
- self.doc_added.emit()
+ sql, doc_id = self._insert_doc_sql(doc_type, observ, date, path, the_geom, name)
else:
- # Ask question before executing
- msg = ("You have selected multiple documents. In this case, doc_id will be a sequencial number for "
- "all selected documents and your doc_id won't be used.")
+ msg = ("You have selected multiple documents. In this case, name will be a sequential number for "
+ "all selected documents and your name won't be used.")
answer = tools_qt.show_question(msg, tools_qt.tr("Add document"))
if answer:
for file in self.files_path:
- sql, doc_id = self._insert_doc_sql(doc_type, observ, date, file)
- self._update_doc_tables(sql, doc_id, table_object, tablename, item_id, qtable)
- self.doc_added.emit()
- # If document exists perform an UPDATE
+ sql, doc_id = self._insert_doc_sql(doc_type, observ, date, file, the_geom, name)
else:
- message = "Are you sure you want to update the data?"
- answer = tools_qt.show_question(message)
- if not answer:
- return
+ doc_id = row['id']
if len(self.files_path) <= 1:
- sql = self._update_doc_sql(doc_type, observ, date, doc_id, path)
- self._update_doc_tables(sql, doc_id, table_object, tablename, item_id, qtable)
+ sql = self._update_doc_sql(doc_type, observ, date, doc_id, path, the_geom, name)
else:
- # If document have more than 1 file perform an INSERT
- # Ask question before executing
- msg = ("You have selected multiple documents. In this case, doc_id will be a sequencial number for "
- "all selected documents and your doc_id won't be used.")
+ msg = ("You have selected multiple documents. In this case, name will be a sequential number for "
+ "all selected documents and your name won't be used.")
answer = tools_qt.show_question(msg, tools_qt.tr("Add document"))
if answer:
for cont, file in enumerate(self.files_path):
if cont == 0:
- sql = self._update_doc_sql(doc_type, observ, date, doc_id, file)
- self._update_doc_tables(sql, doc_id, table_object, tablename, item_id, qtable)
+ sql = self._update_doc_sql(doc_type, observ, date, doc_id, file, the_geom, name)
else:
- sql, doc_id = self._insert_doc_sql(doc_type, observ, date, file)
- self._update_doc_tables(sql, doc_id, table_object, tablename, item_id, qtable)
+ sql, doc_id = self._insert_doc_sql(doc_type, observ, date, file, the_geom, name)
+
+ self._update_doc_tables(sql, doc_id, table_object, tablename, item_id, qtable, name, close_dlg=close_dlg)
+ self.doc_added.emit()
+
+ # Clear the_geom after use
+ self.point_xy = {"x": None, "y": None}
# Refresh manager table
+ self._refresh_manager_table()
tools_gw.execute_class_function(GwDocManagerUi, '_refresh_manager_table')
- def _insert_doc_sql(self, doc_type, observ, date, path):
-
- sql = (f"INSERT INTO doc (doc_type, path, observ, date)"
- f" VALUES ('{doc_type}', '{path}', '{observ}', '{date}') RETURNING id;")
+ def _insert_doc_sql(self, doc_type, observ, date, path, the_geom, name):
+ fields = "doc_type, path, observ, date, name"
+ values = f"'{doc_type}', '{path}', '{observ}', '{date}', '{name}'"
+ if the_geom:
+ fields += ", the_geom"
+ values += f", {the_geom}"
+ sql = (f"INSERT INTO doc ({fields}) "
+ f"VALUES ({values}) RETURNING id;")
new_doc_id = tools_db.execute_returning(sql)
sql = ""
doc_id = str(new_doc_id[0])
return sql, doc_id
- def _update_doc_sql(self, doc_type, observ, date, doc_id, path):
+ def _update_doc_sql(self, doc_type, observ, date, doc_id, path, the_geom, name):
sql = (f"UPDATE doc "
- f" SET doc_type = '{doc_type}', observ = '{observ}', path = '{path}', date = '{date}'"
- f" WHERE id = '{doc_id}';")
+ f"SET doc_type = '{doc_type}', observ = '{observ}', path = '{path}', date = '{date}', name = '{name}'")
+ if the_geom:
+ sql += f", the_geom = {the_geom}"
+ sql += f" WHERE id = '{doc_id}';"
return sql
- def _update_doc_tables(self, sql, doc_id, table_object, tablename, item_id, qtable):
+ def _update_doc_tables(self, sql, doc_id, table_object, tablename, item_id, qtable, doc_name, close_dlg=True):
+
+ arc_ids = self.list_ids['arc']
+ node_ids = self.list_ids['node']
+ connec_ids = self.list_ids['connec']
+ workcat_ids = self._get_associated_workcat_ids()
+ psector_ids = self._get_associated_psector_ids()
+ visit_ids = self._get_associated_visit_ids()
+ gully_ids = self.list_ids['gully']
- # Manage records in tables @table_object_x_@feature_type
+ # Clear the current records
for table in self.doc_tables:
if table == 'doc_x_gully' and self.project_type != 'ud':
continue
- sql += (f"\nDELETE FROM {table}"
- f" WHERE doc_id = '{doc_id}';")
-
- if self.list_ids['arc']:
- for feature_id in self.list_ids['arc']:
- sql += (f"\nINSERT INTO doc_x_arc (doc_id, arc_id)"
- f" VALUES ('{doc_id}', '{feature_id}');")
- if self.list_ids['node']:
- for feature_id in self.list_ids['node']:
- sql += (f"\nINSERT INTO doc_x_node (doc_id, node_id)"
- f" VALUES ('{doc_id}', '{feature_id}');")
- if self.list_ids['connec']:
- for feature_id in self.list_ids['connec']:
- sql += (f"\nINSERT INTO doc_x_connec (doc_id, connec_id)"
- f" VALUES ('{doc_id}', '{feature_id}');")
- if self.project_type == 'ud' and self.list_ids['gully']:
- for feature_id in self.list_ids['gully']:
- sql += (f"\nINSERT INTO doc_x_gully (doc_id, gully_id)"
- f" VALUES ('{doc_id}', '{feature_id}');")
+ sql += f"\nDELETE FROM {table} WHERE doc_id = '{doc_id}';"
+
+ # Insert the new records for arcs
+ for feature_id in arc_ids:
+ sql += f"\nINSERT INTO doc_x_arc (doc_id, arc_id) VALUES ('{doc_id}', '{feature_id}');"
+
+ # Insert the new records for nodes
+ for feature_id in node_ids:
+ sql += f"\nINSERT INTO doc_x_node (doc_id, node_id) VALUES ('{doc_id}', '{feature_id}');"
+ # Insert the new records for connec
+ for feature_id in connec_ids:
+ sql += f"\nINSERT INTO doc_x_connec (doc_id, connec_id) VALUES ('{doc_id}', '{feature_id}');"
+
+ # Insert the new records for workcat
+ for feature_id in workcat_ids:
+ sql += f"\nINSERT INTO doc_x_workcat (doc_id, workcat_id) VALUES ('{doc_id}', '{feature_id}');"
+
+ # Insert the new records for psector
+ for feature_id in psector_ids:
+ sql += f"\nINSERT INTO doc_x_psector (doc_id, psector_id) VALUES ('{doc_id}', '{feature_id}');"
+
+ # Insert the new records for visit
+ for feature_id in visit_ids: # New lines
+ sql += f"\nINSERT INTO doc_x_visit (doc_id, visit_id) VALUES ('{doc_id}', '{feature_id}');"
+
+ # Insert the new records for gully
+ if self.project_type == 'ud':
+ for feature_id in gully_ids:
+ sql += f"\nINSERT INTO doc_x_gully (doc_id, gully_id) VALUES ('{doc_id}', '{feature_id}');"
+
+ # Execute the SQL statements
status = tools_db.execute_sql(sql)
if status:
self.doc_id = doc_id
- tools_gw.manage_close(self.dlg_add_doc, table_object, None, self.single_tool_mode, self.layers)
+ self.doc_name = doc_name
+ self.is_new = False
+ self._activate_tabs(True)
+ if close_dlg:
+ tools_gw.manage_close(self.dlg_add_doc, table_object, None, self.single_tool_mode, self.layers)
+ else:
+ msg = "Values saved successfully."
+ tools_qgis.show_info(msg, dialog=self.dlg_add_doc)
- if tablename is None:
- return
- else:
+ # Update the associated table
+ if tablename:
sql = (f"INSERT INTO doc_x_{tablename} (doc_id, {tablename}_id) "
f" VALUES('{doc_id}', '{item_id}')")
tools_db.execute_sql(sql)
@@ -388,6 +701,52 @@ def _update_doc_tables(self, sql, doc_id, table_object, tablename, item_id, qtab
tools_qgis.show_warning(message)
+ def _get_associated_workcat_ids(self, doc_id=None):
+ """Get workcat_ids linked to documento"""
+ if doc_id is None:
+ doc_id = self.doc_id
+ sql = f"SELECT workcat_id FROM doc_x_workcat WHERE doc_id = '{doc_id}'"
+ rows = tools_db.get_rows(sql)
+ if not rows:
+ return []
+ return [row['workcat_id'] for row in rows if 'workcat_id' in row]
+
+
+ def _get_associated_psector_ids(self, doc_id=None):
+ """Get psector_ids linked to documento"""
+ if doc_id is None:
+ doc_id = self.doc_id
+ sql = f"SELECT psector_id FROM doc_x_psector WHERE doc_id = '{doc_id}'"
+ rows = tools_db.get_rows(sql)
+ if not rows:
+ return []
+ return [row['psector_id'] for row in rows if 'psector_id' in row]
+
+
+ def _get_associated_visit_ids(self, doc_id=None):
+ """Get visit_ids linked to the document"""
+ if doc_id is None:
+ doc_id = self.doc_id
+ sql = f"SELECT visit_id FROM doc_x_visit WHERE doc_id = '{doc_id}'"
+ rows = tools_db.get_rows(sql)
+ if not rows:
+ return []
+ return [row['visit_id'] for row in rows if 'visit_id' in row]
+
+
+ def _check_doc_exists(self, name=""):
+ sql = f"SELECT name FROM doc WHERE name = '{name}'"
+ row = tools_db.get_row(sql, log_info=False)
+ if row:
+ self.dlg_add_doc.btn_accept.setEnabled(False)
+ tools_qt.set_stylesheet(self.dlg_add_doc.doc_name)
+ self.dlg_add_doc.doc_name.setToolTip("Document name already exists")
+ return
+ self.dlg_add_doc.btn_accept.setEnabled(True)
+ tools_qt.set_stylesheet(self.dlg_add_doc.doc_name, style="")
+ self.dlg_add_doc.doc_name.setToolTip("")
+
+
def _open_selected_object_document(self, dialog, widget, table_object):
selected_list = widget.selectionModel().selectedRows()
@@ -400,16 +759,17 @@ def _open_selected_object_document(self, dialog, widget, table_object):
# Get object_id from selected row
field_object_id = "id"
- widget_id = table_object + "_id"
- selected_object_id = widget.model().record(row).value(field_object_id)
+ id_col_idx = tools_qt.get_col_index_by_col_name(widget, field_object_id)
+ selected_object_id = widget.model().item(row, id_col_idx).text()
# Close this dialog and open selected object
- keep_open_form = tools_gw.get_config_parser('dialogs_actions', 'doc_manager_keep_open', "user", "init", prefix=True)
+ keep_open_form = tools_gw.get_config_parser('dialogs_actions', 'doc_manager_keep_open', "user", "init",
+ prefix=True)
if tools_os.set_boolean(keep_open_form, False) is not True:
dialog.close()
- self.get_document(row=widget.model().record(row))
- tools_qt.set_widget_text(self.dlg_add_doc, widget_id, selected_object_id)
+ # Assuming 'row' is the QStandardItemModel row data
+ self.get_document(row=widget.model().item(row, 0), item_id=selected_object_id)
def _open_web_browser(self, dialog, widget=None):
@@ -425,6 +785,12 @@ def _open_web_browser(self, dialog, widget=None):
webbrowser.open(url)
+ def _get_point_xy(self):
+ """ Capture point XY from the canvas """
+ self.snapper_manager.add_point(self.vertex_marker)
+ self.point_xy = self.snapper_manager.point_xy
+
+
def _get_file_dialog(self, dialog, widget):
""" Get file dialog """
@@ -448,11 +814,18 @@ def _get_file_dialog(self, dialog, widget):
for file in files_path:
file_text += f"{file}\n\n"
if files_path:
- tools_qt.set_widget_text(dialog, widget, str(file_text))
+ tools_qt.set_widget_text(dialog, widget, str("\n\n".join(files_path)))
+ self.files_path = files_path
+ gps_coordinates = self.get_geolocation_gdal(files_path[0])
+ if gps_coordinates:
+ self.point_xy = {"x": gps_coordinates[0], "y": gps_coordinates[1]}
+ else:
+ self.point_xy = {"x": None, "y": None}
+
return files_path
- def _fill_dialog_document(self, dialog, table_object, single_tool_mode=None):
+ def _fill_dialog_document(self, dialog, table_object, single_tool_mode=None, doc_id=None):
# Reset list of selected records
self.ids, self.list_ids = tools_gw.reset_feature_list()
@@ -461,39 +834,75 @@ def _fill_dialog_document(self, dialog, table_object, single_tool_mode=None):
if global_vars.project_type == 'ud':
list_feature_type.append('gully')
- object_id = tools_qt.get_text(dialog, table_object + "_id")
-
+ object_name = tools_qt.get_text(dialog, table_object + "_name")
+ filter_str = f"name = '{object_name}'"
+ if object_name in (None, "", "null"):
+ filter_str = f"id = '{doc_id}'"
# Check if we already have data with selected object_id
sql = (f"SELECT * "
f" FROM {table_object}"
- f" WHERE id = '{object_id}'")
+ f" WHERE {filter_str}")
row = tools_db.get_row(sql, log_info=False)
- # If object_id not found: Clear data
- if not row:
- # Reset widgets
- widgets = ["doc_type", "observ", "path"]
- if widgets:
- for widget_name in widgets:
- tools_qt.set_widget_text(dialog, widget_name, "")
-
- if single_tool_mode is not None:
- self.layers = tools_gw.remove_selection(single_tool_mode, self.layers)
- else:
- self.layers = tools_gw.remove_selection(True, self.layers)
-
- for feature_type in list_feature_type:
- tools_qt.reset_model(dialog, table_object, feature_type)
-
- return
-
# Fill input widgets with data of the @row
+ tools_qt.set_widget_text(dialog, "doc_name", row["name"])
tools_qt.set_widget_text(dialog, "doc_type", row["doc_type"])
+ tools_qt.set_calendar(dialog, "date", row["date"])
tools_qt.set_widget_text(dialog, "observ", row["observ"])
tools_qt.set_widget_text(dialog, "path", row["path"])
+ self.doc_id = doc_id
+ self.doc_name = row["name"]
+
# Check related @feature_type
for feature_type in list_feature_type:
- tools_gw.get_rows_by_feature_type(self, dialog, table_object, feature_type)
+ tools_gw.get_rows_by_feature_type(self, dialog, table_object, feature_type, feature_id=doc_id, feature_idname="doc_id")
+
+
+ def convert_to_degrees(self, value):
+ """ Convert GPS coordinates stored in EXIF to degrees """
+ d = float(value[0])
+ m = float(value[1])
+ s = float(value[2])
+ return d + (m / 60.0) + (s / 3600.0)
+
+
+ def get_geolocation_gdal(self, file_path):
+ """ Extract geolocation metadata from an image file using GDAL """
+ dataset = gdal.Open(file_path)
+ if not dataset:
+ return None
+
+ metadata = dataset.GetMetadata()
+ if not metadata:
+ return None
+
+ lat = metadata.get("EXIF_GPSLatitude")
+ lat_ref = metadata.get("EXIF_GPSLatitudeRef")
+ lon = metadata.get("EXIF_GPSLongitude")
+ lon_ref = metadata.get("EXIF_GPSLongitudeRef")
+ epsg = lib_vars.data_epsg
+
+ if lat and lon and lat_ref and lon_ref:
+ lat_values = lat.strip("()").split()
+ lon_values = lon.strip("()").split()
+ lat_values = [v.strip("(),") for v in lat_values]
+ lon_values = [v.strip("(),") for v in lon_values]
+
+ lat = self.convert_to_degrees(lat_values)
+ if lat_ref != "N":
+ lat = -lat
+ lon = self.convert_to_degrees(lon_values)
+ if lon_ref != "E":
+ lon = -lon
+
+ # Perform coordinate transformation
+ crs_in = CRS.from_epsg(4326)
+ crs_out = CRS.from_epsg(epsg)
+ transformer = Transformer.from_crs(crs_in, crs_out, always_xy=True)
+ x, y = transformer.transform(lon, lat)
+
+ return x, y
+
# endregion
\ No newline at end of file
diff --git a/core/shared/info.py b/core/shared/info.py
index 0b41c51fd..407c5d662 100644
--- a/core/shared/info.py
+++ b/core/shared/info.py
@@ -31,7 +31,7 @@
from .element import GwElement
from .visit_gallery import GwVisitGallery
from .visit import GwVisit
-
+from .workcat import GwWorkcat
from ..utils import tools_gw, tools_backend_calls
from ..threads.toggle_valve_state import GwToggleValveTask
@@ -374,7 +374,7 @@ def _manage_new_feature(self, complet_result, dialog):
for field in result['fields']:
if 'hidden' in field and field['hidden']:
continue
- if 'layoutname' in field and field['layoutname'] == 'lyt_none':
+ if 'layoutname' in field and field['layoutname'] in ('lyt_none', 'lyt_buttons'):
continue
if field.get('tabname') not in ('tab_data', 'tab_none'):
continue
@@ -434,8 +434,7 @@ def _open_generic_form(self, complet_result):
pass
finally:
action_edit.setEnabled(is_enabled)
-
- action_edit.triggered.connect(partial(self._manage_edition, self.dlg_generic, action_edit, fid, new_feature, True))
+ action_edit.triggered.connect(partial(self._manage_edition, self.dlg_generic, action_edit, fid, new_feature, generic=True))
action_edit.setChecked(layer.isEditable() and can_edit)
# Signals
@@ -514,11 +513,27 @@ def _open_custom_form(self, feature_id, complet_result, tab_type=None, sub_tag=N
for tab in self.visible_tabs:
tabs_to_show.append(self.visible_tabs[tab]['tabName'])
- for x in range(self.tab_main.count() - 1, 0, -1):
- if self.tab_main.widget(x).objectName() not in tabs_to_show:
- tools_qt.remove_tab(self.tab_main, self.tab_main.widget(x).objectName())
- elif new_feature and self.tab_main.widget(x).objectName() != 'tab_data':
- tools_qt.enable_tab_by_tab_name(self.tab_main, self.tab_main.widget(x).objectName(), False)
+ # Reorder tabs
+ tab_order = {}
+ for tab in self.visible_tabs.values():
+ tab_order[tab['tabName']] = tab['orderby']
+
+ for tab_name, tab_index in sorted(tab_order.items(), key=lambda item: item[1]):
+ old_position = tools_qt.get_tab_index_by_tab_name(self.tab_main, tab_name)
+ new_position = tab_index
+ self.tab_main.tabBar().moveTab(old_position, new_position)
+
+ for x in range(self.tab_main.count() - 1, -1, -1):
+ tab_name = self.tab_main.widget(x).objectName()
+ try:
+ self.tab_main.setTabText(x, self.visible_tabs[tab_name]['tabLabel'])
+ self.tab_main.setTabToolTip(x, self.visible_tabs[tab_name]['tooltip'])
+ except Exception as e:
+ pass
+ if tab_name not in tabs_to_show:
+ tools_qt.remove_tab(self.tab_main, tab_name)
+ elif new_feature and tab_name != 'tab_data':
+ tools_qt.enable_tab_by_tab_name(self.tab_main, tab_name, False)
# Actions
self._get_actions()
@@ -811,11 +826,10 @@ def _manage_actions_signals(self, complet_result, list_points, new_feature, tab_
child_type = complet_result['body']['feature']['childType']
# Actions signals
- self.action_edit.triggered.connect(partial(self._manage_edition, dlg_cf, self.action_edit, fid, new_feature, False))
+ self.action_edit.triggered.connect(partial(self._manage_edition, dlg_cf, self.action_edit, fid, new_feature, generic=False))
+ self.dlg_cf.btn_apply.clicked.connect(partial(self._manage_edition, dlg_cf, self.action_edit, fid, new_feature, False, from_apply=True))
self.action_catalog.triggered.connect(partial(self._open_catalog, tab_type, self.feature_type, child_type))
- self.action_workcat.triggered.connect(
- partial(self._get_catalog, 'new_workcat', self.tablename, child_type, self.feature_id, list_points,
- id_name))
+ self.action_workcat.triggered.connect(partial(GwWorkcat(self.iface, self.canvas).create_workcat))
self.action_mapzone.triggered.connect(
partial(self._get_catalog, 'new_mapzone', self.tablename, child_type, self.feature_id, list_points,
id_name))
@@ -1583,13 +1597,12 @@ def _get_last_value(self, dialog, generic=False):
pass
- def _manage_edition(self, dialog, action_edit, fid, new_feature=None, generic=False):
+ def _manage_edition(self, dialog, action_edit, fid, new_feature=None, generic=False, from_apply=False):
# With the editing QAction we need to collect the last modified value (self.get_last_value()),
# since the "editingFinished" signals of the widgets are not detected.
# Therefore whenever the cursor enters a widget, it will ask if we want to save changes
-
- if not action_edit.isChecked():
+ if not action_edit.isChecked() or from_apply:
self._get_last_value(dialog, generic)
if str(self.my_json) == '{}' and str(self.my_json_epa) == '{}':
tools_qt.set_action_checked(action_edit, False)
@@ -1613,6 +1626,11 @@ def _manage_edition(self, dialog, action_edit, fid, new_feature=None, generic=Fa
if save and accepted:
self._reload_epa_tab(dialog)
self._reset_my_json()
+ if from_apply:
+ action_edit.setChecked(True)
+ tools_gw.enable_all(dialog, self.complet_result['body']['data'])
+ if self.epa_complet_result:
+ tools_gw.enable_all(dialog, self.epa_complet_result['body']['data'])
else:
tools_qt.set_action_checked(action_edit, True)
tools_gw.enable_all(dialog, self.complet_result['body']['data'])
@@ -1806,6 +1824,10 @@ def _accept(self, dialog, complet_result, _json, p_widget=None, clear_json=False
new_feature.setAttribute(k, v)
_json.pop(k, None)
+ epa_type = tools_qt.get_text(dialog, 'tab_data_epa_type')
+ if epa_type != 'null':
+ _json['epa_type'] = epa_type
+
if not self.layer_new_feature.isEditable():
self.layer_new_feature.startEditing()
self.layer_new_feature.updateFeature(new_feature)
@@ -1868,9 +1890,7 @@ def _accept(self, dialog, complet_result, _json, p_widget=None, clear_json=False
return False
if clear_json:
- _json = {}
-
- self._reset_my_json(False)
+ _json.clear()
if "Accepted" in json_result['status']:
msg_text = json_result['message']['text']
@@ -2118,17 +2138,23 @@ def _accept_auto_update(self, dialog, complet_result, _json, p_widget=None, clea
# Manage change epa_type message
if _json.get('epa_type'):
-
- widget_epatype = dialog.findChild(QComboBox, 'tab_data_epa_type')
- message = "You are going to change the epa_type. With this operation you will lose information about " \
- "current epa_type values of this object. Would you like to continue?"
- title = "Change epa_type"
- answer = tools_qt.show_question(message, title)
- if not answer:
- widget_epatype.blockSignals(True)
- tools_qt.set_combo_value(widget_epatype, self.epa_type, 1)
- widget_epatype.blockSignals(False)
- return
+ if new_feature is None:
+ can_edit = tools_os.set_boolean(tools_db.check_role_user('role_epa'))
+ if not can_edit:
+ message = "You are not enabled to modify this epa_type widget"
+ title = "Change epa_type"
+ tools_qt.show_info_box(message, title)
+ return
+ widget_epatype = dialog.findChild(QComboBox, 'tab_data_epa_type')
+ message = "You are going to change the epa_type. With this operation you will lose information about " \
+ "current epa_type values of this object. Would you like to continue?"
+ title = "Change epa_type"
+ answer = tools_qt.show_question(message, title)
+ if not answer:
+ widget_epatype.blockSignals(True)
+ tools_qt.set_combo_value(widget_epatype, self.epa_type, 1)
+ widget_epatype.blockSignals(False)
+ return
self.epa_type = _json.get('epa_type')
# Call accept fct
@@ -2267,18 +2293,7 @@ def _set_auto_update_combobox(self, field, dialog, widget, new_feature):
if widget.property('isfilter'): return widget
if widget.property('widgetcontrols') is not None and 'saveValue' in widget.property('widgetcontrols'):
if widget.property('widgetcontrols')['saveValue'] is False: return widget
-
- if self._check_tab_data(field): # Tab data
- if field['isautoupdate'] and self.new_feature_id is None:
- _json = {}
- widget.currentIndexChanged.connect(partial(self._clean_my_json, widget))
- widget.currentIndexChanged.connect(partial(tools_gw.get_values, dialog, widget, _json))
- widget.currentIndexChanged.connect(partial(self._accept_auto_update, dialog, self.complet_result, _json, widget, True, False, new_feature=new_feature))
- else:
- widget.currentIndexChanged.connect(partial(tools_gw.get_values, dialog, widget, self.my_json))
- else: # Other tabs
- widget.currentIndexChanged.connect(partial(tools_gw.get_values, dialog, widget, self.my_json_epa))
- # TODO: Make autoupdate widgets work
+ widget.currentIndexChanged.connect(partial(self._handle_combobox_change, widget, dialog, field))
return widget
@@ -2349,6 +2364,21 @@ def _set_auto_update_checkbox(self, field, dialog, widget, new_feature):
return widget
+ def _handle_combobox_change(self, widget, dialog, field):
+ _json = {}
+ if self._check_tab_data(field): # Tab data
+ if field['isautoupdate'] and self.new_feature_id is None:
+ self._clean_my_json(widget)
+ tools_gw.get_values(dialog, widget, _json)
+ self._accept_auto_update(dialog, self.complet_result, _json, widget, True, False,
+ new_feature=self.new_feature_id)
+ else:
+ tools_gw.get_values(dialog, widget, self.my_json)
+ else: # Other tabs
+ tools_gw.get_values(dialog, widget, self.my_json_epa)
+ # TODO: Make autoupdate widgets work for other tabs as well
+
+
def run_settopology(self, widget, **kwargs):
""" Sets node_1/2 from lineedit & converts widget into button if function run successfully """
@@ -2788,7 +2818,7 @@ def _fill_tbl(self, complet_result, dialog, widgetname, linkedobject, filter_fie
widget = tools_gw.add_tableview_header(widget, field)
widget = tools_gw.fill_tableview_rows(widget, field)
tools_qt.set_tableview_config(widget, edit_triggers=QTableView.DoubleClicked, sectionResizeMode=0)
- widget = tools_gw.set_tablemodel_config(dialog, widget, linkedobject, 1, True)
+ widget = tools_gw.set_tablemodel_config(dialog, widget, linkedobject, 1)
if 'tab_epa' in widgetname:
widget.doubleClicked.connect(partial(epa_tbl_doubleClicked, widget, self.dlg_cf))
model = widget.model()
@@ -3062,8 +3092,11 @@ def _get_id(self, dialog, action, option, emit_point, child_type, point, event):
""" Get selected attribute from snapped feature """
# @options{'key':['att to get from snapped feature', 'widget name destination']}
- options = {'arc': ['arc_id', 'tab_data_arc_id'], 'node': ['node_id', 'tab_data_parent_id'],
- 'set_to_arc': ['arc_id', '_set_to_arc']}
+ options = {
+ 'arc': ['arc_id', 'tab_data_arc_id'],
+ 'node': ['node_id', 'tab_data_parent_id'],
+ 'set_to_arc': ['arc_id', '_set_to_arc']
+ }
if event == Qt.RightButton:
self._cancel_snapping_tool(dialog, action)
@@ -3134,6 +3167,9 @@ def _set_to_arc(self, feat_id, child_type):
level = int(json_result['message']['level'])
tools_qgis.show_message(json_result['message']['text'], level)
+ # Refresh to_arc from tab_data
+ tools_qt.set_widget_text(self.dlg_cf, "tab_data_to_arc", feat_id)
+
# Refresh tab epa
epa_type = tools_qt.get_text(self.dlg_cf, 'tab_data_epa_type')
if epa_type and epa_type.lower() in ('valve', 'shortpipe', 'pump'):
@@ -3375,7 +3411,7 @@ def open_epa_dlg(**kwargs):
complet_list = get_list(view, id_name, feature_id)
fill_tbl(complet_list, tbl, info, view, info.dlg)
- tools_gw.set_tablemodel_config(info.dlg, tbl, view, schema_name=info.schema_name, isQStandardItemModel=True)
+ tools_gw.set_tablemodel_config(info.dlg, tbl, view, schema_name=info.schema_name)
info.dlg.btn_accept.clicked.connect(partial(save_tbl_changes, view, info, info.dlg, pk))
# Add & Delete buttons
@@ -3547,7 +3583,7 @@ def refresh_epa_tbl(tblview, dlg, **kwargs):
view = tableview['view']
complet_list = get_list(view, id_name, feature_id)
fill_tbl(complet_list, tbl, info, view, dlg)
- tools_gw.set_tablemodel_config(dlg, tbl, view, schema_name=info.schema_name, isQStandardItemModel=True)
+ tools_gw.set_tablemodel_config(dlg, tbl, view, schema_name=info.schema_name)
def reload_tbl_dscenario(info, tablename, tableview, id_name, feature_id):
diff --git a/core/shared/psector.py b/core/shared/psector.py
index 9ca95838d..71c3ca771 100644
--- a/core/shared/psector.py
+++ b/core/shared/psector.py
@@ -16,7 +16,7 @@
from sip import isdeleted
from qgis.PyQt.QtCore import Qt
-from qgis.PyQt.QtGui import QDoubleValidator, QIntValidator, QKeySequence, QColor
+from qgis.PyQt.QtGui import QDoubleValidator, QIntValidator, QKeySequence, QColor, QCursor
from qgis.PyQt.QtSql import QSqlQueryModel, QSqlTableModel, QSqlError
from qgis.PyQt.QtWidgets import QAbstractItemView, QAction, QCheckBox, QComboBox, QDateEdit, QLabel, \
QLineEdit, QTableView, QWidget, QDoubleSpinBox, QTextEdit, QPushButton, QGridLayout, QMenu
@@ -26,7 +26,7 @@
from .document import GwDocument, global_vars
from ..toolbars.utilities.toolbox_btn import GwToolBoxButton
from ..shared.psector_duplicate import GwPsectorDuplicate
-from ..ui.ui_manager import GwPsectorUi, GwPsectorRapportUi, GwPsectorManagerUi, GwPriceManagerUi, GwReplaceArc, GwPsectorRepairUi
+from ..ui.ui_manager import GwPsectorUi, GwPsectorRapportUi, GwPsectorManagerUi, GwReplaceArc, GwPsectorRepairUi
from ..utils import tools_gw
from ...libs import lib_vars, tools_db, tools_qgis, tools_qt, tools_log, tools_os
from ..utils.snap_manager import GwSnapManager
@@ -375,9 +375,9 @@ def get_psector(self, psector_id=None, list_coord=None):
if not canvas_rec.intersects(psector_rec) or (psector_rec.width() < (canvas_width * 10) / 100 or psector_rec.height() < (canvas_height * 10) / 100):
max_x, max_y, min_x, min_y = tools_qgis.get_max_rectangle_from_coords(list_coord)
tools_qgis.zoom_to_rectangle(max_x, max_y, min_x, min_y, margin=50)
-
- filter_ = "psector_id = '" + str(psector_id) + "'"
- message = tools_qt.fill_table(self.tbl_document, f"v_ui_doc_x_psector", filter_)
+ self.psector_name = self.dlg_plan_psector.findChild(QLineEdit, "name").text()
+ filter_ = f"psector_name = '{self.psector_name}'"
+ message = tools_qt.fill_table(self.tbl_document, "v_ui_doc_x_psector", filter_)
if message:
tools_qgis.show_warning(message, dialog=self.dlg_plan_psector)
self.tbl_document.doubleClicked.connect(partial(tools_qt.document_open, self.tbl_document, 'path'))
@@ -459,13 +459,13 @@ def get_psector(self, psector_id=None, list_coord=None):
self.dlg_plan_psector.other.editingFinished.connect(partial(self.calculate_percents, 'plan_psector', 'other'))
self.dlg_plan_psector.btn_doc_insert.clicked.connect(self.document_insert)
- self.dlg_plan_psector.btn_doc_delete.clicked.connect(partial(tools_qt.delete_rows_tableview, self.tbl_document))
+ self.dlg_plan_psector.btn_doc_delete.clicked.connect(partial(tools_gw.delete_selected_rows, self.tbl_document, 'doc_x_psector'))
self.dlg_plan_psector.btn_doc_new.clicked.connect(partial(self.manage_document, self.tbl_document))
self.dlg_plan_psector.btn_open_doc.clicked.connect(partial(tools_qt.document_open, self.tbl_document, 'path'))
self.cmb_status.currentIndexChanged.connect(partial(self.show_status_warning))
# Create list for completer QLineEdit
- sql = "SELECT DISTINCT(id) FROM v_ui_document ORDER BY id"
+ sql = "SELECT DISTINCT(name) FROM v_ui_doc ORDER BY name"
list_items = tools_db.create_list_for_completer(sql)
tools_qt.set_completer_lineedit(self.dlg_plan_psector.doc_id, list_items)
@@ -870,7 +870,7 @@ def enable_buttons(self, enabled):
def enable_relation_tab(self, tablename):
psector_name = f"{tools_qt.get_text(self.dlg_plan_psector, self.dlg_plan_psector.name)}"
- sql = f"SELECT name FROM {tablename} WHERE LOWER(name) = '{psector_name}'"
+ sql = f"SELECT name FROM {tablename} WHERE name = '{psector_name}'"
rows = tools_db.get_rows(sql)
if not rows:
if self.dlg_plan_psector.name.text() != '':
@@ -894,7 +894,8 @@ def check_tab_position(self):
elif self.dlg_plan_psector.tabWidget.currentIndex() == 4:
self.populate_budget(self.dlg_plan_psector, psector_id)
elif self.dlg_plan_psector.tabWidget.currentIndex() == 5:
- expr = f"psector_id = '{psector_id}'"
+ self.psector_name = self.dlg_plan_psector.findChild(QLineEdit, "name").text()
+ expr = f"psector_name = '{self.psector_name}'"
message = tools_qt.fill_table(self.tbl_document, f"{self.schema_name}.v_ui_doc_x_psector", expr)
tools_gw.set_tablemodel_config(self.dlg_plan_psector, self.tbl_document, "v_ui_doc_x_psector")
if message:
@@ -1584,10 +1585,10 @@ def manage_update_state(self, model, row, record):
def document_insert(self):
""" Insert a document related to the current visit """
- doc_id = self.doc_id.text()
+ doc_name = self.doc_id.text()
psector_id = self.psector_id.text()
- if not doc_id:
- message = "You need to insert doc_id"
+ if not doc_name:
+ message = "You need to insert a document name"
tools_qgis.show_warning(message, dialog=self.dlg_plan_psector)
return
if not psector_id:
@@ -1595,6 +1596,16 @@ def document_insert(self):
tools_qgis.show_warning(message, dialog=self.dlg_plan_psector)
return
+ # Get doc_id using doc_name
+ sql = f"SELECT id FROM doc WHERE name = '{doc_name}'"
+ row = tools_db.get_row(sql)
+ if not row:
+ message = "Document name not found"
+ tools_qgis.show_warning(message, dialog=self.dlg_plan_psector)
+ return
+
+ doc_id = row['id']
+
# Check if document already exist
sql = (f"SELECT doc_id"
f" FROM doc_x_psector"
@@ -1613,6 +1624,7 @@ def document_insert(self):
message = "Document inserted successfully"
tools_qgis.show_info(message, dialog=self.dlg_plan_psector)
+ self.doc_id.clear()
self.dlg_plan_psector.tbl_document.model().select()
@@ -1925,39 +1937,19 @@ def multi_rows_delete(self, dialog, widget, table_name, column_id, label, action
tools_db.execute_sql(sql)
widget.model().select()
+ def _show_context_menu(self, pos):
+ """ Show custom context menu """
+ menu = QMenu(self.tbl_om_result_cat)
- def manage_prices(self):
- """ Button 50: Plan estimate result manager """
+ action_set_current = QAction("Current Result", self.tbl_om_result_cat)
+ action_set_current.triggered.connect(partial(self.update_price_vdefault))
+ menu.addAction(action_set_current)
- # Create the dialog and signals
- self.dlg_merm = GwPriceManagerUi(self)
- tools_gw.load_settings(self.dlg_merm)
+ action_delete = QAction("Delete", self.tbl_om_result_cat)
+ action_delete.triggered.connect(partial(self.delete_merm, self.dlg_merm))
+ menu.addAction(action_delete)
- # Set current value
- sql = (f"SELECT name FROM plan_result_cat WHERE result_id IN (SELECT result_id FROM selector_plan_result "
- f"WHERE cur_user = current_user)")
- row = tools_db.get_row(sql)
- if row:
- tools_qt.set_widget_text(self.dlg_merm, 'lbl_vdefault_price', str(row[0]))
-
- # Tables
- tablename = 'plan_result_cat'
- self.tbl_om_result_cat = self.dlg_merm.findChild(QTableView, "tbl_om_result_cat")
- tools_qt.set_tableview_config(self.tbl_om_result_cat)
-
- # Set signals
- self.dlg_merm.btn_cancel.clicked.connect(partial(tools_gw.close_dialog, self.dlg_merm))
- self.dlg_merm.rejected.connect(partial(tools_gw.close_dialog, self.dlg_merm))
- self.dlg_merm.btn_delete.clicked.connect(partial(self.delete_merm, self.dlg_merm))
- self.dlg_merm.btn_update_result.clicked.connect(partial(self.update_price_vdefault))
- self.dlg_merm.txt_name.textChanged.connect(partial(self.filter_merm, self.dlg_merm, tablename))
-
- self.fill_table(self.dlg_merm, self.tbl_om_result_cat, tablename)
- tools_gw.set_tablemodel_config(self.tbl_om_result_cat, self.dlg_merm.tbl_om_result_cat, tablename)
-
- # Open form
- self.dlg_merm.setWindowFlags(Qt.WindowStaysOnTopHint)
- tools_gw.open_dialog(self.dlg_merm, dlg_name="price_manager")
+ menu.exec(QCursor.pos())
def update_price_vdefault(self):
@@ -2184,15 +2176,11 @@ def _refresh_tables_relations(self):
tools_gw.load_tableview_psector(self.dlg_plan_psector, 'connec')
if self.project_type.upper() == 'UD':
tools_gw.load_tableview_psector(self.dlg_plan_psector, 'gully')
- tools_gw.set_tablemodel_config(self.dlg_plan_psector, "tbl_psector_x_arc", self.tablename_psector_x_arc,
- isQStandardItemModel=True)
- tools_gw.set_tablemodel_config(self.dlg_plan_psector, "tbl_psector_x_node", self.tablename_psector_x_node,
- isQStandardItemModel=True)
- tools_gw.set_tablemodel_config(self.dlg_plan_psector, "tbl_psector_x_connec", self.tablename_psector_x_connec,
- isQStandardItemModel=True)
+ tools_gw.set_tablemodel_config(self.dlg_plan_psector, "tbl_psector_x_arc", self.tablename_psector_x_arc)
+ tools_gw.set_tablemodel_config(self.dlg_plan_psector, "tbl_psector_x_node", self.tablename_psector_x_node)
+ tools_gw.set_tablemodel_config(self.dlg_plan_psector, "tbl_psector_x_connec", self.tablename_psector_x_connec)
if self.project_type.upper() == 'UD':
- tools_gw.set_tablemodel_config(self.dlg_plan_psector, "tbl_psector_x_gully", self.tablename_psector_x_gully,
- isQStandardItemModel=True)
+ tools_gw.set_tablemodel_config(self.dlg_plan_psector, "tbl_psector_x_gully", self.tablename_psector_x_gully)
def _check_layers_visible(self, layer_name, the_geom, field_id):
@@ -2373,7 +2361,7 @@ def _replace_arc(self):
def _open_arc_replace_form(self, point):
- self.dlg_replace_arc = GwReplaceArc()
+ self.dlg_replace_arc = GwReplaceArc(self)
tools_gw.load_settings(self.dlg_replace_arc)
event_point = self.snapper_manager.get_event_point(point=point)
diff --git a/core/shared/search.py b/core/shared/search.py
index cd78b84da..ca1e6d1da 100644
--- a/core/shared/search.py
+++ b/core/shared/search.py
@@ -5,28 +5,24 @@
or (at your option) any later version.
"""
# -*- coding: utf-8 -*-
-import csv
import os
import re
-import sys
from functools import partial
from qgis.PyQt.QtCore import QStringListModel, Qt, QTimer
-from qgis.PyQt.QtGui import QColor
-from qgis.PyQt.QtSql import QSqlTableModel
from qgis.PyQt.QtWidgets import QAbstractItemView, QComboBox, QCompleter, QFileDialog, QGridLayout, QHeaderView, \
QLabel, QLineEdit, QSizePolicy, QSpacerItem, QTableView, QTabWidget, QWidget, QDockWidget, QCheckBox
-from qgis.core import QgsPointXY, QgsGeometry
+from qgis.core import QgsPointXY
from libs import tools_os
-from .document import GwDocument
from .info import GwInfo
from .psector import GwPsector
from .visit import GwVisit
-from ..ui.ui_manager import GwInfoGenericUi, GwSearchWorkcatUi
+from .workcat import GwWorkcat
+from ..ui.ui_manager import GwInfoGenericUi
from ..utils import tools_gw
from ... import global_vars
-from ...libs import lib_vars, tools_db, tools_qgis, tools_qt
+from ...libs import lib_vars, tools_qgis, tools_qt
class GwSearch:
@@ -345,16 +341,8 @@ def _check_tab(self, completer):
# Tab 'workcat'
elif tab_selected == 'workcat':
- list_coord = re.search('\(\((.*)\)\)', str(item['sys_geometry']))
- if not list_coord:
- msg = "Empty coordinate list"
- tools_qgis.show_warning(msg)
- return
- points = tools_qgis.get_geometry_vertex(list_coord)
- tools_qgis.draw_polygon(points, self.rubber_band)
- max_x, max_y, min_x, min_y = tools_qgis.get_max_rectangle_from_coords(list_coord)
- tools_qgis.zoom_to_rectangle(max_x, max_y, min_x, min_y)
- self._workcat_open_table_items(item)
+ workcat_instance = GwWorkcat(global_vars.iface, global_vars.canvas)
+ workcat_instance.workcat_open_table_items(item)
return
# Tab 'psector'
@@ -495,7 +483,7 @@ def _add_combobox(self, field):
widget.setProperty('columnname', field['columnname'])
list_items = self._get_list_items(widget, field)
tools_qt.fill_combo_values(widget, list_items)
- tools_qt.set_combo_value(widget, field.get('selectedId'), 0)
+ tools_qt.set_combo_value(widget, field.get('selectedId'), 0, add_new=False)
# noinspection PyUnresolvedReferences
widget.currentIndexChanged.connect(partial(self._clear_lineedits))
@@ -582,438 +570,4 @@ def _select_row_by_feature_id(self, tab_main, feature_id, column_index=0):
row = matching_items[0].row()
tbl_hydro.selectRow(row)
- def _workcat_open_table_items(self, item):
- """ Create the view and open the dialog with his content """
-
- workcat_id = item['sys_id']
- field_id = item['filter_text']
- display_name = item['display_name']
- if workcat_id is None:
- return False
-
- self._update_selector_workcat(workcat_id)
- current_selectors = self._get_current_selectors()
- self._force_expl(workcat_id)
-
- self.items_dialog = GwSearchWorkcatUi(self)
-
- tools_gw.add_icon(self.items_dialog.btn_doc_insert, "111", sub_folder="24x24")
- tools_gw.add_icon(self.items_dialog.btn_doc_delete, "112", sub_folder="24x24")
- tools_gw.add_icon(self.items_dialog.btn_doc_new, "34", sub_folder="24x24")
- tools_gw.add_icon(self.items_dialog.btn_open_doc, "170")
-
- tools_gw.load_settings(self.items_dialog)
- self.items_dialog.btn_state1.setEnabled(False)
- self.items_dialog.btn_state0.setEnabled(False)
-
- search_csv_path = tools_gw.get_config_parser('btn_search', 'search_csv_path', "user", "session")
- tools_qt.set_widget_text(self.items_dialog, self.items_dialog.txt_path, search_csv_path)
-
- self.items_dialog.tbl_psm.setSelectionBehavior(QAbstractItemView.SelectRows)
- self.items_dialog.tbl_psm.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
- self.items_dialog.tbl_psm_end.setSelectionBehavior(QAbstractItemView.SelectRows)
- self.items_dialog.tbl_psm_end.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
- self.items_dialog.tbl_document.setSelectionBehavior(QAbstractItemView.SelectRows)
- self.items_dialog.tbl_document.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
-
- self._set_enable_qatable_by_state(self.items_dialog.tbl_psm, 1, self.items_dialog.btn_state1)
- self._set_enable_qatable_by_state(self.items_dialog.tbl_psm_end, 0, self.items_dialog.btn_state0)
-
- # Create list for completer QLineEdit
- sql = "SELECT DISTINCT(id) FROM v_ui_document ORDER BY id"
- list_items = tools_db.create_list_for_completer(sql)
- tools_qt.set_completer_lineedit(self.items_dialog.doc_id, list_items)
-
- table_name = "v_ui_workcat_x_feature"
- table_name_end = "v_ui_workcat_x_feature_end"
- table_doc = "v_ui_doc_x_workcat"
- self.items_dialog.btn_doc_insert.clicked.connect(
- partial(self._document_insert, self.items_dialog, 'doc_x_workcat', 'workcat_id', item['sys_id']))
- self.items_dialog.btn_doc_delete.clicked.connect(partial(tools_qt.delete_rows_tableview, self.items_dialog.tbl_document))
- self.items_dialog.btn_doc_new.clicked.connect(
- partial(self._manage_document, self.items_dialog.tbl_document, item['sys_id']))
- self.items_dialog.btn_open_doc.clicked.connect(partial(tools_qt.document_open, self.items_dialog.tbl_document, 'path'))
- self.items_dialog.tbl_document.doubleClicked.connect(
- partial(tools_qt.document_open, self.items_dialog.tbl_document, 'path'))
-
- self.items_dialog.btn_close.clicked.connect(partial(tools_gw.close_dialog, self.items_dialog))
- self.items_dialog.btn_path.clicked.connect(
- partial(self._get_folder_dialog, self.items_dialog, self.items_dialog.txt_path))
- self.items_dialog.rejected.connect(partial(self._restore_selectors, current_selectors))
- self.items_dialog.rejected.connect(partial(tools_gw.close_dialog, self.items_dialog))
- self.items_dialog.rejected.connect(self._reset_rubber_band)
- self.items_dialog.btn_state1.clicked.connect(
- partial(self._force_state, self.items_dialog.btn_state1, 1, self.items_dialog.tbl_psm))
- self.items_dialog.btn_state0.clicked.connect(
- partial(self._force_state, self.items_dialog.btn_state0, 0, self.items_dialog.tbl_psm_end))
- self.items_dialog.btn_export_to_csv.clicked.connect(
- partial(self.export_to_csv, self.items_dialog, self.items_dialog.tbl_psm, self.items_dialog.tbl_psm_end,
- self.items_dialog.txt_path))
-
- self.items_dialog.txt_name.textChanged.connect(partial(
- self._workcat_filter_by_text, self.items_dialog, self.items_dialog.tbl_psm, self.items_dialog.txt_name,
- table_name, workcat_id, field_id))
- self.items_dialog.txt_name_end.textChanged.connect(partial(
- self._workcat_filter_by_text, self.items_dialog, self.items_dialog.tbl_psm_end,
- self.items_dialog.txt_name_end, table_name_end, workcat_id, field_id))
- self.items_dialog.tbl_psm.doubleClicked.connect(partial(self._open_feature_form, self.items_dialog.tbl_psm))
- self.items_dialog.tbl_psm.clicked.connect(partial(self._get_parameters, self.items_dialog.tbl_psm))
- self.items_dialog.tbl_psm_end.doubleClicked.connect(partial(self._open_feature_form, self.items_dialog.tbl_psm_end))
- self.items_dialog.tbl_psm_end.clicked.connect(partial(self._get_parameters, self.items_dialog.tbl_psm_end))
-
- expr = "workcat_id ILIKE '%" + str(workcat_id) + "%'"
- self._workcat_fill_table(self.items_dialog.tbl_psm, table_name, expr=expr)
- tools_gw.set_tablemodel_config(self.items_dialog, self.items_dialog.tbl_psm, table_name)
- expr = "workcat_id ILIKE '%" + str(workcat_id) + "%'"
- self._workcat_fill_table(self.items_dialog.tbl_psm_end, table_name_end, expr=expr)
- tools_gw.set_tablemodel_config(self.items_dialog, self.items_dialog.tbl_psm_end, table_name_end)
- expr = "workcat_id ILIKE '%" + str(workcat_id) + "%'"
- self._workcat_fill_table(self.items_dialog.tbl_document, table_doc, expr=expr)
- tools_gw.set_tablemodel_config(self.items_dialog, self.items_dialog.tbl_document, table_doc)
-
- # Add data to workcat search form
- table_name = "v_ui_workcat_x_feature"
- table_name_end = "v_ui_workcat_x_feature_end"
- extension = '_end'
- self._fill_label_data(workcat_id, table_name)
- self._fill_label_data(workcat_id, table_name_end, extension)
-
- tools_gw.open_dialog(self.items_dialog, dlg_name='search_workcat')
- title = self.items_dialog.windowTitle()
- self.items_dialog.setWindowTitle(f"{title} - {display_name}")
- text = tools_qt.get_text(self.items_dialog, self.items_dialog.lbl_init, False, False)
- tools_qt.set_widget_text(self.items_dialog, self.items_dialog.lbl_init, f"{text} {field_id}")
- text = tools_qt.get_text(self.items_dialog, self.items_dialog.lbl_end, False, False)
- tools_qt.set_widget_text(self.items_dialog, self.items_dialog.lbl_end, f"{text} {field_id}")
-
-
- def _manage_document(self, qtable, item_id):
- """ Access GUI to manage documents e.g Execute action of button 34 """
-
- manage_document = GwDocument(single_tool=False)
- dlg_docman = manage_document.get_document(tablename='workcat', qtable=qtable, item_id=item_id)
- dlg_docman.btn_accept.clicked.connect(partial(tools_gw.set_completer_object, dlg_docman, 'doc'))
- tools_qt.remove_tab(dlg_docman.tabWidget, 'tab_rel')
-
-
- def _get_current_selectors(self):
- """ Take the current selector_expl and selector_state to restore them at the end of the operation """
-
- current_tab = tools_gw.get_config_parser('dialogs_tab', 'selector_basic', "user", "session")
- form = f'"currentTab":"{current_tab}"'
- extras = f'"selectorType":"selector_basic", "filterText":""'
- body = tools_gw.create_body(form=form, extras=extras)
- json_result = tools_gw.execute_procedure('gw_fct_getselectors', body)
- return json_result
-
-
- def _restore_selectors(self, current_selectors):
- """ Restore selector_expl and selector_state to how the user had it """
-
- qgis_project_add_schema = lib_vars.project_vars['add_schema']
- for form_tab in current_selectors['body']['form']['formTabs']:
- if form_tab['tableName'] not in ('selector_expl', 'selector_state'):
- continue
- selector_type = form_tab['selectorType']
- tab_name = form_tab['tabName']
- field_id = None
- if form_tab['tableName'] == 'selector_expl':
- field_id = 'expl_id'
- elif form_tab['tableName'] == 'selector_state':
- field_id = 'id'
- for field in form_tab['fields']:
- _id = field[field_id]
- extras = (f'"selectorType":"{selector_type}", "tabName":"{tab_name}", '
- f'"id":"{_id}", "isAlone":"False", "value":"{field["value"]}", '
- f'"addSchema":"{qgis_project_add_schema}"')
- body = tools_gw.create_body(extras=extras)
- tools_gw.execute_procedure('gw_fct_setselectors', body)
- tools_qgis.refresh_map_canvas()
-
-
- def _force_expl(self, workcat_id):
- """ Active exploitations are compared with workcat farms.
- If there is consistency nothing happens, if there is no consistency force this exploitations to selector."""
-
- sql = (f"SELECT a.expl_id, a.expl_name FROM "
- f" (SELECT expl_id, expl_name FROM v_ui_workcat_x_feature "
- f" WHERE workcat_id='{workcat_id}' "
- f" UNION SELECT expl_id, expl_name FROM v_ui_workcat_x_feature_end "
- f" WHERE workcat_id='{workcat_id}'"
- f" ) AS a "
- f" WHERE expl_id NOT IN "
- f" (SELECT expl_id FROM selector_expl "
- f" WHERE cur_user=current_user)")
- rows = tools_db.get_rows(sql)
- if not rows:
- return
-
- if len(rows) > 0:
- for row in rows:
- sql = (f"INSERT INTO selector_expl(expl_id, cur_user) "
- f" VALUES('{row[0]}', current_user)")
- tools_db.execute_sql(sql)
- msg = "Your exploitation selector has been updated"
- tools_qgis.show_info(msg)
-
-
- def _update_selector_workcat(self, workcat_id):
- """ Update table selector_workcat """
-
- sql = ("DELETE FROM selector_workcat "
- " WHERE cur_user = current_user;\n")
- sql += (f"INSERT INTO selector_workcat(workcat_id, cur_user) "
- f" VALUES('{workcat_id}', current_user);\n")
- tools_db.execute_sql(sql)
-
-
- def _set_enable_qatable_by_state(self, qtable, _id, qbutton):
-
- sql = (f"SELECT state_id FROM selector_state "
- f" WHERE cur_user = current_user AND state_id ='{_id}'")
- row = tools_db.get_row(sql)
- if row is None:
- qtable.setEnabled(False)
- qbutton.setEnabled(True)
-
-
- def _get_folder_dialog(self, dialog, widget):
- """ Get folder dialog """
-
- widget.setStyleSheet(None)
- try:
- folder_path = os.path.expanduser("~/Documents" if os.name == 'nt' else "~")
- except Exception:
- folder_path = os.path.expanduser("~")
-
- # Open dialog to select folder
- os.chdir(folder_path)
- file_dialog = QFileDialog()
- file_dialog.setFileMode(QFileDialog.Directory)
-
- msg = "Save as"
- folder_path, filter_ = file_dialog.getSaveFileName(None, tools_qt.tr(msg), folder_path, '*.csv')
- if folder_path:
- tools_qt.set_widget_text(dialog, widget, str(folder_path))
-
-
- def _force_state(self, qbutton, state, qtable):
- """ Force selected state and set qtable enabled = True """
-
- sql = (f"SELECT state_id "
- f"FROM selector_state "
- f"WHERE cur_user = current_user AND state_id = '{state}'")
- row = tools_db.get_row(sql)
- if row:
- return
-
- sql = (f"INSERT INTO selector_state(state_id, cur_user) "
- f"VALUES('{state}', current_user)")
- tools_db.execute_sql(sql)
- qtable.setEnabled(True)
- qbutton.setEnabled(False)
- tools_qgis.refresh_map_canvas()
- qtable.model().select()
-
-
- def _write_to_csv(self, dialog, folder_path=None, all_rows=None):
-
- with open(folder_path, "w") as output:
- writer = csv.writer(output, lineterminator='\n')
- writer.writerows(all_rows)
- tools_gw.set_config_parser('btn_search', 'search_csv_path', f"{tools_qt.get_text(dialog, 'txt_path')}")
- message = "The csv file has been successfully exported"
- tools_qgis.show_info(message, dialog=dialog)
-
-
- def _workcat_filter_by_text(self, dialog, qtable, widget_txt, table_name, workcat_id, field_id):
- """ Filter list of workcats by workcat_id and field_id """
-
- result_select = tools_qt.get_text(dialog, widget_txt)
- if result_select != 'null':
- expr = (f"workcat_id = '{workcat_id}'"
- f" and {field_id} ILIKE '%{result_select}%'")
- else:
- expr = f"workcat_id ILIKE '%{workcat_id}%'"
- self._workcat_fill_table(qtable, table_name, expr=expr)
- tools_gw.set_tablemodel_config(dialog, qtable, table_name)
-
-
- def _workcat_fill_table(self, widget, table_name, set_edit_triggers=QTableView.NoEditTriggers, expr=None):
- """ Fill table @widget filtering query by @workcat_id
- Set a model with selected filter.
- Attach that model to selected table
- @setEditStrategy:
- 0: OnFieldChange
- 1: OnRowChange
- 2: OnManualSubmit
- """
-
- if self.schema_name not in table_name:
- table_name = self.schema_name + "." + table_name
-
- # Set model
- model = QSqlTableModel(db=lib_vars.qgis_db_credentials)
- model.setTable(table_name)
- model.setEditStrategy(QSqlTableModel.OnFieldChange)
- model.setSort(0, 0)
- model.select()
-
- widget.setEditTriggers(set_edit_triggers)
- # Check for errors
- if model.lastError().isValid():
- if 'Unable to find table' in model.lastError().text():
- tools_db.reset_qsqldatabase_connection(self.items_dialog)
- else:
- tools_qgis.show_warning(model.lastError().text(), dialog=self.items_dialog)
- # Attach model to table view
- if expr:
- widget.setModel(model)
- widget.model().setFilter(expr)
- else:
- widget.setModel(model)
-
-
- def _open_feature_form(self, qtable):
- """ Zoom feature with the code set in 'network_code' of the layer set in 'network_feature_type' """
-
- tools_gw.reset_rubberband(self.aux_rubber_band)
- # Get selected code from combo
- element = qtable.selectionModel().selectedRows()
- if len(element) == 0:
- message = "Any record selected"
- tools_qgis.show_warning(message)
- return
-
- row = element[0].row()
-
- feature_type = qtable.model().record(row).value('feature_type').lower()
- table_name = "v_edit_" + feature_type
-
- feature_id = qtable.model().record(row).value('feature_id')
-
- self.customForm = GwInfo(tab_type='data')
- complet_result, dialog = self.customForm.get_info_from_id(table_name, feature_id, 'data')
-
- # Get list of all coords in field geometry
- try:
- list_coord = re.search('\((.*)\)', str(complet_result['body']['feature']['geometry']['st_astext']))
- max_x, max_y, min_x, min_y = tools_qgis.get_max_rectangle_from_coords(list_coord)
- tools_qgis.zoom_to_rectangle(max_x, max_y, min_x, min_y, 1)
- except Exception:
- pass
-
-
- def _fill_label_data(self, workcat_id, table_name, extension=None):
-
- if workcat_id == "null":
- return
-
- features = ['NODE', 'CONNEC', 'GULLY', 'ELEMENT', 'ARC']
- for feature in features:
- sql = (f"SELECT feature_id "
- f" FROM {table_name}")
- sql += f" WHERE workcat_id = '{workcat_id}' AND feature_type = '{feature}'"
- rows = tools_db.get_rows(sql)
- if extension is not None:
- widget_name = f"lbl_total_{feature.lower()}{extension}"
- else:
- widget_name = f"lbl_total_{feature.lower()}"
-
- widget = self.items_dialog.findChild(QLabel, str(widget_name))
- if not rows:
- total = 0
- else:
- total = len(rows)
-
- # Add data to workcat search form
- widget.setText(str(feature.lower().title()) + "s: " + str(total))
- if self.project_type == 'ws' and feature == 'GULLY':
- widget.setVisible(False)
-
- if not rows:
- continue
-
- length = 0
- if feature == 'ARC':
- for row in rows:
- arc_id = str(row[0])
- sql = (f"SELECT st_length2d(the_geom)::numeric(12,2) "
- f" FROM arc"
- f" WHERE arc_id = '{arc_id}'")
- row = tools_db.get_row(sql)
- if row:
- length = length + row[0]
- else:
- message = "Some data is missing. Check gis_length for arc"
- tools_qgis.show_warning(message, parameter=arc_id, dialog=self.items_dialog)
- return
- if extension is not None:
- widget = self.items_dialog.findChild(QLabel, f"lbl_length{extension}")
- else:
- widget = self.items_dialog.findChild(QLabel, "lbl_length")
-
- # Add data to workcat search form
- widget.setText(f"Total arcs length: {length}")
-
-
- def _document_insert(self, dialog, tablename, field, field_value):
- """
- Insert a document related to the current visit
- :param dialog: (QDialog )
- :param tablename: Name of the table to make the queries (String)
- :param field: Field of the table to make the where clause (String)
- :param field_value: Value to compare in the clause where (String)
- """
-
- doc_id = dialog.doc_id.text()
- if not doc_id:
- message = "You need to insert doc_id"
- tools_qgis.show_warning(message, dialog=dialog)
- return
-
- # Check if document already exist
- sql = (f"SELECT doc_id"
- f" FROM {tablename}"
- f" WHERE doc_id = '{doc_id}' AND {field} = '{field_value}'")
- row = tools_db.get_row(sql)
- if row:
- msg = "Document already exist"
- tools_qgis.show_warning(msg, dialog=dialog)
- return
-
- # Insert into new table
- sql = (f"INSERT INTO {tablename} (doc_id, {field})"
- f" VALUES ('{doc_id}', '{field_value}')")
- status = tools_db.execute_sql(sql)
- if status:
- message = "Document inserted successfully"
- tools_qgis.show_info(message, dialog=dialog)
-
- dialog.tbl_document.model().select()
-
-
- def _get_parameters(self, qtable, index):
-
- tools_gw.reset_rubberband(self.aux_rubber_band)
- row = index.row()
- column_index = tools_qt.get_col_index_by_col_name(qtable, 'feature_type')
- feature_type = index.sibling(row, column_index).data().lower()
- column_index = tools_qt.get_col_index_by_col_name(qtable, 'feature_id')
- feature_id = index.sibling(row, column_index).data()
- layer = tools_qgis.get_layer_by_tablename(f"v_edit_{feature_type}")
- if not layer:
- return
-
- feature = tools_qt.get_feature_by_id(layer, feature_id, f"{feature_type}_id")
- try:
- width = {"arc": 5}
- geometry = feature.geometry()
- self.aux_rubber_band.setToGeometry(geometry, None)
- self.aux_rubber_band.setColor(QColor(255, 0, 0, 125))
- self.aux_rubber_band.setWidth(width.get(feature_type, 10))
- self.aux_rubber_band.show()
- except AttributeError:
- pass
-
# endregion
diff --git a/core/shared/selector.py b/core/shared/selector.py
index b866b2460..7bf951936 100644
--- a/core/shared/selector.py
+++ b/core/shared/selector.py
@@ -412,8 +412,8 @@ def _set_selector(self, dialog, widget, is_alone, disable_parent, check_all_over
search_class = docker_search.property('class')
search_class.refresh_tab()
elif tab_name == 'tab_sector':
- # Reload epa world filters if sector changed
- tools_gw.set_epa_world(selector_change=True)
+ """# TODO: Reload epa world filters if sector changed"""
+ # tools_gw.set_epa_world(selector_change=True)
widget_filter = tools_qt.get_widget(dialog, f"txt_filter_{tab_name}")
if widget_filter and tools_qt.get_text(dialog, widget_filter, False, False) not in (None, ''):
diff --git a/core/shared/visit.py b/core/shared/visit.py
index 33dcccc80..a827501b0 100644
--- a/core/shared/visit.py
+++ b/core/shared/visit.py
@@ -493,8 +493,8 @@ def _set_signals(self):
self.dlg_add_visit.btn_event_update.clicked.connect(self._event_update)
self.tabs.currentChanged.connect(partial(self._manage_tab_changed, self.dlg_add_visit))
self.visit_id.textChanged.connect(partial(self._manage_visit_id_change, self.dlg_add_visit))
- self.dlg_add_visit.btn_doc_insert.clicked.connect(self._document_insert)
- self.dlg_add_visit.btn_doc_delete.clicked.connect(self._document_delete)
+ self.dlg_add_visit.btn_doc_insert.clicked.connect(partial(self._document_insert, self.dlg_add_visit))
+ self.dlg_add_visit.btn_doc_delete.clicked.connect(partial(self._document_delete, self.dlg_add_visit))
self.dlg_add_visit.btn_doc_new.clicked.connect(self._manage_document)
self.dlg_add_visit.btn_open_doc.clicked.connect(partial(tools_qt.document_open, self.tbl_document, 'path'))
self.tbl_document.doubleClicked.connect(partial(tools_qt.document_open, self.tbl_document, 'path'))
@@ -1262,7 +1262,7 @@ def _set_completers(self):
self.dlg_add_visit.doc_id.setCompleter(self.completer)
model = QStringListModel()
- sql = "SELECT DISTINCT(id) FROM v_ui_document"
+ sql = "SELECT DISTINCT(name) FROM v_ui_doc ORDER BY name"
rows = tools_db.get_rows(sql)
values = []
if rows:
@@ -1724,18 +1724,38 @@ def _event_delete(self):
self._manage_events_changed()
- def _document_insert(self):
+ def _document_insert(self, dialog):
""" Insert a document related to the current visit. """
- doc_id = self.doc_id.text()
+ doc_name = self.doc_id.text()
visit_id = self.visit_id.text()
- if not doc_id:
- message = "You need to insert doc_id"
- tools_qgis.show_warning(message, dialog=self.dlg_add_visit)
+ if not doc_name:
+ message = "You need to insert a document name"
+ tools_qgis.show_warning(message, dialog=dialog)
return
if not visit_id:
message = "You need to insert visit_id"
- tools_qgis.show_warning(message, dialog=self.dlg_add_visit)
+ tools_qgis.show_warning(message, dialog=dialog)
+ return
+
+ # Get doc_id using doc_name
+ sql = f"SELECT id FROM doc WHERE name = '{doc_name}'"
+ row = tools_db.get_row(sql)
+ if not row:
+ message = "Document name not found"
+ tools_qgis.show_warning(message, dialog=dialog)
+ return
+
+ doc_id = row['id']
+
+ # Check if document already exists
+ sql = (f"SELECT doc_id"
+ f" FROM doc_x_visit"
+ f" WHERE doc_id = '{doc_id}' AND visit_id = '{visit_id}'")
+ row = tools_db.get_row(sql)
+ if row:
+ msg = "Document already exists"
+ tools_qgis.show_warning(msg, dialog=dialog)
return
# Insert into new table
@@ -1744,19 +1764,20 @@ def _document_insert(self):
status = tools_db.execute_sql(sql)
if status:
message = "Document inserted successfully"
- tools_qgis.show_info(message, dialog=self.dlg_add_visit)
+ tools_qgis.show_info(message, dialog=dialog)
self.dlg_add_visit.tbl_document.model().select()
+ self.doc_id.clear()
- def _document_delete(self):
+ def _document_delete(self, dialog):
""" Delete a document from the current visit. """
# Get selected rows. 0 is the column of the pk 0 'id'
selected_list = self.tbl_document.selectionModel().selectedRows(0)
if len(selected_list) == 0:
message = "Any record selected"
- tools_qt.show_info_box(message)
+ tools_qgis.show_warning(message, dialog=dialog)
return
selected_id = []
@@ -1773,7 +1794,7 @@ def _document_delete(self):
status = tools_db.execute_sql(sql)
if status:
message = "Documents deleted successfully"
- tools_qgis.show_info(message, dialog=self.dlg_add_visit)
+ tools_qgis.show_info(message, dialog=dialog)
self.tbl_document.model().select()
diff --git a/core/shared/workcat.py b/core/shared/workcat.py
new file mode 100644
index 000000000..3248f9c9f
--- /dev/null
+++ b/core/shared/workcat.py
@@ -0,0 +1,691 @@
+"""
+This file is part of Giswater 3
+The 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 3 of the License,
+or (at your option) any later version.
+"""
+# -*- coding: utf-8 -*-
+import csv
+import os
+import re
+from functools import partial
+
+from qgis.PyQt.QtCore import QDate, Qt
+from qgis.PyQt.QtGui import QColor, QStandardItemModel, QCursor
+from qgis.PyQt.QtSql import QSqlTableModel
+from qgis.PyQt.QtWidgets import QAbstractItemView, QComboBox, QFileDialog, QLabel, QHeaderView, QTableView, QMenu, QAction
+
+from .document import GwDocument
+from ..ui.ui_manager import GwWorkcatManagerUi, GwInfoWorkcatUi, GwSearchWorkcatUi
+from ..utils import tools_gw
+from ...libs import lib_vars, tools_db, tools_qgis, tools_qt, tools_os
+
+
+class GwWorkcat:
+ def __init__(self, iface, canvas):
+ self.iface = iface
+ self.canvas = canvas
+ self.schema_name = lib_vars.schema_name
+ self.project_type = tools_gw.get_project_type()
+ self.rubber_band = tools_gw.create_rubberband(self.canvas)
+ self.aux_rubber_band = tools_gw.create_rubberband(self.canvas)
+ self.items_dialog = None
+
+ def manage_workcats(self):
+ """ Manager to display and manage workcats """
+ self.dlg_man = GwWorkcatManagerUi(self)
+ self.dlg_man.setProperty('class_obj', self)
+ tools_gw.load_settings(self.dlg_man)
+ self.dlg_man.tbl_workcat.setSelectionBehavior(QAbstractItemView.SelectRows)
+ tools_qt.set_tableview_config(self.dlg_man.tbl_workcat)
+
+ # Populate custom context menu
+ self.dlg_man.tbl_workcat.setContextMenuPolicy(Qt.CustomContextMenu)
+ self.dlg_man.tbl_workcat.customContextMenuRequested.connect(self._show_context_menu)
+
+ # Auto-completion
+ table_object = "workcat"
+ tools_gw.set_completer_object(self.dlg_man, table_object, field_id="name")
+
+ # Fill table
+ status = self._fill_workcat_table()
+ if not status:
+ return False, False
+
+ # Set signals
+ self.dlg_man.workcat_name.textChanged.connect(self._fill_workcat_table)
+ self.dlg_man.tbl_workcat.doubleClicked.connect(
+ partial(self._open_selected_workcat, self.dlg_man, self.dlg_man.tbl_workcat))
+ self.dlg_man.btn_cancel.clicked.connect(partial(tools_gw.close_dialog, self.dlg_man))
+ self.dlg_man.rejected.connect(partial(tools_gw.close_dialog, self.dlg_man))
+ self.dlg_man.btn_delete.clicked.connect(self._handle_delete)
+ self.dlg_man.btn_create.clicked.connect(partial(self.create_workcat))
+
+ # Open form
+ tools_gw.open_dialog(self.dlg_man, dlg_name='workcat_manager')
+
+
+ def _handle_delete(self):
+ tools_gw.delete_selected_rows(self.dlg_man.tbl_workcat, "cat_work")
+ self._refresh_manager_table()
+
+
+ def _fill_workcat_table(self, filter_text=None):
+ view = "cat_work"
+ if filter_text is None:
+ filter_text = ""
+ complet_list = tools_gw.get_list(view, filter_name=filter_text, id_field="id")
+ if complet_list is False:
+ return False
+ for field in complet_list['body']['data']['fields']:
+ if field.get('hidden'):
+ continue
+ model = self.dlg_man.tbl_workcat.model()
+ if model is None:
+ model = QStandardItemModel()
+ self.dlg_man.tbl_workcat.setModel(model)
+ model.removeRows(0, model.rowCount())
+ if field['value']:
+ self.dlg_man.tbl_workcat = tools_gw.add_tableview_header(self.dlg_man.tbl_workcat, field)
+ self.dlg_man.tbl_workcat = tools_gw.fill_tableview_rows(self.dlg_man.tbl_workcat, field)
+ tools_gw.set_tablemodel_config(self.dlg_man, self.dlg_man.tbl_workcat, 'cat_work', 0)
+ tools_qt.set_tableview_config(self.dlg_man.tbl_workcat, sectionResizeMode=0)
+ return True
+
+
+ def _open_selected_workcat(self, dialog, widget):
+ selected_list = widget.selectionModel().selectedRows()
+ if len(selected_list) == 0:
+ message = "Any record selected"
+ tools_qgis.show_warning(message, dialog=dialog)
+ return
+ row = selected_list[0].row()
+ field_object_id = "id"
+ id_col_idx = tools_qt.get_col_index_by_col_name(widget, field_object_id)
+ selected_object_id = widget.model().item(row, id_col_idx).text()
+
+ keep_open_form = tools_gw.get_config_parser('dialogs_actions', 'workcat_manager_keep_open', "user", "init",
+ prefix=True)
+ if tools_os.set_boolean(keep_open_form, False) is not True:
+ dialog.close()
+
+ self.open_workcat(selected_object_id)
+
+
+ def open_workcat(self, workcat_id):
+ item = {'sys_id': workcat_id, 'filter_text': '', 'display_name': 'Workcat Details'}
+ self.workcat_open_table_items(item)
+
+
+ def _refresh_manager_table(self):
+ try:
+ if getattr(self, 'dlg_man', None):
+ self._fill_workcat_table()
+ except Exception as e:
+ print(f"Error refreshing manager table: {e}")
+
+ def create_workcat(self):
+ dialog = GwInfoWorkcatUi(self)
+ tools_gw.load_settings(dialog)
+ dialog.setWindowTitle("New Workcat")
+ dialog.builtdate.setDate(QDate.currentDate())
+ dialog.raise_()
+ dialog.activateWindow()
+ dialog.setWindowFlags(dialog.windowFlags() | Qt.WindowStaysOnTopHint)
+ dialog.btn_accept.clicked.connect(partial(self._save_new_workcat, dialog))
+ dialog.btn_cancel.clicked.connect(dialog.reject)
+
+ dialog.cat_work_id.textChanged.connect(partial(self._check_workcat_exists, dialog))
+
+ dialog.show()
+
+
+ def _save_new_workcat(self, dialog):
+ workid = dialog.cat_work_id.text()
+ descript = dialog.descript.toPlainText()
+ link = dialog.link.toPlainText()
+ workid_key1 = dialog.workid_key_1.text()
+ workid_key2 = dialog.workid_key_2.text()
+ builddate = dialog.builtdate.date().toString("yyyy-MM-dd")
+
+ sql = (f"INSERT INTO cat_work (id, descript, link, workid_key1, workid_key2, builtdate) "
+ f"VALUES ('{workid}', '{descript}', '{link}', '{workid_key1}', '{workid_key2}', '{builddate}')")
+
+ status = tools_db.execute_sql(sql)
+ if status:
+ tools_qgis.show_info("Workcat created successfully.")
+ self._refresh_manager_table()
+ dialog.accept()
+ else:
+ tools_qgis.show_warning("Error creating Workcat.")
+
+
+ def _check_workcat_exists(self, dialog):
+ workid = dialog.cat_work_id.text()
+ sql = f"SELECT id FROM cat_work WHERE id = '{workid}'"
+ row = tools_db.get_row(sql, log_info=False)
+ if row:
+ dialog.cat_work_id.setStyleSheet("border: 1px solid red")
+ dialog.btn_accept.setEnabled(False)
+ dialog.cat_work_id.setToolTip("Workcat ID already exists")
+ else:
+ dialog.cat_work_id.setStyleSheet("")
+ dialog.btn_accept.setEnabled(True)
+ dialog.cat_work_id.setToolTip("")
+
+
+ def workcat_open_table_items(self, item):
+ """ Create the view and open the dialog with his content """
+
+ workcat_id = item['sys_id']
+ field_id = item['filter_text']
+ display_name = item['display_name']
+ if workcat_id is None:
+ return False
+
+ self._update_selector_workcat(workcat_id)
+ current_selectors = self._get_current_selectors()
+ self._force_expl(workcat_id)
+
+ self.items_dialog = GwSearchWorkcatUi(self)
+
+ tools_gw.add_icon(self.items_dialog.btn_doc_insert, "111", sub_folder="24x24")
+ tools_gw.add_icon(self.items_dialog.btn_doc_delete, "112", sub_folder="24x24")
+ tools_gw.add_icon(self.items_dialog.btn_doc_new, "34", sub_folder="24x24")
+ tools_gw.add_icon(self.items_dialog.btn_open_doc, "170")
+
+ tools_gw.load_settings(self.items_dialog)
+ self.items_dialog.btn_state1.setEnabled(False)
+ self.items_dialog.btn_state0.setEnabled(False)
+
+ search_csv_path = tools_gw.get_config_parser('btn_search', 'search_csv_path', "user", "session")
+ tools_qt.set_widget_text(self.items_dialog, self.items_dialog.txt_path, search_csv_path)
+
+ self.items_dialog.tbl_psm.setSelectionBehavior(QAbstractItemView.SelectRows)
+ self.items_dialog.tbl_psm.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
+ self.items_dialog.tbl_psm_end.setSelectionBehavior(QAbstractItemView.SelectRows)
+ self.items_dialog.tbl_psm_end.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
+ self.items_dialog.tbl_document.setSelectionBehavior(QAbstractItemView.SelectRows)
+ self.items_dialog.tbl_document.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
+
+ self._set_enable_qatable_by_state(self.items_dialog.tbl_psm, 1, self.items_dialog.btn_state1)
+ self._set_enable_qatable_by_state(self.items_dialog.tbl_psm_end, 0, self.items_dialog.btn_state0)
+
+ # Create and configure QComboBox
+ sql = "SELECT id, name as idval FROM v_ui_doc ORDER BY name"
+ rows = tools_db.get_rows(sql)
+ tools_qt.fill_combo_values(self.items_dialog.doc_id, rows, index_to_show=1, add_empty=True)
+ tools_qt.set_autocompleter(self.items_dialog.doc_id)
+
+ table_name = "v_ui_workcat_x_feature"
+ table_name_end = "v_ui_workcat_x_feature_end"
+ table_doc = "v_ui_doc_x_workcat"
+ self.items_dialog.btn_doc_insert.clicked.connect(
+ partial(self._document_insert, self.items_dialog, 'doc_x_workcat', 'workcat_id', item['sys_id']))
+ self.items_dialog.btn_doc_delete.clicked.connect(partial(tools_gw.delete_selected_rows, self.items_dialog.tbl_document, 'doc_x_workcat'))
+ self.items_dialog.btn_doc_new.clicked.connect(
+ partial(self._manage_document, self.items_dialog.tbl_document, item['sys_id']))
+ self.items_dialog.btn_open_doc.clicked.connect(partial(tools_qt.document_open, self.items_dialog.tbl_document, 'path'))
+ self.items_dialog.tbl_document.doubleClicked.connect(
+ partial(tools_qt.document_open, self.items_dialog.tbl_document, 'path'))
+
+ self.items_dialog.btn_close.clicked.connect(partial(tools_gw.close_dialog, self.items_dialog))
+ self.items_dialog.btn_path.clicked.connect(
+ partial(self._get_folder_dialog, self.items_dialog, self.items_dialog.txt_path))
+ self.items_dialog.rejected.connect(partial(self._restore_selectors, current_selectors))
+ self.items_dialog.rejected.connect(partial(tools_gw.close_dialog, self.items_dialog))
+ self.items_dialog.rejected.connect(self._reset_rubber_band)
+ self.items_dialog.btn_state1.clicked.connect(
+ partial(self._force_state, self.items_dialog.btn_state1, 1, self.items_dialog.tbl_psm))
+ self.items_dialog.btn_state0.clicked.connect(
+ partial(self._force_state, self.items_dialog.btn_state0, 0, self.items_dialog.tbl_psm_end))
+ self.items_dialog.btn_export_to_csv.clicked.connect(
+ partial(self.export_to_csv, self.items_dialog, self.items_dialog.tbl_psm, self.items_dialog.tbl_psm_end,
+ self.items_dialog.txt_path))
+
+ self.items_dialog.txt_name.textChanged.connect(partial(
+ self._workcat_filter_by_text, self.items_dialog, self.items_dialog.tbl_psm, self.items_dialog.txt_name,
+ table_name, workcat_id, field_id))
+ self.items_dialog.txt_name_end.textChanged.connect(partial(
+ self._workcat_filter_by_text, self.items_dialog, self.items_dialog.tbl_psm_end,
+ self.items_dialog.txt_name_end, table_name_end, workcat_id, field_id))
+ self.items_dialog.tbl_psm.doubleClicked.connect(partial(self._open_feature_form, self.items_dialog.tbl_psm))
+ self.items_dialog.tbl_psm.clicked.connect(partial(self._get_parameters, self.items_dialog.tbl_psm))
+ self.items_dialog.tbl_psm_end.doubleClicked.connect(partial(self._open_feature_form, self.items_dialog.tbl_psm_end))
+ self.items_dialog.tbl_psm_end.clicked.connect(partial(self._get_parameters, self.items_dialog.tbl_psm_end))
+
+ expr = "workcat_id ILIKE '%" + str(workcat_id) + "%'"
+ self._workcat_fill_table(self.items_dialog.tbl_psm, table_name, expr=expr)
+ tools_gw.set_tablemodel_config(self.items_dialog, self.items_dialog.tbl_psm, table_name)
+ expr = "workcat_id ILIKE '%" + str(workcat_id) + "%'"
+ self._workcat_fill_table(self.items_dialog.tbl_psm_end, table_name_end, expr=expr)
+ tools_gw.set_tablemodel_config(self.items_dialog, self.items_dialog.tbl_psm_end, table_name_end)
+ expr = "workcat_id ILIKE '%" + str(workcat_id) + "%'"
+ self._workcat_fill_table(self.items_dialog.tbl_document, table_doc, expr=expr)
+ tools_gw.set_tablemodel_config(self.items_dialog, self.items_dialog.tbl_document, table_doc)
+
+ # Add data to workcat search form
+ table_name = "v_ui_workcat_x_feature"
+ table_name_end = "v_ui_workcat_x_feature_end"
+ extension = '_end'
+ self._fill_label_data(workcat_id, table_name)
+ self._fill_label_data(workcat_id, table_name_end, extension)
+
+ tools_gw.open_dialog(self.items_dialog, dlg_name='search_workcat')
+ title = self.items_dialog.windowTitle()
+ self.items_dialog.setWindowTitle(f"{title} - {display_name}")
+ text = tools_qt.get_text(self.items_dialog, self.items_dialog.lbl_init, False, False)
+ tools_qt.set_widget_text(self.items_dialog, self.items_dialog.lbl_init, f"{text} {field_id}")
+ text = tools_qt.get_text(self.items_dialog, self.items_dialog.lbl_end, False, False)
+ tools_qt.set_widget_text(self.items_dialog, self.items_dialog.lbl_end, f"{text} {field_id}")
+
+
+ def _manage_document(self, qtable, item_id):
+ """ Access GUI to manage documents e.g Execute action of button 34 """
+
+ manage_document = GwDocument(single_tool=False)
+ dlg_docman = manage_document.get_document(tablename='workcat', qtable=qtable, item_id=item_id)
+ dlg_docman.btn_accept.clicked.connect(partial(tools_gw.set_completer_object, dlg_docman, 'doc'))
+ tools_qt.remove_tab(dlg_docman.tabWidget, 'tab_rel')
+
+
+ def _get_current_selectors(self):
+ """ Take the current selector_expl and selector_state to restore them at the end of the operation """
+
+ current_tab = tools_gw.get_config_parser('dialogs_tab', 'selector_basic', "user", "session")
+ form = f'"currentTab":"{current_tab}"'
+ extras = f'"selectorType":"selector_basic", "filterText":""'
+ body = tools_gw.create_body(form=form, extras=extras)
+ json_result = tools_gw.execute_procedure('gw_fct_getselectors', body)
+ return json_result
+
+
+ def _restore_selectors(self, current_selectors):
+ """ Restore selector_expl and selector_state to how the user had it """
+
+ qgis_project_add_schema = lib_vars.project_vars['add_schema']
+ for form_tab in current_selectors['body']['form']['formTabs']:
+ if form_tab['tableName'] not in ('selector_expl', 'selector_state'):
+ continue
+ selector_type = form_tab['selectorType']
+ tab_name = form_tab['tabName']
+ field_id = None
+ if form_tab['tableName'] == 'selector_expl':
+ field_id = 'expl_id'
+ elif form_tab['tableName'] == 'selector_state':
+ field_id = 'id'
+ for field in form_tab['fields']:
+ _id = field[field_id]
+ extras = (f'"selectorType":"{selector_type}", "tabName":"{tab_name}", '
+ f'"id":"{_id}", "isAlone":"False", "value":"{field["value"]}", '
+ f'"addSchema":"{qgis_project_add_schema}"')
+ body = tools_gw.create_body(extras=extras)
+ tools_gw.execute_procedure('gw_fct_setselectors', body)
+ tools_qgis.refresh_map_canvas()
+
+
+ def _force_expl(self, workcat_id):
+ """ Active exploitations are compared with workcat farms.
+ If there is consistency nothing happens, if there is no consistency force this exploitations to selector."""
+
+ sql = (f"SELECT a.expl_id, a.expl_name FROM "
+ f" (SELECT expl_id, expl_name FROM v_ui_workcat_x_feature "
+ f" WHERE workcat_id='{workcat_id}' "
+ f" UNION SELECT expl_id, expl_name FROM v_ui_workcat_x_feature_end "
+ f" WHERE workcat_id='{workcat_id}'"
+ f" ) AS a "
+ f" WHERE expl_id NOT IN "
+ f" (SELECT expl_id FROM selector_expl "
+ f" WHERE cur_user=current_user)")
+ rows = tools_db.get_rows(sql)
+ if not rows:
+ return
+
+ if len(rows) > 0:
+ for row in rows:
+ sql = (f"INSERT INTO selector_expl(expl_id, cur_user) "
+ f" VALUES('{row[0]}', current_user)")
+ tools_db.execute_sql(sql)
+ msg = "Your exploitation selector has been updated"
+ tools_qgis.show_info(msg)
+
+
+ def _update_selector_workcat(self, workcat_id):
+ """ Update table selector_workcat """
+
+ sql = ("DELETE FROM selector_workcat "
+ " WHERE cur_user = current_user;\n")
+ sql += (f"INSERT INTO selector_workcat(workcat_id, cur_user) "
+ f" VALUES('{workcat_id}', current_user);\n")
+ tools_db.execute_sql(sql)
+
+
+ def _set_enable_qatable_by_state(self, qtable, _id, qbutton):
+
+ sql = (f"SELECT state_id FROM selector_state "
+ f" WHERE cur_user = current_user AND state_id ='{_id}'")
+ row = tools_db.get_row(sql)
+ if row is None:
+ qtable.setEnabled(False)
+ qbutton.setEnabled(True)
+
+
+ def _get_folder_dialog(self, dialog, widget):
+ """ Get folder dialog """
+
+ widget.setStyleSheet(None)
+ try:
+ folder_path = os.path.expanduser("~/Documents" if os.name == 'nt' else "~")
+ except Exception:
+ folder_path = os.path.expanduser("~")
+
+ # Open dialog to select folder
+ os.chdir(folder_path)
+ file_dialog = QFileDialog()
+ file_dialog.setFileMode(QFileDialog.Directory)
+
+ msg = "Save as"
+ folder_path, filter_ = file_dialog.getSaveFileName(None, tools_qt.tr(msg), folder_path, '*.csv')
+ if folder_path:
+ tools_qt.set_widget_text(dialog, widget, str(folder_path))
+
+
+ def _force_state(self, qbutton, state, qtable):
+ """ Force selected state and set qtable enabled = True """
+
+ sql = (f"SELECT state_id "
+ f"FROM selector_state "
+ f"WHERE cur_user = current_user AND state_id = '{state}'")
+ row = tools_db.get_row(sql)
+ if row:
+ return
+
+ sql = (f"INSERT INTO selector_state(state_id, cur_user) "
+ f"VALUES('{state}', current_user)")
+ tools_db.execute_sql(sql)
+ qtable.setEnabled(True)
+ qbutton.setEnabled(False)
+ tools_qgis.refresh_map_canvas()
+ qtable.model().select()
+
+
+ def _write_to_csv(self, dialog, folder_path=None, all_rows=None):
+
+ with open(folder_path, "w") as output:
+ writer = csv.writer(output, lineterminator='\n')
+ writer.writerows(all_rows)
+ tools_gw.set_config_parser('btn_search', 'search_csv_path', f"{tools_qt.get_text(dialog, 'txt_path')}")
+ message = "The csv file has been successfully exported"
+ tools_qgis.show_info(message, dialog=dialog)
+
+
+ def _workcat_filter_by_text(self, dialog, qtable, widget_txt, table_name, workcat_id, field_id):
+ """ Filter list of workcats by workcat_id and field_id """
+
+ result_select = tools_qt.get_text(dialog, widget_txt)
+ if result_select != 'null':
+ expr = (f"workcat_id = '{workcat_id}'"
+ f" and {field_id} ILIKE '%{result_select}%'")
+ else:
+ expr = f"workcat_id ILIKE '%{workcat_id}%'"
+ self._workcat_fill_table(qtable, table_name, expr=expr)
+ tools_gw.set_tablemodel_config(dialog, qtable, table_name)
+
+
+ def _workcat_fill_table(self, widget, table_name, set_edit_triggers=QTableView.NoEditTriggers, expr=None):
+ """ Fill table @widget filtering query by @workcat_id
+ Set a model with selected filter.
+ Attach that model to selected table
+ @setEditStrategy:
+ 0: OnFieldChange
+ 1: OnRowChange
+ 2: OnManualSubmit
+ """
+
+ if self.schema_name not in table_name:
+ table_name = self.schema_name + "." + table_name
+
+ # Set model
+ model = QSqlTableModel(db=lib_vars.qgis_db_credentials)
+ model.setTable(table_name)
+ model.setEditStrategy(QSqlTableModel.OnFieldChange)
+ model.setSort(0, 0)
+ model.select()
+
+ widget.setEditTriggers(set_edit_triggers)
+ # Check for errors
+ if model.lastError().isValid():
+ if 'Unable to find table' in model.lastError().text():
+ tools_db.reset_qsqldatabase_connection(self.items_dialog)
+ else:
+ tools_qgis.show_warning(model.lastError().text(), dialog=self.items_dialog)
+ # Attach model to table view
+ if expr:
+ widget.setModel(model)
+ widget.model().setFilter(expr)
+ else:
+ widget.setModel(model)
+
+
+ def _show_context_menu(self):
+ """ Show custom context menu """
+ menu = QMenu(self.dlg_man.tbl_workcat)
+
+ action_create = QAction("Create", self.dlg_man.tbl_workcat)
+ action_create.triggered.connect(partial(self.create_workcat))
+ menu.addAction(action_create)
+
+ action_delete = QAction("Delete", self.dlg_man.tbl_workcat)
+ action_delete.triggered.connect(partial(self._handle_delete))
+ menu.addAction(action_delete)
+
+ # Show menu
+ menu.exec(QCursor.pos())
+
+
+ def _open_feature_form(self, qtable):
+ """ Zoom feature with the code set in 'network_code' of the layer set in 'network_feature_type' """
+ from .info import GwInfo # Avoid circular import
+
+ tools_gw.reset_rubberband(self.aux_rubber_band)
+ # Get selected code from combo
+ element = qtable.selectionModel().selectedRows()
+ if len(element) == 0:
+ message = "Any record selected"
+ tools_qgis.show_warning(message)
+ return
+
+ row = element[0].row()
+
+ feature_type = qtable.model().record(row).value('feature_type').lower()
+ table_name = "v_edit_" + feature_type
+
+ feature_id = qtable.model().record(row).value('feature_id')
+
+ self.customForm = GwInfo(tab_type='data')
+ complet_result, dialog = self.customForm.get_info_from_id(table_name, feature_id, 'data')
+
+ # Get list of all coords in field geometry
+ try:
+ list_coord = re.search('\((.*)\)', str(complet_result['body']['feature']['geometry']['st_astext']))
+ max_x, max_y, min_x, min_y = tools_qgis.get_max_rectangle_from_coords(list_coord)
+ tools_qgis.zoom_to_rectangle(max_x, max_y, min_x, min_y, 1)
+ except Exception:
+ pass
+
+
+ def _fill_label_data(self, workcat_id, table_name, extension=None):
+
+ if workcat_id == "null":
+ return
+
+ features = ['NODE', 'CONNEC', 'GULLY', 'ELEMENT', 'ARC']
+ for feature in features:
+ sql = (f"SELECT feature_id "
+ f" FROM {table_name}")
+ sql += f" WHERE workcat_id = '{workcat_id}' AND feature_type = '{feature}'"
+ rows = tools_db.get_rows(sql)
+ if extension is not None:
+ widget_name = f"lbl_total_{feature.lower()}{extension}"
+ else:
+ widget_name = f"lbl_total_{feature.lower()}"
+
+ widget = self.items_dialog.findChild(QLabel, str(widget_name))
+ if not rows:
+ total = 0
+ else:
+ total = len(rows)
+
+ # Add data to workcat search form
+ widget.setText(str(feature.lower().title()) + "s: " + str(total))
+ if self.project_type == 'ws' and feature == 'GULLY':
+ widget.setVisible(False)
+
+ if not rows:
+ continue
+
+ length = 0
+ if feature == 'ARC':
+ for row in rows:
+ arc_id = str(row[0])
+ sql = (f"SELECT st_length2d(the_geom)::numeric(12,2) "
+ f" FROM arc"
+ f" WHERE arc_id = '{arc_id}'")
+ row = tools_db.get_row(sql)
+ if row:
+ length = length + row[0]
+ else:
+ message = "Some data is missing. Check gis_length for arc"
+ tools_qgis.show_warning(message, parameter=arc_id, dialog=self.items_dialog)
+ return
+ if extension is not None:
+ widget = self.items_dialog.findChild(QLabel, f"lbl_length{extension}")
+ else:
+ widget = self.items_dialog.findChild(QLabel, "lbl_length")
+
+ # Add data to workcat search form
+ widget.setText(f"Total arcs length: {length}")
+
+
+ def _document_insert(self, dialog, tablename, field, field_value):
+ """
+ Insert a document related to the current visit
+ :param dialog: (QDialog )
+ :param tablename: Name of the table to make the queries (String)
+ :param field: Field of the table to make the where clause (String)
+ :param field_value: Value to compare in the clause where (String)
+ """
+ doc_id = tools_qt.get_combo_value(dialog, dialog.doc_id)
+
+ if not doc_id:
+ message = "Any document selected"
+ tools_qgis.show_warning(message, dialog=dialog)
+ return
+
+ # Check if document already exist
+ sql = (f"SELECT doc_id"
+ f" FROM {tablename}"
+ f" WHERE doc_id = '{doc_id}' AND {field} = '{field_value}'")
+ row = tools_db.get_row(sql)
+ if row:
+ msg = "Document already exist"
+ tools_qgis.show_warning(msg, dialog=dialog)
+ return
+
+ # Insert into new table
+ sql = (f"INSERT INTO {tablename} (doc_id, {field})"
+ f" VALUES ('{doc_id}', '{field_value}')")
+ status = tools_db.execute_sql(sql)
+ if status:
+ message = "Document inserted successfully"
+ tools_qgis.show_info(message, dialog=dialog)
+
+ dialog.doc_id.blockSignals(True)
+ dialog.doc_id.setCurrentIndex(0)
+ dialog.doc_id.hidePopup()
+ dialog.doc_id.blockSignals(False)
+ dialog.tbl_document.model().select()
+
+
+ def _get_parameters(self, qtable, index):
+
+ tools_gw.reset_rubberband(self.aux_rubber_band)
+ row = index.row()
+ column_index = tools_qt.get_col_index_by_col_name(qtable, 'feature_type')
+ feature_type = index.sibling(row, column_index).data().lower()
+ column_index = tools_qt.get_col_index_by_col_name(qtable, 'feature_id')
+ feature_id = index.sibling(row, column_index).data()
+ layer = tools_qgis.get_layer_by_tablename(f"v_edit_{feature_type}")
+ if not layer:
+ return
+
+ feature = tools_qt.get_feature_by_id(layer, feature_id, f"{feature_type}_id")
+ try:
+ width = {"arc": 5}
+ geometry = feature.geometry()
+ self.aux_rubber_band.setToGeometry(geometry, None)
+ self.aux_rubber_band.setColor(QColor(255, 0, 0, 125))
+ self.aux_rubber_band.setWidth(width.get(feature_type, 10))
+ self.aux_rubber_band.show()
+ except AttributeError:
+ pass
+
+
+ def _reset_rubber_band(self):
+ tools_gw.reset_rubberband(self.rubber_band)
+ tools_gw.reset_rubberband(self.aux_rubber_band)
+
+
+ def export_to_csv(self, dialog, qtable_1=None, qtable_2=None, path=None):
+
+ folder_path = tools_qt.get_text(dialog, path)
+ if folder_path is None or folder_path == 'null':
+ path.setStyleSheet("border: 1px solid red")
+ return
+
+ path.setStyleSheet(None)
+ if folder_path.find('.csv') == -1:
+ folder_path += '.csv'
+ if qtable_1:
+ model_1 = qtable_1.model()
+ else:
+ return
+
+ model_2 = None
+ if qtable_2:
+ model_2 = qtable_2.model()
+
+ # Convert qtable values into list
+ all_rows = []
+ headers = []
+ for i in range(0, model_1.columnCount()):
+ headers.append(str(model_1.headerData(i, Qt.Horizontal)))
+ all_rows.append(headers)
+ for rows in range(0, model_1.rowCount()):
+ row = []
+ for col in range(0, model_1.columnCount()):
+ row.append(str(model_1.data(model_1.index(rows, col))))
+ all_rows.append(row)
+ if qtable_2 is not None:
+ headers = []
+ for i in range(0, model_2.columnCount()):
+ headers.append(str(model_2.headerData(i, Qt.Horizontal)))
+ all_rows.append(headers)
+ for rows in range(0, model_2.rowCount()):
+ row = []
+ for col in range(0, model_2.columnCount()):
+ row.append(str(model_2.data(model_2.index(rows, col))))
+ all_rows.append(row)
+
+ # Write list into csv file
+ try:
+ if os.path.exists(folder_path):
+ msg = "Are you sure you want to overwrite this file?"
+ answer = tools_qt.show_question(msg, "Overwrite")
+ if answer:
+ self._write_to_csv(dialog, folder_path, all_rows)
+ else:
+ self._write_to_csv(dialog, folder_path, all_rows)
+ except Exception:
+ msg = "File path doesn't exist or you dont have permission or file is opened"
+ tools_qgis.show_warning(msg, dialog=dialog)
diff --git a/core/threads/project_schema_create.py b/core/threads/project_schema_create.py
index 73af1babd..ef36b1a0d 100644
--- a/core/threads/project_schema_create.py
+++ b/core/threads/project_schema_create.py
@@ -12,7 +12,7 @@
from .task import GwTask
from ..utils import tools_gw
-from ...libs import tools_qt, tools_log
+from ...libs import tools_qt, tools_log, tools_os, tools_db, tools_qgis
class GwCreateSchemaTask(GwTask):
@@ -56,7 +56,7 @@ def run(self):
self.admin.progress_value = 0
tools_log.log_info(f"Task 'Create schema' execute function 'def main_execution'")
status = self.main_execution()
- if not status:
+ if not tools_os.set_boolean(status, False):
tools_log.log_info("Function main_execution returned False")
return False
tools_log.log_info(f"Task 'Create schema' execute function 'def custom_execution'")
@@ -85,6 +85,7 @@ def finished(self, result):
if self.db_exception is not None:
error, sql, filepath = self.db_exception
tools_qt.manage_exception_db(error, sql, filepath=filepath)
+ tools_db.dao.rollback()
return
# Handle exception
@@ -132,28 +133,31 @@ def main_execution(self):
tools_log.log_info(f"Number of SQL files 'TOTAL': {self.admin.total_sql_files}")
status = self.admin.load_base(self.dict_folders_process['load_base'])
- if (not status and self.admin.dev_commit is False) or self.isCanceled():
+ if (not tools_os.set_boolean(status, False) and tools_os.set_boolean(self.admin.dev_commit, False) is False) \
+ or self.isCanceled():
return False
status = self.admin.load_locale()
- if (not status and self.admin.dev_commit is False) or self.isCanceled():
+ if (not tools_os.set_boolean(status, False) and tools_os.set_boolean(self.admin.dev_commit, False) is False) \
+ or self.isCanceled():
return False
status = self.admin.update_dict_folders(True, project_type, dict_update_folders=self.dict_folders_process['update_35to39'])
- if (not status and self.admin.dev_commit is False) or self.isCanceled():
+ if (not tools_os.set_boolean(status, False) and tools_os.set_boolean(self.admin.dev_commit, False) is False) \
+ or self.isCanceled():
return False
- status = self.admin.load_childviews()
- if (not status and self.admin.dev_commit is False) or self.isCanceled():
- return False
+ # status = self.admin.load_childviews()
+ # if (not tools_os.set_boolean(status, False) and tools_os.set_boolean(self.admin.dev_commit, False) is False) \
+ # or self.isCanceled():
+ # return False
- status = True
+ json_result = None
if exec_last_process:
tools_log.log_info("Execute function 'gw_fct_admin_schema_lastprocess'")
- status = self.admin.execute_last_process(True, project_name_schema, self.admin.schema_type,
+ json_result = self.admin.execute_last_process(True, project_name_schema, self.admin.schema_type,
project_locale, project_srid)
-
- if (not status and self.admin.dev_commit is False) or self.isCanceled():
+ if (not json_result or json_result['status'] == 'Failed' and tools_os.set_boolean(self.admin.dev_commit, False) is False) or self.isCanceled():
return False
return True
diff --git a/core/threads/project_schema_update.py b/core/threads/project_schema_update.py
index 749ca6b19..0eb7a2568 100644
--- a/core/threads/project_schema_update.py
+++ b/core/threads/project_schema_update.py
@@ -105,7 +105,7 @@ def finished(self, result):
def main_execution(self):
schema_name = self.admin._get_schema_name()
sql = f"DELETE FROM {schema_name}.audit_check_data WHERE fid = 133 AND cur_user = current_user;"
- tools_db.execute_sql(sql)
+ tools_db.execute_sql(sql, commit=False)
# Get all updates folders, to update
self.dict_folders_process['updates'] = self.get_updates_dict_folders()
self.status = self.admin.load_updates(self.params['project_type'], update_changelog=True, schema_name=schema_name, dict_update_folders=self.dict_folders_process['updates'])
diff --git a/core/toolbars/buttons.py b/core/toolbars/buttons.py
index 716b5d489..ddbb04674 100644
--- a/core/toolbars/buttons.py
+++ b/core/toolbars/buttons.py
@@ -51,7 +51,6 @@
# Plan
from .plan.psector_button import GwPsectorButton
from .plan.psector_manager_button import GwPsectorManagerButton
-from .plan.price_manager_button import GwPriceManagerButton
from .plan.netscenario_manager_btn import GwNetscenarioManagerButton
# Utilities
@@ -65,4 +64,4 @@
# ToC
from .toc.add_child_layer_button import GwAddChildLayerButton
-from .toc.epa_world_button import GwEpaWorldButton
+from .toc.layerstyle_change_button import GwLayerStyleChangeButton
diff --git a/core/toolbars/edit/arc_fusion_button.py b/core/toolbars/edit/arc_fusion_button.py
index f2876ec4b..b9ed0b5e8 100644
--- a/core/toolbars/edit/arc_fusion_button.py
+++ b/core/toolbars/edit/arc_fusion_button.py
@@ -153,7 +153,7 @@ def open_arc_fusion_dlg(self):
# Fill ComboBox cmb_statetype
sql = "SELECT id, name as idval FROM value_state_type WHERE id IS NOT NULL AND state = 0"
rows = tools_db.get_rows(sql)
- tools_qt.fill_combo_values(self.dlg_fusion.cmb_statetype, rows, add_empty=True)
+ tools_qt.fill_combo_values(self.dlg_fusion.cmb_statetype, rows)
state_type = tools_gw.get_config_parser("btn_arc_fusion", "cmb_statetype", "user", "session")
if state_type not in (None, 'None', ''):
tools_qt.set_widget_text(self.dlg_fusion, "cmb_statetype", state_type)
diff --git a/core/toolbars/edit/document_button.py b/core/toolbars/edit/document_button.py
index 0a7119256..76da35603 100644
--- a/core/toolbars/edit/document_button.py
+++ b/core/toolbars/edit/document_button.py
@@ -15,7 +15,7 @@ class GwDocumentButton(GwAction):
def __init__(self, icon_path, action_name, text, toolbar, action_group, list_tabs=None, doc_tables=None, feature_type=None):
super().__init__(icon_path, action_name, text, toolbar, action_group)
self.list_tabs = list_tabs if list_tabs else ["node", "arc", "connec", "gully"]
- self.doc_tables = doc_tables if doc_tables else ["doc_x_node","doc_x_arc","doc_x_connec","doc_x_gully"]
+ self.doc_tables = doc_tables if doc_tables else ["doc_x_node", "doc_x_arc", "doc_x_connec", "doc_x_gully", "doc_x_workcat", "doc_x_psector", "doc_x_visit"]
self.feature_type = feature_type
self.document = GwDocument()
diff --git a/core/toolbars/edit/feature_delete_button.py b/core/toolbars/edit/feature_delete_button.py
index d94afb65d..acba8d728 100644
--- a/core/toolbars/edit/feature_delete_button.py
+++ b/core/toolbars/edit/feature_delete_button.py
@@ -243,8 +243,11 @@ def _manage_selection(self):
# Get selected features of the layer
features = layer.selectedFeatures()
for feature in features:
- # Append 'feature_id' into the list
- selected_id = feature.attribute(field_id)
+ try:
+ # Append 'feature_id' into the list
+ selected_id = feature.attribute(field_id)
+ except Exception:
+ pass
if selected_id:
tools_qt.set_widget_text(self.dlg_feature_delete, self.dlg_feature_delete.feature_id, str(selected_id))
diff --git a/core/toolbars/epa/go2epa_button.py b/core/toolbars/epa/go2epa_button.py
index 3d03a1f9e..274a12229 100644
--- a/core/toolbars/epa/go2epa_button.py
+++ b/core/toolbars/epa/go2epa_button.py
@@ -468,7 +468,7 @@ def _set_completer_result(self, widget, viewname, field_name):
def _refresh_go2epa_options(self, dialog):
""" Refresh widgets into layouts on go2epa_options form """
-
+
if dialog:
for lyt in dialog.findChildren(QGridLayout, QRegularExpression('lyt_')):
i = 0
@@ -556,9 +556,10 @@ def _update_values(self, _json):
return False
tools_gw.manage_current_selections_docker(json_result)
+ """# TODO: do this with symbology?"""
# Refresh epa world view if is active and it has changed
- if tools_gw.is_epa_world_active() and any(widget['widget'] == 'inp_options_networkmode' for widget in _json):
- tools_gw.set_epa_world(True, selector_change=True)
+ # if tools_gw.is_epa_world_active() and any(widget['widget'] == 'inp_options_networkmode' for widget in _json):
+ # tools_gw.set_epa_world(True, selector_change=True)
message = "Values has been updated"
tools_qgis.show_info(message)
diff --git a/core/toolbars/epa/go2epa_manager_button.py b/core/toolbars/epa/go2epa_manager_button.py
index 381dfd818..48f4e0cc3 100644
--- a/core/toolbars/epa/go2epa_manager_button.py
+++ b/core/toolbars/epa/go2epa_manager_button.py
@@ -10,13 +10,14 @@
from functools import partial
from qgis.PyQt.QtCore import Qt, QRegExp
-from qgis.PyQt.QtWidgets import QAbstractItemView, QTableView
+from qgis.PyQt.QtWidgets import QAbstractItemView, QTableView, QDialog
from qgis.PyQt.QtGui import QRegExpValidator, QStandardItemModel
from ..dialog import GwAction
from ...ui.ui_manager import GwEpaManagerUi
from ...utils import tools_gw
-from ....libs import tools_qt, tools_db, tools_qgis, tools_os
+from ....libs import tools_qt, tools_db, tools_qgis, tools_os, lib_vars
+from ....libs.tools_qt import GwEditDialog
class GwGo2EpaManagerButton(GwAction):
@@ -48,18 +49,16 @@ def _manage_go2epa(self):
self.dlg_manager.btn_archive.setEnabled(False)
if self.project_type != 'ws':
self.dlg_manager.btn_set_corporate.setVisible(False)
- self.dlg_manager.btn_archive.setVisible(False)
# Fill combo box and table view
# self._fill_combo_result_id()
self.dlg_manager.tbl_rpt_cat_result.setSelectionBehavior(QAbstractItemView.SelectRows)
self._fill_manager_table()
- model = self.dlg_manager.tbl_rpt_cat_result.model()
- model.itemChanged.connect(partial(self._update_data))
- model.flags = lambda index: self.flags(index, model)
# Set signals
- self.dlg_manager.btn_archive.clicked.connect(partial(self._set_rpt_archived, self.dlg_manager.tbl_rpt_cat_result,
+ self.dlg_manager.btn_edit.clicked.connect(partial(self._manage_edit_row, self.dlg_manager, self.dlg_manager.tbl_rpt_cat_result))
+ self.dlg_manager.btn_show_inp_data.clicked.connect(partial(self._show_inp_data, self.dlg_manager, self.dlg_manager.tbl_rpt_cat_result))
+ self.dlg_manager.btn_archive.clicked.connect(partial(self._toggle_rpt_archived, self.dlg_manager.tbl_rpt_cat_result,
'result_id'))
self.dlg_manager.btn_set_corporate.clicked.connect(partial(self._epa2data, self.dlg_manager.tbl_rpt_cat_result,
'result_id'))
@@ -68,7 +67,6 @@ def _manage_go2epa(self):
selection_model = self.dlg_manager.tbl_rpt_cat_result.selectionModel()
selection_model.selectionChanged.connect(partial(self._fill_txt_infolog))
selection_model.selectionChanged.connect(partial(self._enable_buttons))
- self.dlg_manager.tbl_rpt_cat_result.doubleClicked.connect(partial(self._set_result_id, self.dlg_manager, self.dlg_manager.tbl_rpt_cat_result))
self.dlg_manager.btn_close.clicked.connect(partial(tools_gw.close_dialog, self.dlg_manager))
self.dlg_manager.rejected.connect(partial(tools_gw.close_dialog, self.dlg_manager))
self.dlg_manager.txt_result_id.textChanged.connect(partial(self._fill_manager_table))
@@ -85,7 +83,8 @@ def _fill_manager_table(self, filter_id=None):
if complet_list is False:
return False, False
for field in complet_list['body']['data']['fields']:
- if field.get('hidden'): continue
+ if field.get('hidden'):
+ continue
model = self.dlg_manager.tbl_rpt_cat_result.model()
if model is None:
model = QStandardItemModel()
@@ -96,8 +95,8 @@ def _fill_manager_table(self, filter_id=None):
self.dlg_manager.tbl_rpt_cat_result = tools_gw.add_tableview_header(self.dlg_manager.tbl_rpt_cat_result, field)
self.dlg_manager.tbl_rpt_cat_result = tools_gw.fill_tableview_rows(self.dlg_manager.tbl_rpt_cat_result, field)
- tools_gw.set_tablemodel_config(self.dlg_manager, self.dlg_manager.tbl_rpt_cat_result, 'v_ui_rpt_cat_result', isQStandardItemModel=True)
- tools_qt.set_tableview_config(self.dlg_manager.tbl_rpt_cat_result, edit_triggers=QTableView.DoubleClicked)
+ tools_gw.set_tablemodel_config(self.dlg_manager, self.dlg_manager.tbl_rpt_cat_result, 'v_ui_rpt_cat_result')
+ tools_qt.set_tableview_config(self.dlg_manager.tbl_rpt_cat_result, edit_triggers=QTableView.NoEditTriggers)
return complet_list
@@ -120,24 +119,10 @@ def _get_list(self, table_name='v_ui_rpt_cat_result', filter_id=None):
return complet_list
- def flags(self, index, model):
+ def _update_data(self, result_id, columnname, value):
- # print(index.column())
- if index.column() != 1:
- flags = Qt.ItemIsSelectable | Qt.ItemIsEnabled
- return flags
-
- return QStandardItemModel.flags(model, index)
-
-
- def _update_data(self, item):
-
- index = item.index()
- result_id = index.sibling(index.row(), 0).data()
- value = index.sibling(index.row(), index.column()).data()
-
- sql = f"UPDATE v_ui_rpt_cat_result SET expl_id = {value} WHERE result_id = '{result_id}';"
- result = tools_db.execute_sql(sql)
+ sql = f"""UPDATE v_ui_rpt_cat_result SET "{columnname}" = $${value}$$ WHERE result_id = '{result_id}';"""
+ result = tools_db.execute_sql(sql, log_sql = True)
if result:
self._fill_manager_table(tools_qt.get_text(self.dlg_manager, 'txt_result_id'))
@@ -158,13 +143,39 @@ def _fill_txt_infolog(self, selected):
msg = ""
+ try:
+ # Get column index for column addparam
+ col_ind = tools_qt.get_col_index_by_col_name(self.dlg_manager.tbl_rpt_cat_result, 'addparam')
+ addparam = json.loads(f'{row[col_ind].data()}')
+
+ # Construct custom message with addparam keys
+ if not addparam:
+ raise
+
+ msg += "Properties:
"
+ corporate_last_dates = addparam['corporateLastDates']
+ if corporate_last_dates:
+ corporate_start = corporate_last_dates.get('start')
+ corporate_end = corporate_last_dates.get('end')
+ if corporate_start and corporate_end:
+ msg += f"Corporate from {corporate_start} to {corporate_end}"
+ elif corporate_start and not corporate_end:
+ msg += f"Corporate since {corporate_start}"
+ elif not corporate_start and corporate_end:
+ msg += f"Corporate until {corporate_end}"
+ msg += "
"
+ except Exception:
+ pass
+
try:
# Get column index for column export_options
col_ind = tools_qt.get_col_index_by_col_name(self.dlg_manager.tbl_rpt_cat_result, 'export_options')
export_options = json.loads(f'{row[col_ind].data()}')
# Construct message with all data rows
- msg += f"Export Options:
"
+ if msg:
+ msg += "
"
+ msg += "Export Options:
"
for text in export_options:
msg += f"{text} : {export_options[text]}
"
except Exception:
@@ -174,8 +185,9 @@ def _fill_txt_infolog(self, selected):
# Get column index for column network_stats
col_ind = tools_qt.get_col_index_by_col_name(self.dlg_manager.tbl_rpt_cat_result, 'network_stats')
network_stats = json.loads(f'{row[col_ind].data()}')
-
- msg += f"
Network Status:
"
+ if msg:
+ msg += "
"
+ msg += "Network Status:
"
for text in network_stats:
msg += f"{text} : {network_stats[text]}
"
except Exception:
@@ -185,8 +197,9 @@ def _fill_txt_infolog(self, selected):
# Get column index for column inp_options
col_ind = tools_qt.get_col_index_by_col_name(self.dlg_manager.tbl_rpt_cat_result, 'inp_options')
inp_options = json.loads(f'{row[col_ind].data()}')
-
- msg += f"
Inp Options:
"
+ if msg:
+ msg += "
"
+ msg += "Inp Options:
"
for text in inp_options:
msg += f"{text} : {inp_options[text]}
"
except Exception:
@@ -199,16 +212,30 @@ def _fill_txt_infolog(self, selected):
def _enable_buttons(self, selected):
set_corporate_enabled, archive_enabled = True, True
selected_rows = self.dlg_manager.tbl_rpt_cat_result.selectionModel().selectedRows()
+ last_status = None
for idx, index in enumerate(selected_rows):
+ is_corporate = None
+ # set corporate
col_idx = tools_qt.get_col_index_by_col_name(self.dlg_manager.tbl_rpt_cat_result, 'rpt_stats')
row = index.row()
status = index.sibling(row, col_idx).data()
if not status:
set_corporate_enabled = False
+
+ col_idx = tools_qt.get_col_index_by_col_name(self.dlg_manager.tbl_rpt_cat_result, 'iscorporate')
+ if col_idx is None:
+ row = index.row()
+ is_corporate = index.sibling(row, col_idx).data()
+
+ # toggle archive
col_idx = tools_qt.get_col_index_by_col_name(self.dlg_manager.tbl_rpt_cat_result, 'status')
status = index.sibling(row, col_idx).data()
- if status != 'COMPLETED':
- archive_enabled = False
+ if last_status is None:
+ last_status = status
+ if is_corporate is None:
+ if status == 'PARTIAL' or status != last_status or tools_os.set_boolean(is_corporate, False):
+ archive_enabled = False
+ last_status = status
if not selected_rows:
set_corporate_enabled, archive_enabled = False, False
@@ -274,7 +301,7 @@ def _multi_rows_delete(self, widget, table_name, column_id):
self._fill_manager_table(tools_qt.get_text(self.dlg_manager, 'txt_result_id'))
- def _set_rpt_archived(self, widget, column_id):
+ def _toggle_rpt_archived(self, widget, column_id):
""" Call gw_fct_set_rpt_archived with selected result_id
:param QTableView widget: origin
:param table_name: table origin
@@ -291,9 +318,12 @@ def _set_rpt_archived(self, widget, column_id):
row = selected_list[0].row()
col = tools_qt.get_col_index_by_col_name(widget, str(column_id))
result_id = widget.model().index(row, col).data()
+ col = tools_qt.get_col_index_by_col_name(widget, "status")
+ status = widget.model().index(row, col).data()
# check corporate
- extras = f'"result_id":"{result_id}"'
+ action = 'RESTORE' if status == 'ARCHIVED' else 'ARCHIVE'
+ extras = f'"result_id":"{result_id}", "action": "{action}"'
body = tools_gw.create_body(extras=extras)
result = tools_gw.execute_procedure('gw_fct_set_rpt_archived', body)
@@ -368,17 +398,67 @@ def _epa2data(self, widget, column_id):
# Refresh table
self._fill_manager_table()
- def _set_result_id(self, dialog, widget):
+
+ def _manage_edit_row(self, dialog, widget):
+
+ # Get selected rows
selected_list = widget.selectionModel().selectedRows()
if len(selected_list) == 0:
message = "Any record selected"
- tools_qgis.show_warning(message, dialog=dialog)
+ tools_qgis.show_warning(message, dialog=self.dlg_manager)
return
+ index = selected_list[0]
+
+ columnname = "descript"
+ column = tools_qt.get_col_index_by_col_name(widget, columnname)
+ row = index.row()
+ model = widget.model()
+ value = model.item(row, column).text()
+ header = model.headerData(column, Qt.Horizontal)
+ result_id = model.data(model.index(row, 0))
+
+ edit_dialog = GwEditDialog(dialog, title=f"Edit {header}", label_text=f"Set new '{header}' value for result '{result_id}':",
+ widget_type="QTextEdit", initial_value=value)
+ if edit_dialog.exec_() == QDialog.Accepted:
+ new_value = edit_dialog.get_value()
+ self._update_data(result_id, columnname, new_value)
+
+
+ def _show_inp_data(self, dialog, widget):
+ # Get selected rows
+ selected_list = widget.selectionModel().selectedRows()
+ if len(selected_list) == 0:
+ message = "Any record selected"
+ tools_qgis.show_warning(message, dialog=self.dlg_manager)
+ return
+
+ result_ids = []
+ for index in selected_list:
+ result_id = widget.model().data(widget.model().index(index.row(), 0))
+ result_ids.append(result_id)
+
+ if not result_ids:
+ return
+
+ result_ids_json = "ARRAY[" + ",".join(f"'{result_id}'" for result_id in result_ids) + "]"
+ json_result = tools_gw.execute_procedure(
+ function_name="gw_fct_getinpdata",
+ parameters=result_ids_json,
+ schema_name=f"{lib_vars.schema_name}",
+ commit=False
+ )
+
+ if not json_result or 'status' not in json_result or json_result['status'] == 'Failed':
+ message = "Failed to retrieve GeoJSON data."
+ tools_qgis.show_warning(message, dialog=self.dlg_manager)
+ return
+
+ # Zoom layer arc if exists
+ arc_layer = tools_qgis.get_layer_by_layername("Rpt INP Arc")
+ if arc_layer:
+ tools_qgis.zoom_to_layer(arc_layer)
+
+ message = "Data retrieved and displayed successfully."
+ tools_qgis.show_info(message, dialog=self.dlg_manager)
- row = selected_list[0].row()
- table_model = widget.model()
- result_id = table_model.data(table_model.index(row, 0))
- sql = f"DELETE FROM selector_rpt_main WHERE cur_user = current_user;" \
- f"INSERT INTO selector_rpt_main (result_id, cur_user) VALUES ('{result_id}', current_user);"
- tools_db.execute_sql(sql)
# endregion
diff --git a/core/toolbars/plan/netscenario_manager_btn.py b/core/toolbars/plan/netscenario_manager_btn.py
index b255c9556..d694d4d2a 100644
--- a/core/toolbars/plan/netscenario_manager_btn.py
+++ b/core/toolbars/plan/netscenario_manager_btn.py
@@ -79,8 +79,6 @@ def _open_netscenario_manager(self):
self.dlg_netscenario_manager.btn_execute.clicked.connect(partial(self._execute_current_netscenario))
self.dlg_netscenario_manager.btn_delete.clicked.connect(partial(self._delete_selected_netscenario))
self.dlg_netscenario_manager.btn_delete.clicked.connect(partial(tools_gw.refresh_selectors))
- self.tbl_netscenario.doubleClicked.connect(partial(self._update_current_netscenario,
- self.dlg_netscenario_manager, self.tbl_netscenario))
self.tbl_netscenario.doubleClicked.connect(self._open_netscenario)
self.dlg_netscenario_manager.btn_update_netscenario.clicked.connect(
partial(self._update_current_netscenario, self.dlg_netscenario_manager, self.tbl_netscenario))
diff --git a/core/toolbars/plan/price_manager_button.py b/core/toolbars/plan/price_manager_button.py
deleted file mode 100644
index 25a46ef77..000000000
--- a/core/toolbars/plan/price_manager_button.py
+++ /dev/null
@@ -1,22 +0,0 @@
-"""
-This file is part of Giswater 3
-The 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 3 of the License,
-or (at your option) any later version.
-"""
-# -*- coding: utf-8 -*-
-from ..dialog import GwAction
-from ...shared.psector import GwPsector
-
-
-class GwPriceManagerButton(GwAction):
- """ Button 50: Price manager """
-
- def __init__(self, icon_path, action_name, text, toolbar, action_group):
- super().__init__(icon_path, action_name, text, toolbar, action_group)
- self.psector = GwPsector()
-
-
- def clicked_event(self):
- self.psector.manage_prices()
-
diff --git a/core/toolbars/toc/add_child_layer_button.py b/core/toolbars/toc/add_child_layer_button.py
index f7bc9d20b..bc7b40d43 100644
--- a/core/toolbars/toc/add_child_layer_button.py
+++ b/core/toolbars/toc/add_child_layer_button.py
@@ -123,13 +123,12 @@ def _add_child_layer(self):
if not geom_field:
continue
geom_field = geom_field.replace(" ", "")
- style_id = field['style_id']
group = context['level_1']
sub_group = context['level_2']
sub_sub_group = context.get('level_3')
widgetAction.defaultWidget().stateChanged.connect(
partial(self._check_action_ischecked, layer_name, the_geom, geom_field, group, sub_group,
- sub_sub_group, style_id, alias.strip()))
+ sub_sub_group, alias.strip()))
main_menu.exec_(click_point)
@@ -143,20 +142,19 @@ def _manage_load_all(self, menu, state=None):
def _check_action_ischecked(self, tablename, the_geom=None, field_id=None, group=None,
- sub_group=None, sub_sub_group=None, style_id=None, alias=None, state=None):
+ sub_group=None, sub_sub_group=None, alias=None, state=None):
""" Control if user check or uncheck action menu, then add or remove layer from toc
:param tablename: Postgres table name (String)
:param the_geom: Geometry field of the table (String)
:param field_id: Field id of the table (String)
:param child_layers: List of layers (StringList)
:param group: Name of the group that will be created in the toc (String)
- :param style_id: Id of the style we want to load (integer or String)
:param is_checked: This parameter is sent by the action itself with the trigger (Bool)
"""
if state == 2:
layer = tools_qgis.get_layer_by_tablename(tablename)
if layer is None:
- tools_gw.add_layer_database(tablename, the_geom, field_id, group, sub_group, style_id, alias, sub_sub_group=sub_sub_group)
+ tools_gw.add_layer_database(tablename, the_geom, field_id, group, sub_group, alias=alias, sub_sub_group=sub_sub_group)
elif state == 0:
layer = tools_qgis.get_layer_by_tablename(tablename)
if layer is not None:
diff --git a/core/toolbars/toc/epa_world_button.py b/core/toolbars/toc/epa_world_button.py
deleted file mode 100644
index 1e1a3c116..000000000
--- a/core/toolbars/toc/epa_world_button.py
+++ /dev/null
@@ -1,196 +0,0 @@
-"""
-This file is part of Giswater 3
-The 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 3 of the License,
-or (at your option) any later version.
-"""
-# -*- coding: utf-8 -*-
-
-from qgis.PyQt.QtCore import QObject
-
-from ..dialog import GwAction
-from ...utils import tools_gw
-from ....libs import tools_qgis, tools_db, tools_os, tools_qt
-from .... import global_vars
-
-layers_subsetstrings = {}
-layers_stylesheets = {}
-
-
-def _get_sectors():
- sectors = "NULL"
-
- # get selected selectors
- sql = f'SELECT sector_id FROM selector_sector WHERE cur_user = current_user'
- rows = tools_db.get_rows(sql)
- if rows:
- sectors = ", ".join(str(x[0]) for x in rows)
-
- return sectors
-
-
-def _get_layers():
- arc_layers = [lyr for lyr in [tools_qgis.get_layer_by_tablename('v_edit_arc')] if lyr is not None]
- node_layers = [lyr for lyr in [tools_qgis.get_layer_by_tablename('v_edit_node')] if lyr is not None]
- connec_layers = [lyr for lyr in [tools_qgis.get_layer_by_tablename('v_edit_connec')] if lyr is not None]
- gully_layers = [lyr for lyr in [tools_qgis.get_layer_by_tablename('v_edit_gully')] if lyr is not None]
- link_layers = [lyr for lyr in [tools_qgis.get_layer_by_tablename('v_edit_link')] if lyr is not None]
-
- return arc_layers, node_layers, connec_layers, gully_layers, link_layers
-
-
-def is_epa_world_active(default=False):
- return tools_os.set_boolean(tools_gw.get_config_parser("epa_world", "epa_world_active", 'user', 'session'), default)
-
-
-def set_epa_world(_set_epa_world=None, selector_change=False, is_init=False):
-
- # Style
- epa_style = {"Arc": 201, "Connec": 202, "Link": 203, "Node": 204, "Gully": 205}
-
- # Get layers
- arc_layers, node_layers, connec_layers, gully_layers, link_layers = _get_layers()
-
- # Get set_epa_world from config
- if _set_epa_world is None:
- _set_epa_world = is_epa_world_active(False)
- # Deactivate EPA
- if not _set_epa_world:
- tools_gw.set_config_parser("epa_world", "epa_world_active", str(_set_epa_world), 'user', 'session')
- # Disable current filters and set previous layer filters
- for layer in arc_layers + node_layers + connec_layers + gully_layers + link_layers:
- if is_init:
- # Manage style & filter
- style_manager = layer.styleManager()
- if style_manager.currentStyle() == "GwEpaStyle":
- layer.setSubsetString(None)
- if not style_manager.setCurrentStyle("GwStyle"):
- style_manager.setCurrentStyle(tools_qt.tr('default', context_name='QgsMapLayerStyleManager'))
- else:
- layer.setSubsetString(layers_subsetstrings.get(layer.name()))
-
- # Manage style
- style_manager = layer.styleManager()
- style_manager.setCurrentStyle(layers_stylesheets.get(layer.name()))
-
- # Activate EPA
- else:
- tools_gw.set_config_parser("epa_world", "epa_world_active", str(_set_epa_world), 'user', 'session')
- if not selector_change:
- # Get layers subsetStrings
- for layer in arc_layers + node_layers + connec_layers + gully_layers + link_layers:
- layers_subsetstrings[layer.name()] = layer.subsetString()
-
- # Manage style
- style_manager = layer.styleManager()
- layers_stylesheets[layer.name()] = style_manager.currentStyle()
-
- if style_manager.setCurrentStyle("GwEpaStyle"):
- pass
- else:
- style_id = epa_style.get(f"{layer.name()}", 204)
- tools_gw.set_layer_style(style_id, layer, True)
-
- sectors = _get_sectors()
- # Get inp_options_networkmode
- inp_options_networkmode = tools_gw.get_config_value('inp_options_networkmode')
- try:
- inp_options_networkmode = int(inp_options_networkmode[0])
- except (ValueError, IndexError, TypeError):
- pass
-
- body = tools_gw.create_body()
- json_result = tools_gw.execute_procedure('gw_fct_getnodeborder', body)
- nodes = json_result.get('body', {}).get('data', {}).get('nodes', [])
-
- sql = f"is_operative = true AND epa_type != 'UNDEFINED' AND sector_id IN ({sectors})"
-
- # arc
- for layer in arc_layers:
- layer.setSubsetString(sql)
-
- # node
- for layer in node_layers:
- nodes_sql = sql
- if nodes:
- node_ids = "','".join(str(node) for node in nodes)
- nodes_sql += " OR node_id IN ('{}')".format(node_ids)
- layer.setSubsetString(nodes_sql)
-
- if global_vars.project_type == 'ws':
- # ws connec
- for layer in connec_layers:
- if inp_options_networkmode == 4:
- layer.setSubsetString(sql)
- else:
- layer.setSubsetString("FALSE")
-
- # ws link
- for layer in link_layers:
- if inp_options_networkmode == 4:
- layer.setSubsetString(sql)
- else:
- layer.setSubsetString("FALSE")
-
- elif global_vars.project_type == 'ud':
- # ud connec
- for layer in connec_layers:
- layer.setSubsetString("FALSE")
-
- # ud gully
- for layer in gully_layers:
- if inp_options_networkmode == 2:
- layer.setSubsetString(sql)
- else:
- layer.setSubsetString("FALSE")
-
- # ud link
- for layer in link_layers:
- if inp_options_networkmode == 2:
- layer.setSubsetString(sql + ' AND feature_type = \'GULLY\'')
- else:
- layer.setSubsetString("FALSE")
-
- return _set_epa_world
-
-
-class GwEpaWorldButton(GwAction):
- """ Button 308: Switch EPA world """
-
- def __init__(self, icon_path, action_name, text, toolbar, action_group):
-
- super().__init__(icon_path, action_name, text, toolbar, action_group)
- self.action.setCheckable(True)
- tools_gw.set_config_parser("epa_world", "epa_world_active", 'false', 'user', 'session')
-
- def clicked_event(self):
-
- self._switch_epa_world()
-
- # region private functions
-
- def _switch_epa_world(self):
-
- # Check world type
- epa_world_active = is_epa_world_active()
-
- # Apply filters
- _set_epa_world = not epa_world_active
-
- set_epa_world(_set_epa_world)
-
- # Set action checked
- self._action_set_checked(_set_epa_world)
-
- # Show message
- if _set_epa_world:
- msg = "EPA point of view activated"
- else:
- msg = "EPA point of view deactivated"
- tools_qgis.show_info(msg)
-
- def _action_set_checked(self, checked):
- # Set checked
- self.action.setChecked(checked)
-
- # endregion
diff --git a/core/toolbars/toc/layerstyle_change_button.py b/core/toolbars/toc/layerstyle_change_button.py
new file mode 100644
index 000000000..57baff5e4
--- /dev/null
+++ b/core/toolbars/toc/layerstyle_change_button.py
@@ -0,0 +1,118 @@
+"""
+This file is part of Giswater 3
+The 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 3 of the License,
+or (at your option) any later version.
+"""
+# -*- coding: utf-8 -*-
+import json
+from functools import partial
+
+from typing import List, Tuple, Optional
+from qgis.PyQt.QtCore import QObject, QPoint
+from qgis.PyQt.QtWidgets import QMenu, QAction
+from qgis.PyQt.QtGui import QCursor
+from qgis.core import QgsMapLayerStyle
+from ..dialog import GwAction
+from ...utils import tools_gw
+from ....libs import tools_qgis, tools_db
+
+
+def get_contexts_params() -> List[Tuple[int, str]]:
+
+ # TODO: manage roles
+ sql = """
+ SELECT id, idval, addparam
+ FROM config_style
+ WHERE is_templayer = false AND active = true
+ """
+ rows = tools_db.get_rows(sql)
+
+ if not rows:
+ return []
+
+ # Process rows to extract the order and sort them accordingly
+ processed_rows = []
+ for row in rows:
+ id, idval, addparam = row
+ order_by = 999 # Default order if not specified
+ if addparam:
+ try:
+ order_by = addparam.get("orderBy", 999)
+ except Exception:
+ pass
+
+ processed_rows.append((id, idval, order_by))
+
+ # Sort the rows by order_by
+ processed_rows.sort(key=lambda x: x[2])
+
+ return [(row[0], row[1]) for row in processed_rows]
+
+
+def get_styles_for_context(styleconfig_id: int) -> List[Tuple[str, str]]:
+ """Fetch styles from the sys_style table for a given context."""
+
+ sql = f"SELECT layername, stylevalue FROM sys_style WHERE styleconfig_id = {styleconfig_id}"
+ rows = tools_db.get_rows(sql)
+ return [(row[0], row[1]) for row in rows] if rows else []
+
+
+def apply_styles_to_layers(styleconfig_id: int, style_name: str, force_refresh: bool = False) -> None:
+ """Apply styles to layers based on the selected context."""
+
+ styles = get_styles_for_context(styleconfig_id)
+ for layername, qml in styles:
+ layer = tools_qgis.get_layer_by_tablename(layername)
+ if layer:
+ valid_qml, error_message = tools_gw.validate_qml(qml)
+ if not valid_qml:
+ msg = "The QML file is invalid"
+ tools_qgis.show_warning(msg, parameter=error_message, title=style_name)
+ else:
+ style_manager = layer.styleManager()
+
+ if (style_manager is None or style_manager.currentStyle() == style_name) and not force_refresh:
+ continue
+
+ # Set the style or add it if it doesn't exist
+ if not style_manager.setCurrentStyle(style_name) or force_refresh:
+ style = QgsMapLayerStyle()
+ style.readFromLayer(layer)
+ style_manager.addStyle(style_name, style)
+ style_manager.setCurrentStyle(style_name)
+ tools_qgis.create_qml(layer, qml)
+
+
+class GwLayerStyleChangeButton(GwAction):
+ """Button 308: Switch layers' styles"""
+
+ def __init__(self, icon_path: str, action_name: str, text: str, toolbar: QObject, action_group: QObject):
+ super().__init__(icon_path, action_name, text, toolbar, action_group)
+
+ def clicked_event(self) -> None:
+ """Show the menu directly when the button is clicked."""
+
+ self.menu: QMenu = QMenu()
+ self._populate_menu()
+ cursor = QCursor()
+ x = cursor.pos().x()
+ y = cursor.pos().y()
+ click_point = QPoint(x + 5, y + 5)
+ self.menu.exec_(click_point)
+
+ def _populate_menu(self) -> None:
+ """Populate the menu with available contexts."""
+
+ # contexts = get_available_contexts()
+ contexts_params = get_contexts_params()
+ for styleconfig_id, style_name in contexts_params:
+ action: QAction = QAction(style_name, self.menu)
+ action.triggered.connect(partial(self._apply_context, styleconfig_id, style_name))
+ self.menu.addAction(action)
+
+ def _apply_context(self, styleconfig_id: int, style_name: str) -> None:
+ """Apply styles for the selected context."""
+
+ apply_styles_to_layers(styleconfig_id, style_name)
+ tools_qgis.show_info(f"Applied styles for context: {style_name}")
diff --git a/core/toolbars/utilities/csv_btn.py b/core/toolbars/utilities/csv_btn.py
index 5f7adf09b..9f6f52aaf 100644
--- a/core/toolbars/utilities/csv_btn.py
+++ b/core/toolbars/utilities/csv_btn.py
@@ -104,7 +104,8 @@ def _populate_combos(self, combo, field_id, fields, table_name):
"role_edit": "'role_basic', 'role_om', 'role_edit'",
"role_epa": "'role_basic', 'role_om', 'role_edit', 'role_epa'",
"role_master": "'role_basic', 'role_om', 'role_edit', 'role_epa', 'role_master'",
- "role_admin": "'role_basic', 'role_om', 'role_edit', 'role_epa', 'role_master', 'role_admin'"}
+ "role_admin": "'role_basic', 'role_om', 'role_edit', 'role_epa', 'role_master', 'role_admin'",
+ "role_system": "''role_basic', 'role_om', 'role_edit', 'role_epa', 'role_master', 'role_admin, 'role_system'"}
sql = (f"SELECT DISTINCT({field_id}), {fields}"
f" FROM {table_name}"
diff --git a/core/toolbars/utilities/mapzone_manager.py b/core/toolbars/utilities/mapzone_manager.py
index e2aa6e9d7..240847c44 100644
--- a/core/toolbars/utilities/mapzone_manager.py
+++ b/core/toolbars/utilities/mapzone_manager.py
@@ -10,6 +10,7 @@
from functools import partial
from sip import isdeleted
+from qgis.PyQt.QtGui import QCursor
from qgis.PyQt.QtCore import Qt, QPoint
from qgis.PyQt.QtWidgets import QAction, QMenu, QTableView, QAbstractItemView, QGridLayout, QLabel, QWidget, QComboBox
from qgis.PyQt.QtSql import QSqlTableModel
@@ -63,6 +64,11 @@ def manage_mapzones(self):
qtableview.setObjectName(f"tbl_{view}")
qtableview.clicked.connect(partial(self._manage_highlight, qtableview, view))
qtableview.doubleClicked.connect(partial(self.manage_update, self.mapzone_mng_dlg, None))
+
+ # Populate custom context menu
+ qtableview.setContextMenuPolicy(Qt.CustomContextMenu)
+ qtableview.customContextMenuRequested.connect(partial(self._show_context_menu, qtableview))
+
tab_idx = self.mapzone_mng_dlg.main_tab.addTab(qtableview, f"{view.split('_')[-1].capitalize()}")
self.mapzone_mng_dlg.main_tab.widget(tab_idx).setObjectName(view)
@@ -151,7 +157,7 @@ def _fill_mapzone_table(self, set_edit_triggers=QTableView.NoEditTriggers, expr=
model = QSqlTableModel(db=lib_vars.qgis_db_credentials)
table_name = self.table_name
if show_all:
- table_name = table_name.replace('v_ui_', '')
+ table_name = table_name.replace('v_ui_', 'vu_')
model.setTable(table_name)
# model.setFilter(f"dscenario_id = {self.selected_dscenario_id}")
model.setEditStrategy(QSqlTableModel.OnFieldChange)
@@ -383,6 +389,32 @@ def get_snapped_feature_id(self, dialog, action, layer_name, option, widget_name
partial(self._get_id, dialog, action, option, emit_point, child_type),
'mapzone_manager_snapping', 'get_snapped_feature_id_ep_canvasClicked_get_id')
+ def _show_context_menu(self, qtableview, pos):
+ """ Show custom context menu """
+ menu = QMenu(qtableview)
+
+ action_create = QAction("Create", qtableview)
+ action_create.triggered.connect(partial(self.manage_create, self.mapzone_mng_dlg, qtableview))
+ menu.addAction(action_create)
+
+ action_update = QAction("Update", qtableview)
+ action_update.triggered.connect(partial(self.manage_update, self.mapzone_mng_dlg, qtableview))
+ menu.addAction(action_update)
+
+ action_delete = QAction("Delete", qtableview)
+ action_delete.triggered.connect(partial(self._manage_delete))
+ menu.addAction(action_delete)
+
+ action_toggle_active = QAction("Toggle Active", qtableview)
+ action_toggle_active.triggered.connect(self._manage_toggle_active)
+ menu.addAction(action_toggle_active)
+
+ action_config = QAction("Config", qtableview)
+ action_config.triggered.connect(partial(self.manage_config, self.mapzone_mng_dlg, qtableview))
+ menu.addAction(action_config)
+
+ menu.exec(QCursor.pos())
+
def _mouse_moved(self, layer, point):
""" Mouse motion detection """
@@ -495,7 +527,6 @@ def _add_node_parent(self, dialog):
node_parent_id = self.node_parent
to_arc_list = json.dumps(list(self.to_arc_list))
preview = tools_qt.get_text(dialog, 'txt_preview')
-
parameters = f'"action": "ADD", "configZone": "{self.mapzone_type}", "mapzoneId": "{self.mapzone_id}", ' \
f'"nodeParent": "{node_parent_id}", "toArc": {to_arc_list}'
if self.netscenario_id is not None:
@@ -637,7 +668,8 @@ def _accept_config(self, dialog):
extras = f'"parameters": {{{parameters}}}'
body = tools_gw.create_body(extras=extras)
json_result = tools_gw.execute_procedure('gw_fct_config_mapzones', body)
- if json_result is None:
+ if not json_result or 'status' not in json_result:
+ tools_qgis.show_message("Failed to get a valid response from gw_fct_config_mapzones.", level=2)
return
if 'status' in json_result and json_result['status'] == 'Accepted':
diff --git a/core/toolbars/utilities/style_manager.py b/core/toolbars/utilities/style_manager.py
new file mode 100644
index 000000000..a42d41907
--- /dev/null
+++ b/core/toolbars/utilities/style_manager.py
@@ -0,0 +1,584 @@
+"""
+This file is part of Giswater 3
+The 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 3 of the License,
+or (at your option) any later version.
+"""
+# -*- coding: utf-8 -*-
+from functools import partial
+import json
+import tempfile
+
+from ..toc.layerstyle_change_button import apply_styles_to_layers
+from ...ui.ui_manager import GwStyleManagerUi, GwCreateStyleGroupUi
+from ...utils import tools_gw
+from ....libs import lib_vars, tools_db, tools_qgis, tools_qt
+from .... import global_vars
+
+from qgis.PyQt.QtWidgets import QDialog, QLabel, QHeaderView, QTableView, QMenu, QAction, QMessageBox
+from qgis.PyQt.QtCore import Qt
+from qgis.PyQt.QtSql import QSqlTableModel
+
+
+class GwStyleManager:
+
+ def __init__(self):
+ """Initializes the StyleManager with basic configurations."""
+ self.plugin_dir = lib_vars.plugin_dir
+ self.iface = global_vars.iface
+ self.schema_name = lib_vars.schema_name
+ self.style_mng_dlg = None
+
+
+ def manage_styles(self):
+ """Manages the user interface for style management."""
+ self.style_mng_dlg = GwStyleManagerUi(self)
+ tools_gw.load_settings(self.style_mng_dlg)
+
+ # Add icons to the buttons
+ tools_gw.add_icon(self.style_mng_dlg.btn_add_group, "111", sub_folder="24x24")
+ tools_gw.add_icon(self.style_mng_dlg.btn_delete_group, "112", sub_folder="24x24")
+
+ # Load layers and populate the menu
+ layers_data = self._load_layers_with_geom()
+ if layers_data:
+ self._populate_layers_menu(layers_data)
+
+ # Populate the combobox with style groups
+ self.populate_stylegroup_combobox()
+ self._load_styles()
+
+ # Connect signals to the corresponding methods
+ self.style_mng_dlg.btn_add_group.clicked.connect(partial(self._add_style_group, self.style_mng_dlg))
+ self.style_mng_dlg.btn_delete_group.clicked.connect(self._delete_style_group)
+ self.style_mng_dlg.cmb_stylegroup.currentIndexChanged.connect(self._filter_styles)
+ self.style_mng_dlg.txt_style_name.textChanged.connect(self._filter_styles)
+
+ # Connect signals to the style buttons
+ self.style_mng_dlg.btn_delete_style.clicked.connect(self._delete_selected_styles)
+ self.style_mng_dlg.btn_update_style.clicked.connect(self._update_selected_style)
+ self.style_mng_dlg.btn_refresh_all.clicked.connect(self._refresh_all_styles)
+
+ # Open the style management dialog
+ tools_gw.open_dialog(self.style_mng_dlg, 'style_manager')
+
+
+ def populate_stylegroup_combobox(self):
+ """Populates the style group combobox with data from the database."""
+ contexts_params = self.get_contexts_params()
+
+ self.style_mng_dlg.cmb_stylegroup.clear()
+ self.style_mng_dlg.cmb_stylegroup.addItem("")
+
+ for context_id, context_name in contexts_params:
+ self.style_mng_dlg.cmb_stylegroup.addItem(context_name, context_id)
+
+ def get_contexts_params(self):
+ """Retrieves style context parameters from the database."""
+ sql = """
+ SELECT id, idval, addparam
+ FROM config_style
+ WHERE id != 0 AND (is_templayer = false OR is_templayer IS NULL)
+ """
+ rows = tools_db.get_rows(sql)
+
+ if not rows:
+ return []
+
+ processed_rows = []
+ for row in rows:
+ id, idval, addparam = row
+ order_by = 999
+ if addparam:
+ try:
+ order_by = addparam.get("orderBy", 999)
+ except Exception:
+ pass
+
+ processed_rows.append((id, idval, order_by))
+
+ processed_rows.sort(key=lambda x: x[2])
+
+ return [(row[0], row[1]) for row in processed_rows]
+
+
+ def _load_sys_roles(self, dialog_create):
+ """Load roles in combobox."""
+ sql = "SELECT id FROM sys_role"
+ roles = tools_db.get_rows(sql)
+ dialog_create.sys_role.clear()
+ for role in roles:
+ dialog_create.sys_role.addItem(role[0])
+
+
+ def _add_style_group(self, dialog):
+ """Logic for adding a style group using the Qt Designer dialog."""
+ dialog_create = GwCreateStyleGroupUi(self)
+ tools_gw.load_settings(dialog_create)
+
+ self._load_sys_roles(dialog_create)
+
+ dialog_create.btn_add.clicked.connect(partial(self._handle_add_feature, dialog_create))
+ dialog_create.feature_id.textChanged.connect(partial(self._check_style_exists, dialog_create))
+ dialog_create.idval.textChanged.connect(partial(self._check_style_exists, dialog_create))
+
+ tools_gw.open_dialog(dialog_create, dlg_name='create_style_group')
+
+
+ def _handle_add_feature(self, dialog_create):
+ """Handles the logic when the add button is clicked."""
+
+ # Gather data from the dialog fields
+ feature_id = dialog_create.feature_id.text()
+ idval = dialog_create.idval.text()
+ descript = dialog_create.descript.text()
+ sys_role = dialog_create.sys_role.currentText()
+
+ # Validate that the mandatory fields are not empty
+ if not feature_id or not idval:
+ tools_qgis.show_warning("Feature ID and Idval cannot be empty.", dialog=self.style_mng_dlg)
+ return
+
+ # Start building the SQL query
+ sql = f"INSERT INTO config_style (id, idval"
+
+ # Initialize the values part with the mandatory fields
+ values = f"'{feature_id}', '{idval}'"
+
+ # Add optional fields if they are not empty
+ if descript:
+ sql += ", descript"
+ values += f", '{descript}'"
+ if sys_role:
+ sql += ", sys_role"
+ values += f", '{sys_role}'"
+
+ # Close the fields section of the SQL query
+ sql += f") VALUES ({values}) RETURNING id;"
+
+ try:
+ # Execute the SQL command and retrieve the new ID
+ tools_db.execute_sql(sql)
+ tools_qgis.show_info("Feature added successfully!", dialog=self.style_mng_dlg)
+ self.populate_stylegroup_combobox()
+ dialog_create.accept()
+
+ except Exception as e:
+ tools_qgis.show_warning(f"Failed to add feature: {e}", dialog=self.style_mng_dlg)
+
+
+ def _filter_styles(self):
+ """Applies a filter based on the text in the textbox and the selection in the combobox."""
+ search_text = self.style_mng_dlg.txt_style_name.text().strip()
+ selected_stylegroup_name = self.style_mng_dlg.cmb_stylegroup.currentText().strip()
+
+ filter_str = ""
+
+ if search_text:
+ filter_str += f"layername LIKE '%{search_text}%'"
+
+ if selected_stylegroup_name:
+ if filter_str:
+ filter_str += " AND "
+ filter_str += f"category = '{selected_stylegroup_name}'"
+
+ model = self.style_mng_dlg.tbl_style.model()
+ model.setFilter(filter_str)
+ model.select()
+
+
+ def _load_styles(self):
+ """Loads styles into the table based on the selected style group."""
+ selected_stylegroup_name = self.style_mng_dlg.cmb_stylegroup.currentText()
+
+ # Prepare the SQL query to load data from the view
+ model = QSqlTableModel(db=lib_vars.qgis_db_credentials)
+ model.setTable(f"{lib_vars.schema_name}.v_ui_sys_style")
+
+ if selected_stylegroup_name:
+ # Apply filter based on the selected style group
+ model.setFilter(f"category = '{selected_stylegroup_name}'")
+ model.select()
+
+ # Check for any errors
+ if model.lastError().isValid():
+ tools_qgis.show_warning(f"Database Error: {model.lastError().text()}", dialog=self.style_mng_dlg)
+ return
+
+ self.style_mng_dlg.tbl_style.setModel(model)
+ model.setEditStrategy(QSqlTableModel.OnManualSubmit)
+ self.style_mng_dlg.tbl_style.setSelectionBehavior(QTableView.SelectRows)
+ self.style_mng_dlg.tbl_style.setEditTriggers(QTableView.NoEditTriggers)
+
+ # Customize table view
+ header = self.style_mng_dlg.tbl_style.horizontalHeader()
+ header.setSectionResizeMode(QHeaderView.Interactive)
+ header.setStretchLastSection(True)
+
+
+ def _check_style_exists(self, dialog_create):
+ feature_id_text = dialog_create.feature_id.text().strip()
+ idval_text = dialog_create.idval.text().strip()
+ color = "border: 1px solid red"
+ has_error = False
+
+ dialog_create.feature_id.setStyleSheet("")
+ dialog_create.feature_id.setToolTip("")
+ dialog_create.idval.setStyleSheet("")
+ dialog_create.idval.setToolTip("")
+
+ # Validates Feature ID if it's not empty
+ if feature_id_text:
+ try:
+ feature_id = int(feature_id_text)
+ sql_id = f"SELECT id FROM config_style WHERE id = '{feature_id}'"
+ row_id = tools_db.get_row(sql_id, log_info=False)
+
+ if row_id:
+ dialog_create.feature_id.setStyleSheet(color)
+ dialog_create.feature_id.setToolTip("Feature ID already exists")
+ has_error = True
+ except ValueError:
+ dialog_create.feature_id.setStyleSheet(color)
+ dialog_create.feature_id.setToolTip("Feature ID must be an integer")
+ has_error = True
+
+ # Validates Idval if it's not empty
+ if idval_text:
+ sql_idval = f"SELECT idval FROM config_style WHERE idval = '{idval_text}'"
+ row_idval = tools_db.get_row(sql_idval, log_info=False)
+
+ if row_idval:
+ dialog_create.idval.setStyleSheet(color)
+ dialog_create.idval.setToolTip("Category already exists")
+ has_error = True
+ else:
+ dialog_create.idval.setStyleSheet("")
+ dialog_create.idval.setToolTip("")
+
+ dialog_create.btn_add.setEnabled(not has_error)
+
+
+ def _delete_style_group(self):
+ """Logic for deleting a style group with cascade deletion."""
+ selected_stylegroup_name = self.style_mng_dlg.cmb_stylegroup.currentText()
+
+ if not selected_stylegroup_name:
+ tools_qgis.show_warning("Please select a style group to delete.", dialog=self.style_mng_dlg)
+ return
+
+ confirm = tools_qt.show_question(
+ f"Are you sure you want to delete the style group '{selected_stylegroup_name}'?\n\n"
+ "This will also delete all related entries in the sys_style table.",
+ "Confirm Cascade Delete",
+ force_action=True
+ )
+
+ if not confirm:
+ return
+
+ try:
+ sql_delete_related = f"DELETE FROM sys_style WHERE styleconfig_id = (SELECT id FROM config_style WHERE idval = '{selected_stylegroup_name}')"
+ tools_db.execute_sql(sql_delete_related)
+
+ sql_delete_group = f"DELETE FROM config_style WHERE idval = '{selected_stylegroup_name}'"
+ tools_db.execute_sql(sql_delete_group)
+
+ tools_qgis.show_info(f"Style group '{selected_stylegroup_name}' and related entries have been deleted.", dialog=self.style_mng_dlg)
+ self.populate_stylegroup_combobox()
+ self._load_styles()
+
+ except Exception as e:
+ tools_qgis.show_warning(f"Failed to delete style group: {e}", dialog=self.style_mng_dlg)
+
+
+ #Functions for btn style top right of the dialog
+ def _delete_selected_styles(self):
+ """Logic for deleting the selected styles from the table."""
+ selected_rows = self.style_mng_dlg.tbl_style.selectionModel().selectedRows()
+
+ if len(selected_rows) == 0:
+ tools_qgis.show_warning("Please select one or more styles to delete.", dialog=self.style_mng_dlg)
+ return
+
+ confirm = tools_qt.show_question(
+ "Are you sure you want to delete the selected styles?",
+ "Confirm Deletion",
+ force_action=True
+ )
+
+ if not confirm:
+ return
+
+ try:
+ for index in selected_rows:
+ row = index.row()
+ layername_index = self.style_mng_dlg.tbl_style.model().index(row, 0)
+ idval_index = self.style_mng_dlg.tbl_style.model().index(row, 1)
+
+ layername = self.style_mng_dlg.tbl_style.model().data(layername_index)
+ idval = self.style_mng_dlg.tbl_style.model().data(idval_index)
+
+ sql_get_id = (
+ f"SELECT id FROM {lib_vars.schema_name}.config_style "
+ f"WHERE idval = '{idval}';"
+ )
+ row_result = tools_db.get_row(sql_get_id)
+
+ if not row_result:
+ tools_qgis.show_warning(f"Could not find the corresponding ID for the selected style {idval}.", dialog=self.style_mng_dlg)
+ continue
+
+ styleconfig_id = row_result[0]
+
+ # Delete the selected row from sys_style using the retrieved numeric `styleconfig_id`
+ sql_delete_style = (
+ f"DELETE FROM {lib_vars.schema_name}.sys_style "
+ f"WHERE layername = '{layername}' AND styleconfig_id = {styleconfig_id};"
+ )
+ tools_db.execute_sql(sql_delete_style)
+
+ tools_qgis.show_info("Selected styles were successfully deleted.", dialog=self.style_mng_dlg)
+ self._load_styles()
+
+ except Exception as e:
+ tools_qgis.show_warning(f"Failed to delete styles: {e}", dialog=self.style_mng_dlg)
+
+
+ def _load_layers_with_geom(self):
+ """Load layers with geometry for the Add Style button."""
+ try:
+ body = tools_gw.create_body()
+ json_result = tools_gw.execute_procedure('gw_fct_getaddlayervalues', body)
+ if not json_result or json_result['status'] != 'Accepted':
+ tools_qgis.show_warning("Failed to load layers.", dialog=self.style_mng_dlg)
+ return None
+
+ return json_result['body']['data']['fields']
+
+ except Exception as e:
+ tools_qgis.show_warning(f"Failed to load layers: {e}", dialog=self.style_mng_dlg)
+ return None
+
+
+ def _populate_layers_menu(self, layers):
+ """Populate the Add Style button with layers grouped by context."""
+ try:
+ menu = QMenu(self.style_mng_dlg.btn_add_style)
+ dict_menu = {}
+ for layer in layers:
+ # Filter only layers that have a geometry field
+ if layer['geomField'] == "None" or not layer['geomField']:
+ continue # Skip layers without a geometry field
+
+ context = json.loads(layer['context'])
+
+ # Level 1 of the context
+ if 'level_1' in context and context['level_1'] not in dict_menu:
+ menu_level_1 = menu.addMenu(f"{context['level_1']}")
+ dict_menu[context['level_1']] = menu_level_1
+
+ # Level 2 of the context
+ if 'level_2' in context and f"{context['level_1']}_{context['level_2']}" not in dict_menu:
+ menu_level_2 = dict_menu[context['level_1']].addMenu(f"{context['level_2']}")
+ dict_menu[f"{context['level_1']}_{context['level_2']}"] = menu_level_2
+
+ # Level 3 of the context
+ if 'level_3' in context and f"{context['level_1']}_{context['level_2']}_{context['level_3']}" not in dict_menu:
+ menu_level_3 = dict_menu[f"{context['level_1']}_{context['level_2']}"].addMenu(
+ f"{context['level_3']}")
+ dict_menu[f"{context['level_1']}_{context['level_2']}_{context['level_3']}"] = menu_level_3
+
+ alias = layer['layerName'] if layer['layerName'] is not None else layer['tableName']
+ alias = f"{alias} "
+
+ # Add actions and submenus at the appropriate context level
+ if 'level_3' in context:
+ sub_menu = dict_menu[f"{context['level_1']}_{context['level_2']}_{context['level_3']}"]
+ else:
+ sub_menu = dict_menu[f"{context['level_1']}_{context['level_2']}"]
+
+ action = QAction(alias, self.style_mng_dlg.btn_add_style)
+ action.triggered.connect(partial(self._add_layer_style, layer['tableName'], layer['geomField']))
+ sub_menu.addAction(action)
+
+ # Assign the menu to the button
+ self.style_mng_dlg.btn_add_style.setMenu(menu)
+
+ except Exception as e:
+ tools_qgis.show_warning(f"Failed to load layers: {e}", dialog=self.style_mng_dlg)
+
+ def _add_layer_style(self, table_name, geom_field):
+ """Add a new style for the specified layer, copying from 'GwBasic' if available."""
+ try:
+ selected_stylegroup_name = self.style_mng_dlg.cmb_stylegroup.currentText().strip()
+
+ if not selected_stylegroup_name:
+ tools_qgis.show_warning(
+ "Please select a style group before adding a new style.", dialog=self.style_mng_dlg
+ )
+ return
+
+ sql_get_id = (
+ f"SELECT id FROM {lib_vars.schema_name}.config_style "
+ f"WHERE idval = '{selected_stylegroup_name}';"
+ )
+ row_result = tools_db.get_row(sql_get_id)
+
+ if not row_result:
+ tools_qgis.show_warning(
+ f"Could not find an ID for the style group '{selected_stylegroup_name}'.", dialog=self.style_mng_dlg
+ )
+ return
+
+ new_styleconfig_id = row_result[0]
+ sql_check_exists = (
+ f"SELECT COUNT(*) "
+ f"FROM {lib_vars.schema_name}.sys_style "
+ f"WHERE layername = '{table_name}' AND styleconfig_id = {new_styleconfig_id};"
+ )
+ style_exists = tools_db.get_row(sql_check_exists)[0] > 0
+
+ if style_exists:
+ tools_qgis.show_warning(
+ f"A style already exists for the layer '{table_name}' in the selected style group.",
+ dialog=self.style_mng_dlg
+ )
+ return
+
+ sql_gw_basic = (
+ f"SELECT styletype, stylevalue, active "
+ f"FROM {lib_vars.schema_name}.sys_style "
+ f"WHERE layername = '{table_name}' AND styleconfig_id = ("
+ f"SELECT id FROM {lib_vars.schema_name}.config_style WHERE idval = 'GwBasic'"
+ f");"
+ )
+ existing_style = tools_db.get_row(sql_gw_basic)
+
+ if existing_style:
+ styletype, stylevalue, active = existing_style
+ stylevalue_clean = stylevalue.replace("'", "''")
+ else:
+ styletype = 'qml'
+ stylevalue_clean = ''
+ active = True
+
+ sql_insert_style = (
+ f"INSERT INTO {lib_vars.schema_name}.sys_style "
+ f"(layername, styleconfig_id, styletype, stylevalue, active) "
+ f"VALUES ('{table_name}', {new_styleconfig_id}, '{styletype}', '{stylevalue_clean}', {active});"
+ )
+
+ tools_db.execute_sql(sql_insert_style)
+
+ # Show success message
+ msg = (
+ f"A new style has been added to '{selected_stylegroup_name}' for the layer '{table_name}' "
+ f"using the 'GwBasic' style information.\n"
+ f"You can change it and use 'Update Style' to create a personalized version."
+ )
+ tools_qgis.show_message(msg, 3, dialog=self.style_mng_dlg)
+
+ self._load_styles()
+
+ except Exception as e:
+ tools_qgis.show_warning(
+ f"An error occurred while adding the style for layer '{table_name}':\n{str(e)}",
+ dialog=self.style_mng_dlg
+ )
+
+
+ def _update_selected_style(self):
+ """Update the selected styles in the database with the current QGIS layer style."""
+ selected_rows = self.style_mng_dlg.tbl_style.selectionModel().selectedRows()
+
+ if not selected_rows:
+ tools_qgis.show_warning("Please select one or more styles to update.", dialog=self.style_mng_dlg)
+ return
+
+ try:
+ for index in selected_rows:
+ layername_index = self.style_mng_dlg.tbl_style.model().index(index.row(), 0)
+ idval_index = self.style_mng_dlg.tbl_style.model().index(index.row(), 1)
+
+ layername = self.style_mng_dlg.tbl_style.model().data(layername_index)
+ idval = self.style_mng_dlg.tbl_style.model().data(idval_index)
+
+ msg = f"Are you sure you want to update the style of {layername} ({idval}) with the symbology" \
+ f" of the layer in the project? \nYou are going to lose previous information!"
+
+ reply = tools_qt.show_question(msg, "Update Confirmation", force_action=True)
+ if not reply:
+ continue
+
+ layer = tools_qgis.get_layer_by_tablename(layername)
+ if layer is None:
+ tools_qgis.show_warning(f"Layer '{layername}' not found in QGIS.", dialog=self.style_mng_dlg)
+ continue
+
+ style_value = ''
+ with tempfile.NamedTemporaryFile(delete=False, suffix=".qml") as tmp_file:
+ layer.saveNamedStyle(tmp_file.name)
+ with open(tmp_file.name, 'r', encoding='utf-8') as file:
+ style_value = file.read()
+
+ style_value = style_value.replace("'", "''")
+
+ sql_get_id = (
+ f"SELECT id FROM {lib_vars.schema_name}.config_style "
+ f"WHERE idval = '{idval}';"
+ )
+ styleconfig_id = tools_db.get_row(sql_get_id)
+ if not styleconfig_id:
+ tools_qgis.show_warning(f"Could not find config_style ID for idval '{idval}'.", dialog=self.style_mng_dlg)
+ continue
+
+ sql_update = (
+ f"UPDATE {lib_vars.schema_name}.sys_style "
+ f"SET stylevalue = '{style_value}' "
+ f"WHERE layername = '{layername}' AND styleconfig_id = {styleconfig_id[0]}"
+ )
+ tools_db.execute_sql(sql_update)
+
+ msg = "Selected styles updated successfully!"
+ tools_qgis.show_success(msg, dialog=self.style_mng_dlg)
+ self._load_styles()
+
+ except Exception as e:
+ tools_qgis.show_warning(f"Failed to update styles: {e}", dialog=self.style_mng_dlg)
+
+
+ def _refresh_all_styles(self):
+ """Refresh all styles in the database based on the current QGIS layer styles."""
+ try:
+ # Get all loaded layers in the project
+ loaded_layers = self.iface.mapCanvas().layers()
+ set_styles = set()
+
+ for layer in loaded_layers:
+ style_manager = layer.styleManager()
+ # Get all loaded styles in the layer
+ available_styles = style_manager.styles()
+ for style_name in available_styles:
+ set_styles.add(style_name)
+
+ for style in set_styles:
+ sql_get_id = (
+ f"SELECT id FROM {lib_vars.schema_name}.config_style "
+ f"WHERE idval = '{style}';"
+ )
+ styleconfig_id = tools_db.get_row(sql_get_id)
+
+ if styleconfig_id:
+ # Apply the style with force_refresh=True
+ apply_styles_to_layers(styleconfig_id[0], style, force_refresh=True)
+ # TODO: show message of all refreshed styles
+ # tools_qgis.show_warning(f"Style '{style}' not found in database.", dialog=self.style_mng_dlg)
+
+ msg = "All layers have been successfully refreshed."
+ tools_qgis.show_success(msg)
+ self._load_styles()
+
+ except Exception as e:
+ tools_qgis.show_warning(f"Database Error: {e}", dialog=self.style_mng_dlg)
+
diff --git a/core/toolbars/utilities/toolbox_btn.py b/core/toolbars/utilities/toolbox_btn.py
index d5392b872..d7acde21b 100644
--- a/core/toolbars/utilities/toolbox_btn.py
+++ b/core/toolbars/utilities/toolbox_btn.py
@@ -638,8 +638,8 @@ def _populate_functions_dlg(self, dialog, result, module=tools_backend_calls):
else:
feature_types = result['functionparams'].get('featureType')
self._populate_cmb_type(feature_types)
- self.dlg_functions.cmb_feature_type.currentIndexChanged.connect(partial(self._populate_layer_combo))
- self._populate_layer_combo()
+ self.dlg_functions.cmb_feature_type.currentIndexChanged.connect(partial(self._populate_layer_combo, feature_types))
+ self._populate_layer_combo(feature_types)
tools_gw.build_dialog_options(dialog, result, 0, self.function_list, self.temp_layers_added, module)
self._load_settings_values(dialog, result)
self._load_parametric_values(dialog, result)
@@ -704,8 +704,7 @@ def _get_all_group_layers(self, feature_type):
return list_items
- def _populate_layer_combo(self):
-
+ def _populate_layer_combo(self, feature_types):
feature_type = tools_qt.get_combo_value(self.dlg_functions, self.dlg_functions.cmb_feature_type, 0)
self.layers = []
self.layers = self._get_all_group_layers(feature_type)
@@ -714,12 +713,14 @@ def _populate_layer_combo(self):
legend_layers = tools_qgis.get_project_layers()
for feature_type, layer in self.layers:
if layer in legend_layers:
- elem = []
+
layer_name = tools_qgis.get_layer_source_table_name(layer)
- elem.append(layer.name())
- elem.append(layer_name)
- elem.append(feature_type)
- layers.append(elem)
+ if feature_types.get(feature_type.lower()) is not None and layer_name in feature_types.get(feature_type.lower()):
+ elem = []
+ elem.append(layer.name())
+ elem.append(layer_name)
+ elem.append(feature_type)
+ layers.append(elem)
if not layers:
elem = [f"There is no layer related to {feature_type}.", None, None]
layers.append(elem)
diff --git a/core/toolbars/utilities/utils_manager_btn.py b/core/toolbars/utilities/utils_manager_btn.py
index 2d882f08b..46e86e566 100644
--- a/core/toolbars/utilities/utils_manager_btn.py
+++ b/core/toolbars/utilities/utils_manager_btn.py
@@ -12,10 +12,13 @@
from qgis.PyQt.QtCore import QPoint
from qgis.PyQt.QtWidgets import QAction, QMenu
+from .style_manager import GwStyleManager
+from .... import global_vars
from ..dialog import GwAction
from .mapzone_manager import GwMapzoneManager
from ...shared.info import GwInfo
from ...shared.psector import GwPsector
+from ...shared.workcat import GwWorkcat
class GwUtilsManagerButton(GwAction):
@@ -69,7 +72,7 @@ def _fill_utils_menu(self):
del action
action_group = self.action.property('action_group')
- buttons = [['Mapzones manager', '_mapzones_manager'], ['Prices manager', '_prices_manager']]
+ buttons = [['Mapzones manager', '_mapzones_manager'], ['Workcat manager', '_workcat_manager'], ['Style manager', '_style_manager']]
for button in buttons:
button_name = button[0]
@@ -87,11 +90,6 @@ def _fill_utils_menu(self):
obj_action.triggered.connect(partial(getattr(self, button_function)))
obj_action.triggered.connect(partial(self._save_last_selection, self.menu, button_function))
-
- def _prices_manager(self):
- self.psector = GwPsector()
- self.psector.manage_prices()
-
# region mapzone manager functions
def _mapzones_manager(self):
@@ -99,3 +97,18 @@ def _mapzones_manager(self):
self.mapzones_manager = GwMapzoneManager()
self.mapzones_manager.manage_mapzones()
# endregion
+
+ # region workcat manager functions
+
+ def _workcat_manager(self):
+ self.workcat = GwWorkcat(global_vars.iface, global_vars.canvas)
+ self.workcat.manage_workcats()
+ # endregion
+
+ # region style manager functions
+
+ def _style_manager(self):
+ self.style = GwStyleManager()
+ self.style.manage_styles()
+
+ # endregion
diff --git a/core/ui/dialog.py b/core/ui/dialog.py
index 251fa954c..2602200b7 100644
--- a/core/ui/dialog.py
+++ b/core/ui/dialog.py
@@ -40,7 +40,8 @@ def __init__(self, class_obj, subtag=None):
elif item.layout() is not None:
self.layout().addLayout(item.layout(), row + 1, column, rowSpan, columnSpan)
self.layout().addWidget(self.messageBar(), 0, 0, 1, -1)
- except Exception:
+ except Exception as e:
+ print("Exception GWdialog: ", e)
self._messageBar = global_vars.iface
self.setProperty('class_obj', class_obj)
diff --git a/core/ui/shared/info_workcat.ui b/core/ui/shared/info_workcat.ui
index 0b8ed6d13..c09864f02 100644
--- a/core/ui/shared/info_workcat.ui
+++ b/core/ui/shared/info_workcat.ui
@@ -292,7 +292,14 @@
+ cat_work_id
+ descript
+ link
+ workid_key_1
+ workid_key_2
+ builtdate
btn_accept
+ btn_cancel
diff --git a/core/ui/shared/visit.ui b/core/ui/shared/visit.ui
index a9a96ab3c..68fce98c5 100644
--- a/core/ui/shared/visit.ui
+++ b/core/ui/shared/visit.ui
@@ -14,10 +14,14 @@
Visit
- -
-
-
-
+
+
+ QDialogButtonBox::Cancel|QDialogButtonBox::Ok
+
+
+
+ -
-
@@ -318,9 +322,6 @@
- -
-
-
-
@@ -396,6 +397,9 @@
-
+ -
+
+
@@ -677,18 +681,10 @@
- -
-
-
- QDialogButtonBox::Cancel|QDialogButtonBox::Ok
-
-
-
tab_widget
- descript
btn_add_geom
button_box
feature_id
diff --git a/core/ui/toolbars/basic/info_feature.ui b/core/ui/toolbars/basic/info_feature.ui
index 1afea31e2..e353f7eb8 100644
--- a/core/ui/toolbars/basic/info_feature.ui
+++ b/core/ui/toolbars/basic/info_feature.ui
@@ -53,6 +53,13 @@
+ -
+
+
+ Apply
+
+
+
-
@@ -88,8 +95,8 @@
0
0
- 734
- 368
+ 726
+ 335
@@ -109,8 +116,8 @@
0
0
- 734
- 368
+ 98
+ 28
@@ -144,8 +151,8 @@
0
0
- 734
- 360
+ 111
+ 64
@@ -183,8 +190,8 @@
0
0
- 734
- 360
+ 98
+ 42
diff --git a/core/ui/toolbars/basic/search_workcat.ui b/core/ui/toolbars/basic/search_workcat.ui
index 723483e07..56327499d 100644
--- a/core/ui/toolbars/basic/search_workcat.ui
+++ b/core/ui/toolbars/basic/search_workcat.ui
@@ -6,8 +6,8 @@
0
0
- 547
- 728
+ 551
+ 737
@@ -19,8 +19,8 @@
Workcat search
-
-
-
+
+
-
-
@@ -48,7 +48,7 @@
- -
+
-
0
@@ -301,7 +301,17 @@
-
-
-
+
+
+
+ 0
+ 0
+
+
+
+ true
+
+
-
@@ -370,7 +380,7 @@
- -
+
-
-
diff --git a/core/ui/toolbars/edit/doc.ui b/core/ui/toolbars/edit/doc.ui
index f62fa5ad6..65994c7e6 100644
--- a/core/ui/toolbars/edit/doc.ui
+++ b/core/ui/toolbars/edit/doc.ui
@@ -6,7 +6,7 @@
0
0
- 303
+ 361
431
@@ -38,11 +38,11 @@
Document
-
+
-
-
-
+
80
@@ -69,7 +69,7 @@
QFrame::Plain
- Doc id:
+ Doc name:
Qt::AutoText
@@ -86,7 +86,7 @@
-
-
+
true
@@ -332,6 +332,25 @@
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 0
+ 25
+
+
+
+ Add geom
+
+
+
@@ -382,7 +401,7 @@
-
- 0
+ 3
@@ -444,6 +463,123 @@
+
+
+ Workcat
+
+
+ -
+
+
-
+
+
+ -
+
+
+
+
+
+
+ ../icons/111b.png../icons/111b.png
+
+
+
+ -
+
+
+
+
+
+
+ ../icons/112b.png../icons/112b.png
+
+
+
+
+
+ -
+
+
+
+
+
+
+ Psector
+
+
+ -
+
+
-
+
+
+ -
+
+
+
+
+
+
+ ../icons/111b.png../icons/111b.png
+
+
+
+ -
+
+
+
+
+
+
+ ../icons/112b.png../icons/112b.png
+
+
+
+
+
+ -
+
+
+
+
+
+
+ Visit
+
+
+ -
+
+
-
+
+
+ -
+
+
+
+
+
+
+ ../icons/111b.png../icons/111b.png
+
+
+
+ -
+
+
+
+
+
+
+ ../icons/112b.png../icons/112b.png
+
+
+
+
+
+ -
+
+
+
+
-
@@ -455,13 +591,6 @@
- -
-
-
- Accept
-
-
-
-
@@ -475,6 +604,20 @@
+ -
+
+
+ Accept
+
+
+
+ -
+
+
+ Apply
+
+
+
diff --git a/core/ui/toolbars/edit/doc_manager.ui b/core/ui/toolbars/edit/doc_manager.ui
index aa9871884..847075884 100644
--- a/core/ui/toolbars/edit/doc_manager.ui
+++ b/core/ui/toolbars/edit/doc_manager.ui
@@ -41,7 +41,7 @@
-
-
+
0
@@ -54,9 +54,9 @@
-
-
+
- Filter by: Doc id
+ Filter by: Doc name
@@ -95,6 +95,12 @@
-
+
+
+ 0
+ 0
+
+
Create
diff --git a/core/ui/toolbars/plan/price_manager.ui b/core/ui/toolbars/edit/workcat_manager.ui
similarity index 75%
rename from core/ui/toolbars/plan/price_manager.ui
rename to core/ui/toolbars/edit/workcat_manager.ui
index 89e9b91ca..2d91c1710 100644
--- a/core/ui/toolbars/plan/price_manager.ui
+++ b/core/ui/toolbars/edit/workcat_manager.ui
@@ -1,17 +1,17 @@
- dlg_price_manager
-
+ dlg_workcat_manager
+
0
0
- 417
- 783
+ 643
+ 785
- Price result management
+ Workcat management
-
@@ -20,64 +20,48 @@
-
-
-
-
-
- 0
- 0
-
-
-
- Delete
-
-
-
- -
-
+
-
+
Qt::Horizontal
- 80
+ 40
20
- -
+
-
Close
- -
-
-
- -
-
-
- Qt::Horizontal
+
-
+
+
+
+ 0
+ 0
+
-
-
- 40
- 20
-
+
+
-
+
-
-
+
- Filter by: Result id
+ Filter by: Workcat name
- -
-
+
-
+
0
@@ -85,27 +69,40 @@
-
+ Delete
- -
-
-
- Current result
+
-
+
+
+ Qt::Horizontal
+
+
+
+ 80
+ 20
+
+
+
+
+ -
+
+
+ true
-
-
+
-
+
0
0
-
+ Create
diff --git a/core/ui/toolbars/epa/go2epa_manager.ui b/core/ui/toolbars/epa/go2epa_manager.ui
index c3aac2052..6e84e2984 100644
--- a/core/ui/toolbars/epa/go2epa_manager.ui
+++ b/core/ui/toolbars/epa/go2epa_manager.ui
@@ -57,6 +57,13 @@
+ -
+
+
+ Close
+
+
+
-
@@ -64,7 +71,7 @@
- -
+
-
@@ -90,14 +97,7 @@
- -
-
-
- Close
-
-
-
- -
+
-
Set corporate
@@ -114,13 +114,6 @@
- -
-
-
- true
-
-
-
-
@@ -134,10 +127,31 @@
- -
+
-
- Archive
+ Toggle archive
+
+
+
+ -
+
+
+ Edit
+
+
+
+ -
+
+
+ true
+
+
+
+ -
+
+
+ Show inp data
diff --git a/core/ui/toolbars/om/mincut.ui b/core/ui/toolbars/om/mincut.ui
index 6f8a78966..9dc871e3e 100644
--- a/core/ui/toolbars/om/mincut.ui
+++ b/core/ui/toolbars/om/mincut.ui
@@ -993,11 +993,13 @@
false
+
+
+
-
-
+
diff --git a/core/ui/toolbars/utilities/create_style_group.ui b/core/ui/toolbars/utilities/create_style_group.ui
new file mode 100644
index 000000000..c63c5c279
--- /dev/null
+++ b/core/ui/toolbars/utilities/create_style_group.ui
@@ -0,0 +1,191 @@
+
+
+ dlg_feature_add
+
+
+
+ 0
+ 0
+ 405
+ 255
+
+
+
+ Add category
+
+
+ -
+
+
+ Cancel
+
+
+
+ -
+
+
+ Qt::Horizontal
+
+
+
+ 40
+ 20
+
+
+
+
+ -
+
+
+ 0
+
+
+
+ Data
+
+
+
-
+
+
-
+
+
+
+ 0
+ 0
+
+
+
+ Category name:
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+ Category ID:
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ Qt::Horizontal
+
+
+ QSizePolicy::Fixed
+
+
+
+ 44
+ 20
+
+
+
+
+ -
+
+
+ Qt::Horizontal
+
+
+ QSizePolicy::Fixed
+
+
+
+ 44
+ 20
+
+
+
+
+ -
+
+
+ -
+
+
+ Qt::Horizontal
+
+
+ QSizePolicy::Fixed
+
+
+
+ 44
+ 20
+
+
+
+
+ -
+
+
+ Description:
+
+
+
+ -
+
+
+ Qt::Horizontal
+
+
+ QSizePolicy::Fixed
+
+
+
+ 44
+ 20
+
+
+
+
+ -
+
+
+ Role:
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+ Accept
+
+
+
+
+
+
+ mainTab
+ feature_id
+ idval
+ descript
+ sys_role
+ btn_add
+ btn_cancel
+
+
+
+
diff --git a/core/ui/toolbars/utilities/style_manager.ui b/core/ui/toolbars/utilities/style_manager.ui
new file mode 100644
index 000000000..439aff1c1
--- /dev/null
+++ b/core/ui/toolbars/utilities/style_manager.ui
@@ -0,0 +1,191 @@
+
+
+ dlg_style_manager
+
+
+
+ 0
+ 0
+ 975
+ 785
+
+
+
+ Style management
+
+
+ -
+
+
+
+
+
+
-
+
+
+ Close
+
+
+
+ -
+
+
+ true
+
+
+
+ -
+
+
+ Filter by: layername
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 150
+ 0
+
+
+
+
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+ Refresh all
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+ Delete style
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+ Update style
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+ Add style
+
+
+
+ -
+
+
+ Qt::Horizontal
+
+
+
+ 80
+ 20
+
+
+
+
+ -
+
+
+ Qt::Horizontal
+
+
+
+ 40
+ 20
+
+
+
+
+ -
+
+
+ Filter by: Category
+
+
+
+
+
+
+
+
+
+
+
diff --git a/core/ui/ui_manager.py b/core/ui/ui_manager.py
index a5ac5817c..85ca0f22d 100644
--- a/core/ui/ui_manager.py
+++ b/core/ui/ui_manager.py
@@ -182,6 +182,10 @@ class GwFeatureReplaceUi(GwDialog, FORM_CLASS):
FORM_CLASS = _get_ui_class('featuretype_change.ui', 'edit')
class GwFeatureTypeChangeUi(GwDialog, FORM_CLASS):
pass
+
+FORM_CLASS = _get_ui_class('workcat_manager.ui', 'edit')
+class GwWorkcatManagerUi(GwDialog, FORM_CLASS):
+ pass
# endregion
@@ -257,10 +261,6 @@ class GwNonVisualLidsUi(GwDialog, FROM_CLASS):
class GwPsectorUi(GwDialog, FORM_CLASS):
pass
-FORM_CLASS = _get_ui_class('price_manager.ui', 'plan')
-class GwPriceManagerUi(GwDialog, FORM_CLASS):
- pass
-
FORM_CLASS = _get_ui_class('psector_duplicate.ui', 'plan')
class GwPsectorDuplicateUi(GwDialog, FORM_CLASS):
pass
@@ -322,6 +322,14 @@ class GwCreateWorkspaceUi(GwDialog, FORM_CLASS):
class GwMapzoneManagerUi(GwDialog, FORM_CLASS):
pass
+FORM_CLASS = _get_ui_class('style_manager.ui', 'utilities')
+class GwStyleManagerUi(GwDialog, FORM_CLASS):
+ pass
+
+FORM_CLASS = _get_ui_class('create_style_group.ui', 'utilities')
+class GwCreateStyleGroupUi(GwDialog, FORM_CLASS):
+ pass
+
FORM_CLASS = _get_ui_class('mapzone_config.ui', 'utilities')
class GwMapzoneConfigUi(GwDialog, FORM_CLASS):
pass
diff --git a/core/utils/tools_backend_calls.py b/core/utils/tools_backend_calls.py
index 6cdb37059..0a6c39fe2 100644
--- a/core/utils/tools_backend_calls.py
+++ b/core/utils/tools_backend_calls.py
@@ -56,6 +56,17 @@ def add_object(**kwargs):
tools_qgis.show_warning(message, parameter=func_params['sourcewidget'])
return
+ # Special case for documents: get the document ID using the name
+ print(tab_name)
+ if qtable_name == 'tbl_document' or 'doc' in tab_name:
+ sql = f"SELECT id FROM doc WHERE name = '{object_id}'"
+ row = tools_db.get_row(sql, log_sql=True)
+ if not row:
+ tools_qgis.show_warning("Document name not found", parameter=object_id)
+ return
+ # Use the found document ID
+ object_id = row['id']
+
# Check if this object exists
view_object = f"v_ui_{func_params['sourceview']}"
sql = ("SELECT * FROM " + view_object + ""
@@ -398,7 +409,7 @@ def filter_table(**kwargs):
model.clear()
tools_gw.add_tableview_header(qtable, field)
tools_gw.fill_tableview_rows(qtable, field)
- tools_gw.set_tablemodel_config(dialog, qtable, linkedobject, 1, True)
+ tools_gw.set_tablemodel_config(dialog, qtable, linkedobject, 1)
tools_qt.set_tableview_config(qtable)
return complet_list
@@ -437,7 +448,7 @@ def filter_table_mincut(**kwargs):
model.clear()
tools_gw.add_tableview_header(qtable, field)
tools_gw.fill_tableview_rows(qtable, field)
- tools_gw.set_tablemodel_config(dialog, qtable, field['widgetname'], 1, True)
+ tools_gw.set_tablemodel_config(dialog, qtable, field['widgetname'], 1)
tools_qt.set_tableview_config(qtable)
return complet_list
@@ -559,7 +570,7 @@ def add_query_layer(**kwargs):
vlayer = QgsVectorLayer(uri.uri(False), f'{layer_name}', "postgres")
if vlayer.isValid():
- tools_qt.add_layer_to_toc(vlayer, group)
+ tools_qgis.add_layer_to_toc(vlayer, group)
def refresh_attribute_table(**kwargs):
@@ -796,7 +807,7 @@ def fill_tbl(complet_result, dialog, widgetname, linkedobject, filter_fields):
if widget is None: continue
widget = tools_gw.add_tableview_header(widget, field)
widget = tools_gw.fill_tableview_rows(widget, field)
- widget = tools_gw.set_tablemodel_config(dialog, widget, field['widgetname'], 1, True)
+ widget = tools_gw.set_tablemodel_config(dialog, widget, field['widgetname'], 1)
tools_qt.set_tableview_config(widget)
widget_list = []
diff --git a/core/utils/tools_gw.py b/core/utils/tools_gw.py
index f7f9ee368..e1f57a23b 100644
--- a/core/utils/tools_gw.py
+++ b/core/utils/tools_gw.py
@@ -45,7 +45,7 @@
from . import tools_backend_calls
from ..load_project_menu import GwMenuLoad
from ..utils.select_manager import GwSelectManager
-from ..toolbars.toc import epa_world_button
+from ..toolbars.toc import layerstyle_change_button
from ... import global_vars
from ...libs import lib_vars, tools_qgis, tools_qt, tools_log, tools_os, tools_db
from ...libs.tools_qt import GwHyperLinkLabel, GwHyperLinkLineEdit
@@ -542,10 +542,10 @@ def draw_wkt_geometry(wkt_string, rubber_band, color, width):
tools_qgis.show_warning('Unsuported geometry type', parameter=geometry_type)
-def enable_feature_type(dialog, widget_name='tbl_relation', ids=None):
-
+def enable_feature_type(dialog, widget_name='tbl_relation', ids=None, widget_table=None):
feature_type = tools_qt.get_widget(dialog, 'feature_type')
- widget_table = tools_qt.get_widget(dialog, widget_name)
+ if widget_table is None:
+ widget_table = tools_qt.get_widget(dialog, widget_name)
if feature_type is not None and widget_table is not None:
if len(ids) > 0:
feature_type.setEnabled(False)
@@ -613,7 +613,7 @@ def add_layer_database(tablename=None, the_geom="the_geom", field_id="id", group
:param group: Name of the group that will be created in the toc (String)
:param style_id: Id of the style we want to load (integer or String)
"""
- style_id_epa = "-1"
+
tablename_og = tablename
schema_name = tools_db.dao_db_credentials['schema'].replace('"', '')
field_id = field_id.replace(" ", "")
@@ -622,7 +622,7 @@ def add_layer_database(tablename=None, the_geom="the_geom", field_id="id", group
if the_geom:
try:
uri.setSrid(f"{lib_vars.data_epsg}")
- except:
+ except Exception:
pass
create_groups = get_config_parser("system", "force_create_qgis_group_layer", "user", "init", prefix=False)
create_groups = tools_os.set_boolean(create_groups, default=False)
@@ -636,43 +636,20 @@ def add_layer_database(tablename=None, the_geom="the_geom", field_id="id", group
f"user={tools_db.dao_db_credentials['user']} password={tools_db.dao_db_credentials['password']} " \
f"port={tools_db.dao_db_credentials['port']} mode=2 schema={tools_db.dao_db_credentials['schema']} " \
f"column={the_geom} table={tablename}"
- if alias: tablename = alias
+ if alias:
+ tablename = alias
layer = QgsRasterLayer(connString, tablename)
- tools_qt.add_layer_to_toc(layer, group, sub_group, create_groups=create_groups)
+ tools_qgis.add_layer_to_toc(layer, group, sub_group, create_groups=create_groups)
else:
- if alias: tablename = alias
+ if alias:
+ tablename = alias
layer = QgsVectorLayer(uri.uri(), f'{tablename}', 'postgres')
- tools_qt.add_layer_to_toc(layer, group, sub_group, create_groups=create_groups, sub_sub_group=sub_sub_group)
+ tools_qgis.add_layer_to_toc(layer, group, sub_group, create_groups=create_groups, sub_sub_group=sub_sub_group)
- # The triggered function (action.triggered.connect(partial(...)) as the last parameter sends a boolean,
- # if we define style_id = None, style_id will take the boolean of the triggered action as a fault,
- # therefore, we define it with "-1"
+ # Apply styles to layer
if style_id in (None, "-1"):
- # Get style_id from tablename
- sql = f"SELECT id FROM sys_style WHERE idval = '{tablename_og}'"
- row = tools_db.get_row(sql)
- if row:
- style_id = row[0]
-
- # Get style_id for Gw Epa Style
- sql = f"SELECT id FROM sys_style WHERE idval = '{tablename_og} SWMM point of view'"
- row = tools_db.get_row(sql)
- if row:
- style_id_epa = row[0]
- else:
- sql = f"SELECT id FROM sys_style WHERE idval = '{tablename_og} EPANET point of view'"
- row = tools_db.get_row(sql)
- if row:
- style_id_epa = row[0]
-
- # Apply style to layer if it has one configured
- if style_id not in (None, "-1"):
- set_layer_style(style_id, layer)
-
- # Apply Gw EPA style to layer if it has one configured
- if style_id_epa not in (None, "-1"):
- set_layer_style(style_id_epa, layer, True)
+ set_layer_styles(tablename_og, layer)
if tablename:
# Set layer config
@@ -713,6 +690,8 @@ def add_layer_database(tablename=None, the_geom="the_geom", field_id="id", group
global_vars.iface.mapCanvas().refresh()
def validate_qml(qml_content):
+ if not qml_content:
+ return False, "QML is empty!"
qml_content_no_spaces = qml_content.replace("\n", "").replace("\t", "")
try:
root = ET.fromstring(qml_content_no_spaces)
@@ -721,14 +700,16 @@ def validate_qml(qml_content):
return False, str(e)
-def set_layer_style(style_id, layer, is_epa=False):
- body = f'$${{"data":{{"style_id":"{style_id}"}}}}$$'
- style = execute_procedure('gw_fct_getstyle', body)
- if style is None or style['status'] == 'Failed':
+def set_layer_styles(tablename, layer):
+ body = f'$${{"data":{{"layername":"{tablename}"}}}}$$'
+ json_return = execute_procedure('gw_fct_getstyle', body)
+ if json_return is None or json_return['status'] == 'Failed':
return
- if 'styles' in style['body']:
- if 'style' in style['body']['styles']:
- qml = style['body']['styles']['style']
+ if 'styles' in json_return['body']:
+ for style_name, qml in json_return['body']['styles'].items():
+
+ if qml is None:
+ continue
valid_qml, error_message = validate_qml(qml)
if not valid_qml:
@@ -737,18 +718,13 @@ def set_layer_style(style_id, layer, is_epa=False):
else:
style_manager = layer.styleManager()
- # read valid style from layer
- style = QgsMapLayerStyle()
- style.readFromLayer(layer)
-
- style_name = "GwEpaStyle" if is_epa else "GwStyle"
+ default_style_name = tools_qt.tr('default', context_name='QgsMapLayerStyleManager')
# add style with new name
- style_manager.addStyle(style_name, style)
+ style_manager.renameStyle(default_style_name, style_name)
# set new style as current
style_manager.setCurrentStyle(style_name)
-
tools_qgis.create_qml(layer, qml)
- style_manager.setCurrentStyle("GwStyle")
+
def add_layer_temp(dialog, data, layer_name, force_tab=True, reset_text=True, tab_idx=1, del_old_layers=True,
group='GW Temporal Layers', call_set_tabs_enabled=True, close=True):
@@ -1169,7 +1145,10 @@ def delete_selected_rows(widget, table_object):
for i in range(0, len(selected_list)):
row = selected_list[i].row()
- id_ = widget.model().record(row).value(str(field_object_id))
+ if isinstance(widget.model(), QStandardItemModel):
+ id_ = widget.model().item(row, 0).text()
+ else:
+ id_ = widget.model().record(row).value(str(field_object_id))
inf_text += f"{id_}, "
list_id += f"'{id_}', "
inf_text = inf_text[:-2]
@@ -1181,7 +1160,8 @@ def delete_selected_rows(widget, table_object):
sql = (f"DELETE FROM {table_object} "
f"WHERE {field_object_id} IN ({list_id})")
tools_db.execute_sql(sql)
- widget.model().select()
+ if hasattr(widget.model(), 'select'):
+ widget.model().select() # Refresh if it's a QSqlTableModel
def set_tabs_enabled(dialog):
@@ -1948,6 +1928,29 @@ def fill_typeahead(completer, model, field, dialog, widget, feature_id=None):
if not widget:
return
+
+ # Detect the active tab
+ active_tab_name = ""
+ tab_widget = dialog.findChild(QTabWidget)
+ if tab_widget:
+ active_tab_name = tab_widget.tabText(tab_widget.currentIndex())
+
+ # Custom logic for the "Doc" tab
+ if active_tab_name == "Doc":
+ search_text = tools_qt.get_text(dialog, widget)
+ query = f"SELECT name as idval FROM doc WHERE name ILIKE '%{search_text}%'"
+ rows = tools_db.get_rows(query)
+
+ if not rows:
+ # Handle the case when no matching documents are found
+ print("No matching documents found.")
+ list_items = []
+ else:
+ list_items = [row['idval'] for row in rows]
+
+ tools_qt.set_completer_object(completer, model, widget, list_items)
+ return
+
parent_id = ""
if 'parentId' in field:
parent_id = field["parentId"]
@@ -2210,10 +2213,11 @@ def get_expression_filter(feature_type, list_ids=None, layers=None):
"""
list_ids = list_ids[feature_type]
- field_id = feature_type + "_id"
if len(list_ids) == 0:
return None
+ field_id = feature_type + "_id"
+
# Set expression filter with features in the list
expr_filter = field_id + " IN ("
for i in range(len(list_ids)):
@@ -2575,15 +2579,29 @@ def manage_json_return(json_result, sql, rubber_band=None, i=None):
elif style_type[key]['style'] == 'qml':
style_id = style_type[key]['id']
- extras = f'"style_id":"{style_id}"'
+ extras = f'"style_id":"{style_id}", "layername":"{key}"'
body = create_body(extras=extras)
style = execute_procedure('gw_fct_getstyle', body)
if style is None or style.get('status') == 'Failed':
return
if 'styles' in style['body']:
- if 'style' in style['body']['styles']:
- qml = style['body']['styles']['style']
- tools_qgis.create_qml(v_layer, qml)
+ for style_name, qml in style['body']['styles'].items():
+ if qml is None:
+ continue
+
+ valid_qml, error_message = validate_qml(qml)
+ if not valid_qml:
+ msg = "The QML file is invalid."
+ tools_qgis.show_warning(msg, parameter=error_message)
+ else:
+ style_manager = v_layer.styleManager()
+
+ default_style_name = tools_qt.tr('default', context_name='QgsMapLayerStyleManager')
+ # add style with new name
+ style_manager.renameStyle(default_style_name, style_name)
+ # set new style as current
+ style_manager.setCurrentStyle(style_name)
+ tools_qgis.create_qml(v_layer, qml)
elif style_type[key]['style'] == 'unique':
color = style_type[key]['values']['color']
@@ -2607,10 +2625,15 @@ def manage_json_return(json_result, sql, rubber_band=None, i=None):
tools_qgis.clean_layer_group_from_toc('GW Temporal Layers')
-def get_rows_by_feature_type(class_object, dialog, table_object, feature_type):
+def get_rows_by_feature_type(class_object, dialog, table_object, feature_type, feature_id=None, feature_idname=None):
""" Get records of @feature_type associated to selected @table_object """
- object_id = tools_qt.get_text(dialog, table_object + "_id")
+ if feature_id is None:
+ feature_id = tools_qt.get_text(dialog, table_object + "_id")
+
+ if feature_idname is None:
+ feature_idname = f"{table_object}_id"
+
table_relation = table_object + "_x_" + feature_type
widget_name = "tbl_" + table_relation
@@ -2621,7 +2644,7 @@ def get_rows_by_feature_type(class_object, dialog, table_object, feature_type):
sql = (f"SELECT {feature_type}_id "
f"FROM {table_relation} "
- f"WHERE {table_object}_id = '{object_id}'")
+ f"WHERE {feature_idname} = '{feature_id}'")
rows = tools_db.get_rows(sql, log_info=False)
if rows:
for row in rows:
@@ -2629,7 +2652,7 @@ def get_rows_by_feature_type(class_object, dialog, table_object, feature_type):
class_object.ids.append(str(row[0]))
expr_filter = get_expression_filter(feature_type, class_object.list_ids, class_object.layers)
- table_name = f"v_edit_{feature_type}"
+ table_name = f"{class_object.schema_name}.v_edit_{feature_type}"
tools_qt.set_table_model(dialog, widget_name, table_name, expr_filter)
@@ -2708,23 +2731,26 @@ def get_layers_from_feature_type(feature_type):
def get_role_permissions(qgis_project_role):
+ role_admin = False
role_master = False
role_edit = False
role_om = False
role_epa = False
role_basic = False
- role_admin = tools_db.check_role_user("role_admin")
- if not role_admin:
- role_master = tools_db.check_role_user("role_master")
- if not role_master:
- role_epa = tools_db.check_role_user("role_epa")
- if not role_epa:
- role_edit = tools_db.check_role_user("role_edit")
- if not role_edit:
- role_om = tools_db.check_role_user("role_om")
- if not role_om:
- role_basic = tools_db.check_role_user("role_basic")
+ role_system = tools_db.check_role_user("role_system")
+ if not role_system:
+ role_admin = tools_db.check_role_user("role_admin")
+ if not role_admin:
+ role_master = tools_db.check_role_user("role_master")
+ if not role_master:
+ role_epa = tools_db.check_role_user("role_epa")
+ if not role_epa:
+ role_edit = tools_db.check_role_user("role_edit")
+ if not role_edit:
+ role_om = tools_db.check_role_user("role_om")
+ if not role_om:
+ role_basic = tools_db.check_role_user("role_basic")
if role_basic or qgis_project_role == 'role_basic':
return 'role_basic'
@@ -2738,6 +2764,8 @@ def get_role_permissions(qgis_project_role):
return 'role_master'
elif role_admin or qgis_project_role == 'role_admin':
return 'role_admin'
+ elif role_system or qgis_project_role == 'role_system':
+ return 'role_system'
else:
return 'role_basic'
@@ -2886,7 +2914,7 @@ def selection_changed(class_object, dialog, table_object, query=False, lazy_widg
load_tablename(dialog, table_object, class_object.feature_type, expr_filter)
tools_qt.set_lazy_init(table_object, lazy_widget=lazy_widget, lazy_init_function=lazy_init_function)
- enable_feature_type(dialog, table_object, ids=ids)
+ enable_feature_type(dialog, widget_table=table_object, ids=ids)
class_object.ids = ids
@@ -2935,7 +2963,7 @@ def set_model_signals(class_object):
class_object._manage_tab_feature_buttons
))
-def insert_feature(class_object, dialog, table_object, query=False, remove_ids=True, lazy_widget=None,
+def insert_feature(class_object, dialog, table_object, is_psector=False, remove_ids=True, lazy_widget=None,
lazy_init_function=None):
""" Select feature with entered id. Set a model with selected filter.
Attach that model to selected table
@@ -2943,7 +2971,12 @@ def insert_feature(class_object, dialog, table_object, query=False, remove_ids=T
tools_qgis.disconnect_signal_selection_changed()
feature_type = get_signal_change_tab(dialog)
- # Clear list of ids
+
+ # Initialize the list for the specific feature type if it doesn't exist
+ if feature_type not in class_object.list_ids:
+ class_object.list_ids[feature_type] = []
+
+ # Clear the temporary ids list when switching tabs or as needed
if remove_ids:
class_object.ids = []
@@ -2961,10 +2994,12 @@ def insert_feature(class_object, dialog, table_object, query=False, remove_ids=T
if feature_id == 'null':
message = "You need to enter a feature id"
- tools_qt.show_info_box(message)
+ tools_qt.tools_qgis.show_warning(message, dialog=dialog)
return
- # Iterate over all layers of the group
+ # Temporarily store IDs to be added for this feature type
+ selected_ids = []
+
for layer in class_object.layers[feature_type]:
if layer.selectedFeatureCount() > 0:
# Get selected features of the layer
@@ -2972,17 +3007,23 @@ def insert_feature(class_object, dialog, table_object, query=False, remove_ids=T
for feature in features:
# Append 'feature_id' into the list
selected_id = feature.attribute(field_id)
- if selected_id not in class_object.ids:
- class_object.ids.append(selected_id)
- if feature_id not in class_object.ids:
- # If feature id doesn't exist in list -> add
- class_object.ids.append(str(feature_id))
+ if selected_id not in selected_ids:
+ selected_ids.append(selected_id)
- # Set expression filter with features in the list
- expr_filter = f'"{field_id}" IN ( '
- for i in range(len(class_object.ids)):
- expr_filter += f"'{class_object.ids[i]}', "
- expr_filter = expr_filter[:-2] + ")"
+ if feature_id not in selected_ids:
+ selected_ids.append(str(feature_id))
+
+ # Append the new IDs to the existing list, ensuring no duplicates
+ class_object.list_ids[feature_type] = list(set(class_object.list_ids[feature_type] + selected_ids))
+
+ # Generate expression filter for the IDs
+ if class_object.list_ids[feature_type]:
+ expr_filter = f'"{field_id}" IN ('
+ for i in range(len(class_object.list_ids[feature_type])):
+ expr_filter += f"'{class_object.list_ids[feature_type][i]}', "
+ expr_filter = expr_filter[:-2] + ")"
+ else:
+ expr_filter = f'"{field_id}" IN (NULL)'
# Check expression
(is_valid, expr) = tools_qt.check_expression_filter(expr_filter)
@@ -2998,18 +3039,18 @@ def insert_feature(class_object, dialog, table_object, query=False, remove_ids=T
layer.selectByIds(id_list)
# Reload contents of table 'tbl_xxx_xxx_@feature_type'
- if query:
- _insert_feature_psector(dialog, feature_type, ids=class_object.ids)
+ if is_psector:
+ _insert_feature_psector(dialog, feature_type, ids=selected_ids)
layers = remove_selection(True, class_object.layers)
class_object.layers = layers
else:
load_tablename(dialog, table_object, feature_type, expr_filter)
tools_qt.set_lazy_init(table_object, lazy_widget=lazy_widget, lazy_init_function=lazy_init_function)
- # Update list
- class_object.list_ids[feature_type] = class_object.ids
- enable_feature_type(dialog, table_object, ids=class_object.ids)
- connect_signal_selection_changed(class_object, dialog, table_object, feature_type)
+ enable_feature_type(dialog, table_object, ids=class_object.list_ids[feature_type])
+
+ # Clear the feature_id text field
+ tools_qt.set_widget_text(dialog, "feature_id", "")
def remove_selection(remove_groups=True, layers=None):
@@ -3129,7 +3170,7 @@ def manage_docker_options(option_name='position'):
lib_vars.session_vars['dialog_docker'].position = 2
-def set_tablemodel_config(dialog, widget, table_name, sort_order=0, isQStandardItemModel=False, schema_name=None):
+def set_tablemodel_config(dialog, widget, table_name, sort_order=0, schema_name=None):
""" Configuration of tables. Set visibility and width of columns """
widget = tools_qt.get_widget(dialog, widget)
@@ -3143,7 +3184,7 @@ def set_tablemodel_config(dialog, widget, table_name, sort_order=0, isQStandardI
# Set width and alias of visible columns
columns_to_delete = []
- sql = (f"SELECT columnindex, width, alias, visible, style"
+ sql = (f"SELECT columnname, columnindex, width, alias, visible, style"
f" FROM {config_table}"
f" WHERE objectname = '{table_name}'"
f" ORDER BY columnindex")
@@ -3152,32 +3193,51 @@ def set_tablemodel_config(dialog, widget, table_name, sort_order=0, isQStandardI
if not rows:
return widget
+ # Create a dictionary to store the desired column positions
+ column_order = {}
+ for row in rows:
+ column_order[row['columnname']] = row['columnindex']
+
+ # Clear columns_dict
+ widget.setProperty('columns', None)
+
+ # Reorder columns in the widget according to columnindex
+ header = widget.horizontalHeader()
+ for column_name, column_index in sorted(column_order.items(), key=lambda item: item[1]):
+ col_idx = tools_qt.get_col_index_by_col_name(widget, column_name)
+ if col_idx is not None:
+ header.moveSection(header.visualIndex(col_idx), column_index)
+
+ columns_dict: Dict[str, str] = {}
for row in rows:
+ col_idx = tools_qt.get_col_index_by_col_name(widget, row['columnname'])
+ if col_idx is None:
+ continue
+ columns_dict[str(row['alias'] if row['alias'] else row['columnname'])] = str(row['columnname'])
if not row['visible']:
- columns_to_delete.append(row['columnindex'])
+ columns_to_delete.append(col_idx)
else:
style = row.get('style')
if style:
stretch = style.get('stretch')
if stretch is not None:
stretch = 1 if stretch else 0
- widget.horizontalHeader().setSectionResizeMode(row['columnindex'], stretch)
+ widget.horizontalHeader().setSectionResizeMode(col_idx, stretch)
width = row['width']
if width is None:
width = 100
- widget.setColumnWidth(row['columnindex'], width)
+ widget.setColumnWidth(col_idx, width)
if row['alias'] is not None:
- widget.model().setHeaderData(row['columnindex'], Qt.Horizontal, row['alias'])
-
+ widget.model().setHeaderData(col_idx, Qt.Horizontal, row['alias'])
+ widget.setProperty('columns', columns_dict)
# Set order
- if isQStandardItemModel:
- widget.model().sort(0, sort_order)
- else:
+ if isinstance(widget.model(), QStandardItemModel) is False:
widget.model().setSort(0, sort_order)
widget.model().select()
# Delete columns
for column in columns_to_delete:
- widget.hideColumn(column)
+ if column:
+ widget.hideColumn(column)
return widget
@@ -3287,6 +3347,7 @@ def load_tablename(dialog, table_object, feature_type, expr_filter):
return None
table_name = f"v_edit_{feature_type}"
+
expr = tools_qt.set_table_model(dialog, widget, table_name, expr_filter)
if widget_name is not None:
set_tablemodel_config(dialog, widget_name, table_name)
@@ -3429,7 +3490,7 @@ def manage_close(dialog, table_object, cur_active_layer=None, single_tool_mode=N
return layers
-def delete_records(class_object, dialog, table_object, query=False, lazy_widget=None, lazy_init_function=None, extra_field=None):
+def delete_records(class_object, dialog, table_object, is_psector=False, lazy_widget=None, lazy_init_function=None, extra_field=None):
""" Delete selected elements of the table """
tools_qgis.disconnect_signal_selection_changed()
@@ -3457,10 +3518,10 @@ def delete_records(class_object, dialog, table_object, query=False, lazy_widget=
if len(selected_list) == 0:
message = "Any record selected"
- tools_qt.show_info_box(message)
+ tools_qt.tools_qgis.show_warning(message, dialog=dialog)
return
- if query:
+ if is_psector:
full_list = widget.model()
for x in range(0, full_list.rowCount()):
class_object.ids.append(widget.model().record(x).value(f"{feature_type}_id"))
@@ -3505,7 +3566,7 @@ def delete_records(class_object, dialog, table_object, query=False, lazy_widget=
return
# Update model of the widget with selected expr_filter
- if query:
+ if is_psector:
state = None
if extra_field is not None and len(selected_list) == 1:
state = widget.model().record(selected_list[0].row()).value(extra_field)
@@ -3519,13 +3580,12 @@ def delete_records(class_object, dialog, table_object, query=False, lazy_widget=
# Build a list of feature id's and select them
tools_qgis.select_features_by_ids(feature_type, expr, layers=class_object.layers)
- if query:
+ if is_psector:
class_object.layers = remove_selection(layers=class_object.layers)
# Update list
class_object.list_ids[feature_type] = class_object.ids
enable_feature_type(dialog, table_object, ids=class_object.ids)
- connect_signal_selection_changed(class_object, dialog, table_object, query)
def get_parent_layers_visibility():
@@ -3618,16 +3678,6 @@ def execute_class_function(dlg_class, func_name: str, kwargs: dict = None):
tools_log.log_debug(f"Exception in tools_gw.execute_class_function (executing {func_name} from {dlg_class.__name__}): {e}")
-def is_epa_world_active(default=False):
- return epa_world_button.is_epa_world_active(default)
-
-
-def set_epa_world(_set_epa_world=None, selector_change=False, is_init=False):
- """ Activate or deactivate EPA world. If @_set_epa_world is None it will just refresh the filters """
-
- epa_world_button.set_epa_world(_set_epa_world, selector_change, is_init)
-
-
def open_dlg_help():
""" Opens the help page for the last focused dialog """
@@ -4185,7 +4235,7 @@ def fill_tbl(complet_result, dialog, widgetname, linkedobject, filter_fields):
if widget is None: continue
widget = add_tableview_header(widget, field)
widget = fill_tableview_rows(widget, field)
- widget = set_tablemodel_config(dialog, widget, short_name, 1, True)
+ widget = set_tablemodel_config(dialog, widget, short_name, 1)
tools_qt.set_tableview_config(widget, edit_triggers=QTableView.DoubleClicked)
widget_list = []
@@ -4216,6 +4266,33 @@ def _get_list(complet_result, form_name='', filter_fields='', widgetname='', for
return complet_list
+
+def get_list(table_name, filter_name="", filter_id=None, filter_active=None, id_field=None):
+ if id_field is None:
+ id_field = "id_val"
+
+ feature = f'"tableName":"{table_name}"'
+ filter_fields = f'"limit": -1, "{id_field}": {{"filterSign":"ILIKE", "value":"{filter_name}"}}'
+
+ if filter_id is not None:
+ filter_fields += f', "{id_field}": {{"filterSign":"=", "value":"{filter_id}"}}'
+
+ if filter_active is not None:
+ filter_fields += f', "active": {{"filterSign":"=", "value":"{filter_active}"}}'
+
+ body = create_body(feature=feature, filter_fields=filter_fields)
+ json_result = execute_procedure('gw_fct_getlist', body)
+
+ if json_result is None or json_result['status'] == 'Failed':
+ return False
+
+ complet_list = json_result
+ if not complet_list:
+ return False
+
+ return complet_list
+
+
# startregion
# Info buttons
diff --git a/dbmodel b/dbmodel
index 46b09d6d7..419aa8451 160000
--- a/dbmodel
+++ b/dbmodel
@@ -1 +1 @@
-Subproject commit 46b09d6d7bbf660a51c0eab1f7941b1cfae6882e
+Subproject commit 419aa8451682ad05754f56d6ab490a72d813104f
diff --git a/i18n/giswater_ca_ES.qm b/i18n/giswater_ca_ES.qm
index fb940e208..449d0b263 100644
Binary files a/i18n/giswater_ca_ES.qm and b/i18n/giswater_ca_ES.qm differ
diff --git a/i18n/giswater_ca_ES.ts b/i18n/giswater_ca_ES.ts
index 8b08fddac..852bb687c 100644
--- a/i18n/giswater_ca_ES.ts
+++ b/i18n/giswater_ca_ES.ts
@@ -80,10 +80,6 @@
Gestor d'elements
-
-
- Món epa
-
Gestor de resultats
@@ -132,6 +128,10 @@
Filtre de lots
+
+
+ Estils Giswater
+
Connexió amb comercial
@@ -2297,11 +2297,11 @@
admin_addfields
-
- Text de consulta:
+
+ Tipus dada:
-
+
None
@@ -2313,59 +2313,59 @@
None
-
- Tipus formulari:
+
+ Filtre text consulta:
-
+
None
-
- Tipus dada:
+
+ Num decimals:
-
+
None
-
- No Actualitzat
+
+ Recargar camp:
-
+
None
-
- Num decimals:
+
+ Obrir
-
+
None
-
- Recargar camp:
+
+ Editabilitat:
-
+
None
-
- Filtre text consulta:
+
+ Actualitzar
-
+
None
-
- Crear
+
+ Tipus formulari:
-
+
None
@@ -2377,44 +2377,44 @@
None
-
- Diàleg
+
+ Nom columna:
-
+
None
-
- Mecanografia:
+
+ Esborrar
-
+
None
-
- Tooltip:
+
+ Crear
-
+
None
-
- Esborrar
+
+ Tipus de widget:
-
+
None
-
- Controls del widget:
+
+ Text de consulta:
-
- Exemple de configuració keys {"widgetdim": 150,"setMultiline":true,"vdefault": "01-01-2014", "filterSign": ">}
+
+ None
@@ -2425,51 +2425,59 @@
Cancelar
-
- Nom de camp:
+
+ Finció del widget
-
+
None
-
- Tipus de widget:
+
+ Auto-actualitzable:
-
+
None
-
- Actualitzar
+
+ Controls del widget:
-
+
+ Exemple de configuració keys {"widgetdim": 150,"setMultiline":true,"vdefault": "01-01-2014", "filterSign": ">}
+
+
+
+ Nom de camp:
+
+
+
None
-
- Full d'estil:
+
+ Actiu:
-
+
None
-
- Macador de posició:
+
+ Mecanografia:
-
+
None
-
- Editabilitat:
+
+ Tooltip:
-
+
None
@@ -2481,27 +2489,19 @@
Acceptar
-
- Objecte vinculat:
-
-
-
- None
-
-
-
- Obrir
+
+ Full d'estil:
-
+
None
-
- Finció del widget
+
+ Macador de posició:
-
+
None
@@ -2521,83 +2521,83 @@
None
-
- Longitud de camp:
+
+ Valor nul:
-
+
None
-
- Funció d'acció:
+
+ Editable:
-
+
None
-
- Actiu:
+
+ Objecte vinculat:
-
+
None
-
- Nom columna:
+
+ Funció d'acció:
-
+
None
-
- Auto-actualitzable:
+
+ Diàleg
-
+
None
-
- Valor nul:
+
+ Configuració obligatoria de camps
-
+
None
-
- Editable:
+
+ Habilitat:
-
+
None
-
- Configuració obligatoria de camps
+
+ Longitud de camp:
-
+
None
-
- Habilitat:
+
+ Obligtori:
-
+
None
-
- Obligtori:
+
+ No Actualitzat
-
+
None
@@ -2612,19 +2612,27 @@
Acceptar
-
- Connexió:
+
+ Nom d'usuari:
-
+
None
-
- Nom d'usuari:
+
+ Diàleg
-
+
+ None
+
+
+
+ Connexió:
+
+
+
None
@@ -2643,14 +2651,6 @@
None
-
-
- Diàleg
-
-
-
- None
-
admin_dbproject
@@ -2663,108 +2663,108 @@
Nom d'un esquema nou. El nom ha d'escriures en minúscules utilitzant les lletres de l'alfabet anglès y sense espais ni guions.
-
- Idioma:
+
+ Fliltrar SRID:
-
- Idioma esquema
+
+ Identificador de referència espacial. Només es permeten els valors que es mostren en la taula
-
- Acceptar
+
+ Tipus de projecte:
-
- Acceptar
+
+ None
-
- Crear esquema de projecte
+
+ Descripció:
-
+
None
-
- ...
+
+ Importar dades INP
-
+
None
-
- Tancar
+
+ Font de dades:
-
- Close
+
+ None
-
- Fliltrar SRID:
+
+ Sense dades
-
- Identificador de referència espacial. Només es permeten els valors que es mostren en la taula
+
+ None
-
- Tipus de projecte:
+
+ Exemple inventari
-
+
None
-
- Descripció:
+
+ Exemple complet
-
+
None
-
- Importar dades INP
+
+ Tancar
-
- None
+
+ Close
-
- Font de dades:
+
+ Idioma:
-
- None
+
+ Idioma esquema
-
- Sense dades
+
+ ...
-
+
None
-
- Exemple inventari
+
+ Crear esquema de projecte
-
+
None
-
- Exemple complet
+
+ Acceptar
-
- None
+
+ Acceptar
@@ -2778,21 +2778,29 @@
admin_gisproject
-
- Acceptar
+
+ Nom arxiu QGIS
-
- Acceptar
+
+ None
-
- Nom arxiu QGIS
+
+ ...
-
+
None
+
+
+ Acceptar
+
+
+
+ Acceptar
+
Carpeta:
@@ -2817,14 +2825,6 @@
None
-
-
- ...
-
-
-
- None
-
Crear projecte QGIS
@@ -2844,22 +2844,6 @@
admin_importinp
-
-
- Run
-
-
-
- None
-
-
-
- Tancar
-
-
-
- Tancar
-
Paràmetres de configuració
@@ -2877,32 +2861,32 @@
None
-
- Configuració
+
+ Tancar
-
- None
+
+ Tancar
-
-
- admin_projectinfo
-
- Informació sobre les noves actualitzacions:
+
+ Configuració
-
+
None
-
- Actualitzar SQL
+
+ Run
-
+
None
+
+
+ admin_projectinfo
Tancar
@@ -2919,17 +2903,25 @@
None
-
-
- admin_qtdialog
-
- Cancelar
+
+ Actualitzar SQL
-
- Cancelar
+
+ None
+
+
+
+ Informació sobre les noves actualitzacions:
+
+
+
+ None
+
+
+ admin_qtdialog
Ruta UI
@@ -2939,12 +2931,20 @@
None
-
- Nom formulari:
+
+ Cancelar
-
- None
+
+ Cancelar
+
+
+
+ Acceptar
+
+
+
+ Acceptar
@@ -2962,6 +2962,17 @@
None
+
+
+ Nom formulari:
+
+
+
+ None
+
+
+
+ admin_renameproj
Acceptar
@@ -2970,9 +2981,14 @@
Acceptar
-
-
- admin_renameproj
+
+
+ Renombrar projecte
+
+
+
+ None
+
Si us plau, configureu un nou nom
@@ -2989,12 +3005,15 @@
Cancelar
+
+
+ admin_sysfields
-
- Renombrar projecte
+
+ Macador de posició:
-
+
None
@@ -3005,15 +3024,12 @@
Acceptar
-
-
- admin_sysfields
-
- Id columna:
+
+ Configuració adicional
-
+
None
@@ -3025,168 +3041,168 @@
None
-
- Cancelar
+
+ Full d'estil:
-
- Cancelar
+
+ None
-
- Controls del widget:
+
+ Diàleg
-
- Exemple de configuració keys {"widgetdim": 150,"setMultiline":true,"vdefault": "01-01-2014", "filterSign": ">}
+
+ None
-
- Obrir
+
+ Configuració bàsica
-
+
None
-
- Obligtori:
+
+ Crear
-
+
None
-
- Ordre de disseny:
+
+ Obrir
-
+
None
-
- Configuració adicional
+
+ Id columna:
-
+
None
-
- Nom de disseny:
+
+ Editabilitat:
-
+
None
-
- Etiqueta:
+
+ Editable:
-
+
None
-
- Ocult
+
+ Habilitat:
-
+
None
-
- Nom formulari:
+
+ Controls del widget:
-
- None
+
+ Exemple de configuració keys {"widgetdim": 150,"setMultiline":true,"vdefault": "01-01-2014", "filterSign": ">}
-
- Acceptar
+
+ Nom formulari:
-
- Acceptar
+
+ None
-
- Habilitat:
+
+ Cancelar
-
- None
+
+ Cancelar
-
- Editable:
+
+ Ocult
-
+
None
-
- Configuració bàsica
+
+ Etiqueta:
-
+
None
-
- Tooltip:
+
+ Nom de disseny:
-
+
None
-
- Crear
+
+ Ordre de disseny:
-
+
None
-
- Macador de posició:
+
+ Obligtori:
-
+
None
-
- Diàleg
+
+ Tooltip:
-
+
None
+
+
+ admin_translation
-
- Editabilitat:
+
+ Traduir formularis i missatges python
-
+
None
-
- Full d'estil:
+
+ Traduir fitxers
-
+
None
-
-
- admin_translation
Informació de la connexió
@@ -3204,19 +3220,19 @@
None
-
- Traduir fitxers
+
+ Codi font:
-
+
None
-
- Amfitrió:
+
+ Provar connexió
-
+
None
@@ -3228,19 +3244,11 @@
None
-
- Port:
-
-
-
- None
-
-
-
- Codi font:
+
+ Usuari:
-
+
None
@@ -3252,35 +3260,27 @@
None
-
- Usuari:
-
-
-
- None
-
-
-
- Traduir formularis i missatges python
+
+ Amfitrió:
-
+
None
-
- Provar connexió
+
+ Base de dades:
-
+
None
-
- Base de dades:
+
+ Port:
-
+
None
@@ -3295,83 +3295,35 @@
None
-
- Administrador Api
-
-
-
- None
-
-
-
- Actualitzar Esquema
-
-
-
- Actualitzar versió del schema seleccionat
-
-
-
- Avançat
-
-
-
- None
-
-
-
- Utilitzar restrinccions:
-
-
-
- None
-
-
-
- Arxius de traducció
-
-
-
- None
-
-
-
- Rauta UI
+
+ Nom de l'element
-
+
None
-
- Copiar
-
-
-
- Copiar l'esquema de base de dades seleccionat
-
-
-
- Crear
+
+ Nom de l'element:
-
+
None
-
- File to DB
+
+ Importar
-
+
None
-
- Crear
+
+ Fields manager
-
+
None
@@ -3390,14 +3342,6 @@
Crear, configurar o eliminar un camp adicional relacionat amb un tipus d'entitat seleccionada o per a tots els tipus d'elements definits en un projecte.
-
-
- Importar
-
-
-
- None
-
Actualitzar
@@ -3415,28 +3359,28 @@
None
-
- Restriccions
+
+ Connexió
-
+
None
-
- Connexió
+
+ Visita
-
- None
+
+ Crear, configurar o eliminar la definició de visita relacionada amb un tipus d'entitat seleccionada o per tots els tipus d'elements definits en un projecte.
-
- Fields manager
+
+ Cargar arxiu personalitzat
-
- None
+
+ Seleccioni una carpeta amb arxius .sql que vulgui executar en un esquema seleccionat
@@ -3446,14 +3390,6 @@
None
-
-
- Cargar arxiu personalitzat
-
-
-
- Seleccioni una carpeta amb arxius .sql que vulgui executar en un esquema seleccionat
-
Actualitzar
@@ -3463,227 +3399,227 @@
None
-
- Exportar
+
+ ...
-
+
None
-
- ...
+
+ Cargar arxiu
-
+
None
-
- Rename
+
+ Informació de l'esquema del projecte
-
- Renembrar l'esquema de base de dades seleccionat
+
+ None
-
- General
+
+ Administrar UI
-
+
None
-
- Crear
+
+ Crear arxiu porjecte QGIS
-
+
None
-
- Nom de l'element:
+
+ Nom connexió:
-
- None
+
+ Nom de la connexió de la base de dades definida en QGIS
-
- Nom de l'element:
+
+ Plantilles QGIS
-
+
None
-
- Esborrar
+
+ Recargar funcions:
-
+
None
-
- Admionistrador d'esquema
+
+ ...
-
+
None
-
- Actualitzar
+
+ Esborrar
-
- None
+
+ Eliminar l'esquema de base de dades seleccionat
-
- Nom de l'element
+
+ Execuatr
-
+
None
-
- Crear arxiu porjecte QGIS
+
+ Crear
-
+
None
-
- Nom del formulari
+
+ Crear
-
+
None
-
- Tancar
+
+ File to DB
-
- Close
+
+ None
-
- Nom connexió:
+
+ Actualitzar
-
- Nom de la connexió de la base de dades definida en QGIS
+
+ None
-
- Visita
+
+ Esborrar
-
- Crear, configurar o eliminar la definició de visita relacionada amb un tipus d'entitat seleccionada o per tots els tipus d'elements definits en un projecte.
+
+ None
-
- Cargar arxiu
+
+ Create DB project schema
-
+
None
-
- Nom:
+
+ Administrar vistes secundaries
-
- Nom de l'esquema de la base de dades
+
+ Recrear vistes secundaries per a un tipus d'element seleccionat o per a tot tipus d'elements definits en un projecte.
-
- Plantilles QGIS
+
+ Exportar
-
+
None
-
- Recargar funcions:
+
+ Nom de l'element:
-
+
None
-
- Esborrar
+
+ Admionistrador d'esquema
-
+
None
-
- Tipus projecte:
+
+ Administrador Api
-
- Tipus de giswater
+
+ None
-
- Giswater
+
+ Avançat
-
+
None
-
- Administrar UI
+
+ Actualitzar
-
+
None
-
- Administrar vistes secundaries
+
+ Esborrar
-
- Recrear vistes secundaries per a un tipus d'element seleccionat o per a tot tipus d'elements definits en un projecte.
+
+ None
-
- Execuatr
+
+ Crear
-
+
None
-
- ...
+
+ Rename
-
- None
+
+ Renembrar l'esquema de base de dades seleccionat
-
- Informació de l'esquema del projecte
+
+ Utilitzar restrinccions:
-
+
None
@@ -3695,118 +3631,110 @@
None
-
- Create DB project schema
+
+ General
-
+
None
-
- Actualitzar
+
+ Rauta UI
-
+
None
-
- Esborrar
+
+ Nom:
-
- Eliminar l'esquema de base de dades seleccionat
+
+ Nom de l'esquema de la base de dades
-
-
- admin_visitclass
-
- Id clase:
+
+ Arxius de traducció
-
+
None
-
- Acceptar
+
+ Tipus projecte:
-
- None
+
+ Tipus de giswater
-
- Tipus visita:
+
+ Actualitzar Esquema
-
- None
+
+ Actualitzar versió del schema seleccionat
-
- Cancel
+
+ Tancar
-
- None
+
+ Close
-
- Acceptar
+
+ Giswater
-
+
None
-
- Tipus d'element:
-
-
-
- None
-
-
-
- Crear
+
+ Copiar
-
- None
+
+ Copiar l'esquema de base de dades seleccionat
-
- Gestionar clase de visita
+
+ Restriccions
-
+
None
-
- Event múltiple:
+
+ Nom del formulari
-
+
None
+
+
+ admin_visitclass
-
- Opcions paràmetre:
+
+ Tipus d'element:
-
+
None
-
- Element múltiples:
+
+ Gestionar clase de visita
-
+
None
@@ -3818,19 +3746,19 @@
None
-
- Cancelar
+
+ Actiu:
-
- Cancelar
+
+ None
-
- Actualitzar
+
+ Id clase:
-
+
None
@@ -3842,11 +3770,19 @@
None
-
- Esborrar
+
+ Event múltiple:
-
+
+ None
+
+
+
+ Opcions paràmetre:
+
+
+
None
@@ -3858,16 +3794,21 @@
None
-
- Actiu:
+
+ Element múltiples:
-
+
+ None
+
+
+
+ Tipus visita:
+
+
+
None
-
-
- admin_visitparam
Cancelar
@@ -3877,51 +3818,62 @@
Cancelar
-
- Tipus paràmetre:
+
+ Cancel
-
+
None
-
- Tipus dada:
+
+ Acceptar
-
+
None
-
- Tipus formulari:
+
+ Crear
-
+
None
-
- Valor per defecte:
+
+ Acceptar
-
+
None
-
- Nom paràmetre:
+
+ Esborrar
-
+
None
-
- Descripció:
+
+ Actualitzar
-
+
+ None
+
+
+
+ admin_visitparam
+
+
+ Tipus formulari:
+
+
+
None
@@ -3933,19 +3885,19 @@
None
-
- Paràmetres
+
+ Nom paràmetre:
-
+
None
-
- Editable:
+
+ Habilitat:
-
+
None
@@ -3957,27 +3909,35 @@
None
-
- Habilitat:
+
+ Cancelar
-
+
+ Cancelar
+
+
+
+ Editable:
+
+
+
None
-
- Tipus de widget:
+
+ Descripció:
-
+
None
-
- Acceptar
+
+ Valor per defecte:
-
+
None
@@ -3988,6 +3948,22 @@
None
+
+
+ Tipus dada:
+
+
+
+ None
+
+
+
+ Paràmetres
+
+
+
+ None
+
Text de consulta:
@@ -3996,6 +3972,22 @@
None
+
+
+ Tipus paràmetre:
+
+
+
+ None
+
+
+
+ Tipus de widget:
+
+
+
+ None
+
Gestionar paràmetre de visita
@@ -4004,6 +3996,14 @@
None
+
+
+ Acceptar
+
+
+
+ None
+
arc_fusion
@@ -4011,14 +4011,6 @@
Fusionar arc
-
-
- Cancelar
-
-
-
- Cancelar
-
Data de finalització:
@@ -4036,13 +4028,21 @@
None
-
- Expedient baixa:
+
+ Info log
-
+
None
+
+
+ Cancelar
+
+
+
+ Cancelar
+
Acceptar
@@ -4052,11 +4052,11 @@
Acceptar
-
- Info log
+
+ Expedient baixa:
-
+
None
@@ -4075,108 +4075,108 @@
Assignació de fugues
-
+
Fugues
-
+
None
-
- Longitud del cluster (m):
+
+ Distància màxima (m):
-
- Suma màxima de longituds de tuberia dintre d'un cluster, en metres.
+
+ Distància màxima, e metres, entre la tuberia inicial i altres tuberies incluides en el cluster.
-
- Canonades
+
+ Rang de diàmetre:
-
- None
+
+ Rang de diàmetres basats en factors de la tuberia inicial.
-
- Rang de diàmetre:
+
+ Filt6rar per diàmetre:
-
- Rang de diàmetres basats en factors de la tuberia inicial.
+
+ Utilitza només tuberies amb el rang de diàmetres de l'inicial.
-
- Utilitzar totes les fugues
+
+ Longitud del cluster (m):
-
- Calcula les fugues per kilòmetre i any utilitzant totes les dades disponibles, independentment del paramatre 'anys a calcular'.
+
+ Suma màxima de longituds de tuberia dintre d'un cluster, en metres.
-
- Info log
+
+ Filtrar per data d'instalació:
-
- None
+
+ Utilitza només les tuberies que coincidexen amb l'interval de dates d'instalació de la inicial.
-
- Assignació de fugues
+
+ Distància de buffer (m):
-
- None
+
+ Distance from a leak at which pipes are selected to be assigned that leak.
-
- Filtrar per material:
+
+ Anys a calcular
-
- Utilitza només tuberies del mateix material que la inicial.
+
+ Nombre d'anys de dades de fugues a tenir en compte, en funció de l'antiguitat.
-
- Distància màxima (m):
+
+ Utilitzar totes les fugues
-
- Distància màxima, e metres, entre la tuberia inicial i altres tuberies incluides en el cluster.
+
+ Calcula les fugues per kilòmetre i any utilitzant totes les dades disponibles, independentment del paramatre 'anys a calcular'.
-
- Filtrar per data d'instalació:
+
+ Rang de data de construcció (anys):
-
- Utilitza només les tuberies que coincidexen amb l'interval de dates d'instalació de la inicial.
+
+ Interval de dates de construcció, en anys anteriors i posteriors a la tuberia inicial
-
- Anys a calcular
+
+ Canonades
-
- Nombre d'anys de dades de fugues a tenir en compte, en funció de l'antiguitat.
+
+ None
-
- Distància de buffer (m):
+
+ Fugues
-
- Distance from a leak at which pipes are selected to be assigned that leak.
+
+ None
-
- Rang de data de construcció (anys):
+
+ Assignació de fugues
-
- Interval de dates de construcció, en anys anteriors i posteriors a la tuberia inicial
+
+ None
@@ -4187,20 +4187,20 @@
None
-
- Fugues
+
+ Filtrar per material:
-
- None
+
+ Utilitza només tuberies del mateix material que la inicial.
-
- Filt6rar per diàmetre:
+
+ Info log
-
- Utilitza només tuberies amb el rang de diàmetres de l'inicial.
+
+ None
@@ -4210,12 +4210,12 @@
Dibuixar cercle CAD
-
- Eliminar cercles anteriors
+
+ Acceptar
-
- None
+
+ Acceptar
@@ -4226,27 +4226,27 @@
Cancelar
-
- Inserir radi:
+
+ Dibuixar cercle CAD
-
+
None
-
- Acceptar
+
+ Eliminar cercles anteriors
-
- Acceptar
+
+ None
-
- Dibuixar cercle CAD
+
+ Inserir radi:
-
+
None
@@ -4257,35 +4257,27 @@
Afegir punt CAD
-
- Afegir punt CAD
-
-
-
- None
-
-
-
- Punt final
+
+ Distància Y:
-
+
None
-
- Eliminar punts anteriors
+
+ Acceptar
-
- None
+
+ Acceptar
-
- Distància Y:
+
+ Punt final
-
+
None
@@ -4296,6 +4288,14 @@
Cancelar
+
+
+ Eliminar punts anteriors
+
+
+
+ None
+
Punt inicial
@@ -4313,12 +4313,12 @@
None
-
- Acceptar
+
+ Afegir punt CAD
-
- Acceptar
+
+ None
@@ -4328,20 +4328,20 @@
Configuració
-
- Cancelar
+
+ Feature cat
-
- Cancelar
+
+ None
-
- Acceptar
+
+ Camps adicionals
-
- Acceptar
+
+ None
@@ -4351,6 +4351,14 @@
None
+
+
+ Cancelar
+
+
+
+ Cancelar
+
Configuració
@@ -4360,113 +4368,132 @@
None
-
- Bàsic
+
+ Man type
-
+
None
-
- Camps adicionals
+
+ Bàsic
-
+
None
-
- Feature cat
+
+ Acceptar
-
- None
+
+ Acceptar
+
+
+ create_style_group
-
- Man type
+
+
-
- None
+
+ Nom de la categoria
-
-
- crm_trace
-
- Instruccions:
+
+ ID de categoria:
-
- None
+
+
-
-
- csv
-
- ...
+
+
-
- None
+
+ ID de categoria
-
- Arxiu:
+
+
-
- None
+
+ Descripció
-
- Delimitador:
+
+ Nom de la categoria:
-
- None
+
+
-
+
Acceptar
-
+
Acceptar
-
- Conjunt de caràcters
+
+ Descripció:
-
- None
+
+
-
- Importar tipus:
+
+ Rol:
-
- None
+
+
-
- Importar etiqueta
+
+ Cancel·lar
-
+
+ Cancel·lar
+
+
+
+
+
+
+
+ Rol que podrà utilitzar aquest estil
+
+
+
+ crm_trace
+
+
+ Instruccions:
+
+
+
None
+
+
+ csv
-
- Previsualitzar
+
+ Ignorar capçaleres:
-
+
None
@@ -4486,19 +4513,35 @@
None
-
- Ignorar capçaleres:
+
+ ...
-
+
None
-
- Importar CSV
+
+ Delimitador:
-
+
+ None
+
+
+
+ Importar tipus:
+
+
+
+ None
+
+
+
+ Importar etiqueta
+
+
+
None
@@ -4509,6 +4552,46 @@
Cancelar
+
+
+ Previsualitzar
+
+
+
+ None
+
+
+
+ Arxiu:
+
+
+
+ None
+
+
+
+ Acceptar
+
+
+
+ Acceptar
+
+
+
+ Conjunt de caràcters
+
+
+
+ None
+
+
+
+ Importar CSV
+
+
+
+ None
+
dialog_table
@@ -4525,12 +4608,12 @@
None
-
- Cancelar
+
+ Acceptar
-
- Cancelar
+
+ Acceptar
@@ -4541,12 +4624,12 @@
None
-
- Acceptar
+
+ Cancelar
-
- Acceptar
+
+ Cancelar
@@ -4572,19 +4655,19 @@
Cancelar
-
- Tancar
+
+ Diàleg
-
+
None
-
- Diàleg
+
+ Tancar
-
+
None
@@ -4603,20 +4686,20 @@
None
-
- Cancelar
+
+ Acceptar
-
- Cancelar
+
+ Acceptar
-
- Altres
+
+ Cancelar
-
- Altres
+
+ Cancelar
@@ -4627,20 +4710,20 @@
Simbologia del cercle
-
- Amidaments
+
+ Altres
-
- Amidaments
+
+ Altres
-
- Acceptar
+
+ Amidaments
-
- Acceptar
+
+ Amidaments
@@ -4650,12 +4733,20 @@
Document
-
- Escomesa
+
+ ...
-
- Escomesa
+
+ Ruta
+
+
+
+ Reixa
+
+
+
+ None
@@ -4665,6 +4756,22 @@
None
+
+
+ Acceptar
+
+
+
+ Acceptar
+
+
+
+ Ruta
+
+
+
+ Completar amb alguna ruta de carpeta accesible o ruta web.
+
Document
@@ -4674,20 +4781,20 @@
None
-
- Acceptar
+
+ Cancelar
-
- Acceptar
+
+ Cancelar
-
+
None
-
- Eliminar
+
+ Seleccionar objecte
@@ -4698,52 +4805,52 @@
Tipus document
-
- Id doc:
+
+ Arc
-
- Id document
+
+ Arc
-
- Reixa
+
+ None
-
- None
+
+ Insertar
-
- Observacions:
+
+ Enllaç
-
- None
+
+ Link
-
- Document
+
+ Nom doc:
-
- None
+
+ Nom document
-
- Document
+
+ Nom doc:
-
- None
+
+ Nom document
-
- None
+
+ Document
-
- Insertar
+
+ None
@@ -4754,36 +4861,28 @@
Obri l'explorador per permetre la seecció de la ruta web. També és possible simplement enganzar la ruta en e quadrat d'enllaç de text
-
- Enllaç
-
-
-
- Link
+
+ None
-
- Ruta
+
+ Eliminar
-
- Completar amb alguna ruta de carpeta accesible o ruta web.
+
+ Observacions:
-
+
None
-
- Seleccionar objecte
-
-
-
- Arc
+
+ Escomesa
-
- Arc
+
+ Escomesa
@@ -4794,20 +4893,12 @@
None
-
- ...
-
-
-
- Ruta
-
-
-
- Cancelar
+
+ Document
-
- Cancelar
+
+ None
@@ -4817,48 +4908,40 @@
Gestor de documents
-
- Cancelar
+
+ Esborrar
-
- Cancelar
+
+ Eliminar
-
- Gestor de documents
+
+ Filtrar per: Nom doc
-
+
None
-
- Filtrar per: Id doc
+
+ Cancelar
-
- None
+
+ Cancelar
-
- Esborrar
+
+ Gestor de documents
-
- Eliminar
+
+ None
dscenario_manager
-
-
- Crear
-
-
-
- None
-
Esborrar
@@ -4868,19 +4951,11 @@
None
-
- Actualitzar
-
-
-
- None
-
-
-
- Duplicar
+
+ Crear
-
+
None
@@ -4892,100 +4967,44 @@
Mostrar inactius
-
- Toolbox
-
-
-
- None
-
-
-
- Filtrat per: Nom dscenari
-
-
-
- None
-
-
-
- element
-
-
- Element
-
-
-
- Data construcció:
-
-
-
- Data alta
-
-
-
- Expedient alta:
-
-
-
- Expedient alta:
-
-
-
- Id element catàleg:
-
-
-
- Catàleg
-
-
-
- Afegir geometria
-
-
-
- Add geometry
-
-
-
- Cancelar
-
-
-
- Cancelar
-
-
-
- Acceptar
+
+ Duplicar
-
- Acceptar
+
+ None
-
- Element
+
+ Actualitzar
-
+
None
-
- Id element:
+
+ Toolbox
-
+
None
-
- Verificat:
+
+ Filtrat per: Nom dscenari
-
+
None
+
+
+ element
+
+
+ Element
+
Reixa
@@ -5003,37 +5022,61 @@
Tipus estat
-
- Nombre d'element:
+
+ Estat:
-
+
None
-
- Element
+
+ Codi:
-
- None
+
+ Codi
-
+
+ Fabricant:
+
+
+
None
-
- Eliminar
+
+ Data construcció:
-
- Estat:
+
+ Data alta
-
+
+ Tipus element:
+
+
+
+ Tipus element
+
+
+
None
+
+
+ Seleccionar objecte
+
+
+
+ Enllaç
+
+
+
+ Link
+
Observacions:
@@ -5043,12 +5086,20 @@
None
-
- Codi:
+
+ Explotació:
-
- Codi
+
+ None
+
+
+
+ None
+
+
+
+ Insertar
@@ -5058,6 +5109,30 @@
Arc
+
+
+ Tipus ubicació:
+
+
+
+ Ubicació
+
+
+
+ Element
+
+
+
+ None
+
+
+
+ Acceptar
+
+
+
+ Acceptar
+
Propietari:
@@ -5067,20 +5142,20 @@
None
-
- Explotació:
+
+ Rotació:
-
+
None
-
- Comentari:
+
+ Cancelar
-
- None
+
+ Cancelar
@@ -5091,68 +5166,68 @@
Relations
-
- Enllaç
+
+ Element
-
- Link
+
+ None
-
- Tipus ubicació:
+
+ Expedient baixa:
-
- Ubicació
+
+ Workcat id end
-
- Tipus element:
+
+ Nombre d'element:
-
- Tipus element
+
+ None
-
- Fabricant:
+
+ Escomesa
-
- None
+
+ Escomesa
-
+
None
-
- Seleccionar objecte
+
+ Eliminar
-
- None
+
+ Verificat:
-
- Insertar
+
+ None
-
- Expedient baixa:
+
+ Expedient alta:
-
- Workcat id end
+
+ Expedient alta:
-
- Rotació:
+
+ Afegir geometria
-
- None
+
+ Add geometry
@@ -5163,28 +5238,36 @@
None
-
- Escomesa
+
+ Comentari:
-
- Escomesa
+
+ None
-
-
- element_manager
-
- Gestor d'elements
+
+ Id element catàleg:
-
- Gestor d'elements
+
+ Catàleg
-
+
+ Id element:
+
+
+
None
+
+
+ element_manager
+
+
+ Gestor d'elements
+
Esborrar
@@ -5201,6 +5284,14 @@
Cancelar
+
+
+ Gestor d'elements
+
+
+
+ None
+
Filtrar per: Id element
@@ -5213,21 +5304,13 @@
epa_compare
-
- Selector de data:
+
+ Hora (per mostrar):
-
+
None
-
-
- Cancelar
-
-
-
- Cancelar
-
Acceptar
@@ -5237,35 +5320,43 @@
Acceptar
-
- Comparar data:
+
+ Selector de data:
+
+
+
+ None
+
+
+
+ Hora (per comprar):
-
+
None
-
- Comparar hora:
+
+ Cancelar
-
- None
+
+ Cancelar
-
- Hora (per comprar):
+
+ Selector
-
+
None
-
- Hora del selector:
+
+ Comparar data:
-
+
None
@@ -5277,11 +5368,11 @@
None
-
- Selector
+
+ Comparar hora:
-
+
None
@@ -5293,27 +5384,27 @@
None
-
- Hora:
+
+ Resultat
-
+
None
-
- Hora (per mostrar):
+
+ Hora:
-
+
None
-
- Resultat
+
+ Hora del selector:
-
+
None
@@ -5340,12 +5431,12 @@
None
-
- Vista prèvia
+
+ Tancar
-
- None
+
+ Tancar
@@ -5356,12 +5447,12 @@
None
-
- Tancar
+
+ Imprimir
-
- Tancar
+
+ None
@@ -5372,11 +5463,11 @@
None
-
- Imprimir
+
+ Vista prèvia
-
+
None
@@ -5395,76 +5486,76 @@
Eliminar
-
- Info log
+
+ Esborrar element
-
+
None
-
- Mostrar relacions de l'element
+
+ Tipus d'element:
-
+
None
-
- Esborrar element
+
+ Id element:
-
+
None
-
- Esborrar element
+
+ Info log
-
+
None
-
- Tipus d'element:
+
+ Mostrar relacions de l'element
-
+
None
-
- Cancelar
-
-
-
- Cancelar
+
+ Eliminar un altre element
-
+
None
-
- Seleccionar objecte
+
+ Esborrar element
-
- Eliminar un altre element
+
+ None
-
+
None
-
- Id element:
+
+ Seleccionar objecte
-
- None
+
+ Cancelar
+
+
+
+ Cancelar
@@ -5474,19 +5565,19 @@
Donar de baixa
-
- Escomesa
+
+ Expedient baixa:
-
+
None
-
- Expedient
+
+ Reixa
-
+
None
@@ -5498,12 +5589,12 @@
None
-
- Reixa
+
+ Cancelar
-
- None
+
+ Cancelar
@@ -5514,53 +5605,45 @@
None
-
- None
+
+ Donar de baixa
-
- Eliminar
+
+ None
-
- Data epdte
+
+ Expedient
-
+
None
-
- Node
+
+ Tipus estat final:
-
+
None
-
- Arc
-
-
-
+
None
-
- Expedient baixa:
+
+ Insertar
-
+
None
-
+
None
-
-
- Seleccionar objecte
-
Element
@@ -5569,14 +5652,6 @@
None
-
-
- None
-
-
-
- Insertar
-
Relacions
@@ -5586,51 +5661,75 @@
Relations
-
- Tipus estat final:
+
+ None
-
+
+ Seleccionar objecte
+
+
+
+ Escomesa
+
+
+
None
-
- Cancelar
+
+ Acceptar
-
- Cancelar
+
+ Acceptar
-
+
+ Arc
+
+
+
None
-
+
+ Data epdte
+
+
+
None
-
- Donar de baixa
+
+ Node
-
+
None
-
- Acceptar
+
+ None
-
- Acceptar
+
+ Eliminar
feature_end_connec
-
- Elements desconectats del tram
+
+ Elements desconectats del tram
+
+
+
+ Llista d'elements que quedarien desconectats quan els trams seleccionats siguin donats de baixa:
+
+
+
+ None
@@ -5664,14 +5763,6 @@
Acceptar
-
-
- Llista d'elements que quedarien desconectats quan els trams seleccionats siguin donats de baixa:
-
-
-
- None
-
go2epa
@@ -5680,68 +5771,68 @@
Anar a EPA
-
- Nom resultat:
+
+ Selector
-
+
None
-
- utilitzar trucades iteratives
+
+ Info log
-
+
None
-
- lbl_counter
+
+ Utilitzar la geometria de red resultant
-
+
None
-
- Gestor d'arxius
+
+ Cancelar
-
- None
+
+ Cancelar
-
- Acceptar
+
+ Arxiu INP
-
- Acceptar
+
+ None
-
- Opcions de procés
+
+ ...
-
+
None
-
- Selector
+
+ ...
-
+
None
-
- Cancelar
+
+ Acceptar
-
- Cancelar
+
+ Acceptar
@@ -5752,83 +5843,83 @@
None
-
- Importar resultat
+
+ Nom resultat:
-
+
None
-
- Utilitzar la geometria de red resultant
+
+ lbl_counter
-
+
None
-
- Executar software EPA
+
+ Arxiu RPT:
-
+
None
-
- Exportar software INP
+
+ utilitzar trucades iteratives
-
+
None
-
- Info log
+
+ Anar a EPA
-
+
None
-
- Arxiu RPT:
+
+ Importar resultat
-
+
None
-
- Arxiu INP
+
+ Executar software EPA
-
+
None
-
- ...
+
+ Exportar software INP
-
+
None
-
- Anar a EPA
+
+ Opcions de procés
-
+
None
-
- ...
+
+ Gestor d'arxius
-
+
None
@@ -5846,14 +5937,6 @@
Gestor de resultats Epa
-
-
- Alternar corporatiu
-
-
-
- None
-
Tancar
@@ -5862,6 +5945,14 @@
Tancar
+
+
+ Alternar corporatiu
+
+
+
+ None
+
Filtrar per: Id resultat:
@@ -5894,11 +5985,11 @@
Go2Epa - opccions
-
- Altres
+
+ Go2Epa - opccions
-
+
None
@@ -5909,6 +6000,14 @@
None
+
+
+ Acceptar
+
+
+
+ Acceptar
+
Cancelar
@@ -5918,21 +6017,13 @@
Cancelar
-
- Go2Epa - opccions
+
+ Altres
-
+
None
-
-
- Acceptar
-
-
-
- Acceptar
-
info_catalog
@@ -5972,11 +6063,19 @@
Abonat
-
- Id hidròmetre:
+
+ Acceptar
-
+
+ Acceptar
+
+
+
+ Abonat
+
+
+
None
@@ -5988,21 +6087,13 @@
Tancar
-
- Abonat
+
+ Id hidròmetre:
-
+
None
-
-
- Acceptar
-
-
-
- Acceptar
-
info_crossect
@@ -6011,107 +6102,107 @@
Secció
-
- lbl_cost_b_right
+
+ lbl_cost_area
-
+
None
-
- lbl_cost_exc
+
+ lbl_section_image
-
+
None
-
- lbl_cost_bulk
+
+ lbl_cost_fill
-
+
None
-
- lbl_cost_y_param
+
+ lbl_cost_bulk
-
+
None
-
- lbl_section_image
+
+ lbl_cost_exc
-
+
None
-
- Tancar
+
+ Secció
-
- Close
+
+ None
-
- Secció
+
+ lbl_cost_trench
-
+
None
-
- lbl_cost_excav
+
+ lbl_cost_b_left
-
+
None
-
- lbl_cost_area
+
+ lbl_cost_width
-
+
None
-
- lbl_cost_fill
+
+ lbl_cost_excav
-
+
None
-
- lbl_cost_width
+
+ Tancar
-
- None
+
+ Close
-
- lbl_cost_b_left
+
+ lbl_cost_b_right
-
+
None
-
- lbl_cost_trench
+
+ lbl_cost_y_param
-
+
None
@@ -6121,6 +6212,14 @@
Informació característica
+
+
+ Relacions
+
+
+
+ Relations
+
None
@@ -6130,19 +6229,19 @@
None
-
- Fins:
+
+ None
-
+
None
-
- Desde:
+
+ None
-
+
None
@@ -6154,43 +6253,43 @@
None
-
- None
+
+ Fins:
-
- Insertar
+
+ None
-
- OM
+
+ Tipus paràmetre:
-
+
None
-
- Cancelar
-
-
-
- Cancelar
+
+ Paràmetre:
-
+
None
-
- Esborrar document
+
+ Desde:
-
+
None
-
+
+ Tipus:
+
+
+
None
@@ -6202,92 +6301,84 @@
None
-
- Documents
+
+ OM
-
+
None
-
+
None
-
- Eliminar
-
-
-
- Acceptar
+
+ Crear nou document
-
- Acceptar
+
+ Filtre període:
-
- Conexions
+
+ None
-
+
None
-
- Element aigües amunt:
+
+ Obrir document
-
- None
+
+ Element aigües avall:
-
- Id doc:
+
+ None
-
+
None
-
- Plan
+
+ Insertar
-
+
None
-
- Element aigües avall:
-
-
-
- None
+
+ Esborrar document
-
- Dades
+
+ Abonats
-
+
None
-
- Relacions
+
+ Lectures abonats
-
- Relations
+
+ None
-
- Filtre període:
+
+ Acceptar
-
- None
+
+ Acceptar
@@ -6298,67 +6389,67 @@
Insertar document
-
- None
+
+ Dades
-
- Crear nou document
+
+ None
-
- Tipus:
+
+ Plan
-
+
None
-
- Desde:
+
+ Cancelar
-
- None
+
+ Cancelar
-
- Paràmetre:
+
+ None
-
+
None
-
- Tipus paràmetre:
+
+ Documents
-
+
None
-
- Fins:
+
+ None
-
+
None
-
- None
+
+ Id doc:
-
+
None
-
- None
+
+ Informació característica
-
+
None
@@ -6370,43 +6461,51 @@
None
-
- None
+
+ Element aigües amunt:
-
- Obrir document
+
+ None
-
- Abonats
+
+ Aplicar
-
- None
+
+ Aplicar
-
- Lectures abonats
+
+ Desde:
-
+
None
-
+
None
-
+
+ Eliminar
+
+
+
+ Fins:
+
+
+
None
-
+
None
-
+
None
@@ -6418,11 +6517,11 @@
None
-
- Informació característica
+
+ Conexions
-
+
None
@@ -6433,12 +6532,12 @@
Informació bàsica
-
- Informació bàsica
+
+ Tancar
-
- None
+
+ Tancar
@@ -6449,12 +6548,12 @@
Acceptar
-
- Tancar
+
+ Informació bàsica
-
- Tancar
+
+ None
@@ -6464,19 +6563,19 @@
Nou expedt
-
- Enllaç
+
+ Nou expedt
-
- Link
+
+ None
-
- Work id key 2:
+
+ Work id key 1:
-
+
None
@@ -6488,44 +6587,44 @@
Acceptar
-
- Descripció:
+
+ Enllaç
-
- None
+
+ Link
-
- Cancelar
+
+ Work id key 2:
-
- Cancelar
+
+ None
-
- Work id key 1:
+
+ Data construcció:
-
+
None
-
- Nou expedt
+
+ Descripció:
-
+
None
-
- Data construcció:
+
+ Cancelar
-
- None
+
+ Cancelar
@@ -6554,147 +6653,147 @@
mapzone_manager
-
- Mostrar inactius
-
-
-
- Mostrar inactius
+
+ Alternar actiu
-
-
- mincut
-
- Polígon de tall
+
+ Alternar actiu
-
- Clor:
+
+ Actualitzar
-
- None
+
+ Actualitzar
-
- Localització
+
+ Filtrar per: Nom de mapzone
-
- None
+
+ Filtrar per: Nom de mapzone
- Cancelar
+ Cancel·lar
- Cancelar
+ Cancel·lar
-
- Causa:
+
+ Eliminar
-
- None
+
+ Eliminar
-
- Distància des de la parcel·la:
+
+ Mostra totes les mapzones
-
- None
+
+ Mostra totes les mapzones
-
- Estat:
+
+
-
- None
+
+ Executar el procés d'anàlisi de mapzone
-
- Desde:
+
+ Crear
-
- None
+
+ Crear
-
- Sense resultats
+
+ Configurar
-
- None
+
+ Configurar
-
- Fins:
+
+ Mostrar inactius
-
- None
+
+ Mostrar inactius
+
+
+
+ mincut
+
+
+ Polígon de tall
-
- Descripció:
+
+ Distància des de la parcel·la:
-
+
None
-
- Acceptar
+
+ Final
-
- Acceptar
+
+ None
-
- Terbolesa:
+
+ Localització
-
+
None
-
- Id:
+
+ Tipus:
-
+
None
-
- Descripció:
+
+ Inici
-
+
None
-
- Work order:
+
+ Id:
-
+
None
-
- Utilitzar xarxa planificada
+
+ Acceptar
-
- None
+
+ Acceptar
@@ -6720,6 +6819,38 @@
None
+
+
+ Usuari executiu:
+
+
+
+ None
+
+
+
+ Utilitzar xarxa planificada
+
+
+
+ None
+
+
+
+ Descripció:
+
+
+
+ None
+
+
+
+ Fins:
+
+
+
+ None
+
Dates previstes
@@ -6729,11 +6860,43 @@
None
-
- Detalls
+
+ Desde:
-
+
+ None
+
+
+
+ Estat:
+
+
+
+ None
+
+
+
+ Sense resultats
+
+
+
+ None
+
+
+
+ Work order:
+
+
+
+ None
+
+
+
+ Clor:
+
+
+
None
@@ -6741,32 +6904,40 @@
Dates reals
-
+
+ None
+
+
+
+ Causa:
+
+
+
None
-
- Inici
+
+ Detalls
-
+
None
-
- Usuari executiu:
+
+ Descripció:
-
+
None
-
- Tipus:
+
+ Cancelar
-
- None
+
+ Cancelar
@@ -6801,11 +6972,11 @@
None
-
- Final
+
+ Terbolesa:
-
+
None
@@ -6816,20 +6987,28 @@
Compositor polígon de tall
-
- Model:
+
+ Obrir
-
+
None
-
- Cancelar
+
+ Compositor polígon de tall
-
- Cancelar
+
+ None
+
+
+
+ Model:
+
+
+
+ None
@@ -6848,20 +7027,12 @@
None
-
- Compositor polígon de tall
-
-
-
- None
-
-
-
- Obrir
+
+ Cancelar
-
- None
+
+ Cancelar
@@ -6878,22 +7049,6 @@
None
-
-
- Acceptar
-
-
-
- Acceptar
-
-
-
- None
-
-
-
- Insertar
-
@@ -6910,6 +7065,22 @@
None
+
+
+ None
+
+
+
+ Insertar
+
+
+
+ Acceptar
+
+
+
+ Acceptar
+
@@ -6926,21 +7097,37 @@
Finalitzar polígon de tall
-
- Executat per:
+
+ Acceptar
-
+
+ Acceptar
+
+
+
+ Fins:
+
+
+
None
-
- Número:
+
+ Cerrar mincut
-
+
None
+
+
+ Cancelar
+
+
+
+ Cancelar
+
Finalitzar polígon de tall
@@ -6950,11 +7137,11 @@
None
-
- Fins:
+
+ Work order:
-
+
None
@@ -6965,14 +7152,6 @@
None
-
-
- Establir ubicació real
-
-
-
- None
-
Hora d'inici
@@ -6982,19 +7161,19 @@
None
-
- Cancelar
+
+ Número:
-
- Cancelar
+
+ None
-
- Cerrar mincut
+
+ Municipi:
-
+
None
@@ -7006,43 +7185,35 @@
None
-
- Municipi:
+
+ Hora de finalització:
-
+
None
-
- Id:
+
+ Executat per:
-
+
None
-
- Acceptar
-
-
-
- Acceptar
-
-
-
- Hora de finalització:
+
+ Id:
-
+
None
-
- Work order:
+
+ Establir ubicació real
-
+
None
@@ -7053,43 +7224,35 @@
Hidròmetre polígon de tall
-
- Codi client hidròmetre:
-
-
-
- None
+
+ Acceptar
-
- Conectar codi client:
+
+ Acceptar
-
- None
+
+ Hidròmetre polígon de tall
-
+
None
-
- Insertar
-
-
-
- Acceptar
+
+ Conectar codi client:
-
- Acceptar
+
+ None
-
- Hidròmetre polígon de tall
+
+ Codi client hidròmetre:
-
+
None
@@ -7100,6 +7263,14 @@
Eliminar
+
+
+ None
+
+
+
+ Insertar
+
mincut_manager
@@ -7108,35 +7279,35 @@
Gestió polígon de tall
-
- Pròxims dies
+
+ None
-
+
None
-
- Explotació:
+
+ Tancar
-
- None
+
+
-
- Gestió polígon de tall
+
+ Esborrar
-
- None
+
+ Eliminar
-
- Tipus:
+
+ Filtrar per:
-
+
None
@@ -7148,27 +7319,19 @@
None
-
- Carrer:
+
+ Desde:
-
+
None
-
- Esborrar
-
-
-
- Eliminar
-
-
-
- Desde:
+
+ Explotació:
-
+
None
@@ -7180,27 +7343,27 @@
None
-
- Filtrar per:
+
+ Pròxims dies
-
+
None
-
- Tancar
+
+ Enviar SMS
-
-
+
+ None
-
- None
+
+ Tipus:
-
+
None
@@ -7220,47 +7383,47 @@
None
-
- Enviar SMS
+
+ Gestió polígon de tall
-
+
None
-
-
- netscenario_manager
-
-
+
+ Carrer:
-
- Current netscenario
+
+ None
+
+
+ netscenario_manager
-
- Mostrar inactius
+
+ Crear
-
- Mostrar inactius
+
+ Crear
-
- Duplicar
+
+
-
- Duplicar
+
+ Filter by: Netscenario name
-
- Tancar
+
+ Actualitzar
-
- Tancar
+
+ Actualitzar
@@ -7271,36 +7434,36 @@
Esborrar
-
- Actualitzar
+
+ Tancar
-
- Actualitzar
+
+ Tancar
-
+
-
- Filter by: Netscenario name
+
+ Carregar capes Giswater
-
- Crear
+
+
-
- Crear
+
+ Current netscenario
-
-
+
+ Duplicar
-
- Execute mapzones analysis
+
+ Duplicar
@@ -7311,12 +7474,20 @@
Toggle active
-
+
-
- Carregar capes Giswater
+
+ Execute mapzones analysis
+
+
+
+ Mostrar inactius
+
+
+
+ Mostrar inactius
@@ -7342,11 +7513,11 @@
Acceptar
-
- Canviar tipus node
+
+ Tipus node actual:
-
+
None
@@ -7358,19 +7529,19 @@
None
-
- Tipus node actual:
+
+ Id catàleg
-
+
None
-
- Id catàleg
+
+ Canviar tipus node
-
+
None
@@ -7388,332 +7559,332 @@
plan_psector
-
- Text 2:
+
+ Prioritat:
-
+
-
- Tipus:
+
+ None
-
-
+
+ Seleccionar elements
-
- Expedient:
+
+ None
-
-
+
+ Establir arc_id (només ARC exit_type)
-
- Esborrar
+
+ VAT:
-
+
-
- VAT:
+
+ Despeses generals
-
+
-
- Total nodes:
+
+ Generar informe
-
+
-
- Total trams:
+
+ Seleccionar
-
+
-
- Text 3:
+
+ Seleccionar
-
+
-
+
None
-
- Establir arc_id (només ARC exit_type)
+
+ Reemplaçar en servei per arcs planificats
-
- Escala:
+
+ Altres despeses
-
+
-
- Estat:
+
+ Número valor:
-
+
-
- Rotació:
+
+ Text 6:
-
+
-
- Text 1:
+
+ Text 5:
-
+
-
- Id relacionat:
+
+ Text 4:
-
+
-
- None
+
+ Text 3:
-
- Insertar
+
+
-
- Cancelar
+
+ None
-
-
+
+ Fusionar arcs planificats
-
-
- Explotació:
+
+
+ Escala:
-
+
-
- Aceptar
+
+ Rotació:
-
+
-
- Observacions:
+
+ Esborrar
-
+
-
- Descripció:
+
+ Cancelar
-
+
-
- Actiu
+
+ Aceptar
-
+
-
- Nom:
+
+ Rotació:
-
+
-
- Habilitar tot (visualitzar estat obsolet en elements relacionats amb psector)
+
+ Id relacionat:
-
+
-
- Detalls de mapa
+
+ Observacions:
-
+
-
- Generar informe
+
+ Nom:
-
+
-
- Seleccionar
+
+ Codi extern:
-
+
-
- Seleccionar
+
+ Expedient:
-
+
-
- Rotació:
+
+ Tipus:
-
+
-
- None
+
+ Text 2:
-
- Reemplaçar en servei per arcs planificats
+
+
-
- None
+
+ Text 1:
-
- Esborrar
+
+
-
- Codi extern:
+
+ Estat:
-
+
-
- Altres despeses
+
+ Psector id:
-
+
-
+
None
-
- Fusionar arcs planificats
+
+ Insertar
-
- Despeses generals
+
+ Detalls de mapa
-
+
-
- Prioritat:
+
+ Habilitar tot (visualitzar estat obsolet en elements relacionats amb psector)
-
+
-
- None
+
+ Actiu
-
- Seleccionar elements
+
+
-
- Psector id:
+
+ Descripció:
-
+
-
- Número valor:
+
+ Explotació:
-
+
-
- Text 6:
+
+ Total nodes:
-
+
-
- Text 5:
+
+ Total trams:
-
+
-
- Text 4:
+
+ None
-
-
+
+ Esborrar
@@ -7723,12 +7894,12 @@
Gestior resultats preus
-
- Cancelar
+
+ Filtrar per:
-
- Cancelar
+
+ None
@@ -7739,27 +7910,27 @@
Eliminar
-
- Gestior resultats preus
+
+ Resultat actual
-
+
None
-
- Resultat actual
+
+ Cancelar
-
- None
+
+ Cancelar
-
- Filtrar per:
+
+ Gestior resultats preus
-
+
None
@@ -7770,59 +7941,27 @@
Càlcul de prioritat
-
- Càlcul de prioritat
-
-
-
- None
-
-
-
- Motor de càlcul
-
-
-
- None
-
-
-
- Info log
-
-
-
- None
-
-
-
- Nom del resultat:
-
-
-
- None
-
-
-
- Paràmetres de càlcul
+
+ Explotació:
-
+
None
-
- Càlcul
+
+ Material
-
+
None
-
- Material
+
+ Catàleg
-
+
None
@@ -7842,51 +7981,51 @@
None
-
- None
+
+ Info log
-
- Seleccioni els elements en la vista del mapa
+
+ None
-
- Material:
+
+ None
-
- None
+
+ Seleccioni els elements en la vista del mapa
-
- Explotació:
+
+ Calcular
-
+
None
-
- Descripció:
+
+ Nom del resultat:
-
+
None
-
- Calcular
+
+ Zona de pressió:
-
+
None
-
- Horizon year:
+
+ Motor de càlcul
-
+
None
@@ -7898,11 +8037,11 @@
None
-
- Zona de pressió:
+
+ Descripció:
-
+
None
@@ -7922,50 +8061,66 @@
-
- Catàleg
+
+ Càlcul de prioritat
-
+
None
-
-
- priority_manager
-
- Gestor de resultats
+
+ Horizon year:
-
- Informació:
+
+ None
-
+
+ Paràmetres de càlcul
+
+
+
None
-
- Estat:
+
+ Càlcul
-
+
None
-
+
+ Material:
+
+
+
+ None
+
+
+
+ priority_manager
+
+
Gestor de resultats
-
+
+ Estat:
+
+
+
None
-
- Filtrar per: Nom del resultat
+
+ Editar
-
+
None
@@ -7977,27 +8132,27 @@
None
-
- Eliminar
+
+ Duplicar
-
-
+
+ None
-
- Close
+
+ Explotació:
-
+
None
-
- Explotació:
+
+ Close
-
+
None
@@ -8009,19 +8164,35 @@
None
-
- Duplicar
+
+ Informació:
-
+
None
-
- Editar
+
+ Filtrar per: Nom del resultat
-
+
+ None
+
+
+
+ Eliminar
+
+
+
+
+
+
+
+ Gestor de resultats
+
+
+
None
@@ -8032,27 +8203,27 @@
Dibuixar perfil
-
- None
+
+ Afegir punt final
-
- None
+
+
-
- Títol
+
+ Afegir punt adicional
-
+
None
-
- Punt final:
+
+ Id perfil:
-
+
None
@@ -8064,75 +8235,75 @@
None
-
- Afegir punt final
+
+ Guardar perfil
-
-
+
+ None
-
- Afegir punt adicional
+
+ Model:
-
+
None
-
- Id perfil:
+
+ Punt final:
-
+
None
-
- Carregar perfil
+
+ Rotació:
-
+
None
-
- Punt adicional:
+
+ Títol
-
+
None
-
+
Dibuixar perfil
-
+
None
-
- Ruta:
+
+ Netejar perfil
-
+
None
-
- Tancar
+
+ ...
-
- Tancar
+
+ None
-
- Afegir punt inicial
+
+ Escala vertical:
-
+
None
@@ -8144,19 +8315,19 @@
None
-
- Escala vertical:
+
+ Afegir punt inicial
-
+
None
-
- Dibuixar perfil
+
+ None
-
+
None
@@ -8168,43 +8339,43 @@
None
-
- Rotació:
+
+ Carregar perfil
-
+
None
-
- Model:
+
+ Dibuixar perfil
-
+
None
-
- Guardar perfil
+
+ Tancar
-
- None
+
+ Tancar
-
- ...
+
+ Punt adicional:
-
+
None
-
- Netejar perfil
+
+ Ruta:
-
+
None
@@ -8259,15 +8430,7 @@
- Acceptar
-
-
-
- Revisar projecte
-
-
-
- None
+ Acceptar
@@ -8277,6 +8440,14 @@
None
+
+
+ Revisar projecte
+
+
+
+ None
+
psector_duplicate
@@ -8285,27 +8456,19 @@
Duplicar sector
-
- Info log
+
+ Duplicar sector
-
+
None
-
- Cancelar
-
-
-
- Cancelar
-
-
-
- Duplicar sector:
+
+ Info log
-
+
None
@@ -8317,12 +8480,12 @@
None
-
- Acceptar
+
+ Duplicar sector:
-
- Acceptar
+
+ None
@@ -8333,12 +8496,20 @@
None
-
- Duplicar sector
+
+ Cancelar
-
- None
+
+ Cancelar
+
+
+
+ Acceptar
+
+
+
+ Acceptar
@@ -8347,14 +8518,6 @@
Gestor de sector
-
-
- Sector actual
-
-
-
- None
-
Fusionar
@@ -8364,35 +8527,43 @@
Per fusionar diversos sectors en un, has de sel·leccionar-los amb Ctrl y apretar aquest botó
-
- Alterar actiu
+
+ Filtrar per:
-
+
None
-
- Esborrar
+
+ Duplicar
-
- Eliminar
+
+ None
-
- Filtrar per:
+
+ Sector actual
-
+
None
-
- Duplicar
+
+ Esborrar
-
+
+ Eliminar
+
+
+
+ Gestor de sector
+
+
+
None
@@ -8404,20 +8575,20 @@
Mostrar inactius
-
- Cancelar
+
+ Alterar actiu
-
- Cancelar
+
+ None
-
- Gestor de sector
+
+ Cancelar
-
- None
+
+ Cancelar
@@ -8427,19 +8598,27 @@
Generador d'informes
-
- Model:
+
+ Arxiu CSV detall:
-
+
None
-
- Crear
+
+ ...
-
+
+ None
+
+
+
+ Compositor desactivat
+
+
+
None
@@ -8451,27 +8630,27 @@
None
-
- Cancelar
+
+ Infrome
-
- Cancelar
+
+ None
-
- Compositor desactivat
+
+ Cancelar
-
- None
+
+ Cancelar
-
- ...
+
+ Arxiu CSV llista de preus:
-
+
None
@@ -8483,27 +8662,19 @@
None
-
- Infrome
-
-
-
- None
-
-
-
- Arxiu CSV llista de preus:
+
+ Crear
-
+
None
-
- Arxiu CSV detall:
+
+ Model:
-
+
None
@@ -8514,11 +8685,19 @@
Selector de resultats
-
- Descripció:
+
+ Resultat
-
+
+ None
+
+
+
+ Cancel
+
+
+
None
@@ -8530,11 +8709,11 @@
None
-
- Cancel
+
+ Selector de resultats
-
+
None
@@ -8546,11 +8725,11 @@
None
-
- Resultat
+
+ Descripció:
-
+
None
@@ -8569,14 +8748,6 @@
None
-
-
- Selector de resultats
-
-
-
- None
-
search
@@ -8584,6 +8755,14 @@
Cerca
+
+
+ Cerca
+
+
+
+ None
+
Sense resultats
@@ -8600,14 +8779,6 @@
None
-
-
- Cerca
-
-
-
- None
-
search_workcat
@@ -8616,11 +8787,11 @@
Bsucar expdte
-
- ...
+
+ Flitrar per:
-
+
None
@@ -8632,19 +8803,11 @@
None
-
- Ruta de destí
-
-
-
- None
-
-
-
- Documents
+
+ ...
-
+
None
@@ -8664,11 +8827,19 @@
None
-
- Activar
+
+ Filtrar per:
-
+
+ None
+
+
+
+ Documents
+
+
+
None
@@ -8680,43 +8851,43 @@
None
-
- Filtrar per:
+
+ Element donats d'alta:
-
+
None
-
- Activar
+
+ Bsucar expdte
-
+
None
-
- Donat d'ata
+
+ Activar
-
+
None
-
- Bsucar expdte
+
+ Exportar a CSV
-
+
None
-
- Exportar a CSV
+
+ Donat d'ata
-
+
None
@@ -8728,19 +8899,19 @@
None
-
- Element donats d'alta:
+
+ Activar
-
+
None
-
- Flitrar per:
+
+ Ruta de destí
-
+
None
@@ -8750,6 +8921,14 @@
Selector
+
+
+ Selector
+
+
+
+ None
+
Tanca
@@ -8766,14 +8945,6 @@
Tancar
-
-
- Selector
-
-
-
- None
-
status_selector
@@ -8781,6 +8952,22 @@
Selector de estado
+
+
+ Acceptar
+
+
+
+ None
+
+
+
+ Nou estat:
+
+
+
+ None
+
Selector de estado
@@ -8789,6 +8976,14 @@
None
+
+
+ Cancel
+
+
+
+ None
+
Està canviant l'estat del següent resultat:
@@ -8797,29 +8992,88 @@
None
+
+
+ style_manager
- Cancel
+ Tanca
- None
+ Tanca
-
- Nou estat:
+
+ Actualitza l'estil
-
- None
+
+ Actualitza l'estil de la capa seleccionada amb l'estil de la capa corresponent en el projecte
-
- Acceptar
+
+
-
- None
+
+ Elimina la categoria seleccionada
+
+
+
+
+
+
+
+ Afegeix una nova categoria
+
+
+
+ Elimina l'estil
+
+
+
+ Elimina un estil de la categoria
+
+
+
+
+
+
+
+ Totes les teves categories d'estils
+
+
+
+
+
+
+
+ Introdueix el nom de la capa per filtrar
+
+
+
+ Filtrar per: Nom de la capa
+
+
+
+
+
+
+
+ Actualitza-ho tot
+
+
+
+ Recarrega els estils carregats al projecte
+
+
+
+ Afegeix estil
+
+
+
+ Afegeix una capa a la categoria seleccionada
@@ -8836,14 +9090,6 @@
None
-
-
- Tancar
-
-
-
- Tancar
-
Cancelar
@@ -8853,19 +9099,19 @@
Cancelar
-
- Info log
+
+ Caixa d'eines
-
+
None
-
- Caixa d'eines
+
+ Info log
-
+
None
@@ -8876,6 +9122,14 @@
None
+
+
+ Tancar
+
+
+
+ Tancar
+
toolbox_docker
@@ -8899,107 +9153,107 @@
Visita
-
- None
+
+ Partes Feina
-
- Crear nou document
+
+ None
-
- Relacions
+
+ None
-
- Relations
+
+ Obrir document
-
- Tipus d'element:
+
+ Afegir geometria
-
+
None
-
- None
+
+ Informació:
-
- Insertar document
+
+ None
-
- Cancelar
+
+ Tipus d'element:
-
- Cancelar
+
+ None
-
- Document
+
+ Fins:
-
+
None
-
- Codi:
-
-
-
+
None
-
- Partes Feina
+
+ Crear nou document
-
+
None
-
- Nom d'usuari:
+
+ Esborrar document
-
+
+ Esborrar event
+
+
+
None
-
- Data Inicial:
+
+ Inserir event
-
+
None
-
- Acceptar
+
+ Actualitzar event
-
- Acceptar
+
+ None
-
- Estat:
+
+ None
-
+
None
-
- Descripció:
+
+ None
-
+
None
@@ -9011,116 +9265,116 @@
None
-
- None
+
+ Descripció:
-
+
None
-
- Id:
+
+ Estat:
-
+
None
-
- Visita
+
+ Data Inicial:
-
+
None
-
- None
+
+ Relacions
-
- Obrir document
+
+ Relations
-
- Visita
+
+ Codi:
-
+
None
-
- None
+
+ Document
-
+
None
-
- Actualitzar event
+
+ Nom d'usuari:
-
+
None
-
- Inserir event
+
+ Visita cat id
-
+
None
-
- Esborrar event
+
+ Cancelar
-
- None
+
+ Cancelar
-
- Informació:
+
+ None
-
- None
+
+ Insertar document
-
- None
+
+ Id:
-
- Esborrar document
+
+ None
-
- Visita cat id
+
+ Visita
-
+
None
-
- Fins:
+
+ Visita
-
+
None
-
- Afegir geometria
+
+ Acceptar
-
- None
+
+ Acceptar
@@ -9129,6 +9383,14 @@
Cargar documents
+
+
+ Cargar documents
+
+
+
+ None
+
Visita ID
@@ -9145,14 +9407,6 @@
None
-
-
- Cargar documents
-
-
-
- None
-
visit_event
@@ -9161,27 +9415,27 @@
Event estàndar d'arc
-
- Id paràmetre:
+
+ Esborrar arxiu
-
+
None
-
- Arxius:
+
+ Event estàndar d'arc
-
+
None
-
- Id posició:
+
+ Valor:
-
+
None
@@ -9193,43 +9447,43 @@
None
-
- Esborrar arxiu
+
+ Id paràmetre:
-
+
None
-
- Text:
+
+ Valor posció
-
+
None
-
- Valor posció
+
+ Id posició:
-
+
None
-
- Event estàndar d'arc
+
+ Arxius:
-
+
None
-
- Valor:
+
+ Text:
-
+
None
@@ -9240,27 +9494,19 @@
Event
-
- Geom 3:
-
-
-
- None
-
-
-
- Valor 2:
+
+ Tancar
-
- None
+
+ Tancar
-
- Valor:
+
+ Últim valor:
-
+
None
@@ -9272,27 +9518,19 @@
None
-
- Últim valor:
-
-
-
- None
-
-
-
- Factor de pes.
+
+ Valor:
-
+
None
-
- Coordenada X:
+
+ Valor 2:
-
+
None
@@ -9303,14 +9541,6 @@
None
-
-
- Informació
-
-
-
- None
-
Valor 1:
@@ -9320,12 +9550,12 @@
None
-
- Cooordenad Y:
+
+ Visita ID
-
- None
+
+ Visit ID
@@ -9367,14 +9597,6 @@
None
-
-
- Visita ID
-
-
-
- Visit ID
-
Codi event:
@@ -9415,6 +9637,30 @@
None
+
+
+ Geom 3:
+
+
+
+ None
+
+
+
+ Cooordenad Y:
+
+
+
+ None
+
+
+
+ Coordenada X:
+
+
+
+ None
+
Text:
@@ -9424,12 +9670,20 @@
None
-
- Tancar
+
+ Informació
-
- Tancar
+
+ None
+
+
+
+ Factor de pes.
+
+
+
+ None
@@ -9439,51 +9693,51 @@
Event rehabilització d'arc
-
- Event rehabilització d'arc
+
+ Esborrar arxiu
-
+
None
-
- Esborrar arxiu
+
+ Valor 2:
-
+
None
-
- Id paràmetre:
+
+ Text:
-
+
None
-
- Arxius:
+
+ Id posició.
-
+
None
-
- Geom 1:
+
+ Id paràmetre:
-
+
None
-
- Afegir arxiu
+
+ Geom 2:
-
+
None
@@ -9495,11 +9749,11 @@
None
-
- Valor 1:
+
+ Afegir arxiu
-
+
None
@@ -9511,35 +9765,35 @@
None
-
- Geom 2:
+
+ Geom 1:
-
+
None
-
- Id posició.
+
+ Event rehabilització d'arc
-
+
None
-
- Valor 2:
+
+ Arxius:
-
+
None
-
- Text:
+
+ Valor 1:
-
+
None
@@ -9558,20 +9812,20 @@
None
-
+
None
-
+
None
-
- Visita ID
+
+ None
-
- Visit ID
+
+ None
@@ -9590,12 +9844,12 @@
None
-
- None
+
+ Visita ID
-
- None
+
+ Visit ID
@@ -9605,19 +9859,11 @@
Zum galería
-
- Id event:
-
-
-
- None
-
-
-
- lbl_img_zoom
+
+ Zum galería
-
+
None
@@ -9629,27 +9875,35 @@
Visit ID
-
- Zum galería
+
+ Id event:
-
+
None
-
+
None
-
+
None
-
+
+ lbl_img_zoom
+
+
+
None
-
+
+ None
+
+
+
None
@@ -9660,12 +9914,12 @@
Afegir foto
-
- Enllaç
+
+ Cancelar
-
- Link
+
+ Cancelar
@@ -9676,79 +9930,79 @@
Acceptar
-
- Afegir foto
+
+ ...
-
+
None
-
- ...
+
+ Enllaç
-
- None
+
+ Link
-
- Cancelar
+
+ Afegir foto
-
- Cancelar
+
+ None
workspace_create
-
- txt_workspace_name
+
+ Nom:
-
- Nom del nou espai de treball *Obligatori
+
+ Nom del nou espai de treball
-
- Descripció:
+
+ Acceptar
-
- Descripció del nou espai de treball
+
+ None
-
- Cancelar
+
+ Actualitza
-
+
None
-
- txt_workspace_descript
+
+ Descripció:
-
- Utilitza aquest camp per descriure les característiques de l'espai de treball
+
+ Descripció del nou espai de treball
-
- Actualitza
+
+ txt_workspace_descript
-
- None
+
+ Utilitza aquest camp per descriure les característiques de l'espai de treball
-
- Acceptar
+
+ txt_workspace_name
-
- None
+
+ Nom del nou espai de treball *Obligatori
@@ -9759,16 +10013,24 @@
None
-
- Nom:
+
+ Cancelar
-
- Nom del nou espai de treball
+
+ None
workspace_manager
+
+
+ Tanca
+
+
+
+ None
+
Restablir
@@ -9777,6 +10039,14 @@
Restableix els valors de l'espai de treball actual
+
+
+ Filtrar per: Nom
+
+
+
+ None
+
Eliminar
@@ -9786,20 +10056,20 @@
Elimina l'espai de treball seleccionat
-
- Filtrar per: Nom
+
+ Crear
-
- None
+
+ Crea
-
- Tanca
+
+ txt_name
-
- None
+
+ Nom de l'espai de treball
@@ -9817,22 +10087,6 @@
Utilitza l'espai de treball seleccionat
-
-
- txt_name
-
-
-
- Nom de l'espai de treball
-
-
-
- Crear
-
-
-
- Crea
-
diff --git a/i18n/giswater_en_US.qm b/i18n/giswater_en_US.qm
index 4aef4d9c0..3c75b2f9c 100644
Binary files a/i18n/giswater_en_US.qm and b/i18n/giswater_en_US.qm differ
diff --git a/i18n/giswater_en_US.ts b/i18n/giswater_en_US.ts
index f6097b78a..a767c89dd 100644
--- a/i18n/giswater_en_US.ts
+++ b/i18n/giswater_en_US.ts
@@ -80,10 +80,6 @@
Element manager
-
-
- Epa World
-
Result manager
@@ -132,6 +128,10 @@
Lot filter
+
+
+ Giswater styles
+
Commercial connection
@@ -2298,11 +2298,11 @@
admin_addfields
-
- Query text:
+
+ Data type:
-
+
None
@@ -2314,59 +2314,59 @@
None
-
- Form type:
+
+ Query text filter:
-
+
None
-
- Data type:
+
+ Num decimals:
-
+
None
-
- Not update:
+
+ Reload field:
-
+
None
-
- Num decimals:
+
+ Open
-
+
None
-
- Reload field:
+
+ Editability:
-
+
None
-
- Query text filter:
+
+ Update
-
+
None
-
- Create
+
+ Form type:
-
+
None
@@ -2378,44 +2378,44 @@
None
-
- Dialog
+
+ Column name:
-
+
None
-
- Typeahead:
+
+ Delete
-
+
None
-
- Tooltip:
+
+ Create
-
+
None
-
- Delete
+
+ Widget type:
-
+
None
-
- Widget controls:
+
+ Query text:
-
- Example configuration keys {"widgetdim": 150,"setMultiline":true,"vdefault": "01-01-2014", "filterSign": ">}
+
+ None
@@ -2426,51 +2426,59 @@
None
-
- Field name:
+
+ Widget function:
-
+
None
-
- Widget type:
+
+ Auto update:
-
+
None
-
- Update
+
+ Widget controls:
-
+
+ Example configuration keys {"widgetdim": 150,"setMultiline":true,"vdefault": "01-01-2014", "filterSign": ">}
+
+
+
+ Field name:
+
+
+
None
-
- Stylesheet:
+
+ Active:
-
+
None
-
- Placeholder:
+
+ Typeahead:
-
+
None
-
- Editability:
+
+ Tooltip:
-
+
None
@@ -2482,27 +2490,19 @@
Accept
-
- Linkedobject
-
-
-
- None
-
-
-
- Open
+
+ Stylesheet:
-
+
None
-
- Widget function:
+
+ Placeholder:
-
+
None
@@ -2522,83 +2522,83 @@
None
-
- Field length:
+
+ Null value:
-
+
None
-
- Action function:
+
+ Editable:
-
+
None
-
- Active:
+
+ Linkedobject
-
+
None
-
- Column name:
+
+ Action function:
-
+
None
-
- Auto update:
+
+ Dialog
-
+
None
-
- Null value:
+
+ Mandatory addfields configuration
-
+
None
-
- Editable:
+
+ Enabled:
-
+
None
-
- Mandatory addfields configuration
+
+ Field length:
-
+
None
-
- Enabled:
+
+ Mandatory:
-
+
None
-
- Mandatory:
+
+ Not update:
-
+
None
@@ -2613,19 +2613,27 @@
Accept
-
- Connection:
+
+ User name:
-
+
None
-
- User name:
+
+ Dialog
-
+
+ None
+
+
+
+ Connection:
+
+
+
None
@@ -2644,14 +2652,6 @@
None
-
-
- Dialog
-
-
-
- None
-
admin_dbproject
@@ -2664,108 +2664,108 @@
Name of a new schema. Name has to be written in lower cases, using only letters used in the english alphabet and without spaces or dashes
-
- Locale:
+
+ Filter SRID
-
- Schema language
+
+ Spatial reference identifier. Only values shown on a table below are allowed.
-
- Accept
+
+ Project Type:
-
- Accept
+
+ None
-
- Create project
+
+ Description:
-
+
None
-
- ...
+
+ Import INP data
-
+
None
-
- Close
+
+ Data source:
-
- Close
+
+ None
-
- Filter SRID
+
+ Empty data
-
- Spatial reference identifier. Only values shown on a table below are allowed.
+
+ None
-
- Project Type:
+
+ Inventory Example
-
+
None
-
- Description:
+
+ Full Example
-
+
None
-
- Import INP data
+
+ Close
-
- None
+
+ Close
-
- Data source:
+
+ Locale:
-
- None
+
+ Schema language
-
- Empty data
+
+ ...
-
+
None
-
- Inventory Example
+
+ Create project
-
+
None
-
- Full Example
+
+ Accept
-
- None
+
+ Accept
@@ -2779,21 +2779,29 @@
admin_gisproject
-
- Accept
+
+ QGIS file name:
-
- Accept
+
+ None
-
- QGIS file name:
+
+ ...
-
+
None
+
+
+ Accept
+
+
+
+ Accept
+
Folder:
@@ -2818,14 +2826,6 @@
None
-
-
- ...
-
-
-
- None
-
Create QGIS project
@@ -2845,22 +2845,6 @@
admin_importinp
-
-
- Run
-
-
-
- None
-
-
-
- Close
-
-
-
- None
-
Config parameters
@@ -2878,32 +2862,32 @@
None
-
- Config
+
+ Close
-
+
None
-
-
- admin_projectinfo
-
- Information about new updates
+
+ Config
-
+
None
-
- Update SQL
+
+ Run
-
+
None
+
+
+ admin_projectinfo
Close
@@ -2920,17 +2904,25 @@
None
-
-
- admin_qtdialog
-
- Cancel
+
+ Update SQL
-
- Cancel
+
+ None
+
+
+
+ Information about new updates
+
+
+
+ None
+
+
+ admin_qtdialog
UI path:
@@ -2940,12 +2932,20 @@
None
-
- Form name:
+
+ Cancel
-
- None
+
+ Cancel
+
+
+
+ Accept
+
+
+
+ Accept
@@ -2963,6 +2963,17 @@
None
+
+
+ Form name:
+
+
+
+ None
+
+
+
+ admin_renameproj
Accept
@@ -2971,9 +2982,14 @@
Accept
-
-
- admin_renameproj
+
+
+ Rename project
+
+
+
+ None
+
Please, set a new project name:
@@ -2990,12 +3006,15 @@
Cancel
+
+
+ admin_sysfields
-
- Rename project
+
+ Placeholder:
-
+
None
@@ -3006,15 +3025,12 @@
Accept
-
-
- admin_sysfields
-
- Column id:
+
+ Additional configuration
-
+
None
@@ -3026,168 +3042,168 @@
None
-
- Cancel
+
+ Stylesheet:
-
+
None
-
- Widget controls:
+
+ Dialog
-
- Example configuration keys {"widgetdim": 150,"setMultiline":true,"vdefault": "01-01-2014", "filterSign": ">}
+
+ None
-
- Open
+
+ Basic configuration
-
+
None
-
- Mandatory:
+
+ Create
-
+
None
-
- Layout order:
+
+ Open
-
+
None
-
- Additional configuration
+
+ Column id:
-
+
None
-
- Layout name:
+
+ Editability:
-
+
None
-
- Label:
+
+ Editable:
-
+
None
-
- Hidden:
+
+ Enabled:
-
+
None
-
- Form name:
+
+ Widget controls:
-
- None
+
+ Example configuration keys {"widgetdim": 150,"setMultiline":true,"vdefault": "01-01-2014", "filterSign": ">}
-
- Accept
+
+ Form name:
-
- Accept
+
+ None
-
- Enabled:
+
+ Cancel
-
+
None
-
- Editable:
+
+ Hidden:
-
+
None
-
- Basic configuration
+
+ Label:
-
+
None
-
- Tooltip:
+
+ Layout name:
-
+
None
-
- Create
+
+ Layout order:
-
+
None
-
- Placeholder:
+
+ Mandatory:
-
+
None
-
- Dialog
+
+ Tooltip:
-
+
None
+
+
+ admin_translation
-
- Editability:
+
+ Translate ui and py messages
-
+
None
-
- Stylesheet:
+
+ Translate files
-
+
None
-
-
- admin_translation
Connection information
@@ -3205,19 +3221,19 @@
None
-
- Translate files
+
+ Source code:
-
+
None
-
- Host:
+
+ Test connection
-
+
None
@@ -3229,19 +3245,11 @@
None
-
- Port:
-
-
-
- None
-
-
-
- Source code:
+
+ User:
-
+
None
@@ -3253,35 +3261,27 @@
None
-
- User:
-
-
-
- None
-
-
-
- Translate ui and py messages
+
+ Host:
-
+
None
-
- Test connection
+
+ Data base:
-
+
None
-
- Data base:
+
+ Port:
-
+
None
@@ -3296,83 +3296,35 @@
None
-
- Api manager
-
-
-
- None
-
-
-
- Update Project Schema
-
-
-
- Update version of a selected database schema
-
-
-
- Advanced
-
-
-
- None
-
-
-
- Use constrains:
-
-
-
- None
-
-
-
- Translation files
-
-
-
- None
-
-
-
- UI path:
+
+ Feature name:
-
+
None
-
- Copy
-
-
-
- Copy selected database schema
-
-
-
- Create
+
+ Feature name:
-
+
None
-
- File to DB
+
+ Import
-
+
None
-
- Create
+
+ Fields manager
-
+
None
@@ -3391,14 +3343,6 @@
Create, configure or remove an additional field related to a selected feature type or for all feature types defined in a project
-
-
- Import
-
-
-
- None
-
Update
@@ -3416,28 +3360,28 @@
None
-
- Constrains
+
+ Connection
-
+
None
-
- Connection
+
+ Visit
-
- None
+
+ Create, configure or remove visit definition related to a selected feature type or for all feature types defined in a project
-
- Fields manager
+
+ Load custom file
-
- None
+
+ Select a folder with .sql files that you want to execute on a selected schema
@@ -3448,342 +3392,382 @@
None
-
- Load custom file
+
+ Update
-
- Select a folder with .sql files that you want to execute on a selected schema
+
+ None
-
- Update
+
+ ...
-
+
None
-
- Export
+
+ Load file
-
+
None
-
- ...
+
+ Project schema information
-
+
None
-
- Rename
+
+ Manage UI
-
- Rename selected database schema
+
+ None
-
- General
+
+ Create QGIS project file
-
+
None
-
- Create
+
+ Connection name:
-
+
+ Name of a database connection defined in QGIS
+
+
+
+ QGIS templates
+
+
+
None
-
- Feature name:
+
+ Reload functions:
-
+
None
-
- Feature name:
+
+ ...
-
+
None
-
+
Delete
-
- None
+
+ Delete selected database schema
-
- Schema manager
+
+ Execute
-
+
None
-
- Update
+
+ Create
-
+
None
-
- Feature name:
+
+ Create
-
+
None
-
- Create QGIS project file
+
+ File to DB
-
+
None
-
- Form name:
+
+ Update
-
+
None
-
- Close
+
+ Delete
-
- Close
+
+ None
-
- Connection name:
+
+ Create DB project schema
-
- Name of a database connection defined in QGIS
+
+ None
-
- Visit
+
+ Manage child views
-
- Create, configure or remove visit definition related to a selected feature type or for all feature types defined in a project
+
+ Recreate child views for a selected feature type or for all feature types defined in a project
-
- Load file
+
+ Export
-
+
None
-
- Name:
+
+ Feature name:
-
- Name of the database schema
+
+ None
-
- QGIS templates
+
+ Schema manager
-
+
None
-
- Reload functions:
+
+ Api manager
-
+
None
-
- Delete
+
+ Advanced
-
+
None
-
- Project type:
+
+ Update
-
- Type of giswater project
+
+ None
-
- Giswater
+
+ Delete
-
+
None
-
- Manage UI
+
+ Create
-
+
None
-
- Manage child views
+
+ Rename
-
- Recreate child views for a selected feature type or for all feature types defined in a project
+
+ Rename selected database schema
-
- Execute
+
+ Use constrains:
-
+
None
-
- ...
+
+ Update all:
-
+
None
-
- Project schema information
+
+ General
-
+
None
-
- Update all:
+
+ UI path:
-
+
None
-
- Create DB project schema
+
+ Name:
-
+
+ Name of the database schema
+
+
+
+ Translation files
+
+
+
None
-
- Update
+
+ Project type:
-
+
+ Type of giswater project
+
+
+
+ Update Project Schema
+
+
+
+ Update version of a selected database schema
+
+
+
+ Close
+
+
+
+ Close
+
+
+
+ Giswater
+
+
+
None
-
- Delete
+
+ Copy
-
- Delete selected database schema
+
+ Copy selected database schema
-
-
- admin_visitclass
-
- Class id:
+
+ Constrains
-
+
None
-
- Accept
+
+ Form name:
-
+
None
+
+
+ admin_visitclass
-
- Visit type:
+
+ Feature type:
-
+
None
-
- Cancel
+
+ Manage visit class
-
+
None
-
- Accept
+
+ View name:
-
+
None
-
- Feature type:
+
+ Active:
-
+
None
-
- Create
+
+ Class id:
-
+
None
-
- Manage visit class
+
+ Descript:
-
+
None
@@ -3802,6 +3786,14 @@
None
+
+
+ Class name:
+
+
+
+ None
+
Multi feature:
@@ -3811,11 +3803,11 @@
None
-
- View name:
+
+ Visit type:
-
+
None
@@ -3827,72 +3819,56 @@
None
-
- Update
-
-
-
- None
-
-
-
- Descript:
-
-
-
- None
-
-
-
- Delete
+
+ Cancel
-
+
None
-
- Class name:
+
+ Accept
-
+
None
-
- Active:
+
+ Create
-
+
None
-
-
- admin_visitparam
-
- Cancel
+
+ Accept
-
+
None
-
- Parameter type:
+
+ Delete
-
+
None
-
- Data type:
+
+ Update
-
+
None
+
+
+ admin_visitparam
Form type:
@@ -3902,11 +3878,11 @@
None
-
- Default value:
+
+ Code:
-
+
None
@@ -3918,27 +3894,27 @@
None
-
- Descript:
+
+ Enabled:
-
+
None
-
- Code:
+
+ Short descript:
-
+
None
-
- Parameters
+
+ Cancel
-
+
None
@@ -3950,43 +3926,43 @@
None
-
- Short descript:
+
+ Descript:
-
+
None
-
- Enabled:
+
+ Default value:
-
+
None
-
- Widget type:
+
+ Mandatory:
-
+
None
-
- Accept
+
+ Data type:
-
+
None
-
- Mandatory:
+
+ Parameters
-
+
None
@@ -3997,6 +3973,22 @@
None
+
+
+ Parameter type:
+
+
+
+ None
+
+
+
+ Widget type:
+
+
+
+ None
+
Manage visit parameter
@@ -4005,6 +3997,14 @@
None
+
+
+ Accept
+
+
+
+ None
+
arc_fusion
@@ -4012,14 +4012,6 @@
Arc fusion
-
-
- Cancel
-
-
-
- None
-
End date:
@@ -4037,11 +4029,19 @@
None
-
- Workcat id end:
+
+ Info log
-
+
+ None
+
+
+
+ Cancel
+
+
+
None
@@ -4053,11 +4053,11 @@
Accept
-
- Info log
+
+ Workcat id end:
-
+
None
@@ -4076,76 +4076,44 @@
Leak Assignation
-
+
Leaks
-
- None
-
-
-
- Cluster length (m):
-
-
-
- Maximum sum of pipe lengths within a cluster, in meters.
-
-
-
- Pipes
-
-
-
+
None
-
- Diameter range:
-
-
-
- Diameter range based on factors of the initial pipe.
-
-
-
- Use all leaks
-
-
-
- Calculates leaks per kilometer per year using all available data, regardless of the 'years to calculate' parameter.
-
-
-
- Info Log
+
+ Maximum distance (m):
-
- None
+
+ Maximum distance, in meters, between the initial pipe and other pipes included in the cluster.
-
- Leak Assignation
+
+ Diameter range:
-
- None
+
+ Diameter range based on factors of the initial pipe.
-
- Filter by material:
+
+ Filter by diameter:
-
- Uses only pipes of the same material as the initial one.
+
+ Uses only pipes that match the diameter range of the initial one.
-
- Maximum distance (m):
+
+ Cluster length (m):
-
- Maximum distance, in meters, between the initial pipe and other pipes included in the cluster.
+
+ Maximum sum of pipe lengths within a cluster, in meters.
@@ -4155,6 +4123,14 @@
Uses only pipes that match the builtdate range of the initial one.
+
+
+ Buffer distance (m):
+
+
+
+ Distance from a leak at which pipes are selected to be assigned that leak.
+
Years to calculate:
@@ -4164,12 +4140,12 @@
Number of years of leak data to consider, based on recency.
-
- Buffer distance (m):
+
+ Use all leaks
-
- Distance from a leak at which pipes are selected to be assigned that leak.
+
+ Calculates leaks per kilometer per year using all available data, regardless of the 'years to calculate' parameter.
@@ -4179,6 +4155,30 @@
Built date range, in years before and after the initial pipe.
+
+
+ Pipes
+
+
+
+ None
+
+
+
+ Leaks
+
+
+
+ None
+
+
+
+ Leak Assignation
+
+
+
+ None
+
Config
@@ -4188,20 +4188,20 @@
None
-
- Leaks
+
+ Filter by material:
-
- None
+
+ Uses only pipes of the same material as the initial one.
-
- Filter by diameter:
+
+ Info Log
-
- Uses only pipes that match the diameter range of the initial one.
+
+ None
@@ -4211,12 +4211,12 @@
CAD draw circle
-
- Delete previous circles
+
+ Accept
-
- None
+
+ Accept
@@ -4227,27 +4227,27 @@
None
-
- Insert radius:
+
+ CAD draw circle
-
+
None
-
- Accept
+
+ Delete previous circles
-
- Accept
+
+ None
-
- CAD draw circle
+
+ Insert radius:
-
+
None
@@ -4258,43 +4258,43 @@
CAD Add point
-
- CAD Add point
+
+ Dist Y:
-
+
None
-
- End point
+
+ Accept
-
- None
+
+ Accept
-
- Delete previous points
+
+ End point
-
+
None
-
- Dist Y:
+
+ Cancel
-
+
None
-
- Cancel
+
+ Delete previous points
-
+
None
@@ -4314,12 +4314,12 @@
None
-
- Accept
+
+ CAD Add point
-
- Accept
+
+ None
@@ -4329,20 +4329,20 @@
Config
-
- Cancel
+
+ Feature cat
-
+
None
-
- Accept
+
+ Add fields
-
- Accept
+
+ None
@@ -4352,6 +4352,14 @@
None
+
+
+ Cancel
+
+
+
+ None
+
Config
@@ -4360,6 +4368,14 @@
None
+
+
+ Man type
+
+
+
+ None
+
Basic
@@ -4369,28 +4385,95 @@
None
-
- Add fields
+
+ Accept
-
- None
+
+ Accept
+
+
+ create_style_group
-
- Feature cat
+
+
-
- None
+
+ Category name
-
- Man type
+
+ Category ID:
-
- None
+
+
+
+
+
+
+
+
+
+ Category ID
+
+
+
+
+
+
+
+ Description
+
+
+
+ Category name:
+
+
+
+
+
+
+
+ Accept
+
+
+
+ Accept
+
+
+
+ Description:
+
+
+
+
+
+
+
+ Role:
+
+
+
+
+
+
+
+ Cancel
+
+
+
+ Cancel
+
+
+
+
+
+
+
+ Role that will be able to use this style
@@ -4406,44 +4489,44 @@
csv
-
-
- ...
+
+
+ Ignore headers:
-
+
None
-
- File:
+
+ Info log
-
+
None
-
- Delimiter:
+
+ Info:
-
+
None
-
- Accept
+
+ ...
-
- Accept
+
+ None
-
- Set of characters:
+
+ Delimiter:
-
+
None
@@ -4462,6 +4545,14 @@
None
+
+
+ Cancel
+
+
+
+ Cancel
+
Preview
@@ -4471,27 +4562,27 @@
None
-
- Info log
+
+ File:
-
+
None
-
- Info:
+
+ Accept
-
- None
+
+ Accept
-
- Ignore headers:
+
+ Set of characters:
-
+
None
@@ -4502,14 +4593,6 @@
None
-
-
- Cancel
-
-
-
- Cancel
-
dialog_table
@@ -4526,12 +4609,12 @@
None
-
- Cancel
+
+ Accept
-
- None
+
+ Accept
@@ -4542,12 +4625,12 @@
None
-
- Accept
+
+ Cancel
-
- Accept
+
+ None
@@ -4573,19 +4656,19 @@
None
-
- Close
+
+ Dialog
-
+
None
-
- Dialog
+
+ Close
-
+
None
@@ -4604,19 +4687,19 @@
None
-
- Cancel
+
+ Accept
-
- None
+
+ Accept
-
- Other
+
+ Cancel
-
+
None
@@ -4628,20 +4711,20 @@
None
-
- Measurements
+
+ Other
-
+
None
-
- Accept
+
+ Measurements
-
- Accept
+
+ None
@@ -4651,11 +4734,19 @@
Document
-
- Connec
+
+ ...
-
+
+ None
+
+
+
+ Gully
+
+
+
None
@@ -4666,6 +4757,22 @@
None
+
+
+ Accept
+
+
+
+ Accept
+
+
+
+ path
+
+
+
+ Fill it with some accesible folder path or web path
+
Document
@@ -4675,20 +4782,20 @@
None
-
- Accept
+
+ Cancel
-
- Accept
+
+ None
-
+
None
-
- Delete
+
+ Snapping
@@ -4699,52 +4806,52 @@
None
-
- Doc id:
+
+ Arc
-
+
None
-
- Gully
+
+ None
-
- None
+
+ Insert
-
- Observations:
+
+ Link:
-
- None
+
+ Link
-
- Document
+
+ Doc name:
-
+
None
-
- Document
+
+ Doc name:
-
+
None
-
- None
+
+ Document
-
- Insert
+
+ None
@@ -4755,35 +4862,27 @@
Open explorer to allow selection of web path. It's also posible to just paste the path to the Link text box
-
- Link:
-
-
-
- Link
+
+ None
-
- path
+
+ Delete
-
- Fill it with some accesible folder path or web path
+
+ Observations:
-
+
None
-
- Snapping
-
-
-
- Arc
+
+ Connec
-
+
None
@@ -4795,19 +4894,11 @@
None
-
- ...
-
-
-
- None
-
-
-
- Cancel
+
+ Document
-
+
None
@@ -4817,6 +4908,22 @@
Document management
+
+
+ Delete
+
+
+
+ None
+
+
+
+ Filter by: Doc name
+
+
+
+ None
+
Close
@@ -4833,14 +4940,9 @@
None
-
-
- Filter by: Doc id
-
-
-
- None
-
+
+
+ dscenario_manager
Delete
@@ -4849,9 +4951,6 @@
None
-
-
- dscenario_manager
Create
@@ -4861,20 +4960,12 @@
None
-
- Delete
-
-
-
- None
-
-
-
- Update
+
+ Show inactive
-
- None
+
+ Show inactive
@@ -4885,12 +4976,12 @@
None
-
- Show inactive
+
+ Update
-
- Show inactive
+
+ None
@@ -4916,148 +5007,132 @@
Element
-
- Builtdate:
+
+ Gully
-
+
None
-
- Workcat id:
-
-
-
- Workcat id
-
-
-
- Elementcat id:
+
+ State type:
-
+
None
-
- Add geom
-
-
-
- Add geometry
-
-
-
- Cancel
+
+ State:
-
+
None
-
- Accept
+
+ Code:
-
- Accept
+
+ None
-
- Element
+
+ Buildercat id:
-
+
None
-
- Element id:
+
+ Builtdate:
-
+
None
-
- Verified:
+
+ Element type:
-
+
None
-
- Gully
+
+ None
-
- None
+
+ Snapping
-
- State type:
+
+ Link:
-
- None
+
+ Link
-
- Element number:
+
+ Observations:
-
+
None
-
- Element
+
+ Exploitation:
-
+
None
-
+
None
-
- Delete
+
+ Insert
-
- State:
+
+ Arc
-
- None
+
+ Arc
-
- Observations:
+
+ Location type:
-
+
None
-
- Code:
+
+ Element
-
+
None
-
- Arc
+
+ Accept
-
- Arc
+
+ Accept
@@ -5068,19 +5143,19 @@
None
-
- Exploitation:
+
+ Rotation:
-
+
None
-
- Comment:
+
+ Cancel
-
+
None
@@ -5092,68 +5167,68 @@
Relations
-
- Link:
+
+ Element
-
- Link
+
+ None
-
- Location type:
+
+ Workcat id end:
-
- None
+
+ Workcat id end
-
- Element type:
+
+ Element number:
-
+
None
-
- Buildercat id:
+
+ Connec
-
+
None
-
+
None
-
- Snapping
+
+ Delete
-
- None
+
+ Verified:
-
- Insert
+
+ None
-
- Workcat id end:
+
+ Workcat id:
-
- Workcat id end
+
+ Workcat id
-
- Rotation:
+
+ Add geom
-
- None
+
+ Add geometry
@@ -5164,27 +5239,35 @@
None
-
- Connec
+
+ Comment:
-
+
None
-
-
- element_manager
-
- Element management
+
+ Elementcat id:
-
- Element management
+
+ None
+
+
+
+ Element id:
+
+
+
+ None
+
+
+ element_manager
-
- None
+
+ Element management
@@ -5202,6 +5285,14 @@
None
+
+
+ Element management
+
+
+
+ None
+
Filter by: Element id
@@ -5214,21 +5305,13 @@
epa_compare
-
- Selector date:
+
+ Time (to show):
-
+
None
-
-
- Cancel
-
-
-
- Cancel
-
Accept
@@ -5238,35 +5321,43 @@
Accept
-
- Compare date:
+
+ Selector date:
-
+
None
-
- Compare time:
+
+ Time (to compare):
-
+
None
-
- Time (to compare):
+
+ Cancel
-
+
+ Cancel
+
+
+
+ Selector
+
+
+
None
-
- Selector time:
+
+ Compare date:
-
+
None
@@ -5278,11 +5369,11 @@
None
-
- Selector
+
+ Compare time:
-
+
None
@@ -5294,27 +5385,27 @@
None
-
- Time
+
+ Result
-
+
None
-
- Time (to show):
+
+ Time
-
+
None
-
- Result
+
+ Selector time:
-
+
None
@@ -5341,11 +5432,11 @@
None
-
- Preview
+
+ Close
-
+
None
@@ -5357,11 +5448,11 @@
None
-
- Close
+
+ Print
-
+
None
@@ -5373,11 +5464,11 @@
None
-
- Print
+
+ Preview
-
+
None
@@ -5396,75 +5487,75 @@
Delete
-
- Info log
+
+ Delete feature
-
+
None
-
- Show feature relations
+
+ Feature type:
-
+
None
-
- Delete feature
+
+ Feature id:
-
+
None
-
- Delete feature
+
+ Info log
-
+
None
-
- Feature type:
+
+ Show feature relations
-
+
None
-
- Cancel
+
+ Delete another feature
-
+
None
-
- None
+
+ Delete feature
-
- Snapping
+
+ None
-
- Delete another feature
+
+ None
-
- None
+
+ Snapping
-
- Feature id:
+
+ Cancel
-
+
None
@@ -5475,19 +5566,19 @@
End feature
-
- Connec
+
+ Workcat id end:
-
+
None
-
- Workcat
+
+ Gully
-
+
None
@@ -5499,12 +5590,12 @@
None
-
- Gully
+
+ Cancel
-
- None
+
+ Cancel
@@ -5515,53 +5606,45 @@
None
-
- None
+
+ End feature
-
- Delete
+
+ None
-
- Workcat date:
+
+ Workcat
-
+
None
-
- Node
+
+ State type end:
-
+
None
-
- Arc
-
-
-
+
None
-
- Workcat id end:
+
+ Insert
-
+
None
-
+
None
-
-
- Snapping
-
Elem
@@ -5570,14 +5653,6 @@
None
-
-
- None
-
-
-
- Insert
-
Relations
@@ -5587,44 +5662,60 @@
Relations
-
- State type end:
+
+ None
-
+
+ Snapping
+
+
+
+ Connec
+
+
+
None
-
- Cancel
+
+ Accept
-
- Cancel
+
+ Accept
-
+
+ Arc
+
+
+
None
-
+
+ Workcat date:
+
+
+
None
-
- End feature
+
+ Node
-
+
None
-
- Accept
+
+ None
-
- Accept
+
+ Delete
@@ -5633,6 +5724,14 @@
Workcat end list
+
+
+ These connecs will be desconnected after dowgrading selected arcs:
+
+
+
+ None
+
Workcat end list
@@ -5665,14 +5764,6 @@
Accept
-
-
- These connecs will be desconnected after dowgrading selected arcs:
-
-
-
- None
-
go2epa
@@ -5681,68 +5772,68 @@
Go2Epa
-
- Result name:
+
+ Selector
-
+
None
-
- Use iterative calls
+
+ Info log
-
+
None
-
- lbl_counter
+
+ Use result network geometry
-
+
None
-
- File manager
+
+ Cancel
-
+
None
-
- Accept
+
+ INP file:
-
- Accept
+
+ None
-
- Preprocessing options
+
+ ...
-
+
None
-
- Selector
+
+ ...
-
+
None
-
- Cancel
+
+ Accept
-
- None
+
+ Accept
@@ -5753,83 +5844,83 @@
None
-
- Import result
+
+ Result name:
-
+
None
-
- Use result network geometry
+
+ lbl_counter
-
+
None
-
- Execute EPA software
+
+ RPT file:
-
+
None
-
- Export INP
+
+ Use iterative calls
-
+
None
-
- Info log
+
+ Go2Epa
-
+
None
-
- RPT file:
+
+ Import result
-
+
None
-
- INP file:
+
+ Execute EPA software
-
+
None
-
- ...
+
+ Export INP
-
+
None
-
- Go2Epa
+
+ Preprocessing options
-
+
None
-
- ...
+
+ File manager
-
+
None
@@ -5848,19 +5939,19 @@
Epa result management
-
- Toggle corporate
+
+ Close
-
+
None
-
- Close
+
+ Toggle corporate
-
+
None
@@ -5895,11 +5986,11 @@
Go2Epa - options
-
- Other
+
+ Go2Epa - options
-
+
None
@@ -5911,28 +6002,28 @@
None
-
- Cancel
+
+ Accept
-
- None
+
+ Accept
-
- Go2Epa - options
+
+ Cancel
-
+
None
-
- Accept
+
+ Other
-
- Accept
+
+ None
@@ -5973,36 +6064,36 @@
Hydrometer
-
- Hydrometer id:
+
+ Accept
-
- None
+
+ Accept
-
- Close
+
+ Hydrometer
-
+
None
-
- Hydrometer
+
+ Close
-
+
None
-
- Accept
+
+ Hydrometer id:
-
- Accept
+
+ None
@@ -6012,107 +6103,107 @@
Section
-
- lbl_cost_b_right
+
+ lbl_cost_area
-
+
None
-
- lbl_cost_exc
+
+ lbl_section_image
-
+
None
-
- lbl_cost_bulk
+
+ lbl_cost_fill
-
+
None
-
- lbl_cost_y_param
+
+ lbl_cost_bulk
-
+
None
-
- lbl_section_image
+
+ lbl_cost_exc
-
+
None
-
- Close
+
+ Section
-
- Close
+
+ None
-
-
- Section
+
+
+ lbl_cost_trench
-
+
None
-
- lbl_cost_excav
+
+ lbl_cost_b_left
-
+
None
-
- lbl_cost_area
+
+ lbl_cost_width
-
+
None
-
- lbl_cost_fill
+
+ lbl_cost_excav
-
+
None
-
- lbl_cost_width
+
+ Close
-
- None
+
+ Close
-
- lbl_cost_b_left
+
+ lbl_cost_b_right
-
+
None
-
- lbl_cost_trench
+
+ lbl_cost_y_param
-
+
None
@@ -6122,6 +6213,14 @@
Feature info
+
+
+ Relations
+
+
+
+ Relations
+
None
@@ -6131,19 +6230,19 @@
None
-
- To:
+
+ None
-
+
None
-
- From:
+
+ None
-
+
None
@@ -6155,43 +6254,43 @@
None
-
- None
+
+ To:
-
- Insert
+
+ None
-
- OM
+
+ Parameter type:
-
+
None
-
- Cancel
-
-
-
- Cancel
+
+ Parameter:
-
+
None
-
- Delete document
+
+ From:
-
+
None
-
+
+ Type:
+
+
+
None
@@ -6203,92 +6302,84 @@
None
-
- Documents
+
+ OM
-
+
None
-
+
None
-
- Delete
-
-
-
- Accept
+
+ Create new document
-
- Accept
+
+ Cat period filter:
-
- Connections
+
+ None
-
+
None
-
- Upstream features:
+
+ Open document
-
- None
+
+ Downstream features:
-
- Doc id:
+
+ None
-
+
None
-
- Plan
+
+ Insert
-
+
None
-
- Downstream features:
-
-
-
- None
+
+ Delete document
-
- Data
+
+ Hydrometer
-
+
None
-
- Relations
+
+ Hydrometer values
-
- Relations
+
+ None
-
- Cat period filter:
+
+ Accept
-
- None
+
+ Accept
@@ -6299,67 +6390,67 @@
Insert document
-
- None
+
+ Data
-
- Create new document
+
+ None
-
- Type:
+
+ Plan
-
+
None
-
- From:
+
+ Cancel
-
- None
+
+ Cancel
-
- Parameter:
+
+ None
-
+
None
-
- Parameter type:
+
+ Documents
-
+
None
-
- To:
+
+ None
-
+
None
-
- None
+
+ Doc id:
-
+
None
-
- None
+
+ Feature info
-
+
None
@@ -6371,43 +6462,51 @@
None
-
- None
+
+ Upstream features:
-
- Open document
+
+ None
-
- Hydrometer
+
+ Apply
-
- None
+
+ Apply
-
- Hydrometer values
+
+ From:
-
+
None
-
+
None
-
+
+ Delete
+
+
+
+ To:
+
+
+
None
-
+
None
-
+
None
@@ -6419,11 +6518,11 @@
None
-
- Feature info
+
+ Connections
-
+
None
@@ -6434,11 +6533,11 @@
Basic info
-
- Basic info
+
+ Close
-
+
None
@@ -6450,11 +6549,11 @@
Accept
-
- Close
+
+ Basic info
-
+
None
@@ -6465,19 +6564,19 @@
New workcat
-
- Link:
+
+ New workcat
-
- Link
+
+ None
-
- Work id key 2:
+
+ Work id key 1:
-
+
None
@@ -6489,43 +6588,43 @@
Accept
-
- Description:
+
+ Link:
-
- None
+
+ Link
-
- Cancel
+
+ Work id key 2:
-
+
None
-
- Work id key 1:
+
+ Built date:
-
+
None
-
- New workcat
+
+ Description:
-
+
None
-
- Built date:
+
+ Cancel
-
+
None
@@ -6555,35 +6654,28 @@
mapzone_manager
-
- Show inactive
-
-
-
- Show inactive
+
+ Toggle active
-
-
- mincut
-
- Mincut
+
+ Toggle active
-
- Chlorine:
+
+ Update
-
- None
+
+ Update
-
- Location
+
+ Filter by: Mapzone name
-
- None
+
+ Filter by: Mapzone name
@@ -6594,108 +6686,115 @@
Cancel
-
- Cause:
+
+ Delete
-
- None
+
+ Delete
-
- Distance from plot:
+
+ Show all mapzones
-
- None
+
+ Show all mapzones
-
- State:
+
+
-
- None
+
+ Execute mapzone analysis process
-
- From:
+
+ Create
-
- None
+
+ Create
-
- No results found
+
+ Config
-
- None
+
+ Configure
-
- To:
+
+ Show inactive
-
- None
+
+ Show inactive
+
+
+ mincut
-
- Description:
+
+ Mincut
-
+
+ Distance from plot:
+
+
+
None
-
- Accept
+
+ End
-
- Accept
+
+ None
-
- Turbidity:
+
+ Location
-
+
None
-
- Id:
+
+ Type:
-
+
None
-
- Description:
+
+ Start
-
+
None
-
- Work order:
+
+ Id:
-
+
None
-
- Use planified network
+
+ Accept
-
- None
+
+ Accept
@@ -6721,6 +6820,38 @@
None
+
+
+ Exec user:
+
+
+
+ None
+
+
+
+ Use planified network
+
+
+
+ None
+
+
+
+ Description:
+
+
+
+ None
+
+
+
+ To:
+
+
+
+ None
+
Forecasted dates
@@ -6730,11 +6861,43 @@
None
-
- Details
+
+ From:
+
+
+
+ None
+
+
+
+ State:
+
+
+
+ None
+
+
+
+ No results found
+
+
+
+ None
+
+
+
+ Work order:
+
+
+
+ None
+
+
+
+ Chlorine:
-
+
None
@@ -6746,29 +6909,37 @@
None
-
- Start
+
+ Cause:
-
+
None
-
- Exec user:
+
+ Details
-
+
None
-
- Type:
+
+ Description:
-
+
None
+
+
+ Cancel
+
+
+
+ Cancel
+
Received date:
@@ -6802,11 +6973,11 @@
None
-
- End
+
+ Turbidity:
-
+
None
@@ -6817,20 +6988,28 @@
Mincut composer
-
- Template:
+
+ Open
-
+
None
-
- Cancel
+
+ Mincut composer
-
- Cancel
+
+ None
+
+
+
+ Template:
+
+
+
+ None
@@ -6849,20 +7028,12 @@
None
-
- Mincut composer
-
-
-
- None
-
-
-
- Open
+
+ Cancel
-
- None
+
+ Cancel
@@ -6880,36 +7051,36 @@
None
-
- Accept
+
+ None
-
- Accept
+
+ Snapping
-
- None
+
+ Search by customer code:
-
- Insert
+
+ None
-
+
None
-
- Snapping
+
+ Insert
-
- Search by customer code:
+
+ Accept
-
- None
+
+ Accept
@@ -6927,19 +7098,35 @@
Mincut end
-
- Executed by:
+
+ Accept
-
+
+ Accept
+
+
+
+ To:
+
+
+
None
-
- Number:
+
+ Close mincut
-
+
+ None
+
+
+
+ Cancel
+
+
+
None
@@ -6951,11 +7138,11 @@
None
-
- To:
+
+ Work order:
-
+
None
@@ -6966,14 +7153,6 @@
None
-
-
- Set real location
-
-
-
- None
-
Start hour:
@@ -6983,19 +7162,19 @@
None
-
- Cancel
+
+ Number:
-
+
None
-
- Close mincut
+
+ Municipality:
-
+
None
@@ -7007,43 +7186,35 @@
None
-
- Municipality:
+
+ End hour:
-
+
None
-
- Mincut:
+
+ Executed by:
-
+
None
-
- Accept
-
-
-
- Accept
-
-
-
- End hour:
+
+ Mincut:
-
+
None
-
- Work order:
+
+ Set real location
-
+
None
@@ -7054,43 +7225,35 @@
Mincut hydrometer
-
- Hydrometer customer code:
-
-
-
- None
+
+ Accept
-
- Connec customer code:
+
+ Accept
-
- None
+
+ Mincut hydrometer
-
+
None
-
- Insert
-
-
-
- Accept
+
+ Connec customer code:
-
- Accept
+
+ None
-
- Mincut hydrometer
+
+ Hydrometer customer code:
-
+
None
@@ -7101,6 +7264,14 @@
Delete
+
+
+ None
+
+
+
+ Insert
+
mincut_manager
@@ -7109,59 +7280,43 @@
Mincut management
-
- Next days
-
-
-
- None
-
-
-
- Exploitation:
-
-
-
+
None
-
- Mincut management
-
-
-
+
None
-
- Type:
+
+ Close
-
+
None
-
- To:
+
+ Delete
-
+
None
-
- Streetaxis:
+
+ Filter by:
-
+
None
-
- Delete
+
+ To:
-
+
None
@@ -7172,6 +7327,14 @@
None
+
+
+ Exploitation:
+
+
+
+ None
+
State:
@@ -7181,27 +7344,27 @@
None
-
- Filter by:
+
+ Next days
-
+
None
-
- Close
+
+ Send sms
-
+
None
-
- None
+
+ Type:
-
+
None
@@ -7221,47 +7384,47 @@
None
-
- Send sms
+
+ Mincut management
-
+
None
-
-
- netscenario_manager
-
- Current netscenario
+
+ Streetaxis:
-
- Current netscenario
+
+ None
+
+
+ netscenario_manager
-
- Show inactive
+
+ Create
-
- Show inactive
+
+ Create
-
- Duplicate
+
+ Filter by: Netscenario name
-
- Duplicate
+
+ Filter by: Netscenario name
-
- Close
+
+ Update
-
- Close
+
+ Update
@@ -7272,36 +7435,36 @@
Delete
-
- Update
+
+ Close
-
- Update
+
+ Close
-
- Filter by: Netscenario name
+
+
-
- Filter by: Netscenario name
+
+ Load Giswater layer
-
- Create
+
+ Current netscenario
-
- Create
+
+ Current netscenario
-
-
+
+ Duplicate
-
- Execute mapzones analysis
+
+ Duplicate
@@ -7312,12 +7475,20 @@
Toggle active
-
+
-
- Load Giswater layer
+
+ Execute mapzones analysis
+
+
+
+ Show inactive
+
+
+
+ Show inactive
@@ -7343,11 +7514,11 @@
Accept
-
- Change node type
+
+ Current node type:
-
+
None
@@ -7359,19 +7530,19 @@
None
-
- Current node type:
+
+ Catalog id:
-
+
None
-
- Catalog id:
+
+ Change node type
-
+
None
@@ -7389,68 +7560,20 @@
plan_psector
-
- Text 2:
-
-
-
- None
-
-
-
- Type:
-
-
-
- None
-
-
-
- Workcat id:
-
-
-
- None
-
-
-
- Remove
-
-
-
-
-
-
-
- VAT:
-
-
-
- None
-
-
-
- Total nodes:
+
+ Priority:
-
+
None
-
- Total arcs:
-
-
-
+
None
-
- Text 3:
-
-
-
- None
+
+ Select features
@@ -7461,147 +7584,147 @@
Set arc_id (only ARC exit_type)
-
- Scale:
+
+ VAT:
-
+
None
-
- Status:
+
+ General expenses
-
+
None
-
- Rotation:
+
+ Generate rapports
-
- None
+
+
-
- Text 1:
+
+ Select
-
- None
+
+
-
- Parent id:
+
+ Select
-
- None
+
+
-
+
None
-
-
- Insert
+
+
+ Replace on service for planified arc
-
- Cancel
+
+ Other expenses
-
-
+
+ None
-
- Exploitation:
+
+ Num value:
-
-
+
+ None
-
- Accept
+
+ Text 6:
-
-
+
+ None
-
- Observation:
+
+ Text 5:
-
+
None
-
- Descript:
+
+ Text 4:
-
-
+
+ None
-
- Active
+
+ Text 3:
-
-
+
+ None
-
- Name:
+
+ None
-
- None
+
+ Arc fusion with planified arcs
-
- Enable all (visualize obsolete state on features related to psector)
+
+ Scale:
-
-
+
+ None
-
- Map details
+
+ Rotation:
-
-
+
+ None
-
- Generate rapports
+
+ Remove
-
+
-
- Select
+
+ Cancel
-
+
-
- Select
+
+ Accept
-
+
@@ -7613,20 +7736,28 @@
-
+
+ Parent id:
+
+
+
None
-
- Replace on service for planified arc
+
+ Observation:
-
+
None
-
- Delete
+
+ Name:
+
+
+
+ None
@@ -7637,44 +7768,44 @@
None
-
- Other expenses
+
+ Workcat id:
-
+
None
-
- None
+
+ Type:
-
- Arc fusion with planified arcs
+
+ None
-
- General expenses
+
+ Text 2:
-
+
None
-
- Priority:
+
+ Text 1:
-
+
None
-
- None
+
+ Status:
-
- Select features
+
+ None
@@ -7685,137 +7816,137 @@
None
-
- Num value:
-
-
-
+
None
-
- Text 6:
+
+ Insert
-
- None
+
+ Map details
-
- Text 5:
+
+
-
- None
+
+ Enable all (visualize obsolete state on features related to psector)
-
- Text 4:
+
+
-
- None
+
+ Active
-
-
- price_manager
-
- Price result management
+
+
-
- Close
+
+ Descript:
-
- None
+
+
-
- Delete
+
+ Exploitation:
-
- None
+
+
-
- Price result management
+
+ Total nodes:
-
+
None
-
- Current result
+
+ Total arcs:
-
+
None
-
- Filter by:
+
+ None
-
- None
+
+ Delete
- priority
+ price_manager
- Priority Calculation
+ Price result management
-
- Priority Calculation
+
+ Filter by:
-
+
None
-
- Engine
+
+ Delete
-
+
None
-
- Info Log
+
+ Current result
-
+
None
-
- Result name:
+
+ Close
-
+
None
-
- Calculation parameters
+
+ Price result management
-
+
None
+
+
+ priority
+
+
+ Priority Calculation
+
-
- Calculation
+
+ Exploitation:
-
+
None
@@ -7826,6 +7957,14 @@
None
+
+
+ Catalog
+
+
+
+ None
+
Yearly budget:
@@ -7843,51 +7982,51 @@
None
-
- None
+
+ Info Log
-
- Select features on canvas
+
+ None
-
- Material:
+
+ None
-
- None
+
+ Select features on canvas
-
- Exploitation:
+
+ Calculate
-
+
None
-
- Description:
+
+ Result name:
-
+
None
-
- Calculate
+
+ Presszone:
-
+
None
-
- Horizon year:
+
+ Engine
-
+
None
@@ -7899,11 +8038,11 @@
None
-
- Presszone:
+
+ Description:
-
+
None
@@ -7923,50 +8062,66 @@
None
-
- Catalog
+
+ Priority Calculation
-
+
None
-
-
- priority_manager
-
- Results Manager
+
+ Horizon year:
-
- Info:
+
+ None
-
+
+ Calculation parameters
+
+
+
None
-
- Status:
+
+ Calculation
-
+
None
-
+
+ Material:
+
+
+
+ None
+
+
+
+ priority_manager
+
+
Results Manager
-
+
+ Status:
+
+
+
None
-
- Filter by: Result name
+
+ Edit
-
+
None
@@ -7978,27 +8133,27 @@
None
-
- Delete
+
+ Duplicate
-
+
None
-
- Close
+
+ Exploitation:
-
+
None
-
- Exploitation:
+
+ Close
-
+
None
@@ -8010,19 +8165,35 @@
None
-
- Duplicate
+
+ Info:
-
+
None
-
- Edit
+
+ Filter by: Result name
-
+
+ None
+
+
+
+ Delete
+
+
+
+ None
+
+
+
+ Results Manager
+
+
+
None
@@ -8033,27 +8204,27 @@
Draw profile
-
- None
+
+ Add end point
-
+
None
-
- Title:
+
+ Add additional point
-
+
None
-
- End point:
+
+ Profile id:
-
+
None
@@ -8065,75 +8236,75 @@
None
-
- Add end point
+
+ Save profile
-
+
None
-
- Add additional point
+
+ Template:
-
+
None
-
- Profile id:
+
+ End point:
-
+
None
-
- Load profile
+
+ Rotation:
-
+
None
-
- Additional point:
+
+ Title:
-
+
None
-
+
Draw profile
-
+
None
-
- Path:
+
+ Clear profile
-
+
None
-
- Close
+
+ ...
-
+
None
-
- Add start point
+
+ Vertical scale:
-
+
None
@@ -8145,19 +8316,19 @@
None
-
- Vertical scale:
+
+ Add start point
-
+
None
-
- Draw profile
+
+ None
-
+
None
@@ -8169,43 +8340,43 @@
None
-
- Rotation:
+
+ Load profile
-
+
None
-
- Template:
+
+ Draw profile
-
+
None
-
- Save profile
+
+ Close
-
+
None
-
- ...
+
+ Additional point:
-
+
None
-
- Clear profile
+
+ Path:
-
+
None
@@ -8263,19 +8434,19 @@
Accept
-
- Check project
+
+ Database log
-
+
None
-
- Database log
+
+ Check project
-
+
None
@@ -8286,27 +8457,19 @@
Duplicate psector
-
- Info log
-
-
-
- None
-
-
-
- Cancel
+
+ Duplicate psector
-
+
None
-
- Duplicate psector:
+
+ Info log
-
+
None
@@ -8318,12 +8481,12 @@
None
-
- Accept
+
+ Duplicate psector:
-
- Accept
+
+ None
@@ -8334,13 +8497,21 @@
None
-
- Duplicate psector
+
+ Cancel
-
+
None
+
+
+ Accept
+
+
+
+ Accept
+
psector_manager
@@ -8348,14 +8519,6 @@
Psector management
-
-
- Current psector
-
-
-
- None
-
Merge
@@ -8365,35 +8528,43 @@
To merge various psectors into only one, you have to previously select them using Ctrl and then click this button
-
- Toggle active
+
+ Filter by:
-
+
None
-
- Delete
+
+ Duplicate
-
+
None
-
- Filter by:
+
+ Current psector
-
+
None
-
- Duplicate
+
+ Delete
-
+
+ None
+
+
+
+ Psector management
+
+
+
None
@@ -8405,19 +8576,19 @@
Show inactive
-
- Close
+
+ Toggle active
-
+
None
-
- Psector management
+
+ Close
-
+
None
@@ -8428,19 +8599,27 @@
Psector rapport
-
- Template:
+
+ Detail csv file:
-
+
None
-
- Create
+
+ ...
-
+
+ None
+
+
+
+ Composer disabled
+
+
+
None
@@ -8452,27 +8631,27 @@
None
-
- Cancel
+
+ Rapport
-
- Cancel
+
+ None
-
- Composer disabled
+
+ Cancel
-
- None
+
+ Cancel
-
- ...
+
+ Prices list csv file:
-
+
None
@@ -8484,27 +8663,19 @@
None
-
- Rapport
-
-
-
- None
-
-
-
- Prices list csv file:
+
+ Create
-
+
None
-
- Detail csv file:
+
+ Template:
-
+
None
@@ -8515,11 +8686,19 @@
Result Selector
-
- Description:
+
+ Result
-
+
+ None
+
+
+
+ Cancel
+
+
+
None
@@ -8531,11 +8710,11 @@
None
-
- Cancel
+
+ Result Selector
-
+
None
@@ -8547,11 +8726,11 @@
None
-
- Result
+
+ Description:
-
+
None
@@ -8570,14 +8749,6 @@
None
-
-
- Result Selector
-
-
-
- None
-
search
@@ -8585,6 +8756,14 @@
SearchPlus
+
+
+ SearchPlus
+
+
+
+ None
+
No results found
@@ -8601,14 +8780,6 @@
None
-
-
- SearchPlus
-
-
-
- None
-
search_workcat
@@ -8617,11 +8788,11 @@
Workcat search
-
- ...
+
+ Filter by:
-
+
None
@@ -8633,19 +8804,11 @@
None
-
- Destination path:
-
-
-
- None
-
-
-
- Documents
+
+ ...
-
+
None
@@ -8665,51 +8828,51 @@
None
-
- Activate
+
+ Filter by:
-
+
None
-
- Total numbers:
+
+ Documents
-
+
None
-
- Filter by:
+
+ Total numbers:
-
+
None
-
- Activate
+
+ Features installed with the selected workcat
-
+
None
-
- Removed
+
+ Workcat search
-
+
None
-
- Workcat search
+
+ Activate
-
+
None
@@ -8720,6 +8883,14 @@
None
+
+
+ Removed
+
+
+
+ None
+
Total numbers:
@@ -8729,19 +8900,19 @@
None
-
- Features installed with the selected workcat
+
+ Activate
-
+
None
-
- Filter by:
+
+ Destination path:
-
+
None
@@ -8752,12 +8923,12 @@
Selector
-
- Close
+
+ Selector
-
- Close
+
+ None
@@ -8765,14 +8936,14 @@
- None
+ Close
-
- Selector
+
+ Close
-
+
None
@@ -8782,6 +8953,22 @@
Status Selector
+
+
+ Accept
+
+
+
+ None
+
+
+
+ New status:
+
+
+
+ None
+
Status Selector
@@ -8790,6 +8977,14 @@
None
+
+
+ Cancel
+
+
+
+ None
+
You are changing the status of the following result:
@@ -8798,29 +8993,88 @@
None
+
+
+ style_manager
- Cancel
+ Close
- None
+ Close
-
- New status:
+
+ Update style
-
- None
+
+ Updates the selected layer style with the style in the corresponding project layer
-
- Accept
+
+
-
- None
+
+ Delete selected category
+
+
+
+
+
+
+
+ Add new category
+
+
+
+ Delete style
+
+
+
+ Removes a style from the category
+
+
+
+
+
+
+
+ All your style categories
+
+
+
+
+
+
+
+ Introduce the layer name to filter
+
+
+
+ Filter by: Layer name
+
+
+
+
+
+
+
+ Refresh all
+
+
+
+ Reloads the styles loaded into the project
+
+
+
+ Add style
+
+
+
+ Adds a layer to the selected category
@@ -8838,19 +9092,19 @@
None
-
- Close
+
+ Cancel
-
+
None
-
- Cancel
+
+ Toolbox
-
+
None
@@ -8862,19 +9116,19 @@
None
-
- Toolbox
+
+ Config
-
+
None
-
- Config
+
+ Close
-
+
None
@@ -8900,107 +9154,107 @@
Visit
-
- None
+
+ Event
-
- Create new document
+
+ None
-
- Relations
+
+ None
-
- Relations
+
+ Open document
-
- Feature type:
+
+ Add geom
-
+
None
-
- None
+
+ Info:
-
- Insert document
+
+ None
-
- Cancel
+
+ Feature type:
-
+
None
-
- Document
+
+ To:
-
+
None
-
- Code:
-
-
-
+
None
-
- Event
+
+ Create new document
-
+
None
-
- User name:
+
+ Delete document
-
+
+ Delete event
+
+
+
None
-
- From:
+
+ Insert event
-
+
None
-
- Accept
+
+ Update event
-
- Accept
+
+ None
-
- Status:
+
+ None
-
+
None
-
- Description:
+
+ None
-
+
None
@@ -9012,116 +9266,116 @@
None
-
- None
+
+ Description:
-
+
None
-
- Id:
+
+ Status:
-
+
None
-
- Visit
+
+ From:
-
+
None
-
- None
+
+ Relations
-
- Open document
+
+ Relations
-
- Visit
+
+ Code:
-
+
None
-
- None
+
+ Document
-
+
None
-
- Update event
+
+ User name:
-
+
None
-
- Insert event
+
+ Visit cat id:
-
+
None
-
- Delete event
+
+ Cancel
-
+
None
-
- Info:
+
+ None
-
- None
+
+ Insert document
-
- None
+
+ Id:
-
- Delete document
+
+ None
-
- Visit cat id:
+
+ Visit
-
+
None
-
- To:
+
+ Visit
-
+
None
-
- Add geom
+
+ Accept
-
- None
+
+ Accept
@@ -9130,6 +9384,14 @@
Load documents
+
+
+ Load documents
+
+
+
+ None
+
Visit id:
@@ -9146,14 +9408,6 @@
None
-
-
- Load documents
-
-
-
- None
-
visit_event
@@ -9162,27 +9416,27 @@
Standard arc event
-
- Parameter id:
+
+ Delete file
-
+
None
-
- Files:
+
+ Standard arc event
-
+
None
-
- Position id:
+
+ Value:
-
+
None
@@ -9194,43 +9448,43 @@
None
-
- Delete file
+
+ Parameter id:
-
+
None
-
- Text:
+
+ Position value:
-
+
None
-
- Position value:
+
+ Position id:
-
+
None
-
- Standard arc event
+
+ Files:
-
+
None
-
- Value:
+
+ Text:
-
+
None
@@ -9241,27 +9495,19 @@
Event
-
- Geom 3:
-
-
-
- None
-
-
-
- Value 2:
+
+ Close
-
+
None
-
- Value:
+
+ Is last:
-
+
None
@@ -9273,27 +9519,19 @@
None
-
- Is last:
-
-
-
- None
-
-
-
- Index val:
+
+ Value:
-
+
None
-
- X coord:
+
+ Value 2:
-
+
None
@@ -9304,14 +9542,6 @@
None
-
-
- Info
-
-
-
- None
-
Value 1:
@@ -9321,12 +9551,12 @@
None
-
- Y coord:
+
+ Visit id:
-
- None
+
+ Visit ID
@@ -9368,14 +9598,6 @@
None
-
-
- Visit id:
-
-
-
- Visit ID
-
Event code:
@@ -9416,6 +9638,30 @@
None
+
+
+ Geom 3:
+
+
+
+ None
+
+
+
+ Y coord:
+
+
+
+ None
+
+
+
+ X coord:
+
+
+
+ None
+
Text:
@@ -9425,11 +9671,19 @@
None
-
- Close
+
+ Info
+
+
+
+ None
+
+
+
+ Index val:
-
+
None
@@ -9440,51 +9694,51 @@
Rehabilitation arc event
-
- Rehabilitation arc event
+
+ Delete file
-
+
None
-
- Delete file
+
+ Value 2:
-
+
None
-
- Parameter id:
+
+ Text:
-
+
None
-
- Files:
+
+ Position id:
-
+
None
-
- Geom 1:
+
+ Parameter id:
-
+
None
-
- Add file
+
+ Geom 2:
-
+
None
@@ -9496,11 +9750,11 @@
None
-
- Value 1:
+
+ Add file
-
+
None
@@ -9512,35 +9766,35 @@
None
-
- Geom 2:
+
+ Geom 1:
-
+
None
-
- Position id:
+
+ Rehabilitation arc event
-
+
None
-
- Value 2:
+
+ Files:
-
+
None
-
- Text:
+
+ Value 1:
-
+
None
@@ -9559,20 +9813,20 @@
None
-
+
None
-
+
None
-
- Visit id:
+
+ None
-
- Visit ID
+
+ None
@@ -9591,12 +9845,12 @@
None
-
- None
+
+ Visit id:
-
- None
+
+ Visit ID
@@ -9606,19 +9860,11 @@
Gallery zoom
-
- Event id:
-
-
-
- None
-
-
-
- lbl_img_zoom
+
+ Gallery zoom
-
+
None
@@ -9630,27 +9876,35 @@
Visit ID
-
- Gallery zoom
+
+ Event id:
-
+
None
-
+
None
-
+
None
-
+
+ lbl_img_zoom
+
+
+
None
-
+
+ None
+
+
+
None
@@ -9661,12 +9915,12 @@
Add picture
-
- Link:
+
+ Cancel
-
- Link
+
+ None
@@ -9677,79 +9931,79 @@
Accept
-
- Add picture
+
+ ...
-
+
None
-
- ...
+
+ Link:
-
- None
+
+ Link
-
- Cancel
+
+ Add picture
-
+
None
workspace_create
-
- txt_workspace_name
+
+ Workspace name:
-
- Workspace name *Required
+
+ Workspace name
-
- Description:
+
+ Accept
-
- Workspace description
+
+ None
-
- Cancel
+
+ Update
-
+
None
-
- txt_workspace_descript
+
+ Description:
-
- Use this to describe what the workspace is used for
+
+ Workspace description
-
- Update
+
+ txt_workspace_descript
-
- None
+
+ Use this to describe what the workspace is used for
-
- Accept
+
+ txt_workspace_name
-
- None
+
+ Workspace name *Required
@@ -9760,16 +10014,24 @@
None
-
- Workspace name:
+
+ Cancel
-
- Workspace name
+
+ None
workspace_manager
+
+
+ Close
+
+
+
+ None
+
Reset workspace
@@ -9778,6 +10040,14 @@
Reset the values of the current workspace
+
+
+ Filter by: Workspace name
+
+
+
+ None
+
Delete
@@ -9787,20 +10057,20 @@
Delete the selected workspace
-
- Filter by: Workspace name
+
+ Create
-
- None
+
+ Create
-
- Close
+
+ txt_name
-
- None
+
+ Workspace name
@@ -9818,22 +10088,6 @@
Set the current workspace
-
-
- txt_name
-
-
-
- Workspace name
-
-
-
- Create
-
-
-
- Create
-
diff --git a/i18n/giswater_es_ES.qm b/i18n/giswater_es_ES.qm
index 57858127f..f115a0cfc 100644
Binary files a/i18n/giswater_es_ES.qm and b/i18n/giswater_es_ES.qm differ
diff --git a/i18n/giswater_es_ES.ts b/i18n/giswater_es_ES.ts
index 091a84f5b..e1c0a14fb 100644
--- a/i18n/giswater_es_ES.ts
+++ b/i18n/giswater_es_ES.ts
@@ -80,10 +80,6 @@
Gestor de elementos
-
-
- Mundo epa
-
Gestor de resultados
@@ -132,6 +128,10 @@
Filtro de lotes
+
+
+ Estilos Giswater
+
Conexión con comercial
@@ -2298,11 +2298,11 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
admin_addfields
-
- Texto de consulta:
+
+ Tipo dato:
-
+
None
@@ -2314,59 +2314,59 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
None
-
- Tipo formulario:
+
+ Filtro texto consulta:
-
+
None
-
- Tipo dato:
+
+ Número decimales:
-
+
None
-
- No actualizado:
+
+ Recargar campo:
-
+
None
-
- Número decimales:
+
+ Abrir
-
+
None
-
- Recargar campo:
+
+ Editabilidad:
-
+
None
-
- Filtro texto consulta:
+
+ Actualizar
-
+
None
-
- Crear
+
+ Tipo formulario:
-
+
None
@@ -2378,44 +2378,44 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
None
-
- Diálogo
+
+ Nombre columna:
-
+
None
-
- Mecanografiar:
+
+ Borrar
-
+
None
-
- Tooltip:
+
+ Crear
-
+
None
-
- Borrar
+
+ Tipo de widget:
-
+
None
-
- Controles del widget:
+
+ Texto de consulta:
-
- Ejemplo de la configuración {"widgetdim": 150,"setMultiline":true,"vdefault": "01-01-2014", "filterSign": ">}
+
+ None
@@ -2426,51 +2426,59 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
Cancelar
-
- Nombre del campo:
+
+ Función del widget:
-
+
None
-
- Tipo de widget:
+
+ Auto actualizable:
-
+
None
-
- Actualizar
+
+ Controles del widget:
-
+
+ Ejemplo de la configuración {"widgetdim": 150,"setMultiline":true,"vdefault": "01-01-2014", "filterSign": ">}
+
+
+
+ Nombre del campo:
+
+
+
None
-
- Hoja de estilo:
+
+ Activo:
-
+
None
-
- Marcador de posición
+
+ Mecanografiar:
-
+
None
-
- Editabilidad:
+
+ Tooltip:
-
+
None
@@ -2482,27 +2490,19 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
Aceptar
-
- Objeto vinculado:
-
-
-
- None
-
-
-
- Abrir
+
+ Hoja de estilo:
-
+
None
-
- Función del widget:
+
+ Marcador de posición
-
+
None
@@ -2522,83 +2522,83 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
None
-
- Longitud campo:
+
+ Valor nulo:
-
+
None
-
- Función de acción:
+
+ Editable:
-
+
None
-
- Activo:
+
+ Objeto vinculado:
-
+
None
-
- Nombre columna:
+
+ Función de acción:
-
+
None
-
- Auto actualizable:
+
+ Diálogo
-
+
None
-
- Valor nulo:
+
+ Configuración obligatoria de campos añadidos
-
+
None
-
- Editable:
+
+ Habilitado:
-
+
None
-
- Configuración obligatoria de campos añadidos
+
+ Longitud campo:
-
+
None
-
- Habilitado:
+
+ Obligatorio:
-
+
None
-
- Obligatorio:
+
+ No actualizado:
-
+
None
@@ -2613,19 +2613,27 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
Aceptar
-
- Conexión:
+
+ Nombre de usuario:
-
+
None
-
- Nombre de usuario:
+
+ Diálogo
-
+
+ None
+
+
+
+ Conexión:
+
+
+
None
@@ -2644,14 +2652,6 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
None
-
-
- Diálogo
-
-
-
- None
-
admin_dbproject
@@ -2664,108 +2664,108 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
Nombre de un esquema nuevo. El nombre debe escribirse en minúsculas, utilizando solo letras del alfabeto inglés y sin espacios ni guiones
-
- Idioma:
+
+ Filtrar SRID:
-
- Idioma del esquema
+
+ Identificador de la referencia espacial. Solo se permiten los valores que se muestran en la tabla
-
- Aceptar
+
+ Tipo de proyecto:
-
- Aceptar
+
+ None
-
- Crear esquema de proyecto
+
+ Descripción:
-
+
None
-
- ...
+
+ Importar datos INP
-
+
None
-
- Cerrar
+
+ Fuente de datos:
-
- Cerrar
+
+ None
-
- Filtrar SRID:
+
+ Sin datos
-
- Identificador de la referencia espacial. Solo se permiten los valores que se muestran en la tabla
+
+ None
-
- Tipo de proyecto:
+
+ Ejemplo inventario
-
+
None
-
- Descripción:
+
+ Ejemplo completo
-
+
None
-
- Importar datos INP
+
+ Cerrar
-
- None
+
+ Cerrar
-
- Fuente de datos:
+
+ Idioma:
-
- None
+
+ Idioma del esquema
-
- Sin datos
+
+ ...
-
+
None
-
- Ejemplo inventario
+
+ Crear esquema de proyecto
-
+
None
-
- Ejemplo completo
+
+ Aceptar
-
- None
+
+ Aceptar
@@ -2779,21 +2779,29 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
admin_gisproject
-
- Aceptar
+
+ Nombre archivo QGIS:
-
- Aceptar
+
+ None
-
- Nombre archivo QGIS:
+
+ ...
-
+
None
+
+
+ Aceptar
+
+
+
+ Aceptar
+
Carpeta:
@@ -2818,14 +2826,6 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
None
-
-
- ...
-
-
-
- None
-
Crear proyecto QGIS
@@ -2845,22 +2845,6 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
admin_importinp
-
-
- Ejecutar
-
-
-
- None
-
-
-
- Cerrar
-
-
-
- Cerrar
-
Parámetros de configuración
@@ -2878,32 +2862,32 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
None
-
- Configuración
+
+ Cerrar
-
- None
+
+ Cerrar
-
-
- admin_projectinfo
-
- Información sobre nuevas actualizaciones
+
+ Configuración
-
+
None
-
- Actualizar SQL
+
+ Ejecutar
-
+
None
+
+
+ admin_projectinfo
Cerrar
@@ -2920,17 +2904,25 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
None
-
-
- admin_qtdialog
-
- Cancelar
+
+ Actualizar SQL
-
- Cancelar
+
+ None
+
+
+
+ Información sobre nuevas actualizaciones
+
+
+
+ None
+
+
+ admin_qtdialog
Ruta UI
@@ -2940,12 +2932,20 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
None
-
- Nombre formulario:
+
+ Cancelar
-
- None
+
+ Cancelar
+
+
+
+ Aceptar
+
+
+
+ Aceptar
@@ -2963,6 +2963,17 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
None
+
+
+ Nombre formulario:
+
+
+
+ None
+
+
+
+ admin_renameproj
Aceptar
@@ -2971,9 +2982,14 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
Aceptar
-
-
- admin_renameproj
+
+
+ Renombrar proyecto
+
+
+
+ None
+
Por favor, configure un nuevo nombre de proyecto:
@@ -2990,12 +3006,15 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
Cancelar
+
+
+ admin_sysfields
-
- Renombrar proyecto
+
+ Marcador de posición:
-
+
None
@@ -3006,15 +3025,12 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
Aceptar
-
-
- admin_sysfields
-
- Id columna:
+
+ Configuracíon adicional
-
+
None
@@ -3026,168 +3042,168 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
None
-
- Cancelar
+
+ Hoja de estilo:
-
- Cancelar
+
+ None
-
- Controles del widget:
+
+ Diálogo
-
- Ejemplo de configuration keys {"widgetdim": 150,"setMultiline":true,"vdefault": "01-01-2014", "filterSign": ">}
+
+ None
-
- Abrir
+
+ Configuracíon básica
-
+
None
-
- Obligatorio:
+
+ Crear
-
+
None
-
- Orden de diseño:
+
+ Abrir
-
+
None
-
- Configuracíon adicional
+
+ Id columna:
-
+
None
-
- Nombre de diseño:
+
+ Editabilidad:
-
+
None
-
- Etiqueta:
+
+ Editable:
-
+
None
-
- Oculto:
+
+ Habilitado:
-
+
None
-
- Nombre formulario:
+
+ Controles del widget:
-
- None
+
+ Ejemplo de configuration keys {"widgetdim": 150,"setMultiline":true,"vdefault": "01-01-2014", "filterSign": ">}
-
- Aceptar
+
+ Nombre formulario:
-
- Aceptar
+
+ None
-
- Habilitado:
+
+ Cancelar
-
- None
+
+ Cancelar
-
- Editable:
+
+ Oculto:
-
+
None
-
- Configuracíon básica
+
+ Etiqueta:
-
+
None
-
- Tooltip:
+
+ Nombre de diseño:
-
+
None
-
- Crear
+
+ Orden de diseño:
-
+
None
-
- Marcador de posición:
+
+ Obligatorio:
-
+
None
-
- Diálogo
+
+ Tooltip:
-
+
None
+
+
+ admin_translation
-
- Editabilidad:
+
+ Traducir formularios y mensajes python
-
+
None
-
- Hoja de estilo:
+
+ Traducir archivos
-
+
None
-
-
- admin_translation
Información de la conexión
@@ -3205,19 +3221,19 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
None
-
- Traducir archivos
+
+ Código fuente:
-
+
None
-
- Anfitrión:
+
+ Probar conexión
-
+
None
@@ -3229,19 +3245,11 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
None
-
- Puerto:
-
-
-
- None
-
-
-
- Código fuente:
+
+ Usuario:
-
+
None
@@ -3253,35 +3261,27 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
None
-
- Usuario:
-
-
-
- None
-
-
-
- Traducir formularios y mensajes python
+
+ Anfitrión:
-
+
None
-
- Probar conexión
+
+ Base de datos:
-
+
None
-
- Base de datos:
+
+ Puerto:
-
+
None
@@ -3296,83 +3296,35 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
None
-
- Administrador de Api
-
-
-
- None
-
-
-
- Actualizar Esquema
-
-
-
- Actualizar version del esquema seleccionado
-
-
-
- Avanzado
-
-
-
- None
-
-
-
- Usar restricciones:
-
-
-
- None
-
-
-
- Archivos de traduccion
-
-
-
- None
-
-
-
- Ruta UI:
+
+ Nombre del elemento:
-
+
None
-
- Copiar
-
-
-
- Copiar el esquema de base de datos seleccionado
-
-
-
- Crear
+
+ Nombre del elemento:
-
+
None
-
- Archivo a BBDD
+
+ Importar
-
+
None
-
- Crear
+
+ Administrador de campos
-
+
None
@@ -3391,14 +3343,6 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
Crear, configurar o eliminar un campo adicional relacionado con un tipo de entidad seleccionada o para todos los tipos de elementos definidos en un proyecto.
-
-
- Importar
-
-
-
- None
-
Actualizar
@@ -3416,28 +3360,28 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
None
-
- Restricciones
+
+ Conexión
-
+
None
-
- Conexión
+
+ Visita
-
- None
+
+ Crear, configurar o eliminar la definición de visita relacionada con un tipo de entidad seleccionada o para todos los tipos de elemetnos definidos en un proyecto.
-
- Administrador de campos
+
+ Cargar archivo personalizado
-
- None
+
+ Seleccione una carpeta con archivos .sql que desee ejecutar en un esquema seleccionado
@@ -3447,14 +3391,6 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
None
-
-
- Cargar archivo personalizado
-
-
-
- Seleccione una carpeta con archivos .sql que desee ejecutar en un esquema seleccionado
-
Actualizar
@@ -3464,227 +3400,227 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
None
-
- Exportar
+
+ ...
-
+
None
-
- ...
+
+ Cargar archivo
-
+
None
-
- Renombrar
+
+ Información del esquema del proyecto
-
- Renombrar el esquema de base de datos seleccionado
+
+ None
-
- General
+
+ Administrar UI
-
+
None
-
- Crear
+
+ Crear archivo proyecto QGIS
-
+
None
-
- Nombre del elemento:
+
+ Nombre conexión:
-
- None
+
+ Nombre de la conexión de base de datos definida en QGIS
-
- Nombre del elemento:
+
+ Plantillas QGIS
-
+
None
-
- Borrar
+
+ Recargar funciones:
-
+
None
-
- Administrador de esquema
+
+ ...
-
+
None
-
- Actualizar
+
+ Borrar
-
- None
+
+ Eliminar el esquema de base de datos seleccionado
-
- Nombre del elemento:
+
+ Ejecutar
-
+
None
-
- Crear archivo proyecto QGIS
+
+ Crear
-
+
None
-
- Nombre del formulario:
+
+ Crear
-
+
None
-
- Cerrar
+
+ Archivo a BBDD
-
- Cerrar
+
+ None
-
- Nombre conexión:
+
+ Actualizar
-
- Nombre de la conexión de base de datos definida en QGIS
+
+ None
-
- Visita
+
+ Borrar
-
- Crear, configurar o eliminar la definición de visita relacionada con un tipo de entidad seleccionada o para todos los tipos de elemetnos definidos en un proyecto.
+
+ None
-
- Cargar archivo
+
+ Crear esquema proyecto BBDD
-
+
None
-
- Nombre:
+
+ Administrar vistas secundarias
-
- Nombre del esquema de la base de datos
+
+ Recrear vistas secundarias para un tipo de elemento seleccionado o para todos los tipos de elementos definidos en un proyecto
-
- Plantillas QGIS
+
+ Exportar
-
+
None
-
- Recargar funciones:
+
+ Nombre del elemento:
-
+
None
-
- Borrar
+
+ Administrador de esquema
-
+
None
-
- Tipo proyecto:
+
+ Administrador de Api
-
- Tipo de proyecto giswater
+
+ None
-
- Giswater
+
+ Avanzado
-
+
None
-
- Administrar UI
+
+ Actualizar
-
+
None
-
- Administrar vistas secundarias
+
+ Borrar
-
- Recrear vistas secundarias para un tipo de elemento seleccionado o para todos los tipos de elementos definidos en un proyecto
+
+ None
-
- Ejecutar
+
+ Crear
-
+
None
-
- ...
+
+ Renombrar
-
- None
+
+ Renombrar el esquema de base de datos seleccionado
-
- Información del esquema del proyecto
+
+ Usar restricciones:
-
+
None
@@ -3696,118 +3632,110 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
None
-
- Crear esquema proyecto BBDD
+
+ General
-
+
None
-
- Actualizar
+
+ Ruta UI:
-
+
None
-
- Borrar
+
+ Nombre:
-
- Eliminar el esquema de base de datos seleccionado
+
+ Nombre del esquema de la base de datos
-
-
- admin_visitclass
-
- Id clase:
+
+ Archivos de traduccion
-
+
None
-
- Aceptar
+
+ Tipo proyecto:
-
- None
+
+ Tipo de proyecto giswater
-
- Tipo visita:
+
+ Actualizar Esquema
-
- None
+
+ Actualizar version del esquema seleccionado
-
- Cancelar
+
+ Cerrar
-
- None
+
+ Cerrar
-
- Aceptar
+
+ Giswater
-
+
None
-
- Tipo de elemento:
-
-
-
- None
-
-
-
- Crear
+
+ Copiar
-
- None
+
+ Copiar el esquema de base de datos seleccionado
-
- Gestionar clase de visita
+
+ Restricciones
-
+
None
-
- Evento múltiple:
+
+ Nombre del formulario:
-
+
None
+
+
+ admin_visitclass
-
- Opciones parámetro:
+
+ Tipo de elemento:
-
+
None
-
- Elemento múltiple:
+
+ Gestionar clase de visita
-
+
None
@@ -3819,19 +3747,19 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
None
-
- Cancelar
+
+ Activo:
-
- Cancelar
+
+ None
-
- Actualizar
+
+ Id clase:
-
+
None
@@ -3843,11 +3771,19 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
None
-
- Borrar
+
+ Evento múltiple:
-
+
+ None
+
+
+
+ Opciones parámetro:
+
+
+
None
@@ -3859,16 +3795,21 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
None
-
- Activo:
+
+ Elemento múltiple:
-
+
+ None
+
+
+
+ Tipo visita:
+
+
+
None
-
-
- admin_visitparam
Cancelar
@@ -3878,51 +3819,62 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
Cancelar
-
- Tipo parámetro:
+
+ Cancelar
-
+
None
-
- Tipo dato:
+
+ Aceptar
-
+
None
-
- Tipo formulario:
+
+ Crear
-
+
None
-
- Valor por defecto:
+
+ Aceptar
-
+
None
-
- Nombre parámetro:
+
+ Borrar
-
+
None
-
- Descripción:
+
+ Actualizar
-
+
+ None
+
+
+
+ admin_visitparam
+
+
+ Tipo formulario:
+
+
+
None
@@ -3934,19 +3886,19 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
None
-
- Parametros
+
+ Nombre parámetro:
-
+
None
-
- Editable:
+
+ Habilitado:
-
+
None
@@ -3958,27 +3910,35 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
None
-
- Habilitado:
+
+ Cancelar
-
+
+ Cancelar
+
+
+
+ Editable:
+
+
+
None
-
- Tipo de widget:
+
+ Descripción:
-
+
None
-
- Aceptar
+
+ Valor por defecto:
-
+
None
@@ -3989,6 +3949,22 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
None
+
+
+ Tipo dato:
+
+
+
+ None
+
+
+
+ Parametros
+
+
+
+ None
+
Texto de consulta:
@@ -3997,6 +3973,22 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
None
+
+
+ Tipo parámetro:
+
+
+
+ None
+
+
+
+ Tipo de widget:
+
+
+
+ None
+
Gestionar parámetro de visita
@@ -4005,6 +3997,14 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
None
+
+
+ Aceptar
+
+
+
+ None
+
arc_fusion
@@ -4012,14 +4012,6 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
Fusionar arco
-
-
- Cancelar
-
-
-
- Cancelar
-
Fecha de finalización:
@@ -4037,13 +4029,21 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
None
-
- Expdte baja:
+
+ Info log
-
+
None
+
+
+ Cancelar
+
+
+
+ Cancelar
+
Aceptar
@@ -4053,11 +4053,11 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
Aceptar
-
- Info log
+
+ Expdte baja:
-
+
None
@@ -4076,108 +4076,108 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
Asignación de fugas
-
+
Fugas
-
+
None
-
- Longitud del cluster (m):
+
+ Distancia máxima (m):
-
- Suma máxima de longitudes de tubería dentro de un cluster, en metros.
+
+ Distancia máxima, en metros, entre la tubería inicial y otras tuberías incluidas en el cluster.
-
- Tuberías
+
+ Rango de diámetro:
-
- None
+
+ Rango de diámetros basado en factores de la tubería inicial.
-
- Rango de diámetro:
+
+ Filtrar por diámetro:
-
- Rango de diámetros basado en factores de la tubería inicial.
+
+ Utiliza sólo tuberías que coincidan con el rango de diámetros del inicial.
-
- Utilizar todas las fugas
+
+ Longitud del cluster (m):
-
- Calcula las fugas por kilómetro y año utilizando todos los datos disponibles, independientemente del parámetro 'años a calcular'.
+
+ Suma máxima de longitudes de tubería dentro de un cluster, en metros.
-
- Info Log
+
+ Filtrar por fecha de instalación:
-
- None
+
+ Utiliza sólo las tuberías que coinciden con el intervalo de fechas de instalación de la inicial.
-
- Asignación de fugas
+
+ Distancia de buffer (m):
-
- None
+
+ Distancia desde una fuga a la que se seleccionan las tuberías a las que se asigna esa fuga.
-
- Filtrar por material:
+
+ Años a calcular:
-
- Utiliza sólo tuberías del mismo material que el inicial.
+
+ Número de años de datos de fugas a tener en cuenta, en función de la antigüedad.
-
- Distancia máxima (m):
+
+ Utilizar todas las fugas
-
- Distancia máxima, en metros, entre la tubería inicial y otras tuberías incluidas en el cluster.
+
+ Calcula las fugas por kilómetro y año utilizando todos los datos disponibles, independientemente del parámetro 'años a calcular'.
-
- Filtrar por fecha de instalación:
+
+ Rango de fechas de construcción (años):
-
- Utiliza sólo las tuberías que coinciden con el intervalo de fechas de instalación de la inicial.
+
+ Intervalo de fechas de construcción, en años anteriores y posteriores a la tubería inicial.
-
- Años a calcular:
+
+ Tuberías
-
- Número de años de datos de fugas a tener en cuenta, en función de la antigüedad.
+
+ None
-
- Distancia de buffer (m):
+
+ Fugas
-
- Distancia desde una fuga a la que se seleccionan las tuberías a las que se asigna esa fuga.
+
+ None
-
- Rango de fechas de construcción (años):
+
+ Asignación de fugas
-
- Intervalo de fechas de construcción, en años anteriores y posteriores a la tubería inicial.
+
+ None
@@ -4188,20 +4188,20 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
None
-
- Fugas
+
+ Filtrar por material:
-
- None
+
+ Utiliza sólo tuberías del mismo material que el inicial.
-
- Filtrar por diámetro:
+
+ Info Log
-
- Utiliza sólo tuberías que coincidan con el rango de diámetros del inicial.
+
+ None
@@ -4211,12 +4211,12 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
Dibujar circulo CAD
-
- Eliminar círculos anteriores
+
+ Aceptar
-
- None
+
+ Aceptar
@@ -4227,27 +4227,27 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
Cancelar
-
- Insertar radio:
+
+ Dibujar circulo CAD
-
+
None
-
- Aceptar
+
+ Eliminar círculos anteriores
-
- Aceptar
+
+ None
-
- Dibujar circulo CAD
+
+ Insertar radio:
-
+
None
@@ -4258,35 +4258,27 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
Añadir punto CAD
-
- Añadir punto CAD
-
-
-
- None
-
-
-
- Punto final
+
+ Distancia Y:
-
+
None
-
- Eliminar puntos anteriores
+
+ Aceptar
-
- None
+
+ Aceptar
-
- Distancia Y:
+
+ Punto final
-
+
None
@@ -4297,6 +4289,14 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
Cancelar
+
+
+ Eliminar puntos anteriores
+
+
+
+ None
+
Punto inicial
@@ -4314,12 +4314,12 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
None
-
- Aceptar
+
+ Añadir punto CAD
-
- Aceptar
+
+ None
@@ -4329,20 +4329,20 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
Configuración
-
- Cancelar
+
+ Elemento de catálogo
-
- Cancelar
+
+ None
-
- Aceptar
+
+ Campos adicionales
-
- Aceptar
+
+ None
@@ -4352,6 +4352,14 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
None
+
+
+ Cancelar
+
+
+
+ Cancelar
+
Configuración
@@ -4361,113 +4369,132 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
None
-
- Básico
+
+ Man type
-
+
None
-
- Campos adicionales
+
+ Básico
-
+
None
-
- Elemento de catálogo
+
+ Aceptar
-
- None
+
+ Aceptar
+
+
+ create_style_group
-
- Man type
+
+
-
- None
+
+ Nombre de la categoría
-
-
- crm_trace
-
- Instrucciones:
+
+ ID de categoría:
-
- None
+
+
-
-
- csv
-
- ...
+
+
-
- None
+
+ ID de categoría
-
- Archivo:
+
+
-
- None
+
+ Descripción
-
- Delimitador:
+
+ Nombre de la categoría:
-
- None
+
+
-
+
Aceptar
-
+
Aceptar
-
- Conjunto de caracteres
+
+ Descripción:
-
- None
+
+
-
- Importar tipo:
+
+ Rol:
-
- None
+
+
-
- Importar etiqueta:
+
+ Cancelar
-
+
+ Cancelar
+
+
+
+
+
+
+
+ Rol que podrá utilizar este estilo
+
+
+
+ crm_trace
+
+
+ Instrucciones:
+
+
+
None
+
+
+ csv
-
- Previsualizar
+
+ Ignorar cabeceras:
-
+
None
@@ -4487,19 +4514,35 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
None
-
- Ignorar cabeceras:
+
+ ...
-
+
None
-
- Importar CSV
+
+ Delimitador:
-
+
+ None
+
+
+
+ Importar tipo:
+
+
+
+ None
+
+
+
+ Importar etiqueta:
+
+
+
None
@@ -4510,6 +4553,46 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
Cancelar
+
+
+ Previsualizar
+
+
+
+ None
+
+
+
+ Archivo:
+
+
+
+ None
+
+
+
+ Aceptar
+
+
+
+ Aceptar
+
+
+
+ Conjunto de caracteres
+
+
+
+ None
+
+
+
+ Importar CSV
+
+
+
+ None
+
dialog_table
@@ -4526,12 +4609,12 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
None
-
- Cancelar
+
+ Aceptar
-
- Cancelar
+
+ Aceptar
@@ -4542,12 +4625,12 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
None
-
- Aceptar
+
+ Cancelar
-
- Aceptar
+
+ Cancelar
@@ -4573,19 +4656,19 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
Cancelar
-
- Cerrar
+
+ Diálogo
-
+
None
-
- Diálogo
+
+ Cerrar
-
+
None
@@ -4603,6 +4686,14 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
None
+
+
+ Aceptar
+
+
+
+ Aceptar
+
Cancelar
@@ -4612,19 +4703,19 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
Cancelar
-
- Otros
+
+ Simbología del círculo
-
+
None
-
- Simbología del círculo
+
+ Otros
-
+
None
@@ -4635,14 +4726,6 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
None
-
-
- Aceptar
-
-
-
- Aceptar
-
doc
@@ -4651,12 +4734,20 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
Documento
-
- Acometida
+
+ ...
-
- Acometida
+
+ Ruta
+
+
+
+ Sumidero
+
+
+
+ Sumidero
@@ -4666,6 +4757,22 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
Nodo
+
+
+ Aceptar
+
+
+
+ Aceptar
+
+
+
+ Ruta
+
+
+
+ Completar con alguna ruta de carpeta accesible o ruta web
+
Documento
@@ -4675,20 +4782,20 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
None
-
- Aceptar
+
+ Cancelar
-
- Aceptar
+
+ Cancelar
-
+
None
-
- Eliminar
+
+ Seleccionar objeto
@@ -4699,52 +4806,52 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
Tipo documento
-
- Id doc:
+
+ Arco
-
- Id documento
+
+ Arco
-
- Sumidero
+
+ None
-
- Sumidero
+
+ Insertar
-
- Observaciones:
+
+ Enlace:
-
- None
+
+ Enlace
-
- Documento
+
+ Nombre doc:
-
- None
+
+ Nombre documento
-
- Documento
+
+ Nombre doc:
-
- None
+
+ Nombre documento
-
- None
+
+ Documento
-
- Insertar
+
+ None
@@ -4755,36 +4862,28 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
Abra el explorador para permitir la selección de la ruta web. También es posible simplemente pegar la ruta en el cuadro de enlace de texto
-
- Enlace:
-
-
-
- Enlace
+
+ None
-
- Ruta
+
+ Eliminar
-
- Completar con alguna ruta de carpeta accesible o ruta web
+
+ Observaciones:
-
+
None
-
- Seleccionar objeto
-
-
-
- Arco
+
+ Acometida
-
- Arco
+
+ Acometida
@@ -4795,20 +4894,12 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
None
-
- ...
-
-
-
- Ruta
-
-
-
- Cancelar
+
+ Documento
-
- Cancelar
+
+ None
@@ -4817,6 +4908,22 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
Gestor de documentos
+
+
+ Borrar
+
+
+
+ Eliminar
+
+
+
+ Filtrar por: Nombre doc
+
+
+
+ None
+
Cerrar
@@ -4833,25 +4940,17 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
None
-
-
- Filtrar por: Id doc
-
-
-
- None
-
+
+
+ dscenario_manager
Borrar
- Eliminar
+ None
-
-
- dscenario_manager
Crear
@@ -4861,20 +4960,12 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
None
-
- Borrar
-
-
-
- None
-
-
-
- Actualizar
+
+ Mostrar inactivos
-
- None
+
+ Mostrar inactivos
@@ -4885,12 +4976,12 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
None
-
- Mostrar inactivos
+
+ Actualizar
-
- Mostrar inactivos
+
+ None
@@ -4912,80 +5003,8 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
element
-
- Elemento
-
-
-
- Fecha construcción:
-
-
-
- Fecha alta
-
-
-
- Expediente alta:
-
-
-
- Expediente alta
-
-
-
- Id elemento catálogo:
-
-
-
- Catálogo
-
-
-
- Añadir geometría
-
-
-
- Añadir geometría
-
-
-
- Cancelar
-
-
-
- Cancelar
-
-
-
- Aceptar
-
-
-
- Aceptar
-
-
-
- Elemento
-
-
-
- None
-
-
-
- Id elemento:
-
-
-
- None
-
-
-
- Verificado:
-
-
-
- None
+
+ Elemento
@@ -5004,37 +5023,61 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
None
-
- Número de elemento:
+
+ Estado:
-
+
None
-
- Elemento
+
+ Código:
-
- None
+
+ Código
-
- None
+
+ Constructor:
-
- Eliminar
+
+ Constructor
-
- Estado:
+
+ Fecha construcción:
-
+
+ Fecha alta
+
+
+
+ Tipo elemento:
+
+
+
+ Tipo elemento
+
+
+
None
+
+
+ Seleccionar objeto
+
+
+
+ Enlace:
+
+
+
+ Enlace
+
Observaciones:
@@ -5044,12 +5087,20 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
None
-
- Código:
+
+ Explotación:
-
- Código
+
+ None
+
+
+
+ None
+
+
+
+ Insertar
@@ -5059,6 +5110,30 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
Arco
+
+
+ Tipo ubicación:
+
+
+
+ Ubicación
+
+
+
+ Elemento
+
+
+
+ None
+
+
+
+ Aceptar
+
+
+
+ Aceptar
+
Propietario:
@@ -5068,20 +5143,20 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
None
-
- Explotación:
+
+ Rotación:
-
+
None
-
- Comentario:
+
+ Cancelar
-
- None
+
+ Cancelar
@@ -5092,68 +5167,68 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
Relaciones
-
- Enlace:
+
+ Elemento
-
- Enlace
+
+ None
-
- Tipo ubicación:
+
+ Expediente baja:
-
- Ubicación
+
+ Expediente baja
-
- Tipo elemento:
+
+ Número de elemento:
-
- Tipo elemento
+
+ None
-
- Constructor:
+
+ Acometida
-
- Constructor
+
+ Acometida
-
+
None
-
- Seleccionar objeto
+
+ Eliminar
-
- None
+
+ Verificado:
-
- Insertar
+
+ None
-
- Expediente baja:
+
+ Expediente alta:
-
- Expediente baja
+
+ Expediente alta
-
- Rotación:
+
+ Añadir geometría
-
- None
+
+ Añadir geometría
@@ -5164,28 +5239,36 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
Nodo
-
- Acometida
+
+ Comentario:
-
- Acometida
+
+ None
-
-
- element_manager
-
- Gestor de elementos
+
+ Id elemento catálogo:
-
- Gestor de elementos
+
+ Catálogo
-
+
+ Id elemento:
+
+
+
None
+
+
+ element_manager
+
+
+ Gestor de elementos
+
Borrar
@@ -5202,6 +5285,14 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
Cancelar
+
+
+ Gestor de elementos
+
+
+
+ None
+
Filtrar por: Id elemento
@@ -5214,21 +5305,13 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
epa_compare
-
- Selector de fecha:
+
+ Hora (para mostrar):
-
+
None
-
-
- Cancelar
-
-
-
- Cancelar
-
Aceptar
@@ -5238,35 +5321,43 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
Aceptar
-
- Comparar fecha:
+
+ Selector de fecha:
-
+
None
-
- Comparar hora:
+
+ Hora (para comparar):
-
+
None
-
- Hora (para comparar):
+
+ Cancelar
-
+
+ Cancelar
+
+
+
+ Selector
+
+
+
None
-
- Hora del selector:
+
+ Comparar fecha:
-
+
None
@@ -5278,11 +5369,11 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
None
-
- Selector
+
+ Comparar hora:
-
+
None
@@ -5294,27 +5385,27 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
None
-
- Hora:
+
+ Resultado
-
+
None
-
- Hora (para mostrar):
+
+ Hora:
-
+
None
-
- Resultado
+
+ Hora del selector:
-
+
None
@@ -5341,12 +5432,12 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
None
-
- Vista previa
+
+ Cerrar
-
- None
+
+ Cerrar
@@ -5357,12 +5448,12 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
None
-
- Cerrar
+
+ Imprimir
-
- Cerrar
+
+ None
@@ -5373,11 +5464,11 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
None
-
- Imprimir
+
+ Vista previa
-
+
None
@@ -5396,76 +5487,76 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
Eliminar
-
- Info log
+
+ Borrar elemento
-
+
None
-
- Mostrar relaciones del elemento
+
+ Tipo de elemento:
-
+
None
-
- Borrar elemento
+
+ Id elemento
-
+
None
-
- Borrar elemento
+
+ Info log
-
+
None
-
- Tipo de elemento:
+
+ Mostrar relaciones del elemento
-
+
None
-
- Cancelar
-
-
-
- Cancelar
+
+ Eliminar otro elemento
-
+
None
-
- Seleccionar objeto
+
+ Borrar elemento
-
- Eliminar otro elemento
+
+ None
-
+
None
-
- Id elemento
+
+ Seleccionar objeto
-
- None
+
+ Cancelar
+
+
+
+ Cancelar
@@ -5475,19 +5566,19 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
Dar de baja
-
- Acometida
+
+ Expdte baja:
-
+
None
-
- Expediente
+
+ Sumidero
-
+
None
@@ -5499,12 +5590,12 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
None
-
- Sumidero
+
+ Cancelar
-
- None
+
+ Cancelar
@@ -5515,53 +5606,45 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
None
-
- None
+
+ Dar de baja
-
- Eliminar
+
+ None
-
- Fecha expdte:
+
+ Expediente
-
+
None
-
- Nodo
+
+ Tipo estado final:
-
+
None
-
- Arco
-
-
-
+
None
-
- Expdte baja:
+
+ Insertar
-
+
None
-
+
None
-
-
- Seleccionar objeto
-
Elemento
@@ -5570,14 +5653,6 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
None
-
-
- None
-
-
-
- Insertar
-
Relaciones
@@ -5587,44 +5662,60 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
Relaciones
-
- Tipo estado final:
+
+ None
-
+
+ Seleccionar objeto
+
+
+
+ Acometida
+
+
+
None
-
- Cancelar
+
+ Aceptar
-
- Cancelar
+
+ Aceptar
-
+
+ Arco
+
+
+
None
-
+
+ Fecha expdte:
+
+
+
None
-
- Dar de baja
+
+ Nodo
-
+
None
-
- Aceptar
+
+ None
-
- Aceptar
+
+ Eliminar
@@ -5633,6 +5724,14 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
Elementos desconectados de tramo
+
+
+ Lista de elementos que quedarán desconectados cuando los tramos seleccionados sean dados de baja:
+
+
+
+ None
+
Elementos desconectados de tramo
@@ -5665,14 +5764,6 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
Aceptar
-
-
- Lista de elementos que quedarán desconectados cuando los tramos seleccionados sean dados de baja:
-
-
-
- None
-
go2epa
@@ -5681,68 +5772,68 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
Ir a Epa
-
- Nombre resultado:
+
+ Selector
-
+
None
-
- Usar llamadas iterativas
+
+ Info log
-
+
None
-
- lbl_counter
+
+ Usar la geometría de red resultante
-
+
None
-
- Administrador de archivos
+
+ Cancelar
-
- None
+
+ Cancelar
-
- Aceptar
+
+ Archivo INP:
-
- Aceptar
+
+ None
-
- Opciones de proceso
+
+ ...
-
+
None
-
- Selector
+
+ ...
-
+
None
-
- Cancelar
+
+ Aceptar
-
- Cancelar
+
+ Aceptar
@@ -5753,83 +5844,83 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
None
-
- Importar resultado
+
+ Nombre resultado:
-
+
None
-
- Usar la geometría de red resultante
+
+ lbl_counter
-
+
None
-
- Ejecutar software EPA
+
+ Archivo RPT:
-
+
None
-
- Exportar INP
+
+ Usar llamadas iterativas
-
+
None
-
- Info log
+
+ Ir a Epa
-
+
None
-
- Archivo RPT:
+
+ Importar resultado
-
+
None
-
- Archivo INP:
+
+ Ejecutar software EPA
-
+
None
-
- ...
+
+ Exportar INP
-
+
None
-
- Ir a Epa
+
+ Opciones de proceso
-
+
None
-
- ...
+
+ Administrador de archivos
-
+
None
@@ -5847,14 +5938,6 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
Gestor de resultados Epa
-
-
- Alternar corporativo
-
-
-
- None
-
Cerrar
@@ -5863,6 +5946,14 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
Cerrar
+
+
+ Alternar corporativo
+
+
+
+ None
+
Filtrar por: Id resultado
@@ -5895,11 +5986,11 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
Go2Epa - opciones
-
- Otros
+
+ Go2Epa - opciones
-
+
None
@@ -5910,6 +6001,14 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
None
+
+
+ Aceptar
+
+
+
+ Aceptar
+
Cancelar
@@ -5919,21 +6018,13 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
Cancelar
-
- Go2Epa - opciones
+
+ Otros
-
+
None
-
-
- Aceptar
-
-
-
- Aceptar
-
info_catalog
@@ -5973,11 +6064,19 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
Hidrómetro
-
- Id hidrómetro:
+
+ Aceptar
-
+
+ Aceptar
+
+
+
+ Hidrómetro
+
+
+
None
@@ -5989,21 +6088,13 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
Cerrar
-
- Hidrómetro
+
+ Id hidrómetro:
-
+
None
-
-
- Aceptar
-
-
-
- Aceptar
-
info_crossect
@@ -6012,53 +6103,45 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
Sección
-
- lbl_cost_b_right
+
+ lbl_cost_area
-
+
None
-
- lbl_cost_exc
+
+ lbl_section_image
-
+
None
-
- lbl_cost_bulk
+
+ lbl_cost_fill
-
+
None
-
- lbl_cost_y_param
+
+ lbl_cost_bulk
-
+
None
-
- lbl_section_image
+
+ lbl_cost_exc
-
+
None
-
-
- Cerrar
-
-
-
- Cerrar
-
Sección
@@ -6068,51 +6151,59 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
None
-
- lbl_cost_excav
+
+ lbl_cost_trench
-
+
None
-
- lbl_cost_area
+
+ lbl_cost_b_left
-
+
None
-
- lbl_cost_fill
+
+ lbl_cost_width
-
+
None
-
- lbl_cost_width
+
+ lbl_cost_excav
-
+
None
-
- lbl_cost_b_left
+
+ Cerrar
-
+
+ Cerrar
+
+
+
+ lbl_cost_b_right
+
+
+
None
-
- lbl_cost_trench
+
+ lbl_cost_y_param
-
+
None
@@ -6122,6 +6213,14 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
Información característica
+
+
+ Relaciones
+
+
+
+ Relaciones
+
None
@@ -6131,19 +6230,19 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
None
-
- Hasta:
+
+ None
-
+
None
-
- Desde:
+
+ None
-
+
None
@@ -6155,43 +6254,43 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
None
-
- None
+
+ Hasta:
-
- Insertar
+
+ None
-
- OM
+
+ Tipo parámetro:
-
+
None
-
- Cancelar
-
-
-
- Cancelar
+
+ Parámetro:
-
+
None
-
- Borrar documento
+
+ Desde:
-
+
None
-
+
+ Tipo:
+
+
+
None
@@ -6203,92 +6302,84 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
None
-
- Documentos
+
+ OM
-
+
None
-
+
None
-
- Eliminar
-
-
-
- Aceptar
+
+ Crear nuevo documento
-
- Aceptar
+
+ Cat de filtro de periodo:
-
- Conexiones
+
+ None
-
+
None
-
- Elemento aguas arriba:
+
+ Abrir documento
-
- None
+
+ Elemento aguas abajo:
-
- Id doc:
+
+ None
-
+
None
-
- Plan
+
+ Insertar
-
+
None
-
- Elemento aguas abajo:
-
-
-
- None
+
+ Borrar documento
-
- Datos
+
+ Hidrómetro
-
+
None
-
- Relaciones
+
+ Valores hidrómetro
-
- Relaciones
+
+ None
-
- Cat de filtro de periodo:
+
+ Aceptar
-
- None
+
+ Aceptar
@@ -6299,67 +6390,67 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
Insertar documento
-
- None
+
+ Datos
-
- Crear nuevo documento
+
+ None
-
- Tipo:
+
+ Plan
-
+
None
-
- Desde:
+
+ Cancelar
-
- None
+
+ Cancelar
-
- Parámetro:
+
+ None
-
+
None
-
- Tipo parámetro:
+
+ Documentos
-
+
None
-
- Hasta:
+
+ None
-
+
None
-
- None
+
+ Id doc:
-
+
None
-
- None
+
+ Información característica
-
+
None
@@ -6371,43 +6462,51 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
None
-
- None
+
+ Elemento aguas arriba:
-
- Abrir documento
+
+ None
-
- Hidrómetro
+
+ Aplicar
-
- None
+
+ Aplicar
-
- Valores hidrómetro
+
+ Desde:
-
+
None
-
+
None
-
+
+ Eliminar
+
+
+
+ Hasta:
+
+
+
None
-
+
None
-
+
None
@@ -6419,11 +6518,11 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
None
-
- Información característica
+
+ Conexiones
-
+
None
@@ -6433,6 +6532,22 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
Información básica
+
+
+ Cerrar
+
+
+
+ Cerrar
+
+
+
+ Aceptar
+
+
+
+ Aceptar
+
Información básica
@@ -6441,6 +6556,29 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
None
+
+
+ info_workcat
+
+
+ Nuevo expdte
+
+
+
+ Nuevo expdte
+
+
+
+ None
+
+
+
+ Clave 1 id trabajo:
+
+
+
+ None
+
Aceptar
@@ -6449,21 +6587,6 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
Aceptar
-
-
- Cerrar
-
-
-
- Cerrar
-
-
-
- info_workcat
-
-
- Nuevo expdte
-
Enlace:
@@ -6481,12 +6604,12 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
None
-
- Aceptar
+
+ Fecha construcción:
-
- Aceptar
+
+ None
@@ -6504,30 +6627,6 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
Cancelar
-
-
- Clave 1 id trabajo:
-
-
-
- None
-
-
-
- Nuevo expdte
-
-
-
- None
-
-
-
- Fecha construcción:
-
-
-
- None
-
main_dbproject
@@ -6555,35 +6654,28 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
mapzone_manager
-
- Mostrar inactivos
-
-
-
- Mostrar inactivos
+
+ Alternar activo
-
-
- mincut
-
- Polígono de corte
+
+ Alternar activo
-
- Cloro:
+
+ Actualizar
-
- None
+
+ Actualizar
-
- Localización
+
+ Filtrar por: Nombre de mapzone
-
- None
+
+ Filtrar por: Nombre de mapzone
@@ -6594,108 +6686,115 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
Cancelar
-
- Causa:
+
+ Eliminar
-
- None
+
+ Eliminar
-
- Distancia fachada:
+
+ Mostrar todas las mapzones
-
- None
+
+ Mostrar todas las mapzones
-
- Estado:
+
+
-
- None
+
+ Ejecutar el proceso de análisis de mapzone
-
- Desde:
+
+ Crear
-
- None
+
+ Crear
-
- Sin resultados
+
+ Configurar
-
- None
+
+ Configurar
-
- Hasta:
+
+ Mostrar inactivos
-
- None
+
+ Mostrar inactivos
+
+
+ mincut
-
- Descripción:
+
+ Polígono de corte
-
+
+ Distancia fachada:
+
+
+
None
-
- Aceptar
+
+ Fin
-
- Aceptar
+
+ None
-
- Turbiedad:
+
+ Localización
-
+
None
-
- Id:
+
+ Tipo:
-
+
None
-
- Descripción:
+
+ Inicio
-
+
None
-
- Orden de trabajo:
+
+ Id:
-
+
None
-
- Usar red planificada
+
+ Aceptar
-
- None
+
+ Aceptar
@@ -6721,6 +6820,38 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
None
+
+
+ Usuario ejecutivo:
+
+
+
+ None
+
+
+
+ Usar red planificada
+
+
+
+ None
+
+
+
+ Descripción:
+
+
+
+ None
+
+
+
+ Hasta:
+
+
+
+ None
+
Fechas previstas
@@ -6730,11 +6861,43 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
None
-
- Detalles
+
+ Desde:
-
+
+ None
+
+
+
+ Estado:
+
+
+
+ None
+
+
+
+ Sin resultados
+
+
+
+ None
+
+
+
+ Orden de trabajo:
+
+
+
+ None
+
+
+
+ Cloro:
+
+
+
None
@@ -6746,28 +6909,36 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
None
-
- Inicio
+
+ Causa:
-
+
None
-
- Usuario ejecutivo:
+
+ Detalles
-
+
None
-
- Tipo:
+
+ Descripción:
+
+
+
+ None
+
+
+
+ Cancelar
-
- None
+
+ Cancelar
@@ -6802,11 +6973,11 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
None
-
- Fin
+
+ Turbiedad:
-
+
None
@@ -6817,20 +6988,28 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
Compositor polígono de corte
-
- Modelo:
+
+ Abrir
-
+
None
-
- Cancelar
+
+ Compositor polígono de corte
-
- Cancelar
+
+ None
+
+
+
+ Modelo:
+
+
+
+ None
@@ -6849,20 +7028,12 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
None
-
- Compositor polígono de corte
-
-
-
- None
-
-
-
- Abrir
+
+ Cancelar
-
- None
+
+ Cancelar
@@ -6880,36 +7051,36 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
None
-
- Aceptar
+
+ None
-
- Aceptar
+
+ Seleccionar objeto
-
- None
+
+ Buscar por 'customer code':
-
- Insertar
+
+ None
-
+
None
-
- Seleccionar objeto
+
+ Insertar
-
- Buscar por 'customer code':
+
+ Aceptar
-
- None
+
+ Aceptar
@@ -6927,21 +7098,37 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
Finalizar polígono de corte
-
- Ejecutado por:
+
+ Aceptar
-
+
+ Aceptar
+
+
+
+ Hasta:
+
+
+
None
-
- Número:
+
+ Cerrar mincut
-
+
None
+
+
+ Cancelar
+
+
+
+ Cancelar
+
Finalizar polígono de corte
@@ -6951,11 +7138,11 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
None
-
- Hasta:
+
+ Orden de trabajo:
-
+
None
@@ -6966,14 +7153,6 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
None
-
-
- Establecer ubicación real
-
-
-
- None
-
Hora de inicio:
@@ -6983,19 +7162,19 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
None
-
- Cancelar
+
+ Número:
-
- Cancelar
+
+ None
-
- Cerrar mincut
+
+ Municipio:
-
+
None
@@ -7007,43 +7186,35 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
None
-
- Municipio:
+
+ Hora de finalización:
-
+
None
-
- Id:
+
+ Ejecutado por:
-
+
None
-
- Aceptar
-
-
-
- Aceptar
-
-
-
- Hora de finalización:
+
+ Id:
-
+
None
-
- Orden de trabajo:
+
+ Establecer ubicación real
-
+
None
@@ -7054,43 +7225,35 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
Hidrómetro polígono de corte
-
- Código cliente hidrómetro:
-
-
-
- None
+
+ Aceptar
-
- Conectar código cliente:
+
+ Aceptar
-
- None
+
+ Hidrómetro polígono de corte
-
+
None
-
- Insertar
-
-
-
- Aceptar
+
+ Conectar código cliente:
-
- Aceptar
+
+ None
-
- Hidrómetro polígono de corte
+
+ Código cliente hidrómetro:
-
+
None
@@ -7101,6 +7264,14 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
Eliminar
+
+
+ None
+
+
+
+ Insertar
+
mincut_manager
@@ -7109,35 +7280,35 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
Gestión polígono de corte
-
- Próximos días
+
+ None
-
+
None
-
- Explotación:
+
+ Cerrar
-
- None
+
+
-
- Gestión polígono de corte
+
+ Borrar
-
- None
+
+ Eliminar
-
- Tipo:
+
+ Filtrar por:
-
+
None
@@ -7149,27 +7320,19 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
None
-
- Calle:
-
-
-
- None
-
-
-
- Borrar
+
+ Desde:
-
- Eliminar
+
+ None
-
- Desde:
+
+ Explotación:
-
+
None
@@ -7181,27 +7344,27 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
None
-
- Filtrar por:
+
+ Próximos días
-
+
None
-
- Cerrar
+
+ Enviar sms
-
-
+
+ None
-
- None
+
+ Tipo:
-
+
None
@@ -7221,47 +7384,47 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
None
-
- Enviar sms
+
+ Gestión polígono de corte
-
+
None
-
-
- netscenario_manager
-
- Current netscenario
+
+ Calle:
-
- Current netscenario
+
+ None
+
+
+ netscenario_manager
-
- Mostrar inactivos
+
+ Crear
-
- Mostrar inactivos
+
+ Crear
-
- Duplicar
+
+ Filter by: Netscenario name
-
- Duplicar
+
+ Filter by: Netscenario name
-
- Cerrar
+
+ Actualizar
-
- Cerrar
+
+ Actualizar
@@ -7272,36 +7435,36 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
Borrar
-
- Actualizar
+
+ Cerrar
-
- Actualizar
+
+ Cerrar
-
- Filter by: Netscenario name
+
+
-
- Filter by: Netscenario name
+
+ Cargar capa Giswater
-
- Crear
+
+ Current netscenario
-
- Crear
+
+ Current netscenario
-
-
+
+ Duplicar
-
- Execute mapzones analysis
+
+ Duplicar
@@ -7312,12 +7475,20 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
Toggle active
-
+
-
- Cargar capa Giswater
+
+ Execute mapzones analysis
+
+
+
+ Mostrar inactivos
+
+
+
+ Mostrar inactivos
@@ -7343,11 +7514,11 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
Aceptar
-
- Cambiar tipo nodo
+
+ Tipo nodo actual:
-
+
None
@@ -7359,19 +7530,19 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
None
-
- Tipo nodo actual:
+
+ Id catálogo:
-
+
None
-
- Id catálogo:
+
+ Cambiar tipo nodo
-
+
None
@@ -7389,36 +7560,28 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
plan_psector
-
- Text 2:
+
+ Prioridad:
-
+
None
-
- Tipo:
-
-
-
+
None
-
- Expediente:
+
+ Seleccionar elements
-
+
None
-
- Borrar
-
-
-
-
+
+ Establecer arc_id (solo ARC exit_type)
@@ -7429,99 +7592,131 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
None
-
- Total nodos:
+
+ Gastos generales
-
+
None
-
- Total tramos:
+
+ Generar informe
-
- None
+
+
-
- Text 3:
+
+ Seleccionar
-
- None
+
+
-
+
+ Seleccionar
+
+
+
+
+
+
+
None
-
- Establecer arc_id (solo ARC exit_type)
+
+ Reemplazar en servicio para arcos planificados
-
- Escala:
+
+ Otros gastos
-
+
None
-
- Estado:
+
+ Número valor:
-
+
None
-
- Rotación:
+
+ Text 6:
-
+
None
-
- Text 1:
+
+ Text 5:
-
+
None
-
- Id relacionado:
+
+ Text 4:
-
+
None
-
+
+ Text 3:
+
+
+
None
-
- Insertar
+
+ None
+
+
+
+ Fusionar arcos planificados
+
+
+
+ Escala:
+
+
+
+ None
+
+
+
+ Rotación:
+
+
+
+ None
-
- Cancelar
+
+ Borrar
-
+
-
- Explotación:
+
+ Cancelar
-
+
@@ -7533,28 +7728,28 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
-
- Observaciones:
+
+ Atlas id:
-
- None
+
+
-
- Descripción:
+
+ Id relacionado:
-
-
+
+ None
-
- Activo
+
+ Observaciones:
-
-
+
+ None
@@ -7565,156 +7760,132 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
None
-
- Habilitar todo (visualizar estado obsoleto en elementos relacionados a psector)
-
-
-
-
-
-
-
- Detalles de mapa
-
-
-
-
-
-
-
- Generar informe
-
-
-
-
+
+ Código externo:
-
- Seleccionar
+
+ None
-
-
+
+ Expediente:
-
- Seleccionar
+
+ None
-
-
+
+ Tipo:
-
- Atlas id:
+
+ None
-
-
+
+ Text 2:
-
+
None
-
- Reemplazar en servicio para arcos planificados
+
+ Text 1:
-
+
None
-
- Eliminar
-
-
-
- Código externo:
+
+ Estado:
-
+
None
-
- Otros gastos
+
+ Psector id:
-
+
None
-
+
None
-
- Fusionar arcos planificados
+
+ Insertar
-
- Gastos generales
+
+ Detalles de mapa
-
- None
+
+
-
- Prioridad:
+
+ Habilitar todo (visualizar estado obsoleto en elementos relacionados a psector)
-
- None
+
+
-
- None
+
+ Activo
-
- Seleccionar elements
+
+
-
- Psector id:
+
+ Descripción:
-
- None
+
+
-
- Número valor:
+
+ Explotación:
-
- None
+
+
-
- Text 6:
+
+ Total nodos:
-
+
None
-
- Text 5:
+
+ Total tramos:
-
+
None
-
- Text 4:
+
+ None
-
- None
+
+ Eliminar
@@ -7724,12 +7895,12 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
Gestión resultados precios
-
- Cerrar
+
+ Filtrar por:
-
- Cancelar
+
+ None
@@ -7740,27 +7911,27 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
Eliminar
-
- Gestión resultados precios
+
+ Resultado actual
-
+
None
-
- Resultado actual
+
+ Cerrar
-
- None
+
+ Cancelar
-
- Filtrar por:
+
+ Gestión resultados precios
-
+
None
@@ -7771,99 +7942,99 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
Cálculo de prioridad
-
- Cálculo de prioridad
+
+ Explotación:
-
+
None
-
- Motor de cálculo
+
+ Material
-
+
None
-
- Info Log
+
+ Catálogo
-
+
None
-
- Nombre del resultado:
+
+ Presupuesto anual:
-
+
None
-
- Parámetros de cálculo
+
+ Cancelar
-
+
None
-
- Cálculo
+
+ Info Log
-
+
None
-
- Material
+
+ None
-
- None
+
+ Seleccione los elementos en la vista de mapa
-
- Presupuesto anual:
+
+ Calcular
-
+
None
-
-
- Cancelar
+
+
+ Nombre del resultado:
-
+
None
-
- None
+
+ Zona de presión:
-
- Seleccione los elementos en la vista de mapa
+
+ None
-
- Material:
+
+ Motor de cálculo
-
+
None
-
- Explotación:
+
+ Selección de elementos
-
+
None
@@ -7875,59 +8046,59 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
None
-
- Calcular
+
+ Diámetro:
-
+
None
-
- Año horizonte:
+
+ Estado:
-
+
None
-
- Selección de elementos
+
+ Cálculo de prioridad
-
+
None
-
- Zona de presión:
+
+ Año horizonte:
-
+
None
-
- Diámetro:
+
+ Parámetros de cálculo
-
+
None
-
- Estado:
+
+ Cálculo
-
+
None
-
- Catálogo
+
+ Material:
-
+
None
@@ -7937,14 +8108,6 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
Gestor de resultados
-
-
- Infomación:
-
-
-
- None
-
Estado:
@@ -7954,35 +8117,35 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
None
-
- Gestor de resultados
+
+ Editar
-
+
None
-
- Filtrar por: Nombre del resultado
+
+ Cambiar estado
-
+
None
-
- Cambiar estado
+
+ Duplicar
-
+
None
-
- Eliminar
+
+ Explotación:
-
+
None
@@ -7994,35 +8157,43 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
None
-
- Explotación:
+
+ Tipo:
-
+
None
-
- Tipo:
+
+ Infomación:
-
+
None
-
- Duplicar
+
+ Filtrar por: Nombre del resultado
-
+
None
-
- Editar
+
+ Eliminar
-
+
+ None
+
+
+
+ Gestor de resultados
+
+
+
None
@@ -8033,27 +8204,27 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
Dibujar perfil
-
- None
+
+ Agregar punto final
-
+
None
-
- Título:
+
+ Agregar punto adicional
-
+
None
-
- Punto final:
+
+ Id perfil:
-
+
None
@@ -8065,75 +8236,75 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
None
-
- Agregar punto final
+
+ Guardar perfil
-
+
None
-
- Agregar punto adicional
+
+ Modelo:
-
+
None
-
- Id perfil:
+
+ Punto final:
-
+
None
-
- Cargar perfil
+
+ Rotación:
-
+
None
-
- Punto adicional:
+
+ Título:
-
+
None
-
+
Dibujar perfil
-
+
None
-
- Ruta:
+
+ Limpiar perfil
-
+
None
-
- Cerrar
+
+ ...
-
- Cerrar
+
+ None
-
- Agregar punto inicial
+
+ Escala vertical:
-
+
None
@@ -8145,19 +8316,19 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
None
-
- Escala vertical:
+
+ Agregar punto inicial
-
+
None
-
- Dibujar perfil
+
+ None
-
+
None
@@ -8169,43 +8340,43 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
None
-
- Rotación:
+
+ Cargar perfil
-
+
None
-
- Modelo:
+
+ Dibujar perfil
-
+
None
-
- Guardar perfil
+
+ Cerrar
-
- None
+
+ Cerrar
-
- ...
+
+ Punto adicional:
-
+
None
-
- Limpiar perfil
+
+ Ruta:
-
+
None
@@ -8260,15 +8431,7 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
- Aceptar
-
-
-
- Verificar proyecto
-
-
-
- None
+ Aceptar
@@ -8278,6 +8441,14 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
None
+
+
+ Verificar proyecto
+
+
+
+ None
+
psector_duplicate
@@ -8286,27 +8457,19 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
Duplicar sector
-
- Info log
+
+ Duplicar sector
-
+
None
-
- Cancelar
-
-
-
- Cancelar
-
-
-
- Duplicar sector:
+
+ Info log
-
+
None
@@ -8318,12 +8481,12 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
None
-
- Aceptar
+
+ Duplicar sector:
-
- Aceptar
+
+ None
@@ -8334,12 +8497,20 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
None
-
- Duplicar sector
+
+ Cancelar
-
- None
+
+ Cancelar
+
+
+
+ Aceptar
+
+
+
+ Aceptar
@@ -8348,14 +8519,6 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
Gestor de sector
-
-
- Sector actual
-
-
-
- None
-
Fusionar
@@ -8365,35 +8528,43 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
Para fusionar varios sectores en uno, tienes que seleccionarlos usando Ctrl y pulsar este botón
-
- Alterar activo
+
+ Filtrar por:
-
+
None
-
- Borrar
+
+ Duplicar
-
- Eliminar
+
+ None
-
- Filtrar por:
+
+ Sector actual
-
+
None
-
- Duplicar
+
+ Borrar
-
+
+ Eliminar
+
+
+
+ Gestor de sector
+
+
+
None
@@ -8405,20 +8576,20 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
Mostrar inactivos
-
- Cerrar
+
+ Alterar activo
-
- Cancelar
+
+ None
-
- Gestor de sector
+
+ Cerrar
-
- None
+
+ Cancelar
@@ -8428,19 +8599,27 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
Generador de informes
-
- Modelo:
+
+ Archivo CSV detalle:
-
+
None
-
- Crear
+
+ ...
-
+
+ None
+
+
+
+ Compositor deshabilitado
+
+
+
None
@@ -8452,27 +8631,27 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
None
-
- Cancelar
+
+ Reporte
-
- Cancelar
+
+ None
-
- Compositor deshabilitado
+
+ Cancelar
-
- None
+
+ Cancelar
-
- ...
+
+ Archivo CSV lista precios:
-
+
None
@@ -8484,27 +8663,19 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
None
-
- Reporte
-
-
-
- None
-
-
-
- Archivo CSV lista precios:
+
+ Crear
-
+
None
-
- Archivo CSV detalle:
+
+ Modelo:
-
+
None
@@ -8515,11 +8686,19 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
Selector de resultados
-
- Descripción:
+
+ Resultado
-
+
+ None
+
+
+
+ Cancelar
+
+
+
None
@@ -8531,11 +8710,11 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
None
-
- Cancelar
+
+ Selector de resultados
-
+
None
@@ -8547,11 +8726,11 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
None
-
- Resultado
+
+ Descripción:
-
+
None
@@ -8570,14 +8749,6 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
None
-
-
- Selector de resultados
-
-
-
- None
-
search
@@ -8585,6 +8756,14 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
Búsqueda
+
+
+ Búsqueda
+
+
+
+ None
+
Sin resultados
@@ -8601,14 +8780,6 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
None
-
-
- Búsqueda
-
-
-
- None
-
search_workcat
@@ -8617,11 +8788,11 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
Buscar expdte
-
- ...
+
+ Filtrar por:
-
+
None
@@ -8633,19 +8804,11 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
Cerrar
-
- Ruta de destino:
-
-
-
- None
-
-
-
- Documentos
+
+ ...
-
+
None
@@ -8665,11 +8828,19 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
None
-
- Activar
+
+ Filtrar por:
-
+
+ None
+
+
+
+ Documentos
+
+
+
None
@@ -8681,43 +8852,43 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
None
-
- Filtrar por:
+
+ Elementos dados de alta
-
+
None
-
- Activar
+
+ Buscar expdte
-
+
None
-
- Dado de baja
+
+ Activar
-
+
None
-
- Buscar expdte
+
+ Exportar a CSV
-
+
None
-
- Exportar a CSV
+
+ Dado de baja
-
+
None
@@ -8729,19 +8900,19 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
None
-
- Elementos dados de alta
+
+ Activar
-
+
None
-
- Filtrar por:
+
+ Ruta de destino:
-
+
None
@@ -8752,12 +8923,12 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
Selector
-
- Cerrar
+
+ Selector
-
- Cerrar
+
+ None
@@ -8768,12 +8939,12 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
Cerrar
-
- Selector
+
+ Cerrar
-
- None
+
+ Cerrar
@@ -8782,6 +8953,22 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
Selector de estado
+
+
+ Aceptar
+
+
+
+ None
+
+
+
+ Nuevo estado:
+
+
+
+ None
+
Selector de estado
@@ -8790,6 +8977,14 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
None
+
+
+ Cancelar
+
+
+
+ None
+
Está cambiando el estado del siguiente resultado:
@@ -8798,29 +8993,88 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
None
+
+
+ style_manager
- Cancelar
+ Cerrar
- None
+ Cerrar
-
- Nuevo estado:
+
+ Actualizar estilo
-
- None
+
+ Actualiza el estilo de la capa seleccionada con el estilo de la capa correspondiente en el proyecto
-
- Aceptar
+
+
-
- None
+
+ Eliminar categoría seleccionada
+
+
+
+
+
+
+
+ Añadir nueva categoría
+
+
+
+ Eliminar estilo
+
+
+
+ Elimina un estilo de la categoría
+
+
+
+
+
+
+
+ Todas tus categorías de estilos
+
+
+
+
+
+
+
+ Introduce el nombre de la capa para filtrar
+
+
+
+ Filtrar por: Nombre de la capa
+
+
+
+
+
+
+
+ Actualizar todo
+
+
+
+ Recarga los estilos cargados en el proyecto
+
+
+
+ Añadir estilo
+
+
+
+ Añadir una capa a la categoría seleccionada
@@ -8837,14 +9091,6 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
None
-
-
- Cerrar
-
-
-
- Cerrar
-
Cancelar
@@ -8854,19 +9100,19 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
Cancelar
-
- Info log
+
+ Caja de herramientas
-
+
None
-
- Caja de herramientas
+
+ Info log
-
+
None
@@ -8877,6 +9123,14 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
None
+
+
+ Cerrar
+
+
+
+ Cerrar
+
toolbox_docker
@@ -8900,107 +9154,107 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
Visita
-
- None
+
+ Evento
-
- Crear nuevo documento
+
+ None
-
- Relaciones
+
+ None
-
- Relaciones
+
+ Abrir documento
-
- Tipo de elemento:
+
+ Añadir geometría
-
+
None
-
- None
+
+ Información:
-
- Insertar documento
+
+ None
-
- Cancelar
+
+ Tipo de elemento:
-
- Cancelar
+
+ None
-
- Documento
+
+ Hasta:
-
+
None
-
- Código:
-
-
-
+
None
-
- Evento
+
+ Crear nuevo documento
-
+
None
-
- Nombre de usuario:
+
+ Borrar documento
-
+
+ Borrar evento
+
+
+
None
-
- Desde:
+
+ Insertar evento
-
+
None
-
- Aceptar
+
+ Actualizar evento
-
- Aceptar
+
+ None
-
- Estado:
+
+ None
-
+
None
-
- Descripción:
+
+ None
-
+
None
@@ -9012,116 +9266,116 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
None
-
- None
+
+ Descripción:
-
+
None
-
- Id:
+
+ Estado:
-
+
None
-
- Visita
+
+ Desde:
-
+
None
-
- None
+
+ Relaciones
-
- Abrir documento
+
+ Relaciones
-
- Visita
+
+ Código:
-
+
None
-
- None
+
+ Documento
-
+
None
-
- Actualizar evento
+
+ Nombre de usuario:
-
+
None
-
- Insertar evento
+
+ Visit cat id:
-
+
None
-
- Borrar evento
+
+ Cancelar
-
- None
+
+ Cancelar
-
- Información:
+
+ None
-
- None
+
+ Insertar documento
-
- None
+
+ Id:
-
- Borrar documento
+
+ None
-
- Visit cat id:
+
+ Visita
-
+
None
-
- Hasta:
+
+ Visita
-
+
None
-
- Añadir geometría
+
+ Aceptar
-
- None
+
+ Aceptar
@@ -9130,6 +9384,14 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
Cargar documentos
+
+
+ Cargar documentos
+
+
+
+ None
+
Id visita:
@@ -9146,14 +9408,6 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
None
-
-
- Cargar documentos
-
-
-
- None
-
visit_event
@@ -9162,27 +9416,27 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
Evento estándar de arco
-
- Id parámetro:
+
+ Borrar archivo
-
+
None
-
- Archivos:
+
+ Evento estándar de arco
-
+
None
-
- Id posición:
+
+ Valor:
-
+
None
@@ -9194,43 +9448,43 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
None
-
- Borrar archivo
+
+ Id parámetro:
-
+
None
-
- Texto:
+
+ Valor posición:
-
+
None
-
- Valor posición:
+
+ Id posición:
-
+
None
-
- Evento estándar de arco
+
+ Archivos:
-
+
None
-
- Valor:
+
+ Texto:
-
+
None
@@ -9241,27 +9495,19 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
Evento
-
- Geom 3:
-
-
-
- None
-
-
-
- Valor 2:
+
+ Cerrar
-
- None
+
+ Cerrar
-
- Valor:
+
+ Último valor:
-
+
None
@@ -9273,27 +9519,19 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
None
-
- Último valor:
-
-
-
- None
-
-
-
- Factor de peso:
+
+ Valor:
-
+
None
-
- Coordenada X:
+
+ Valor 2:
-
+
None
@@ -9304,14 +9542,6 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
None
-
-
- Información
-
-
-
- None
-
Valor 1:
@@ -9321,12 +9551,12 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
None
-
- Coordenada Y:
+
+ Id visita:
-
- None
+
+ Visita ID
@@ -9368,14 +9598,6 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
None
-
-
- Id visita:
-
-
-
- Visita ID
-
Código evento:
@@ -9416,6 +9638,30 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
None
+
+
+ Geom 3:
+
+
+
+ None
+
+
+
+ Coordenada Y:
+
+
+
+ None
+
+
+
+ Coordenada X:
+
+
+
+ None
+
Texto:
@@ -9425,12 +9671,20 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
None
-
- Cerrar
+
+ Información
-
- Cerrar
+
+ None
+
+
+
+ Factor de peso:
+
+
+
+ None
@@ -9440,51 +9694,51 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
Evento rehabilitación de arco
-
- Evento rehabilitación de arco
+
+ Borrar archivo
-
+
None
-
- Borrar archivo
+
+ Valor 2:
-
+
None
-
- Id parámetro:
+
+ Texto:
-
+
None
-
- Archivos:
+
+ Id posición:
-
+
None
-
- Geom 1:
+
+ Id parámetro:
-
+
None
-
- Añadir archivo
+
+ Geom 2:
-
+
None
@@ -9496,11 +9750,11 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
None
-
- Valor 1:
+
+ Añadir archivo
-
+
None
@@ -9512,35 +9766,35 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
None
-
- Geom 2:
+
+ Geom 1:
-
+
None
-
- Id posición:
+
+ Evento rehabilitación de arco
-
+
None
-
- Valor 2:
+
+ Archivos:
-
+
None
-
- Texto:
+
+ Valor 1:
-
+
None
@@ -9559,20 +9813,20 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
None
-
+
None
-
+
None
-
- Id visita:
+
+ None
-
- Visita ID
+
+ None
@@ -9591,12 +9845,12 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
None
-
- None
+
+ Id visita:
-
- None
+
+ Visita ID
@@ -9606,19 +9860,11 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
Zum de la galería
-
- Id evento:
-
-
-
- None
-
-
-
- lbl_img_zoom
+
+ Zum de la galería
-
+
None
@@ -9630,27 +9876,35 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
Visita ID
-
- Zum de la galería
+
+ Id evento:
-
+
None
-
+
None
-
+
None
-
+
+ lbl_img_zoom
+
+
+
None
-
+
+ None
+
+
+
None
@@ -9661,12 +9915,12 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
Añadir foto
-
- Enlace:
+
+ Cancelar
-
- Enlace
+
+ Cancelar
@@ -9677,79 +9931,79 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
Aceptar
-
- Añadir foto
+
+ ...
-
+
None
-
- ...
+
+ Enlace:
-
- None
+
+ Enlace
-
- Cancelar
+
+ Añadir foto
-
- Cancelar
+
+ None
workspace_create
-
- txt_workspace_name
+
+ Nombre:
-
- Nombre del nuevo espacio de trabajo *Obligatorio
+
+ Nombre del nuevo espacio de trabajo
-
- Descripción:
+
+ Aceptar
-
- Descripción del nuevo espacio de trabajo
+
+ None
-
- Cancelar
+
+ Actualizar
-
+
None
-
- txt_workspace_descript
+
+ Descripción:
-
- Utiliza este campo para describir el espacio de trabajo
+
+ Descripción del nuevo espacio de trabajo
-
- Actualizar
+
+ txt_workspace_descript
-
- None
+
+ Utiliza este campo para describir el espacio de trabajo
-
- Aceptar
+
+ txt_workspace_name
-
- None
+
+ Nombre del nuevo espacio de trabajo *Obligatorio
@@ -9760,16 +10014,24 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
None
-
- Nombre:
+
+ Cancelar
-
- Nombre del nuevo espacio de trabajo
+
+ None
workspace_manager
+
+
+ Cerrar
+
+
+
+ None
+
Restablecer
@@ -9778,6 +10040,14 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
Restablece los valores del espacio de trabajo actual
+
+
+ Filtrar por: Nombre
+
+
+
+ None
+
Eliminar
@@ -9787,20 +10057,20 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
Elimina el espacio de trabajo seleccionado
-
- Filtrar por: Nombre
+
+ Crear
-
- None
+
+ Crear
-
- Cerrar
+
+ txt_name
-
- None
+
+ Nombre del espacio de trabajo
@@ -9818,22 +10088,6 @@ Por otro lado, debe saber que la tabla de trazabilidad almacenará información
Utiliza el espacio de trabajo seleccionado
-
-
- txt_name
-
-
-
- Nombre del espacio de trabajo
-
-
-
- Crear
-
-
-
- Crear
-
diff --git a/icons/dialogs/24x24/181.png b/icons/dialogs/24x24/181.png
index 9c1f028ef..d1ac6f6e1 100644
Binary files a/icons/dialogs/24x24/181.png and b/icons/dialogs/24x24/181.png differ
diff --git a/icons/toolbars/toc/308.png b/icons/toolbars/toc/308.png
index 1a2913074..40433f38f 100644
Binary files a/icons/toolbars/toc/308.png and b/icons/toolbars/toc/308.png differ
diff --git a/libs b/libs
index 2c88c40bc..69c065838 160000
--- a/libs
+++ b/libs
@@ -1 +1 @@
-Subproject commit 2c88c40bc4fbf6d5dec8377ac23e76877721a88c
+Subproject commit 69c06583873a9b2f07451f7da692afb3b1fd1b3a
diff --git a/main.py b/main.py
index 0dababb00..1473d22e0 100644
--- a/main.py
+++ b/main.py
@@ -322,20 +322,21 @@ def _set_info_button(self):
"""
# Create instance class and add button into QGIS toolbar
- main_toolbutton = QToolButton()
- self.action_info = self.iface.addToolBarWidget(main_toolbutton)
-
- # Set icon button if exists
- icon_path = self.icon_folder + '36.png'
- if os.path.exists(icon_path):
- icon = QIcon(icon_path)
- self.action = QAction(icon, "Show info", self.iface.mainWindow())
- else:
- self.action = QAction("Show info", self.iface.mainWindow())
+ if not hasattr(self, 'action_info') or self.action_info is None:
+ main_toolbutton = QToolButton()
+ self.action_info = self.iface.addToolBarWidget(main_toolbutton)
+
+ # Set icon button if exists
+ icon_path = self.icon_folder + '36.png'
+ if os.path.exists(icon_path):
+ icon = QIcon(icon_path)
+ self.action = QAction(icon, "Show info", self.iface.mainWindow())
+ else:
+ self.action = QAction("Show info", self.iface.mainWindow())
- main_toolbutton.setDefaultAction(self.action)
- admin_button = GwAdminButton()
- self.action.triggered.connect(partial(admin_button.init_sql, True))
+ main_toolbutton.setDefaultAction(self.action)
+ admin_button = GwAdminButton()
+ self.action.triggered.connect(partial(admin_button.init_sql, True))
def _unset_info_button(self):
@@ -359,7 +360,7 @@ def _unset_toc_buttons(self):
toolbar = self.iface.mainWindow().findChild(QDockWidget, 'Layers').findChildren(QToolBar)[-1]
for action in toolbar.actions():
- if action.objectName() not in ('GwAddChildLayerButton', 'GwEpaWorldButton'):
+ if action.objectName() not in ('GwAddChildLayerButton', 'GwLayerStyleChangeButton'):
continue
toolbar.removeAction(action) # Remove from toolbar
action.deleteLater() # Schedule for deletion
@@ -384,7 +385,11 @@ def _project_read(self, show_warning=True, hide_gw_button=True):
# Create class to manage code that performs project configuration
self.load_project = GwLoadProject()
- self.load_project.project_read(show_warning, self)
+
+ # If it is not a Giswater project, display admin button
+ is_gw_project = self.load_project.project_read(show_warning, self)
+ if is_gw_project is False:
+ self._set_info_button()
def save_project(self):
diff --git a/metadata.txt b/metadata.txt
index 194ce204a..07c663c17 100644
--- a/metadata.txt
+++ b/metadata.txt
@@ -4,14 +4,21 @@ qgisMinimumVersion=3.22
qgisMaximumVersion=3.38
description=Plugin to manage water networks (water supply, sewerage and urban drainage) using QGIS and PostGIS-PostgreSQL
about=Disclaimer: This plugin is released using the open source GNU-GPL3 license. Although a reasonable effort has been made to assure that the results obtained are correct, some of the capabilities provided by Giswater are experimental, therefore the development team and the Giswater Association are not responsible and assume no liability whatsoever for any results or any use made of the results obtained from the program, nor for any damages or litigation that result from the use of these programs for any purpose.
-version=3.6.011
-author=David Erill, Barbara Rzepka, Sergi Muñoz, Josep Lluís Sala, Edgar Fusté, Albert Bofill, Sergi Maspons, Elies Bertran, Abel García Juanes, Maria Guzmán, Jordi Blanch, Xavier Torret
+version=3.6.012
+author=David Erill, Barbara Rzepka, Sergi Muñoz, Josep Lluís Sala, Edgar Fusté, Albert Bofill, Sergi Maspons, Elies Bertran, Abel García Juanes, Maria Guzmán, Jordi Blanch, Xavier Torret, Daniel Marín, Ferran Martínez
-Changelog=Version 3.6.011
- - Add support for tab visit in Giswater Info
- - Remove psector_type combobox from psector dialog
- - Add combo for feature_type on dimensions dialog [ARC, NODE, CONNEC {GULLY}]
- - Several bugs fixed
+Changelog=Version 3.6.012
+ - Change "Set archive" button to "Toggle archive" (go2epa manager)
+ - Show the dates when an EPA result has been corporate
+ - New button "Show INP data" in go2epa manager
+ - Add the option to set geometry to a document (it can automatically get coordinates from the document's metadata)
+ - Add "name" field for documents
+ - Add workcat, psector & visit tabs in document dialog
+ - Create workcat manager
+ - Allow tab ordering in GwInfo (via config_form_tabs)
+ - New style manager & style change button
+ - Improve mincut dialog by ordering the toolbar actions
+ - Remove prices manager
tags= giswater, water networks, sewerage, urban drainage, EPANET, SWMM
diff --git a/resources/templates/qgisproject/en_US/ud_epa.qgs b/resources/templates/qgisproject/en_US/ud_epa.qgs
index c1af03aaa..90daaf286 100644
--- a/resources/templates/qgisproject/en_US/ud_epa.qgs
+++ b/resources/templates/qgisproject/en_US/ud_epa.qgs
@@ -406,12 +406,12 @@
-
+
-
+
@@ -488,7 +488,7 @@
- v_rpt_arcflow_sum_fe94697c_63f1_4c02_bc5e_4ba0545170ba
- v_rpt_condsurcharge_sum_e28a01ad_4d2b_4d06_8d45_125bab49ea0d
- v_rpt_flowclass_sum_74485e21_3847_464e_9b2b_5e10a61ceebc
- - v_rpt_lidperfomance_sum_52b548dc_286d_4302_b8ba_4abc723c1cd2
+ - v_rpt_lidperformance_sum_52b548dc_286d_4302_b8ba_4abc723c1cd2
- v_rpt_nodedepth_sum_f84277ab_00b9_4201_86ba_4f07e698d8e4
- v_rpt_nodeflooding_sum_69028733_3c38_420a_8c26_d10e8f2a4a3e
- v_rpt_nodeinflow_sum_1d195e0b_680d_435f_87e6_1e4a23a90ccc
@@ -498,7 +498,7 @@
- v_rpt_pumping_sum_3479daea_2671_4c8a_8119_e6046cdb3cd2
- v_rpt_storagevol_sum_28e9ebe5_9723_4378_bb06_8d6fc1cc2c4c
- v_rpt_subcatchrunoff_sum_e1348135_a2a0_407b_95a9_dfe57f782a63
- - v_rpt_subcatchwasoff_sum_30c8fcc2_d459_46b6_82bc_71a31639446d
+ - v_rpt_subcatchwashoff_sum_30c8fcc2_d459_46b6_82bc_71a31639446d
- v_edit_drainzone_1d49c80f_0cc5_47f7_b6f7_d7f289206355
- v_edit_inp_subc2outlet_9a12ff97_e3af_48d5_b126_f6f04575333e
- cat_mat_gully_76f1a06f_61a7_45d2_a85f_8f0a098fc96d
@@ -513,7 +513,7 @@
-
+
@@ -521,7 +521,7 @@
-
+
@@ -938,12 +938,12 @@
-
+
-
+
@@ -1100,8 +1100,8 @@
-
-
+
+
@@ -1732,8 +1732,8 @@
-
-
+
+
@@ -2155,8 +2155,8 @@
-
-
+
+
@@ -2611,8 +2611,8 @@
-
-
+
+
@@ -2913,8 +2913,8 @@
-
-
+
+
@@ -3204,8 +3204,8 @@
-
-
+
+
@@ -3495,8 +3495,8 @@
-
-
+
+
@@ -3786,8 +3786,8 @@
-
-
+
+
@@ -4260,8 +4260,8 @@
-
-
+
+
@@ -4733,8 +4733,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -5074,8 +5074,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -7758,8 +7758,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -8093,8 +8093,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -8428,8 +8428,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -8763,8 +8763,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -9098,8 +9098,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -9444,8 +9444,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -9865,8 +9865,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -10231,8 +10231,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -11726,8 +11726,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -14056,8 +14056,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -14472,8 +14472,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -15351,8 +15351,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -15744,8 +15744,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -17494,8 +17494,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -18836,8 +18836,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -19593,8 +19593,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -20240,8 +20240,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -20824,8 +20824,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -21378,8 +21378,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -22082,8 +22082,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -23066,8 +23066,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -23762,8 +23762,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -24836,8 +24836,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -25870,8 +25870,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -26567,8 +26567,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -27497,8 +27497,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -27838,8 +27838,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -28767,8 +28767,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -29599,8 +29599,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -30074,8 +30074,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -30738,8 +30738,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -31113,8 +31113,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -31767,8 +31767,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -32829,8 +32829,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -33935,8 +33935,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -36100,8 +36100,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -36547,8 +36547,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -36951,8 +36951,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -37621,8 +37621,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -38239,8 +38239,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -38912,8 +38912,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -40003,8 +40003,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -40511,8 +40511,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -41087,8 +41087,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -41648,8 +41648,8 @@ def my_form_open(dialog, layer, feature):
- v_rpt_lidperfomance_sum_52b548dc_286d_4302_b8ba_4abc723c1cd2
- __DATASOURCE__ key='id' srid=__SRID__ type=MultiPolygon checkPrimaryKeyUnicity='1' table="SCHEMA_NAME"."v_rpt_lidperfomance_sum" (the_geom)
+ v_rpt_lidperformance_sum_52b548dc_286d_4302_b8ba_4abc723c1cd2
+ __DATASOURCE__ key='id' srid=__SRID__ type=MultiPolygon checkPrimaryKeyUnicity='1' table="SCHEMA_NAME"."v_rpt_lidperformance_sum" (the_geom)
@@ -41697,8 +41697,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -42297,8 +42297,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -42882,8 +42882,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -43943,8 +43943,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -44570,8 +44570,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -45125,8 +45125,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -45676,8 +45676,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -46193,8 +46193,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -46837,8 +46837,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -47456,8 +47456,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -48258,8 +48258,8 @@ def my_form_open(dialog, layer, feature):
- v_rpt_subcatchwasoff_sum_30c8fcc2_d459_46b6_82bc_71a31639446d
- __DATASOURCE__ key='id' srid=__SRID__ type=MultiPolygon checkPrimaryKeyUnicity='1' table="SCHEMA_NAME"."v_rpt_subcatchwasoff_sum" (the_geom)
+ v_rpt_subcatchwashoff_sum_30c8fcc2_d459_46b6_82bc_71a31639446d
+ __DATASOURCE__ key='id' srid=__SRID__ type=MultiPolygon checkPrimaryKeyUnicity='1' table="SCHEMA_NAME"."v_rpt_subcatchwashoff_sum" (the_geom)
@@ -48307,8 +48307,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -48805,8 +48805,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -49288,8 +49288,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -49779,8 +49779,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -50360,8 +50360,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -50775,7 +50775,7 @@ def my_form_open(dialog, layer, feature):
-
+
@@ -50785,7 +50785,7 @@ def my_form_open(dialog, layer, feature):
-
+
diff --git a/resources/templates/qgisproject/en_US/ud_inventory.qgs b/resources/templates/qgisproject/en_US/ud_inventory.qgs
index aaa50d126..260cfeb61 100644
--- a/resources/templates/qgisproject/en_US/ud_inventory.qgs
+++ b/resources/templates/qgisproject/en_US/ud_inventory.qgs
@@ -568,8 +568,8 @@
-
-
+
+
@@ -1200,8 +1200,8 @@
-
-
+
+
@@ -1623,8 +1623,8 @@
-
-
+
+
@@ -2079,8 +2079,8 @@
-
-
+
+
@@ -2381,8 +2381,8 @@
-
-
+
+
@@ -2672,8 +2672,8 @@
-
-
+
+
@@ -2963,8 +2963,8 @@
-
-
+
+
@@ -3254,8 +3254,8 @@
-
-
+
+
@@ -3728,8 +3728,8 @@
-
-
+
+
@@ -4230,8 +4230,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -6914,8 +6914,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -7249,8 +7249,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -7584,8 +7584,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -7930,8 +7930,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -8380,8 +8380,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -9875,8 +9875,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -12205,8 +12205,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -12621,8 +12621,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -13500,8 +13500,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -13893,8 +13893,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -15626,8 +15626,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -16732,8 +16732,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -18897,8 +18897,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -19301,8 +19301,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -19971,8 +19971,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -20589,8 +20589,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -21279,8 +21279,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -21762,8 +21762,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -22253,8 +22253,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
diff --git a/resources/templates/qgisproject/en_US/ud_master.qgs b/resources/templates/qgisproject/en_US/ud_master.qgs
index afe0b631a..0256bb409 100644
--- a/resources/templates/qgisproject/en_US/ud_master.qgs
+++ b/resources/templates/qgisproject/en_US/ud_master.qgs
@@ -406,12 +406,12 @@
-
+
-
+
@@ -553,7 +553,7 @@
- v_rpt_arcflow_sum_fe94697c_63f1_4c02_bc5e_4ba0545170ba
- v_rpt_condsurcharge_sum_e28a01ad_4d2b_4d06_8d45_125bab49ea0d
- v_rpt_flowclass_sum_74485e21_3847_464e_9b2b_5e10a61ceebc
- - v_rpt_lidperfomance_sum_52b548dc_286d_4302_b8ba_4abc723c1cd2
+ - v_rpt_lidperformance_sum_52b548dc_286d_4302_b8ba_4abc723c1cd2
- v_rpt_nodedepth_sum_f84277ab_00b9_4201_86ba_4f07e698d8e4
- v_rpt_nodeflooding_sum_69028733_3c38_420a_8c26_d10e8f2a4a3e
- v_rpt_nodeinflow_sum_1d195e0b_680d_435f_87e6_1e4a23a90ccc
@@ -563,7 +563,7 @@
- v_rpt_pumping_sum_3479daea_2671_4c8a_8119_e6046cdb3cd2
- v_rpt_storagevol_sum_28e9ebe5_9723_4378_bb06_8d6fc1cc2c4c
- v_rpt_subcatchrunoff_sum_e1348135_a2a0_407b_95a9_dfe57f782a63
- - v_rpt_subcatchwasoff_sum_30c8fcc2_d459_46b6_82bc_71a31639446d
+ - v_rpt_subcatchwashoff_sum_30c8fcc2_d459_46b6_82bc_71a31639446d
- v_plan_psector_arc_dc4a3df0_fa35_428b_9327_a36255ef653b
- v_plan_psector_node_27b614c1_4c89_4dcf_8505_73bee9ff4b28
- v_edit_drainzone_1d49c80f_0cc5_47f7_b6f7_d7f289206355
@@ -581,7 +581,7 @@
-
+
@@ -592,7 +592,7 @@
-
+
@@ -1012,12 +1012,12 @@
-
+
-
+
@@ -1225,8 +1225,8 @@
-
-
+
+
@@ -1857,8 +1857,8 @@
-
-
+
+
@@ -2280,8 +2280,8 @@
-
-
+
+
@@ -2736,8 +2736,8 @@
-
-
+
+
@@ -3038,8 +3038,8 @@
-
-
+
+
@@ -3329,8 +3329,8 @@
-
-
+
+
@@ -3620,8 +3620,8 @@
-
-
+
+
@@ -3911,8 +3911,8 @@
-
-
+
+
@@ -4385,8 +4385,8 @@
-
-
+
+
@@ -4858,8 +4858,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -5170,8 +5170,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -5493,8 +5493,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -5821,8 +5821,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -8505,8 +8505,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -8840,8 +8840,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -9175,8 +9175,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -9510,8 +9510,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -9845,8 +9845,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -10191,8 +10191,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -10612,8 +10612,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -10978,8 +10978,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -12473,8 +12473,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -14803,8 +14803,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -15219,8 +15219,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -16098,8 +16098,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -16491,8 +16491,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -18241,8 +18241,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -19583,8 +19583,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -20340,8 +20340,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -20987,8 +20987,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -21571,8 +21571,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -22125,8 +22125,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -22829,8 +22829,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -23813,8 +23813,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -24509,8 +24509,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -25583,8 +25583,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -26617,8 +26617,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -27314,8 +27314,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -28244,8 +28244,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -28585,8 +28585,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -29514,8 +29514,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -30346,8 +30346,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -30821,8 +30821,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -31485,8 +31485,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -31860,8 +31860,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -32514,8 +32514,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -33576,8 +33576,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -34682,8 +34682,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -36864,8 +36864,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -37777,8 +37777,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -38224,8 +38224,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -38628,8 +38628,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -39298,8 +39298,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -39916,8 +39916,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -40601,8 +40601,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -41487,8 +41487,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -41923,8 +41923,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -42486,8 +42486,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -43019,8 +43019,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -43464,8 +43464,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -43881,8 +43881,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -44972,8 +44972,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -45480,8 +45480,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -46056,8 +46056,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -46617,8 +46617,8 @@ def my_form_open(dialog, layer, feature):
- v_rpt_lidperfomance_sum_52b548dc_286d_4302_b8ba_4abc723c1cd2
- __DATASOURCE__ key='id' srid=__SRID__ type=MultiPolygon checkPrimaryKeyUnicity='1' table="SCHEMA_NAME"."v_rpt_lidperfomance_sum" (the_geom)
+ v_rpt_lidperformance_sum_52b548dc_286d_4302_b8ba_4abc723c1cd2
+ __DATASOURCE__ key='id' srid=__SRID__ type=MultiPolygon checkPrimaryKeyUnicity='1' table="SCHEMA_NAME"."v_rpt_lidperformance_sum" (the_geom)
@@ -46666,8 +46666,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -47266,8 +47266,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -47851,8 +47851,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -48912,8 +48912,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -49539,8 +49539,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -50094,8 +50094,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -50645,8 +50645,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -51162,8 +51162,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -51806,8 +51806,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -52425,8 +52425,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -53227,8 +53227,8 @@ def my_form_open(dialog, layer, feature):
- v_rpt_subcatchwasoff_sum_30c8fcc2_d459_46b6_82bc_71a31639446d
- __DATASOURCE__ key='id' srid=__SRID__ type=MultiPolygon checkPrimaryKeyUnicity='1' table="SCHEMA_NAME"."v_rpt_subcatchwasoff_sum" (the_geom)
+ v_rpt_subcatchwashoff_sum_30c8fcc2_d459_46b6_82bc_71a31639446d
+ __DATASOURCE__ key='id' srid=__SRID__ type=MultiPolygon checkPrimaryKeyUnicity='1' table="SCHEMA_NAME"."v_rpt_subcatchwashoff_sum" (the_geom)
@@ -53276,8 +53276,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -53774,8 +53774,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -54257,8 +54257,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -54748,8 +54748,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -55329,8 +55329,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -55749,7 +55749,7 @@ def my_form_open(dialog, layer, feature):
-
+
@@ -55759,7 +55759,7 @@ def my_form_open(dialog, layer, feature):
-
+
diff --git a/resources/templates/qgisproject/en_US/ud_om.qgs b/resources/templates/qgisproject/en_US/ud_om.qgs
index 432230458..255250103 100644
--- a/resources/templates/qgisproject/en_US/ud_om.qgs
+++ b/resources/templates/qgisproject/en_US/ud_om.qgs
@@ -568,8 +568,8 @@
-
-
+
+
@@ -1200,8 +1200,8 @@
-
-
+
+
@@ -1623,8 +1623,8 @@
-
-
+
+
@@ -2079,8 +2079,8 @@
-
-
+
+
@@ -2381,8 +2381,8 @@
-
-
+
+
@@ -2672,8 +2672,8 @@
-
-
+
+
@@ -2963,8 +2963,8 @@
-
-
+
+
@@ -3254,8 +3254,8 @@
-
-
+
+
@@ -3728,8 +3728,8 @@
-
-
+
+
@@ -4230,8 +4230,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -6914,8 +6914,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -7249,8 +7249,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -7584,8 +7584,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -7930,8 +7930,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -8380,8 +8380,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -9875,8 +9875,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -12205,8 +12205,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -12621,8 +12621,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -13500,8 +13500,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -13893,8 +13893,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -15626,8 +15626,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -16732,8 +16732,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -18897,8 +18897,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -19301,8 +19301,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -19971,8 +19971,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -20589,8 +20589,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -21279,8 +21279,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -21762,8 +21762,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -22253,8 +22253,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
diff --git a/resources/templates/qgisproject/en_US/ws_epa.qgs b/resources/templates/qgisproject/en_US/ws_epa.qgs
index 32a5fbdf2..f846dcc53 100644
--- a/resources/templates/qgisproject/en_US/ws_epa.qgs
+++ b/resources/templates/qgisproject/en_US/ws_epa.qgs
@@ -903,8 +903,8 @@
-
-
+
+
@@ -1969,8 +1969,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -2702,8 +2702,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -3216,8 +3216,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -3529,8 +3529,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -3842,8 +3842,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -4230,8 +4230,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -4904,8 +4904,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -5410,8 +5410,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -7722,8 +7722,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -8057,8 +8057,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -8392,8 +8392,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -8727,8 +8727,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -9157,8 +9157,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -11531,8 +11531,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -14000,8 +14000,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -14674,8 +14674,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -15300,8 +15300,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -16303,8 +16303,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -16833,8 +16833,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -18009,8 +18009,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -18866,8 +18866,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -19927,8 +19927,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -20785,8 +20785,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -21603,8 +21603,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -22300,8 +22300,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -23153,8 +23153,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -23980,8 +23980,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -24808,8 +24808,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -25611,8 +25611,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -26517,8 +26517,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -27689,8 +27689,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -31656,8 +31656,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -32217,8 +32217,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -32787,8 +32787,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -33455,8 +33455,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -34066,8 +34066,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -34756,8 +34756,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -35264,8 +35264,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -35725,8 +35725,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -36672,8 +36672,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -37145,8 +37145,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -37759,8 +37759,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -38985,8 +38985,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -40307,8 +40307,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -41505,8 +41505,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -42566,8 +42566,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -43525,8 +43525,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -44462,8 +44462,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -44983,8 +44983,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
diff --git a/resources/templates/qgisproject/en_US/ws_inventory.qgs b/resources/templates/qgisproject/en_US/ws_inventory.qgs
index 2333e8575..083ffd555 100644
--- a/resources/templates/qgisproject/en_US/ws_inventory.qgs
+++ b/resources/templates/qgisproject/en_US/ws_inventory.qgs
@@ -522,8 +522,8 @@
-
-
+
+
@@ -1255,8 +1255,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -1769,8 +1769,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -2082,8 +2082,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -2412,8 +2412,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -3086,8 +3086,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -3592,8 +3592,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -5904,8 +5904,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -6239,8 +6239,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -6574,8 +6574,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -7004,8 +7004,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -9378,8 +9378,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -11847,8 +11847,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -12521,8 +12521,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -13147,8 +13147,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -14150,8 +14150,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -14680,8 +14680,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -15852,8 +15852,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -19819,8 +19819,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -20380,8 +20380,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -20950,8 +20950,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -21618,8 +21618,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -22229,8 +22229,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -22931,8 +22931,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -23452,8 +23452,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
diff --git a/resources/templates/qgisproject/en_US/ws_master.qgs b/resources/templates/qgisproject/en_US/ws_master.qgs
index 8a8f3821d..dc9021579 100644
--- a/resources/templates/qgisproject/en_US/ws_master.qgs
+++ b/resources/templates/qgisproject/en_US/ws_master.qgs
@@ -1016,8 +1016,8 @@
-
-
+
+
@@ -2082,8 +2082,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -2815,8 +2815,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -3329,8 +3329,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -3642,8 +3642,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -3955,8 +3955,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -4343,8 +4343,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -5017,8 +5017,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -5494,8 +5494,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -5806,8 +5806,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -6177,8 +6177,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -8489,8 +8489,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -8824,8 +8824,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -9159,8 +9159,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -9494,8 +9494,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -9924,8 +9924,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -12298,8 +12298,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -14767,8 +14767,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -15441,8 +15441,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -16067,8 +16067,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -17070,8 +17070,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -17600,8 +17600,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -18776,8 +18776,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -19633,8 +19633,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -20694,8 +20694,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -21552,8 +21552,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -22370,8 +22370,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -23067,8 +23067,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -23920,8 +23920,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -24747,8 +24747,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -25575,8 +25575,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -26378,8 +26378,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -27284,8 +27284,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -28456,8 +28456,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -32423,8 +32423,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -33357,8 +33357,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -33918,8 +33918,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -34488,8 +34488,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -35156,8 +35156,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -35767,8 +35767,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -36457,8 +36457,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -36965,8 +36965,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -37426,8 +37426,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -38373,8 +38373,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -38846,8 +38846,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -39472,8 +39472,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -40338,8 +40338,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -40826,8 +40826,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -41470,8 +41470,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -42040,8 +42040,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -42522,8 +42522,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -43748,8 +43748,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -45070,8 +45070,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -46268,8 +46268,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -47329,8 +47329,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -48288,8 +48288,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -49225,8 +49225,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -49746,8 +49746,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
diff --git a/resources/templates/qgisproject/en_US/ws_om.qgs b/resources/templates/qgisproject/en_US/ws_om.qgs
index fe6d5e76e..045901eaf 100644
--- a/resources/templates/qgisproject/en_US/ws_om.qgs
+++ b/resources/templates/qgisproject/en_US/ws_om.qgs
@@ -596,8 +596,8 @@
-
-
+
+
@@ -1329,8 +1329,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -1843,8 +1843,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -2156,8 +2156,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -2486,8 +2486,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -3160,8 +3160,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -3666,8 +3666,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -5978,8 +5978,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -6313,8 +6313,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -6648,8 +6648,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -7078,8 +7078,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+
@@ -9452,8 +9452,8 @@ def my_form_open(dialog, layer, feature):
-
-
+
+