Skip to content

Commit

Permalink
Merge pull request #88 from geo2france/dev
Browse files Browse the repository at this point in the history
0.2.5
  • Loading branch information
jbdesbas authored Oct 10, 2024
2 parents b8cce67 + 15ab3a9 commit 37caddd
Show file tree
Hide file tree
Showing 24 changed files with 560 additions and 495 deletions.
11 changes: 11 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
__pycache__/

# Project specific files
plugin/idg/config/*.png
plugin/idg/config/*.jpg
plugin/idg/config/*.jpeg
plugin/idg/config/*.qgz
plugin/idg/config/*.qgs

# PyCharm
.idea/
29 changes: 13 additions & 16 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,12 @@

Plugin pour QGIS 3 fournissant un accès simple aux données de l'ensemble des Infrastructure de Données Géographiques (IDG) et d'autres ressources nationales géographiques utiles.

Canal de discussions : https://matrix.to/#/!DqHgKIoltGIikFRreo:matrix.org
Canal de discussions : <https://matrix.to/#/!DqHgKIoltGIikFRreo:matrix.org>

![QGIS Browser](repo/screenshot_browser_1.png)

Accès aux données des plateformes :

- [DataGrandEst](https://datagrandest.fr/)
- [GéoBretagne](https://geobretagne.fr)
- [Géo2France](https://geo2france.fr)
Expand All @@ -17,12 +18,10 @@ Accès aux données des plateformes :

Pré-requis :

* QGIS version LTR [3.28] ou supérieure
* Une connexion Internet

* Installation depuis le dépot QGIS : dans le gestionnaire d'exentions (Extensions > Installer/Gérer les extensions), activer les extensions expérimentales et rechercher le plugin _IDG_
* Installation depuis le fichier zip : télécharger depuis la derniere [release](https://github.com/geo2france/idg-qgis-plugin/releases) depuis le dépot github.

- QGIS version LTR [3.28] ou supérieure
- Une connexion Internet
- Installation depuis le dépot QGIS : dans le gestionnaire d'exentions (Extensions > Installer/Gérer les extensions), activer les extensions expérimentales et rechercher le plugin _IDG_
- Installation depuis le fichier zip : télécharger depuis la derniere [release](https://github.com/geo2france/idg-qgis-plugin/releases) depuis le dépot github.

## Utilisation

Expand All @@ -32,27 +31,26 @@ Créer un nouveau projet et y ajouter les couches que vous souhaitez diffuser.
> **Warning**
> Les couches doivent pouvoir être accessibles depuis n'importe où (fichiers distants, flux WMS/WFS, etc.), il ne doit **pas** s'agir de fichiers locaux.

Il est recommandé d'[organiser les couches en groupes et sous-groupes](https://docs.qgis.org/3.22/fr/docs/user_manual/introduction/general_tools.html#group-layers-interact).

Dans les propriétés du projets, remplir les champs suivants :

- **Métadonnées > Identification > Titre** : Le nom de la plateforme qui sera visible par l'utilisateur (ex : Geo2France)
- **Métadonnées > Identification > Résumé** : Facultatif, une brève présentation qui sera visible au survol
- **Métadonnées > Liens** : Vous pouvez ajouter ici des liens vers les différents services de votre plateforme (ex : contact, catalogue, etc.)
- **Métadonnées > Liens** : Vous pouvez ajouter ici des liens vers les différents services de votre plateforme (ex : contact, catalogue, etc.)
Ceux-ci seront accessibles à l'utilisateur via un clic droit sur le nom de la plateforme. Ajoutez un lien nommé `icon` pour ajouter une icône personnalisée à la plateforme (png ou svg)

Pour chaque couche, vous pouvez définir :

- **Métadonnées > Identification > Titre & Réumé** Un titre et un résumé
- **Métadonnées > Identification > Liens** créer un lien nommé "Metadata" vers la fiche de métadonnées
- Une symbologie (style, étiquettes, formulaires, etc.)

Enregistrez le fichier projet (qgs ou qgz) et **déposez le sur un un serveur web** accessible depuis l'exterieur (serveur HTTP, Github, cloud, etc.).

Pour proposer l'ajout d'une plateforme dans le plugin : **éditez le fichier [default_idg.json](plugin/idg/config/default_idg.json)**
Pour proposer l'ajout d'une plateforme dans le plugin : **éditez le fichier [default_idg.json](plugin/idg/config/default_idg.json)**
et faites une _pull request_.


### Utilisateur

Dans le panneau _navigateur_ sur la gauche, double-cliquez sur l'icone **IDG** : cela déroulera les différentes plateformes disponibles.
Expand All @@ -63,21 +61,20 @@ Depuis les paramètres du plugin, vous avez la possibilité d'afficher/masquer l

### Auteurs

* Benjamin Chartier, Jean-Baptiste Desbas
- Benjamin Chartier, Jean-Baptiste Desbas

### Source d'inspiration

* Nicolas Damiens
- Nicolas Damiens

### Contributeurs

[TODO]

### Autres remerciements

* [Julien Moura](https://github.com/Guts) (Oslandia) pour le [template](https://oslandia.gitlab.io/qgis/template-qgis-plugin/) du plugin.
* Auteurs des icônes de QGIS, reprises dans l'arbre des ressources

- [Julien Moura](https://github.com/Guts) (Oslandia) pour le [template](https://oslandia.gitlab.io/qgis/template-qgis-plugin/) du plugin.
- Auteurs des icônes de QGIS, reprises dans l'arbre des ressources

## Licence

Expand Down
1 change: 0 additions & 1 deletion plugin/idg/.gitignore

This file was deleted.

Empty file added plugin/idg/browser/__init__.py
Empty file.
102 changes: 55 additions & 47 deletions plugin/idg/toolbelt/browser.py → plugin/idg/browser/browser.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import webbrowser

from qgis.core import (
Qgis,
QgsDataItemProvider,
QgsDataCollectionItem,
QgsDataItem,
Expand All @@ -14,14 +15,14 @@
)
from qgis.gui import QgisInterface
from qgis.PyQt.QtGui import QIcon
from qgis.PyQt.Qt import QWidget
from idg.toolbelt import PluginGlobals
from .remote_platforms import RemotePlatforms
from idg.__about__ import __title__
from qgis.PyQt.QtWidgets import QAction, QMenu
from qgis.utils import iface
import os.path
import webbrowser

from idg.plugin_globals import PluginGlobals
from idg.gui.actions import PluginActions
from idg.__about__ import DIR_PLUGIN_ROOT

from idg.browser.remote_platforms import RemotePlatforms


def find_catalog_url(metadata: QgsAbstractMetadataBase):
Expand All @@ -42,65 +43,72 @@ def project_custom_icon_url(metadata: QgsAbstractMetadataBase):
class IdgProvider(QgsDataItemProvider):
def __init__(self, iface=iface):
self.iface = iface
self.root = None
QgsDataItemProvider.__init__(self)

def name(self):
return "IDG Provider"
return PluginGlobals.BROWSER_PROVIDER_NAME

def capabilities(self):
return QgsDataProvider.Net

def createDataItem(self, path, parentItem):
self.root = RootCollection(self.iface, parent = parentItem)
self.root = RootCollection(self.iface, parent=parentItem)
return self.root


class RootCollection(QgsDataCollectionItem):
def __init__(self, iface: QgisInterface, parent):
self.iface = iface
QgsDataCollectionItem.__init__(self, parent, "IDG", "/IDG")
self.setIcon(
QIcon(
PluginGlobals.instance().plugin_path
+ "/resources/images/layers-svgrepo-com.svg"
)
)
plugin_tag = PluginGlobals.PLUGIN_TAG
QgsDataCollectionItem.__init__(self, parent, plugin_tag, f"/{plugin_tag}")

plugin_path = DIR_PLUGIN_ROOT.resolve()
icon_path = plugin_path / "resources" / "images" / "layers-svgrepo-com.svg"
self.setIcon(QIcon(str(icon_path.resolve())))

def actions(self, parent):
actions = list()
add_idg_action = QAction(QIcon(), self.tr("Settings..."), parent)
add_idg_action.triggered.connect(
lambda: self.iface.showOptionsDialog(
currentPage="mOptionsPage{}".format(__title__)
)
)
actions.append(add_idg_action)

# Settings action
actions.append(PluginActions.action_show_settings)

# Download and reload all files action
actions.append(PluginActions.action_reload_idgs)

return actions

def menus(self, parent):
menu = QMenu(title=self.tr("Plateforms"), parent=parent)
menu.setEnabled(False) # dev
for pf, checked in zip(
["DataGrandEst", "GeoBretagne", "Geo2France", "Indigeo"],
[True, False, True, False],
): # pour maquette TODO boucler sur une variable de conf
action = QAction(pf, menu, checkable=True)
action.setChecked(checked)
menu.addAction(
action
) # TODO l'action permet d'activer/désactiver une plateforme. La désactivation supprime le DataCollectionItem et désactive le download du fichier de conf
menu.addSeparator()
menu.addAction(
QAction(
self.tr("Add URL"),
menu,
)
) # TODO Liens vers le panneau Options de QGIS
return [menu]
# todo: reactivate this menu and make it operational
# menu = QMenu(title=self.tr("Plateforms"), parent=parent)
# menu.setEnabled(False) # dev
# for pf, checked in zip(
# ["DataGrandEst", "GeoBretagne", "Geo2France", "Indigeo"],
# [True, False, True, False],
# ): # pour maquette TODO boucler sur une variable de conf
# action = QAction(pf, menu, checkable=True)
# action.setChecked(checked)
# menu.addAction(
# action
# ) # TODO l'action permet d'activer/désactiver une plateforme. La désactivation supprime le DataCollectionItem et désactive le download du fichier de conf
# menu.addSeparator()
# menu.addAction(
# QAction(
# self.tr("Add URL…"),
# menu,
# )
# )
# return [menu]

return list()

def createChildren(self):
children = []
for pfc in [PlatformCollection(plateform=pf, parent=self) for pf in RemotePlatforms().plateforms if not pf.is_hidden()]:
for pfc in [
PlatformCollection(plateform=pf, parent=self)
for pf in RemotePlatforms().plateforms
if not pf.is_hidden()
]:
children.append(pfc)
return children

Expand Down Expand Up @@ -168,7 +176,7 @@ def hide_plateform(pf):

class GroupItem(QgsDataCollectionItem):
def __init__(self, parent, name, group):
self.path = os.path.join(parent.path, group.name())
self.path = parent.path + "/" + group.name()
self.group = group
QgsDataCollectionItem.__init__(self, parent, name, self.path)
self.setIcon(QIcon(QgsApplication.iconPath("mIconFolder.svg")))
Expand All @@ -193,7 +201,7 @@ class LayerItem(QgsDataItem):
def __init__(self, parent, name, layer):
self.layer = layer
self.catalog_url = find_catalog_url(layer.metadata())
self.path = os.path.join(parent.path, layer.id())
self.path = parent.path + "/" + layer.id()
QgsDataItem.__init__(self, QgsDataItem.Custom, parent, name, self.path)
self.setState(QgsDataItem.Populated) # no children
self.setToolTip(self.layer.metadata().abstract())
Expand Down Expand Up @@ -227,13 +235,13 @@ def addLayer(self):
QgsProject.instance().addMapLayer(self.layer)

def actions(self, parent):
ac_open_meta = QAction(self.tr("Show metadata"), parent)
ac_open_meta = QAction(self.tr("Show metadata"), parent)
if self.catalog_url is not None:
ac_open_meta.triggered.connect(self.openUrl)
else:
ac_open_meta.setEnabled(False)

ac_show_layer = QAction(self.tr("Display layer"), parent)
ac_show_layer = QAction(self.tr("Add layer to map"), parent)
ac_show_layer.triggered.connect(self.addLayer)

actions = [
Expand Down
File renamed without changes.
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,14 @@
from qgis.core import QgsProject
from qgis.PyQt.QtGui import QIcon

from idg.toolbelt import PlgOptionsManager, PluginGlobals
from idg.toolbelt import PlgOptionsManager
from idg.plugin_globals import PluginGlobals


class RemotePlatforms:
def __init__(self, read_projects=True):
self.plateforms = []
with open(
os.path.join(PluginGlobals.instance().config_dir_path, "default_idg.json")
) as f: # Télécharger si non existant ?
with open(PluginGlobals.CONFIG_FILE_PATH) as f:
self.stock_idgs = json.load(f)
self.custom_idg = PlgOptionsManager().get_plg_settings().custom_idgs.split(",")
self.custom_idg.remove("")
Expand All @@ -37,9 +36,7 @@ def url_stock(self):


class Plateform:
def __init__(
self, url, idg_id, read_project=True
):
def __init__(self, url, idg_id, read_project=True):
self.url = url
self.idg_id = idg_id
if read_project:
Expand All @@ -49,7 +46,7 @@ def read_project(self):
p = QgsProject()
if (
p.read(
self.qgis_project_filepath(),
str(self.qgis_project_filepath()),
QgsProject.ReadFlags()
| QgsProject.FlagDontResolveLayers
| QgsProject.FlagDontLoadLayouts,
Expand All @@ -61,10 +58,9 @@ def read_project(self):

def qgis_project_filepath(self):
suffix = os.path.splitext(os.path.basename(self.url))[-1] # .qgs ou .qgz
local_file_name = os.path.join(
PluginGlobals.instance().config_dir_path, self.idg_id + suffix
)
return local_file_name
local_file_name = self.idg_id + suffix
local_file_path = PluginGlobals.CONFIG_DIR_PATH / local_file_name
return local_file_path

def is_custom(self):
# Comparer avec les pf stock
Expand Down Expand Up @@ -96,11 +92,9 @@ def icon(self):
for link in self.project.metadata().links():
if link.name.lower().strip() == "icon":
icon_suffix = os.path.splitext(os.path.basename(link.url))[-1]
icon_file_name = str(self.idg_id) + icon_suffix
return QIcon(
os.path.join(
PluginGlobals.instance().config_dir_path,
str(self.idg_id) + icon_suffix,
)
str(PluginGlobals.CONFIG_DIR_PATH / icon_file_name)
)
return None

Expand Down
Loading

0 comments on commit 37caddd

Please sign in to comment.