Merge branch 'dev'

This commit is contained in:
gregoirenovel 2018-10-30 17:58:54 +01:00
commit 513cfb4fd8
51 changed files with 206 additions and 347 deletions

View file

@ -64,10 +64,7 @@ function validatePath(path) {
}
function path_type_init() {
$(PROCEDURE_PATH_SELECTOR).bind('autocomplete:select', function(
ev,
suggestion
) {
togglePathMessage(true, suggestion['mine']);
$(PROCEDURE_PATH_SELECTOR).on('autocomplete:select', function(event) {
togglePathMessage(true, event.detail['mine']);
});
}

View file

@ -40,8 +40,7 @@ class Admin::ProceduresController < AdminController
def edit
@path = @procedure.path || @procedure.default_path
@available = @procedure.path_available?(@path)
@mine = @procedure.path_is_mine?(@path)
@availability = @procedure.path_availability(@path)
end
def destroy
@ -60,8 +59,7 @@ class Admin::ProceduresController < AdminController
def new
@procedure ||= Procedure.new
@procedure.module_api_carto ||= ModuleAPICarto.new
@available = true
@mine = true
@availability = Procedure::PATH_AVAILABLE
end
def create
@ -71,59 +69,51 @@ class Admin::ProceduresController < AdminController
@procedure.module_api_carto = ModuleAPICarto.new(create_module_api_carto_params)
end
@path = params.require(:procedure).permit(:path)[:path]
@available = !ProcedurePath.exists?(path: @path)
@mine = ProcedurePath.mine?(current_administrateur, @path)
@path = @procedure.path
@availability = Procedure.path_availability(current_administrateur, @procedure.path)
if !@procedure.validate
if !@procedure.save
flash.now.alert = @procedure.errors.full_messages
return render 'new'
elsif Flipflop.publish_draft? && !ProcedurePath.valid?(Procedure.last, @path)
# FIXME: The code abow is a horrible hack that we need until we migrated path directly on procedure model
flash.now.alert = 'Lien de la démarche invalide.'
return render 'new'
render 'new'
else
@procedure.save!
if Flipflop.publish_draft?
@procedure.publish_with_path!(@path)
end
flash.notice = 'Démarche enregistrée.'
end
redirect_to admin_procedure_types_de_champ_path(procedure_id: @procedure.id)
end
end
def update
@procedure = current_administrateur.procedures.find(params[:id])
path = params.require(:procedure).permit(:path)[:path]
if !@procedure.update(procedure_params)
flash.alert = @procedure.errors.full_messages
flash.now.alert = @procedure.errors.full_messages
@path = procedure_params[:path]
if @path.present?
@availability = @procedure.path_availability(@path)
end
render 'edit'
elsif Flipflop.publish_draft? && @procedure.brouillon?
if ProcedurePath.valid?(@procedure, path)
@procedure.publish_with_path!(path)
reset_procedure
flash.notice = 'Démarche modifiée. Tous les dossiers de cette démarche ont été supprimés.'
else
flash.alert = 'Lien de la démarche invalide.'
end
else
reset_procedure
flash.notice = 'Démarche modifiée.'
end
redirect_to edit_admin_procedure_path(id: @procedure.id)
else
flash.notice = 'Démarche modifiée.'
redirect_to edit_admin_procedure_path(id: @procedure.id)
end
end
def publish
path = params[:path]
procedure = current_administrateur.procedures.find(params[:procedure_id])
if !ProcedurePath.valid?(procedure, params[:procedure_path])
procedure.path = path
if !procedure.validate
flash.alert = 'Lien de la démarche invalide'
return redirect_to admin_procedures_path
else
procedure.path = nil
end
if procedure.publish_or_reopen!(params[:procedure_path])
if procedure.publish_or_reopen!(path)
flash.notice = "Démarche publiée"
redirect_to admin_procedures_path
else
@ -216,9 +206,10 @@ class Admin::ProceduresController < AdminController
end
def path_list
json_path_list = ProcedurePath
json_path_list = Procedure
.find_with_path(params[:request])
.pluck('procedure_paths.path', :administrateur_id)
.order(:id)
.pluck(:path, :administrateur_id)
.map do |path, administrateur_id|
{
label: path,
@ -235,11 +226,9 @@ class Admin::ProceduresController < AdminController
if procedure_id.present?
procedure = current_administrateur.procedures.find(procedure_id)
@available = procedure.path_available?(path)
@mine = procedure.path_is_mine?(path)
@availability = procedure.path_availability(path)
else
@available = !ProcedurePath.exists?(path: path)
@mine = ProcedurePath.mine?(current_administrateur, path)
@availability = Procedure.path_availability(current_administrateur, path)
end
end
@ -276,6 +265,9 @@ class Admin::ProceduresController < AdminController
if @procedure&.locked?
params.require(:procedure).permit(*editable_params)
else
if Flipflop.publish_draft?
editable_params << :path
end
params.require(:procedure).permit(*editable_params, :duree_conservation_dossiers_dans_ds, :duree_conservation_dossiers_hors_ds, :for_individual, :individual_with_siret, :ask_birthday, module_api_carto_attributes: [:id, :use_api_carto, :quartiers_prioritaires, :cadastre]).merge(administrateur_id: current_administrateur.id)
end
end

View file

@ -6,12 +6,5 @@ module Manager
flash[:notice] = "L'email d'activation de votre compte a été renvoyé."
redirect_to manager_user_path(user)
end
def confirm
user = User.find(params[:id])
user.confirm
flash[:notice] = "Ladresse email de lutilisateur a été marquée comme activée."
redirect_to manager_user_path(user)
end
end
end

View file

@ -7,18 +7,19 @@ module NewAdministrateur
def new
@procedure = procedure
@service = Service.new
end
def create
new_service = Service.new(service_params)
new_service.administrateur = current_administrateur
@service = Service.new(service_params)
@service.administrateur = current_administrateur
if new_service.save
if @service.save
redirect_to services_path(procedure_id: params[:procedure_id]),
notice: "#{new_service.nom} créé"
notice: "#{@service.nom} créé"
else
@procedure = procedure
flash[:alert] = new_service.errors.full_messages
flash[:alert] = @service.errors.full_messages
render :new
end
end

View file

@ -12,10 +12,9 @@ class Users::DossiersController < UsersController
end
def commencer_test
procedure_path = ProcedurePath.find_by(path: params[:procedure_path])
procedure = procedure_path&.procedure
procedure = Procedure.brouillons.find_by(path: params[:path])
if procedure&.brouillon? && procedure&.path.present?
if procedure.present?
redirect_to new_users_dossier_path(procedure_id: procedure.id, brouillon: true)
else
flash.alert = "La démarche est inconnue."
@ -24,17 +23,10 @@ class Users::DossiersController < UsersController
end
def commencer
procedure_path = ProcedurePath.find_by(path: params[:procedure_path])
procedure = procedure_path&.procedure
procedure = Procedure.publiees.find_by(path: params[:path])
if procedure.present?
if procedure.archivee?
@dossier = Dossier.new(procedure: procedure)
render 'commencer/archived'
else
redirect_to new_users_dossier_path(procedure_id: procedure.id)
end
else
flash.alert = "La démarche est inconnue, ou la création de nouveaux dossiers pour cette démarche est terminée."
redirect_to root_path

View file

@ -2,9 +2,9 @@ module ProcedureHelper
def procedure_lien(procedure)
if procedure.path.present?
if procedure.brouillon_avec_lien?
commencer_test_url(procedure_path: procedure.path)
commencer_test_url(path: procedure.path)
else
commencer_url(procedure_path: procedure.path)
commencer_url(path: procedure.path)
end
end
end

View file

@ -18,7 +18,10 @@ class ApiGeo::RPGAdapter
:code_culture,
:surface,
:bio
).merge({ geometry: feature[:geometry] })
).merge({
geometry: feature[:geometry],
geo_reference_id: feature[:properties][:id]
})
end
end
end

View file

@ -9,7 +9,6 @@ class Procedure < ApplicationRecord
has_one :module_api_carto, dependent: :destroy
has_one :attestation_template, dependent: :destroy
has_one :procedure_path, dependent: :destroy
belongs_to :administrateur
belongs_to :parent_procedure, class_name: 'Procedure'
@ -46,12 +45,12 @@ class Procedure < ApplicationRecord
scope :by_libelle, -> { order(libelle: :asc) }
scope :created_during, -> (range) { where(created_at: range) }
scope :cloned_from_library, -> { where(cloned_from_library: true) }
scope :avec_lien, -> { joins(:procedure_path) }
scope :avec_lien, -> { where.not(path: nil) }
validates :libelle, presence: true, allow_blank: false, allow_nil: false
validates :description, presence: true, allow_blank: false, allow_nil: false
validate :check_juridique
validates :path, format: { with: /\A[a-z0-9_\-]{3,50}\z/ }, uniqueness: true, presence: true, allow_blank: false, allow_nil: true
validates :path, format: { with: /\A[a-z0-9_\-]{3,50}\z/ }, uniqueness: { scope: :aasm_state, case_sensitive: false }, presence: true, allow_blank: false, allow_nil: true
# FIXME: remove duree_conservation_required flag once all procedures are converted to the new style
validates :duree_conservation_dossiers_dans_ds, allow_nil: false, numericality: { only_integer: true, greater_than_or_equal_to: 1, less_than_or_equal_to: MAX_DUREE_CONSERVATION }, if: :durees_conservation_required
validates :duree_conservation_dossiers_hors_ds, allow_nil: false, numericality: { only_integer: true, greater_than_or_equal_to: 0 }, if: :durees_conservation_required
@ -101,19 +100,6 @@ class Procedure < ApplicationRecord
end
end
def publish_with_path!(path)
procedure_path = ProcedurePath
.where(administrateur: administrateur)
.find_by(path: path)
if procedure_path.present?
procedure_path.publish!(self)
else
create_procedure_path!(administrateur: administrateur, path: path)
end
update!(path: path)
end
def reset!
if locked?
raise "Can not reset a locked procedure."
@ -126,14 +112,6 @@ class Procedure < ApplicationRecord
publiee_ou_archivee?
end
def path_available?(path)
!ProcedurePath.where.not(procedure: self).exists?(path: path)
end
def path_is_mine?(path)
ProcedurePath.where.not(procedure: self).mine?(administrateur, path)
end
# This method is needed for transition. Eventually this will be the same as brouillon?.
def brouillon_avec_lien?
Flipflop.publish_draft? && brouillon? && path.present?
@ -157,10 +135,6 @@ class Procedure < ApplicationRecord
Dossier.new(procedure: self, champs: champs, champs_private: champs_private)
end
def path
read_attribute(:path) || procedure_path&.path
end
def default_path
libelle&.parameterize&.first(50)
end
@ -332,21 +306,66 @@ class Procedure < ApplicationRecord
mean_time(:en_instruction_at, :processed_at)
end
PATH_AVAILABLE = :available
PATH_AVAILABLE_PUBLIEE = :available_publiee
PATH_NOT_AVAILABLE = :not_available
PATH_NOT_AVAILABLE_BROUILLON = :not_available_brouillon
PATH_CAN_PUBLISH = [PATH_AVAILABLE, PATH_AVAILABLE_PUBLIEE]
def path_availability(path)
Procedure.path_availability(administrateur, path, id)
end
def self.path_availability(administrateur, path, exclude_id = nil)
if exclude_id.present?
procedure = where.not(id: exclude_id).find_by(path: path)
else
procedure = find_by(path: path)
end
if procedure.blank?
PATH_AVAILABLE
elsif administrateur.owns?(procedure)
if procedure.brouillon?
PATH_NOT_AVAILABLE_BROUILLON
else
PATH_AVAILABLE_PUBLIEE
end
else
PATH_NOT_AVAILABLE
end
end
def self.find_with_path(path)
where.not(aasm_state: :archivee).where("path LIKE ?", "%#{path}%")
end
private
def can_publish?(path)
procedure_path = ProcedurePath.find_by(path: path)
if procedure_path.present?
administrateur.owns?(procedure_path)
else
true
def claim_path_ownership!(path)
procedure = Procedure.where(administrateur: administrateur).find_by(path: path)
if procedure&.publiee? && procedure != self
procedure.archive!
end
update!(path: path)
end
def can_publish?(path)
path_availability(path).in?(PATH_CAN_PUBLISH)
end
def after_publish(path)
update!(published_at: Time.zone.now)
publish_with_path!(path)
claim_path_ownership!(path)
end
def after_reopen(path)
update!(published_at: Time.zone.now, archived_at: nil)
claim_path_ownership!(path)
end
def after_archive
@ -356,16 +375,9 @@ class Procedure < ApplicationRecord
def after_hide
now = Time.zone.now
update!(hidden_at: now, path: nil)
procedure_path&.hide!
dossiers.update_all(hidden_at: now)
end
def after_reopen(path)
update!(published_at: Time.zone.now, archived_at: nil)
publish_with_path!(path)
end
def after_draft
update!(published_at: nil)
end

View file

@ -1,36 +0,0 @@
class ProcedurePath < ApplicationRecord
validates :path, format: { with: /\A[a-z0-9_\-]{3,50}\z/ }, uniqueness: true, presence: true, allow_blank: false, allow_nil: false
validates :administrateur_id, presence: true, allow_blank: false, allow_nil: false
validates :procedure_id, presence: true, allow_blank: false, allow_nil: false
belongs_to :procedure
belongs_to :administrateur
def self.valid?(procedure, path)
create_with(procedure: procedure, administrateur: procedure.administrateur)
.find_or_initialize_by(path: path).validate
end
def self.mine?(administrateur, path)
procedure_path = find_by(path: path)
procedure_path && administrateur.owns?(procedure_path)
end
def self.find_with_path(path)
joins(:procedure)
.where.not(procedures: { aasm_state: :archivee })
.where("procedure_paths.path LIKE ?", "%#{path}%")
.order(:id)
end
def hide!
destroy!
end
def publish!(new_procedure)
if procedure&.publiee? && procedure != new_procedure
procedure.archive!
end
update!(procedure: new_procedure)
end
end

View file

@ -111,7 +111,7 @@ class ProcedurePresentation < ApplicationRecord
column = sanitized_column(filter)
case table
when 'self'
date = Time.zone.parse(filter['value']) rescue nil
date = Time.zone.parse(filter['value']).beginning_of_day rescue nil
if date.present?
dossiers.where("#{column} BETWEEN ? AND ?", date, date + 1.day)
else

View file

@ -1,5 +1,10 @@
class CommentaireSerializer < ActiveModel::Serializer
attributes :email,
:body,
:created_at
:created_at,
:attachment
def attachment
object.file_url
end
end

View file

@ -1,5 +1,5 @@
class GeoAreaSerializer < ActiveModel::Serializer
attributes :geometry, :source
attributes :geometry, :source, :geo_reference_id
attribute :surface_intersection, if: :include_cadastre?
attribute :surface_parcelle, if: :include_cadastre?

View file

@ -21,9 +21,9 @@ class ProcedureSerializer < ActiveModel::Serializer
def link
if object.path.present?
if object.brouillon_avec_lien?
commencer_test_url(procedure_path: object.path)
commencer_test_url(path: object.path)
else
commencer_url(procedure_path: object.path)
commencer_url(path: object.path)
end
end
end

View file

@ -1,15 +0,0 @@
class ProcedurePathFormatValidator < ActiveModel::Validator
def path_regex
/^[a-z0-9_]{3,30}$/
end
def validate(record)
if record.path.blank?
return false
end
if !path_regex.match(record.path)
record.errors[:path] << "Path invalide"
end
end
end

View file

@ -16,11 +16,11 @@
%h4 Lien public*
.procedure-lien
%span.prefix
= commencer_test_url(procedure_path: '')
= commencer_test_url(path: '')
= f.text_field :path, value: @path, class: 'form-control', data: { remote: true, debounce: true, url: admin_procedures_available_path, params: { id: @procedure.id }.to_query(:procedure) }
%p.unavailable-path-message.text-warning
- if !@available
= render partial: 'unavailable', locals: { mine: @mine }
- if @availability != Procedure::PATH_AVAILABLE
= render partial: 'unavailable', locals: { availability: @availability }
%p.help-block
%i.fa.fa-info-circle
Afin de faciliter laccès à la démarche, vous êtes invité à personnaliser ladresse d'accès public. C'est ce lien qu'il va falloir communiquer aux usagers souhaitant faire la démarche.

View file

@ -20,8 +20,8 @@
%br
%h4 Lien de la démarche
%p.center
= commencer_url(procedure_path: '')
= text_field_tag('procedure_path', @procedure.path || @procedure.default_path,
= commencer_url(path: '')
= text_field_tag(:path, @procedure.path || @procedure.default_path,
id: 'procedure_path',
placeholder: 'Chemin vers la démarche',
data: { autocomplete: 'path' },
@ -41,7 +41,8 @@
%br
Vous ne pouvez pas lutiliser car il appartient à un autre administrateur.
#path_is_invalid.text-danger.center.message
= t('activerecord.errors.models.procedure_path.attributes.path.format')
Ce lien
= t('activerecord.errors.models.procedure.attributes.path.invalid')
.modal-footer
= submit_tag procedure_modal_text(@procedure, :submit), class: %w(btn btn btn-success), disabled: :disabled, id: 'publish'
= button_tag "Annuler", class: %w(btn btn btn-default), data: { dismiss: :modal }, id: 'cancel'

View file

@ -1,8 +1,11 @@
- if mine
- case availability
- when Procedure::PATH_AVAILABLE_PUBLIEE
Ce lien est déjà utilisé par une de vos démarche.
%br
Si vous voulez lutiliser, lancienne démarche sera archivée (plus accessible du public).
- else
Si vous voulez lutiliser, lancienne démarche sera archivée lors de la publication de la démarche (plus accessible du public).
- when Procedure::PATH_NOT_AVAILABLE_BROUILLON
Un brouillon de démarche existe déjà avec ce lien.
- when Procedure::PATH_NOT_AVAILABLE
Ce lien est déjà utilisé par une démarche.
%br
Vous ne pouvez pas lutiliser car il appartient à un autre administrateur.

View file

@ -1,11 +1,11 @@
<% if @available %>
<% if @availability == Procedure::PATH_AVAILABLE %>
<%= remove_element('.unavailable-path-message', inner: true) %>
<%= enable_element('button[type=submit]') %>
<% else %>
<%= render_to_element('.unavailable-path-message', partial: 'unavailable', locals: { mine: @mine }) %>
<% if @mine %>
<%= render_to_element('.unavailable-path-message', partial: 'unavailable', locals: { availability: @availability }) %>
<% end %>
<% if @availability.in?(Procedure::PATH_CAN_PUBLISH) %>
<%= enable_element('button[type=submit]') %>
<% else %>
<%= disable_element('button[type=submit]') %>
<% end %>
<% end %>

View file

@ -3,7 +3,7 @@
= form_for @procedure, url: url_for({ controller: 'admin/procedures', action: :update, id: @procedure.id }), multipart: true do |f|
= render partial: 'informations', locals: { f: f }
.text-right
- if !Flipflop.publish_draft? || (@available || @mine)
- if !Flipflop.publish_draft? || @availability.in?(Procedure::PATH_CAN_PUBLISH)
= f.button 'Enregistrer', class: 'btn btn-success'
- else
= f.button 'Enregistrer', class: 'btn btn-success', disabled: true

View file

@ -6,7 +6,7 @@
= form_for @procedure, url: { controller: 'admin/procedures', action: :create }, multipart: true do |f|
= render partial: 'informations', locals: { f: f }
.text-right
- if !Flipflop.publish_draft? || (@available || @mine)
- if !Flipflop.publish_draft? || @availability.in?(Procedure::PATH_CAN_PUBLISH)
= f.button 'Valider', class: 'btn btn-info', id: 'save-procedure'
- else
= f.button 'Valider', class: 'btn btn-info', id: 'save-procedure', disabled: true

View file

@ -1,15 +0,0 @@
%br
%div{ style: 'text-align: center; max-width: 500px; margin-left: auto; margin-right: auto; padding: 20px;' }
= render partial: 'users/sessions/resume_procedure'
.center{ style: 'margin-top: -20px;' }
%h3
La campagne de création de nouveau dossier
%br
pour cette démarche en ligne est maintenant terminée.
%br
%p
Si vous avez déjà déposé un ou plusieurs dossiers :
%a.btn.btn-lg.btn-info{ href: new_user_session_path }
Accéder à mon espace en ligne.

View file

@ -1,4 +1,4 @@
- if field.data.present?
= link_to "/commencer/#{field.data}", commencer_url(procedure_path: field.data), target: '_blank'
= link_to "/commencer/#{field.data}", commencer_url(path: field.data), target: '_blank'
- else
Plus en ligne

View file

@ -0,0 +1 @@
= render partial: 'layouts/left_panels/left_panel_admin_procedurescontroller_navbar', locals: { active: 'Description' }

View file

@ -35,7 +35,6 @@ as well as a link to its edit page.
<div>
<% if !user.confirmed? %>
<%= link_to('Renvoyer lemail de confirmation', [:resend_confirmation_instructions, namespace, page.resource], method: :post, class: 'button') %>
<%= link_to('Confirmer lemail', confirm_manager_user_path(user), method: :post, class: 'button') %>
<% end %>
<div>
</header>

View file

@ -8,4 +8,4 @@
%h1 Nouveau Service
= render partial: 'form',
locals: { service: Service.new, procedure_id: @procedure.id }
locals: { service: @service, procedure_id: @procedure.id }

View file

@ -12,7 +12,7 @@
%ul.demarche-links
- @previous_demarches_still_active.each do |demarche|
%li
= link_to(commencer_url(procedure_path: demarche.path), class: "demarche-link") do
= link_to(commencer_url(path: demarche.path), class: "demarche-link") do
= demarche.libelle
%br
.service-name
@ -23,7 +23,7 @@
%ul.demarche-links
- @popular_demarches.each do |demarche|
%li
= link_to(commencer_url(procedure_path: demarche.path), class: "demarche-link") do
= link_to(commencer_url(path: demarche.path), class: "demarche-link") do
= demarche.libelle
%br
.service-name

View file

@ -35,9 +35,12 @@
Pièces jointes
.warning
- if tpjs.many?
Pour éviter toute erreur, nous vous conseillons de limiter la taille de chaque pièce jointe à 20 Mo, et de les ajouter une par une, en enregistrant votre
= dossier.brouillon? ? "brouillon" : "dossier"
après chaque ajout.
- else
Pour éviter toute erreur, nous vous conseillons de limiter la taille de votre pièce jointe à 20 Mo.
- tpjs.each do |tpj|
.pj-input

View file

@ -156,6 +156,10 @@ fr:
taken: déjà utilisé
password:
too_short: 'est trop court'
procedure:
attributes:
path:
invalid: n'est pas valide. Il doit comporter au moins 3 caractères, au plus 50 caractères et seuls les caractères a-z, 0-9, '_' et '-' sont autorisés.
errors:
messages:

View file

@ -2,6 +2,7 @@ fr:
activerecord:
attributes:
procedure:
path: Lien public
organisation: Organisme
duree_conservation_dossiers_dans_ds: Durée de conservation des dossiers sur demarches-simplifiees.fr
duree_conservation_dossiers_hors_ds: Durée de conservation des dossiers hors demarches-simplifiees.fr

View file

@ -1,12 +0,0 @@
fr:
activerecord:
attributes:
procedure_path:
path: Lien
errors:
models:
procedure_path:
attributes:
path:
format: Ce lien n'est pas valide. Il doit comporter au moins 3 caractères, au plus 50 caractères et seuls les caractères a-z, 0-9, '_' et '-' sont autorisés.
taken: est déjà utilisé par une procédure.

View file

@ -22,7 +22,6 @@ Rails.application.routes.draw do
resources :users, only: [:index, :show] do
post 'resend_confirmation_instructions', on: :member
post 'confirm', on: :member
end
resources :gestionnaires, only: [:index, :show] do
@ -129,8 +128,8 @@ Rails.application.routes.draw do
end
namespace :commencer do
get '/test/:procedure_path' => '/users/dossiers#commencer_test', as: :test
get '/:procedure_path' => '/users/dossiers#commencer'
get '/test/:path' => '/users/dossiers#commencer_test', as: :test
get '/:path' => '/users/dossiers#commencer'
end
get "patron" => "root#patron"

View file

@ -0,0 +1,5 @@
class AddGeoIdToGeoAreas < ActiveRecord::Migration[5.2]
def change
add_column :geo_areas, :geo_reference_id, :string
end
end

View file

@ -10,7 +10,7 @@
#
# It's strongly recommended that you check this file into your version control system.
ActiveRecord::Schema.define(version: 2018_10_10_183331) do
ActiveRecord::Schema.define(version: 2018_10_30_103913) do
# These are extensions that must be enabled in order to support this database
enable_extension "plpgsql"
@ -347,6 +347,7 @@ ActiveRecord::Schema.define(version: 2018_10_10_183331) do
t.jsonb "geometry"
t.jsonb "properties"
t.bigint "champ_id"
t.string "geo_reference_id"
t.index ["champ_id"], name: "index_geo_areas_on_champ_id"
t.index ["source"], name: "index_geo_areas_on_source"
end

View file

@ -27,11 +27,6 @@ namespace :support do
rake_puts("Changing owner of procedure ##{procedure_id} from ##{procedure.administrateur_id} to ##{new_owner.id}")
procedure.update(administrateur: new_owner)
ProcedurePath.where(procedure_id: procedure_id).each do |pp|
rake_puts("Changing owner of procedure_path #{pp.path} from ##{pp.administrateur_id} to ##{new_owner.id}")
pp.update(administrateur: new_owner)
end
end
desc <<~EOD
@ -74,13 +69,6 @@ namespace :support do
end
procedures.update_all(administrateur_id: new_owner.id)
procedures.pluck(:id).each do |procedure_id|
ProcedurePath.where(procedure_id: procedure_id).each do |pp|
rake_puts("Changing owner of procedure_path #{pp.path} from ##{pp.administrateur_id} to ##{new_owner.id}")
pp.update(administrateur: new_owner)
end
end
end
desc <<~EOD

View file

@ -359,28 +359,28 @@ describe Admin::ProceduresController, type: :controller do
context 'when admin is the owner of the procedure' do
before do
put :publish, params: { procedure_id: procedure.id, procedure_path: procedure_path }
put :publish, params: { procedure_id: procedure.id, path: path }
procedure.reload
procedure2.reload
end
context 'procedure path does not exist' do
let(:procedure_path) { 'new_path' }
let(:path) { 'new_path' }
it 'publish the given procedure' do
expect(procedure.publiee?).to be_truthy
expect(procedure.path).to eq(procedure_path)
expect(procedure.path).to eq(path)
expect(response.status).to eq 302
expect(flash[:notice]).to have_content 'Démarche publiée'
end
end
context 'procedure path exists and is owned by current administrator' do
let(:procedure_path) { procedure2.path }
let(:path) { procedure2.path }
it 'publish the given procedure' do
expect(procedure.publiee?).to be_truthy
expect(procedure.path).to eq(procedure_path)
expect(procedure.path).to eq(path)
expect(response.status).to eq 302
expect(flash[:notice]).to have_content 'Démarche publiée'
end
@ -391,24 +391,8 @@ describe Admin::ProceduresController, type: :controller do
end
end
context 'procedure path exists and has archived procedure' do
let(:procedure_path) { procedure2.path }
let(:procedure2) { create(:procedure, :archived, administrateur: admin) }
it 'publish the given procedure' do
expect(procedure.publiee?).to be_truthy
expect(procedure.path).to eq(procedure_path)
expect(response.status).to eq 302
expect(flash[:notice]).to have_content 'Démarche publiée'
end
it 'archive previous procedure' do
expect(procedure2.archivee?).to be_truthy
end
end
context 'procedure path exists and is not owned by current administrator' do
let(:procedure_path) { procedure3.path }
let(:path) { procedure3.path }
it 'does not publish the given procedure' do
expect(procedure.publiee?).to be_falsey
@ -424,7 +408,7 @@ describe Admin::ProceduresController, type: :controller do
end
context 'procedure path is invalid' do
let(:procedure_path) { 'Invalid Procedure Path' }
let(:path) { 'Invalid Procedure Path' }
it 'does not publish the given procedure' do
expect(procedure.publiee?).to be_falsey
@ -442,7 +426,7 @@ describe Admin::ProceduresController, type: :controller do
sign_out admin
sign_in admin_2
put :publish, params: { procedure_id: procedure.id, procedure_path: 'fake_path' }
put :publish, params: { procedure_id: procedure.id, path: 'fake_path' }
procedure.reload
end
@ -470,7 +454,7 @@ describe Admin::ProceduresController, type: :controller do
context 'when owner want to re-enable procedure' do
before do
put :publish, params: { procedure_id: procedure.id, procedure_path: 'fake_path' }
put :publish, params: { procedure_id: procedure.id, path: 'fake_path' }
procedure.reload
end
@ -751,10 +735,19 @@ describe Admin::ProceduresController, type: :controller do
it { expect(response.body).to include("innerHTML = ''") }
end
context 'my path' do
context 'my path (brouillon)' do
let(:procedure_owned) { create(:procedure, :with_path, administrateur: admin) }
let(:path) { procedure_owned.path }
it {
expect(response.body).to include('Un brouillon de démarche existe déjà avec ce lien.')
}
end
context 'my path' do
let(:procedure_owned) { create(:procedure, :published, administrateur: admin) }
let(:path) { procedure_owned.path }
it {
expect(response.body).to include('Ce lien est déjà utilisé par une de vos démarche.')
expect(response.body).to include('Si vous voulez lutiliser, lancienne démarche sera archivée')

View file

@ -43,6 +43,7 @@ describe NewAdministrateur::ServicesController, type: :controller do
it { expect(flash.alert).not_to be_nil }
it { expect(response).to render_template(:new) }
it { expect(assigns(:service).nom).to eq('super service') }
end
end

View file

@ -244,7 +244,7 @@ describe StatsController, type: :controller do
describe "#avis_average_answer_time" do
before do
Timecop.freeze(Time.zone.now)
Timecop.freeze(Time.zone.local(2016, 10, 2))
# 1 week ago
create(:avis, answer: "voila ma réponse", created_at: 1.week.ago + 1.day, updated_at: 1.week.ago + 2.days) # 1 day

View file

@ -65,7 +65,7 @@ describe Users::DossiersController, type: :controller do
end
describe 'GET #commencer' do
subject { get :commencer, params: { procedure_path: path } }
subject { get :commencer, params: { path: path } }
let(:path) { procedure.path }
it { expect(subject.status).to eq 302 }
@ -83,7 +83,7 @@ describe Users::DossiersController, type: :controller do
Flipflop::FeatureSet.current.test!.switch!(:publish_draft, true)
end
subject { get :commencer_test, params: { procedure_path: path } }
subject { get :commencer_test, params: { path: path } }
let(:procedure) { create(:procedure, :with_path) }
let(:path) { procedure.path }

View file

@ -3,7 +3,6 @@ require 'spec_helper'
describe ProcedureDecorator do
let(:published_at) { Time.zone.local(2017, 12, 24, 14, 12) }
let(:procedure) { create(:procedure, published_at: published_at, created_at: Time.zone.local(2015, 12, 24, 14, 10)) }
let!(:procedure_path) { create(:procedure_path, administrateur: create(:administrateur), procedure: procedure) }
subject { procedure.decorate }

View file

@ -37,12 +37,7 @@ FactoryBot.define do
end
trait :with_path do
after(:create) do |procedure|
create(:procedure_path,
procedure: procedure,
administrateur: procedure.administrateur,
path: generate(:published_path))
end
path { generate(:published_path) }
end
trait :with_service do

View file

@ -1,5 +0,0 @@
FactoryBot.define do
factory :procedure_path do
path { 'fake_path' }
end
end

View file

@ -7,8 +7,6 @@ feature 'As an administrateur I wanna clone a procedure', js: true do
let(:administrateur) { create(:administrateur) }
before do
# FIXME: needed to make procedure_path validation work
create(:procedure)
Flipflop::FeatureSet.current.test!.switch!(:publish_draft, true)
login_as administrateur, scope: :administrateur
visit root_path

View file

@ -7,8 +7,6 @@ feature 'As an administrateur I wanna create a new procedure', js: true do
let(:administrateur) { create(:administrateur) }
before do
# FIXME: needed to make procedure_path validation work
create(:procedure)
Flipflop::FeatureSet.current.test!.switch!(:publish_draft, true)
login_as administrateur, scope: :administrateur
visit root_path

View file

@ -129,7 +129,7 @@ feature 'The user' do
private
def log_in(email, password, procedure)
visit "/commencer/#{procedure.procedure_path.path}"
visit "/commencer/#{procedure.path}"
expect(page).to have_current_path(new_user_session_path)
fill_in 'user_email', with: email

View file

@ -16,7 +16,7 @@ feature 'Creating a new dossier:' do
let(:expected_birthday) { nil }
before do
visit commencer_path(procedure_path: procedure.path)
visit commencer_path(path: procedure.path)
fill_in 'individual_nom', with: 'Nom'
fill_in 'individual_prenom', with: 'Prenom'
end
@ -76,7 +76,7 @@ feature 'Creating a new dossier:' do
end
scenario 'the user can enter the SIRET of its etablissement and create a new draft', vcr: { cassette_name: 'api_adresse_search_paris_3' }, js: true do
visit commencer_path(procedure_path: procedure.path)
visit commencer_path(path: procedure.path)
expect(page).to have_current_path(siret_dossier_path(dossier))
fill_in 'Numéro SIRET', with: siret
@ -93,7 +93,7 @@ feature 'Creating a new dossier:' do
end
scenario 'the user is notified when its SIRET is invalid' do
visit commencer_path(procedure_path: procedure.path)
visit commencer_path(path: procedure.path)
expect(page).to have_current_path(siret_dossier_path(dossier))
fill_in 'Numéro SIRET', with: '0000'

View file

@ -47,7 +47,7 @@ feature 'linked dropdown lists' do
private
def log_in(email, password, procedure)
visit "/commencer/#{procedure.procedure_path.path}"
visit "/commencer/#{procedure.path}"
expect(page).to have_current_path(new_user_session_path)
fill_in 'user_email', with: email

View file

@ -53,7 +53,8 @@ describe ApiGeo::RPGAdapter do
:code_culture,
:surface,
:bio,
:geometry
:geometry,
:geo_reference_id
])
end
end

View file

@ -1,49 +0,0 @@
require 'spec_helper'
describe ProcedurePath do
describe 'assocations' do
it { is_expected.to belong_to(:administrateur) }
it { is_expected.to belong_to(:procedure) }
end
describe 'attributes' do
it { is_expected.to have_db_column(:path) }
end
describe 'validation' do
describe 'path' do
let(:admin) { create(:administrateur) }
let(:procedure) { create(:procedure) }
let(:procedure_path) { create(:procedure_path, administrateur: admin, procedure: procedure, path: path) }
context 'when path is nil' do
let(:path) { nil }
it { expect{ procedure_path }.to raise_error ActiveRecord::RecordInvalid }
end
context 'when path is empty' do
let(:path) { '' }
it { expect{ procedure_path }.to raise_error ActiveRecord::RecordInvalid }
end
context 'when path contains spaces' do
let(:path) { 'Demande de subvention' }
it { expect{ procedure_path }.to raise_error ActiveRecord::RecordInvalid }
end
context 'when path contains alphanumerics and underscores' do
let(:path) { 'ma_super_procedure_1' }
it { expect{ procedure_path }.not_to raise_error }
end
context 'when path contains dashes' do
let(:path) { 'ma-super-procedure' }
it { expect{ procedure_path }.not_to raise_error }
end
context 'when path is too long' do
let(:path) { 'ma-super-procedure-12345678901234567890123456789012345678901234567890' }
it { expect{ procedure_path }.to raise_error ActiveRecord::RecordInvalid }
end
context 'when path is too short' do
let(:path) { 'pr' }
it { expect{ procedure_path }.to raise_error ActiveRecord::RecordInvalid }
end
end
end
end

View file

@ -135,14 +135,14 @@ describe ProcedurePresentation do
let(:column) { 'created_at' }
let(:dossier) { Timecop.freeze(Time.zone.local(1992, 3, 22)) { create(:dossier, procedure: procedure) } }
it { is_expected.to eq(Time.zone.local(1992, 3, 22).strftime('%d/%m/%Y')) }
it { is_expected.to eq('22/03/1992') }
end
context 'for en_construction_at column' do
let(:column) { 'en_construction_at' }
let(:dossier) { create(:dossier, :en_construction, procedure: procedure, en_construction_at: Time.zone.local(2018, 10, 17)) }
it { is_expected.to eq(Time.zone.local(2018, 10, 17).strftime('%d/%m/%Y')) }
it { is_expected.to eq('17/10/2018') }
end
context 'for updated_at column' do
@ -151,7 +151,7 @@ describe ProcedurePresentation do
before { dossier.touch(time: Time.zone.local(2018, 9, 25)) }
it { is_expected.to eq(Time.zone.local(2018, 9, 25).strftime('%d/%m/%Y')) }
it { is_expected.to eq('25/09/2018') }
end
end
@ -405,6 +405,14 @@ describe ProcedurePresentation do
it { is_expected.to contain_exactly(kept_dossier.id) }
end
context 'ignore time of day' do
let!(:kept_dossier) { create(:dossier, :en_construction, procedure: procedure, en_construction_at: Time.zone.local(2018, 10, 17, 15, 56)) }
let!(:discarded_dossier) { create(:dossier, :en_construction, procedure: procedure, en_construction_at: Time.zone.local(2018, 10, 18, 5, 42)) }
let(:filter) { [{ 'table' => 'self', 'column' => 'en_construction_at', 'value' => '17/10/2018 19:30' }] }
it { is_expected.to contain_exactly(kept_dossier.id) }
end
context 'for a malformed date' do
context 'when its a string' do
let(:filter) { [{ 'table' => 'self', 'column' => 'updated_at', 'value' => 'malformed date' }] }

View file

@ -439,9 +439,8 @@ describe Procedure do
it { expect(procedure.archived_at).to eq(nil) }
it { expect(procedure.published_at).to eq(now) }
it { expect(ProcedurePath.find_by(path: "example-path")).to be }
it { expect(ProcedurePath.find_by(path: "example-path").procedure).to eq(procedure) }
it { expect(ProcedurePath.find_by(path: "example-path").administrateur).to eq(procedure.administrateur) }
it { expect(Procedure.find_by(path: "example-path")).to eq(procedure) }
it { expect(Procedure.find_by(path: "example-path").administrateur).to eq(procedure.administrateur) }
end
describe "#brouillon?" do
@ -486,7 +485,6 @@ describe Procedure do
describe 'archive' do
let(:procedure) { create(:procedure, :published) }
let(:procedure_path) { ProcedurePath.find(procedure.procedure_path.id) }
let(:now) { Time.zone.now.beginning_of_minute }
before do
Timecop.freeze(now)
@ -634,7 +632,7 @@ describe Procedure do
context "with a path" do
let(:procedure) { create(:procedure, :published) }
it { is_expected.to eq("dossiers_#{procedure.procedure_path.path}_2018-01-02_23-11") }
it { is_expected.to eq("dossiers_#{procedure.path}_2018-01-02_23-11") }
end
context "without a path" do

View file

@ -53,7 +53,7 @@ describe 'admin/procedures/show.html.haml', type: :view do
end
describe 'procedure link is present' do
it { expect(rendered).to have_content(commencer_url(procedure_path: procedure.path)) }
it { expect(rendered).to have_content(commencer_url(path: procedure.path)) }
end
end