Repository files navigation

This is a fork of the grosser fork [github.com/grosser/userstamp] of the original userstamp plugin created by delynn [github.com/delynn/userstamp].

This fork has been created to combine the grosser changes that enable use of the plugin within applications that perform soft deletes but are not using the acts_as_paranoid plugin/gem (for example this fork can now be used in conjunction with the rails3_acts_as_paranoid plugin/gem [github.com/goncalossilva/rails3_acts_as_paranoid]).

This fork also includes changes to perform the model stamping before validation is performed so that the model can enforce the presence of stamp attribute values eg.

validates:created_by, presence:truevalidates:updated_by, presence:true

To use this fork add the following to your application gemfile:

gem'originator', github:'AlchemyCMS/originator'

Userstamp extends ActiveRecord::Base to add automatic updating of ‘creator’, ‘updater’, and ‘deleter’ attributes. It is based loosely on the ActiveRecord::Timestamp module.

Two class methods (model_stamper and stampable) are implemented in this plugin. The model_stamper method is used in models that are responsible for creating, updating, or deleting other objects. The stampable method is used in models that are subject to being created, updated, or deleted by ‘stampers’.

The assumption is that you have two different categories of objects; those that manipulate, and those that are manipulated. For those objects that are being manipulated there’s the Stampable module and for the manipulators there’s the Stamper module. There’s also the actual Userstamp module for your controllers that assists in setting up your environment on a per request basis.

Assume a weblog application has User and Post objects. # 1: Create the migrations for these objects

classCreateUsers<ActiveRecord::Migrationdefself.upcreate_table:users, :force=>truedo|t|...t.userstamps# use t.userstamps(true) if you also want 'deleter_id'endenddefself.downdrop_table:usersendendclassCreatePosts<ActiveRecord::Migrationdefself.upcreate_table:posts, :force=>truedo|t|...t.userstamps# use t.userstamps(true) if you also want 'deleter_id'endenddefself.downdrop_table:postsendend

# 2: Users are going to manipulate Post’s, use the model_stamper:

classUser<ActiveRecord::Basemodel_stamperend

# 3: Set the current user in the ApplicationController:

classApplicationController<ActionController::BaseincludeUserstampend

More than likely you want all your associations setup on your stamped objects, and that’s where the stampable class method comes in. So in our example we’ll want to use this method in both our User and Post classes:

classUser<ActiveRecord::Basemodel_stamperstampableendclassPost<ActiveRecord::Basestampableend

Okay, so what all have we done? The model_stamper class method injects two methods into the User class. They are #stamper= and #stamper and look like this:

defstamper=(object)
object_stamper = ifobject.is_a?(ActiveRecord::Base)
object.send("#{object.class.primary_key}".to_sym)
elseobjectendThread.current["#{self.to_s.downcase}_#{self.object_id}_stamper"] = object_stamperenddefstamperThread.current["#{self.to_s.downcase}_#{self.object_id}_stamper"]
end

The stampable method allows you to customize what columns will get stamped, and also creates the creator, updater, and deleter associations.

The Userstamp module that we included into our ApplicationController uses the setter method to set which user is currently making the request. By default the ‘set_stampers’ method works perfectly with the RestfulAuthentication plug-in:

defset_stampersUser.stamper = self.current_userend

If you aren’t using ActsAsAuthenticated, then you need to create your own version of the set_stampers method in the controller where you’ve included the Userstamp module.

Now, let’s get back to the Stampable module (since it really is the interesting one). The Stampable module sets up before_* filters that are responsible for setting those attributes at the appropriate times. It also creates the belongs_to relationships for you.

If you need to customize the columns that are stamped, the stampable method can be completely customized. Here’s an quick example:

class Post < ActiveRecord::Base
stampable :stamper_class_name => :person,
:creator_attribute => :create_user,
:updater_attribute => :update_user,
:deleter_attribute => :delete_user,

:deleter => true

end
# config/environment.rbDdb::Userstamp.compatibility_mode = true

Example userstamp application

All: rake
One: ruby test/compatibility_stamping_test.rb

DeLynn Berry

The original idea for this plugin came from the Rails Wiki article entitled Extending ActiveRecord.

About

Adds originator attributes to your ActiveRecord models.

Resources

Stars

0 stars

Watchers

4 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

This is a fork of the grosser fork [github.com/grosser/userstamp] of the original userstamp plugin created by delynn [github.com/delynn/userstamp].

This fork has been created to combine the grosser changes that enable use of the plugin within applications that perform soft deletes but are not using the acts_as_paranoid plugin/gem (for example this fork can now be used in conjunction with the rails3_acts_as_paranoid plugin/gem [github.com/goncalossilva/rails3_acts_as_paranoid]).

This fork also includes changes to perform the model stamping before validation is performed so that the model can enforce the presence of stamp attribute values eg.

validates:created_by, presence:truevalidates:updated_by, presence:true

To use this fork add the following to your application gemfile:

gem'originator', github:'AlchemyCMS/originator'

Userstamp extends ActiveRecord::Base to add automatic updating of ‘creator’, ‘updater’, and ‘deleter’ attributes. It is based loosely on the ActiveRecord::Timestamp module.

Two class methods (model_stamper and stampable) are implemented in this plugin. The model_stamper method is used in models that are responsible for creating, updating, or deleting other objects. The stampable method is used in models that are subject to being created, updated, or deleted by ‘stampers’.

The assumption is that you have two different categories of objects; those that manipulate, and those that are manipulated. For those objects that are being manipulated there’s the Stampable module and for the manipulators there’s the Stamper module. There’s also the actual Userstamp module for your controllers that assists in setting up your environment on a per request basis.

Assume a weblog application has User and Post objects. # 1: Create the migrations for these objects

classCreateUsers<ActiveRecord::Migrationdefself.upcreate_table:users, :force=>truedo|t|...t.userstamps# use t.userstamps(true) if you also want 'deleter_id'endenddefself.downdrop_table:usersendendclassCreatePosts<ActiveRecord::Migrationdefself.upcreate_table:posts, :force=>truedo|t|...t.userstamps# use t.userstamps(true) if you also want 'deleter_id'endenddefself.downdrop_table:postsendend

# 2: Users are going to manipulate Post’s, use the model_stamper:

classUser<ActiveRecord::Basemodel_stamperend

# 3: Set the current user in the ApplicationController:

classApplicationController<ActionController::BaseincludeUserstampend

More than likely you want all your associations setup on your stamped objects, and that’s where the stampable class method comes in. So in our example we’ll want to use this method in both our User and Post classes:

classUser<ActiveRecord::Basemodel_stamperstampableendclassPost<ActiveRecord::Basestampableend

Okay, so what all have we done? The model_stamper class method injects two methods into the User class. They are #stamper= and #stamper and look like this:

defstamper=(object)
object_stamper = ifobject.is_a?(ActiveRecord::Base)
object.send("#{object.class.primary_key}".to_sym)
elseobjectendThread.current["#{self.to_s.downcase}_#{self.object_id}_stamper"] = object_stamperenddefstamperThread.current["#{self.to_s.downcase}_#{self.object_id}_stamper"]
end

The stampable method allows you to customize what columns will get stamped, and also creates the creator, updater, and deleter associations.

The Userstamp module that we included into our ApplicationController uses the setter method to set which user is currently making the request. By default the ‘set_stampers’ method works perfectly with the RestfulAuthentication plug-in:

defset_stampersUser.stamper = self.current_userend

If you aren’t using ActsAsAuthenticated, then you need to create your own version of the set_stampers method in the controller where you’ve included the Userstamp module.

Now, let’s get back to the Stampable module (since it really is the interesting one). The Stampable module sets up before_* filters that are responsible for setting those attributes at the appropriate times. It also creates the belongs_to relationships for you.

If you need to customize the columns that are stamped, the stampable method can be completely customized. Here’s an quick example:

class Post < ActiveRecord::Base
stampable :stamper_class_name => :person,
:creator_attribute => :create_user,
:updater_attribute => :update_user,
:deleter_attribute => :delete_user,

:deleter => true

end
# config/environment.rbDdb::Userstamp.compatibility_mode = true

Example userstamp application

All: rake
One: ruby test/compatibility_stamping_test.rb

DeLynn Berry

The original idea for this plugin came from the Rails Wiki article entitled Extending ActiveRecord.

About

Adds originator attributes to your ActiveRecord models.

Resources

Stars

0 stars

Watchers

4 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

This is a fork of the grosser fork [github.com/grosser/userstamp] of the original userstamp plugin created by delynn [github.com/delynn/userstamp].

This fork has been created to combine the grosser changes that enable use of the plugin within applications that perform soft deletes but are not using the acts_as_paranoid plugin/gem (for example this fork can now be used in conjunction with the rails3_acts_as_paranoid plugin/gem [github.com/goncalossilva/rails3_acts_as_paranoid]).

This fork also includes changes to perform the model stamping before validation is performed so that the model can enforce the presence of stamp attribute values eg.

validates:created_by, presence:truevalidates:updated_by, presence:true

To use this fork add the following to your application gemfile:

gem'originator', github:'AlchemyCMS/originator'

Userstamp extends ActiveRecord::Base to add automatic updating of ‘creator’, ‘updater’, and ‘deleter’ attributes. It is based loosely on the ActiveRecord::Timestamp module.

Two class methods (model_stamper and stampable) are implemented in this plugin. The model_stamper method is used in models that are responsible for creating, updating, or deleting other objects. The stampable method is used in models that are subject to being created, updated, or deleted by ‘stampers’.

The assumption is that you have two different categories of objects; those that manipulate, and those that are manipulated. For those objects that are being manipulated there’s the Stampable module and for the manipulators there’s the Stamper module. There’s also the actual Userstamp module for your controllers that assists in setting up your environment on a per request basis.

Assume a weblog application has User and Post objects. # 1: Create the migrations for these objects

classCreateUsers<ActiveRecord::Migrationdefself.upcreate_table:users, :force=>truedo|t|...t.userstamps# use t.userstamps(true) if you also want 'deleter_id'endenddefself.downdrop_table:usersendendclassCreatePosts<ActiveRecord::Migrationdefself.upcreate_table:posts, :force=>truedo|t|...t.userstamps# use t.userstamps(true) if you also want 'deleter_id'endenddefself.downdrop_table:postsendend

# 2: Users are going to manipulate Post’s, use the model_stamper:

classUser<ActiveRecord::Basemodel_stamperend

# 3: Set the current user in the ApplicationController:

classApplicationController<ActionController::BaseincludeUserstampend

More than likely you want all your associations setup on your stamped objects, and that’s where the stampable class method comes in. So in our example we’ll want to use this method in both our User and Post classes:

classUser<ActiveRecord::Basemodel_stamperstampableendclassPost<ActiveRecord::Basestampableend

Okay, so what all have we done? The model_stamper class method injects two methods into the User class. They are #stamper= and #stamper and look like this:

defstamper=(object)
object_stamper = ifobject.is_a?(ActiveRecord::Base)
object.send("#{object.class.primary_key}".to_sym)
elseobjectendThread.current["#{self.to_s.downcase}_#{self.object_id}_stamper"] = object_stamperenddefstamperThread.current["#{self.to_s.downcase}_#{self.object_id}_stamper"]
end

The stampable method allows you to customize what columns will get stamped, and also creates the creator, updater, and deleter associations.

The Userstamp module that we included into our ApplicationController uses the setter method to set which user is currently making the request. By default the ‘set_stampers’ method works perfectly with the RestfulAuthentication plug-in:

defset_stampersUser.stamper = self.current_userend

If you aren’t using ActsAsAuthenticated, then you need to create your own version of the set_stampers method in the controller where you’ve included the Userstamp module.

Now, let’s get back to the Stampable module (since it really is the interesting one). The Stampable module sets up before_* filters that are responsible for setting those attributes at the appropriate times. It also creates the belongs_to relationships for you.

If you need to customize the columns that are stamped, the stampable method can be completely customized. Here’s an quick example:

class Post < ActiveRecord::Base
stampable :stamper_class_name => :person,
:creator_attribute => :create_user,
:updater_attribute => :update_user,
:deleter_attribute => :delete_user,

:deleter => true

end
# config/environment.rbDdb::Userstamp.compatibility_mode = true

Example userstamp application

All: rake
One: ruby test/compatibility_stamping_test.rb

DeLynn Berry

The original idea for this plugin came from the Rails Wiki article entitled Extending ActiveRecord.

About

Adds originator attributes to your ActiveRecord models.

Resources

Stars

0 stars

Watchers

4 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

This is a fork of the grosser fork [github.com/grosser/userstamp] of the original userstamp plugin created by delynn [github.com/delynn/userstamp].

This fork has been created to combine the grosser changes that enable use of the plugin within applications that perform soft deletes but are not using the acts_as_paranoid plugin/gem (for example this fork can now be used in conjunction with the rails3_acts_as_paranoid plugin/gem [github.com/goncalossilva/rails3_acts_as_paranoid]).

This fork also includes changes to perform the model stamping before validation is performed so that the model can enforce the presence of stamp attribute values eg.

validates:created_by, presence:truevalidates:updated_by, presence:true

To use this fork add the following to your application gemfile:

gem'originator', github:'AlchemyCMS/originator'

Userstamp extends ActiveRecord::Base to add automatic updating of ‘creator’, ‘updater’, and ‘deleter’ attributes. It is based loosely on the ActiveRecord::Timestamp module.

Two class methods (model_stamper and stampable) are implemented in this plugin. The model_stamper method is used in models that are responsible for creating, updating, or deleting other objects. The stampable method is used in models that are subject to being created, updated, or deleted by ‘stampers’.

The assumption is that you have two different categories of objects; those that manipulate, and those that are manipulated. For those objects that are being manipulated there’s the Stampable module and for the manipulators there’s the Stamper module. There’s also the actual Userstamp module for your controllers that assists in setting up your environment on a per request basis.

Assume a weblog application has User and Post objects. # 1: Create the migrations for these objects

classCreateUsers<ActiveRecord::Migrationdefself.upcreate_table:users, :force=>truedo|t|...t.userstamps# use t.userstamps(true) if you also want 'deleter_id'endenddefself.downdrop_table:usersendendclassCreatePosts<ActiveRecord::Migrationdefself.upcreate_table:posts, :force=>truedo|t|...t.userstamps# use t.userstamps(true) if you also want 'deleter_id'endenddefself.downdrop_table:postsendend

# 2: Users are going to manipulate Post’s, use the model_stamper:

classUser<ActiveRecord::Basemodel_stamperend

# 3: Set the current user in the ApplicationController:

classApplicationController<ActionController::BaseincludeUserstampend

More than likely you want all your associations setup on your stamped objects, and that’s where the stampable class method comes in. So in our example we’ll want to use this method in both our User and Post classes:

classUser<ActiveRecord::Basemodel_stamperstampableendclassPost<ActiveRecord::Basestampableend

Okay, so what all have we done? The model_stamper class method injects two methods into the User class. They are #stamper= and #stamper and look like this:

defstamper=(object)
object_stamper = ifobject.is_a?(ActiveRecord::Base)
object.send("#{object.class.primary_key}".to_sym)
elseobjectendThread.current["#{self.to_s.downcase}_#{self.object_id}_stamper"] = object_stamperenddefstamperThread.current["#{self.to_s.downcase}_#{self.object_id}_stamper"]
end

The stampable method allows you to customize what columns will get stamped, and also creates the creator, updater, and deleter associations.

The Userstamp module that we included into our ApplicationController uses the setter method to set which user is currently making the request. By default the ‘set_stampers’ method works perfectly with the RestfulAuthentication plug-in:

defset_stampersUser.stamper = self.current_userend

If you aren’t using ActsAsAuthenticated, then you need to create your own version of the set_stampers method in the controller where you’ve included the Userstamp module.

Now, let’s get back to the Stampable module (since it really is the interesting one). The Stampable module sets up before_* filters that are responsible for setting those attributes at the appropriate times. It also creates the belongs_to relationships for you.

If you need to customize the columns that are stamped, the stampable method can be completely customized. Here’s an quick example:

class Post < ActiveRecord::Base
stampable :stamper_class_name => :person,
:creator_attribute => :create_user,
:updater_attribute => :update_user,
:deleter_attribute => :delete_user,

:deleter => true

end
# config/environment.rbDdb::Userstamp.compatibility_mode = true

Example userstamp application

All: rake
One: ruby test/compatibility_stamping_test.rb

DeLynn Berry

The original idea for this plugin came from the Rails Wiki article entitled Extending ActiveRecord.

About

Adds originator attributes to your ActiveRecord models.

Resources

Stars

0 stars

Watchers

4 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

This is a fork of the grosser fork [github.com/grosser/userstamp] of the original userstamp plugin created by delynn [github.com/delynn/userstamp].

This fork has been created to combine the grosser changes that enable use of the plugin within applications that perform soft deletes but are not using the acts_as_paranoid plugin/gem (for example this fork can now be used in conjunction with the rails3_acts_as_paranoid plugin/gem [github.com/goncalossilva/rails3_acts_as_paranoid]).

This fork also includes changes to perform the model stamping before validation is performed so that the model can enforce the presence of stamp attribute values eg.

validates:created_by, presence:truevalidates:updated_by, presence:true

To use this fork add the following to your application gemfile:

gem'originator', github:'AlchemyCMS/originator'

Userstamp extends ActiveRecord::Base to add automatic updating of ‘creator’, ‘updater’, and ‘deleter’ attributes. It is based loosely on the ActiveRecord::Timestamp module.

Two class methods (model_stamper and stampable) are implemented in this plugin. The model_stamper method is used in models that are responsible for creating, updating, or deleting other objects. The stampable method is used in models that are subject to being created, updated, or deleted by ‘stampers’.

The assumption is that you have two different categories of objects; those that manipulate, and those that are manipulated. For those objects that are being manipulated there’s the Stampable module and for the manipulators there’s the Stamper module. There’s also the actual Userstamp module for your controllers that assists in setting up your environment on a per request basis.

Assume a weblog application has User and Post objects. # 1: Create the migrations for these objects

classCreateUsers<ActiveRecord::Migrationdefself.upcreate_table:users, :force=>truedo|t|...t.userstamps# use t.userstamps(true) if you also want 'deleter_id'endenddefself.downdrop_table:usersendendclassCreatePosts<ActiveRecord::Migrationdefself.upcreate_table:posts, :force=>truedo|t|...t.userstamps# use t.userstamps(true) if you also want 'deleter_id'endenddefself.downdrop_table:postsendend

# 2: Users are going to manipulate Post’s, use the model_stamper:

classUser<ActiveRecord::Basemodel_stamperend

# 3: Set the current user in the ApplicationController:

classApplicationController<ActionController::BaseincludeUserstampend

More than likely you want all your associations setup on your stamped objects, and that’s where the stampable class method comes in. So in our example we’ll want to use this method in both our User and Post classes:

classUser<ActiveRecord::Basemodel_stamperstampableendclassPost<ActiveRecord::Basestampableend

Okay, so what all have we done? The model_stamper class method injects two methods into the User class. They are #stamper= and #stamper and look like this:

defstamper=(object)
object_stamper = ifobject.is_a?(ActiveRecord::Base)
object.send("#{object.class.primary_key}".to_sym)
elseobjectendThread.current["#{self.to_s.downcase}_#{self.object_id}_stamper"] = object_stamperenddefstamperThread.current["#{self.to_s.downcase}_#{self.object_id}_stamper"]
end

The stampable method allows you to customize what columns will get stamped, and also creates the creator, updater, and deleter associations.

The Userstamp module that we included into our ApplicationController uses the setter method to set which user is currently making the request. By default the ‘set_stampers’ method works perfectly with the RestfulAuthentication plug-in:

defset_stampersUser.stamper = self.current_userend

If you aren’t using ActsAsAuthenticated, then you need to create your own version of the set_stampers method in the controller where you’ve included the Userstamp module.

Now, let’s get back to the Stampable module (since it really is the interesting one). The Stampable module sets up before_* filters that are responsible for setting those attributes at the appropriate times. It also creates the belongs_to relationships for you.

If you need to customize the columns that are stamped, the stampable method can be completely customized. Here’s an quick example:

class Post < ActiveRecord::Base
stampable :stamper_class_name => :person,
:creator_attribute => :create_user,
:updater_attribute => :update_user,
:deleter_attribute => :delete_user,

:deleter => true

end
# config/environment.rbDdb::Userstamp.compatibility_mode = true

Example userstamp application

All: rake
One: ruby test/compatibility_stamping_test.rb

DeLynn Berry

The original idea for this plugin came from the Rails Wiki article entitled Extending ActiveRecord.

About

Adds originator attributes to your ActiveRecord models.

Resources

Stars

0 stars

Watchers

4 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

This is a fork of the grosser fork [github.com/grosser/userstamp] of the original userstamp plugin created by delynn [github.com/delynn/userstamp].

This fork has been created to combine the grosser changes that enable use of the plugin within applications that perform soft deletes but are not using the acts_as_paranoid plugin/gem (for example this fork can now be used in conjunction with the rails3_acts_as_paranoid plugin/gem [github.com/goncalossilva/rails3_acts_as_paranoid]).

This fork also includes changes to perform the model stamping before validation is performed so that the model can enforce the presence of stamp attribute values eg.

validates:created_by, presence:truevalidates:updated_by, presence:true

To use this fork add the following to your application gemfile:

gem'originator', github:'AlchemyCMS/originator'

Userstamp extends ActiveRecord::Base to add automatic updating of ‘creator’, ‘updater’, and ‘deleter’ attributes. It is based loosely on the ActiveRecord::Timestamp module.

Two class methods (model_stamper and stampable) are implemented in this plugin. The model_stamper method is used in models that are responsible for creating, updating, or deleting other objects. The stampable method is used in models that are subject to being created, updated, or deleted by ‘stampers’.

The assumption is that you have two different categories of objects; those that manipulate, and those that are manipulated. For those objects that are being manipulated there’s the Stampable module and for the manipulators there’s the Stamper module. There’s also the actual Userstamp module for your controllers that assists in setting up your environment on a per request basis.

Assume a weblog application has User and Post objects. # 1: Create the migrations for these objects

classCreateUsers<ActiveRecord::Migrationdefself.upcreate_table:users, :force=>truedo|t|...t.userstamps# use t.userstamps(true) if you also want 'deleter_id'endenddefself.downdrop_table:usersendendclassCreatePosts<ActiveRecord::Migrationdefself.upcreate_table:posts, :force=>truedo|t|...t.userstamps# use t.userstamps(true) if you also want 'deleter_id'endenddefself.downdrop_table:postsendend

# 2: Users are going to manipulate Post’s, use the model_stamper:

classUser<ActiveRecord::Basemodel_stamperend

# 3: Set the current user in the ApplicationController:

classApplicationController<ActionController::BaseincludeUserstampend

More than likely you want all your associations setup on your stamped objects, and that’s where the stampable class method comes in. So in our example we’ll want to use this method in both our User and Post classes:

classUser<ActiveRecord::Basemodel_stamperstampableendclassPost<ActiveRecord::Basestampableend

Okay, so what all have we done? The model_stamper class method injects two methods into the User class. They are #stamper= and #stamper and look like this:

defstamper=(object)
object_stamper = ifobject.is_a?(ActiveRecord::Base)
object.send("#{object.class.primary_key}".to_sym)
elseobjectendThread.current["#{self.to_s.downcase}_#{self.object_id}_stamper"] = object_stamperenddefstamperThread.current["#{self.to_s.downcase}_#{self.object_id}_stamper"]
end

The stampable method allows you to customize what columns will get stamped, and also creates the creator, updater, and deleter associations.

The Userstamp module that we included into our ApplicationController uses the setter method to set which user is currently making the request. By default the ‘set_stampers’ method works perfectly with the RestfulAuthentication plug-in:

defset_stampersUser.stamper = self.current_userend

If you aren’t using ActsAsAuthenticated, then you need to create your own version of the set_stampers method in the controller where you’ve included the Userstamp module.

Now, let’s get back to the Stampable module (since it really is the interesting one). The Stampable module sets up before_* filters that are responsible for setting those attributes at the appropriate times. It also creates the belongs_to relationships for you.

If you need to customize the columns that are stamped, the stampable method can be completely customized. Here’s an quick example:

class Post < ActiveRecord::Base
stampable :stamper_class_name => :person,
:creator_attribute => :create_user,
:updater_attribute => :update_user,
:deleter_attribute => :delete_user,

:deleter => true

end
# config/environment.rbDdb::Userstamp.compatibility_mode = true

Example userstamp application

All: rake
One: ruby test/compatibility_stamping_test.rb

DeLynn Berry

The original idea for this plugin came from the Rails Wiki article entitled Extending ActiveRecord.

About

Adds originator attributes to your ActiveRecord models.

Resources

Stars

0 stars

Watchers

4 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

This is a fork of the grosser fork [github.com/grosser/userstamp] of the original userstamp plugin created by delynn [github.com/delynn/userstamp].

This fork has been created to combine the grosser changes that enable use of the plugin within applications that perform soft deletes but are not using the acts_as_paranoid plugin/gem (for example this fork can now be used in conjunction with the rails3_acts_as_paranoid plugin/gem [github.com/goncalossilva/rails3_acts_as_paranoid]).

This fork also includes changes to perform the model stamping before validation is performed so that the model can enforce the presence of stamp attribute values eg.

validates:created_by, presence:truevalidates:updated_by, presence:true

To use this fork add the following to your application gemfile:

gem'originator', github:'AlchemyCMS/originator'

Userstamp extends ActiveRecord::Base to add automatic updating of ‘creator’, ‘updater’, and ‘deleter’ attributes. It is based loosely on the ActiveRecord::Timestamp module.

Two class methods (model_stamper and stampable) are implemented in this plugin. The model_stamper method is used in models that are responsible for creating, updating, or deleting other objects. The stampable method is used in models that are subject to being created, updated, or deleted by ‘stampers’.

The assumption is that you have two different categories of objects; those that manipulate, and those that are manipulated. For those objects that are being manipulated there’s the Stampable module and for the manipulators there’s the Stamper module. There’s also the actual Userstamp module for your controllers that assists in setting up your environment on a per request basis.

Assume a weblog application has User and Post objects. # 1: Create the migrations for these objects

classCreateUsers<ActiveRecord::Migrationdefself.upcreate_table:users, :force=>truedo|t|...t.userstamps# use t.userstamps(true) if you also want 'deleter_id'endenddefself.downdrop_table:usersendendclassCreatePosts<ActiveRecord::Migrationdefself.upcreate_table:posts, :force=>truedo|t|...t.userstamps# use t.userstamps(true) if you also want 'deleter_id'endenddefself.downdrop_table:postsendend

# 2: Users are going to manipulate Post’s, use the model_stamper:

classUser<ActiveRecord::Basemodel_stamperend

# 3: Set the current user in the ApplicationController:

classApplicationController<ActionController::BaseincludeUserstampend

More than likely you want all your associations setup on your stamped objects, and that’s where the stampable class method comes in. So in our example we’ll want to use this method in both our User and Post classes:

classUser<ActiveRecord::Basemodel_stamperstampableendclassPost<ActiveRecord::Basestampableend

Okay, so what all have we done? The model_stamper class method injects two methods into the User class. They are #stamper= and #stamper and look like this:

defstamper=(object)
object_stamper = ifobject.is_a?(ActiveRecord::Base)
object.send("#{object.class.primary_key}".to_sym)
elseobjectendThread.current["#{self.to_s.downcase}_#{self.object_id}_stamper"] = object_stamperenddefstamperThread.current["#{self.to_s.downcase}_#{self.object_id}_stamper"]
end

The stampable method allows you to customize what columns will get stamped, and also creates the creator, updater, and deleter associations.

The Userstamp module that we included into our ApplicationController uses the setter method to set which user is currently making the request. By default the ‘set_stampers’ method works perfectly with the RestfulAuthentication plug-in:

defset_stampersUser.stamper = self.current_userend

If you aren’t using ActsAsAuthenticated, then you need to create your own version of the set_stampers method in the controller where you’ve included the Userstamp module.

Now, let’s get back to the Stampable module (since it really is the interesting one). The Stampable module sets up before_* filters that are responsible for setting those attributes at the appropriate times. It also creates the belongs_to relationships for you.

If you need to customize the columns that are stamped, the stampable method can be completely customized. Here’s an quick example:

class Post < ActiveRecord::Base
stampable :stamper_class_name => :person,
:creator_attribute => :create_user,
:updater_attribute => :update_user,
:deleter_attribute => :delete_user,

:deleter => true

end
# config/environment.rbDdb::Userstamp.compatibility_mode = true

Example userstamp application

All: rake
One: ruby test/compatibility_stamping_test.rb

DeLynn Berry

The original idea for this plugin came from the Rails Wiki article entitled Extending ActiveRecord.

About

Adds originator attributes to your ActiveRecord models.

Resources

Stars

0 stars

Watchers

4 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

This is a fork of the grosser fork [github.com/grosser/userstamp] of the original userstamp plugin created by delynn [github.com/delynn/userstamp].

This fork has been created to combine the grosser changes that enable use of the plugin within applications that perform soft deletes but are not using the acts_as_paranoid plugin/gem (for example this fork can now be used in conjunction with the rails3_acts_as_paranoid plugin/gem [github.com/goncalossilva/rails3_acts_as_paranoid]).

This fork also includes changes to perform the model stamping before validation is performed so that the model can enforce the presence of stamp attribute values eg.

validates:created_by, presence:truevalidates:updated_by, presence:true

To use this fork add the following to your application gemfile:

gem'originator', github:'AlchemyCMS/originator'

Userstamp extends ActiveRecord::Base to add automatic updating of ‘creator’, ‘updater’, and ‘deleter’ attributes. It is based loosely on the ActiveRecord::Timestamp module.

Two class methods (model_stamper and stampable) are implemented in this plugin. The model_stamper method is used in models that are responsible for creating, updating, or deleting other objects. The stampable method is used in models that are subject to being created, updated, or deleted by ‘stampers’.

The assumption is that you have two different categories of objects; those that manipulate, and those that are manipulated. For those objects that are being manipulated there’s the Stampable module and for the manipulators there’s the Stamper module. There’s also the actual Userstamp module for your controllers that assists in setting up your environment on a per request basis.

Assume a weblog application has User and Post objects. # 1: Create the migrations for these objects

classCreateUsers<ActiveRecord::Migrationdefself.upcreate_table:users, :force=>truedo|t|...t.userstamps# use t.userstamps(true) if you also want 'deleter_id'endenddefself.downdrop_table:usersendendclassCreatePosts<ActiveRecord::Migrationdefself.upcreate_table:posts, :force=>truedo|t|...t.userstamps# use t.userstamps(true) if you also want 'deleter_id'endenddefself.downdrop_table:postsendend

# 2: Users are going to manipulate Post’s, use the model_stamper:

classUser<ActiveRecord::Basemodel_stamperend

# 3: Set the current user in the ApplicationController:

classApplicationController<ActionController::BaseincludeUserstampend

More than likely you want all your associations setup on your stamped objects, and that’s where the stampable class method comes in. So in our example we’ll want to use this method in both our User and Post classes:

classUser<ActiveRecord::Basemodel_stamperstampableendclassPost<ActiveRecord::Basestampableend

Okay, so what all have we done? The model_stamper class method injects two methods into the User class. They are #stamper= and #stamper and look like this:

defstamper=(object)
object_stamper = ifobject.is_a?(ActiveRecord::Base)
object.send("#{object.class.primary_key}".to_sym)
elseobjectendThread.current["#{self.to_s.downcase}_#{self.object_id}_stamper"] = object_stamperenddefstamperThread.current["#{self.to_s.downcase}_#{self.object_id}_stamper"]
end

The stampable method allows you to customize what columns will get stamped, and also creates the creator, updater, and deleter associations.

The Userstamp module that we included into our ApplicationController uses the setter method to set which user is currently making the request. By default the ‘set_stampers’ method works perfectly with the RestfulAuthentication plug-in:

defset_stampersUser.stamper = self.current_userend

If you aren’t using ActsAsAuthenticated, then you need to create your own version of the set_stampers method in the controller where you’ve included the Userstamp module.

Now, let’s get back to the Stampable module (since it really is the interesting one). The Stampable module sets up before_* filters that are responsible for setting those attributes at the appropriate times. It also creates the belongs_to relationships for you.

If you need to customize the columns that are stamped, the stampable method can be completely customized. Here’s an quick example:

class Post < ActiveRecord::Base
stampable :stamper_class_name => :person,
:creator_attribute => :create_user,
:updater_attribute => :update_user,
:deleter_attribute => :delete_user,

:deleter => true

end
# config/environment.rbDdb::Userstamp.compatibility_mode = true

Example userstamp application

All: rake
One: ruby test/compatibility_stamping_test.rb

DeLynn Berry

The original idea for this plugin came from the Rails Wiki article entitled Extending ActiveRecord.

About

Adds originator attributes to your ActiveRecord models.

Resources

Stars

0 stars

Watchers

4 watching

Forks

Releases

Packages

Used by

Contributors

Languages