site_announcements 1.3
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.
- checksums.yaml +7 -0
- data/.gitignore +3 -0
- data/BSD-LICENSE +24 -0
- data/Gemfile +3 -0
- data/README.rdoc +13 -0
- data/Rakefile +23 -0
- data/app/controllers/site_announcements_controller.rb +119 -0
- data/app/helpers/site_announcements_helper.rb +25 -0
- data/app/models/notifiee_info.rb +18 -0
- data/app/models/site_announcement.rb +35 -0
- data/app/models/site_announcement_category.rb +4 -0
- data/app/views/site_announcements/_feed_announcement.html.erb +11 -0
- data/app/views/site_announcements/_feed_announcements.html.erb +11 -0
- data/app/views/site_announcements/_form.html.erb +46 -0
- data/app/views/site_announcements/_headline_announcement.erb +6 -0
- data/app/views/site_announcements/_site_announcement.html.erb +21 -0
- data/app/views/site_announcements/edit.html.erb +15 -0
- data/app/views/site_announcements/feed.atom.builder +22 -0
- data/app/views/site_announcements/index.html.erb +3 -0
- data/app/views/site_announcements/new.html.erb +8 -0
- data/app/views/site_announcements/notification_settings.html.erb +18 -0
- data/app/views/site_announcements/show.html.erb +3 -0
- data/config/routes.rb +11 -0
- data/generators/site_announcements/USAGE +8 -0
- data/generators/site_announcements/site_announcements_generator.rb +7 -0
- data/generators/site_announcements/templates/migration.rb +40 -0
- data/install.rb +1 -0
- data/lib/site_announcements.rb +44 -0
- data/lib/site_announcements/engine.rb +5 -0
- data/lib/tasks/site_announcements_tasks.rake +4 -0
- data/site_announcements.gemspec +12 -0
- data/test/database.yml +3 -0
- data/test/fixtures/site_announcements.yml +25 -0
- data/test/functional/site_announcements_controller_test.rb +18 -0
- data/test/schema.rb +31 -0
- data/test/test_helper.rb +40 -0
- data/test/unit/notifiee_info_test.rb +49 -0
- data/test/unit/site_announcements_test.rb +59 -0
- data/uninstall.rb +1 -0
- metadata +95 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 71ab6594ab5984ab674a4ad0cd16d413096142e9
|
4
|
+
data.tar.gz: 241473e50508528b6271ee824d09fb72dbb07d1c
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 38e693ab003c3289f4eb9a3e7571ab506ab63b284a014b8a7740b95bac94e43b66c7de6b964e263ecd203fb082e387fd50f503c66981cc1e21a04296c0c11365
|
7
|
+
data.tar.gz: ac2966d9b65ed2d2e68367bbad7aa93955cca4341434e37975cf684d90dc652c5b066de63bfb9ab778153778a348ea8c77fa22ce7ee519c2ef57d75b942fd0df
|
data/.gitignore
ADDED
data/BSD-LICENSE
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
Copyright (c) 2009, University of Manchester & HITS gGmbH
|
2
|
+
All rights reserved.
|
3
|
+
|
4
|
+
|
5
|
+
Redistribution and use in source and binary forms, with or without modification,
|
6
|
+
are permitted provided that the following conditions are met:
|
7
|
+
|
8
|
+
* Redistributions of source code must retain the above copyright notice, this list of conditions
|
9
|
+
and the following disclaimer.
|
10
|
+
* Redistributions in binary form must reproduce the above copyright notice, this list of conditions
|
11
|
+
and the following disclaimer in the documentation and/or other materials provided with the distribution.
|
12
|
+
* Neither the name of the University of Manchester or EML Research gGmbH,
|
13
|
+
nor the names of its contributors may be used to endorse or promote products
|
14
|
+
derived from this software without specific prior written permission.
|
15
|
+
|
16
|
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
17
|
+
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
|
18
|
+
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
19
|
+
IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
20
|
+
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
21
|
+
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
22
|
+
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
23
|
+
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
24
|
+
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
data/Gemfile
ADDED
data/README.rdoc
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
= site_announcements Gem
|
2
|
+
== Install
|
3
|
+
Put this line into Gemfile:
|
4
|
+
gem 'site_announcements', :git => 'git://github.com/quyen/site_announcements.git'
|
5
|
+
|
6
|
+
== Introduction
|
7
|
+
Introduction goes here.
|
8
|
+
|
9
|
+
== Usage
|
10
|
+
Usage goes here.
|
11
|
+
|
12
|
+
|
13
|
+
Copyright (c) 2010 [name of plugin creator], released under the MIT license
|
data/Rakefile
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'rake'
|
2
|
+
require 'rake/testtask'
|
3
|
+
require 'rdoc/task'
|
4
|
+
|
5
|
+
desc 'Default: run unit tests.'
|
6
|
+
task :default => :test
|
7
|
+
|
8
|
+
desc 'Test the site_announcements plugin.'
|
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
|
+
|
16
|
+
desc 'Generate documentation for the site_announcements plugin.'
|
17
|
+
Rake::RDocTask.new(:rdoc) do |rdoc|
|
18
|
+
rdoc.rdoc_dir = 'rdoc'
|
19
|
+
rdoc.title = 'SiteAnnouncements'
|
20
|
+
rdoc.options << '--line-numbers' << '--inline-source'
|
21
|
+
rdoc.rdoc_files.include('README')
|
22
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
23
|
+
end
|
@@ -0,0 +1,119 @@
|
|
1
|
+
class SiteAnnouncementsController < ApplicationController
|
2
|
+
before_filter :login_required, :except=>[:feed,:notification_settings,:update_notification_settings]
|
3
|
+
|
4
|
+
before_filter :check_manage_announcements,:only=>[:new,:create,:edit,:update,:destroy]
|
5
|
+
|
6
|
+
def feed
|
7
|
+
limit=params[:limit]
|
8
|
+
limit||=10
|
9
|
+
@site_announcements=SiteAnnouncement.feed_announcements :limit=>limit
|
10
|
+
respond_to do |format|
|
11
|
+
format.atom
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def update_notification_settings
|
16
|
+
receive_notifications = params[:receive_notifications]
|
17
|
+
receive_notifications ||= false
|
18
|
+
@info = NotifieeInfo.find_by_unique_key(params[:key])
|
19
|
+
@info.receive_notifications = receive_notifications unless @info.nil?
|
20
|
+
respond_to do |format|
|
21
|
+
if @info && @info.save
|
22
|
+
flash[:notice]="Email announcement setting updated. You will now #{"not " if !@info.receive_notifications?}receive notification emails."
|
23
|
+
format.html { redirect_to(root_url) }
|
24
|
+
else
|
25
|
+
flash[:error]="Unable to update your settings"
|
26
|
+
flash[:error]+=", the key presented wasn't recognised."
|
27
|
+
format.html { render :action => :notification_settings}
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def destroy
|
33
|
+
@site_announcement=SiteAnnouncement.find(params[:id])
|
34
|
+
|
35
|
+
respond_to do |format|
|
36
|
+
if @site_announcement.destroy
|
37
|
+
flash[:notice]="Announcement destroyed"
|
38
|
+
format.html {redirect_to site_announcements_path}
|
39
|
+
else
|
40
|
+
flash[:error]="There was a problem destroying the announcement"
|
41
|
+
format.html { render :action=>:edit }
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def notification_settings
|
47
|
+
|
48
|
+
@info=NotifieeInfo.find_by_unique_key(params[:key])
|
49
|
+
|
50
|
+
respond_to do |format|
|
51
|
+
if @info.nil?
|
52
|
+
flash[:error]="Invalid Key"
|
53
|
+
format.html{ redirect_to root_url }
|
54
|
+
else
|
55
|
+
format.html
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
end
|
60
|
+
|
61
|
+
def new
|
62
|
+
@site_announcement=SiteAnnouncement.new
|
63
|
+
end
|
64
|
+
|
65
|
+
def create
|
66
|
+
@site_announcement=SiteAnnouncement.new(params[:site_announcement])
|
67
|
+
@site_announcement.announcer = current_person
|
68
|
+
|
69
|
+
respond_to do |format|
|
70
|
+
if @site_announcement.save
|
71
|
+
flash[:notice] = 'The Announcement was successfully announced.'
|
72
|
+
format.html { redirect_to(@site_announcement) }
|
73
|
+
format.xml { render :xml => @site_announcement, :status => :created, :location => @site_announcement }
|
74
|
+
else
|
75
|
+
format.html { render :action => "new" }
|
76
|
+
format.xml { render :xml => @site_announcement.errors, :status => :unprocessable_entity }
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
def edit
|
82
|
+
@site_announcement=SiteAnnouncement.find(params[:id])
|
83
|
+
end
|
84
|
+
|
85
|
+
def update
|
86
|
+
@site_announcement=SiteAnnouncement.find(params[:id])
|
87
|
+
|
88
|
+
respond_to do |format|
|
89
|
+
if @site_announcement.update_attributes(params[:site_announcement])
|
90
|
+
flash[:notice] = 'Announcement was successfully updated.'
|
91
|
+
format.html { redirect_to(@site_announcement) }
|
92
|
+
format.xml { head :ok }
|
93
|
+
else
|
94
|
+
format.html { render :action => "edit" }
|
95
|
+
format.xml { render :xml => @site_announcement.errors, :status => :unprocessable_entity }
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
def show
|
101
|
+
@site_announcement=SiteAnnouncement.find(params[:id])
|
102
|
+
end
|
103
|
+
|
104
|
+
def index
|
105
|
+
if params[:feed_only]
|
106
|
+
@site_announcements=SiteAnnouncement.feed_announcements(:limit=>1000)
|
107
|
+
else
|
108
|
+
@site_announcements=SiteAnnouncement.order("created_at DESC")
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
def check_manage_announcements
|
113
|
+
if !can_manage_announcements?
|
114
|
+
flash[:error] = "Admin rights required"
|
115
|
+
redirect_to root_url
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
|
2
|
+
|
3
|
+
module SiteAnnouncementsHelper
|
4
|
+
|
5
|
+
def site_annoucements_headline
|
6
|
+
headline = SiteAnnouncement.headline_announcement
|
7
|
+
return "" unless headline #return empty string if there is no announcement
|
8
|
+
return render :partial=>"site_announcements/headline_announcement",:object=>headline
|
9
|
+
end
|
10
|
+
|
11
|
+
def site_announcements_feed options
|
12
|
+
options[:limit]||=5
|
13
|
+
announcements = SiteAnnouncement.feed_announcements :limit=>options[:limit]
|
14
|
+
return render :partial=>"site_announcements/feed_announcements",:object=>announcements,:locals=>{:truncate_length=>options[:truncate_length],:limit=>options[:limit]}
|
15
|
+
end
|
16
|
+
|
17
|
+
def site_announcement_attributes announcement
|
18
|
+
attr=[]
|
19
|
+
attr << "show in feed" if announcement.show_in_feed?
|
20
|
+
attr << "headline" if announcement.is_headline?
|
21
|
+
attr << "mail" if announcement.email_notification?
|
22
|
+
attr
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'uuid'
|
2
|
+
|
3
|
+
class NotifieeInfo < ActiveRecord::Base
|
4
|
+
belongs_to :notifiee,:polymorphic=>true
|
5
|
+
validates_presence_of :notifiee
|
6
|
+
|
7
|
+
|
8
|
+
before_save :check_unique_key
|
9
|
+
|
10
|
+
private
|
11
|
+
|
12
|
+
def check_unique_key
|
13
|
+
if self.unique_key.nil? || self.unique_key.blank?
|
14
|
+
self.unique_key = UUID.generate
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
class SiteAnnouncement < ActiveRecord::Base
|
2
|
+
|
3
|
+
class BodyHelper
|
4
|
+
include ActionView::Helpers::TextHelper
|
5
|
+
include ActionView::Helpers::TagHelper
|
6
|
+
include ActionView::Helpers::UrlHelper
|
7
|
+
end
|
8
|
+
|
9
|
+
belongs_to :site_announcement_category
|
10
|
+
belongs_to :announcer,:polymorphic=>true
|
11
|
+
|
12
|
+
scope :headline_announcements,:conditions=>(["is_headline = ? and expires_at > ? ",true,Time.now]),:order=>"created_at DESC",:limit=>1
|
13
|
+
|
14
|
+
validates_presence_of :title
|
15
|
+
|
16
|
+
def self.headline_announcement
|
17
|
+
self.headline_announcements.first
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.feed_announcements options={}
|
21
|
+
options[:limit] ||= 5
|
22
|
+
self.where(["show_in_feed = ?",true]).order("created_at DESC").limit(options[:limit])
|
23
|
+
end
|
24
|
+
|
25
|
+
def body_html
|
26
|
+
helper.simple_format(helper.auto_link(body,:sanitize=>true),{},:sanitize=>true).html_safe
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
def helper
|
32
|
+
@helper ||= BodyHelper.new
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
<%
|
2
|
+
show_seperator||=false
|
3
|
+
%>
|
4
|
+
<li class="feed_announcement">
|
5
|
+
<span class="announcement_title"><%= link_to(h(feed_announcement.title),feed_announcement) -%></span>
|
6
|
+
<span class="announcement_date"><%= time_ago_in_words(feed_announcement.created_at)+" ago" -%></span>
|
7
|
+
<span class="announcement_announcer"> by <%= link_to h(feed_announcement.announcer.name), feed_announcement.announcer -%></span>
|
8
|
+
<% if show_seperator -%>
|
9
|
+
<div class="announcement_seperator"></div>
|
10
|
+
<% end -%>
|
11
|
+
</li>
|
@@ -0,0 +1,11 @@
|
|
1
|
+
|
2
|
+
<ul class="feed_announcement_list">
|
3
|
+
<%= render :partial => "site_announcements/feed_announcement",:collection=>feed_announcements,:locals=>{:truncate_length=>truncate_length,:show_seperator=>true} %>
|
4
|
+
<li class="feed_announcement">
|
5
|
+
<% if SiteAnnouncement.count > limit -%>
|
6
|
+
<center>
|
7
|
+
<span class="announcement_title"><%= link_to "See all",site_announcements_path(:feed_only=>true) -%></span>
|
8
|
+
</center>
|
9
|
+
<% end -%>
|
10
|
+
</li>
|
11
|
+
</ul>
|
@@ -0,0 +1,46 @@
|
|
1
|
+
<%= f.error_messages -%>
|
2
|
+
<p>
|
3
|
+
<%= f.label :title -%>
|
4
|
+
<br/>
|
5
|
+
<%= f.text_field :title,:size=>75 -%>
|
6
|
+
</p>
|
7
|
+
<p>
|
8
|
+
<%= f.label :body -%>
|
9
|
+
<br/>
|
10
|
+
<%= f.text_area :body, :rows=>20,:cols=>75 -%>
|
11
|
+
</p>
|
12
|
+
<p>
|
13
|
+
<%= f.label :show_in_feed -%>
|
14
|
+
<%= f.check_box :show_in_feed -%>
|
15
|
+
</p>
|
16
|
+
<p>
|
17
|
+
<%= f.label :is_headline,"Headline announcement" -%>
|
18
|
+
<%= f.check_box :is_headline,{:onchange=>"toggle_expires_at();"} -%>
|
19
|
+
<div id="announcement_expires" style="display: none;">
|
20
|
+
<%= f.label :expires,"Expires at" -%>
|
21
|
+
<br/>
|
22
|
+
<%= datetime_select "site_announcement","expires_at" -%>
|
23
|
+
<br/>
|
24
|
+
<span class="headline_announcement_date">( Current server time is <%= Time.now.utc -%> )</span>
|
25
|
+
</div>
|
26
|
+
</p>
|
27
|
+
<p>
|
28
|
+
<%= f.label :email_notification -%>
|
29
|
+
<% if edit -%>
|
30
|
+
<%= f.check_box :email_notification, :disabled=>true -%>
|
31
|
+
<% else -%>
|
32
|
+
<%= f.check_box :email_notification -%>
|
33
|
+
<% end -%>
|
34
|
+
</p>
|
35
|
+
<script type="text/javascript">
|
36
|
+
function toggle_expires_at(){
|
37
|
+
if ($("site_announcement_is_headline").checked) {
|
38
|
+
Effect.Appear("announcement_expires");
|
39
|
+
}
|
40
|
+
else {
|
41
|
+
Effect.Fade("announcement_expires")
|
42
|
+
}
|
43
|
+
}
|
44
|
+
|
45
|
+
toggle_expires_at();
|
46
|
+
</script>
|
@@ -0,0 +1,6 @@
|
|
1
|
+
<% if can_manage_announcements? -%>
|
2
|
+
<span class="headline_announcement_edit"><%= link_to "Edit",edit_site_announcement_path(headline_announcement) -%></span>
|
3
|
+
<% end -%>
|
4
|
+
<span class="headline_announcement_title"><%= h(headline_announcement.title) -%></span><br/>
|
5
|
+
<span class="headline_announcement_date"><%= time_ago_in_words(headline_announcement.created_at)+" ago" -%></span><br/>
|
6
|
+
<span class="headline_announcement_body"><%= headline_announcement.body_html.html_safe -%></span>
|
@@ -0,0 +1,21 @@
|
|
1
|
+
<%
|
2
|
+
show_seperator||=false
|
3
|
+
%>
|
4
|
+
<li class="announcement">
|
5
|
+
<span class="announcement_title"><%= h(site_announcement.title) -%></span>
|
6
|
+
<span class="announcement_date"><%= site_announcement.created_at.strftime('%d/%m/%Y @ %H:%M:%S') -%></span>
|
7
|
+
<span class="announcement_announcer"> by <%= link_to h(site_announcement.announcer.name), site_announcement.announcer -%></span>
|
8
|
+
<span class="announcement_body"><%= site_announcement.body_html -%></span>
|
9
|
+
<% if can_manage_announcements? -%>
|
10
|
+
<%
|
11
|
+
attributes=site_announcement_attributes(site_announcement)
|
12
|
+
unless attributes.empty?
|
13
|
+
%>
|
14
|
+
<span class="announcement_attributes"><%= "("+attributes.join(", ") + ")" -%></span>
|
15
|
+
<% end -%>
|
16
|
+
<span class="announcement_edit"><%= link_to "Edit",edit_site_announcement_path(site_announcement) -%></span>
|
17
|
+
<% end %>
|
18
|
+
<% if show_seperator -%>
|
19
|
+
<div class="announcement_seperator"></div>
|
20
|
+
<% end -%>
|
21
|
+
</li>
|
@@ -0,0 +1,15 @@
|
|
1
|
+
<div id="announcement_form">
|
2
|
+
<h1>Editing the announcement '<%= h(@site_announcement.title) -%>'</h1>
|
3
|
+
|
4
|
+
<p>
|
5
|
+
<%= link_to "Destroy announcement", site_announcement_path(@site_announcement), :method=>:delete, :confirm=>"Are you sure you wish to delete this announcement?" -%>
|
6
|
+
<% if @site_announcement.email_notification? -%>
|
7
|
+
<br/><span class="comment">(This announcement included an email notification, so you may not want to delete)</span>
|
8
|
+
<% end -%>
|
9
|
+
</p>
|
10
|
+
<%= form_for @site_announcement do |f| -%>
|
11
|
+
<%= render :partial=>"form",:locals=>{:f=>f,:edit=>true} %>
|
12
|
+
<br/>
|
13
|
+
<%= f.submit "Update" -%>
|
14
|
+
<% end -%>
|
15
|
+
</div>
|
@@ -0,0 +1,22 @@
|
|
1
|
+
atom_feed(:url => site_announcements_url(:format => :atom),
|
2
|
+
:root_url => site_announcements_url,
|
3
|
+
:schema_date => "2009") do |feed|
|
4
|
+
|
5
|
+
feed.title("SEEK Announcements")
|
6
|
+
if @site_announcements.empty?
|
7
|
+
feed.updated Time.now
|
8
|
+
else
|
9
|
+
feed.updated @site_announcements.first.updated_at
|
10
|
+
end
|
11
|
+
|
12
|
+
for announcement in @site_announcements
|
13
|
+
next if announcement.updated_at.blank?
|
14
|
+
feed.entry(announcement) do |entry|
|
15
|
+
entry.title(announcement.title)
|
16
|
+
entry.content(announcement.body_html, :type =>'html')
|
17
|
+
entry.author do |author|
|
18
|
+
author.name(announcement.announcer.name)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
<% text=@info.receive_notifications? ? " are currently receiving " : " are currently <b>not</b> receiving " -%>
|
2
|
+
<div id="notification_setttings">
|
3
|
+
<p>
|
4
|
+
You have been identified as <b><%= h(@info.notifiee.name) -%></b>, and you <%= text -%>announcements through email.
|
5
|
+
</p>
|
6
|
+
<p>
|
7
|
+
Please change the setting below to your preferred setting:
|
8
|
+
</p>
|
9
|
+
<%= form_tag update_notification_settings_site_announcements_path do -%>
|
10
|
+
<%= hidden_field_tag :key, @info.unique_key -%>
|
11
|
+
<p>
|
12
|
+
Receive site annoucement emails: <%= check_box_tag(:receive_notifications, value="true", checked=@info.receive_notifications?, options = {}) -%>
|
13
|
+
</p>
|
14
|
+
<p>
|
15
|
+
<%= submit_tag "Update" %>
|
16
|
+
</p>
|
17
|
+
<% end -%>
|
18
|
+
</div>
|
data/config/routes.rb
ADDED
@@ -0,0 +1,40 @@
|
|
1
|
+
class SiteAnnouncementsMigration < ActiveRecord::Migration
|
2
|
+
def self.up
|
3
|
+
create_table :site_announcements do |t|
|
4
|
+
t.column :announcer_id,:integer
|
5
|
+
t.column :announcer_type,:string
|
6
|
+
t.column :title, :string
|
7
|
+
t.column :body,:text
|
8
|
+
t.column :site_announcement_category_id,:integer
|
9
|
+
t.column :is_headline,:boolean,:default=>false
|
10
|
+
t.column :expires_at,:datetime
|
11
|
+
t.column :show_in_feed,:boolean,:default=>true
|
12
|
+
t.column :email_notification,:boolean,:default=>false
|
13
|
+
|
14
|
+
t.timestamps
|
15
|
+
end
|
16
|
+
|
17
|
+
create_table :site_announcement_categories do |t|
|
18
|
+
t.column :title, :string
|
19
|
+
t.column :icon_key,:string
|
20
|
+
|
21
|
+
t.timestamps
|
22
|
+
end
|
23
|
+
|
24
|
+
create_table :notifiee_infos do |t|
|
25
|
+
t.column :notifiee_id,:integer
|
26
|
+
t.column :notifiee_type,:string
|
27
|
+
t.column :unique_key,:string
|
28
|
+
t.column :receive_notifications,:boolean,:default=>true
|
29
|
+
|
30
|
+
t.timestamps
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
|
35
|
+
def self.down
|
36
|
+
drop_table :site_announcements
|
37
|
+
drop_table :site_announcement_categories
|
38
|
+
drop_table :notifiee_infos
|
39
|
+
end
|
40
|
+
end
|
data/install.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
# Install hook code here
|
@@ -0,0 +1,44 @@
|
|
1
|
+
module SiteAnnouncements
|
2
|
+
|
3
|
+
require 'site_announcements/engine' if defined?(Rails)
|
4
|
+
|
5
|
+
module Acts
|
6
|
+
def self.included(mod)
|
7
|
+
mod.extend(ClassMethods)
|
8
|
+
end
|
9
|
+
|
10
|
+
module ClassMethods
|
11
|
+
def acts_as_notifiee(options = {}, &extension)
|
12
|
+
|
13
|
+
has_one :notifiee_info,:dependent=>:destroy,:as=>:notifiee
|
14
|
+
|
15
|
+
before_save :check_for_notifiee_info
|
16
|
+
|
17
|
+
extend SiteAnnouncements::Acts::SingletonMethods
|
18
|
+
include SiteAnnouncements::Acts::InstanceMethods
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
module SingletonMethods
|
23
|
+
|
24
|
+
end
|
25
|
+
|
26
|
+
module InstanceMethods
|
27
|
+
|
28
|
+
def check_for_notifiee_info
|
29
|
+
if (self.notifiee_info.nil?)
|
30
|
+
n=NotifieeInfo.new
|
31
|
+
self.notifiee_info=n
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def receive_notifications?
|
36
|
+
self.notifiee_info.try:receive_notifications?
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
ActiveRecord::Base.send(:include,SiteAnnouncements::Acts)
|
@@ -0,0 +1,12 @@
|
|
1
|
+
Gem::Specification.new do |s|
|
2
|
+
s.name = 'site_announcements'
|
3
|
+
s.version = '1.3'
|
4
|
+
s.date = '2015-02-16'
|
5
|
+
s.summary = "Site announcements"
|
6
|
+
s.authors = ["Stuart Owen","Quyen Nguyen"]
|
7
|
+
s.email = 'nttqa22001@yahoo.com'
|
8
|
+
s.files = `git ls-files`.split("\n")
|
9
|
+
s.homepage = 'https://github.com/SysMO-DB/site_announcements'
|
10
|
+
s.require_paths = ["lib"]
|
11
|
+
s.add_runtime_dependency "uuid", "~> 2.3"
|
12
|
+
end
|
data/test/database.yml
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
headline:
|
2
|
+
title: This is a headline and feed announcement
|
3
|
+
body: the body
|
4
|
+
is_headline: true
|
5
|
+
expires_at: 2050-04-03 11:09:18
|
6
|
+
created_at: 2010_01_03
|
7
|
+
show_in_feed: true
|
8
|
+
|
9
|
+
basic:
|
10
|
+
title: This is a basic announcement
|
11
|
+
body: the body
|
12
|
+
is_headline: false
|
13
|
+
expires_at: 2050-04-03 11:09:18
|
14
|
+
created_at: 2010_01_02
|
15
|
+
show_in_feed: true
|
16
|
+
|
17
|
+
headline_no_feed:
|
18
|
+
title: This is a headline only announcement
|
19
|
+
body: the body
|
20
|
+
is_headline: true
|
21
|
+
expires_at: 2050-04-03 11:09:18
|
22
|
+
created_at: 2010_01_01
|
23
|
+
show_in_feed: false
|
24
|
+
|
25
|
+
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'test_helper.rb'
|
2
|
+
require 'app/controllers/application'
|
3
|
+
require 'app/controllers/site_announcements_controller'
|
4
|
+
require 'action_controller/test_process'
|
5
|
+
|
6
|
+
class SiteAnnouncementsController; def rescue_action(e) raise e end; end
|
7
|
+
|
8
|
+
class SiteAnnouncementsController; def can_manage_announcements?() true end; end
|
9
|
+
class SiteAnnouncementsController; def login_required() true end; end
|
10
|
+
|
11
|
+
class SiteAnnouncementsControllerTest < ActionController::TestCase
|
12
|
+
load_schema
|
13
|
+
|
14
|
+
def test_new
|
15
|
+
get :new
|
16
|
+
assert_response :success
|
17
|
+
end
|
18
|
+
end
|
data/test/schema.rb
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
ActiveRecord::Schema.define(:version => 0) do
|
2
|
+
create_table "site_announcement_categories", :force => true do |t|
|
3
|
+
t.string "title"
|
4
|
+
t.string "icon_key"
|
5
|
+
t.datetime "created_at"
|
6
|
+
t.datetime "updated_at"
|
7
|
+
end
|
8
|
+
|
9
|
+
create_table "site_announcements", :force => true do |t|
|
10
|
+
t.integer "announcer_id"
|
11
|
+
t.string "announcer_type"
|
12
|
+
t.string "title"
|
13
|
+
t.text "body"
|
14
|
+
t.integer "site_announcement_category_id"
|
15
|
+
t.boolean "is_headline", :default => false
|
16
|
+
t.datetime "expires_at"
|
17
|
+
t.boolean "show_in_feed", :default => true
|
18
|
+
t.boolean "email_notification", :default => false
|
19
|
+
t.datetime "created_at"
|
20
|
+
t.datetime "updated_at"
|
21
|
+
end
|
22
|
+
|
23
|
+
create_table "notifiee_infos", :force=>true do |t|
|
24
|
+
t.column :notifiee_id,:integer
|
25
|
+
t.column :notifiee_type,:string
|
26
|
+
t.column :unique_key,:string
|
27
|
+
t.column :receive_notifications,:boolean,:default=>true
|
28
|
+
|
29
|
+
t.timestamps
|
30
|
+
end
|
31
|
+
end
|
data/test/test_helper.rb
ADDED
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'active_support'
|
3
|
+
require 'active_support/test_case'
|
4
|
+
require 'active_record'
|
5
|
+
require 'active_record/fixtures'
|
6
|
+
|
7
|
+
ENV['RAILS_ENV'] = 'test'
|
8
|
+
ENV['RAILS_ROOT'] ||= File.dirname(__FILE__) + '/../../../..'
|
9
|
+
|
10
|
+
require 'test/unit'
|
11
|
+
require File.expand_path(File.join(ENV['RAILS_ROOT'], 'config/environment.rb'))
|
12
|
+
|
13
|
+
def load_schema
|
14
|
+
config = YAML::load(IO.read(File.dirname(__FILE__) + '/database.yml'))
|
15
|
+
ActiveRecord::Base.logger = Logger.new(File.dirname(__FILE__) + "/debug.log")
|
16
|
+
|
17
|
+
db_adapter = ENV['DB']
|
18
|
+
|
19
|
+
# no db passed, try one of these fine config-free DBs before bombing.
|
20
|
+
db_adapter ||=
|
21
|
+
begin
|
22
|
+
require 'rubygems'
|
23
|
+
require 'sqlite'
|
24
|
+
'sqlite'
|
25
|
+
rescue MissingSourceFile
|
26
|
+
begin
|
27
|
+
require 'sqlite3'
|
28
|
+
'sqlite3'
|
29
|
+
rescue MissingSourceFile
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
if db_adapter.nil?
|
34
|
+
raise "No DB Adapter selected. Pass the DB= option to pick one, or install Sqlite or Sqlite3."
|
35
|
+
end
|
36
|
+
|
37
|
+
ActiveRecord::Base.establish_connection(config[db_adapter])
|
38
|
+
load(File.dirname(__FILE__) + "/schema.rb")
|
39
|
+
#require File.dirname(__FILE__) + '/../rails/init.rb'
|
40
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
class NotifieeInfoTest < ActiveSupport::TestCase
|
2
|
+
|
3
|
+
def setup
|
4
|
+
load_schema
|
5
|
+
Fixtures.create_fixtures(File.join(File.dirname(__FILE__), '../fixtures'),"site_announcements")
|
6
|
+
end
|
7
|
+
|
8
|
+
def test_unique_key_generation
|
9
|
+
|
10
|
+
#the SiteAnnouncementCategory is used as a dummy notifiee
|
11
|
+
c=SiteAnnouncementCategory.new
|
12
|
+
c.save!
|
13
|
+
|
14
|
+
n=NotifieeInfo.new(:notifiee=>c)
|
15
|
+
assert_nil n.unique_key
|
16
|
+
n.save!
|
17
|
+
assert_not_nil n.unique_key
|
18
|
+
end
|
19
|
+
|
20
|
+
# def test_notifiee_info_is_deleted_when_notifiee_is
|
21
|
+
# c=SiteAnnouncementCategory.new
|
22
|
+
# c.save!
|
23
|
+
#
|
24
|
+
# n=NotifieeInfo.new(:notifiee=>c)
|
25
|
+
# n.save!
|
26
|
+
#
|
27
|
+
# assert_difference("NotifieeInfo.count",-1) do
|
28
|
+
# assert_difference("SiteAnnouncementCategory.count",-1) do
|
29
|
+
# c.destroy
|
30
|
+
# end
|
31
|
+
# end
|
32
|
+
#
|
33
|
+
# assert_nil NotifieeInfo.find_by_id(n.id)
|
34
|
+
# end
|
35
|
+
|
36
|
+
# def test_notifiee_isnt_deleted_when_notifiee_info_is
|
37
|
+
# c=SiteAnnouncementCategory.new
|
38
|
+
# c.save!
|
39
|
+
#
|
40
|
+
# n=NotifieeInfo.new(:notifiee=>c)
|
41
|
+
# n.save!
|
42
|
+
#
|
43
|
+
# assert_no_difference("SiteAnnouncementCategory.count") do
|
44
|
+
# n.destroy
|
45
|
+
# end
|
46
|
+
#
|
47
|
+
# assert_not_nil SiteAnnouncementCategory.find_by_id(c.id)
|
48
|
+
# end
|
49
|
+
#end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class SiteAnnouncementsTest < ActiveSupport::TestCase
|
4
|
+
|
5
|
+
|
6
|
+
|
7
|
+
def setup
|
8
|
+
load_schema
|
9
|
+
Fixtures.create_fixtures(File.join(File.dirname(__FILE__), '../fixtures'),"site_announcements")
|
10
|
+
end
|
11
|
+
|
12
|
+
test "using fixtures" do
|
13
|
+
assert_not_nil SiteAnnouncement.find(:first)
|
14
|
+
end
|
15
|
+
|
16
|
+
test "headline" do
|
17
|
+
hl=SiteAnnouncement.headline_announcement
|
18
|
+
assert_not_nil hl
|
19
|
+
assert_equal "This is a headline and feed announcement",hl.title
|
20
|
+
|
21
|
+
hl.expires_at = Time.now - 1.hour
|
22
|
+
hl.save!
|
23
|
+
|
24
|
+
hl=SiteAnnouncement.headline_announcement
|
25
|
+
assert_not_nil hl
|
26
|
+
assert_equal "This is a headline only announcement",hl.title
|
27
|
+
|
28
|
+
hl.expires_at = Time.now - 1.hour
|
29
|
+
hl.save!
|
30
|
+
|
31
|
+
assert_nil SiteAnnouncement.headline_announcement
|
32
|
+
end
|
33
|
+
|
34
|
+
test "new headline comes out top" do
|
35
|
+
hl=SiteAnnouncement.headline_announcement
|
36
|
+
assert_not_nil hl
|
37
|
+
assert_equal "This is a headline and feed announcement",hl.title
|
38
|
+
|
39
|
+
ann=SiteAnnouncement.new(:title=>"brand new",:expires_at=>Time.now + 1.day,:is_headline=>true)
|
40
|
+
ann.save!
|
41
|
+
|
42
|
+
hl=SiteAnnouncement.headline_announcement
|
43
|
+
assert_not_nil hl
|
44
|
+
assert_equal "brand new",hl.title
|
45
|
+
end
|
46
|
+
|
47
|
+
test "feed" do
|
48
|
+
list = SiteAnnouncement.feed_announcements
|
49
|
+
assert_equal 2,list.size
|
50
|
+
assert_equal "This is a headline and feed announcement",list[0].title
|
51
|
+
assert_equal "This is a basic announcement",list[1].title
|
52
|
+
|
53
|
+
list = SiteAnnouncement.feed_announcements :limit=>1
|
54
|
+
assert_equal 1,list.size
|
55
|
+
assert_equal "This is a headline and feed announcement",list[0].title
|
56
|
+
end
|
57
|
+
|
58
|
+
|
59
|
+
end
|
data/uninstall.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
# Uninstall hook code here
|
metadata
ADDED
@@ -0,0 +1,95 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: site_announcements
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: '1.3'
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Stuart Owen
|
8
|
+
- Quyen Nguyen
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2015-02-16 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: uuid
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
requirements:
|
18
|
+
- - "~>"
|
19
|
+
- !ruby/object:Gem::Version
|
20
|
+
version: '2.3'
|
21
|
+
type: :runtime
|
22
|
+
prerelease: false
|
23
|
+
version_requirements: !ruby/object:Gem::Requirement
|
24
|
+
requirements:
|
25
|
+
- - "~>"
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
version: '2.3'
|
28
|
+
description:
|
29
|
+
email: nttqa22001@yahoo.com
|
30
|
+
executables: []
|
31
|
+
extensions: []
|
32
|
+
extra_rdoc_files: []
|
33
|
+
files:
|
34
|
+
- ".gitignore"
|
35
|
+
- BSD-LICENSE
|
36
|
+
- Gemfile
|
37
|
+
- README.rdoc
|
38
|
+
- Rakefile
|
39
|
+
- app/controllers/site_announcements_controller.rb
|
40
|
+
- app/helpers/site_announcements_helper.rb
|
41
|
+
- app/models/notifiee_info.rb
|
42
|
+
- app/models/site_announcement.rb
|
43
|
+
- app/models/site_announcement_category.rb
|
44
|
+
- app/views/site_announcements/_feed_announcement.html.erb
|
45
|
+
- app/views/site_announcements/_feed_announcements.html.erb
|
46
|
+
- app/views/site_announcements/_form.html.erb
|
47
|
+
- app/views/site_announcements/_headline_announcement.erb
|
48
|
+
- app/views/site_announcements/_site_announcement.html.erb
|
49
|
+
- app/views/site_announcements/edit.html.erb
|
50
|
+
- app/views/site_announcements/feed.atom.builder
|
51
|
+
- app/views/site_announcements/index.html.erb
|
52
|
+
- app/views/site_announcements/new.html.erb
|
53
|
+
- app/views/site_announcements/notification_settings.html.erb
|
54
|
+
- app/views/site_announcements/show.html.erb
|
55
|
+
- config/routes.rb
|
56
|
+
- generators/site_announcements/USAGE
|
57
|
+
- generators/site_announcements/site_announcements_generator.rb
|
58
|
+
- generators/site_announcements/templates/migration.rb
|
59
|
+
- install.rb
|
60
|
+
- lib/site_announcements.rb
|
61
|
+
- lib/site_announcements/engine.rb
|
62
|
+
- lib/tasks/site_announcements_tasks.rake
|
63
|
+
- site_announcements.gemspec
|
64
|
+
- test/database.yml
|
65
|
+
- test/fixtures/site_announcements.yml
|
66
|
+
- test/functional/site_announcements_controller_test.rb
|
67
|
+
- test/schema.rb
|
68
|
+
- test/test_helper.rb
|
69
|
+
- test/unit/notifiee_info_test.rb
|
70
|
+
- test/unit/site_announcements_test.rb
|
71
|
+
- uninstall.rb
|
72
|
+
homepage: https://github.com/SysMO-DB/site_announcements
|
73
|
+
licenses: []
|
74
|
+
metadata: {}
|
75
|
+
post_install_message:
|
76
|
+
rdoc_options: []
|
77
|
+
require_paths:
|
78
|
+
- lib
|
79
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
80
|
+
requirements:
|
81
|
+
- - ">="
|
82
|
+
- !ruby/object:Gem::Version
|
83
|
+
version: '0'
|
84
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
85
|
+
requirements:
|
86
|
+
- - ">="
|
87
|
+
- !ruby/object:Gem::Version
|
88
|
+
version: '0'
|
89
|
+
requirements: []
|
90
|
+
rubyforge_project:
|
91
|
+
rubygems_version: 2.4.8
|
92
|
+
signing_key:
|
93
|
+
specification_version: 4
|
94
|
+
summary: Site announcements
|
95
|
+
test_files: []
|