mongoid-userstamps 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +13 -0
- data/CHANGELOG.md +66 -0
- data/Gemfile +9 -0
- data/LICENSE +22 -0
- data/README.md +185 -0
- data/Rakefile +15 -0
- data/init.rb +2 -0
- data/lib/mongoid/userstamps/config/model.rb +43 -0
- data/lib/mongoid/userstamps/config/user.rb +20 -0
- data/lib/mongoid/userstamps/config.rb +79 -0
- data/lib/mongoid/userstamps/created.rb +29 -0
- data/lib/mongoid/userstamps/deleted.rb +29 -0
- data/lib/mongoid/userstamps/model.rb +26 -0
- data/lib/mongoid/userstamps/railtie.rb +20 -0
- data/lib/mongoid/userstamps/updated.rb +29 -0
- data/lib/mongoid/userstamps/user.rb +43 -0
- data/lib/mongoid/userstamps/version.rb +8 -0
- data/lib/mongoid/userstamps.rb +30 -0
- data/lib/mongoid-userstamps.rb +4 -0
- data/mongoid-userstamps.gemspec +26 -0
- data/spec/spec_helper.rb +25 -0
- data/spec/support/admin.rb +7 -0
- data/spec/support/book.rb +9 -0
- data/spec/support/post.rb +11 -0
- data/spec/support/user.rb +7 -0
- data/spec/unit/gem_config_spec.rb +46 -0
- data/spec/unit/model_config_spec.rb +31 -0
- data/spec/unit/model_spec.rb +157 -0
- data/spec/unit/user_config_spec.rb +23 -0
- data/spec/unit/user_spec.rb +95 -0
- data/spec/unit/userstamp_spec.rb +121 -0
- data/test/config_test.rb +17 -0
- data/test/model_test.rb +12 -0
- data/test/models/post.rb +7 -0
- data/test/models/user.rb +7 -0
- data/test/mongoid.yml +6 -0
- data/test/test_helper.rb +25 -0
- data/test/user_test.rb +10 -0
- metadata +133 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: f50851182f67227d7ce48d89b444cc6d0404cef2
|
4
|
+
data.tar.gz: 951bff1d14fce51b98ff36e2203d0e7cc42f23ed
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 623715ef2edd2124ebb2b2886c7c8e82256a211157c851dec91b11ad6054faaadc069e33f47c4a12156d206bad213a7b470c0f7b191fcb88e7a87ff1a98f168e
|
7
|
+
data.tar.gz: 5c3ed62b39cd302a306956971407a8948883825fae1d963741083f75c6b16a4cfa40c88fbde5f196ba5f78c9387837611af537712762858747820b861c96f85b
|
data/.gitignore
ADDED
data/CHANGELOG.md
ADDED
@@ -0,0 +1,66 @@
|
|
1
|
+
# Changelog
|
2
|
+
|
3
|
+
## [0.4.1](https://github.com/tbpro/mongoid_userstamp/releases/tag/v0.4.1) - 2014-08-21
|
4
|
+
|
5
|
+
* Improvement
|
6
|
+
* Do not overwrite the `updater` if has been manually set (i.e. is in a dirty state.)
|
7
|
+
* Add specs for Rails 4/Mongoid 4
|
8
|
+
|
9
|
+
* Documentation
|
10
|
+
* Document `User.do_as` feature.
|
11
|
+
|
12
|
+
|
13
|
+
## [0.4.0](https://github.com/tbpro/mongoid_userstamp/releases/tag/v0.4.0) - 2014-02-24
|
14
|
+
|
15
|
+
* Improvement
|
16
|
+
* BREAKING: Change userstamp keys to use Mongoid relations. This will change the underlying database field names, and as such will require a migration.
|
17
|
+
* BREAKING: Do not include Mongoid::Userstamp in "User" class by default.
|
18
|
+
* Mongoid::Userstamp config initializer is now optional.
|
19
|
+
* Add support for multiple user classes.
|
20
|
+
* Add class-level config override capability for both users and userstamped model classes.
|
21
|
+
* Add automatic support for `RequestStore` gem as drop-in replacement for `Thread.current`
|
22
|
+
* Refactor
|
23
|
+
* DEPRECATION: `created_column` config is now `created_name`
|
24
|
+
* DEPRECATION: `created_updated` config is now `created_updated`
|
25
|
+
* DEPRECATION: `user_model` config is no longer used. Instead, include Mongoid::Userstamp::User in your user model.
|
26
|
+
* Substantial refactoring of all classes and test cases. Among other changes, all access to `Thread.current` variables is now done in the Mongoid::Userstamp module singleton.
|
27
|
+
|
28
|
+
## [0.3.2](https://github.com/tbpro/mongoid_userstamp/releases/tag/v0.3.2) - 2014-01-12
|
29
|
+
|
30
|
+
* Fix bad gem release
|
31
|
+
|
32
|
+
## [0.3.1](https://github.com/tbpro/mongoid_userstamp/releases/tag/v0.3.1) - 2014-01-11
|
33
|
+
|
34
|
+
* Improvement
|
35
|
+
* Remove autoload and replace with require in gem root lib file
|
36
|
+
* Add log warning for `#configure` deprecation
|
37
|
+
|
38
|
+
* Admin
|
39
|
+
* Remove Jeweler dependency, replace with gem-release gem
|
40
|
+
* Add Gemfile.lock to .gitignore (best practice for gems)
|
41
|
+
* Simplify version file
|
42
|
+
|
43
|
+
## [0.3.0](https://github.com/tbpro/mongoid_userstamp/releases/tag/v0.3.0) - 2013-10-02
|
44
|
+
|
45
|
+
* Improvement
|
46
|
+
* BREAKING: Default value for `updated_accessor` was `:updator`, is now `:updater` (@johnnyshields)
|
47
|
+
* DEPRECATION: `#configure` is now an alias for `#config` and is deprecated (@johnnyshields)
|
48
|
+
* Replace `Mongoid::Userstamp.configuration` and `Mongoid::Userstamp.configure` with `#config` (@johnnyshields)
|
49
|
+
* Replace usages of `id` with `_id`, since there are many gems which override the behavior of `id` (@johnnyshields)
|
50
|
+
* Do not overwrite creator if it has already been set manually (@johnnyshields)
|
51
|
+
* Define setter methods for updated_accessor/created_accessor which assign the user id. Accepts both `Mongoid::Document` and `BSON::ObjectID` types (@johnnyshields)
|
52
|
+
* Allow pass-in of Mongoid field options for updated_column/created_column. Useful to set field aliases, default value, etc. (@johnnyshields)
|
53
|
+
* Expose current_user as `Mongoid::Userstamp.current_user` (@johnnyshields)
|
54
|
+
* Field type is now `::Moped::BSON::ObjectID` instead of Object (@johnnyshields)
|
55
|
+
* Query for creator/updater user using `unscoped` (@johnnyshields)
|
56
|
+
* Improve code readability (@johnnyshields)
|
57
|
+
* Improve test coverage, including adding tests for config (@johnnyshields)
|
58
|
+
|
59
|
+
* Bugfix
|
60
|
+
* Catch error if creator/updater has been deleted and return nil (@johnnyshields)
|
61
|
+
|
62
|
+
## [0.2.1](https://github.com/tbpro/mongoid_userstamp/releases/tag/v0.2.1) - 2013-03-24
|
63
|
+
|
64
|
+
* Improvement
|
65
|
+
* Added some specs for test coverage (@johnnyshields)
|
66
|
+
* Removed dependecy for `Mongoid::Timestamps` (@johnnyshields)
|
data/Gemfile
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
The MIT License (MIT)
|
2
|
+
|
3
|
+
Copyright (c) 2012 Thomas Boerger Programmierung <http://www.tbpro.de>
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,185 @@
|
|
1
|
+
# Mongoid::Userstamps
|
2
|
+
|
3
|
+
Mongoid::Userstamps adds stamp fields for created by, updated by and optionally deleted by
|
4
|
+
information within a ruby application using Mongoid ORM.
|
5
|
+
|
6
|
+
This is a fork from [mongoid_userstamp](https://github.com/tbpro/mongoid_userstamp) but it
|
7
|
+
has been completely rewritten to provide with some new feature and improvements.
|
8
|
+
|
9
|
+
## Install
|
10
|
+
|
11
|
+
```ruby
|
12
|
+
gem 'mongoid-userstamps'
|
13
|
+
```
|
14
|
+
|
15
|
+
## Usage
|
16
|
+
|
17
|
+
Mongoid::Userstamps does the following:
|
18
|
+
* Defines Mongoid `belongs_to` relations to the user class for `created_by` and `updated_by` on each class where `Mongoid::Userstamps` is included
|
19
|
+
* Adds the possibility to define only `created_by` or `updated_by` by including `Mongoid::Userstamps::Created` or `Mongoid::Userstamps::Updated` respectively
|
20
|
+
* Automatically tracks the current user via a `before_filter` (see Rails Integration below)
|
21
|
+
* Sets the `created_by` and `updated_by` values in `before_create` and `before_save` callbacks respectively on the target models.
|
22
|
+
* Adds methods to the user class to check for the current user.
|
23
|
+
* Defines `belongs_to` relation to the user class for `deleted_by` when the class includes `Mongoid::Paranoia` or when `Mongoid::Userstamps::Deleted` is specifically included
|
24
|
+
|
25
|
+
```ruby
|
26
|
+
# Default config (optional unless you want to customize the values)
|
27
|
+
Mongoid::Userstamps.config do |c|
|
28
|
+
c.user_reader = :current_user
|
29
|
+
c.created_name = :created_by
|
30
|
+
c.updated_name = :updated_by
|
31
|
+
c.deleted_name = :deleted_by
|
32
|
+
end
|
33
|
+
|
34
|
+
# Example model class
|
35
|
+
class Product
|
36
|
+
include Mongoid::Document
|
37
|
+
include Mongoid::Userstamps
|
38
|
+
|
39
|
+
# optional class-level config override
|
40
|
+
# mongoid_userstamp user_model: 'MyUser',
|
41
|
+
# created_name: :creator,
|
42
|
+
# updated_name: :updater,
|
43
|
+
end
|
44
|
+
|
45
|
+
# Example user class
|
46
|
+
class MyUser
|
47
|
+
include Mongoid::Document
|
48
|
+
include Mongoid::Userstamps::User
|
49
|
+
|
50
|
+
# optional class-level config override
|
51
|
+
# mongoid_userstamp_user reader: :current_my_user
|
52
|
+
end
|
53
|
+
|
54
|
+
# Create instance
|
55
|
+
p = Product.create
|
56
|
+
|
57
|
+
# Creator ObjectID | Updater ObjectID
|
58
|
+
p.created_by_id | p.updated_by_id
|
59
|
+
# => BSON::ObjectId('4f7c719f476da850ba000039')
|
60
|
+
|
61
|
+
# Creator instance | Updater instance
|
62
|
+
p.created_by | p.updated_by
|
63
|
+
# => <User _id: 4f7c719f476da850ba000039>
|
64
|
+
|
65
|
+
# Set creator/updater manually (usually not required)
|
66
|
+
p.created_by = MyUser.where(name: 'Will Smith')
|
67
|
+
p.updated_by = MyUser.where(name: 'DJ Jazzy Jeff')
|
68
|
+
```
|
69
|
+
|
70
|
+
|
71
|
+
## Preservation of Manually-set Values
|
72
|
+
|
73
|
+
Mongoid::Userstamps will not overwrite manually set values in the creator and updater fields. Specifically:
|
74
|
+
|
75
|
+
* The creator is only set during the creation of new models (`before_create` callback). Mongoid::Userstamps will not
|
76
|
+
overwrite the creator field if it already contains a value (i.e. was manually set.)
|
77
|
+
* The updater is set each time the model is saved (`before_save` callback), which includes the initial
|
78
|
+
creation. Mongoid::Userstamps will not overwrite the updater field if it been modified since the last save, as
|
79
|
+
per Mongoid's built-in "dirty tracking" feature.
|
80
|
+
* The same logic goes for the deleter field if `Mongoid::Userstamps::Deleted` is included.
|
81
|
+
|
82
|
+
|
83
|
+
## Rails Integration
|
84
|
+
|
85
|
+
Popular Rails authentication frameworks such as Devise and Sorcery make a `current_user` method available in
|
86
|
+
your Controllers. Mongoid::Userstamps will automatically use this to set its user reference in a `before_filter`
|
87
|
+
on each request. (You can set an alternative method name via the `user_reader` config.)
|
88
|
+
|
89
|
+
*Gotcha:* If you have special controller actions which change/switch the current user to a new user, you will
|
90
|
+
need to set `User.current = new_user` after the switch occurs.
|
91
|
+
|
92
|
+
|
93
|
+
## Thread Safety
|
94
|
+
|
95
|
+
Mongoid::Userstamps stores all-related user variables in `Thread.current`. If the
|
96
|
+
[RequestStore](https://github.com/steveklabnik/request_store) gem is installed, Mongoid::Userstamps
|
97
|
+
will automatically store variables in the `RequestStore.store` instead. RequestStore is recommended
|
98
|
+
for threaded web servers like Thin or Puma.
|
99
|
+
|
100
|
+
|
101
|
+
## Advanced Usage: Scoped Execution
|
102
|
+
|
103
|
+
It is possible to execute a block of code within the context of a given user as follows:
|
104
|
+
|
105
|
+
```ruby
|
106
|
+
User.current = staff
|
107
|
+
User.current #=> staff
|
108
|
+
|
109
|
+
User.sudo(admin) do
|
110
|
+
my_model.save!
|
111
|
+
User.current #=> admin
|
112
|
+
end
|
113
|
+
|
114
|
+
User.current #=> staff
|
115
|
+
```
|
116
|
+
|
117
|
+
|
118
|
+
## Advanced Usage: Multiple User Classes
|
119
|
+
|
120
|
+
Most Rails apps use a single user model. However, Mongoid::Userstamps supports using multiple user models
|
121
|
+
at once, and will track a separate current_user for each class.
|
122
|
+
|
123
|
+
Please note that each model may subscribe to only one user type for its userstamps, set via the
|
124
|
+
`:user_model` option.
|
125
|
+
|
126
|
+
```ruby
|
127
|
+
class Admin
|
128
|
+
include Mongoid::Document
|
129
|
+
include Mongoid::Userstamps::User
|
130
|
+
|
131
|
+
mongoid_userstamp_user reader: :current_admin
|
132
|
+
end
|
133
|
+
|
134
|
+
class Customer
|
135
|
+
include Mongoid::Document
|
136
|
+
include Mongoid::Userstamps::User
|
137
|
+
|
138
|
+
mongoid_userstamp_user reader: :current_customer
|
139
|
+
end
|
140
|
+
|
141
|
+
class Album
|
142
|
+
include Mongoid::Document
|
143
|
+
include Mongoid::Userstamps
|
144
|
+
|
145
|
+
mongoid_userstamp user_model: 'Customer'
|
146
|
+
end
|
147
|
+
|
148
|
+
class Label
|
149
|
+
include Mongoid::Document
|
150
|
+
include Mongoid::Userstamps
|
151
|
+
|
152
|
+
mongoid_userstamp user_model: 'Admin'
|
153
|
+
end
|
154
|
+
|
155
|
+
# Set current user for each type
|
156
|
+
Admin.current = Admin.where(name: 'Biz Markie')
|
157
|
+
Customer.current = Customer.where(name: 'Sir Mix-A-Lot')
|
158
|
+
|
159
|
+
# In your Controller action
|
160
|
+
album = Album.new('Baby Got Back Single')
|
161
|
+
album.save!
|
162
|
+
album.created_by.name #=> 'Sir Mix-A-Lot'
|
163
|
+
|
164
|
+
label = Label.new('Cold Chillin Records')
|
165
|
+
label.save!
|
166
|
+
label.created_by.name #=> 'Biz Markie'
|
167
|
+
```
|
168
|
+
|
169
|
+
## Contributing
|
170
|
+
|
171
|
+
Fork -> Patch -> Test -> Push -> Pull Request
|
172
|
+
|
173
|
+
Please use Ruby 1.9.3 hash syntax, as Mongoid 3 requires Ruby >= 1.9.3
|
174
|
+
|
175
|
+
## Authors
|
176
|
+
|
177
|
+
* [Geoffroy Planquart](https://github.com/Aethelflaed)
|
178
|
+
* [Thomas Boerger](http://www.tbpro.de)
|
179
|
+
* [John Shields](https://github.com/johnnyshields)
|
180
|
+
* [Bharat Gupta](https://github.com/Bharat311)
|
181
|
+
|
182
|
+
## Copyright
|
183
|
+
|
184
|
+
Licensed under the MIT License (MIT). Refer to LICENSE for details.
|
185
|
+
|
data/Rakefile
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
#!/usr/bin/env rake
|
2
|
+
require 'bundler/gem_tasks'
|
3
|
+
require 'rake/testtask'
|
4
|
+
|
5
|
+
desc 'Default: run unit tests'
|
6
|
+
task :default => :test
|
7
|
+
|
8
|
+
desc 'Run tests'
|
9
|
+
Rake::TestTask.new(:test) do |t|
|
10
|
+
t.libs << 'lib'
|
11
|
+
t.libs << 'test'
|
12
|
+
t.pattern = 'test/**/*_test.rb'
|
13
|
+
t.verbose = true
|
14
|
+
end
|
15
|
+
|
data/init.rb
ADDED
@@ -0,0 +1,43 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
|
3
|
+
module Mongoid
|
4
|
+
module Userstamps
|
5
|
+
module Config
|
6
|
+
class Model
|
7
|
+
attr_accessor :created_name
|
8
|
+
attr_accessor :updated_name
|
9
|
+
attr_accessor :deleted_name
|
10
|
+
attr_accessor :user_model
|
11
|
+
|
12
|
+
def initialize(opts = {})
|
13
|
+
@created_name = opts[:created_name]
|
14
|
+
@updated_name = opts[:updated_name]
|
15
|
+
@user_model = opts[:user_model]
|
16
|
+
end
|
17
|
+
|
18
|
+
def created_name
|
19
|
+
@created_name || Mongoid::Userstamps::Config.created_name
|
20
|
+
end
|
21
|
+
|
22
|
+
def updated_name
|
23
|
+
@updated_name || Mongoid::Userstamps::Config.updated_name
|
24
|
+
end
|
25
|
+
|
26
|
+
def deleted_name
|
27
|
+
@deleted_name || Mongoid::Userstamps::Config.deleted_name
|
28
|
+
end
|
29
|
+
|
30
|
+
def user_model
|
31
|
+
@user_model || Mongoid::Userstamps::Config.user_classes.first.to_s
|
32
|
+
end
|
33
|
+
def user_model=(value)
|
34
|
+
@user_model = value.to_s if value
|
35
|
+
end
|
36
|
+
def user_model_defined?
|
37
|
+
!!@user_model
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
|
3
|
+
module Mongoid
|
4
|
+
module Userstamps
|
5
|
+
module Config
|
6
|
+
class User
|
7
|
+
attr_accessor :reader
|
8
|
+
|
9
|
+
def initialize(opts = {})
|
10
|
+
@reader = opts[:reader]
|
11
|
+
end
|
12
|
+
|
13
|
+
def reader
|
14
|
+
@reader || Mongoid::Userstamps::Config.user_reader
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
@@ -0,0 +1,79 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
|
3
|
+
require 'mongoid/userstamps/config/model'
|
4
|
+
require 'mongoid/userstamps/config/user'
|
5
|
+
|
6
|
+
module Mongoid
|
7
|
+
module Userstamps
|
8
|
+
module Config
|
9
|
+
class << self
|
10
|
+
attr_accessor :created_name
|
11
|
+
attr_accessor :updated_name
|
12
|
+
attr_accessor :deleted_name
|
13
|
+
attr_accessor :user_reader
|
14
|
+
|
15
|
+
def eval
|
16
|
+
instance_eval(&Proc.new)
|
17
|
+
end
|
18
|
+
|
19
|
+
def user_classes
|
20
|
+
@user_classes ||= []
|
21
|
+
end
|
22
|
+
|
23
|
+
def add_user_class(klass)
|
24
|
+
user_classes << klass
|
25
|
+
model_classes.each do |model|
|
26
|
+
config = model.userstamps_model
|
27
|
+
if !config.user_model_defined?
|
28
|
+
model.relations[config.created_name.to_s].try(:[]=, :class_name, config.user_model)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def model_classes
|
34
|
+
@model_classes ||= []
|
35
|
+
end
|
36
|
+
|
37
|
+
def add_model_class(klass)
|
38
|
+
model_classes << klass
|
39
|
+
end
|
40
|
+
|
41
|
+
def created_name
|
42
|
+
@created_name ||= :created_by
|
43
|
+
end
|
44
|
+
|
45
|
+
def updated_name
|
46
|
+
@updated_name ||= :updated_by
|
47
|
+
end
|
48
|
+
|
49
|
+
def deleted_name
|
50
|
+
@deleted_name ||= :deleted_by
|
51
|
+
end
|
52
|
+
|
53
|
+
def user_reader
|
54
|
+
@user_reader ||= :current_user
|
55
|
+
end
|
56
|
+
|
57
|
+
def current_user(user_class)
|
58
|
+
store(user_class)
|
59
|
+
end
|
60
|
+
|
61
|
+
def set_current_user(user_class, value)
|
62
|
+
store(user_class, value)
|
63
|
+
end
|
64
|
+
|
65
|
+
def store(model, value = false)
|
66
|
+
return if !model
|
67
|
+
key = "mongoid-userstamps/#{model.to_s.underscore}".to_sym
|
68
|
+
store = defined?(RequestStore) ? RequestStore.store : Thread.current
|
69
|
+
if value == false
|
70
|
+
store[key]
|
71
|
+
else
|
72
|
+
store[key] = value
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
|
3
|
+
module Mongoid
|
4
|
+
module Userstamps
|
5
|
+
module Created
|
6
|
+
extend ActiveSupport::Concern
|
7
|
+
|
8
|
+
included do
|
9
|
+
if !self.included_modules.include?(Mongoid::Userstamps::Model)
|
10
|
+
include Mongoid::Userstamps::Model
|
11
|
+
end
|
12
|
+
|
13
|
+
belongs_to userstamps_model.created_name, {
|
14
|
+
class_name: userstamps_model.user_model,
|
15
|
+
inverse_of: nil
|
16
|
+
}
|
17
|
+
|
18
|
+
set_callback :create, :before, :set_created_by
|
19
|
+
end
|
20
|
+
|
21
|
+
def set_created_by
|
22
|
+
user = self.class.current_user
|
23
|
+
return if !user || self.public_send(userstamps_model.created_name)
|
24
|
+
self.public_send("#{userstamps_model.created_name}=", user)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
|
3
|
+
module Mongoid
|
4
|
+
module Userstamps
|
5
|
+
module Deleted
|
6
|
+
extend ActiveSupport::Concern
|
7
|
+
|
8
|
+
included do
|
9
|
+
if !self.included_modules.include?(Mongoid::Userstamps::Model)
|
10
|
+
include Mongoid::Userstamps::Model
|
11
|
+
end
|
12
|
+
|
13
|
+
belongs_to userstamps_model.deleted_name, {
|
14
|
+
class_name: userstamps_model.user_model,
|
15
|
+
inverse_of: nil
|
16
|
+
}
|
17
|
+
|
18
|
+
set_callback :destroy, :before, :set_deleted_by
|
19
|
+
end
|
20
|
+
|
21
|
+
def set_deleted_by
|
22
|
+
user = self.class.current_user
|
23
|
+
return if !user || self.public_send("#{userstamps_model.deleted_name}_id_changed?")
|
24
|
+
self.public_send("#{userstamps_model.deleted_name}=", user)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module Mongoid
|
2
|
+
module Userstamps
|
3
|
+
module Model
|
4
|
+
extend ActiveSupport::Concern
|
5
|
+
|
6
|
+
included do
|
7
|
+
Mongoid::Userstamps::Config.add_model_class(self)
|
8
|
+
end
|
9
|
+
|
10
|
+
def userstamps_model
|
11
|
+
self.class.userstamps_model
|
12
|
+
end
|
13
|
+
|
14
|
+
class_methods do
|
15
|
+
def userstamps_model(opts = {})
|
16
|
+
@userstamps_model ||= Mongoid::Userstamps::Config::Model.new(opts)
|
17
|
+
end
|
18
|
+
|
19
|
+
def current_user
|
20
|
+
Mongoid::Userstamps::Config.current_user(userstamps_model.user_model)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
|
3
|
+
module Mongoid
|
4
|
+
module Userstamps
|
5
|
+
class Railtie < Rails::Railtie
|
6
|
+
# Set current_user from controller reader method
|
7
|
+
ActiveSupport.on_load :action_controller do
|
8
|
+
before_filter do |c|
|
9
|
+
Mongoid::Userstamps::Config.user_classes.each do |user_class|
|
10
|
+
begin
|
11
|
+
user_class.current = c.public_send(user_class.userstamps_user.reader)
|
12
|
+
rescue
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
|
3
|
+
module Mongoid
|
4
|
+
module Userstamps
|
5
|
+
module Updated
|
6
|
+
extend ActiveSupport::Concern
|
7
|
+
|
8
|
+
included do
|
9
|
+
if !self.included_modules.include?(Mongoid::Userstamps::Model)
|
10
|
+
include Mongoid::Userstamps::Model
|
11
|
+
end
|
12
|
+
|
13
|
+
belongs_to userstamps_model.updated_name, {
|
14
|
+
class_name: userstamps_model.user_model,
|
15
|
+
inverse_of: nil
|
16
|
+
}
|
17
|
+
|
18
|
+
set_callback :save, :before, :set_updated_by
|
19
|
+
end
|
20
|
+
|
21
|
+
def set_updated_by
|
22
|
+
user = self.class.current_user
|
23
|
+
return if !user || self.public_send("#{userstamps_model.updated_name}_id_changed?")
|
24
|
+
self.public_send("#{userstamps_model.updated_name}=", user)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
@@ -0,0 +1,43 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
module Mongoid
|
3
|
+
module Userstamps
|
4
|
+
module User
|
5
|
+
extend ActiveSupport::Concern
|
6
|
+
|
7
|
+
included do
|
8
|
+
Mongoid::Userstamps::Config.add_user_class(self)
|
9
|
+
end
|
10
|
+
|
11
|
+
def current?
|
12
|
+
self.id == self.class.current.try(:id)
|
13
|
+
end
|
14
|
+
|
15
|
+
def userstamps_user
|
16
|
+
self.class.userstamps_user
|
17
|
+
end
|
18
|
+
|
19
|
+
class_methods do
|
20
|
+
def current
|
21
|
+
Mongoid::Userstamps::Config.current_user(self)
|
22
|
+
end
|
23
|
+
|
24
|
+
def current=(value)
|
25
|
+
Mongoid::Userstamps::Config.set_current_user(self, value)
|
26
|
+
end
|
27
|
+
|
28
|
+
def sudo(user)
|
29
|
+
old = self.current
|
30
|
+
self.current = user
|
31
|
+
yield
|
32
|
+
ensure
|
33
|
+
self.current = old
|
34
|
+
end
|
35
|
+
|
36
|
+
def userstamps_user(opts = {})
|
37
|
+
@userstamps_user ||= Mongoid::Userstamps::Config::User.new(opts)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|