dorsale 2.1.10 → 2.1.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/stylesheets/dorsale/all.sass +1 -0
  3. data/app/assets/stylesheets/dorsale/users.sass +8 -0
  4. data/app/controllers/dorsale/billing_machine/invoices_controller.rb +2 -1
  5. data/app/controllers/dorsale/billing_machine/quotations_controller.rb +2 -1
  6. data/app/controllers/dorsale/users_controller.rb +69 -0
  7. data/app/mailers/dorsale/application_mailer.rb +8 -0
  8. data/app/mailers/dorsale/user_mailer.rb +9 -0
  9. data/app/models/dorsale/ability_helper.rb +4 -0
  10. data/app/models/dorsale/billing_machine/ability_helper.rb +2 -2
  11. data/app/models/dorsale/users/active.rb +20 -0
  12. data/app/models/dorsale/users/password_generation.rb +17 -0
  13. data/app/views/dorsale/billing_machine/invoices/show.html.slim +8 -4
  14. data/app/views/dorsale/billing_machine/quotations/show.html.slim +8 -4
  15. data/app/views/dorsale/comments/_comment.html.slim +1 -1
  16. data/app/views/dorsale/flyboy/tasks/_form.html.slim +1 -1
  17. data/app/views/dorsale/user_mailer/new_account.html.slim +4 -0
  18. data/app/views/dorsale/users/_details.html.slim +1 -0
  19. data/app/views/dorsale/users/_form.html.slim +6 -0
  20. data/app/views/dorsale/users/_list.html.slim +18 -0
  21. data/app/views/dorsale/users/edit.html.slim +3 -0
  22. data/app/views/dorsale/users/index.html.slim +5 -0
  23. data/app/views/dorsale/users/new.html.slim +1 -0
  24. data/app/views/dorsale/users/show.html.slim +1 -0
  25. data/config/locales/common.fr.yml +1 -0
  26. data/config/locales/en.yml +17 -1
  27. data/config/locales/fr.yml +16 -0
  28. data/config/routes.rb +4 -0
  29. data/db/migrate/20151103110115_add_is_active_to_users.rb +5 -0
  30. data/lib/dorsale/version.rb +1 -1
  31. data/spec/dummy/app/models/ability.rb +1 -0
  32. data/spec/dummy/app/models/user.rb +3 -0
  33. data/spec/dummy/app/views/layouts/application.html.slim +5 -0
  34. data/spec/dummy/db/schema.rb +2 -1
  35. data/spec/mailers/user_mailer.rb +22 -0
  36. data/spec/models/dorsale/users_spec.rb +33 -0
  37. data/spec/routing/dorsale/users_routing_spec.rb +38 -0
  38. metadata +23 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 1e8cb873de3d6147d2932b4ba73fed3a313df886
4
- data.tar.gz: 0e611236df4986c81fdabcbbe5d6bf004a4e7a5c
3
+ metadata.gz: af0902e5d1cea5200ee84a3f215f7bc8ccdc2feb
4
+ data.tar.gz: 4d9781ebd5ff206216889eed95d17bc525d6705a
5
5
  SHA512:
6
- metadata.gz: 7c3c041c0d536402678495964d1824f1775869fc52aa8a43de2e02b7a4191706dd64df002239c9f00d01096bc13da838e254c90b649d19de52e5e2e1b416e4b2
7
- data.tar.gz: 8831493e3fa7f8a8d0db0bc1f7315da2d132cab4a256b68118dbe4c15960718d474af328756398feb534004f23e7a2673c064d39fd1b1c7523e45b08613e86f2
6
+ metadata.gz: f2b3f6483735d74a8671217ff2e31453c24d7548defd451a59c768977fb2954c808d8357ced70110399a18b575c24dda35bbc1a343ec0bf1c371e7ca8bcc2181
7
+ data.tar.gz: bc818dd46b78f372a8039ff22ab9f39879e2a0fafc145f4599338923019c77e1fdc59773e6648f3bd0d1f30eef7e6697394b235482a8379ec0b534e92a2c000a
@@ -12,3 +12,4 @@
12
12
  @import dorsale/styles
13
13
  @import dorsale/pagination
14
14
  @import dorsale/tables
15
+ @import dorsale/users
@@ -0,0 +1,8 @@
1
+ .users
2
+ .actions
3
+ text-align: right
4
+
5
+ .btn
6
+ margin: 0 0 0.5em 0.5em
7
+
8
+
@@ -66,6 +66,7 @@ module Dorsale
66
66
 
67
67
  respond_to do |format|
68
68
  format.pdf {
69
+ authorize! :download, @invoice
69
70
  pdf_data = @invoice.pdf.render
70
71
 
71
72
  file_name = [
@@ -87,7 +88,7 @@ module Dorsale
87
88
  def copy
88
89
  # callback in BillingMachine::ApplicationController
89
90
  @original = @invoice
90
- authorize! :read, @original
91
+ authorize! :copy, @original
91
92
 
92
93
  @invoice = @original.dup
93
94
 
@@ -86,6 +86,7 @@ module Dorsale
86
86
 
87
87
  respond_to do |format|
88
88
  format.pdf {
89
+ authorize! :download, @quotation
89
90
  pdf_data = @quotation.pdf.render_with_attachments
90
91
 
91
92
  file_name = [
@@ -135,7 +136,7 @@ module Dorsale
135
136
  end
136
137
 
137
138
  def copy
138
- authorize! :create, @quotation
139
+ authorize! :copy, @quotation
139
140
 
140
141
  new_quotation = @quotation.create_copy!
141
142
  flash[:notice] = t("messages.quotations.copy_ok")
@@ -0,0 +1,69 @@
1
+ module Dorsale
2
+ class UsersController < ::Dorsale::ApplicationController
3
+ handles_sortable_columns
4
+
5
+ before_action :set_user, only: [
6
+ :show,
7
+ :edit,
8
+ :update,
9
+ ]
10
+
11
+ def show
12
+
13
+ end
14
+
15
+ def index
16
+ authorize! :list, User
17
+ @users = User.all
18
+ end
19
+
20
+ def new
21
+ @user = User.new
22
+ authorize! :create, @user
23
+ end
24
+
25
+ def edit
26
+ authorize! :update, @user
27
+ end
28
+
29
+ def create
30
+ @user = User.new(user_params)
31
+ authorize! :create, @user
32
+ if @user.save
33
+ redirect_to dorsale.users_path, notice: t("messages.users.create_ok")
34
+ else
35
+ flash[:error] = t("messages.users.create_error")
36
+ render :new
37
+ end
38
+ end
39
+
40
+ def update
41
+ authorize! :update, @user
42
+ if @user.update(user_params)
43
+ redirect_to dorsale.users_path, notice: t("messages.users.update_ok")
44
+ else
45
+ flash[:error] = t("messages.users.update_error")
46
+ render :edit
47
+ end
48
+ end
49
+
50
+ private
51
+
52
+ def set_user
53
+ @user = User.find(params[:id])
54
+ end
55
+
56
+ def permitted_params
57
+ [
58
+ :email,
59
+ :password,
60
+ :password_confirmation,
61
+ :is_active,
62
+ ]
63
+ end
64
+
65
+ def user_params
66
+ params.require(:user).permit(permitted_params)
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,8 @@
1
+ module Dorsale
2
+ class ApplicationMailer < ActionMailer::Base
3
+ DEFAULT_FROM = "contact@example.org"
4
+ default from: DEFAULT_FROM
5
+
6
+ helper Dorsale::AllHelpers
7
+ end
8
+ end
@@ -0,0 +1,9 @@
1
+ module Dorsale
2
+ class UserMailer < ::Dorsale::ApplicationMailer
3
+ def new_account user, password
4
+ @user = user
5
+ @password = password
6
+ mail :to => user.email, :subject => t('emails.user.new_account.title')
7
+ end
8
+ end
9
+ end
@@ -3,5 +3,9 @@ module Dorsale
3
3
  def define_dorsale_comment_abilities
4
4
  can [:create, :update, :delete], ::Dorsale::Comment
5
5
  end
6
+
7
+ def define_user_abilities
8
+ can [:list, :create, :update, :delete], User
9
+ end
6
10
  end
7
11
  end
@@ -2,8 +2,8 @@ module Dorsale
2
2
  module BillingMachine
3
3
  module AbilityHelper
4
4
  def define_dorsale_billing_machine_abilities
5
- can [:list, :create, :read, :update, :pay, :copy], ::Dorsale::BillingMachine::Invoice
6
- can [:list, :create, :read, :update, :delete], ::Dorsale::BillingMachine::Quotation
5
+ can [:list, :create, :read, :update, :pay, :copy, :download], ::Dorsale::BillingMachine::Invoice
6
+ can [:list, :create, :read, :update, :delete, :copy, :download], ::Dorsale::BillingMachine::Quotation
7
7
  end
8
8
  end
9
9
  end
@@ -0,0 +1,20 @@
1
+ module Dorsale::Users::Active
2
+ def self.included(user_model)
3
+ user_model.class_eval do
4
+ validates :is_active, inclusion: {in: [true, false]}
5
+
6
+ def initialize(*)
7
+ super
8
+ self.is_active = true if is_active.nil?
9
+ end
10
+
11
+ def active_for_authentication?
12
+ super && self.is_active?
13
+ end
14
+
15
+ def inactive_message
16
+ I18n.t("messages.users.inactive")
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,17 @@
1
+ module Dorsale::Users::PasswordGeneration
2
+ def self.included(user_model)
3
+ user_model.class_eval do
4
+ before_validation :generate_password, on: :create
5
+ after_create :send_welcome_email
6
+
7
+ def generate_password
8
+ self.password ||= SecureRandom.hex(6).to_s
9
+ end
10
+
11
+ def send_welcome_email
12
+ Dorsale::UserMailer.new_account(self, password).deliver_later
13
+ end
14
+
15
+ end
16
+ end
17
+ end
@@ -1,10 +1,14 @@
1
1
  .billing_machine
2
2
  .invoice-details class="#{@invoice.payment_status}"
3
3
  .actions
4
- = copy_button dorsale.copy_billing_machine_invoice_path(@invoice)
5
- = update_button dorsale.edit_billing_machine_invoice_path(@invoice)
6
- = download_button dorsale.billing_machine_invoice_path(@invoice, format: :pdf)
7
- = dorsale_button dorsale.pay_billing_machine_invoice_path(@invoice), icon: :check, action: :pay, method: :patch
4
+ - if can?(:copy, @invoice)
5
+ = copy_button dorsale.copy_billing_machine_invoice_path(@invoice)
6
+ - if can?(:update, @invoice)
7
+ = update_button dorsale.edit_billing_machine_invoice_path(@invoice)
8
+ - if can?(:download, @invoice)
9
+ = download_button dorsale.billing_machine_invoice_path(@invoice, format: :pdf)
10
+ - if can?(:pay, @invoice)
11
+ = dorsale_button dorsale.pay_billing_machine_invoice_path(@invoice), icon: :check, action: :pay, method: :patch
8
12
 
9
13
  - if @invoice.customer
10
14
  .row
@@ -1,10 +1,14 @@
1
1
  .billing_machine
2
2
  .quotation-details
3
3
  .actions
4
- = update_button dorsale.edit_billing_machine_quotation_path(@quotation)
5
- = download_button dorsale.billing_machine_quotation_path(@quotation, format: :pdf)
6
- = copy_button dorsale.copy_billing_machine_quotation_path(@quotation), method: :post, confirm: true
7
- = dorsale_button dorsale.create_invoice_billing_machine_quotation_path(@quotation), method: :post, action: :create_invoice, confirm: true, icon: :magic
4
+ - if can?(:update, @quotation)
5
+ = update_button dorsale.edit_billing_machine_quotation_path(@quotation)
6
+ - if can?(:download, @quotation)
7
+ = download_button dorsale.billing_machine_quotation_path(@quotation, format: :pdf)
8
+ - if can?(:copy, @quotation)
9
+ = copy_button dorsale.copy_billing_machine_quotation_path(@quotation), method: :post, confirm: true
10
+ - if can?(:create, @quotation)
11
+ = dorsale_button dorsale.create_invoice_billing_machine_quotation_path(@quotation), method: :post, action: :create_invoice, confirm: true, icon: :magic
8
12
 
9
13
 
10
14
  - if @quotation.customer
@@ -26,7 +26,7 @@
26
26
  = ::Dorsale::Comment.t(:written_by)
27
27
  = " "
28
28
  span.author
29
- = comment.author.name
29
+ = comment.author.to_s
30
30
 
31
31
  p.text = text2html(comment.text)
32
32
 
@@ -23,7 +23,7 @@
23
23
 
24
24
  = f.hidden_field :taskable_id
25
25
  = f.hidden_field :taskable_type
26
- = f.input :owner_guid, collection: @owners.map{ |e| [e.name, e.guid] }
26
+ = f.input :owner_guid, collection: @owners.map{ |e| [e.to_s, e.guid] }
27
27
 
28
28
  = form_buttons
29
29
 
@@ -0,0 +1,4 @@
1
+ h1= t('emails.user.new_account.body.title')
2
+ h2= t('emails.user.new_account.body.subtitle')
3
+ p= t('emails.user.new_account.body.login', login: @user.email)
4
+ p= t('emails.user.new_account.body.password', password: @password)
@@ -0,0 +1 @@
1
+ h1 = @user
@@ -0,0 +1,6 @@
1
+ .well
2
+ = horizontal_form_for @user do |u|
3
+ = u.input :email
4
+ = u.input :is_active, as: :boolean, wrapper: :horizontal_radio_and_checkboxes
5
+
6
+ = form_buttons obj: @user
@@ -0,0 +1,18 @@
1
+ table.default
2
+ thead
3
+ tr
4
+ th.hidden-xs
5
+ = t("attributes.email")
6
+
7
+ th
8
+ = t("actions.actions")
9
+
10
+ tbody
11
+ - users.each do |user|
12
+ tr.user-line
13
+
14
+ td.hidden-xs.email
15
+ = user
16
+
17
+ td.actions
18
+ = update_button dorsale.edit_user_path(user)
@@ -0,0 +1,3 @@
1
+ .pull-right = link_to t("user_list"), dorsale.users_path, class: 'btn btn-default'
2
+ h1= @user.name
3
+ = render 'form'
@@ -0,0 +1,5 @@
1
+ .users
2
+ .actions
3
+ = create_button dorsale.new_user_path
4
+
5
+ = render "dorsale/users/list", users: @users
@@ -0,0 +1 @@
1
+ = render "form"
@@ -0,0 +1 @@
1
+ = render 'details'
@@ -123,6 +123,7 @@ fr:
123
123
  number : "Nombre"
124
124
  message : "Message"
125
125
  skype : "Skype"
126
+ is_active : "Actif ?"
126
127
 
127
128
  # BillingMachine
128
129
  unit : "Unité"
@@ -7,4 +7,20 @@ en:
7
7
  update_ok : "Comment updated."
8
8
  update_error : "One error occurs, comment can't be updated."
9
9
  delete_ok : "Comment deleted."
10
- delete_error : "One error occurs, comment can't be deleted."
10
+ delete_error : "One error occurs, comment can't be deleted."
11
+ users:
12
+ inactive: "This account is inactive"
13
+ create_ok : "User created."
14
+ create_error : "One error occurs, user can't be created."
15
+ update_ok : "User updated."
16
+ update_error : "One error occurs, user can't be updated."
17
+ emails:
18
+ user:
19
+ new_account:
20
+ title: "New account"
21
+ body:
22
+ title: "New account created"
23
+ subtitle: "Congratulation for your new account"
24
+ login: "Your login is: %{login}"
25
+ password: "Your password is: %{password}"
26
+ url_label: "Click here to access service"
@@ -8,3 +8,19 @@ fr:
8
8
  update_error : "Impossible de modifier le commentaire."
9
9
  delete_ok : "Le commentaire a été supprimé."
10
10
  delete_error : "Impossible de supprimer le commentaire."
11
+ users:
12
+ inactive: "Ce compte est inactif"
13
+ create_ok : "L'utilisateur a été créé."
14
+ create_error : "Impossible de créer l'utilisateur."
15
+ update_ok : "L'utilisateur a été modifié."
16
+ update_error : "Impossible de modifier l'utilisateur."
17
+ emails:
18
+ user:
19
+ new_account:
20
+ title: "Nouveau compte"
21
+ body:
22
+ title: "Nouveau compte créé"
23
+ subtitle: "Félicitation pour la création de votre compte."
24
+ login: "Votre login est: %{login}"
25
+ password: "Votre mot de passe est: %{password}"
26
+ url_label: "Cliquez ici pour accéder au service"
data/config/routes.rb CHANGED
@@ -1,10 +1,14 @@
1
1
  Dorsale::Engine.routes.draw do
2
2
  resources :comments, only: [:create, :edit, :update, :destroy]
3
3
 
4
+ resources :users, except: [:destroy]
5
+
4
6
  namespace :small_data do
5
7
  resources :filters, only: [:create]
6
8
  end
7
9
 
10
+
11
+
8
12
  namespace :alexandrie do
9
13
  resources :attachments, only: [:create, :destroy]
10
14
  end
@@ -0,0 +1,5 @@
1
+ class AddIsActiveToUsers < ActiveRecord::Migration
2
+ def change
3
+ add_column :users, :is_active, :boolean if table_exists?(:users)
4
+ end
5
+ end
@@ -1,3 +1,3 @@
1
1
  module Dorsale
2
- VERSION = "2.1.10"
2
+ VERSION = "2.1.11"
3
3
  end
@@ -9,6 +9,7 @@ class Ability
9
9
  def initialize(*)
10
10
  define_alexandrie_abilities
11
11
  define_dorsale_comment_abilities
12
+ define_user_abilities
12
13
  define_dorsale_flyboy_abilities
13
14
  define_dorsale_billing_machine_abilities
14
15
  define_dorsale_customer_vault_abilities
@@ -4,6 +4,9 @@ class User < ActiveRecord::Base
4
4
  devise :database_authenticatable, :registerable,
5
5
  :recoverable, :rememberable, :trackable, :validatable
6
6
 
7
+ include Dorsale::Users::Active
8
+ include Dorsale::Users::PasswordGeneration
9
+
7
10
  def name
8
11
  email
9
12
  end
@@ -20,6 +20,11 @@ html
20
20
  = icon_link_to "check-square-o", "Tâches", dorsale.flyboy_tasks_path
21
21
  = icon_link_to "euro", "Devis", dorsale.billing_machine_quotations_path
22
22
  = icon_link_to "euro", "Factures", dorsale.billing_machine_invoices_path
23
+ = icon_link_to "users", "Utilisateurs", dorsale.users_path
24
+ - if current_user
25
+ = link_to "Déconnexion", main_app.destroy_user_session_path, method: :delete
26
+ - else
27
+ = link_to "Connexion", main_app.new_user_session_path
23
28
 
24
29
  #flash.container
25
30
  = render "dorsale/flash"
@@ -11,7 +11,7 @@
11
11
  #
12
12
  # It's strongly recommended that you check this file into your version control system.
13
13
 
14
- ActiveRecord::Schema.define(version: 20151023135421) do
14
+ ActiveRecord::Schema.define(version: 20151103110115) do
15
15
 
16
16
  create_table "dorsale_addresses", force: :cascade do |t|
17
17
  t.string "street"
@@ -295,6 +295,7 @@ ActiveRecord::Schema.define(version: 20151023135421) do
295
295
  t.string "last_sign_in_ip"
296
296
  t.datetime "created_at", null: false
297
297
  t.datetime "updated_at", null: false
298
+ t.boolean "is_active"
298
299
  end
299
300
 
300
301
  add_index "users", ["email"], name: "index_users_on_email", unique: true
@@ -0,0 +1,22 @@
1
+ require 'rails_helper'
2
+
3
+ describe ::Dorsale::UserMailer do
4
+ describe "New Account" do
5
+ let(:user) { create(:user) }
6
+ let(:email) { ::Dorsale::UserMailer.new_account(user, user.password) }
7
+
8
+ it 'should send to the right person' do
9
+ expect(email.to).to eq([user.email])
10
+ end
11
+
12
+ it 'should have the right sender' do
13
+ expect(email.from).to eq(["contact@example.org"])
14
+ end
15
+
16
+ it 'should contain user_type, login and password' do
17
+ expect(email.body).to include user.email
18
+ expect(email.body).to include user.password
19
+ end
20
+
21
+ end
22
+ end
@@ -0,0 +1,33 @@
1
+ require "rails_helper"
2
+
3
+
4
+ RSpec.describe User, type: :model do
5
+
6
+ it "should have a valid factores" do
7
+ expect(create(:user)).to be_valid
8
+ end
9
+
10
+ it { is_expected.to respond_to :is_active }
11
+
12
+ describe "default values" do
13
+ it "default active value should be true" do
14
+ @user = create(:user)
15
+ expect(@user.is_active).to eq true
16
+ end
17
+
18
+ it 'should create a valid password upon creation' do
19
+ user = create(:user, password: nil, password_confirmation: nil)
20
+ expect(user).to be_persisted
21
+ end
22
+
23
+ it 'should not override choosen password' do
24
+ user = create(:user, password: "totototo", password_confirmation: nil)
25
+ expect(user.password).to eq "totototo"
26
+ end
27
+
28
+ it 'should send a welcome message upon creation' do
29
+ expect { create(:user)}.to change(ActionMailer::Base.deliveries, :count).by(1)
30
+ end
31
+ end
32
+
33
+ end
@@ -0,0 +1,38 @@
1
+ require "rails_helper"
2
+
3
+ RSpec.describe ::Dorsale::UsersController, type: :routing do
4
+ describe "routing" do
5
+ routes { ::Dorsale::Engine.routes }
6
+ it "routes to #index" do
7
+ expect(:get => "users").to route_to("dorsale/users#index")
8
+ end
9
+
10
+ it "routes to #new" do
11
+ expect(:get => "users/new").to route_to("dorsale/users#new")
12
+ end
13
+
14
+ it "route to #show" do
15
+ expect(:get => "users/1").to route_to("dorsale/users#show", :id => "1")
16
+ end
17
+
18
+ it "routes to #edit" do
19
+ expect(:get => "users/1/edit").to route_to("dorsale/users#edit", :id => "1")
20
+ end
21
+
22
+ it "routes to #create" do
23
+ expect(:post => "users").to route_to("dorsale/users#create")
24
+ end
25
+
26
+ it "routes to #update via PUT" do
27
+ expect(:put => "users/1").to route_to("dorsale/users#update", :id => "1")
28
+ end
29
+
30
+ it "routes to #update via PATCH" do
31
+ expect(:patch => "users/1").to route_to("dorsale/users#update", :id => "1")
32
+ end
33
+
34
+ it "doesn't route to #destroy" do
35
+ expect(:delete => "users/1").not_to be_routable
36
+ end
37
+ end
38
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dorsale
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.1.10
4
+ version: 2.1.11
5
5
  platform: ruby
6
6
  authors:
7
7
  - agilidée
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-10-29 00:00:00.000000000 Z
11
+ date: 2015-11-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -429,6 +429,7 @@ files:
429
429
  - app/assets/stylesheets/dorsale/pagination.sass
430
430
  - app/assets/stylesheets/dorsale/styles.sass
431
431
  - app/assets/stylesheets/dorsale/tables.sass
432
+ - app/assets/stylesheets/dorsale/users.sass
432
433
  - app/controllers/dorsale/alexandrie/attachments_controller.rb
433
434
  - app/controllers/dorsale/application_controller.rb
434
435
  - app/controllers/dorsale/billing_machine/application_controller.rb
@@ -446,6 +447,7 @@ files:
446
447
  - app/controllers/dorsale/flyboy/task_comments_controller.rb
447
448
  - app/controllers/dorsale/flyboy/tasks_controller.rb
448
449
  - app/controllers/dorsale/small_data/filters_controller.rb
450
+ - app/controllers/dorsale/users_controller.rb
449
451
  - app/helpers/dorsale/alexandrie/attachments_helper.rb
450
452
  - app/helpers/dorsale/all_helpers.rb
451
453
  - app/helpers/dorsale/billing_machine/application_helper.rb
@@ -460,6 +462,8 @@ files:
460
462
  - app/helpers/dorsale/pagination_helper.rb
461
463
  - app/helpers/dorsale/routes_helper.rb
462
464
  - app/helpers/dorsale/text_helper.rb
465
+ - app/mailers/dorsale/application_mailer.rb
466
+ - app/mailers/dorsale/user_mailer.rb
463
467
  - app/models/dorsale/ability_helper.rb
464
468
  - app/models/dorsale/address.rb
465
469
  - app/models/dorsale/alexandrie/ability_helper.rb
@@ -497,6 +501,8 @@ files:
497
501
  - app/models/dorsale/small_data/filter.rb
498
502
  - app/models/dorsale/small_data/filter_strategy.rb
499
503
  - app/models/dorsale/user_scope.rb
504
+ - app/models/dorsale/users/active.rb
505
+ - app/models/dorsale/users/password_generation.rb
500
506
  - app/pdfs/dorsale/billing_machine/invoice_pdf.rb
501
507
  - app/pdfs/dorsale/billing_machine/quotation_pdf.rb
502
508
  - app/pdfs/dorsale/flyboy/roadmap.rb
@@ -584,6 +590,14 @@ files:
584
590
  - app/views/dorsale/flyboy/tasks/show.html.slim
585
591
  - app/views/dorsale/flyboy/tasks/summary.html.slim
586
592
  - app/views/dorsale/search/_form.html.slim
593
+ - app/views/dorsale/user_mailer/new_account.html.slim
594
+ - app/views/dorsale/users/_details.html.slim
595
+ - app/views/dorsale/users/_form.html.slim
596
+ - app/views/dorsale/users/_list.html.slim
597
+ - app/views/dorsale/users/edit.html.slim
598
+ - app/views/dorsale/users/index.html.slim
599
+ - app/views/dorsale/users/new.html.slim
600
+ - app/views/dorsale/users/show.html.slim
587
601
  - config/locales/alexandrie.en.yml
588
602
  - config/locales/alexandrie.fr.yml
589
603
  - config/locales/billing_machine.en.yml
@@ -613,6 +627,7 @@ files:
613
627
  - db/migrate/20151012181412_add_commercial_discount_to_invoices_and_quotations.rb
614
628
  - db/migrate/20151019100134_customer_vault_individuals_add_skype.rb
615
629
  - db/migrate/20151023135421_dorsale_billing_machine_quotations_add_state.rb
630
+ - db/migrate/20151103110115_add_is_active_to_users.rb
616
631
  - lib/active_record_comma_type_cast.rb
617
632
  - lib/dorsale.rb
618
633
  - lib/dorsale/alexandrie/prawn.rb
@@ -1552,6 +1567,7 @@ files:
1552
1567
  - spec/helpers/dorsale/flyboy/application_helper_spec.rb
1553
1568
  - spec/helpers/dorsale/link_helper_spec.rb
1554
1569
  - spec/helpers/dorsale/text_helper_spec.rb
1570
+ - spec/mailers/user_mailer.rb
1555
1571
  - spec/models/dorsale/ability_helper_spec.rb
1556
1572
  - spec/models/dorsale/address_spec.rb
1557
1573
  - spec/models/dorsale/alexandrie/ability_helper_spec.rb
@@ -1571,6 +1587,7 @@ files:
1571
1587
  - spec/models/dorsale/flyboy/task_comment_spec.rb
1572
1588
  - spec/models/dorsale/flyboy/task_spec.rb
1573
1589
  - spec/models/dorsale/small_data/filter_spec.rb
1590
+ - spec/models/dorsale/users_spec.rb
1574
1591
  - spec/pdfs/dorsale/billing_machine/invoice_pdf_spec.rb
1575
1592
  - spec/pdfs/dorsale/billing_machine/quotation_pdf_spec.rb
1576
1593
  - spec/rails_helper.rb
@@ -1585,6 +1602,7 @@ files:
1585
1602
  - spec/routing/dorsale/flyboy/task_comments_routing_spec.rb
1586
1603
  - spec/routing/dorsale/flyboy/tasks_routing_spec.rb
1587
1604
  - spec/routing/dorsale/small_data_routing_spec.rb
1605
+ - spec/routing/dorsale/users_routing_spec.rb
1588
1606
  - spec/spec_helper.rb
1589
1607
  - spec/support/devise.rb
1590
1608
  homepage: https://github.com/agilidee/dorsale
@@ -2537,6 +2555,7 @@ test_files:
2537
2555
  - spec/helpers/dorsale/flyboy/application_helper_spec.rb
2538
2556
  - spec/helpers/dorsale/link_helper_spec.rb
2539
2557
  - spec/helpers/dorsale/text_helper_spec.rb
2558
+ - spec/mailers/user_mailer.rb
2540
2559
  - spec/models/dorsale/ability_helper_spec.rb
2541
2560
  - spec/models/dorsale/address_spec.rb
2542
2561
  - spec/models/dorsale/alexandrie/ability_helper_spec.rb
@@ -2556,6 +2575,7 @@ test_files:
2556
2575
  - spec/models/dorsale/flyboy/task_comment_spec.rb
2557
2576
  - spec/models/dorsale/flyboy/task_spec.rb
2558
2577
  - spec/models/dorsale/small_data/filter_spec.rb
2578
+ - spec/models/dorsale/users_spec.rb
2559
2579
  - spec/pdfs/dorsale/billing_machine/invoice_pdf_spec.rb
2560
2580
  - spec/pdfs/dorsale/billing_machine/quotation_pdf_spec.rb
2561
2581
  - spec/rails_helper.rb
@@ -2570,5 +2590,6 @@ test_files:
2570
2590
  - spec/routing/dorsale/flyboy/task_comments_routing_spec.rb
2571
2591
  - spec/routing/dorsale/flyboy/tasks_routing_spec.rb
2572
2592
  - spec/routing/dorsale/small_data_routing_spec.rb
2593
+ - spec/routing/dorsale/users_routing_spec.rb
2573
2594
  - spec/spec_helper.rb
2574
2595
  - spec/support/devise.rb