atreides 2.0.0 → 2.0.1

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.
@@ -0,0 +1,137 @@
1
+ $(function(){
2
+ if ( $(".authenticate-facebook").length ) {
3
+
4
+ var $permissions = ["read_insights","manage_pages"]
5
+
6
+ function status(msg,angry){
7
+ $("#status").css({
8
+ "padding": "10px 15px",
9
+ "width": "69%"
10
+ });
11
+
12
+ if ( angry ){
13
+ $("#status").css({
14
+ "background":"#ffaaaa",
15
+ border: "1px solid #ff6666"
16
+ })
17
+ } else {
18
+ $("#status").css({
19
+ "background":"#aaffaa",
20
+ border: "1px solid #44dd44"
21
+ })
22
+ }
23
+ $("#status").text(msg)
24
+ }
25
+
26
+ $(".deauthenticate-facebook").on("click", function(e){
27
+ e.preventDefault();
28
+ FB.logout(function(response){
29
+ $(".access-container").hide();
30
+ $(".login-container").show();
31
+ })
32
+ })
33
+
34
+
35
+ function checkPermissions(neededPerms, f, params, done){
36
+ console.log("checking permissions")
37
+ FB.api('/me/permissions', function(reponde) {
38
+ var permsArray = reponde.data[0];
39
+ var reUpPerms = new Array();
40
+ console.log(permsArray)
41
+ for(i in neededPerms){
42
+ if ( permsArray[neededPerms[i]] == null && typeof(neededPerms[i]) == "string") {
43
+ reUpPerms.push(neededPerms[i]);
44
+ }
45
+ }
46
+ if (reUpPerms.length > 0) {
47
+ FB.login(function(response){
48
+ if (done){
49
+ status("Please accept all permissions to continue.", true)
50
+ return false;
51
+ }
52
+ // Recheck, just in case the user didn't accept something.
53
+ checkPermissions(neededPerms, f, params, true);
54
+ }, {scope: neededPerms.join(",")});
55
+ } else {
56
+ f.apply(this, params)
57
+ }
58
+ });
59
+ }
60
+
61
+ function dealWithResponse(response, checked){
62
+
63
+ console.log(response)
64
+
65
+ if ( response.status == "connected" ) {
66
+ status("Connected to facebook")
67
+
68
+ // Check for permissions
69
+ if (!checked){
70
+ checkPermissions($permissions, dealWithResponse, [response, true])
71
+ } else {
72
+ var authResponse = response.authResponse,
73
+ accessToken = authResponse.accessToken,
74
+ userId = authResponse.userID,
75
+ expiry = authResponse.expiresIn;
76
+
77
+ // First, get extended token.
78
+ $.post("/admin/facebook",
79
+ {
80
+ access_token: accessToken,
81
+ user_id: userId,
82
+ authenticity_token: $.token,
83
+ expiry: expiry
84
+ }
85
+ ).success(function(){
86
+ status("Token successfully stored.")
87
+ setTimeout(function(){window.location.href = "/admin/"}, 500)
88
+ }).error(function(){
89
+ status("There was a problem updating the page token. Please ensure that you are an admin on Facebook page you are trying to collect analytics for.", true)
90
+ })
91
+ }
92
+ } else if (response.status == "not_authorized") {
93
+ status("Please accept the terms in the facebook dialog", true)
94
+ } else {
95
+ status("There was an error authorizing: " + response.status, true)
96
+ }
97
+ }
98
+
99
+
100
+ $("a.authenticate-facebook").on("click", function(e){
101
+ e.preventDefault();
102
+ FB.getLoginStatus(function(response){
103
+ if ( response.status == "connected" ){
104
+ dealWithResponse(response)
105
+ } else {
106
+ $("p.login-container").show();
107
+ }
108
+ })
109
+ })
110
+
111
+ $("a.fb-login").on("click", function(e){
112
+ e.preventDefault();
113
+ FB.login(function(response){
114
+ if (response.status == "connected"){
115
+ $(".access-container").show();
116
+ $(".login-container").hide();
117
+ } else {
118
+ // nothing
119
+ }
120
+ })
121
+ })
122
+
123
+
124
+ setTimeout(function(){
125
+ // Choose which link to show.
126
+ FB.getLoginStatus(function(response){
127
+ if ( response.status != "unknown" ) {
128
+ $(".access-container").show();
129
+ } else if ( response.status == "unknown" ) {
130
+ $(".login-container").show();
131
+ }
132
+ })
133
+ }, 500)
134
+
135
+
136
+ }
137
+ });
@@ -4,6 +4,7 @@
4
4
  //= require atreides/jquery.easing.1.3
5
5
  //= require jquery-ui
6
6
  //= require atreides/admin_base
7
+ //= require atreides/admin.facebook
7
8
 
8
9
  /*
9
10
  * Atreides - Admin Behaviours
@@ -11,6 +11,32 @@
11
11
  *
12
12
  */
13
13
 
14
+ $.token = function(){
15
+ return $("meta[name='csrf-token']").attr("content");
16
+ }
17
+
18
+ $.removeDiacriticalMarks = function(string) {
19
+ var dictionary = {"a":["\xaa","\xe0","\xe1","\xe2","\xe3","\xe4","\xe5","\u0101","\u0103","\u0105","\u01ce","\u0201","\u0203","\u0227","\u1d43","\u1e01","\u1e9a","\u1ea1","\u1ea3","\u2090","\uff41"],"A":["\xc0","\xc1","\xc2","\xc3","\xc4","\xc5","\u0100","\u0102","\u0104","\u01cd","\u0200","\u0202","\u0226","\u1d2c","\u1e00","\u1ea0","\u1ea2","\uff21"],"b":["\u1d47","\u1e03","\u1e05","\u1e07","\uff42"],"B":["\u1d2e","\u1e02","\u1e04","\u1e06","\uff22"],"c":["\xe7","\u0107","\u0109","\u010b","\u010d","\u1d9c","\u217d","\uff43"],"C":["\xc7","\u0106","\u0108","\u010a","\u010c","\u216d","\uff23"],"d":["\u010f","\u1d48","\u1e0b","\u1e0d","\u1e0f","\u1e11","\u1e13","\u217e","\uff44"],"D":["\u010e","\u1d30","\u1e0a","\u1e0c","\u1e0e","\u1e10","\u1e12","\u216e","\uff24"],"e":["\xe8","\xe9","\xea","\xeb","\u0113","\u0115","\u0117","\u0119","\u011b","\u0205","\u0207","\u0229","\u1d49","\u1e19","\u1e1b","\u1eb9","\u1ebb","\u1ebd","\u2091","\uff45"],"E":["\xc8","\xc9","\xca","\xcb","\u0112","\u0114","\u0116","\u0118","\u011a","\u0204","\u0206","\u0228","\u1d31","\u1e18","\u1e1a","\u1eb8","\u1eba","\u1ebc","\uff25"],"f":["\u1da0","\u1e1f","\uff46"],"F":["\u1e1e","\u2109","\uff26"],"g":["\u011d","\u011f","\u0121","\u0123","\u01e7","\u01f5","\u1d4d","\u1e21","\uff47"],"G":["\u011c","\u011e","\u0120","\u0122","\u01e6","\u01f4","\u1d33","\u1e20","\uff27"],"h":["\u0125","\u021f","\u02b0","\u1e23","\u1e25","\u1e27","\u1e29","\u1e2b","\u1e96","\u210e","\uff48"],"H":["\u0124","\u021e","\u1d34","\u1e22","\u1e24","\u1e26","\u1e28","\u1e2a","\uff28"],"i":["\xec","\xed","\xee","\xef","\u0129","\u012b","\u012d","\u012f","\u01d0","\u0209","\u020b","\u1d62","\u1e2d","\u1ec9","\u1ecb","\u2071","\uff49"],"I":["\xcc","\xcd","\xce","\xcf","\u0128","\u012a","\u012c","\u012e","\u0130","\u01cf","\u0208","\u020a","\u1d35","\u1e2c","\u1ec8","\u1eca","\uff29"],"j":["\u0135","\u01f0","\u02b2","\uff4a"],"J":["\u0134","\u1d36","\uff2a"],"k":["\u0137","\u01e9","\u1d4f","\u1e31","\u1e33","\u1e35","\uff4b"],"K":["\u0136","\u01e8","\u1d37","\u1e30","\u1e32","\u1e34","\u212a","\uff2b"],"l":["\u013a","\u013c","\u013e","\u02e1","\u0140","\u1e37","\u1e3b","\u1e3d","\u217c","\uff4c"],"L":["\u0139","\u013b","\u013d","\u1d38","\u1e36","\u1e3a","\u1e3c","\u216c","\uff2c"],"m":["\u1d50","\u1e3f","\u1e41","\u1e43","\u217f","\uff4d"],"M":["\u1d39","\u1e3e","\u1e40","\u1e42","\u216f","\uff2d"],"n":["\xf1","\u0144","\u0146","\u0148","\u0149","\u1e45","\u1e47","\u1e49","\u1e4b","\uff4e"],"N":["\xd1","\u0143","\u0145","\u0147","\u1d3a","\u1e44","\u1e46","\u1e48","\u1e4a","\uff2e"],"o":["\xba","\xf2","\xf3","\xf4","\xf5","\xf6","\u014d","\u014f","\u0151","\u01d2","\u01eb","\u020d","\u020f","\u022f","\u1d52","\u1ecd","\u1ecf","\uff4f"],"O":["\xd2","\xd3","\xd4","\xd6","\xd5","\u014c","\u014e","\u0150","\u01d1","\u01ea","\u020c","\u020e","\u022e","\u1d3c","\u1ecc","\u1ece","\uff2f"],"p":["\u1d56","\u1e55","\u1e57","\uff50"],"P":["\u1d3e","\u1e54","\u1e56","\uff30"],"q":["\uff51"],"Q":["\uff31"],"r":["\u0155","\u0157","\u0159","\u0211","\u0213","\u02b3","\u1d63","\u1e59","\u1e5a","\u1e5b","\u1e5f","\uff52"],"R":["\u0154","\u0156","\u0158","\u0210","\u0212","\u1d3f","\u1e58","\u1e5e","\uff32"],"s":["\u015b","\u015d","\u015f","\u0161","\u0219","\u1e61","\u1e63","\uff53"],"S":["\u015a","\u015c","\u015e","\u0160","\u0218","\u1e60","\u1e62","\uff33"],"t":["\u0163","\u0165","\u021b","\u1d57","\u1e6b","\u1e6d","\u1e6f","\u1e71","\u1e97","\uff54"],"T":["\u0162","\u0164","\u021a","\u1d40","\u1e6a","\u1e6c","\u1e6e","\u1e70","\uff34"],"u":["\xf9","\xfa","\xfb","\xfc","\u0169","\u016b","\u016d","\u016f","\u0171","\u01b0","\u01d4","\u0215","\u0217","\u1d58","\u1d64","\u1e73","\u1e75","\u1e77","\u1ee5","\u1ee7","\uff55"],"U":["\xd9","\xda","\xdc","\xdb","\u0168","\u016a","\u016c","\u016e","\u0170","\u0172","\u01af","\u01d3","\u0214","\u0216","\u1d41","\u1e72","\u1e74","\u1e76","\u1ee4","\u1ee6","\uff35"],"v":["\u1e7d","\u1e7f","\u1d5b","\u1d65","\uff56"],"V":["\u1e7c","\u1e7e","\u2c7d","\uff36"],"w":["\u0175","\u02b7","\u1e81","\u1e83","\u1e85","\u1e87","\u1e89","\u1e98","\uff57"],"W":["\u0174","\u1d42","\u1e80","\u1e82","\u1e84","\u1e86","\u1e88","\uff37"],"x":["\u02e3","\u1e8b","\u1e8d","\u2093","\uff58"],"X":["\u1e8a","\u1e8c","\uff38"],"y":["\xfd","\xff","\u0177","\u0233","\u02b8","\u1e8f","\u1e99","\u1ef3","\u1ef5","\u1ef7","\u1ef9","\uff59"],"Y":["\xdd","\u0176","\u0178","\u0232","\u1e8e","\u1ef2","\u1ef4","\u1ef6","\u1ef8","\uff39"],"z":["\u017a","\u017c","\u017e","\u1e91","\u1e93","\u1e95","\uff5a"],"Z":["\u0179","\u017b","\u017d","\u1e90","\u1e92","\u1e94","\uff3a"]},
20
+ map = {}, chars, char, pattern = "", i, l;
21
+ for (char in dictionary) {
22
+ chars = dictionary[char];
23
+ for (i=0,l=chars.length; i<l; i++) {
24
+ map[chars[i]] = char;
25
+ pattern += chars[i];
26
+ }
27
+ }
28
+ pattern = new RegExp( "[" + pattern + "]", 'gi');
29
+ // return function(string) {
30
+ // return string ? string.replace(pattern, function(char){
31
+ // return char in map ? map[char] : char;
32
+ // }) : string;
33
+ // };
34
+
35
+ return string ? string.replace(pattern, function(char){
36
+ return char in map ? map[char] : char;
37
+ }) : string;
38
+ }
39
+
14
40
  jQuery.fn.bindAll = function(options) {
15
41
  var $this = this;
16
42
  jQuery.each(options, function(key, val){
@@ -0,0 +1,38 @@
1
+ class Admin::Atreides::FacebookController < ApplicationController
2
+
3
+ layout 'admin'
4
+
5
+ rescue_from CanCan::AccessDenied do |exception|
6
+ Rails.logger.info "AdminController: CanCan::AccessDenied #{exception.inspect}, admin?: #{current_user && !current_user.admin?}; #{current_user.inspect}"
7
+ if current_user && !current_user.admin?
8
+ @message = exception.message
9
+ render 'admin/common/access_denied'
10
+ else
11
+ if atreides_setup?
12
+ redirect_to new_user_session_path, :notice => exception.message
13
+ else
14
+ redirect_to atreides_setup_path
15
+ end
16
+ end
17
+ end
18
+
19
+
20
+ def index
21
+ end
22
+
23
+ def update
24
+ Atreides::FacebookUser.find_or_create(params)
25
+ if Atreides::FacebookUser.authorize_page(Settings.facebook.page_id)
26
+ render :nothing => true, :status => :ok
27
+ else
28
+ render :nothing => true, :status => :error
29
+ end
30
+ end
31
+
32
+ def destroy
33
+ Atreides::FacebookUser.clear
34
+ redirect_to("/admin/facebook")
35
+ end
36
+
37
+
38
+ end
@@ -59,13 +59,13 @@ class Atreides::AdminHomeController < Atreides::ApplicationController
59
59
  # TODO: parameterize the dates
60
60
  if params[:since]
61
61
  @since = Date.parse(params[:since]).beginning_of_day.to_date
62
- @until = (@since + 31.days).beginning_of_day.to_date
63
- @until = Date.today if @until > Date.today
64
62
  else
65
63
  @since = 1.month.ago.beginning_of_day.to_date
66
- @until = Time.now.beginning_of_day.to_day
67
64
  end
68
65
 
66
+ @until = Time.now.end_of_month.beginning_of_day.to_date
67
+ @until = Date.today - 1.day if @until > Date.today
68
+
69
69
  puts "From #{@since.to_s} to #{@until.to_s}"
70
70
 
71
71
  @report_name = report_name = params[:report].to_sym
@@ -82,7 +82,7 @@ class Atreides::AdminHomeController < Atreides::ApplicationController
82
82
  @tweets = Atreides::Tweet.analytics(@since)
83
83
  when :fb_page_views
84
84
  # Facebook insights API
85
- if Settings.facebook && Settings.facebook.page_token && Settings.facebook.page_id
85
+ if Settings.facebook && fb_page_token && Settings.facebook.page_id
86
86
  # @fb_page_views = fb.get(Settings.facebook.page_id, :type => 'insights/page_views/day', :params => {:since => @since})
87
87
  @fb_page_views = fetch_with_caching(5.minutes) do
88
88
  fb.get(Settings.facebook.page_id, :type => 'insights/page_impressions/day', :params => {:since => @since})
@@ -90,7 +90,7 @@ class Atreides::AdminHomeController < Atreides::ApplicationController
90
90
  end
91
91
  when :fb_page_likes
92
92
  # Facebook insights API
93
- if Settings.facebook && Settings.facebook.page_token && Settings.facebook.page_id
93
+ if Settings.facebook && fb_page_token && Settings.facebook.page_id
94
94
  # @fb_page_likes = fb.get(Settings.facebook.page_id, :type => 'insights/page_like_adds/day', :params => {:since => @since})
95
95
  @fb_page_likes = fetch_with_caching(5.minutes) do
96
96
  fb.get(Settings.facebook.page_id, :type => 'insights/page_fan_adds/day', :params => {:since => @since})
@@ -194,7 +194,11 @@ class Atreides::AdminHomeController < Atreides::ApplicationController
194
194
 
195
195
  def fb
196
196
  MiniFB.disable_logging
197
- @fb ||= MiniFB::OAuthSession.new(Settings.facebook.page_token)
197
+ @fb ||= MiniFB::OAuthSession.new(fb_page_token)
198
+ end
199
+
200
+ def fb_page_token
201
+ @page_token ||= Atreides::Preference.get("facebook.page_token")
198
202
  end
199
203
 
200
204
  def fetch_with_caching(duration, &block)
@@ -0,0 +1,103 @@
1
+ class Atreides::FacebookUser
2
+
3
+ class << self
4
+
5
+ def clear
6
+ ["user_id", "access_token", "expiration", "page_token"].each do |key|
7
+ Atreides::Preference.set("facebook.#{key}",nil)
8
+ end
9
+ end
10
+
11
+ def find_or_create(params)
12
+ Rails.logger.debug("[FacebookUser] find_or_create")
13
+ access_token = params[:access_token]
14
+ user_id = params[:user_id]
15
+ expiration = params[:expiry]
16
+
17
+ # if !has_valid_token?
18
+ # Current user is invalid or does not exist
19
+ Rails.logger.debug("[FacebookUser] determined invalid token")
20
+ # See if we can get an extended token
21
+ token_hash = extend_token(access_token)
22
+ if token_hash["status"] == "ok"
23
+ Rails.logger.debug("[FacebookUser] got extended token")
24
+ access_token = token_hash["access_token"]
25
+ expiration = token_hash["expires"]
26
+ else
27
+ Rails.logger.debug("[FacebookUser] did not get extended token")
28
+ end
29
+
30
+ expiration_date = Time.now + expiration.to_i
31
+ expiration_string = expiration_date.to_s(:db)
32
+
33
+ fb_pref("user_id", user_id)
34
+ fb_pref("access_token", access_token)
35
+ fb_pref("expiration", expiration_string)
36
+ Rails.logger.debug("[FacebookUser] set all vars")
37
+ # else
38
+ # Rails.logger.debug("[FacebookUser] token is valid")
39
+ # end
40
+
41
+ Rails.logger.debug("[FacebookUser] leaving")
42
+ true
43
+ end
44
+
45
+ # def has_valid_token?
46
+ # !(fb_pref("access_token").blank? || current_token_expired?)
47
+ # end
48
+
49
+ def current_token_expired?
50
+ return true if fb_pref("expiration").blank?
51
+ Time.parse(fb_pref("expiration")) < Time.now
52
+ end
53
+
54
+ # Returns @response
55
+ # @response is a hash with either keys => ["access_token", "expires", "status"] or keys => ["status"]
56
+ # You may check for errors with ["status"] == "error"
57
+ def extend_token(token)
58
+ begin
59
+ response = MiniFB.fb_exchange_token(Settings.facebook.app_id, Settings.facebook.app_secret, token)
60
+ response["status"] = "ok"
61
+ response
62
+ rescue => e
63
+ {"status" => "error"}
64
+ end
65
+ end
66
+
67
+ def authorize_page(page_id)
68
+ Rails.logger.debug("[FacebookUser] authorize_page")
69
+ response = fb.get(fb_pref("user_id"), :type => "accounts/#{page_id}")
70
+ found = false
71
+ response.data.each do |account|
72
+ Rails.logger.debug("[FacebookUser] checking account #{account.id}")
73
+ if account.id.to_s == page_id.to_s
74
+ Rails.logger.debug("[FacebookUser] found account #{account.id}")
75
+ fb_pref("page_token", account.access_token)
76
+ found = true
77
+ break
78
+ end
79
+ end
80
+
81
+ found
82
+ end
83
+
84
+ private
85
+
86
+ def fb
87
+ MiniFB.disable_logging
88
+ MiniFB::OAuthSession.new(fb_pref("access_token"))
89
+ end
90
+
91
+ def fb_pref(key,value = nil)
92
+ if value.nil?
93
+ Atreides::Preference.get("facebook.#{key}")
94
+ else
95
+ Atreides::Preference.set("facebook.#{key}",value)
96
+ end
97
+ end
98
+
99
+ end
100
+
101
+
102
+
103
+ end
@@ -0,0 +1,31 @@
1
+ class Atreides::Preferences < Atreides::Base
2
+
3
+ #
4
+ # Constants
5
+ #
6
+
7
+ #
8
+ # Associatons
9
+ #
10
+
11
+ #
12
+ # Validations
13
+ #
14
+
15
+ #
16
+ # Callbacks
17
+ #
18
+
19
+
20
+ #
21
+ # Class Methods
22
+ #
23
+ class << self
24
+ end
25
+
26
+ #
27
+ # Instance Methods
28
+ #
29
+
30
+ include Atreides::Extendable
31
+ end
@@ -0,0 +1,29 @@
1
+ - content_for :js do
2
+ :javascript
3
+ (function(d, s, id) {
4
+ var js, fjs = d.getElementsByTagName(s)[0];
5
+ if (d.getElementById(id)) return;
6
+ js = d.createElement(s); js.id = id;
7
+ js.src = "//connect.facebook.net/en_US/all.js#xfbml=1&appId=#{Settings.facebook.app_id}";
8
+ fjs.parentNode.insertBefore(js, fjs);
9
+ }(document, 'script', 'facebook-jssdk'));
10
+
11
+ - content_for :sidebar do
12
+ %ul
13
+ %li
14
+ %a.deauthenticate-facebook{:href => "javascript:;"}Clear current Facebook session
15
+ This will enable you to log in to a different account
16
+ %li{:style => "padding-top: 15px"}
17
+ %hr
18
+ %li
19
+ %a.clear-system{:href => "/admin/facebook", :"data-method" => "delete"} Un-associate account
20
+ Remove account currently associated with Pace Admin Analytics
21
+
22
+ %h2 Facebook Analytics Setup
23
+ %p#status
24
+ %p
25
+ If you are an admin for the Pace Facebook page and the analytics aren't working, follow the directions below:
26
+ %p.login-container{:style => "display: none;"}
27
+ %a.fb-login{:href => "javascript:;"} Click here to log into Facebook and then authenticate
28
+ %p.access-container{:style => "display: none;"}
29
+ %a.authenticate-facebook{:href => "javascript:;"} Click here to authenticate
@@ -11,6 +11,7 @@
11
11
  = csrf_meta_tag
12
12
  = yield :head
13
13
  %body
14
+ #fb-root
14
15
  .container
15
16
  #header
16
17
  #nav
@@ -21,6 +22,8 @@
21
22
  %li.nav-users= link_to_unless_current ttt(:'.users'), admin_users_path
22
23
  %li.nav-github= link_to_unless_current ttt(:'.github'), admin_github_path
23
24
  %li.nav-logout= link_to_unless_current ttt(:'.logout'), destroy_user_session_path
25
+ - if current_user.admin?
26
+ %li.nav-facebook= link_to_unless_current ttt(:'.facebook'), admin_facebook_path
24
27
  %li.nav-search
25
28
  = semantic_form_for Atreides::Post.new, :url => admin_search_path, :html => {:method => :get, :class => "auto-hide-text", :id => "admin_search"} do |f|
26
29
  = link_to_function image_tag("atreides/admin/search_icon.png"), ''
@@ -19,6 +19,7 @@ en:
19
19
  logout: logout
20
20
  search: search
21
21
  users: users
22
+ facebook: facebook
22
23
  github: issues
23
24
 
24
25
  atreides:
@@ -21,6 +21,10 @@ Rails.application.routes.draw do
21
21
  post '/admin/setup/', :to => "atreides/admin_home#setup!", :as => :atreides_do_setup
22
22
 
23
23
  namespace :admin do
24
+ get "facebook" => "atreides/facebook#index", :as => :facebook
25
+ post "facebook" => "atreides/facebook#update", :as => :update_facebook
26
+ delete "facebook" => "atreides/facebook#destroy", :as => :destroy_facebook
27
+
24
28
  resources :posts, :controller => "atreides/posts" do
25
29
  collection do
26
30
  match ':state/:month/:year(.:format)', :to => "atreides/posts#index", :as => :filter, :constraints => { :state => "published", :year => /\d{4}/, :month => /\d{1,2}/ }
@@ -1,4 +1,4 @@
1
1
  # Version string of the Atreides engine
2
2
  module Atreides
3
- VERSION = "2.0.0".freeze
3
+ VERSION = "2.0.1".freeze
4
4
  end
@@ -32,7 +32,7 @@ module Atreides
32
32
  create_features create_products create_line_items create_links
33
33
  create_votes create_tweets create_sessions create_sites
34
34
  create_content_parts add_userid_to_resources devise_create_users
35
- add_role_to_users).each do |f|
35
+ add_role_to_users, create_preferences).each do |f|
36
36
  src = "#{f}.rb"
37
37
  dst = "db/migrate/#{src}"
38
38
  migration_template(src, dst) rescue puts $!
@@ -0,0 +1,14 @@
1
+ class CreatePreferences < ActiveRecord::Migration
2
+ def self.up
3
+ create_table :preferences, :force => true do |t|
4
+ t.string :key, :limit => 512
5
+ t.text :value, :default => ''
6
+ t.timestamps
7
+ end
8
+ add_index :preferences, :key
9
+ end
10
+
11
+ def self.down
12
+ drop_table :preferences
13
+ end
14
+ end
@@ -28,36 +28,13 @@ common: &common
28
28
  user_token:
29
29
  user_secret:
30
30
  facebook:
31
- # GoTo:
32
- # http://graph.facebook.com/oauth/authorize?client_id=CLIENT_ID&redirect_uri=REDIRECT_URL
33
- # -> Get code param and save as the token
34
- # GoTo:
35
- # https://graph.facebook.com/oauth/access_token?client_id=CLIENT_ID&redirect_uri=REDIRECT_URL&client_secret=CLIENT_SECRET&code=CODE
36
- # -> Put resulting access_token into user_token val below
37
- # -> Create a OAuth access_token object with: access_token = OAuth2::AccessToken.new(client, Settings.facebook.user_token)
38
- # -> Get your page's access_token with: access_token.get("/me/accounts")
39
- # -> Put the page's access_token into page_token below
40
- secret_key:
41
- api_key:
42
- code:
43
- user_token:
44
- page_token:
45
31
  page_id:
46
32
  app_id:
33
+ app_secret:
47
34
  twitter:
48
35
  login:
49
36
  consumer_key:
50
37
  consumer_secret:
51
- # oauth = Twitter::OAuth.new(Settings.twitter.consumer_key, Settings.twitter.consumer_secret, :sign_in => true)
52
- # oauth.set_callback_url(app.root_url(:host => Settings.domain))
53
- # rtoken = oauth.request_token.token
54
- # rsecret = oauth.request_token.secret
55
- # oauth.request_token.authorize_url
56
- # -- Go to above URL and sign-in/approve the app and retrieve the verifier param from the return-to-app URL
57
- # oauth_verifier = VERIFIER_KEY
58
- # oauth.authorize_from_request(rtoken, rsecret, oauth_verifier)
59
- # oauth.access_token.token -> use below
60
- # oauth.access_token.secret -> use below
61
38
  app_user_token:
62
39
  app_user_secret:
63
40
  search_for: atreides OR "The 88" OR "Le 88"
@@ -100,11 +77,6 @@ production:
100
77
  profile_id:
101
78
  domain: atreides.com
102
79
  facebook:
103
- # See instructions above
104
- secret_key:
105
- api_key:
106
- code:
107
- user_token:
108
- page_token:
80
+ app_secret:
109
81
  page_id:
110
82
  app_id:
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: atreides
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.0
4
+ version: 2.0.1
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,26 +9,42 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-11-05 00:00:00.000000000 Z
12
+ date: 2012-11-07 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: aasm
16
16
  requirement: !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
- - - ! '>='
19
+ - - ~>
20
20
  - !ruby/object:Gem::Version
21
- version: '0'
21
+ version: 3.0.0
22
22
  type: :runtime
23
23
  prerelease: false
24
24
  version_requirements: !ruby/object:Gem::Requirement
25
25
  none: false
26
26
  requirements:
27
- - - ! '>='
27
+ - - ~>
28
28
  - !ruby/object:Gem::Version
29
- version: '0'
29
+ version: 3.0.0
30
30
  - !ruby/object:Gem::Dependency
31
31
  name: acts-as-taggable-on
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ~>
36
+ - !ruby/object:Gem::Version
37
+ version: 2.3.3
38
+ type: :runtime
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ~>
44
+ - !ruby/object:Gem::Version
45
+ version: 2.3.3
46
+ - !ruby/object:Gem::Dependency
47
+ name: acts_as_commentable
32
48
  requirement: !ruby/object:Gem::Requirement
33
49
  none: false
34
50
  requirements:
@@ -44,7 +60,7 @@ dependencies:
44
60
  - !ruby/object:Gem::Version
45
61
  version: '0'
46
62
  - !ruby/object:Gem::Dependency
47
- name: acts_as_commentable
63
+ name: analytical
48
64
  requirement: !ruby/object:Gem::Requirement
49
65
  none: false
50
66
  requirements:
@@ -124,7 +140,7 @@ dependencies:
124
140
  - !ruby/object:Gem::Version
125
141
  version: '0'
126
142
  - !ruby/object:Gem::Dependency
127
- name: coffee-script
143
+ name: chrisle-gattica
128
144
  requirement: !ruby/object:Gem::Requirement
129
145
  none: false
130
146
  requirements:
@@ -140,7 +156,7 @@ dependencies:
140
156
  - !ruby/object:Gem::Version
141
157
  version: '0'
142
158
  - !ruby/object:Gem::Dependency
143
- name: delayed_job_active_record
159
+ name: coffee-rails
144
160
  requirement: !ruby/object:Gem::Requirement
145
161
  none: false
146
162
  requirements:
@@ -156,7 +172,7 @@ dependencies:
156
172
  - !ruby/object:Gem::Version
157
173
  version: '0'
158
174
  - !ruby/object:Gem::Dependency
159
- name: devise
175
+ name: coffee-script
160
176
  requirement: !ruby/object:Gem::Requirement
161
177
  none: false
162
178
  requirements:
@@ -172,7 +188,7 @@ dependencies:
172
188
  - !ruby/object:Gem::Version
173
189
  version: '0'
174
190
  - !ruby/object:Gem::Dependency
175
- name: dropbox-sdk
191
+ name: delayed_job_active_record
176
192
  requirement: !ruby/object:Gem::Requirement
177
193
  none: false
178
194
  requirements:
@@ -188,23 +204,23 @@ dependencies:
188
204
  - !ruby/object:Gem::Version
189
205
  version: '0'
190
206
  - !ruby/object:Gem::Dependency
191
- name: dynamic_form
207
+ name: devise
192
208
  requirement: !ruby/object:Gem::Requirement
193
209
  none: false
194
210
  requirements:
195
- - - ! '>='
211
+ - - ~>
196
212
  - !ruby/object:Gem::Version
197
- version: '0'
213
+ version: 2.1.2
198
214
  type: :runtime
199
215
  prerelease: false
200
216
  version_requirements: !ruby/object:Gem::Requirement
201
217
  none: false
202
218
  requirements:
203
- - - ! '>='
219
+ - - ~>
204
220
  - !ruby/object:Gem::Version
205
- version: '0'
221
+ version: 2.1.2
206
222
  - !ruby/object:Gem::Dependency
207
- name: formtastic
223
+ name: disqussion
208
224
  requirement: !ruby/object:Gem::Requirement
209
225
  none: false
210
226
  requirements:
@@ -220,7 +236,7 @@ dependencies:
220
236
  - !ruby/object:Gem::Version
221
237
  version: '0'
222
238
  - !ruby/object:Gem::Dependency
223
- name: chrisle-gattica
239
+ name: dropbox-sdk
224
240
  requirement: !ruby/object:Gem::Requirement
225
241
  none: false
226
242
  requirements:
@@ -236,7 +252,7 @@ dependencies:
236
252
  - !ruby/object:Gem::Version
237
253
  version: '0'
238
254
  - !ruby/object:Gem::Dependency
239
- name: oembed_links
255
+ name: dynamic_form
240
256
  requirement: !ruby/object:Gem::Requirement
241
257
  none: false
242
258
  requirements:
@@ -252,7 +268,7 @@ dependencies:
252
268
  - !ruby/object:Gem::Version
253
269
  version: '0'
254
270
  - !ruby/object:Gem::Dependency
255
- name: grackle
271
+ name: em-http-request
256
272
  requirement: !ruby/object:Gem::Requirement
257
273
  none: false
258
274
  requirements:
@@ -268,7 +284,7 @@ dependencies:
268
284
  - !ruby/object:Gem::Version
269
285
  version: '0'
270
286
  - !ruby/object:Gem::Dependency
271
- name: haml
287
+ name: em-net-http
272
288
  requirement: !ruby/object:Gem::Requirement
273
289
  none: false
274
290
  requirements:
@@ -284,7 +300,7 @@ dependencies:
284
300
  - !ruby/object:Gem::Version
285
301
  version: '0'
286
302
  - !ruby/object:Gem::Dependency
287
- name: has_scope
303
+ name: em-synchrony
288
304
  requirement: !ruby/object:Gem::Requirement
289
305
  none: false
290
306
  requirements:
@@ -300,23 +316,23 @@ dependencies:
300
316
  - !ruby/object:Gem::Version
301
317
  version: '0'
302
318
  - !ruby/object:Gem::Dependency
303
- name: htmlentities
319
+ name: formtastic
304
320
  requirement: !ruby/object:Gem::Requirement
305
321
  none: false
306
322
  requirements:
307
- - - ! '>='
323
+ - - ~>
308
324
  - !ruby/object:Gem::Version
309
- version: '0'
325
+ version: 2.2.1
310
326
  type: :runtime
311
327
  prerelease: false
312
328
  version_requirements: !ruby/object:Gem::Requirement
313
329
  none: false
314
330
  requirements:
315
- - - ! '>='
331
+ - - ~>
316
332
  - !ruby/object:Gem::Version
317
- version: '0'
333
+ version: 2.2.1
318
334
  - !ruby/object:Gem::Dependency
319
- name: inherited_resources
335
+ name: grackle
320
336
  requirement: !ruby/object:Gem::Requirement
321
337
  none: false
322
338
  requirements:
@@ -332,7 +348,7 @@ dependencies:
332
348
  - !ruby/object:Gem::Version
333
349
  version: '0'
334
350
  - !ruby/object:Gem::Dependency
335
- name: jquery-rails
351
+ name: haml
336
352
  requirement: !ruby/object:Gem::Requirement
337
353
  none: false
338
354
  requirements:
@@ -348,7 +364,7 @@ dependencies:
348
364
  - !ruby/object:Gem::Version
349
365
  version: '0'
350
366
  - !ruby/object:Gem::Dependency
351
- name: mini_fb
367
+ name: has_scope
352
368
  requirement: !ruby/object:Gem::Requirement
353
369
  none: false
354
370
  requirements:
@@ -364,7 +380,7 @@ dependencies:
364
380
  - !ruby/object:Gem::Version
365
381
  version: '0'
366
382
  - !ruby/object:Gem::Dependency
367
- name: nokogiri
383
+ name: htmlentities
368
384
  requirement: !ruby/object:Gem::Requirement
369
385
  none: false
370
386
  requirements:
@@ -380,7 +396,7 @@ dependencies:
380
396
  - !ruby/object:Gem::Version
381
397
  version: '0'
382
398
  - !ruby/object:Gem::Dependency
383
- name: oauth2
399
+ name: inherited_resources
384
400
  requirement: !ruby/object:Gem::Requirement
385
401
  none: false
386
402
  requirements:
@@ -396,7 +412,7 @@ dependencies:
396
412
  - !ruby/object:Gem::Version
397
413
  version: '0'
398
414
  - !ruby/object:Gem::Dependency
399
- name: paperclip
415
+ name: jquery-rails
400
416
  requirement: !ruby/object:Gem::Requirement
401
417
  none: false
402
418
  requirements:
@@ -412,39 +428,39 @@ dependencies:
412
428
  - !ruby/object:Gem::Version
413
429
  version: '0'
414
430
  - !ruby/object:Gem::Dependency
415
- name: rails
431
+ name: mini_fb
416
432
  requirement: !ruby/object:Gem::Requirement
417
433
  none: false
418
434
  requirements:
419
- - - ~>
435
+ - - ! '>='
420
436
  - !ruby/object:Gem::Version
421
- version: '3.0'
437
+ version: '0'
422
438
  type: :runtime
423
439
  prerelease: false
424
440
  version_requirements: !ruby/object:Gem::Requirement
425
441
  none: false
426
442
  requirements:
427
- - - ~>
443
+ - - ! '>='
428
444
  - !ruby/object:Gem::Version
429
- version: '3.0'
445
+ version: '0'
430
446
  - !ruby/object:Gem::Dependency
431
- name: redcarpet
447
+ name: multi_json
432
448
  requirement: !ruby/object:Gem::Requirement
433
449
  none: false
434
450
  requirements:
435
- - - ! '>='
451
+ - - ~>
436
452
  - !ruby/object:Gem::Version
437
- version: '0'
453
+ version: '1.3'
438
454
  type: :runtime
439
455
  prerelease: false
440
456
  version_requirements: !ruby/object:Gem::Requirement
441
457
  none: false
442
458
  requirements:
443
- - - ! '>='
459
+ - - ~>
444
460
  - !ruby/object:Gem::Version
445
- version: '0'
461
+ version: '1.3'
446
462
  - !ruby/object:Gem::Dependency
447
- name: responders
463
+ name: nokogiri
448
464
  requirement: !ruby/object:Gem::Requirement
449
465
  none: false
450
466
  requirements:
@@ -460,7 +476,7 @@ dependencies:
460
476
  - !ruby/object:Gem::Version
461
477
  version: '0'
462
478
  - !ruby/object:Gem::Dependency
463
- name: settingslogic
479
+ name: oauth2
464
480
  requirement: !ruby/object:Gem::Requirement
465
481
  none: false
466
482
  requirements:
@@ -476,7 +492,7 @@ dependencies:
476
492
  - !ruby/object:Gem::Version
477
493
  version: '0'
478
494
  - !ruby/object:Gem::Dependency
479
- name: tumblr-api
495
+ name: oembed_links
480
496
  requirement: !ruby/object:Gem::Requirement
481
497
  none: false
482
498
  requirements:
@@ -492,7 +508,7 @@ dependencies:
492
508
  - !ruby/object:Gem::Version
493
509
  version: '0'
494
510
  - !ruby/object:Gem::Dependency
495
- name: tweetstream
511
+ name: paperclip
496
512
  requirement: !ruby/object:Gem::Requirement
497
513
  none: false
498
514
  requirements:
@@ -508,23 +524,23 @@ dependencies:
508
524
  - !ruby/object:Gem::Version
509
525
  version: '0'
510
526
  - !ruby/object:Gem::Dependency
511
- name: twitter
527
+ name: rails
512
528
  requirement: !ruby/object:Gem::Requirement
513
529
  none: false
514
530
  requirements:
515
- - - ! '>='
531
+ - - ~>
516
532
  - !ruby/object:Gem::Version
517
- version: '0'
533
+ version: '3.0'
518
534
  type: :runtime
519
535
  prerelease: false
520
536
  version_requirements: !ruby/object:Gem::Requirement
521
537
  none: false
522
538
  requirements:
523
- - - ! '>='
539
+ - - ~>
524
540
  - !ruby/object:Gem::Version
525
- version: '0'
541
+ version: '3.0'
526
542
  - !ruby/object:Gem::Dependency
527
- name: unicode_utils
543
+ name: rack-fiber_pool
528
544
  requirement: !ruby/object:Gem::Requirement
529
545
  none: false
530
546
  requirements:
@@ -540,7 +556,7 @@ dependencies:
540
556
  - !ruby/object:Gem::Version
541
557
  version: '0'
542
558
  - !ruby/object:Gem::Dependency
543
- name: validates_email_format_of
559
+ name: redcarpet
544
560
  requirement: !ruby/object:Gem::Requirement
545
561
  none: false
546
562
  requirements:
@@ -556,23 +572,23 @@ dependencies:
556
572
  - !ruby/object:Gem::Version
557
573
  version: '0'
558
574
  - !ruby/object:Gem::Dependency
559
- name: will_paginate
575
+ name: responders
560
576
  requirement: !ruby/object:Gem::Requirement
561
577
  none: false
562
578
  requirements:
563
- - - ~>
579
+ - - ! '>='
564
580
  - !ruby/object:Gem::Version
565
- version: 3.0.3
581
+ version: '0'
566
582
  type: :runtime
567
583
  prerelease: false
568
584
  version_requirements: !ruby/object:Gem::Requirement
569
585
  none: false
570
586
  requirements:
571
- - - ~>
587
+ - - ! '>='
572
588
  - !ruby/object:Gem::Version
573
- version: 3.0.3
589
+ version: '0'
574
590
  - !ruby/object:Gem::Dependency
575
- name: yard
591
+ name: sass-rails
576
592
  requirement: !ruby/object:Gem::Requirement
577
593
  none: false
578
594
  requirements:
@@ -588,7 +604,7 @@ dependencies:
588
604
  - !ruby/object:Gem::Version
589
605
  version: '0'
590
606
  - !ruby/object:Gem::Dependency
591
- name: analytical
607
+ name: settingslogic
592
608
  requirement: !ruby/object:Gem::Requirement
593
609
  none: false
594
610
  requirements:
@@ -604,7 +620,7 @@ dependencies:
604
620
  - !ruby/object:Gem::Version
605
621
  version: '0'
606
622
  - !ruby/object:Gem::Dependency
607
- name: yajl-ruby
623
+ name: tumblr-api
608
624
  requirement: !ruby/object:Gem::Requirement
609
625
  none: false
610
626
  requirements:
@@ -620,55 +636,55 @@ dependencies:
620
636
  - !ruby/object:Gem::Version
621
637
  version: '0'
622
638
  - !ruby/object:Gem::Dependency
623
- name: disqussion
639
+ name: tweetstream
624
640
  requirement: !ruby/object:Gem::Requirement
625
641
  none: false
626
642
  requirements:
627
- - - ! '>='
643
+ - - ~>
628
644
  - !ruby/object:Gem::Version
629
- version: '0'
645
+ version: 2.1.0
630
646
  type: :runtime
631
647
  prerelease: false
632
648
  version_requirements: !ruby/object:Gem::Requirement
633
649
  none: false
634
650
  requirements:
635
- - - ! '>='
651
+ - - ~>
636
652
  - !ruby/object:Gem::Version
637
- version: '0'
653
+ version: 2.1.0
638
654
  - !ruby/object:Gem::Dependency
639
- name: sass-rails
655
+ name: twitter
640
656
  requirement: !ruby/object:Gem::Requirement
641
657
  none: false
642
658
  requirements:
643
- - - ! '>='
659
+ - - ~>
644
660
  - !ruby/object:Gem::Version
645
- version: '0'
661
+ version: 3.6.0
646
662
  type: :runtime
647
663
  prerelease: false
648
664
  version_requirements: !ruby/object:Gem::Requirement
649
665
  none: false
650
666
  requirements:
651
- - - ! '>='
667
+ - - ~>
652
668
  - !ruby/object:Gem::Version
653
- version: '0'
669
+ version: 3.6.0
654
670
  - !ruby/object:Gem::Dependency
655
- name: coffee-rails
671
+ name: uglifier
656
672
  requirement: !ruby/object:Gem::Requirement
657
673
  none: false
658
674
  requirements:
659
- - - ! '>='
675
+ - - ~>
660
676
  - !ruby/object:Gem::Version
661
- version: '0'
677
+ version: 1.2.7
662
678
  type: :runtime
663
679
  prerelease: false
664
680
  version_requirements: !ruby/object:Gem::Requirement
665
681
  none: false
666
682
  requirements:
667
- - - ! '>='
683
+ - - ~>
668
684
  - !ruby/object:Gem::Version
669
- version: '0'
685
+ version: 1.2.7
670
686
  - !ruby/object:Gem::Dependency
671
- name: uglifier
687
+ name: unicode_utils
672
688
  requirement: !ruby/object:Gem::Requirement
673
689
  none: false
674
690
  requirements:
@@ -684,7 +700,7 @@ dependencies:
684
700
  - !ruby/object:Gem::Version
685
701
  version: '0'
686
702
  - !ruby/object:Gem::Dependency
687
- name: rack-fiber_pool
703
+ name: validates_email_format_of
688
704
  requirement: !ruby/object:Gem::Requirement
689
705
  none: false
690
706
  requirements:
@@ -700,23 +716,23 @@ dependencies:
700
716
  - !ruby/object:Gem::Version
701
717
  version: '0'
702
718
  - !ruby/object:Gem::Dependency
703
- name: em-http-request
719
+ name: will_paginate
704
720
  requirement: !ruby/object:Gem::Requirement
705
721
  none: false
706
722
  requirements:
707
- - - ! '>='
723
+ - - ~>
708
724
  - !ruby/object:Gem::Version
709
- version: '0'
725
+ version: 3.0.3
710
726
  type: :runtime
711
727
  prerelease: false
712
728
  version_requirements: !ruby/object:Gem::Requirement
713
729
  none: false
714
730
  requirements:
715
- - - ! '>='
731
+ - - ~>
716
732
  - !ruby/object:Gem::Version
717
- version: '0'
733
+ version: 3.0.3
718
734
  - !ruby/object:Gem::Dependency
719
- name: em-net-http
735
+ name: yajl-ruby
720
736
  requirement: !ruby/object:Gem::Requirement
721
737
  none: false
722
738
  requirements:
@@ -732,7 +748,7 @@ dependencies:
732
748
  - !ruby/object:Gem::Version
733
749
  version: '0'
734
750
  - !ruby/object:Gem::Dependency
735
- name: em-synchrony
751
+ name: yard
736
752
  requirement: !ruby/object:Gem::Requirement
737
753
  none: false
738
754
  requirements:
@@ -1115,8 +1131,7 @@ dependencies:
1115
1131
  - - ! '>='
1116
1132
  - !ruby/object:Gem::Version
1117
1133
  version: '0'
1118
- description: Atreides is an engine providing a evented CMS following a KISS principle,
1119
- updated for Heroku
1134
+ description: Atreides is an engine providing a evented CMS following a KISS principle
1120
1135
  email:
1121
1136
  - hello@lovethe88.com
1122
1137
  executables: []
@@ -1218,6 +1233,7 @@ files:
1218
1233
  - lib/generators/templates/create_pages.rb
1219
1234
  - lib/generators/templates/create_photos.rb
1220
1235
  - lib/generators/templates/create_posts.rb
1236
+ - lib/generators/templates/create_preferences.rb
1221
1237
  - lib/generators/templates/create_products.rb
1222
1238
  - lib/generators/templates/create_sessions.rb
1223
1239
  - lib/generators/templates/create_sites.rb
@@ -1240,6 +1256,7 @@ files:
1240
1256
  - lib/tasks/cucumber.rake
1241
1257
  - lib/tasks/tasks.rake
1242
1258
  - lib/tasks/yard.rake
1259
+ - app/assets/javascripts/atreides/admin.facebook.js
1243
1260
  - app/assets/javascripts/atreides/admin.js
1244
1261
  - app/assets/javascripts/atreides/admin_base.js.erb
1245
1262
  - app/assets/javascripts/atreides/admin_edit.js
@@ -1260,6 +1277,7 @@ files:
1260
1277
  - app/controllers/admin/atreides/comments_controller.rb
1261
1278
  - app/controllers/admin/atreides/content_parts_controller.rb
1262
1279
  - app/controllers/admin/atreides/dropbox_controller.rb
1280
+ - app/controllers/admin/atreides/facebook_controller.rb
1263
1281
  - app/controllers/admin/atreides/features_controller.rb
1264
1282
  - app/controllers/admin/atreides/github_controller.rb
1265
1283
  - app/controllers/admin/atreides/links_controller.rb
@@ -1309,6 +1327,7 @@ files:
1309
1327
  - app/models/atreides/ability.rb
1310
1328
  - app/models/atreides/comment.rb
1311
1329
  - app/models/atreides/content_part.rb
1330
+ - app/models/atreides/facebook_user.rb
1312
1331
  - app/models/atreides/feature.rb
1313
1332
  - app/models/atreides/github.rb
1314
1333
  - app/models/atreides/like.rb
@@ -1319,6 +1338,7 @@ files:
1319
1338
  - app/models/atreides/page.rb
1320
1339
  - app/models/atreides/photo.rb
1321
1340
  - app/models/atreides/post.rb
1341
+ - app/models/atreides/preferences.rb
1322
1342
  - app/models/atreides/product.rb
1323
1343
  - app/models/atreides/site.rb
1324
1344
  - app/models/atreides/size.rb
@@ -1347,6 +1367,7 @@ files:
1347
1367
  - app/views/admin/atreides/dropbox/_uploader.html.haml
1348
1368
  - app/views/admin/atreides/dropbox/list.html.haml
1349
1369
  - app/views/admin/atreides/dropbox/setup.html.haml
1370
+ - app/views/admin/atreides/facebook/index.html.haml
1350
1371
  - app/views/admin/atreides/features/_form.html.haml
1351
1372
  - app/views/admin/atreides/features/edit.html.haml
1352
1373
  - app/views/admin/atreides/features/index.html.haml
@@ -1431,7 +1452,7 @@ files:
1431
1452
  - config/routes.rb
1432
1453
  - LICENSE
1433
1454
  - README.rdoc
1434
- homepage: http://lovethe88.com
1455
+ homepage: http://the88.github.com/Atreides/
1435
1456
  licenses: []
1436
1457
  post_install_message:
1437
1458
  rdoc_options: []