simple_notification 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 3da0d1777ac57828b42209ff9c547d53e3434942
4
+ data.tar.gz: 75169ab04af06a1c0bd1f7120cc1c9b987ccbc83
5
+ SHA512:
6
+ metadata.gz: a88d7348f157926aebf3a2a57a699699fd6146b61d1f2b328cbf4f29506b9a979f890816a0a2845e758ce01d40c4590de746b8636e480d8feefc6e8d1ced251b
7
+ data.tar.gz: 5ec6d6c2dd426ce4308ed125b047ae259a705d0a8179b58c8e6bb8f7dccc4ee09bbaa9a6fc65fa74c3e626043ce563d7f71afc8f1dde05976491bdb0854ee5d1
data/.gitignore ADDED
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in simple_notification.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2014 Cong Wang
2
+
3
+ MIT License
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,86 @@
1
+ # SimpleNotification
2
+
3
+ SimpleNotification is a user notification system using tracked events. Event has a owner, recipient, trackable source, and a message.
4
+
5
+ ## Assumptions
6
+
7
+ SimpleNotification assumes a user systems is in place which uses the User model and has the current_user helper.
8
+
9
+ SimpleNotification also assumes that the Notification model is not taken.
10
+
11
+ ## Installation
12
+
13
+ Add this line to your application's Gemfile:
14
+
15
+ gem 'simple_notification'
16
+
17
+ And then execute:
18
+
19
+ $ bundle
20
+
21
+ Or install it yourself as:
22
+
23
+ $ gem install simple_notification
24
+
25
+ ## Usage
26
+
27
+ SimpleNotification generates the files in the /app folder, feel free to tweak it to fit specific needs.
28
+
29
+ First generate the necessary files:
30
+
31
+ $ rails g simple_notification
32
+
33
+ Add the routes for the view in /config/routes.rb:
34
+
35
+ resources :notifications
36
+
37
+ Add the following to /app/models/user.rb:
38
+
39
+ has_notifications
40
+
41
+ Add the following to any models that needs to be tracked:
42
+
43
+ can_be_tracked
44
+
45
+ And finally, add the following to /app/controllers/application_controller.rb:
46
+
47
+ include SimpleNotification::Methods
48
+
49
+ Now the setup is complete, the following are available:
50
+
51
+ Notifications generated by a user's activities:
52
+
53
+ @user.own_notifications
54
+
55
+ Notifications meant for a user:
56
+
57
+ @user.received_notifications
58
+
59
+ one can add .where(read: false) to obtain unread notifications
60
+
61
+ Method to **notify** a user of a tracked event:
62
+
63
+ notify(recipient, trackable, message)
64
+
65
+ which will generate a notification from current_user (guest if undefined) to the recipient with the message and trackable source.
66
+
67
+ Notifications are now working and can be displayed however desired, sample usages are:
68
+
69
+ render "notifications/show", notification_id: notification.id, read: false
70
+ render "notifications/show", notification_id: notification.id, read: true
71
+
72
+ Will will generate the following by default:
73
+
74
+ **Owner** message **Trackable** | This notification was sent to **Recipient** | Destroy
75
+
76
+ ## Contributing
77
+
78
+ 1. Fork it ( http://github.com/<my-github-username>/simple_notification/fork )
79
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
80
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
81
+ 4. Push to the branch (`git push origin my-new-feature`)
82
+ 5. Create new Pull Request
83
+
84
+ ## License
85
+
86
+ MIT License
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -0,0 +1,8 @@
1
+ Description:
2
+ Explain the generator
3
+
4
+ Example:
5
+ rails generate simple_notification Thing
6
+
7
+ This will create:
8
+ what/will/it/create
@@ -0,0 +1,39 @@
1
+ require 'rails/generators'
2
+ require 'rails/generators/migration'
3
+ require 'rails/generators/active_record'
4
+
5
+ class SimpleNotificationGenerator < Rails::Generators::Base
6
+ source_root File.expand_path('../templates', __FILE__)
7
+ include Rails::Generators::Migration
8
+
9
+ def generate_migration
10
+ migration_template "create_notifications.rb.erb", "db/migrate/create_notifications.rb"
11
+ end
12
+
13
+ def generate_model
14
+ copy_file "notification.rb", "app/models/notification.rb"
15
+ end
16
+
17
+ def generate_controller
18
+ copy_file "notifications_controller.rb", "app/controllers/notifications_controller.rb"
19
+ end
20
+
21
+ def generate_view
22
+ empty_directory "app/views/notifications"
23
+ copy_file "notifications_index.html.haml", "app/views/notifications/index.html.haml"
24
+ copy_file "notifications_partial.html.haml", "app/views/notifications/_show.html.haml"
25
+ copy_file "notifications_css.css.scss", "app/assets/stylesheets/notifications.css.scss"
26
+ end
27
+
28
+ private
29
+
30
+ def self.next_migration_number( dirname )
31
+ next_migration_number = current_migration_number(dirname) + 1
32
+ if ActiveRecord::Base.timestamped_migrations
33
+ [Time.now.utc.strftime("%Y%m%d%H%M%S%6N"), "%.20d" % next_migration_number].max
34
+ else
35
+ "%.3d" % next_migration_number
36
+ end
37
+ end
38
+ end
39
+
@@ -0,0 +1,14 @@
1
+ class CreateNotifications < ActiveRecord::Migration
2
+ def change
3
+ create_table :notifications do |t|
4
+ t.integer :owner_id
5
+ t.integer :recipient_id
6
+ t.integer :trackable_id
7
+ t.string :trackable_type
8
+ t.string :message
9
+ t.boolean :read, default: false
10
+
11
+ t.timestamps
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,6 @@
1
+ class Notification < ActiveRecord::Base
2
+ belongs_to :owner, class_name: "User"
3
+ belongs_to :recipient, class_name: "User"
4
+ belongs_to :trackable, polymorphic: :true
5
+
6
+ end
@@ -0,0 +1,38 @@
1
+ class NotificationsController < ApplicationController
2
+ before_action :set_notification, only: [:show, :edit, :update, :destroy]
3
+
4
+ # GET /notifications
5
+ # GET /notifications.json
6
+ def index
7
+ @notifications = Notification.all
8
+ end
9
+
10
+ # POST /notifications
11
+ # POST /notifications.json
12
+ def create
13
+ @notification = Notification.new(notification_params)
14
+ @notification.save
15
+ redirect_to :back
16
+ end
17
+
18
+ # DELETE /notifications/1
19
+ # DELETE /notifications/1.json
20
+ def destroy
21
+ @notification.destroy
22
+ respond_to do |format|
23
+ format.html { redirect_to :back }
24
+ format.json { head :no_content }
25
+ end
26
+ end
27
+
28
+ private
29
+ # Use callbacks to share common setup or constraints between actions.
30
+ def set_notification
31
+ @notification = Notification.find(params[:id])
32
+ end
33
+
34
+ # Never trust parameters from the scary internet, only allow the white list through.
35
+ def notification_params
36
+ params.require(:notification).permit(:owner_id, :recipient_id, :trackable_id, :trackable_type, :message, :read)
37
+ end
38
+ end
@@ -0,0 +1,4 @@
1
+ %h1 Listing All Notifications
2
+
3
+ - @notifications.each do |notification|
4
+ = render "notifications/show", notification_id: notification.id, read: true
@@ -0,0 +1,31 @@
1
+ - @notification = Notification.find(notification_id)
2
+ - if read
3
+ - @notification.read = true
4
+ - @notification.save
5
+ .notification
6
+ %p
7
+ - if @notification.owner == nil
8
+ %b Guest
9
+ - else
10
+ %b
11
+ = link_to @notification.owner do
12
+ = @notification.owner.username
13
+
14
+ = @notification.message
15
+
16
+ - if @notification.trackable == nil
17
+ %b which has since been deleted
18
+ - else
19
+ %b
20
+ = link_to @notification.trackable do
21
+ = @notification.trackable_type
22
+ \|
23
+ This notification was sent to
24
+ - if @notification.recipient == nil
25
+ %b Deleted User
26
+ - else
27
+ %b
28
+ = link_to @notification.recipient do
29
+ = @notification.recipient.username
30
+ \|
31
+ = link_to 'Destroy', @notification, :method => :delete, :data => { :confirm => 'Are you sure?' }
@@ -0,0 +1,6 @@
1
+ require "simple_notification/version"
2
+ require "simple_notification/has_notifications"
3
+ require "simple_notification/can_be_tracked"
4
+
5
+ module SimpleNotification
6
+ end
@@ -0,0 +1,21 @@
1
+ module SimpleNotification
2
+ module Methods
3
+ def notify(recipient, trackable, message)
4
+ owner = current_user
5
+ owner = User.new if owner == nil
6
+
7
+ if owner == recipient
8
+ return
9
+ end
10
+
11
+ notification = Notification.create(owner_id: owner.id, recipient_id: recipient.id, message: message)
12
+ trackable.notifications << notification
13
+ end
14
+ end
15
+ end
16
+
17
+ class << ActiveRecord::Base
18
+ def can_be_tracked
19
+ has_many :notifications, as: :trackable
20
+ end
21
+ end
@@ -0,0 +1,6 @@
1
+ class << ActiveRecord::Base
2
+ def has_notifications
3
+ has_many :own_notifications, class_name: "Notification", foreign_key: :owner_id
4
+ has_many :received_notifications, class_name: "Notification", foreign_key: :recipient_id
5
+ end
6
+ end
@@ -0,0 +1,3 @@
1
+ module SimpleNotification
2
+ VERSION = "0.0.4"
3
+ end
@@ -0,0 +1,23 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'simple_notification/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "simple_notification"
8
+ spec.version = SimpleNotification::VERSION
9
+ spec.authors = ["Cong Wang"]
10
+ spec.email = ["findcongwang@gmail.com"]
11
+ spec.summary = %q{Simple user notification module.}
12
+ spec.description = %q{User notification system assuming user systems is built using the User model and has current_user helper. This gem uses the Notification model so must not be taken.}
13
+ spec.homepage = "https://github.com/findcongwang"
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files -z`.split("\x0")
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_development_dependency "bundler", "~> 1.5"
22
+ spec.add_development_dependency "rake", "~> 0"
23
+ end
metadata ADDED
@@ -0,0 +1,92 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: simple_notification
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.4
5
+ platform: ruby
6
+ authors:
7
+ - Cong Wang
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-04-17 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.5'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.5'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ description: User notification system assuming user systems is built using the User
42
+ model and has current_user helper. This gem uses the Notification model so must
43
+ not be taken.
44
+ email:
45
+ - findcongwang@gmail.com
46
+ executables: []
47
+ extensions: []
48
+ extra_rdoc_files: []
49
+ files:
50
+ - ".gitignore"
51
+ - Gemfile
52
+ - LICENSE.txt
53
+ - README.md
54
+ - Rakefile
55
+ - lib/generators/simple_notification/USAGE
56
+ - lib/generators/simple_notification/simple_notification_generator.rb
57
+ - lib/generators/simple_notification/templates/create_notifications.rb.erb
58
+ - lib/generators/simple_notification/templates/notification.rb
59
+ - lib/generators/simple_notification/templates/notifications_controller.rb
60
+ - lib/generators/simple_notification/templates/notifications_css.css.scss
61
+ - lib/generators/simple_notification/templates/notifications_index.html.haml
62
+ - lib/generators/simple_notification/templates/notifications_partial.html.haml
63
+ - lib/simple_notification.rb
64
+ - lib/simple_notification/can_be_tracked.rb
65
+ - lib/simple_notification/has_notifications.rb
66
+ - lib/simple_notification/version.rb
67
+ - simple_notification.gemspec
68
+ homepage: https://github.com/findcongwang
69
+ licenses:
70
+ - MIT
71
+ metadata: {}
72
+ post_install_message:
73
+ rdoc_options: []
74
+ require_paths:
75
+ - lib
76
+ required_ruby_version: !ruby/object:Gem::Requirement
77
+ requirements:
78
+ - - ">="
79
+ - !ruby/object:Gem::Version
80
+ version: '0'
81
+ required_rubygems_version: !ruby/object:Gem::Requirement
82
+ requirements:
83
+ - - ">="
84
+ - !ruby/object:Gem::Version
85
+ version: '0'
86
+ requirements: []
87
+ rubyforge_project:
88
+ rubygems_version: 2.2.1
89
+ signing_key:
90
+ specification_version: 4
91
+ summary: Simple user notification module.
92
+ test_files: []