Merge branch 'dev'
This commit is contained in:
commit
fb6a560d1f
9 changed files with 165 additions and 33 deletions
48
CONTRIBUTING.md
Normal file
48
CONTRIBUTING.md
Normal file
|
@ -0,0 +1,48 @@
|
|||
# Comment contribuer
|
||||
|
||||
demarches-simplifiees.fr est un [logiciel libre](https://fr.wikipedia.org/wiki/Logiciel_libre). Vous pouvez lire et modifier son code-source, sous les termes de la licence AGPL.
|
||||
|
||||
Si vous souhaitez apporter des améliorations à demarches-simplifiees.fr, c’est possible !
|
||||
|
||||
Le mieux pour cela est de **proposer une modification dans la base de code principale**. Une fois acceptée, votre améliorations sera ainsi disponible pour l’ensemble des utilisateurs de demarches-simplifiees.fr.
|
||||
|
||||
Voici la marche à suivre recommandée pour effectuer une modification.
|
||||
|
||||
## 1. Discuter de l’amélioration
|
||||
|
||||
La première étape est généralement de discuter de l’amélioration que vous proposez (s’il ne s’agit pas d’un changement trivial, comme la correction d’une coquille).
|
||||
|
||||
Pour cela, [créez une nouvelle issue](https://github.com/betagouv/tps/issues/new) concernant votre proposition. Autant que possible, indiquez clairement votre besoin, votre cas d’usage – et éventuellement comment vous pensez déjà le résoudre.
|
||||
|
||||
Nous pouvons alors discuter, pour vérifier que le besoin exprimé correspond à l’usage de demarches-simplifiees.fr, proposer éventuellement des alternatives, et se mettre d’accord sur une implémentation technique pertinente.
|
||||
|
||||
## 2. Proposer du code
|
||||
|
||||
Une fois que la discussion est établie, et que les éléments techniques sont dégrossis, vous pouvez proposer des changements au code. Pour cela, effectuez vos modifications en local, et [ouvrez une Pull Request](https://github.com/betagouv/tps/issues/new) avec les changements que vous souhaitez apporter.
|
||||
|
||||
Quelques conseils : pensez à bien décrire l’objectif et l’implémentation de votre PR au moment de la créer. Et si vos changements sont importants, découpez-les en plusieurs petites PRs successives, qui seront plus faciles à relire. N’oubliez pas d’ajouter des tests automatisés pour vous assurer que vos changements fonctionnent bien.
|
||||
|
||||
Chaque PR ouverte déclenche l’exécution des tests automatisés, et la vérification du format du code. Si vos tests ou votre formattage est en rouge, corrigez les erreurs avant de continuer.
|
||||
|
||||
Une personne de l’équipe de développement fera une relecture, en demandant éventuellement des détails ou des changements. Si personne n’a réagi au bout de 5 jours, n’hésitez pas à relancer en ajoutant un commentaire à la PR.
|
||||
|
||||
## 3. Intégration
|
||||
|
||||
Une fois votre PR approuvée, elle sera intégrée dans la base de code principale.
|
||||
|
||||
Nous mettons en production au minimum une fois par semaine (et généralement plus) : vos changements seront disponibles en production sur [demarches-simplifiees.fr](https://www.demarches-simplifiees.fr) quelques jours après.
|
||||
|
||||
|
||||
# Héberger demarches-simplifiees.fr
|
||||
|
||||
demarches-simplifiees.fr est **compliqué à héberger**. Parmi les problématiques que nous rencontrons :
|
||||
|
||||
- **Sécurité et confidentialité des données** : par nature, demarches-simplifiees.fr traite une quantité importante de données personnelles. La sécurité de l’infrastructure doit être contrôlée et certifiée pour garantir la confidentialité des données. Cela implique par exemple une démarche de mise en conformité avec le [Référentiel Général de Sécurité](https://www.ssi.gouv.fr/entreprise/reglementation/confiance-numerique/le-referentiel-general-de-securite-rgs/), qui est un processus assez lourd.
|
||||
|
||||
C’est également valable pour le stockage des pièces-jointes, qui sont souvent des documents d’identités dont la confidentialité doit être garantie.
|
||||
- **Utilisation de services externes** : demarches-simplifiees.fr s’interconnecte à de nombreux services externes : des APIs (API Entreprise, API Carto, la Base Adresse Nationale, etc.) – mais aussi des services pour le stockage externe des pièces-jointes, l’analyse anti-virus ou l’envoi des emails. Le fonctionnement de demarches-simplifiees.fr dépend de la disponibilité de ces services externes.
|
||||
- **Mises à jour** : le schéma de la base de données change régulièrement. Nous codons également des scripts pour harmoniser les anciennes données. Parfois des modifications ponctuelles sont effectuées sur des démarches anciennes, pour les mettre en conformité avec de nouvelles règles métiers. Nous maintenons également les dépendances logicielles utilisées – notamment en réagissant rapidement lorsqu’une faille de sécurité est signalée. Ces mises à jour fréquentes en production sont indispensables au bon fonctionnement de l’outil.
|
||||
|
||||
Si vous souhaitez adapter demarches-simplifiees.fr à votre besoin, nous vous recommandons de **proposer vos modifications à la base de code principale** (par exemple en créant une issue) **plutôt que d’héberger une autre instance vous-même**.
|
||||
|
||||
Dans le cas où vous envisagez d’héberger une instance de demarches-simplifiees.fr vous-même, nous n'avons malheureusement pas les moyens de vous accompagner, ni d'assurer de support technique concernant votre installation.
|
58
README.md
58
README.md
|
@ -2,29 +2,37 @@
|
|||
|
||||
## Contexte
|
||||
|
||||
demarches-simplifiees.fr est un site web conçu afin de répondre au besoin urgent de l'État d'appliquer la directive sur le 100 % dématérialisation pour les démarches administratives.
|
||||
[demarches-simplifiees.fr](https://www.demarches-simplifiees.fr) est un site web conçu afin de répondre au besoin urgent de l'État d'appliquer la directive sur le 100 % dématérialisation pour les démarches administratives.
|
||||
|
||||
## Dépendances
|
||||
## Comment contribuer ?
|
||||
|
||||
### Tous environnements
|
||||
demarches-simplifiees.fr est un [logiciel libre](https://fr.wikipedia.org/wiki/Logiciel_libre) sous licence AGPL.
|
||||
|
||||
Vous souhaitez y apporter des changements ou des améliorations ? Lisez notre [guide de contribution](CONTRIBUTING.md).
|
||||
|
||||
## Installation pour le développement
|
||||
|
||||
### Dépendances techniques
|
||||
|
||||
#### Tous environnements
|
||||
|
||||
- postgresql
|
||||
|
||||
### Développement
|
||||
#### Développement
|
||||
|
||||
- Yarn : voir https://yarnpkg.com/en/docs/install
|
||||
- Overmind :
|
||||
* Mac : `brew install overmind`
|
||||
* Linux : voir https://github.com/DarthSim/overmind#installation
|
||||
|
||||
### Tests
|
||||
#### Tests
|
||||
|
||||
- Chrome
|
||||
- chromedriver :
|
||||
* Mac : `brew install chromedriver`
|
||||
* Linux : voir https://sites.google.com/a/chromium.org/chromedriver/downloads
|
||||
|
||||
## Création des rôles de la base de données
|
||||
### Création des rôles de la base de données
|
||||
|
||||
Les informations nécessaire à l'initialisation de la base doivent être pré-configurées à la main grâce à la procédure suivante :
|
||||
|
||||
|
@ -34,19 +42,19 @@ Les informations nécessaire à l'initialisation de la base doivent être pré-c
|
|||
> create user tps_test with password 'tps_test' superuser;
|
||||
> \q
|
||||
|
||||
## Initialisation de l'environnement de développement
|
||||
### Initialisation de l'environnement de développement
|
||||
|
||||
Afin d'initialiser l'environnement de développement, exécutez la commande suivante :
|
||||
|
||||
bin/setup
|
||||
|
||||
## Lancement de l'application
|
||||
### Lancement de l'application
|
||||
|
||||
overmind start
|
||||
|
||||
L'application tourne à l'adresse `http://localhost:3000`. Un utilisateur de test est disponible, avec les identifiants `test@exemple.fr`/`testpassword`.
|
||||
|
||||
## Programmation des jobs
|
||||
### Programmation des jobs
|
||||
|
||||
AutoArchiveProcedureJob.set(cron: "* * * * *").perform_later
|
||||
WeeklyOverviewJob.set(cron: "0 8 * * 0").perform_later
|
||||
|
@ -55,17 +63,17 @@ L'application tourne à l'adresse `http://localhost:3000`. Un utilisateur de tes
|
|||
Administrateurs::ActivateBeforeExpirationJob.set(cron: "0 8 * * *").perform_later
|
||||
WarnExpiringDossiersJob.set(cron: "0 0 1 * *").perform_later
|
||||
|
||||
## Voir les emails envoyés en local
|
||||
### Voir les emails envoyés en local
|
||||
|
||||
http://localhost:3000/letter_opener
|
||||
Ouvrez la page [http://localhost:3000/letter_opener](http://localhost:3000/letter_opener).
|
||||
|
||||
## Mise à jour de l'application
|
||||
### Mise à jour de l'application
|
||||
|
||||
Pour mettre à jour votre environnement de développement, installer les nouvelles dépendances et faire jouer les migrations, exécutez :
|
||||
|
||||
bin/update
|
||||
|
||||
## Exécution des tests (RSpec)
|
||||
### Exécution des tests (RSpec)
|
||||
|
||||
Pour exécuter les tests de l'application, plusieurs possibilités :
|
||||
|
||||
|
@ -84,34 +92,36 @@ Pour exécuter les tests de l'application, plusieurs possibilités :
|
|||
bin/rake spec SPEC=file_path/file_name_spec.rb
|
||||
bin/rspec file_path/file_name_spec.rb
|
||||
|
||||
## Ajout de taches à exécuter au déploiement
|
||||
### Ajout de taches à exécuter au déploiement
|
||||
|
||||
rails generate after_party:task task_name
|
||||
|
||||
## Debug
|
||||
### Debug
|
||||
|
||||
Une fois `overmind` lancé, et un breakpoint `byebug` inséré dans le code, il faut se connecter au process `server` dans un nouveau terminal afin d'intéragir avec byebug :
|
||||
|
||||
overmind connect server
|
||||
|
||||
## Linting
|
||||
### Linting
|
||||
|
||||
Le projet utilise plusieurs linters pour vérifier la lisibilité et la qualité code.
|
||||
|
||||
- Faire tourner tous les linters : `bin/rake lint`
|
||||
- [AccessLint](http://accesslint.com/) tourne automatiquement sur les PRs
|
||||
|
||||
### Régénérer les binstubs
|
||||
|
||||
bundle binstub railties --force
|
||||
bin/rake rails:update:bin
|
||||
|
||||
## Déploiement
|
||||
|
||||
- Tout nouveau commit ajouté à la branche `dev` est automatiquement déployé [en intégration](https://dev.demarches-simplifiees.fr/)
|
||||
- Tout nouveau commit ajouté à la branche `master` est automatiquement déployé [en production](https://www.demarches-simplifiees.fr/)
|
||||
|
||||
## Régénérer les binstubs
|
||||
## Tâches courantes
|
||||
|
||||
bundle binstub railties --force
|
||||
bin/rake rails:update:bin
|
||||
|
||||
## Tâches Super Admin
|
||||
### Tâches Super Admin
|
||||
|
||||
- ajouter un compte super admin :
|
||||
`bin/rake admin:create_admin[email-du-compte-github@exemple.com]`
|
||||
|
@ -122,7 +132,7 @@ Le projet utilise plusieurs linters pour vérifier la lisibilité et la qualité
|
|||
- supprimer un compte super admin :
|
||||
`bin/rake admin:delete_admin[email-du-compte-github@exemple.com]`
|
||||
|
||||
## Tâches d’aide au support
|
||||
### Tâches d’aide au support
|
||||
|
||||
Des tâches d’aide au support sont prévues dans le namespace `support`.
|
||||
Pour les lister : `bin/rake -D support:`.
|
||||
|
@ -131,9 +141,7 @@ Pour les lister : `bin/rake -D support:`.
|
|||
|
||||
L'application supporte les navigateurs récents : Firefox, Chrome, Safari, Edge et Internet Explorer 11 (voir `config/browser.rb`).
|
||||
|
||||
La compatibilité est testée par Browserstack.
|
||||
|
||||
[<img src="app/assets/images/browserstack-logo-600x315.png" width="300">](https://www.browserstack.com/)
|
||||
La compatibilité est testée par Browserstack.<br>[<img src="app/assets/images/browserstack-logo-600x315.png" width="200">](https://www.browserstack.com/)
|
||||
|
||||
## Performance
|
||||
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
class ApiGeo::API
|
||||
TIMEOUT = 15
|
||||
CACHE_DURATION = 1.day
|
||||
|
||||
def self.regions
|
||||
url = [API_GEO_URL, "regions"].join("/")
|
||||
|
@ -27,6 +28,11 @@ class ApiGeo::API
|
|||
end
|
||||
|
||||
def self.call(url, body, method = :get)
|
||||
# The cache engine is stored, because as of Typhoeus 1.3.1 the cache engine instance
|
||||
# is included in the computed `cache_key`.
|
||||
# (Which means that when the cache instance changes, the cache is invalidated.)
|
||||
@typhoeus_cache ||= Typhoeus::Cache::SuccessfulRequestsRailsCache.new
|
||||
|
||||
response = Typhoeus::Request.new(
|
||||
url,
|
||||
method: method,
|
||||
|
@ -37,7 +43,9 @@ class ApiGeo::API
|
|||
headers: {
|
||||
'Accept' => 'application/json',
|
||||
'Accept-Encoding' => 'gzip, deflate'
|
||||
}.merge(method == :post ? { 'Content-Type' => 'application/json' } : {})
|
||||
}.merge(method == :post ? { 'Content-Type' => 'application/json' } : {}),
|
||||
cache: @typhoeus_cache,
|
||||
cache_ttl: CACHE_DURATION
|
||||
).run
|
||||
|
||||
if response.success?
|
||||
|
|
21
app/lib/typhoeus/cache/successful_requests_rails_cache.rb
vendored
Normal file
21
app/lib/typhoeus/cache/successful_requests_rails_cache.rb
vendored
Normal file
|
@ -0,0 +1,21 @@
|
|||
module Typhoeus
|
||||
module Cache
|
||||
# Cache successful Typhoeus requests in the Rails cache
|
||||
# (but don’t cache failed requests).
|
||||
#
|
||||
# Usage:
|
||||
# Typhoeus.config.cache = Typhoeus::Cache::SuccessfulRequestsRailsCache.new
|
||||
# Typhoeus.get('http://exemple.com/api', cache_ttl: 1.day)
|
||||
class SuccessfulRequestsRailsCache
|
||||
def get(request)
|
||||
::Rails.cache.read(request)
|
||||
end
|
||||
|
||||
def set(request, response)
|
||||
if response&.success?
|
||||
::Rails.cache.write(request, response, expires_in: request.cache_ttl)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
|
@ -142,10 +142,10 @@ class ProcedureExportService
|
|||
headers = ATTRIBUTES.map do |key|
|
||||
label_for_export(key.to_s)
|
||||
end
|
||||
headers += @procedure.types_de_champ.map do |champ|
|
||||
headers += @procedure.types_de_champ.ordered.map do |champ|
|
||||
label_for_export(champ.libelle)
|
||||
end
|
||||
headers += @procedure.types_de_champ_private.map do |champ|
|
||||
headers += @procedure.types_de_champ_private.ordered.map do |champ|
|
||||
label_for_export(champ.libelle)
|
||||
end
|
||||
headers += ETABLISSEMENT_ATTRIBUTES.map do |key|
|
||||
|
|
|
@ -4,7 +4,6 @@ class TypesDeChampService
|
|||
TOGGLES = {
|
||||
TypeDeChamp.type_champs.fetch(:piece_justificative) => :champ_pj?,
|
||||
TypeDeChamp.type_champs.fetch(:siret) => :champ_siret?,
|
||||
TypeDeChamp.type_champs.fetch(:linked_drop_down_list) => :champ_linked_dropdown?,
|
||||
TypeDeChamp.type_champs.fetch(:integer_number) => :champ_integer_number?
|
||||
}
|
||||
|
||||
|
|
|
@ -11,8 +11,6 @@ Flipflop.configure do
|
|||
title: "Champ pièce justificative"
|
||||
feature :champ_siret,
|
||||
title: "Champ SIRET"
|
||||
feature :champ_linked_dropdown,
|
||||
title: "Champ double menu déroulant"
|
||||
feature :champ_integer_number,
|
||||
title: "Champ nombre entier"
|
||||
end
|
||||
|
|
40
spec/lib/typhoeus/cache/successful_requests_rails_cache.rb
vendored
Normal file
40
spec/lib/typhoeus/cache/successful_requests_rails_cache.rb
vendored
Normal file
|
@ -0,0 +1,40 @@
|
|||
require 'spec_helper'
|
||||
|
||||
describe Typhoeus::Cache::SuccessfulRequestsRailsCache, lib: true do
|
||||
let(:cache) { described_class.new }
|
||||
|
||||
let(:base_url) { "localhost:3001" }
|
||||
let(:request) { Typhoeus::Request.new(base_url, { :method => :get, cache: cache, cache_ttl: 1.day }) }
|
||||
let(:response) { Typhoeus::Response.new(:response_code => response_code, :return_code => 0, :mock => true) }
|
||||
let(:response_code) { 0 }
|
||||
|
||||
before { Rails.cache.clear }
|
||||
|
||||
describe "#set" do
|
||||
context 'when the request is successful' do
|
||||
let(:response_code) { 200 }
|
||||
|
||||
it 'saves the request in the Rails cache' do
|
||||
cache.set(request, response)
|
||||
expect(Rails.cache.exist?(request)).to be true
|
||||
expect(Rails.cache.read(request)).to be_a(Typhoeus::Response)
|
||||
end
|
||||
end
|
||||
|
||||
context 'when the request failed' do
|
||||
let(:response_code) { 500 }
|
||||
|
||||
it 'doesn’t save the request in the Rails cache' do
|
||||
cache.set(request, response)
|
||||
expect(Rails.cache.exist?(request)).to be false
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe "#get" do
|
||||
it 'returns the request in the cache' do
|
||||
Rails.cache.write(request, response)
|
||||
expect(cache.get(request)).to be_a(Typhoeus::Response)
|
||||
end
|
||||
end
|
||||
end
|
|
@ -9,6 +9,14 @@ describe ProcedureExportService do
|
|||
let(:headers) { subject[:headers] }
|
||||
let(:data) { subject[:data] }
|
||||
|
||||
before do
|
||||
# change one tdc place to check if the header is ordered
|
||||
tdc_first = procedure.types_de_champ.ordered.first
|
||||
tdc_last = procedure.types_de_champ.ordered.last
|
||||
|
||||
tdc_first.update(order_place: tdc_last.order_place + 1)
|
||||
end
|
||||
|
||||
context 'dossiers' do
|
||||
it 'should have headers' do
|
||||
expect(headers).to eq([
|
||||
|
@ -27,7 +35,7 @@ describe ProcedureExportService do
|
|||
:individual_prenom,
|
||||
:individual_nom,
|
||||
:individual_birthdate,
|
||||
:text,
|
||||
|
||||
:textarea,
|
||||
:date,
|
||||
:datetime,
|
||||
|
@ -53,6 +61,8 @@ describe ProcedureExportService do
|
|||
:piece_justificative,
|
||||
:siret,
|
||||
:carte,
|
||||
:text,
|
||||
|
||||
:etablissement_siret,
|
||||
:etablissement_siege_social,
|
||||
:etablissement_naf,
|
||||
|
@ -113,7 +123,7 @@ describe ProcedureExportService do
|
|||
}
|
||||
|
||||
let(:champs_data) {
|
||||
dossier.champs.map(&:for_export)
|
||||
dossier.champs.ordered.map(&:for_export)
|
||||
}
|
||||
|
||||
let(:etablissement_data) {
|
||||
|
|
Loading…
Reference in a new issue