muck-raker 0.1.15 → 0.1.16
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.
- data/README.rdoc +21 -8
- data/Rakefile +6 -0
- data/VERSION +1 -1
- data/app/controllers/admin/{recommender → muck}/feeds_controller.rb +2 -2
- data/app/controllers/{recommender → muck}/entries_controller.rb +8 -5
- data/app/controllers/muck/feed_previews_controller.rb +33 -0
- data/app/controllers/muck/feeds_controller.rb +128 -0
- data/app/controllers/{recommender → muck}/recommendations_controller.rb +4 -1
- data/app/controllers/{recommender → muck}/search_controller.rb +3 -1
- data/app/helpers/muck_raker_feeds_helper.rb +24 -0
- data/app/models/attention.rb +13 -1
- data/app/models/click.rb +12 -0
- data/app/models/entry.rb +45 -11
- data/app/models/feed.rb +81 -7
- data/app/models/feed_parent.rb +18 -0
- data/app/models/language.rb +14 -0
- data/app/models/oai_endpoint.rb +12 -0
- data/app/models/raker_mailer.rb +16 -0
- data/app/models/recommendation.rb +13 -0
- data/app/models/service.rb +14 -0
- data/app/models/subject.rb +8 -0
- data/app/models/tag_cloud.rb +14 -1
- data/app/views/admin/feeds/index.html.erb +65 -0
- data/app/views/entries/_related_entry.html.erb +4 -0
- data/app/views/entries/_result_status.html.erb +3 -3
- data/app/views/entries/details.html.erb +19 -22
- data/app/views/entries/index.html.erb +1 -1
- data/app/views/entries/show.html.erb +4 -7
- data/app/views/feed_previews/new.html.erb +1 -0
- data/app/views/feed_previews/select_feeds.html.erb +6 -0
- data/app/views/feeds/_entry.html.erb +1 -0
- data/app/views/feeds/_feed.html.erb +9 -0
- data/app/views/feeds/index.html.erb +30 -94
- data/app/views/feeds/new.html.erb +1 -109
- data/app/views/feeds/new_extended.html.erb +1 -0
- data/app/views/feeds/show.html.erb +6 -0
- data/app/views/parts/_add_extended_feed.html.erb +31 -0
- data/app/views/parts/_add_feed.html.erb +20 -0
- data/app/views/parts/_add_single_feed.html.erb +21 -0
- data/app/views/parts/_select_feed.html.erb +4 -0
- data/app/views/raker_mailer/notification_feed_added.text.ar.html.erb +3 -0
- data/app/views/raker_mailer/notification_feed_added.text.ar.plain.erb +5 -0
- data/app/views/raker_mailer/notification_feed_added.text.bg.html.erb +3 -0
- data/app/views/raker_mailer/notification_feed_added.text.bg.plain.erb +5 -0
- data/app/views/raker_mailer/notification_feed_added.text.ca.html.erb +3 -0
- data/app/views/raker_mailer/notification_feed_added.text.ca.plain.erb +5 -0
- data/app/views/raker_mailer/notification_feed_added.text.cs.html.erb +3 -0
- data/app/views/raker_mailer/notification_feed_added.text.cs.plain.erb +5 -0
- data/app/views/raker_mailer/notification_feed_added.text.da.html.erb +3 -0
- data/app/views/raker_mailer/notification_feed_added.text.da.plain.erb +5 -0
- data/app/views/raker_mailer/notification_feed_added.text.de.html.erb +3 -0
- data/app/views/raker_mailer/notification_feed_added.text.de.plain.erb +5 -0
- data/app/views/raker_mailer/notification_feed_added.text.el.html.erb +3 -0
- data/app/views/raker_mailer/notification_feed_added.text.el.plain.erb +5 -0
- data/app/views/raker_mailer/notification_feed_added.text.es.html.erb +3 -0
- data/app/views/raker_mailer/notification_feed_added.text.es.plain.erb +5 -0
- data/app/views/raker_mailer/notification_feed_added.text.et.html.erb +3 -0
- data/app/views/raker_mailer/notification_feed_added.text.et.plain.erb +5 -0
- data/app/views/raker_mailer/notification_feed_added.text.fa.html.erb +3 -0
- data/app/views/raker_mailer/notification_feed_added.text.fa.plain.erb +5 -0
- data/app/views/raker_mailer/notification_feed_added.text.fi.html.erb +3 -0
- data/app/views/raker_mailer/notification_feed_added.text.fi.plain.erb +5 -0
- data/app/views/raker_mailer/notification_feed_added.text.fr.html.erb +3 -0
- data/app/views/raker_mailer/notification_feed_added.text.fr.plain.erb +5 -0
- data/app/views/raker_mailer/notification_feed_added.text.gl.html.erb +3 -0
- data/app/views/raker_mailer/notification_feed_added.text.gl.plain.erb +5 -0
- data/app/views/raker_mailer/notification_feed_added.text.hi.html.erb +3 -0
- data/app/views/raker_mailer/notification_feed_added.text.hi.plain.erb +5 -0
- data/app/views/raker_mailer/notification_feed_added.text.hr.html.erb +3 -0
- data/app/views/raker_mailer/notification_feed_added.text.hr.plain.erb +5 -0
- data/app/views/raker_mailer/notification_feed_added.text.html.erb +3 -0
- data/app/views/raker_mailer/notification_feed_added.text.hu.html.erb +3 -0
- data/app/views/raker_mailer/notification_feed_added.text.hu.plain.erb +5 -0
- data/app/views/raker_mailer/notification_feed_added.text.id.html.erb +3 -0
- data/app/views/raker_mailer/notification_feed_added.text.id.plain.erb +5 -0
- data/app/views/raker_mailer/notification_feed_added.text.it.html.erb +3 -0
- data/app/views/raker_mailer/notification_feed_added.text.it.plain.erb +5 -0
- data/app/views/raker_mailer/notification_feed_added.text.iw.html.erb +3 -0
- data/app/views/raker_mailer/notification_feed_added.text.iw.plain.erb +5 -0
- data/app/views/raker_mailer/notification_feed_added.text.ja.html.erb +3 -0
- data/app/views/raker_mailer/notification_feed_added.text.ja.plain.erb +5 -0
- data/app/views/raker_mailer/notification_feed_added.text.ko.html.erb +3 -0
- data/app/views/raker_mailer/notification_feed_added.text.ko.plain.erb +5 -0
- data/app/views/raker_mailer/notification_feed_added.text.lt.html.erb +3 -0
- data/app/views/raker_mailer/notification_feed_added.text.lt.plain.erb +5 -0
- data/app/views/raker_mailer/notification_feed_added.text.lv.html.erb +3 -0
- data/app/views/raker_mailer/notification_feed_added.text.lv.plain.erb +5 -0
- data/app/views/raker_mailer/notification_feed_added.text.mt.html.erb +3 -0
- data/app/views/raker_mailer/notification_feed_added.text.mt.plain.erb +5 -0
- data/app/views/raker_mailer/notification_feed_added.text.nl.html.erb +3 -0
- data/app/views/raker_mailer/notification_feed_added.text.nl.plain.erb +5 -0
- data/app/views/raker_mailer/notification_feed_added.text.no.html.erb +3 -0
- data/app/views/raker_mailer/notification_feed_added.text.no.plain.erb +5 -0
- data/app/views/raker_mailer/notification_feed_added.text.pl.html.erb +3 -0
- data/app/views/raker_mailer/notification_feed_added.text.pl.plain.erb +5 -0
- data/app/views/raker_mailer/notification_feed_added.text.plain.erb +5 -0
- data/app/views/raker_mailer/notification_feed_added.text.pt-PT.html.erb +3 -0
- data/app/views/raker_mailer/notification_feed_added.text.pt-PT.plain.erb +5 -0
- data/app/views/raker_mailer/notification_feed_added.text.ro.html.erb +3 -0
- data/app/views/raker_mailer/notification_feed_added.text.ro.plain.erb +5 -0
- data/app/views/raker_mailer/notification_feed_added.text.ru.html.erb +3 -0
- data/app/views/raker_mailer/notification_feed_added.text.ru.plain.erb +5 -0
- data/app/views/raker_mailer/notification_feed_added.text.sk.html.erb +3 -0
- data/app/views/raker_mailer/notification_feed_added.text.sk.plain.erb +5 -0
- data/app/views/raker_mailer/notification_feed_added.text.sl.html.erb +3 -0
- data/app/views/raker_mailer/notification_feed_added.text.sl.plain.erb +5 -0
- data/app/views/raker_mailer/notification_feed_added.text.sq.html.erb +3 -0
- data/app/views/raker_mailer/notification_feed_added.text.sq.plain.erb +5 -0
- data/app/views/raker_mailer/notification_feed_added.text.sr.html.erb +3 -0
- data/app/views/raker_mailer/notification_feed_added.text.sr.plain.erb +5 -0
- data/app/views/raker_mailer/notification_feed_added.text.sv.html.erb +3 -0
- data/app/views/raker_mailer/notification_feed_added.text.sv.plain.erb +5 -0
- data/app/views/raker_mailer/notification_feed_added.text.th.html.erb +3 -0
- data/app/views/raker_mailer/notification_feed_added.text.th.plain.erb +5 -0
- data/app/views/raker_mailer/notification_feed_added.text.tl.html.erb +3 -0
- data/app/views/raker_mailer/notification_feed_added.text.tl.plain.erb +5 -0
- data/app/views/raker_mailer/notification_feed_added.text.tr.html.erb +3 -0
- data/app/views/raker_mailer/notification_feed_added.text.tr.plain.erb +5 -0
- data/app/views/raker_mailer/notification_feed_added.text.uk.html.erb +3 -0
- data/app/views/raker_mailer/notification_feed_added.text.uk.plain.erb +5 -0
- data/app/views/raker_mailer/notification_feed_added.text.vi.html.erb +3 -0
- data/app/views/raker_mailer/notification_feed_added.text.vi.plain.erb +5 -0
- data/app/views/raker_mailer/notification_feed_added.text.zh-CN.html.erb +3 -0
- data/app/views/raker_mailer/notification_feed_added.text.zh-CN.plain.erb +5 -0
- data/app/views/raker_mailer/notification_feed_added.text.zh-TW.html.erb +3 -0
- data/app/views/raker_mailer/notification_feed_added.text.zh-TW.plain.erb +5 -0
- data/app/views/raker_mailer/notification_feed_added.text.zh.html.erb +3 -0
- data/app/views/raker_mailer/notification_feed_added.text.zh.plain.erb +5 -0
- data/app/views/recommendations/index.xml.builder +4 -4
- data/config/muck_raker_routes.rb +10 -13
- data/db/migrate/20090623181458_add_grain_size_to_entries.rb +6 -6
- data/db/migrate/20090623193525_add_grain_size_to_tag_clouds.rb +12 -0
- data/db/migrate/20090717175825_normalize_entries_subjects.rb +1 -0
- data/db/migrate/20090721043213_change_services_title_to_name.rb +9 -0
- data/db/migrate/20090721054927_remove_services_not_null_from_feeds.rb +9 -0
- data/db/migrate/20090723050510_create_feed_parents.rb +17 -0
- data/lib/active_record/acts/muck_feed_parent.rb +22 -0
- data/lib/muck_raker/muck_custom_form_builder.rb +22 -0
- data/lib/muck_raker/services.rb +6 -0
- data/lib/muck_raker/tasks.rb +8 -4
- data/lib/muck_raker.rb +7 -2
- data/locales/ar.yml +48 -15
- data/locales/bg.yml +48 -15
- data/locales/ca.yml +48 -15
- data/locales/cs.yml +48 -15
- data/locales/da.yml +48 -15
- data/locales/de.yml +48 -15
- data/locales/el.yml +48 -15
- data/locales/en.yml +46 -17
- data/locales/es.yml +48 -15
- data/locales/et.yml +48 -15
- data/locales/fa.yml +48 -15
- data/locales/fi.yml +49 -16
- data/locales/fr.yml +48 -15
- data/locales/gl.yml +48 -15
- data/locales/hi.yml +48 -15
- data/locales/hr.yml +48 -15
- data/locales/hu.yml +48 -15
- data/locales/id.yml +48 -15
- data/locales/it.yml +49 -16
- data/locales/iw.yml +48 -15
- data/locales/ja.yml +48 -15
- data/locales/ko.yml +48 -15
- data/locales/lt.yml +48 -15
- data/locales/lv.yml +48 -15
- data/locales/mt.yml +48 -15
- data/locales/nl.yml +48 -15
- data/locales/no.yml +48 -15
- data/locales/pl.yml +48 -15
- data/locales/pt-PT.yml +48 -15
- data/locales/ro.yml +48 -15
- data/locales/ru.yml +48 -15
- data/locales/sk.yml +48 -15
- data/locales/sl.yml +48 -15
- data/locales/sq.yml +48 -15
- data/locales/sr.yml +48 -15
- data/locales/sv.yml +48 -15
- data/locales/th.yml +48 -15
- data/locales/tl.yml +48 -15
- data/locales/tr.yml +48 -15
- data/locales/uk.yml +48 -15
- data/locales/vi.yml +48 -15
- data/locales/zh-CN.yml +48 -15
- data/locales/zh-TW.yml +48 -15
- data/locales/zh.yml +48 -15
- data/muck-raker.gemspec +298 -26
- data/rails/init.rb +0 -9
- data/test/rails_root/app/models/user.rb +31 -1
- data/test/rails_root/app/views/default/index.html.erb +15 -0
- data/test/rails_root/app/views/layouts/default.html.erb +38 -24
- data/test/rails_root/app/views/layouts/popup.html.erb +40 -0
- data/test/rails_root/config/database.yml +12 -11
- data/test/rails_root/config/environment.rb +4 -1
- data/test/rails_root/config/global_config.yml +3 -0
- data/test/rails_root/db/migrate/20090402234137_create_languages.rb +18 -0
- data/test/rails_root/db/migrate/20090426041056_create_countries.rb +15 -0
- data/test/rails_root/db/migrate/20090426041103_create_states.rb +18 -0
- data/test/rails_root/{migrate → db/migrate}/20090602191243_create_muck_raker.rb +0 -0
- data/test/rails_root/{migrate → db/migrate}/20090619211125_create_tag_clouds.rb +0 -0
- data/test/rails_root/db/migrate/20090623181458_add_grain_size_to_entries.rb +16 -0
- data/test/rails_root/db/migrate/20090623193525_add_grain_size_to_tag_clouds.rb +12 -0
- data/test/rails_root/{migrate → db/migrate}/20090703175825_denormalize_entries_subjects.rb +0 -0
- data/test/rails_root/db/migrate/20090716035935_change_tag_cloud_grain_sizes.rb +9 -0
- data/test/rails_root/db/migrate/20090717175825_normalize_entries_subjects.rb +18 -0
- data/test/rails_root/db/migrate/20090721043213_change_services_title_to_name.rb +9 -0
- data/test/rails_root/db/migrate/20090721054927_remove_services_not_null_from_feeds.rb +9 -0
- data/test/rails_root/db/migrate/20090723050510_create_feed_parents.rb +17 -0
- data/test/rails_root/db/schema.rb +289 -54
- data/test/rails_root/public/images/fancybox/fancy_closebox.png +0 -0
- data/test/rails_root/public/images/fancybox/fancy_left.png +0 -0
- data/test/rails_root/public/images/fancybox/fancy_progress.png +0 -0
- data/test/rails_root/public/images/fancybox/fancy_right.png +0 -0
- data/test/rails_root/public/images/fancybox/fancy_shadow_e.png +0 -0
- data/test/rails_root/public/images/fancybox/fancy_shadow_n.png +0 -0
- data/test/rails_root/public/images/fancybox/fancy_shadow_ne.png +0 -0
- data/test/rails_root/public/images/fancybox/fancy_shadow_nw.png +0 -0
- data/test/rails_root/public/images/fancybox/fancy_shadow_s.png +0 -0
- data/test/rails_root/public/images/fancybox/fancy_shadow_se.png +0 -0
- data/test/rails_root/public/images/fancybox/fancy_shadow_sw.png +0 -0
- data/test/rails_root/public/images/fancybox/fancy_shadow_w.png +0 -0
- data/test/rails_root/public/images/fancybox/fancy_title_left.png +0 -0
- data/test/rails_root/public/images/fancybox/fancy_title_main.png +0 -0
- data/test/rails_root/public/images/fancybox/fancy_title_right.png +0 -0
- data/test/rails_root/public/javascripts/jquery/jquery.easing.js +1 -0
- data/test/rails_root/public/javascripts/jquery/jquery.fancybox.js +9 -0
- data/test/rails_root/public/javascripts/muck.js +7 -3
- data/test/rails_root/public/stylesheets/application.css +1 -0
- data/test/rails_root/public/stylesheets/jquery/jquery.fancybox.css +44 -0
- data/test/rails_root/public/stylesheets/styles.css +6 -2
- data/test/rails_root/test/factories.rb +14 -1
- data/test/rails_root/test/functional/feed_previews_controller_test.rb +32 -0
- data/test/rails_root/test/functional/feeds_controller_test.rb +57 -5
- data/test/rails_root/test/shoulda_macros/controller.rb +5 -1
- data/test/rails_root/test/test_helper.rb +2 -0
- data/test/rails_root/test/unit/entry_test.rb +30 -5
- data/test/rails_root/test/unit/feed_parent_test.rb +10 -0
- data/test/rails_root/test/unit/feed_test.rb +55 -3
- data/test/rails_root/test/unit/raker_mailer_test.rb +26 -0
- data/test/rails_root/test/unit/tag_cloud_test.rb +16 -28
- data/test/rails_root/test/unit/user_test.rb +11 -0
- metadata +211 -18
- data/app/controllers/recommender/default_controller.rb +0 -15
- data/app/controllers/recommender/feeds_controller.rb +0 -64
- data/app/views/default/tour.html.erb +0 -15
- data/app/views/default/widgets.html.erb +0 -4
- data/test/rails_root/migrate/20090623181458_add_grain_size_to_entries.rb +0 -16
data/README.rdoc
CHANGED
|
@@ -1,13 +1,20 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
The recommender adds the ability to aggregate, search and analyze data from many different web sources.
|
|
1
|
+
= Muck Raker
|
|
2
|
+
Muck Raker adds functionality that aggregates, searches and analyzes data from many different web sources.
|
|
4
3
|
|
|
5
|
-
Installation
|
|
6
|
-
===========
|
|
7
|
-
Install gem dependencies:
|
|
4
|
+
== Installation
|
|
8
5
|
|
|
6
|
+
Be sure to add github as a gem source before proceeding as acts-as-taggable-on, mislav-will_paginate (and many other gems) live there.
|
|
7
|
+
gem sources -a http://gems.github.com
|
|
8
|
+
|
|
9
|
+
Install muck raker:
|
|
10
|
+
sudo gem install muck-raker
|
|
11
|
+
|
|
12
|
+
Installing muck raker should install all of it's dependancies. You can also install them manually:
|
|
13
|
+
sudo gem install httparty
|
|
9
14
|
sudo gem install mbleigh-acts-as-taggable-on
|
|
10
15
|
sudo gem install mislav-will_paginate
|
|
16
|
+
sudo gem install muck-feedbag
|
|
17
|
+
sudo gem install pauldix-feedzirra
|
|
11
18
|
|
|
12
19
|
After install acts-as-taggable-on be sure to include the helper in application_helper.rb:
|
|
13
20
|
|
|
@@ -20,8 +27,14 @@ Add rake tasks to your Rakefile
|
|
|
20
27
|
|
|
21
28
|
require 'muck_raker/tasks'
|
|
22
29
|
|
|
23
|
-
Example
|
|
24
|
-
|
|
30
|
+
== Example
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
== Development
|
|
34
|
+
|
|
35
|
+
=== Testing
|
|
36
|
+
You will need to have mysql setup to run the migrations for the test database. Muck raker has a few customizations which require mysql.
|
|
37
|
+
|
|
25
38
|
|
|
26
39
|
|
|
27
40
|
Copyright (c) 2009 Justin Ball and Joel Duffin, released under the MIT license
|
data/Rakefile
CHANGED
|
@@ -36,6 +36,8 @@ desc 'Translate this gem'
|
|
|
36
36
|
task :translate do
|
|
37
37
|
file = File.join(File.dirname(__FILE__), 'locales', 'en.yml')
|
|
38
38
|
system("babelphish -o -y #{file}")
|
|
39
|
+
path = File.join(File.dirname(__FILE__), 'app', 'views', 'raker_mailer')
|
|
40
|
+
system("babelphish -o -h #{path} -l en")
|
|
39
41
|
end
|
|
40
42
|
|
|
41
43
|
desc 'Generate documentation for the recommender plugin.'
|
|
@@ -57,6 +59,10 @@ begin
|
|
|
57
59
|
gemspec.description = "The aggregation and recommendation engine for the muck system."
|
|
58
60
|
gemspec.authors = ["Joel Duffin Justin Ball"]
|
|
59
61
|
gemspec.rubyforge_project = 'muck-raker'
|
|
62
|
+
gemspec.add_dependency "mbleigh-acts-as-taggable-on"
|
|
63
|
+
gemspec.add_dependency "mislav-will_paginate"
|
|
64
|
+
gemspec.add_dependency "httparty"
|
|
65
|
+
gemspec.add_dependency "jbasdf-feedbag"
|
|
60
66
|
gemspec.add_dependency "muck-engine"
|
|
61
67
|
gemspec.add_dependency "muck-users"
|
|
62
68
|
gemspec.add_dependency "muck-solr"
|
data/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
0.1.
|
|
1
|
+
0.1.16
|
|
@@ -1,5 +1,7 @@
|
|
|
1
|
-
class
|
|
2
|
-
|
|
1
|
+
class Muck::EntriesController < ApplicationController
|
|
2
|
+
|
|
3
|
+
unloadable
|
|
4
|
+
|
|
3
5
|
def initialize
|
|
4
6
|
@no_index = true
|
|
5
7
|
end
|
|
@@ -35,19 +37,20 @@ class Recommender::EntriesController < ApplicationController
|
|
|
35
37
|
end
|
|
36
38
|
|
|
37
39
|
def show
|
|
38
|
-
@page_title = "Related Resources"
|
|
39
40
|
@entry = Entry.find(params[:id], :include => :feed)
|
|
40
41
|
if @entry.nil?
|
|
41
42
|
render_text "Unable to find the specified document"
|
|
42
43
|
return
|
|
43
44
|
end
|
|
44
|
-
@entry_title = @entry.title +
|
|
45
|
+
@entry_title = @entry.title + ' (' + @entry.feed.short_title + ')'
|
|
46
|
+
@page_title = @entry_title + ' - ' + I18n.t('muck.raker.related_resources_title')
|
|
45
47
|
# I18n.locale = @entry.language[0..1]
|
|
46
48
|
@limit = params[:limit] ? params[:limit].to_i : 20
|
|
47
49
|
@limit = 40 if @limit > 40
|
|
48
50
|
|
|
49
51
|
respond_to do |format|
|
|
50
|
-
format.html {
|
|
52
|
+
format.html {
|
|
53
|
+
@recommendations = @entry.recommendations(@limit, 'relevance', params[:details] == 'true')
|
|
51
54
|
if params[:details] == 'true'
|
|
52
55
|
render :template => "entries/details"
|
|
53
56
|
else
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
class Muck::FeedPreviewsController < ApplicationController
|
|
2
|
+
|
|
3
|
+
unloadable
|
|
4
|
+
|
|
5
|
+
def new
|
|
6
|
+
respond_to do |format|
|
|
7
|
+
format.pjs do
|
|
8
|
+
render_as_html do
|
|
9
|
+
render :template => 'feed_previews/new', :layout => false
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
format.html { render :template => 'feed_previews/new' }
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def select_feeds
|
|
17
|
+
@feed = Feed.new(params[:feed])
|
|
18
|
+
@feeds = Feed.gather_information(@feed.uri)
|
|
19
|
+
respond_to do |format|
|
|
20
|
+
format.pjs do
|
|
21
|
+
render_as_html do
|
|
22
|
+
render :template => 'feed_previews/select_feeds', :layout => false
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
format.html { render :template => 'feed_previews/select_feeds' }
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def create
|
|
30
|
+
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
end
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
class Muck::FeedsController < ApplicationController
|
|
2
|
+
|
|
3
|
+
unloadable
|
|
4
|
+
|
|
5
|
+
before_filter :get_parent
|
|
6
|
+
|
|
7
|
+
def index
|
|
8
|
+
@feeds = Feed.valid.by_title.paginate(:page => @page, :per_page => @per_page)
|
|
9
|
+
respond_to do |format|
|
|
10
|
+
format.html { render :template => 'feeds/index' }
|
|
11
|
+
format.xml { render :xml => @feeds.to_xml }
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
# pass layout=popup to remove most of the chrome
|
|
16
|
+
def show
|
|
17
|
+
@feed = Feed.find(params[:id])
|
|
18
|
+
@entries = @feed.entries
|
|
19
|
+
respond_to do |format|
|
|
20
|
+
format.html { render :template => 'feeds/show', :layout => params[:layout] || true }
|
|
21
|
+
format.pjs { debugger; render :template => 'feeds/show', :layout => false }
|
|
22
|
+
format.json { render :json => @feed.as_json }
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def new
|
|
27
|
+
respond_to do |format|
|
|
28
|
+
format.html { render :template => 'feeds/new', :layout => 'popup' }
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def new_extended
|
|
33
|
+
respond_to do |format|
|
|
34
|
+
format.html { render :template => 'feeds/new_extended', :layout => 'popup' }
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def create
|
|
39
|
+
@feed = Feed.new(params[:feed])
|
|
40
|
+
@feed.contributor = current_user # record the user that submitted the feed for auditing purposes
|
|
41
|
+
@feed.harvested_from_display_uri = @feed.display_uri
|
|
42
|
+
|
|
43
|
+
# setup the feed to be harvested
|
|
44
|
+
@feed.entries_count = 0
|
|
45
|
+
@feed.last_requested_at = 4.weeks.ago
|
|
46
|
+
@feed.last_harvested_at = 4.weeks.ago
|
|
47
|
+
|
|
48
|
+
# associate the parent if present
|
|
49
|
+
@parent.feeds << @feed if @parent
|
|
50
|
+
|
|
51
|
+
after_create_response(@feed.save)
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
def update
|
|
56
|
+
@feed = Feed.find(params[:id])
|
|
57
|
+
after_update_response(@feed.update_attributes(params[:feed]))
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def destroy
|
|
61
|
+
@feed = Feed.find(params[:id])
|
|
62
|
+
@feed.destroy
|
|
63
|
+
after_destroy_response
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
protected
|
|
67
|
+
|
|
68
|
+
def get_parent
|
|
69
|
+
if !params[:parent_type] || !params[:parent_id]
|
|
70
|
+
return
|
|
71
|
+
end
|
|
72
|
+
@klass = params[:parent_type].to_s.constantize
|
|
73
|
+
@parent = @klass.find(params[:parent_id])
|
|
74
|
+
unless has_permission_to_add_feed(current_user, @parent)
|
|
75
|
+
permission_denied
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
def has_permission_to_add_feed(user, parent)
|
|
80
|
+
user == parent || parent.can_add_feed?(user)
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
# Handles render and redirect after success or failure of the
|
|
84
|
+
# create action. Override to perform a different action
|
|
85
|
+
def after_create_response(success)
|
|
86
|
+
if success
|
|
87
|
+
flash[:notice] = t('muck.raker.feed_successfully_created')
|
|
88
|
+
respond_to do |format|
|
|
89
|
+
format.html { redirect_to feed_path(@feed) }
|
|
90
|
+
format.pjs { render :template => 'feeds/show', :layout => false }
|
|
91
|
+
format.json { render :json => @feed.as_json }
|
|
92
|
+
format.xml { head :created, :location => feed_url(@feed) }
|
|
93
|
+
end
|
|
94
|
+
else
|
|
95
|
+
respond_to do |format|
|
|
96
|
+
format.html { render :template => "feeds/new" }
|
|
97
|
+
format.pjs { render :template => "feeds/new", :layout => false }
|
|
98
|
+
format.json { render :json => @feed.as_json }
|
|
99
|
+
format.xml { render :xml => @feed.errors.to_xml }
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
# Handles render and redirect after success or failure of the
|
|
105
|
+
# update action. Override to perform a different action
|
|
106
|
+
def after_update_response(success)
|
|
107
|
+
respond_to do |format|
|
|
108
|
+
if success
|
|
109
|
+
flash[:notice] = t('muck.raker.feed_successfully_updated')
|
|
110
|
+
format.html { redirect_to feed_path(@feed) }
|
|
111
|
+
format.xml { head :ok }
|
|
112
|
+
else
|
|
113
|
+
format.html { render :template => "feeds/edit" }
|
|
114
|
+
format.xml { render :xml => @feed.errors.to_xml }
|
|
115
|
+
end
|
|
116
|
+
end
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
# Handles render and redirect after the delete action.
|
|
120
|
+
# Override to perform a different action
|
|
121
|
+
def after_destroy_response
|
|
122
|
+
respond_to do |format|
|
|
123
|
+
format.html { redirect_to feeds_path }
|
|
124
|
+
format.xml { head :ok }
|
|
125
|
+
end
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
end
|
|
@@ -1,5 +1,7 @@
|
|
|
1
|
-
class
|
|
1
|
+
class Muck::RecommendationsController < ApplicationController
|
|
2
2
|
|
|
3
|
+
unloadable
|
|
4
|
+
|
|
3
5
|
# GET /recommendations
|
|
4
6
|
# GET /recommendations.xml
|
|
5
7
|
def index
|
|
@@ -27,6 +29,7 @@ class Recommender::RecommendationsController < ApplicationController
|
|
|
27
29
|
order = params[:order] || "mixed"
|
|
28
30
|
redirect_to "/documents/" + @document.id.to_s + "?limit=" + @limit.to_s + "&order=" + order + "&details=" + @details.to_s if !@document.nil?
|
|
29
31
|
render(:template => '/recommendations/document_not_found.html.erb', :layout => false) if @document.nil?
|
|
32
|
+
@recommendations = @entry.recommendations(@limit, params[:order] || "relevance")
|
|
30
33
|
}
|
|
31
34
|
format.xml {
|
|
32
35
|
render(:template => '/recommendations/index.xml.builder', :layout => false)
|
|
@@ -1,3 +1,27 @@
|
|
|
1
1
|
module MuckRakerFeedsHelper
|
|
2
2
|
|
|
3
|
+
def add_feed(parent = nil)
|
|
4
|
+
render :partial => 'parts/add_feed', :locals => {:parent => parent}
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
def add_single_feed(parent = nil)
|
|
8
|
+
render :partial => 'parts/add_single_feed', :locals => {:parent => parent}
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def add_extended_feed(parent = nil)
|
|
12
|
+
render :partial => 'parts/add_extended_feed', :locals => {:parent => parent}
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def new_feed_path_with_parent(parent)
|
|
16
|
+
if parent
|
|
17
|
+
feeds_path(make_parent_params(parent))
|
|
18
|
+
else
|
|
19
|
+
feeds_path
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def make_parent_params(parent)
|
|
24
|
+
{ :parent_id => parent.id, :parent_type => parent.class.to_s }
|
|
25
|
+
end
|
|
26
|
+
|
|
3
27
|
end
|
data/app/models/attention.rb
CHANGED
|
@@ -1,2 +1,14 @@
|
|
|
1
|
+
# == Schema Information
|
|
2
|
+
#
|
|
3
|
+
# Table name: attentions
|
|
4
|
+
#
|
|
5
|
+
# id :integer(4) not null, primary key
|
|
6
|
+
# attentionable_id :integer(4)
|
|
7
|
+
# attentionable_type :string(255)
|
|
8
|
+
# entry_id :integer(4)
|
|
9
|
+
# action_type :string(255)
|
|
10
|
+
# weight :float
|
|
11
|
+
#
|
|
12
|
+
|
|
1
13
|
class Attention < ActiveRecord::Base
|
|
2
|
-
end
|
|
14
|
+
end
|
data/app/models/click.rb
CHANGED
|
@@ -1,2 +1,14 @@
|
|
|
1
|
+
# == Schema Information
|
|
2
|
+
#
|
|
3
|
+
# Table name: clicks
|
|
4
|
+
#
|
|
5
|
+
# id :integer(4) not null, primary key
|
|
6
|
+
# recommendation_id :integer(4)
|
|
7
|
+
# when :datetime not null
|
|
8
|
+
# referrer :string(2083)
|
|
9
|
+
# requester :string(255)
|
|
10
|
+
# user_agent :string(2083)
|
|
11
|
+
#
|
|
12
|
+
|
|
1
13
|
class Click < ActiveRecord::Base
|
|
2
14
|
end
|
data/app/models/entry.rb
CHANGED
|
@@ -1,11 +1,39 @@
|
|
|
1
|
+
# == Schema Information
|
|
2
|
+
#
|
|
3
|
+
# Table name: entries
|
|
4
|
+
#
|
|
5
|
+
# id :integer(4) not null, primary key
|
|
6
|
+
# feed_id :integer(4) not null
|
|
7
|
+
# permalink :string(2083) default(""), not null
|
|
8
|
+
# author :string(2083)
|
|
9
|
+
# title :text default(""), not null
|
|
10
|
+
# description :text
|
|
11
|
+
# content :text
|
|
12
|
+
# unique_content :boolean(1)
|
|
13
|
+
# published_at :datetime not null
|
|
14
|
+
# entry_updated_at :datetime
|
|
15
|
+
# harvested_at :datetime
|
|
16
|
+
# oai_identifier :string(2083)
|
|
17
|
+
# language_id :integer(4)
|
|
18
|
+
# direct_link :string(2083)
|
|
19
|
+
# indexed_at :datetime default(Fri Jan 01 01:01:01 UTC 1971), not null
|
|
20
|
+
# relevance_calculated_at :datetime default(Fri Jan 01 01:01:01 UTC 1971), not null
|
|
21
|
+
# popular :text
|
|
22
|
+
# relevant :text
|
|
23
|
+
# other :text
|
|
24
|
+
# grain_size :string(255) default("unknown")
|
|
25
|
+
#
|
|
26
|
+
|
|
1
27
|
class Entry < ActiveRecord::Base
|
|
28
|
+
|
|
2
29
|
belongs_to :feed
|
|
30
|
+
belongs_to :language
|
|
3
31
|
|
|
4
32
|
acts_as_taggable
|
|
5
33
|
|
|
6
34
|
@@default_time_on_page = 60.0
|
|
7
35
|
|
|
8
|
-
|
|
36
|
+
# acts_as_solr({:if => false, :fields => [{:feed_id => :integer}, {:grain_size => :string}]}, {:type_field => :type_s})
|
|
9
37
|
|
|
10
38
|
def self.top_tags(tags = nil)
|
|
11
39
|
|
|
@@ -27,8 +55,21 @@ class Entry < ActiveRecord::Base
|
|
|
27
55
|
end
|
|
28
56
|
|
|
29
57
|
def recommendations(limit = 20, order = "relevance", details = false, omit_feeds = nil)
|
|
30
|
-
sql = "SELECT recommendations.id, dest_entry_id, permalink, entries.title,
|
|
31
|
-
sql << ",
|
|
58
|
+
sql = "SELECT recommendations.id, dest_entry_id, entries.permalink, entries.title, entries.description, entries.direct_link, feeds.short_title AS collection "
|
|
59
|
+
sql << ", relevance_calculated_at, relevance, clicks, avg_time_at_dest AS avg_time_on_target, author, published_at " if details == true
|
|
60
|
+
sql << "FROM recommendations "
|
|
61
|
+
sql << "INNER JOIN entries ON recommendations.dest_entry_id = entries.id "
|
|
62
|
+
sql << "INNER JOIN feeds ON entries.feed_id = feeds.id "
|
|
63
|
+
sql << "WHERE recommendations.entry_id = ? "
|
|
64
|
+
sql << ("AND entries.feed_id NOT IN (" + omit_feeds.gsub(/[^0-9,]/,'') + ") ") if omit_feeds != nil
|
|
65
|
+
sql << "ORDER BY " + order + " DESC "
|
|
66
|
+
sql << "LIMIT " + limit.to_s
|
|
67
|
+
Entry.find_by_sql([sql,self.id])
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
def recommendation_entries(limit = 20, order = "relevance", details = false, omit_feeds = nil)
|
|
71
|
+
sql = "SELECT recommendations.dest_entry_id AS id, entries.permalink, entries.title, entries.description, entries.direct_link, feeds.short_title AS collection "
|
|
72
|
+
sql << ", relevance_calculated_at, relevance, clicks, avg_time_at_dest AS avg_time_on_target, author, published_at " if details == true
|
|
32
73
|
sql << "FROM recommendations "
|
|
33
74
|
sql << "INNER JOIN entries ON recommendations.dest_entry_id = entries.id "
|
|
34
75
|
sql << "INNER JOIN feeds ON entries.feed_id = feeds.id "
|
|
@@ -46,22 +87,14 @@ class Entry < ActiveRecord::Base
|
|
|
46
87
|
|
|
47
88
|
# if they spend longer than two minutes on a page, we don't infer anything
|
|
48
89
|
if time_on_page > 5 and time_on_page < 120
|
|
49
|
-
# puts "==============================old: " + session[:last_clicked_recommendation_uri]
|
|
50
|
-
# puts "==============================new: " + normalized_uri(uri)
|
|
51
90
|
if normalized_uri(uri) != session[:last_clicked_recommendation_uri]
|
|
52
91
|
recommendation = Recommendation.find(recommendation_id)
|
|
53
92
|
entry = Entry.find(recommendation.entry_id)
|
|
54
|
-
# puts "clicks ================= " + recommendation.clicks.to_s
|
|
55
|
-
# puts "old avg ================= " + recommendation.avg_time_at_dest.to_s
|
|
56
93
|
new_avg = (recommendation.avg_time_at_dest*recommendation.clicks - @@default_time_on_page + time_on_page)/recommendation.clicks
|
|
57
94
|
recommendation.avg_time_at_dest = new_avg
|
|
58
|
-
# puts "time on page ================= " + time_on_page.to_s
|
|
59
|
-
# puts "new average ==================== " + new_avg.to_s
|
|
60
95
|
recommendation.save!
|
|
61
96
|
entry.rank_recommendations
|
|
62
97
|
session[:last_clicked_recommendation] = nil
|
|
63
|
-
# else
|
|
64
|
-
# puts "same!!!!!!!!!!!!!!!!!!!!!!!"
|
|
65
98
|
end
|
|
66
99
|
else
|
|
67
100
|
session[:last_clicked_recommendation] = nil if time_on_page > 5
|
|
@@ -196,6 +229,7 @@ class Entry < ActiveRecord::Base
|
|
|
196
229
|
end
|
|
197
230
|
|
|
198
231
|
def rank_recommendations
|
|
232
|
+
return
|
|
199
233
|
# get recommendations for the entry from the recommendations table
|
|
200
234
|
recs = self.recommendations
|
|
201
235
|
|
data/app/models/feed.rb
CHANGED
|
@@ -1,20 +1,70 @@
|
|
|
1
|
-
#
|
|
2
|
-
|
|
1
|
+
# == Schema Information
|
|
2
|
+
#
|
|
3
|
+
# Table name: feeds
|
|
4
|
+
#
|
|
5
|
+
# id :integer(4) not null, primary key
|
|
6
|
+
# uri :string(2083)
|
|
7
|
+
# display_uri :string(2083)
|
|
8
|
+
# title :string(1000)
|
|
9
|
+
# short_title :string(100)
|
|
10
|
+
# description :text
|
|
11
|
+
# tag_filter :string(1000)
|
|
12
|
+
# top_tags :text
|
|
13
|
+
# priority :integer(4) default(10)
|
|
14
|
+
# status :integer(4) default(1)
|
|
15
|
+
# last_requested_at :datetime
|
|
16
|
+
# last_harvested_at :datetime
|
|
17
|
+
# harvest_interval :integer(4) default(86400)
|
|
18
|
+
# failed_requests :integer(4) default(0)
|
|
19
|
+
# error_message :text
|
|
20
|
+
# service_id :integer(4) default(0)
|
|
21
|
+
# login :string(255)
|
|
22
|
+
# password :string(255)
|
|
23
|
+
# created_at :datetime
|
|
24
|
+
# updated_at :datetime
|
|
25
|
+
# entries_changed_at :datetime
|
|
26
|
+
# harvested_from_display_uri :string(2083)
|
|
27
|
+
# harvested_from_title :string(1000)
|
|
28
|
+
# harvested_from_short_title :string(100)
|
|
29
|
+
# entries_count :integer(4)
|
|
30
|
+
# default_language_id :integer(4) default(0)
|
|
31
|
+
# default_grain_size :string(255) default("unknown")
|
|
32
|
+
# contributor_id :integer(4)
|
|
33
|
+
#
|
|
3
34
|
class Feed < ActiveRecord::Base
|
|
4
35
|
|
|
5
|
-
|
|
6
|
-
|
|
36
|
+
require 'httparty'
|
|
37
|
+
|
|
38
|
+
include HTTParty
|
|
39
|
+
format :xml
|
|
7
40
|
|
|
41
|
+
validates_presence_of :uri
|
|
42
|
+
|
|
43
|
+
has_many :feed_parents
|
|
8
44
|
has_many :entries
|
|
9
45
|
belongs_to :contributor, :class_name => 'User', :foreign_key => 'contributor_id'
|
|
46
|
+
belongs_to :default_language, :class_name => 'Language', :foreign_key => 'default_language_id'
|
|
47
|
+
|
|
48
|
+
named_scope :banned, :conditions => "status < 0"
|
|
49
|
+
named_scope :valid, :conditions => "status >= 0"
|
|
50
|
+
named_scope :by_title, :order => "title ASC"
|
|
51
|
+
named_scope :recent, lambda { { :conditions => ['created_at > ?', 1.week.ago] } }
|
|
52
|
+
named_scope :by_newest, :order => "created_at DESC"
|
|
10
53
|
|
|
11
54
|
# named_scope :ready_to_harvest, lambda { |*args| { :conditions => [ "feeds.last_harvested_at < ?", args.first || 1.day.ago.end_of_day ] } }
|
|
12
|
-
|
|
55
|
+
|
|
56
|
+
def after_create
|
|
57
|
+
if GlobalConfig.inform_admin_of_global_feed && self.feed_parents.empty?
|
|
58
|
+
RakerMailer.deliver_notification_feed_added(self) # Global feed. Email the admin to let them know a feed has been added
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
# harvest_interval is stored in seconds
|
|
13
63
|
def refresh_interval_hours
|
|
14
64
|
if self.harvest_interval
|
|
15
|
-
self.harvest_interval
|
|
65
|
+
self.harvest_interval/3600
|
|
16
66
|
else
|
|
17
|
-
|
|
67
|
+
168 # TODO what's this?
|
|
18
68
|
end
|
|
19
69
|
end
|
|
20
70
|
|
|
@@ -26,5 +76,29 @@ class Feed < ActiveRecord::Base
|
|
|
26
76
|
# feed = Feed.first # .ready_to_harvest.first
|
|
27
77
|
# get(feed.uri)
|
|
28
78
|
# end
|
|
79
|
+
|
|
80
|
+
# Gathers all available feed uris from the given uri and parses them into
|
|
81
|
+
# feed objects
|
|
82
|
+
def self.gather_information(uri)
|
|
83
|
+
feeds = []
|
|
84
|
+
@available_feeds = discover_feeds(uri)
|
|
85
|
+
@available_feeds.each do |feed|
|
|
86
|
+
feeds << make_feed(Feedzirra::Feed.fetch_and_parse(feed.url))
|
|
87
|
+
end
|
|
88
|
+
feeds
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
# Turns a feed from feedzirra into a muck feed
|
|
92
|
+
def self.make_feed(feed)
|
|
93
|
+
Feed.new(:short_title => feed.title,
|
|
94
|
+
:title => feed.title,
|
|
95
|
+
:display_uri => feed.url,
|
|
96
|
+
:uri => feed.feed_url)
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
# Looks for feeds from a given url
|
|
100
|
+
def self.discover_feeds(uri)
|
|
101
|
+
Feedbag.find(uri)
|
|
102
|
+
end
|
|
29
103
|
|
|
30
104
|
end
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# == Schema Information
|
|
2
|
+
#
|
|
3
|
+
# Table name: feed_parents
|
|
4
|
+
#
|
|
5
|
+
# id :integer(4) not null, primary key
|
|
6
|
+
# feed_id :integer(4)
|
|
7
|
+
# ownable_id :integer(4)
|
|
8
|
+
# ownable_type :string(255)
|
|
9
|
+
# created_at :datetime
|
|
10
|
+
# updated_at :datetime
|
|
11
|
+
#
|
|
12
|
+
|
|
13
|
+
class FeedParent < ActiveRecord::Base
|
|
14
|
+
unloadable
|
|
15
|
+
|
|
16
|
+
belongs_to :feed
|
|
17
|
+
belongs_to :ownable, :polymorphic => true
|
|
18
|
+
end
|
data/app/models/language.rb
CHANGED
|
@@ -1,2 +1,16 @@
|
|
|
1
|
+
# == Schema Information
|
|
2
|
+
#
|
|
3
|
+
# Table name: languages
|
|
4
|
+
#
|
|
5
|
+
# id :integer(4) not null, primary key
|
|
6
|
+
# name :string(255)
|
|
7
|
+
# english_name :string(255)
|
|
8
|
+
# locale :string(255)
|
|
9
|
+
# supported :boolean(1) default(TRUE)
|
|
10
|
+
# is_default :integer(4) default(0)
|
|
11
|
+
# muck_raker_supported :boolean(1)
|
|
12
|
+
# indexed_records :integer(4) default(0)
|
|
13
|
+
#
|
|
14
|
+
|
|
1
15
|
class Language < ActiveRecord::Base
|
|
2
16
|
end
|
data/app/models/oai_endpoint.rb
CHANGED
|
@@ -1,2 +1,14 @@
|
|
|
1
|
+
# == Schema Information
|
|
2
|
+
#
|
|
3
|
+
# Table name: oai_endpoints
|
|
4
|
+
#
|
|
5
|
+
# id :integer(4) not null, primary key
|
|
6
|
+
# uri :string(2083)
|
|
7
|
+
# display_uri :string(2083)
|
|
8
|
+
# metadata_prefix :string(255)
|
|
9
|
+
# title :string(1000)
|
|
10
|
+
# short_title :string(100)
|
|
11
|
+
#
|
|
12
|
+
|
|
1
13
|
class OaiEndpoint < ActiveRecord::Base
|
|
2
14
|
end
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
class RakerMailer < ActionMailer::Base
|
|
2
|
+
unloadable
|
|
3
|
+
|
|
4
|
+
layout 'email_default'
|
|
5
|
+
default_url_options[:host] = GlobalConfig.application_url
|
|
6
|
+
|
|
7
|
+
def notification_feed_added(feed)
|
|
8
|
+
recipients GlobalConfig.admin_email
|
|
9
|
+
from "#{GlobalConfig.from_email_name} <#{GlobalConfig.from_email}>"
|
|
10
|
+
sent_on Time.now
|
|
11
|
+
subject I18n.t('muck.raker.new_global_feed', :application_name => GlobalConfig.application_name)
|
|
12
|
+
body :feed => feed,
|
|
13
|
+
:application_name => GlobalConfig.application_name
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
end
|
|
@@ -1,2 +1,15 @@
|
|
|
1
|
+
# == Schema Information
|
|
2
|
+
#
|
|
3
|
+
# Table name: recommendations
|
|
4
|
+
#
|
|
5
|
+
# id :integer(4) not null, primary key
|
|
6
|
+
# entry_id :integer(4)
|
|
7
|
+
# dest_entry_id :integer(4)
|
|
8
|
+
# rank :integer(4)
|
|
9
|
+
# relevance :decimal(8, 6) default(0.0)
|
|
10
|
+
# clicks :integer(4) default(0)
|
|
11
|
+
# avg_time_at_dest :integer(4) default(60)
|
|
12
|
+
#
|
|
13
|
+
|
|
1
14
|
class Recommendation < ActiveRecord::Base
|
|
2
15
|
end
|
data/app/models/service.rb
CHANGED
|
@@ -1,2 +1,16 @@
|
|
|
1
|
+
# == Schema Information
|
|
2
|
+
#
|
|
3
|
+
# Table name: services
|
|
4
|
+
#
|
|
5
|
+
# id :integer(4) not null, primary key
|
|
6
|
+
# uri :string(2083) default("")
|
|
7
|
+
# name :string(1000) default("")
|
|
8
|
+
# api_uri :string(2083) default("")
|
|
9
|
+
# uri_template :string(2083) default("")
|
|
10
|
+
# icon :string(2083) default("rss.gif")
|
|
11
|
+
# sequence :integer(4)
|
|
12
|
+
# requires_password :boolean(1)
|
|
13
|
+
#
|
|
14
|
+
|
|
1
15
|
class Service < ActiveRecord::Base
|
|
2
16
|
end
|