diff --git a/.gitignore b/.gitignore
index 9b7818561..dc45b1263 100644
--- a/.gitignore
+++ b/.gitignore
@@ -28,5 +28,7 @@ config/initializers/token.rb
doc/*.svg
rubocop.html
config/france_connect.yml
+config/initializers/mailjet.rb
+config/fog_credentials.yml
uploads/*
coverage/**/*
diff --git a/Gemfile b/Gemfile
index 378447a6f..5bd2a237d 100644
--- a/Gemfile
+++ b/Gemfile
@@ -56,6 +56,8 @@ gem 'rest-client'
gem 'clamav-client', require: 'clamav/client'
gem 'carrierwave'
+gem 'fog'
+gem 'fog-openstack'
gem 'pg'
@@ -99,6 +101,7 @@ group :test do
gem 'guard'
gem 'guard-rspec', require: false
gem 'guard-livereload', '~> 2.4', require: false
+ gem 'vcr'
end
group :development, :test do
diff --git a/Gemfile.lock b/Gemfile.lock
index f21a7f26f..21f55c50e 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -9,6 +9,7 @@ GIT
GEM
remote: https://rubygems.org/
specs:
+ CFPropertyList (2.3.2)
actionmailer (4.2.5.2)
actionpack (= 4.2.5.2)
actionview (= 4.2.5.2)
@@ -139,6 +140,7 @@ GEM
http_parser.rb (~> 0.6.0)
erubis (2.7.0)
eventmachine (1.0.8)
+ excon (0.49.0)
execjs (2.5.2)
factory_girl (4.5.0)
activesupport (>= 3.0.0)
@@ -146,6 +148,135 @@ GEM
multipart-post (>= 1.2, < 3)
fastercsv (1.5.5)
ffi (1.9.6)
+ fission (0.5.0)
+ CFPropertyList (~> 2.2)
+ fog (1.38.0)
+ fog-aliyun (>= 0.1.0)
+ fog-atmos
+ fog-aws (>= 0.6.0)
+ fog-brightbox (~> 0.4)
+ fog-cloudatcost (~> 0.1.0)
+ fog-core (~> 1.32)
+ fog-dynect (~> 0.0.2)
+ fog-ecloud (~> 0.1)
+ fog-google (<= 0.1.0)
+ fog-json
+ fog-local
+ fog-openstack
+ fog-powerdns (>= 0.1.1)
+ fog-profitbricks
+ fog-rackspace
+ fog-radosgw (>= 0.0.2)
+ fog-riakcs
+ fog-sakuracloud (>= 0.0.4)
+ fog-serverlove
+ fog-softlayer
+ fog-storm_on_demand
+ fog-terremark
+ fog-vmfusion
+ fog-voxel
+ fog-vsphere (>= 0.4.0)
+ fog-xenserver
+ fog-xml (~> 0.1.1)
+ ipaddress (~> 0.5)
+ fog-aliyun (0.1.0)
+ fog-core (~> 1.27)
+ fog-json (~> 1.0)
+ ipaddress (~> 0.8)
+ xml-simple (~> 1.1)
+ fog-atmos (0.1.0)
+ fog-core
+ fog-xml
+ fog-aws (0.9.2)
+ fog-core (~> 1.27)
+ fog-json (~> 1.0)
+ fog-xml (~> 0.1)
+ ipaddress (~> 0.8)
+ fog-brightbox (0.10.1)
+ fog-core (~> 1.22)
+ fog-json
+ inflecto (~> 0.0.2)
+ fog-cloudatcost (0.1.2)
+ fog-core (~> 1.36)
+ fog-json (~> 1.0)
+ fog-xml (~> 0.1)
+ ipaddress (~> 0.8)
+ fog-core (1.38.0)
+ builder
+ excon (~> 0.49)
+ formatador (~> 0.2)
+ fog-dynect (0.0.3)
+ fog-core
+ fog-json
+ fog-xml
+ fog-ecloud (0.3.0)
+ fog-core
+ fog-xml
+ fog-google (0.1.0)
+ fog-core
+ fog-json
+ fog-xml
+ fog-json (1.0.2)
+ fog-core (~> 1.0)
+ multi_json (~> 1.10)
+ fog-local (0.3.0)
+ fog-core (~> 1.27)
+ fog-openstack (0.1.5)
+ fog-core (>= 1.38)
+ fog-json (>= 1.0)
+ fog-xml (>= 0.1)
+ ipaddress (>= 0.8)
+ fog-powerdns (0.1.1)
+ fog-core (~> 1.27)
+ fog-json (~> 1.0)
+ fog-xml (~> 0.1)
+ fog-profitbricks (0.0.5)
+ fog-core
+ fog-xml
+ nokogiri
+ fog-rackspace (0.1.1)
+ fog-core (>= 1.35)
+ fog-json (>= 1.0)
+ fog-xml (>= 0.1)
+ ipaddress (>= 0.8)
+ fog-radosgw (0.0.5)
+ fog-core (>= 1.21.0)
+ fog-json
+ fog-xml (>= 0.0.1)
+ fog-riakcs (0.1.0)
+ fog-core
+ fog-json
+ fog-xml
+ fog-sakuracloud (1.7.5)
+ fog-core
+ fog-json
+ fog-serverlove (0.1.2)
+ fog-core
+ fog-json
+ fog-softlayer (1.1.1)
+ fog-core
+ fog-json
+ fog-storm_on_demand (0.1.1)
+ fog-core
+ fog-json
+ fog-terremark (0.1.0)
+ fog-core
+ fog-xml
+ fog-vmfusion (0.1.0)
+ fission
+ fog-core
+ fog-voxel (0.1.0)
+ fog-core
+ fog-xml
+ fog-vsphere (0.6.4)
+ fog-core
+ rbvmomi (~> 1.8)
+ fog-xenserver (0.2.3)
+ fog-core
+ fog-xml
+ fog-xml (0.1.2)
+ fog-core
+ nokogiri (~> 1.5, >= 1.5.11)
font-awesome-rails (4.4.0.0)
railties (>= 3.2, < 5.0)
formatador (0.2.5)
@@ -189,6 +320,8 @@ GEM
http_parser.rb (0.6.0)
httpclient (2.6.0.1)
i18n (0.7.0)
+ inflecto (0.0.2)
+ ipaddress (0.8.3)
jbuilder (2.3.1)
activesupport (>= 3.0.0, < 5)
multi_json (~> 1.2)
@@ -316,6 +449,10 @@ GEM
rb-fsevent (0.9.6)
rb-inotify (0.9.5)
ffi (>= 0.5.0)
+ rbvmomi (1.8.2)
+ builder
+ nokogiri (>= 1.4.1)
+ trollop
rdoc (4.2.0)
json (~> 1.4)
ref (2.0.0)
@@ -430,6 +567,7 @@ GEM
thread_safe (0.3.5)
tilt (1.4.1)
timecop (0.7.3)
+ trollop (2.1.2)
turbolinks (2.5.3)
coffee-rails
tzinfo (1.2.2)
@@ -451,6 +589,7 @@ GEM
validate_url (1.0.2)
activemodel (>= 3.0.0)
addressable
+ vcr (3.0.1)
warden (1.2.3)
rack (>= 1.0)
web-console (2.2.1)
@@ -472,6 +611,7 @@ GEM
will_paginate (3.0.7)
will_paginate-bootstrap (1.0.1)
will_paginate (>= 3.0.3)
+ xml-simple (1.1.5)
xpath (2.0.0)
nokogiri (~> 1.3)
@@ -497,6 +637,8 @@ DEPENDENCIES
devise
draper
factory_girl
+ fog
+ fog-openstack
font-awesome-rails
guard
guard-livereload (~> 2.4)
@@ -542,6 +684,7 @@ DEPENDENCIES
turbolinks
uglifier (>= 1.3.0)
unicorn
+ vcr
web-console (~> 2.0)
webmock
will_paginate-bootstrap
diff --git a/app/assets/javascripts/application.js b/app/assets/javascripts/application.js
index 007634297..5ec3d6999 100644
--- a/app/assets/javascripts/application.js
+++ b/app/assets/javascripts/application.js
@@ -31,6 +31,7 @@
//= require bootstrap-wysihtml5/locales/fr-FR
+
$(document).on('page:load', scroll_to);
$(document).ready(scroll_to);
diff --git a/app/controllers/admin/accompagnateurs_controller.rb b/app/controllers/admin/accompagnateurs_controller.rb
new file mode 100644
index 000000000..584c80f68
--- /dev/null
+++ b/app/controllers/admin/accompagnateurs_controller.rb
@@ -0,0 +1,30 @@
+class Admin::AccompagnateursController < AdminController
+ include SmartListing::Helper::ControllerExtensions
+ helper SmartListing::Helper
+
+ before_action :retrieve_procedure
+
+ def show
+ assign_scope = @procedure.gestionnaires
+ @accompagnateurs_assign = smart_listing_create :accompagnateurs_assign,
+ assign_scope,
+ partial: "admin/accompagnateurs/list_assign",
+ array: true
+
+ not_assign_scope = current_administrateur.gestionnaires.where.not(id: assign_scope.ids)
+ not_assign_scope = not_assign_scope.where("email LIKE '%#{params[:filter]}%'") if params[:filter]
+
+ @accompagnateurs_not_assign = smart_listing_create :accompagnateurs_not_assign,
+ not_assign_scope,
+ partial: "admin/accompagnateurs/list_not_assign",
+ array: true
+
+ end
+
+ def update
+ AccompagnateurService.change_assignement! Gestionnaire.find(params[:accompagnateur_id]), Procedure.find(params[:procedure_id]), params[:to]
+
+ flash.notice = "Assignement effectué"
+ redirect_to admin_procedure_accompagnateurs_path, procedure_id: params[:procedure_id]
+ end
+end
\ No newline at end of file
diff --git a/app/controllers/admin/gestionnaires_controller.rb b/app/controllers/admin/gestionnaires_controller.rb
index 6d7f34cd5..651d22f38 100644
--- a/app/controllers/admin/gestionnaires_controller.rb
+++ b/app/controllers/admin/gestionnaires_controller.rb
@@ -4,37 +4,59 @@ class Admin::GestionnairesController < AdminController
def index
@gestionnaires = smart_listing_create :gestionnaires,
- current_administrateur.gestionnaires,
- partial: "admin/gestionnaires/list",
- array: true
+ current_administrateur.gestionnaires,
+ partial: "admin/gestionnaires/list",
+ array: true
@gestionnaire ||= Gestionnaire.new
end
def create
- @gestionnaire = Gestionnaire.create(create_gestionnaire_params)
+ @gestionnaire = Gestionnaire.find_by_email(params[:gestionnaire][:email])
- if @gestionnaire.errors.messages.empty?
- flash.notice = 'Gestionnaire ajouté'
- GestionnaireMailer.new_gestionnaire(@gestionnaire.email, @gestionnaire.password).deliver_now!
+ if @gestionnaire.nil?
+ new_gestionnaire!
else
- flash.alert = @gestionnaire.errors.full_messages.join('
').html_safe
+ assign_gestionnaire!
end
redirect_to admin_gestionnaires_path
end
-
def destroy
- Gestionnaire.find(params[:id]).destroy
+ Gestionnaire.find(params[:id]).administrateurs.delete current_administrateur
redirect_to admin_gestionnaires_path
end
def create_gestionnaire_params
params.require(:gestionnaire).permit(:email)
- .merge(administrateur_id: current_administrateur.id)
- .merge(password: SecureRandom.hex(5))
+ .merge(password: SecureRandom.hex(5))
+ .merge(administrateurs: [current_administrateur])
end
+ private
+
+ def new_gestionnaire!
+ @gestionnaire = Gestionnaire.create(create_gestionnaire_params)
+
+ if @gestionnaire.errors.messages.empty?
+ flash.notice = 'Accompagnateur ajouté'
+ GestionnaireMailer.new_gestionnaire(@gestionnaire.email, @gestionnaire.password).deliver_now!
+ GestionnaireMailer.new_assignement(@gestionnaire.email, current_administrateur.email).deliver_now!
+ else
+ flash.alert = @gestionnaire.errors.full_messages.join('
').html_safe
+ end
+ end
+
+ def assign_gestionnaire!
+ if current_administrateur.gestionnaires.include? @gestionnaire
+ flash.alert = 'Accompagnateur déjà ajouté'
+ else
+ GestionnaireMailer.new_assignement(@gestionnaire.email, current_administrateur.email).deliver_now!
+ @gestionnaire.administrateurs.push current_administrateur
+ flash.notice = 'Accompagnateur ajouté'
+ #TODO Mailer no assign_to
+ end
+ end
end
\ No newline at end of file
diff --git a/app/mailers/gestionnaire_mailer.rb b/app/mailers/gestionnaire_mailer.rb
index 86339a022..74765352b 100644
--- a/app/mailers/gestionnaire_mailer.rb
+++ b/app/mailers/gestionnaire_mailer.rb
@@ -4,15 +4,19 @@ class GestionnaireMailer < ApplicationMailer
send_mail email, password, "Vous avez été nommé accompagnateur sur la plateforme TPS"
end
+ def new_assignement email, email_admin
+ send_mail email, email_admin, "Vous avez été assigné à un nouvel administrateur sur la plateforme TPS"
+ end
+
private
- def vars_mailer email, password
- @password = password
+ def vars_mailer email, args
+ @args = args
@email = email
end
- def send_mail email, password, subject
- vars_mailer email, password
+ def send_mail email, args, subject
+ vars_mailer email, args
mail(from: "tps@apientreprise.fr", to: email,
subject: subject)
diff --git a/app/models/administrateur.rb b/app/models/administrateur.rb
index af04114c3..5cb4723bf 100644
--- a/app/models/administrateur.rb
+++ b/app/models/administrateur.rb
@@ -1,10 +1,8 @@
class Administrateur < ActiveRecord::Base
- # Include default devise modules. Others available are:
- # :confirmable, :lockable, :timeoutable and :omniauthable
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable
- has_many :gestionnaires
+ has_and_belongs_to_many :gestionnaires
has_many :procedures
before_save :ensure_api_token
diff --git a/app/models/assign_to.rb b/app/models/assign_to.rb
new file mode 100644
index 000000000..64e2f5e30
--- /dev/null
+++ b/app/models/assign_to.rb
@@ -0,0 +1,4 @@
+class AssignTo < ActiveRecord::Base
+ belongs_to :procedure
+ belongs_to :gestionnaire
+end
\ No newline at end of file
diff --git a/app/models/cerfa.rb b/app/models/cerfa.rb
index 7dc020acb..40fdd8cdf 100644
--- a/app/models/cerfa.rb
+++ b/app/models/cerfa.rb
@@ -11,7 +11,11 @@ class Cerfa < ActiveRecord::Base
def content_url
unless content.url.nil?
- (Downloader.new content, 'CERFA').url
+ if Features.remote_storage
+ (RemoteDownloader.new content.filename).url
+ else
+ (LocalDownloader.new content.path, 'CERFA').url
+ end
end
end
end
\ No newline at end of file
diff --git a/app/models/dossier.rb b/app/models/dossier.rb
index 6bb913e25..900b71fcb 100644
--- a/app/models/dossier.rb
+++ b/app/models/dossier.rb
@@ -190,7 +190,7 @@ class Dossier < ActiveRecord::Base
def as_csv(options={})
dossier_attr = DossierSerializer.new(self).attributes
- etablissement_attr = EtablissementSerializer.new(self.etablissement).attributes.map {|k, v| ["etablissement.#{k}", v] }.to_h
+ etablissement_attr = EtablissementCsvSerializer.new(self.etablissement).attributes.map {|k, v| ["etablissement.#{k}", v] }.to_h
entreprise_attr = EntrepriseSerializer.new(self.entreprise).attributes.map {|k, v| ["entreprise.#{k}", v] }.to_h
dossier_attr.merge(etablissement_attr).merge(entreprise_attr)
end
diff --git a/app/models/gestionnaire.rb b/app/models/gestionnaire.rb
index 49e3249f6..94ee10e21 100644
--- a/app/models/gestionnaire.rb
+++ b/app/models/gestionnaire.rb
@@ -1,12 +1,11 @@
class Gestionnaire < ActiveRecord::Base
- # Include default devise modules. Others available are:
- # :confirmable, :lockable, :timeoutable and :omniauthable
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable
- belongs_to :administrateur
+ has_and_belongs_to_many :administrateurs
- has_many :procedures, through: :administrateur
+ has_many :assign_to
+ has_many :procedures, through: :assign_to
has_many :dossiers, through: :procedures
def dossiers_filter
diff --git a/app/models/piece_justificative.rb b/app/models/piece_justificative.rb
index 3b29561ba..7bb2cdb34 100644
--- a/app/models/piece_justificative.rb
+++ b/app/models/piece_justificative.rb
@@ -19,8 +19,12 @@ class PieceJustificative < ActiveRecord::Base
def content_url
unless content.url.nil?
- (Downloader.new content,
- (type_de_piece_justificative.nil? ? content.file.original_filename : type_de_piece_justificative.libelle)).url
+ if Features.remote_storage
+ (RemoteDownloader.new content.filename).url
+ else
+ (LocalDownloader.new content.path,
+ (type_de_piece_justificative.nil? ? content.original_filename : type_de_piece_justificative.libelle)).url
+ end
end
end
diff --git a/app/models/procedure.rb b/app/models/procedure.rb
index 1e6cac78f..8f3fa1eef 100644
--- a/app/models/procedure.rb
+++ b/app/models/procedure.rb
@@ -7,6 +7,9 @@ class Procedure < ActiveRecord::Base
belongs_to :administrateur
+ has_many :assign_to
+ has_many :gestionnaires, through: :assign_to
+
delegate :use_api_carto, to: :module_api_carto
accepts_nested_attributes_for :types_de_champ,:reject_if => proc { |attributes| attributes['libelle'].blank? }, :allow_destroy => true
diff --git a/app/models/siret.rb b/app/models/siret.rb
index de274b5a1..8196a223d 100644
--- a/app/models/siret.rb
+++ b/app/models/siret.rb
@@ -1,7 +1,15 @@
class Siret
include ActiveModel::Model
+ include ActiveModel::Validations::Callbacks
+
attr_accessor :siret
validates_presence_of :siret
validates :siret, siret_format: true
+
+ before_validation :remove_whitespace
+
+ def remove_whitespace
+ siret.delete!(' ') unless siret.nil?
+ end
end
diff --git a/app/serializers/etablissement_csv_serializer.rb b/app/serializers/etablissement_csv_serializer.rb
new file mode 100644
index 000000000..ec33919bd
--- /dev/null
+++ b/app/serializers/etablissement_csv_serializer.rb
@@ -0,0 +1,5 @@
+class EtablissementCsvSerializer < EtablissementSerializer
+ def adresse
+ object.adresse.chomp.gsub("\r\n", ' ').gsub("\r", '')
+ end
+end
\ No newline at end of file
diff --git a/app/serializers/etablissement_serializer.rb b/app/serializers/etablissement_serializer.rb
index 30a66065e..b0bcd0c19 100644
--- a/app/serializers/etablissement_serializer.rb
+++ b/app/serializers/etablissement_serializer.rb
@@ -11,4 +11,5 @@ class EtablissementSerializer < ActiveModel::Serializer
:code_postal,
:localite,
:code_insee_localite
+
end
\ No newline at end of file
diff --git a/app/services/accompagnateur_service.rb b/app/services/accompagnateur_service.rb
new file mode 100644
index 000000000..119560418
--- /dev/null
+++ b/app/services/accompagnateur_service.rb
@@ -0,0 +1,12 @@
+class AccompagnateurService
+ ASSIGN = 'assign'
+ NOT_ASSIGN = 'not_assign'
+
+ def self.change_assignement! accompagnateur, procedure, to
+ if to == ASSIGN
+ AssignTo.create(gestionnaire: accompagnateur, procedure: procedure)
+ elsif to == NOT_ASSIGN
+ AssignTo.delete_all(gestionnaire: accompagnateur, procedure: procedure)
+ end
+ end
+end
\ No newline at end of file
diff --git a/app/uploaders/cerfa_uploader.rb b/app/uploaders/cerfa_uploader.rb
index a0fe6b7d5..c69dcbac8 100644
--- a/app/uploaders/cerfa_uploader.rb
+++ b/app/uploaders/cerfa_uploader.rb
@@ -1,40 +1,26 @@
# encoding: utf-8
class CerfaUploader < CarrierWave::Uploader::Base
+ before :cache, :set_original_filename
- # Include RMagick or MiniMagick support:
- # include CarrierWave::RMagick
- # include CarrierWave::MiniMagick
-
- # Choose what kind of storage to use for this uploader:
- storage :file
- # storage :fog
+# Choose what kind of storage to use for this uploader:
+ if Features.remote_storage
+ storage :fog
+ else
+ storage :file
+ end
# Override the directory where uploaded files will be stored.
# This is a sensible default for uploaders that are meant to be mounted:
def store_dir
- "../uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
+ unless Features.remote_storage
+ "./uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
+ end
end
- # Provide a default URL as a default if there hasn't been a file uploaded:
- # def default_url
- # # For Rails 3.1+ asset pipeline compatibility:
- # # ActionController::Base.helpers.asset_path("fallback/" + [version_name, "default.png"].compact.join('_'))
- #
- # "/images/fallback/" + [version_name, "default.png"].compact.join('_')
- # end
-
- # Process files as they are uploaded:
- # process :scale => [200, 300]
- #
- # def scale(width, height)
- # # do something
- # end
-
- # Create different versions of your uploaded files:
- # version :thumb do
- # process :resize_to_fit => [50, 50]
- # end
+ def cache_dir
+ '/tmp/tps-cache'
+ end
# Add a white list of extensions which are allowed to be uploaded.
# For images you might use something like this:
@@ -42,10 +28,28 @@ class CerfaUploader < CarrierWave::Uploader::Base
%w(pdf doc docx xls xlsx ppt pptx odt ods odp)
end
- # Override the filename of the uploaded files:
- # Avoid using model.id or version_name here, see uploader/store.rb for details.
- # def filename
- # "something.jpg" if original_filename
- # end
+ def filename
+ if original_filename.present? || model.content_secure_token
+ if Features.remote_storage
+ filename = "#{model.class.to_s.underscore}-#{secure_token}.#{file.extension.downcase}"
+ else
+ filename = "#{model.class.to_s.underscore}.#{file.extension.downcase}"
+ end
+ end
+ filename
+ end
+ private
+
+ def secure_token
+ model.content_secure_token ||= generate_secure_token
+ end
+
+ def generate_secure_token
+ SecureRandom.uuid
+ end
+
+ def set_original_filename(file)
+ model.original_filename ||= file.original_filename if file.respond_to?(:original_filename)
+ end
end
diff --git a/app/uploaders/downloader.rb b/app/uploaders/local_downloader.rb
similarity index 97%
rename from app/uploaders/downloader.rb
rename to app/uploaders/local_downloader.rb
index c6e5da35a..d83fab129 100644
--- a/app/uploaders/downloader.rb
+++ b/app/uploaders/local_downloader.rb
@@ -1,6 +1,6 @@
require 'securerandom'
-class Downloader
+class LocalDownloader
BASE_PATH_DISK = File.join(Rails.root, "public/downloads/")
def initialize(filename, filename_suffix = '')
diff --git a/app/uploaders/piece_justificative_uploader.rb b/app/uploaders/piece_justificative_uploader.rb
index 76a1269e4..ce446eb0a 100644
--- a/app/uploaders/piece_justificative_uploader.rb
+++ b/app/uploaders/piece_justificative_uploader.rb
@@ -1,40 +1,26 @@
# encoding: utf-8
class PieceJustificativeUploader < CarrierWave::Uploader::Base
-
- # Include RMagick or MiniMagick support:
- # include CarrierWave::RMagick
- # include CarrierWave::MiniMagick
+ before :cache, :set_original_filename
# Choose what kind of storage to use for this uploader:
- storage :file
- # storage :fog
+ if Features.remote_storage
+ storage :fog
+ else
+ storage :file
+ end
# Override the directory where uploaded files will be stored.
# This is a sensible default for uploaders that are meant to be mounted:
def store_dir
- "../uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
+ unless Features.remote_storage
+ "./uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
+ end
end
- # Provide a default URL as a default if there hasn't been a file uploaded:
- # def default_url
- # # For Rails 3.1+ asset pipeline compatibility:
- # # ActionController::Base.helpers.asset_path("fallback/" + [version_name, "default.png"].compact.join('_'))
- #
- # "/images/fallback/" + [version_name, "default.png"].compact.join('_')
- # end
-
- # Process files as they are uploaded:
- # process :scale => [200, 300]
- #
- # def scale(width, height)
- # # do something
- # end
-
- # Create different versions of your uploaded files:
- # version :thumb do
- # process :resize_to_fit => [50, 50]
- # end
+ def cache_dir
+ '/tmp/tps-cache'
+ end
# Add a white list of extensions which are allowed to be uploaded.
# For images you might use something like this:
@@ -42,10 +28,32 @@ class PieceJustificativeUploader < CarrierWave::Uploader::Base
%w(pdf doc docx xls xlsx ppt pptx odt ods odp)
end
- # Override the filename of the uploaded files:
- # Avoid using model.id or version_name here, see uploader/store.rb for details.
- # def filename
- # "something.jpg" if original_filename
- # end
+ def filename
+ if original_filename.present? || model.content_secure_token
+ if Features.remote_storage
+ filename = "#{model.class.to_s.underscore}-#{secure_token}.#{file.extension.downcase}"
+ else original_filename
+ filename = "#{model.class.to_s.underscore}.#{file.extension.downcase}"
+ end
+ end
+ filename
+ end
+ def original_filename
+ model.original_filename
+ end
+
+ private
+
+ def secure_token
+ model.content_secure_token ||= generate_secure_token
+ end
+
+ def generate_secure_token
+ SecureRandom.uuid
+ end
+
+ def set_original_filename(file)
+ model.original_filename ||= file.original_filename if file.respond_to?(:original_filename)
+ end
end
diff --git a/app/uploaders/procedure_logo_uploader.rb b/app/uploaders/procedure_logo_uploader.rb
index 70787d524..1199b32fa 100644
--- a/app/uploaders/procedure_logo_uploader.rb
+++ b/app/uploaders/procedure_logo_uploader.rb
@@ -2,39 +2,28 @@
class ProcedureLogoUploader < CarrierWave::Uploader::Base
- # Include RMagick or MiniMagick support:
- # include CarrierWave::RMagick
- # include CarrierWave::MiniMagick
+ def root
+ File.join(Rails.root, "public")
+ end
# Choose what kind of storage to use for this uploader:
- storage :file
- # storage :fog
+ if Features.remote_storage
+ storage :fog
+ else
+ storage :file
+ end
# Override the directory where uploaded files will be stored.
# This is a sensible default for uploaders that are meant to be mounted:
def store_dir
- "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
+ unless Features.remote_storage
+ "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
+ end
end
- # Provide a default URL as a default if there hasn't been a file uploaded:
- # def default_url
- # # For Rails 3.1+ asset pipeline compatibility:
- # # ActionController::Base.helpers.asset_path("fallback/" + [version_name, "default.png"].compact.join('_'))
- #
- # "/images/fallback/" + [version_name, "default.png"].compact.join('_')
- # end
-
- # Process files as they are uploaded:
- # process :scale => [200, 300]
- #
- # def scale(width, height)
- # # do something
- # end
-
- # Create different versions of your uploaded files:
- # version :thumb do
- # process :resize_to_fit => [50, 50]
- # end
+ def cache_dir
+ '/tmp/tps-cache'
+ end
# Add a white list of extensions which are allowed to be uploaded.
# For images you might use something like this:
@@ -42,10 +31,25 @@ class ProcedureLogoUploader < CarrierWave::Uploader::Base
%w(jpg jpeg png)
end
- # Override the filename of the uploaded files:
- # Avoid using model.id or version_name here, see uploader/store.rb for details.
- # def filename
- # "something.jpg" if original_filename
- # end
+ def filename
+ if original_filename.present? || model.logo_secure_token
+ if Features.remote_storage
+ filename = "#{model.class.to_s.underscore}-#{secure_token}.#{file.extension.downcase}"
+ else
+ filename = "logo.#{file.extension.downcase}"
+ end
+ end
+ filename
+ end
+
+ private
+
+ def secure_token
+ model.logo_secure_token ||= generate_secure_token
+ end
+
+ def generate_secure_token
+ SecureRandom.uuid
+ end
end
diff --git a/app/uploaders/remote_downloader.rb b/app/uploaders/remote_downloader.rb
new file mode 100644
index 000000000..987971f86
--- /dev/null
+++ b/app/uploaders/remote_downloader.rb
@@ -0,0 +1,11 @@
+class RemoteDownloader
+ DEST_URL = "https://storage.apientreprise.fr/" + CarrierWave::Uploader::Base.fog_directory + '/'
+
+ def initialize(filename)
+ @filename = filename
+ end
+
+ def url
+ @url ||= File.join(DEST_URL, @filename)
+ end
+end
diff --git a/app/views/admin/accompagnateurs/_list_assign.html.haml b/app/views/admin/accompagnateurs/_list_assign.html.haml
new file mode 100644
index 000000000..e83b58d21
--- /dev/null
+++ b/app/views/admin/accompagnateurs/_list_assign.html.haml
@@ -0,0 +1,20 @@
+.row{style:'height: 34px'}
+
+- unless smart_listing.empty?
+ %table.table#liste_gestionnaire
+ %thead
+ %th Enlever
+ %th#email{style:'text-align: right'} Email
+
+ - @accompagnateurs_assign.each do |accompagnateur|
+ %tr
+ %td.col-md-1.col-lg-1.center
+ %a.btn.btn-primary{href: "#{admin_procedure_accompagnateurs_path(procedure_id: @procedure.id, accompagnateur_id: accompagnateur.id, to: AccompagnateurService::NOT_ASSIGN)}", 'data-method' => 'put'}
+ .fa.fa-arrow-left
+ %td{style:'padding-top: 11px; font-size:15px; text-align:right'}= accompagnateur.email
+
+ = smart_listing.paginate
+ = smart_listing.pagination_per_page_links
+- else
+ %h4.center
+ Aucun d'affecté
diff --git a/app/views/admin/accompagnateurs/_list_not_assign.html.haml b/app/views/admin/accompagnateurs/_list_not_assign.html.haml
new file mode 100644
index 000000000..8d036f9ae
--- /dev/null
+++ b/app/views/admin/accompagnateurs/_list_not_assign.html.haml
@@ -0,0 +1,27 @@
+= smart_listing_controls_for(:accompagnateurs_not_assign, {class: "form-inline text-right"}) do
+ .form-group.filter.input-append
+ = text_field_tag :filter, '', class: "search form-control",
+ placeholder: "Recherche...", autocomplete: :off
+ %button.btn.btn-primary{type: :submit}
+ %span.glyphicon.glyphicon-search
+
+- unless smart_listing.empty?
+
+ %table.table#liste_gestionnaire
+ %thead
+ %th#email Email
+ %th Ajouter
+
+ - @accompagnateurs_not_assign.each do |accompagnateur|
+ %tr
+ %td.col-md-11.col-lg-11{style:'padding-top: 11px; font-size:15px'}= accompagnateur.email
+ %td.center
+ %a.btn.btn-success{href: "#{admin_procedure_accompagnateurs_path(procedure_id: @procedure.id, accompagnateur_id: accompagnateur.id, to: AccompagnateurService::ASSIGN)}", 'data-method' => 'put'}
+ .fa.fa-arrow-right
+
+
+ = smart_listing.paginate
+ = smart_listing.pagination_per_page_links
+- else
+ %h4.center
+ Aucun de disponible
diff --git a/app/views/admin/accompagnateurs/show.html.haml b/app/views/admin/accompagnateurs/show.html.haml
new file mode 100644
index 000000000..1c82ecc96
--- /dev/null
+++ b/app/views/admin/accompagnateurs/show.html.haml
@@ -0,0 +1,19 @@
+%h2.text-info
+ =@procedure.libelle
+%br
+
+%ul.nav.nav-tabs
+ = render partial: 'admin/procedures/navbar', locals: {active: 'Accompagnateurs'}
+
+#accompagnateur_form
+ .row
+ .col-md-6.col-lg-6
+ %h3.text-info Disponibles
+ = smart_listing_render :accompagnateurs_not_assign
+
+ .col-md-6.col-lg-6
+ %h3.text-success Affectés
+
+ = smart_listing_render :accompagnateurs_assign
+
+
diff --git a/app/views/admin/accompagnateurs/show.js.erb b/app/views/admin/accompagnateurs/show.js.erb
new file mode 100644
index 000000000..197a811b4
--- /dev/null
+++ b/app/views/admin/accompagnateurs/show.js.erb
@@ -0,0 +1,3 @@
+<%= smart_listing_update :accompagnateurs_not_assign %>
+
+<%= smart_listing_update :accompagnateurs_assign %>
diff --git a/app/views/admin/pieces_justificatives/show.html.haml b/app/views/admin/pieces_justificatives/show.html.haml
index 079c6289d..6fdc68a99 100644
--- a/app/views/admin/pieces_justificatives/show.html.haml
+++ b/app/views/admin/pieces_justificatives/show.html.haml
@@ -3,14 +3,7 @@
%br
%ul.nav.nav-tabs
- %li
- = link_to('Informations', admin_procedure_path(@procedure))
- %li
- = link_to('Description', edit_admin_procedure_path(@procedure))
- %li
- = link_to('Champs', admin_procedure_types_de_champ_path(@procedure))
- %li.active
- = link_to('Pièces justificatives', admin_procedure_pieces_justificatives_path(@procedure))
+ = render partial: 'admin/procedures/navbar', locals: {active: 'Pieces'}
#piece_justificative_form
= render 'form'
\ No newline at end of file
diff --git a/app/views/admin/procedures/_navbar.html.haml b/app/views/admin/procedures/_navbar.html.haml
new file mode 100644
index 000000000..10bbe3d66
--- /dev/null
+++ b/app/views/admin/procedures/_navbar.html.haml
@@ -0,0 +1,17 @@
+%li{ class: ('active' if active == 'Informations') }
+ = link_to('Informations', admin_procedure_path(@procedure))
+
+%li{ class: ('active' if active == 'Accompagnateurs') }
+ = link_to('Accompagnateurs', admin_procedure_accompagnateurs_path(@procedure))
+
+%li{ class: ('disabled' if @procedure.locked?) || ('active' if active == 'Description') }
+ = link_to_unless(@procedure.locked?, 'Description', edit_admin_procedure_path(@procedure)) do
+ = link_to('Description', '#')
+
+%li{ class: ('disabled' if @procedure.locked?) || ('active' if active == 'Champs') }
+ = link_to_unless(@procedure.locked?, 'Champs', admin_procedure_types_de_champ_path(@procedure)) do
+ = link_to('Champs', '#')
+
+%li{ class: ('disabled' if @procedure.locked?) || ('active' if active == 'Pieces') }
+ = link_to_unless(@procedure.locked?, 'Pièces justificatives', admin_procedure_pieces_justificatives_path(@procedure)) do
+ = link_to('Pièces justificatives', '#')
\ No newline at end of file
diff --git a/app/views/admin/procedures/edit.html.haml b/app/views/admin/procedures/edit.html.haml
index 9d3dd28e7..cc799d336 100644
--- a/app/views/admin/procedures/edit.html.haml
+++ b/app/views/admin/procedures/edit.html.haml
@@ -3,14 +3,7 @@
%br
%ul.nav.nav-tabs
- %li
- = link_to('Informations', admin_procedure_path(@procedure))
- %li.active
- = link_to('Description', edit_admin_procedure_path(@procedure))
- %li
- = link_to('Champs', admin_procedure_types_de_champ_path(@procedure))
- %li
- = link_to('Pièces justificatives', admin_procedure_pieces_justificatives_path(@procedure))
+ = render partial: 'navbar', locals: {active: 'Description'}
#procedure_new.section.section-label
= form_for @procedure, url: url_for({controller: 'admin/procedures', action: :update, id: @procedure.id}), multipart: true do |f|
diff --git a/app/views/admin/procedures/show.html.haml b/app/views/admin/procedures/show.html.haml
index 3dc75cd8a..efb1d9e10 100644
--- a/app/views/admin/procedures/show.html.haml
+++ b/app/views/admin/procedures/show.html.haml
@@ -4,21 +4,7 @@
%br
%ul.nav.nav-tabs
- %li.active
- = link_to('Informations', admin_procedure_path(@facade.procedure))
-
- %li{ class: ('disabled' if @facade.procedure.locked?) }
- = link_to_unless(@facade.procedure.locked?, 'Description', edit_admin_procedure_path(@facade.procedure)) do
- = link_to('Description', '#')
-
- %li{ class: ('disabled' if @facade.procedure.locked?) }
- = link_to_unless(@facade.procedure.locked?, 'Champs', admin_procedure_types_de_champ_path(@facade.procedure)) do
- = link_to('Champs', '#')
-
- %li{ class: ('disabled' if @facade.procedure.locked?) }
- = link_to_unless(@facade.procedure.locked?, 'Pièces justificatives', admin_procedure_pieces_justificatives_path(@facade.procedure)) do
- = link_to('Pièces justificatives', '#')
-
+ = render partial: 'navbar', locals: {active: 'Informations'}
%li{style:'float:right'}
= form_tag admin_procedure_archive_path(procedure_id: @facade.procedure.id, archive: !@facade.procedure.archived?), method: :put do
diff --git a/app/views/admin/types_de_champ/show.html.haml b/app/views/admin/types_de_champ/show.html.haml
index afe5a07de..a89627788 100644
--- a/app/views/admin/types_de_champ/show.html.haml
+++ b/app/views/admin/types_de_champ/show.html.haml
@@ -3,14 +3,7 @@
%br
%ul.nav.nav-tabs
- %li
- = link_to('Informations', admin_procedure_path(@procedure))
- %li
- = link_to('Description', edit_admin_procedure_path(@procedure))
- %li.active
- = link_to('Champs', admin_procedure_types_de_champ_path(@procedure))
- %li
- = link_to('Pièces justificatives', admin_procedure_pieces_justificatives_path(@procedure))
+ = render partial: 'admin/procedures/navbar', locals: {active: 'Champs'}
#liste_champ
= render partial: 'form'
\ No newline at end of file
diff --git a/app/views/administrateurs/_login_banner.html.haml b/app/views/administrateurs/_login_banner.html.haml
index 6b38f4867..0d6c464da 100644
--- a/app/views/administrateurs/_login_banner.html.haml
+++ b/app/views/administrateurs/_login_banner.html.haml
@@ -13,7 +13,7 @@
%li
= link_to(admin_gestionnaires_path) do
%i.fa.fa-user
- Gestionnaires
+ Accompagnateur
%li.divider{ role: :separator}
%li
= link_to(admin_profile_path, id: :profile) do
diff --git a/app/views/gestionnaire_mailer/new_assignement.text.erb b/app/views/gestionnaire_mailer/new_assignement.text.erb
new file mode 100644
index 000000000..b4bfa57e4
--- /dev/null
+++ b/app/views/gestionnaire_mailer/new_assignement.text.erb
@@ -0,0 +1,11 @@
+Bienvenue sur la plateforme TPS
+
+Vous venez d'être assigné à un administrateur sur la plateforme TPS. Voici quelques informations utiles :
+
+ URL : https://tps.apientreprise.fr/gestionnaires/sign_in
+ Email administrateur : <%= @args %>
+
+Bonne journée,
+
+---
+L'équipe TPS - tps@apientreprise.fr
\ No newline at end of file
diff --git a/app/views/gestionnaire_mailer/new_gestionnaire.text.erb b/app/views/gestionnaire_mailer/new_gestionnaire.text.erb
index 29ea6fd04..c68a7ae98 100644
--- a/app/views/gestionnaire_mailer/new_gestionnaire.text.erb
+++ b/app/views/gestionnaire_mailer/new_gestionnaire.text.erb
@@ -2,9 +2,9 @@ Bienvenue sur la plateforme TPS
Vous venez d'être nommé accompagnateur sur la plateforme TPS. Pour mémoire, voici quelques informations utiles :
- URL : https://tps.apientreprise.fr/gestionnaires/sign_in
+ URL : <%= new_gestionnaire_session_url %>
Login : <%= @email %>
- Mot de passe : <%= @password %>
+ Mot de passe : <%= @args %>
Bonne journée,
diff --git a/app/views/users/recapitulatif/_commentaires_flux.html.haml b/app/views/users/recapitulatif/_commentaires_flux.html.haml
index f666e066d..ef9404be1 100644
--- a/app/views/users/recapitulatif/_commentaires_flux.html.haml
+++ b/app/views/users/recapitulatif/_commentaires_flux.html.haml
@@ -16,7 +16,7 @@
\-
%span#piece_justificative
%b
- = link_to com.piece_justificative.content.file.original_filename, com.piece_justificative.content_url, style:'color: green', target: '_blank'
+ = link_to com.piece_justificative.original_filename, com.piece_justificative.content_url, style:'color: green', target: '_blank'
%br
.description#body
diff --git a/config/initializers/carrierwave.rb b/config/initializers/carrierwave.rb
new file mode 100644
index 000000000..35813733a
--- /dev/null
+++ b/config/initializers/carrierwave.rb
@@ -0,0 +1,32 @@
+require_relative 'features'
+
+if Rails.env.test?
+ Fog.credentials_path = Rails.root.join('config/fog_credentials.test.yml')
+else
+ Fog.credentials_path = Rails.root.join('config/fog_credentials.yml')
+end
+
+CarrierWave.configure do |config|
+ # These permissions will make dir and files available only to the user running
+ # the servers
+ config.permissions = 0664
+ config.directory_permissions = 0775
+
+ if Features.remote_storage and not Rails.env.test?
+ config.fog_credentials = { provider: 'OpenStack' }
+ end
+
+ # This avoids uploaded files from saving to public/ and so
+ # they will not be available for public (non-authenticated) downloading
+ config.root = Rails.root
+
+ config.cache_dir = "#{Rails.root}/uploads"
+
+ config.fog_public = true
+
+ if Rails.env.production?
+ config.fog_directory = "tps"
+ else
+ config.fog_directory = "tps_dev"
+ end
+end
diff --git a/config/initializers/features.rb b/config/initializers/features.rb
new file mode 100644
index 000000000..286132103
--- /dev/null
+++ b/config/initializers/features.rb
@@ -0,0 +1,26 @@
+require 'yaml'
+# this class manage features
+# Features must be added in file config/initializers/features.yml :
+# feature_name: true
+# other_feature: false
+#
+# this file is templated by ansible for staging and production so don't forget to add your features in
+# ansible config
+class Features
+ class << self
+ if File.exist?(File.dirname(__FILE__) + '/features.yml')
+ features_map = YAML.load_file(File.dirname(__FILE__) + '/features.yml')
+ if features_map
+ features_map.each do |feature, is_active|
+ define_method("#{feature}") do
+ is_active
+ end
+ end
+ end
+
+ def method_missing(method, *args)
+ false
+ end
+ end
+ end
+end
diff --git a/config/initializers/features.yml b/config/initializers/features.yml
new file mode 100644
index 000000000..e91fb5346
--- /dev/null
+++ b/config/initializers/features.yml
@@ -0,0 +1 @@
+remote_storage: false
diff --git a/config/initializers/inflections.rb b/config/initializers/inflections.rb
index 08b296997..1e5e84144 100644
--- a/config/initializers/inflections.rb
+++ b/config/initializers/inflections.rb
@@ -13,6 +13,7 @@ ActiveSupport::Inflector.inflections(:en) do |inflect|
inflect.irregular 'piece_justificative', 'pieces_justificatives'
inflect.irregular 'type_de_piece_justificative', 'types_de_piece_justificative'
inflect.irregular 'type_de_champ', 'types_de_champ'
+ inflect.irregular 'assign_to', 'assign_tos'
end
# These inflection rules are supported but not enabled by default:
diff --git a/config/routes.rb b/config/routes.rb
index 5da3ac7ac..06c348e58 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -80,6 +80,7 @@ Rails.application.routes.draw do
get 'sign_in' => '/administrateurs/sessions#new'
get 'procedures/archived' => 'procedures#archived'
get 'profile' => 'profile#show', as: :profile
+
resources :procedures do
resource :types_de_champ, only: [:show, :update] do
post '/:index/move_up' => 'types_de_champ#move_up', as: :move_up
@@ -88,10 +89,18 @@ Rails.application.routes.draw do
put 'archive' => 'procedures#archive', as: :archive
+ resource :accompagnateurs, only: [:show, :update]
+
+
resources :types_de_champ, only: [:destroy]
resource :pieces_justificatives, only: [:show, :update]
resources :pieces_justificatives, only: :destroy
end
+
+ namespace :accompagnateurs do
+ get 'show' #delete after fixed tests admin/accompagnateurs/show_spec without this line
+ end
+
resources :gestionnaires, only: [:index, :create, :destroy]
end
diff --git a/db/migrate/20160512160602_add_original_filename_to_pieces_justificatives.rb b/db/migrate/20160512160602_add_original_filename_to_pieces_justificatives.rb
new file mode 100644
index 000000000..49b136ba3
--- /dev/null
+++ b/db/migrate/20160512160602_add_original_filename_to_pieces_justificatives.rb
@@ -0,0 +1,5 @@
+class AddOriginalFilenameToPiecesJustificatives < ActiveRecord::Migration
+ def change
+ add_column :pieces_justificatives, :original_filename, :string
+ end
+end
diff --git a/db/migrate/20160512160658_add_original_filename_to_cerfas.rb b/db/migrate/20160512160658_add_original_filename_to_cerfas.rb
new file mode 100644
index 000000000..e12e86f52
--- /dev/null
+++ b/db/migrate/20160512160658_add_original_filename_to_cerfas.rb
@@ -0,0 +1,5 @@
+class AddOriginalFilenameToCerfas < ActiveRecord::Migration
+ def change
+ add_column :cerfas, :original_filename, :string
+ end
+end
diff --git a/db/migrate/20160512160824_add_content_secure_token_to_cerfas.rb b/db/migrate/20160512160824_add_content_secure_token_to_cerfas.rb
new file mode 100644
index 000000000..1453eded5
--- /dev/null
+++ b/db/migrate/20160512160824_add_content_secure_token_to_cerfas.rb
@@ -0,0 +1,5 @@
+class AddContentSecureTokenToCerfas < ActiveRecord::Migration
+ def change
+ add_column :cerfas, :content_secure_token, :string
+ end
+end
diff --git a/db/migrate/20160512160836_add_content_secure_token_to_pieces_justificatives.rb b/db/migrate/20160512160836_add_content_secure_token_to_pieces_justificatives.rb
new file mode 100644
index 000000000..1b256c74b
--- /dev/null
+++ b/db/migrate/20160512160836_add_content_secure_token_to_pieces_justificatives.rb
@@ -0,0 +1,5 @@
+class AddContentSecureTokenToPiecesJustificatives < ActiveRecord::Migration
+ def change
+ add_column :pieces_justificatives, :content_secure_token, :string
+ end
+end
diff --git a/db/migrate/20160513093425_add_logo_secure_token_to_procedures.rb b/db/migrate/20160513093425_add_logo_secure_token_to_procedures.rb
new file mode 100644
index 000000000..359771b96
--- /dev/null
+++ b/db/migrate/20160513093425_add_logo_secure_token_to_procedures.rb
@@ -0,0 +1,5 @@
+class AddLogoSecureTokenToProcedures < ActiveRecord::Migration
+ def change
+ add_column :procedures, :logo_secure_token, :string
+ end
+end
diff --git a/db/migrate/20160519100904_admin_has_and_belong_gestionnaire.rb b/db/migrate/20160519100904_admin_has_and_belong_gestionnaire.rb
new file mode 100644
index 000000000..9eb2bc05b
--- /dev/null
+++ b/db/migrate/20160519100904_admin_has_and_belong_gestionnaire.rb
@@ -0,0 +1,32 @@
+class AdminHasAndBelongGestionnaire < ActiveRecord::Migration
+ class Gestionnaire < ActiveRecord::Base
+ end
+
+ class AdministrateursGestionnaire < ActiveRecord::Base
+ end
+
+ def up
+ create_table :administrateurs_gestionnaires, id: false do |t|
+ t.belongs_to :administrateur, index: true
+ t.belongs_to :gestionnaire, index: true
+ end
+
+ Gestionnaire.all.each do |gestionnaire|
+ execute "insert into administrateurs_gestionnaires (gestionnaire_id, administrateur_id) values (#{gestionnaire.id}, #{gestionnaire.administrateur_id}) "
+ end
+
+ remove_column :gestionnaires, :administrateur_id
+ end
+
+ def down
+ add_column :gestionnaires, :administrateur_id, :integer
+
+ AdministrateursGestionnaire.all.each do |ag|
+ gestionnaire = Gestionnaire.find(ag.gestionnaire_id)
+ gestionnaire.administrateur_id = ag.administrateur_id
+ gestionnaire.save
+ end
+
+ drop_table :administrateurs_gestionnaires
+ end
+end
diff --git a/db/migrate/20160519101018_gestionnaire_is_assign_to_procedure.rb b/db/migrate/20160519101018_gestionnaire_is_assign_to_procedure.rb
new file mode 100644
index 000000000..120245803
--- /dev/null
+++ b/db/migrate/20160519101018_gestionnaire_is_assign_to_procedure.rb
@@ -0,0 +1,36 @@
+class GestionnaireIsAssignToProcedure < ActiveRecord::Migration
+ class AssignTo < ActiveRecord::Base
+ belongs_to :gestionnaire
+ belongs_to :procedure
+ end
+
+ class Gestionnaire < ActiveRecord::Base
+ has_and_belongs_to_many :administrateurs
+ has_many :procedures, through: :assign_to
+ end
+
+ class Administrateur < ActiveRecord::Base
+ has_and_belongs_to_many :gestionnaires
+ has_many :procedures
+ end
+
+ class Procedure < ActiveRecord::Base
+ belongs_to :administrateur
+ has_many :gestionnaires, through: :assign_to
+ end
+
+ def change
+ create_table :assign_tos, id: false do |t|
+ t.belongs_to :gestionnaire, index: true
+ t.belongs_to :procedure, index: true
+ end
+
+ Administrateur.all.each do |administrateur|
+ administrateur.gestionnaires.each do |gestionnaire|
+ administrateur.procedures.each do |procedure|
+ AssignTo.create gestionnaire: gestionnaire, procedure: procedure
+ end
+ end
+ end
+ end
+end
diff --git a/db/migrate/20160523163054_add_foreign_key_admnistrateur_gestionnaire.rb b/db/migrate/20160523163054_add_foreign_key_admnistrateur_gestionnaire.rb
new file mode 100644
index 000000000..61bbb4424
--- /dev/null
+++ b/db/migrate/20160523163054_add_foreign_key_admnistrateur_gestionnaire.rb
@@ -0,0 +1,5 @@
+class AddForeignKeyAdmnistrateurGestionnaire < ActiveRecord::Migration
+ def change
+ add_index :administrateurs_gestionnaires, [:gestionnaire_id, :administrateur_id], unique: true, name: 'unique_couple_administrateur_gestionnaire'
+ end
+end
diff --git a/db/migrate/20160524093540_set_original_filename_for_uploaders.rb b/db/migrate/20160524093540_set_original_filename_for_uploaders.rb
new file mode 100644
index 000000000..d9d6306c6
--- /dev/null
+++ b/db/migrate/20160524093540_set_original_filename_for_uploaders.rb
@@ -0,0 +1,25 @@
+class SetOriginalFilenameForUploaders < ActiveRecord::Migration
+ class PieceJustificative < ActiveRecord::Base
+
+ end
+
+ class Cerfa < ActiveRecord::Base
+
+ end
+
+ def change
+ PieceJustificative.all.each do |pj|
+ if pj.original_filename.nil?
+ pj.original_filename = pj.content
+ pj.save!
+ end
+ end
+
+ Cerfa.all.each do |cerfa|
+ if cerfa.original_filename.nil?
+ cerfa.original_filename = cerfa.content
+ cerfa.save!
+ end
+ end
+ end
+end
diff --git a/db/schema.rb b/db/schema.rb
index 0aaefd46e..1c61d1297 100644
--- a/db/schema.rb
+++ b/db/schema.rb
@@ -11,7 +11,7 @@
#
# It's strongly recommended that you check this file into your version control system.
-ActiveRecord::Schema.define(version: 20160419142017) do
+ActiveRecord::Schema.define(version: 20160524093540) do
# These are extensions that must be enabled in order to support this database
enable_extension "plpgsql"
@@ -35,6 +35,15 @@ ActiveRecord::Schema.define(version: 20160419142017) do
add_index "administrateurs", ["email"], name: "index_administrateurs_on_email", unique: true, using: :btree
add_index "administrateurs", ["reset_password_token"], name: "index_administrateurs_on_reset_password_token", unique: true, using: :btree
+ create_table "administrateurs_gestionnaires", id: false, force: :cascade do |t|
+ t.integer "administrateur_id"
+ t.integer "gestionnaire_id"
+ end
+
+ add_index "administrateurs_gestionnaires", ["administrateur_id"], name: "index_administrateurs_gestionnaires_on_administrateur_id", using: :btree
+ add_index "administrateurs_gestionnaires", ["gestionnaire_id", "administrateur_id"], name: "unique_couple_administrateur_gestionnaire", unique: true, using: :btree
+ add_index "administrateurs_gestionnaires", ["gestionnaire_id"], name: "index_administrateurs_gestionnaires_on_gestionnaire_id", using: :btree
+
create_table "administrations", force: :cascade do |t|
t.string "email", default: "", null: false
t.string "encrypted_password", default: "", null: false
@@ -53,6 +62,14 @@ ActiveRecord::Schema.define(version: 20160419142017) do
add_index "administrations", ["email"], name: "index_administrations_on_email", unique: true, using: :btree
add_index "administrations", ["reset_password_token"], name: "index_administrations_on_reset_password_token", unique: true, using: :btree
+ create_table "assign_tos", id: false, force: :cascade do |t|
+ t.integer "gestionnaire_id"
+ t.integer "procedure_id"
+ end
+
+ add_index "assign_tos", ["gestionnaire_id"], name: "index_assign_tos_on_gestionnaire_id", using: :btree
+ add_index "assign_tos", ["procedure_id"], name: "index_assign_tos_on_procedure_id", using: :btree
+
create_table "cadastres", force: :cascade do |t|
t.string "surface_intersection"
t.float "surface_parcelle"
@@ -72,6 +89,8 @@ ActiveRecord::Schema.define(version: 20160419142017) do
t.integer "dossier_id"
t.datetime "created_at"
t.integer "user_id"
+ t.string "original_filename"
+ t.string "content_secure_token"
end
add_index "cerfas", ["dossier_id"], name: "index_cerfas_on_dossier_id", using: :btree
@@ -174,7 +193,6 @@ ActiveRecord::Schema.define(version: 20160419142017) do
t.inet "last_sign_in_ip"
t.datetime "created_at"
t.datetime "updated_at"
- t.integer "administrateur_id"
t.integer "procedure_filter", default: [], array: true
end
@@ -203,6 +221,8 @@ ActiveRecord::Schema.define(version: 20160419142017) do
t.integer "type_de_piece_justificative_id"
t.datetime "created_at"
t.integer "user_id"
+ t.string "original_filename"
+ t.string "content_secure_token"
end
add_index "pieces_justificatives", ["type_de_piece_justificative_id"], name: "index_pieces_justificatives_on_type_de_piece_justificative_id", using: :btree
@@ -221,6 +241,7 @@ ActiveRecord::Schema.define(version: 20160419142017) do
t.boolean "euro_flag", default: false
t.string "logo"
t.boolean "cerfa_flag", default: false
+ t.string "logo_secure_token"
end
create_table "quartier_prioritaires", force: :cascade do |t|
diff --git a/lib/tasks/dev.rake b/lib/tasks/dev.rake
index 77bd09d6a..3373efb79 100644
--- a/lib/tasks/dev.rake
+++ b/lib/tasks/dev.rake
@@ -4,6 +4,8 @@ namespace :dev do
puts 'start initialisation'
Rake::Task['dev:generate_token_file'].invoke
Rake::Task['dev:generate_franceconnect_file'].invoke
+ Rake::Task['dev:generate_fog_credentials_file'].invoke
+ Rake::Task['dev:generate_features_file'].invoke
puts 'end initialisation'
end
@@ -35,4 +37,29 @@ EOF
file.write(comment)
file.close
end
+
+ task :generate_fog_credentials_file do
+ puts 'creating fog_credentials.test.yml file'
+ content = <