Skip to content

Commit

Permalink
Merge pull request #104 from neogeo-technologies/develop
Browse files Browse the repository at this point in the history
v1.2.1
  • Loading branch information
sebastiendarocha authored Feb 4, 2021
2 parents 9ff7c51 + f4c5de2 commit b0cf1d5
Show file tree
Hide file tree
Showing 29 changed files with 398 additions and 105 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/geocontrib.yml
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ jobs:
uses: actions/checkout@v1
- name: "Building docker image"
working-directory: docker
run: docker-compose -f docker-compose.geocontrib-alone.yaml build
run: docker-compose build
- name: "Getting image tag"
id: version
run: echo ::set-output name=VERSION::$(echo $GITHUB_REF | cut -d / -f 3)
Expand Down
4 changes: 3 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -97,4 +97,6 @@ config/__init__.py
/docker/nginx/conf.d/geocontrib.conf

# MacOS
.DS_Store
.DS_Store

docker/docker-compose.override.yaml
37 changes: 36 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,39 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).

## Unreleased

## [1.2.1] - 2021-02-04

### Changed
- Redmine 9754 Docker can overide login URL

### Fixed
- Docker, give default values for email configuration
- Redmine 9834 use LDAP pagination
- Redmine 9839 improve feature import time
- Redmine 9846 FeatureLink cleanup
- Redmine 9848 fix admin FeatureLink filters
- Redmine 9905 can't give an empty basemap title
- Redmine 9926 fix impossible to create 2 features
- Redmine 9929 fix maps icons missing
- Redmine 9985 fix PostgreSQL view creation of a feature when adding/removing custom fields
- Redmine 9986 fix PostgreSQL view creation when no status selected
- Redmine 10083 fix a empty feature link removes the geometry of a feature on save
- Redmine 10105 fix project types don't copy feature types
- Redmine 10142 improve performance when a feature type has many features


## [1.2.0] - 2020-12-17

This evolution need a migration (manage.py migrate)

### Changed
- Redmine 9704: Allow the management of feature links in Django admin
- Redmine 8551: Can import features files with extention "geojson" in addition to "json"
- Redmine 9330: A feature type can be duplicated
- Redmine 9329: Can turn a project into a project template and instatiate a project from a project model
- Redmine 9329: Can turn a project into a project template and instantiate a project from a project model
- Redmine 9544: Addition of Sortable JS library
- Redmine 9507: Added help on authorized characters
- Redmine 9331: Imports with identical geometry are considered to be duplicates
- Django admin improvements
- Projects list ordered by title
- FeatureType list ordered by project, title
Expand All @@ -20,12 +46,21 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
- FeatureType geom editable on create (read-only on update)
- CustomField list ordered by feature_type, label
- Project creator required (fixing 500 on edit)
- Added help on authorized characters when user create a view PostgreSQL

### Fixed
- Docker, prevent creating files not readable by nginx
- Redmine 9706: The modification of the basemap form are recorded
- Redmine 9654: Creating a basemap without title doesn't crash
- Redmine 9623: A connected user doesn't see achived features if he is not allowed
- Redmine 9745: Geolocalised images are visible
- Redmine 9619 : Fix bug for project creation from Django
- Redmine 9490: Fix bug when a custom field is duplicated
- Redmine 9527: Show "0" instead of « None » in the project settings
- Redmine 9526: Fix bug for view creation from Django
- Redmine 9498: Display the login if the user does not have a first and last name
- Redmine 9402: Return to the project page after modifying the project
- Redmine 9401: Error message if the archiving time is greater than the deletion time

## [1.1.3] - 2020-11-13

Expand Down
17 changes: 17 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@ Copier le contenu du fichier /src/config_sample/settings.py dans /config/setting
* EMAIL_HOST_PASSWORD https://docs.djangoproject.com/en/2.2/ref/settings/#email-host-password
* DEFAULT_FROM_EMAIL https://docs.djangoproject.com/en/2.2/ref/settings/#default-from-email
* DATA_UPLOAD_MAX_NUMBER_FIELDS https://docs.djangoproject.com/fr/2.2/ref/settings/#data-upload-max-number-fields
* LOGIN_URL https://docs.djangoproject.com/fr/3.1/ref/settings/#login-url

Éditer les paramètres spécifiques à l'outil dans /config/settings.py :
* DEFAULT_SENDING_FREQUENCY : fréquence d'envoi des notifications par email (never/instantly/daily/weekly)
Expand All @@ -62,6 +63,7 @@ Copier le contenu du fichier /src/config_sample/settings.py dans /config/setting
* IMAGE_FORMAT : formats autorisés des fichiers téléversés dans l'application
* FILE_MAX_SIZE : taille maximale des fichiers téléversés dans l'application
* DEFAULT_BASE_MAP : configuration du fond de carte par défaut
* PROJECT_COPY_RELATED : configuration des modèles de projets

Copier le contenu du fichier /src/config_sample/urls.py dans /config/urls.py

Expand Down Expand Up @@ -110,6 +112,21 @@ python manage.py runserver
Se rendre dans l'interface d'administration Django et éditer le premier enregistrement des entités
"Sites" (cf. yoururl.net/admin/sites/).

## Configuration des tâches périodiques

Deux types de tâches requièrent d'invoquer une commande régulièrement (depuis un cron par exemple)

L'envoi de mails de norifications, vous pouvez l'appeler toutes les minutes ou tous les jours selon vos préférences d'envoi
```shell
python manage.py notify_subscribers
```

L'archivage et la suppression des signalements, à invoquer une fois par jour
```shell
python manage.py data_cleansing
```


## Déploiement dans un environnement geOrchestra

Reportez-vous au README.md présent dans le répertoire `plugin_georchestra`.
Expand Down
File renamed without changes.
23 changes: 16 additions & 7 deletions docker/geocontrib/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -122,7 +122,7 @@

# Extended properties
AUTH_USER_MODEL = 'geocontrib.User'
LOGIN_URL = 'geocontrib:login'
LOGIN_URL = config("LOGIN_URL", default='geocontrib:login')
LOGIN_REDIRECT_URL = 'geocontrib:index'
LOGOUT_REDIRECT_URL = 'geocontrib:index'

Expand Down Expand Up @@ -159,12 +159,12 @@

# E-mail and notification parameters
EMAIL_BACKEND = config('EMAIL_BACKEND', default="django.core.mail.backends.console.EmailBackend")
EMAIL_HOST = config('EMAIL_HOST')
EMAIL_HOST_USER = config('EMAIL_HOST_USER')
EMAIL_HOST_PASSWORD = config('EMAIL_HOST_PASSWORD')
EMAIL_PORT = config('EMAIL_PORT', cast=int)
EMAIL_USE_TLS = config('EMAIL_USE_TLS', cast=bool)
DEFAULT_FROM_EMAIL = config('DEFAULT_FROM_EMAIL')
EMAIL_HOST = config('EMAIL_HOST', default="")
EMAIL_HOST_USER = config('EMAIL_HOST_USER', default="")
EMAIL_HOST_PASSWORD = config('EMAIL_HOST_PASSWORD', default="")
EMAIL_PORT = config('EMAIL_PORT', cast=int, default=22)
EMAIL_USE_TLS = config('EMAIL_USE_TLS', cast=bool, default=True)
DEFAULT_FROM_EMAIL = config('DEFAULT_FROM_EMAIL', default="")

# Notification frequency (allowed values: 'never', 'instantly', 'daily', 'weekly')
DEFAULT_SENDING_FREQUENCY = config('DEFAULT_SENDING_FREQUENCY', default='never')
Expand Down Expand Up @@ -211,6 +211,15 @@
'PROVIDER': config('SELECTED_GEOCODER_PROVIDER', default='addok')
}

# Project duplication settings
PROJECT_COPY_RELATED = {
'AUTHORIZATION': True,
'BASE_MAP': True,
'FEATURE': False,
'FEATURE_TYPE': True,
'THUMBNAIL': True,
}

DATA_UPLOAD_MAX_NUMBER_FIELDS = config('DATA_UPLOAD_MAX_NUMBER_FIELDS', default=10000)

# 9745 & 9645 don't create temp files with 0o000
Expand Down
1 change: 1 addition & 0 deletions docker/nginx/geocontrib.conf
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ server {
listen 80;
charset utf-8;
server_name 127.0.0.1;
proxy_read_timeout 300s;

client_max_body_size 4G;

Expand Down
5 changes: 4 additions & 1 deletion docs/import-export.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,16 +16,19 @@ droits supérieurs du projet)
* Création de nouveaux signalements
* La fonction n'est pas capable de mettre à jour des signalements existants ni de supprimer des signalements existants
* Les enregistrements soupçonnés de former des doublons sont marqués automatiquement à l'aide du mécanisme de relation
entre signalements. Les doublons sont identifiés par l'égalité de leur titre et de leur description)
entre signalements. Les doublons sont identifiés par l'égalité de leur titre et de leur description, ou par l'égalité de leur géométrie)
* Les enregistrements importés sont enregistrés avec le statut "brouillon"

**Contraintes** :
* Le modèle de données supporté par la fonction d'import est décrit dans la page descriptive du type de signalements
* Seuls les champs portant les mêmes noms que la table des signalements en base sont exploités
* Des champs supplémentaires doivent être ajoutés au fichier Json ('title' champs unique, 'feature_type' slug du type de signalement)
* Pour les champs correspondant à des listes de choix : seules les valeurs seront exploitées (pas les libellés en
langage naturel)
* Géométries supportées pour Excel : colonne geom en WKT dans le système de coordonnées attendu (pas de reprojection -
cf. DB_SRID dans settings.py)
* La projection doit être du 4326
* Les types "multi" (multiPolygon, multiLigne) ne sont pas exploitables.

## Export

Expand Down
12 changes: 7 additions & 5 deletions docs/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -106,11 +106,13 @@ La page d'accueil de l'application contient :
s'authentifier,
* si un utilisateur est connecté : le nom de l'utilisateur courant et un bouton de déconnexion. Un clic sur le nom de
l'utilisateur renvoie vers sa page "Mon compte"
* un bouton de création d'un nouveau projet (présent uniquement pour les utilisateurs ayant le rôle de Gestionnaire
métier);
* un bouton permettant à la liste des modèles de projet (présent uniquement pour les utilisateurs ayant le rôle de Gestionnaire métier);
* la liste des projets existants avec une courte description et quelques indicateurs. Un clic sur un projet renvoie
vers la page d'accueil de ce projet si l'utilisateur courant est habilité à le consulter. Dans le cas contraire un
message d'erreur lui est présenté ;
* un bouton de création d'un nouveau projet (présent uniquement pour les utilisateurs ayant le rôle de Gestionnaire
métier).
message d'erreur lui est présenté.


### Menu d'un projet

Expand Down Expand Up @@ -195,15 +197,15 @@ page) :
* une vue tabulaire paginée :
* tri par ordre chronologique inverse (les signalements les plus récents sont affichés en premier),
* présentation des caractéristiques principales : statut (représenté par un pictogramme), type de signalements, titre,
et date de dernière modification,
date de dernière modification, et auteur du signalement,
* le clic sur le titre renvoie vers la fiche détaillée du signalement,
* le clic sur le type de signalements renvoie vers la fiche détaillée du signalement.

Chacune d'entre elles propose un bloc "Filtres" permettant à l'utilisateur de réduire le nombre de signalements à ceux
qu'il recherche :
* filtre sur le type de signalements ;
* filtre sur le statut des signalements ;
* filtre textuel recherchant la chaîne de caractères saisie par l'utilisateur dans le titre des signalements
* filtre textuel recherchant la chaîne de caractères saisie par l'utilisateur dans le titre des signalements.

### Page de consultation d'un signalement

Expand Down
16 changes: 16 additions & 0 deletions docs/project_template.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
# Modèle de projet

## Utiliser un modèle de projet pour créer un nouveau projet

Lors de la création d'un nouveau projet, les administrateurs ou les gestionnaires métiers ont la possibilité d'utiliser un modèle.
Depuis la page d'accueil de l'application, un bouton "Accéder à la liste des modèles de projet" placé sur le haut de page, à droite, permet d'accéder à la liste des projets déclarés comme modèles.
Au clic sur un des projets modèles listés, la page de création d'un nouveau projet est proposée à l'utilisateur. Les champs caractéristiques du nouveau projet sont pré-remplis avec les mêmes valeurs que celles du projet modèle. Les champs sont tous éditables.
Par défaut, le même titre que celui du projet modèle est proposé, suivi de la date / heure de la copie du projet modèle.

## Enregistrer un projet comme modèle

Depuis l'application Géocontrib, dans la page de configuration d'un projet, accessible aux administrateurs et aux gestionnaires métier, une case à cocher placée en bas de la page permet de considérer le projet comme modèle.
Après l'enregistrement, ce projet sera disponible dans la liste des modèles de projet.

Depuis le Back Office de Django, depuis les pages "projets", les gestionnaires métiers et super-utilisateurs ont la possibilité de cocher la case "Est un projet type" pour définir le projet comme étant un modèle.

19 changes: 13 additions & 6 deletions geocontrib/admin/feature.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,13 @@
from django.conf import settings
from django.contrib import messages
from django.contrib.auth import get_user_model
from django.contrib.auth.admin import UserAdmin as DjangoUserAdmin
from django.contrib.gis import admin
from django.db import connections
from django.forms import formset_factory
from django.forms import modelformset_factory
from django.shortcuts import redirect
from django.template.response import TemplateResponse
from django.urls import path
from django.utils.translation import ugettext_lazy as _
from django.template.loader import render_to_string

from geocontrib.admin.filters import FeatureTypeFilter
Expand All @@ -22,6 +20,7 @@
from geocontrib.forms import HiddenDeleteModelFormSet
from geocontrib.forms import FeatureSelectFieldAdminForm
from geocontrib.forms import AddPosgresViewAdminForm
from geocontrib.models import Authorization
from geocontrib.models import Feature
from geocontrib.models import FeatureType
from geocontrib.models import FeatureLink
Expand Down Expand Up @@ -124,11 +123,10 @@ def create_postgres_view(self, request, feature_type_id, *args, **kwargs):
request.POST or None, prefix='fds',
initial=feature_detail_initial)
cfs_formset = CustomFieldsFormSet(request.POST or None, prefix='cfs')

pg_form = AddPosgresViewAdminForm(request.POST or None)
if fds_formset.is_valid() and pg_form.is_valid() and cfs_formset.is_valid():
view_name = pg_form.cleaned_data.get('name')

status = pg_form.cleaned_data.get('status') or (stat[0] for stat in Feature.STATUS_CHOICES)
fds_data = self.pop_deleted_forms(fds_formset.cleaned_data)
cfs_data = self.pop_deleted_forms(cfs_formset.cleaned_data)

Expand All @@ -138,7 +136,7 @@ def create_postgres_view(self, request, feature_type_id, *args, **kwargs):
fds_data=fds_data,
cfs_data=cfs_data,
feature_type_id=feature_type_id,
status=pg_form.cleaned_data.get('status'),
status=status,
schema=getattr(settings, 'DB_SCHEMA', 'public'),
view_name=view_name,
user=settings.DATABASES['default']['USER'],
Expand Down Expand Up @@ -197,10 +195,19 @@ class FeatureLinkAdmin(admin.ModelAdmin):
'_feature_to',
'get_feature_type',
)
# ordering = ('_feature_from', )

list_per_page = 10

def get_queryset(self, request):
user = request.user
qs = super().get_queryset(request)
if user.is_superuser:
return qs
moderation_projects_pk = Authorization.objects.filter(
user=user, level__rank__gte=3
).values_list('project__pk', flat=True)
return qs.filter(feature_to__project__in=moderation_projects_pk)

def get_readonly_fields(self, request, obj=None):
if obj:
return self.readonly_fields + ('relation_type', 'feature_from', 'feature_to')
Expand Down
Loading

0 comments on commit b0cf1d5

Please sign in to comment.