atreides 2.0.0 → 2.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -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: []