muck-invites 3.1.1 → 3.3.0
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 +4 -0
- data/Rakefile +3 -4
- data/VERSION +1 -1
- data/app/helpers/muck_invites_helper.rb +35 -0
- data/app/views/invites/_contact_list.erb +2 -2
- data/app/views/invites/_contact_list_gravatar.erb +4 -4
- data/app/views/invites/_gmail_oauth.erb +5 -5
- data/app/views/invites/_invite_compose.erb +3 -3
- data/app/views/invites/compose.erb +1 -1
- data/lib/muck-invites.rb +1 -0
- data/muck-invites.gemspec +11 -5
- metadata +42 -10
data/README.rdoc
CHANGED
|
@@ -23,8 +23,12 @@ You can include muck-invites.css or copy and paste the styles and change them as
|
|
|
23
23
|
<%= stylesheet_link_tag 'muck-invites' -%>
|
|
24
24
|
|
|
25
25
|
Include a link to initialize the invite process. You might want to do this in a lightbox.
|
|
26
|
+
|
|
27
|
+
The simple version that simply asks for an email and password:
|
|
26
28
|
<%= link_to 'Invite Your Friends', new_invite_path, :class => 'invite_box' %>
|
|
27
29
|
|
|
30
|
+
The better method that uses oauth to talk to email services instead of asking for a password:
|
|
31
|
+
<%= link_to 'Invite Friends', compose_invites_path, :class => 'invite_box' %>
|
|
28
32
|
|
|
29
33
|
=== Oauth
|
|
30
34
|
The invite system can use oauth where available to acquire contacts. To enable this functionality install the
|
data/Rakefile
CHANGED
|
@@ -52,16 +52,15 @@ begin
|
|
|
52
52
|
gem.description = "The invite engine for the muck system."
|
|
53
53
|
gem.authors = ["Justin Ball, Joel Duffin"]
|
|
54
54
|
|
|
55
|
-
gem.add_dependency "contacts"
|
|
55
|
+
gem.add_dependency "contacts", ">=1.2.4"
|
|
56
|
+
gem.add_dependency "muck-portablecontacts"
|
|
56
57
|
gem.add_dependency "hpricot"
|
|
57
58
|
gem.add_dependency "muck-engine"
|
|
59
|
+
gem.add_dependency "muck-auth", ">=3.5.1"
|
|
58
60
|
gem.files.exclude 'test/**'
|
|
59
61
|
gem.test_files.exclude 'test/**'
|
|
60
62
|
end
|
|
61
63
|
Jeweler::GemcutterTasks.new
|
|
62
|
-
Jeweler::RubyforgeTasks.new do |rubyforge|
|
|
63
|
-
rubyforge.doc_task = "rdoc"
|
|
64
|
-
end
|
|
65
64
|
rescue LoadError
|
|
66
65
|
puts "Jeweler not available. Install it with: sudo gem install jeweler"
|
|
67
66
|
end
|
data/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
3.
|
|
1
|
+
3.3.0
|
|
@@ -22,5 +22,40 @@ module MuckInvitesHelper
|
|
|
22
22
|
def contact_container(contacts)
|
|
23
23
|
render :partial => 'invites/contact_container', :locals => { :contacts => contacts }
|
|
24
24
|
end
|
|
25
|
+
|
|
26
|
+
def google_oauth_for(user)
|
|
27
|
+
user.authentications.find_by_provider('google')
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
# Generates a javascript array of emails from gmail. Values will be
|
|
31
|
+
# put into a variable named 'gmail_contacts'
|
|
32
|
+
def gmail_contacts_for_auto_complete(user, ignore_cache = false)
|
|
33
|
+
return unless google_oauth_for(user)
|
|
34
|
+
contacts = gmail_contacts(user, ignore_cache).collect{|contact| "'#{contact[:email]} (#{contact[:name]})'" }
|
|
35
|
+
"var gmail_contacts = [#{contacts.join(',')}];"
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def gmail_contacts(user, ignore_cache = false)
|
|
39
|
+
if @user_gmail_contacts && @user_gmail_contacts[user] && !ignore_cache
|
|
40
|
+
@user_gmail_contacts[user]
|
|
41
|
+
else
|
|
42
|
+
google = google_oauth_for(user)
|
|
43
|
+
if google
|
|
44
|
+
@user_gmail_contacts ||= {}
|
|
45
|
+
result = google.access_token.get('https://www.google.com/m8/feeds/contacts/default/full?max-results=10000')
|
|
46
|
+
contacts = []
|
|
47
|
+
if result.code == '200'
|
|
48
|
+
xml_doc = Nokogiri::XML(result.body) {|config| config.options = Nokogiri::XML::ParseOptions::STRICT }
|
|
49
|
+
contacts = xml_doc.xpath('//xmlns:entry').map do |entry|
|
|
50
|
+
{
|
|
51
|
+
:name => entry.xpath('xmlns:title').inner_html,
|
|
52
|
+
:email => entry.xpath('gd:email').attr('address').value
|
|
53
|
+
}
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
@user_gmail_contacts[user] = contacts
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
end
|
|
25
60
|
|
|
26
61
|
end
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
<% contacts.each_with_index do |contact,i| %>
|
|
3
3
|
<tr class="contact <%= i%2==0 ? 'even' : 'odd' %>">
|
|
4
4
|
<td class="cb"><input type="checkbox" value="<%= h(contact[1]) %>" name="emails[]"></td>
|
|
5
|
-
<td class="name"><%= contact[
|
|
6
|
-
<td class="email"><%= contact[
|
|
5
|
+
<td class="name"><%= contact[:name] %></td>
|
|
6
|
+
<td class="email"><%= contact[:email] %></td>
|
|
7
7
|
</tr>
|
|
8
8
|
<% end %>
|
|
9
9
|
</table>
|
|
@@ -2,10 +2,10 @@
|
|
|
2
2
|
<table class="contacts-list">
|
|
3
3
|
<% contacts.each_with_index do |contact,i| %>
|
|
4
4
|
<tr class="contact <%= i%2==0 ? 'even' : 'odd' %>">
|
|
5
|
-
<td class="cb"><input type="checkbox" value="<%=
|
|
6
|
-
<td class="icon"><%= image_tag(gravatar(contact[
|
|
7
|
-
<td class="name"><%= contact[
|
|
8
|
-
<td class="email"><%= contact[
|
|
5
|
+
<td class="cb"><input type="checkbox" value="<%= contact[:email] %>" name="emails[]"></td>
|
|
6
|
+
<td class="icon"><%= image_tag(gravatar(contact[:email], default_image, 20), :class => 'contact-list-image', :alt => contact[:email]) %></td>
|
|
7
|
+
<td class="name"><%= contact[:name] %></td>
|
|
8
|
+
<td class="email"><%= contact[:email] %></td>
|
|
9
9
|
</tr>
|
|
10
10
|
<% end %>
|
|
11
11
|
</table>
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
<% return unless logged_in? -%>
|
|
2
2
|
<div id="gmail" class="invite-query">
|
|
3
|
-
<% if
|
|
4
|
-
<p><a href="/oauth_consumers/google">Click to connect to your Gmail</a></p>
|
|
5
|
-
<% else -%>
|
|
3
|
+
<% if google_oauth_for(current_user) -%>
|
|
6
4
|
<div class="contact-list">
|
|
7
|
-
<%= contact_container(
|
|
8
|
-
</div>
|
|
5
|
+
<%= contact_container(gmail_contacts(current_user)) %>
|
|
6
|
+
</div>
|
|
7
|
+
<% else -%>
|
|
8
|
+
<p><a href="/auth/google">Connect to Gmail</a></p>
|
|
9
9
|
<% end -%>
|
|
10
10
|
</div>
|
|
@@ -21,11 +21,11 @@
|
|
|
21
21
|
<div class="form-row">
|
|
22
22
|
<label class="invite-email" for="emails">Emails</label>
|
|
23
23
|
<p class="invite-email">Enter emails of friends to invite or select them above:</p>
|
|
24
|
-
<%= text_area_tag :emails, params[:emails] %>
|
|
24
|
+
<%= text_area_tag :emails, emails || params[:emails] %>
|
|
25
25
|
</div>
|
|
26
26
|
<div class="form-row">
|
|
27
27
|
<label class="invite-message" for="message">Message</label>
|
|
28
|
-
<%= text_area_tag :message, params[:message] %>
|
|
28
|
+
<%= text_area_tag :message, message || params[:message] %>
|
|
29
29
|
</div>
|
|
30
30
|
<div class="form-row">
|
|
31
31
|
<%= f.submit t('muck.invites.invite_button'), :class => "button invite-submit" %>
|
|
@@ -49,7 +49,7 @@ jQuery(document).ready(function() {
|
|
|
49
49
|
|
|
50
50
|
apply_ajax_forms();
|
|
51
51
|
|
|
52
|
-
<% if current_user
|
|
52
|
+
<% if google_oauth_for(current_user) -%>
|
|
53
53
|
<%= gmail_contacts_for_auto_complete(current_user) %>
|
|
54
54
|
jQuery("#emails").autocomplete(gmail_contacts, {
|
|
55
55
|
minChars: 1,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
<%= render :partial => 'invites/invite_compose' %>
|
|
1
|
+
<%= render :partial => 'invites/invite_compose', :locals => { :message => nil, :emails => nil } %>
|
data/lib/muck-invites.rb
CHANGED
data/muck-invites.gemspec
CHANGED
|
@@ -5,11 +5,11 @@
|
|
|
5
5
|
|
|
6
6
|
Gem::Specification.new do |s|
|
|
7
7
|
s.name = %q{muck-invites}
|
|
8
|
-
s.version = "3.
|
|
8
|
+
s.version = "3.3.0"
|
|
9
9
|
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
|
11
11
|
s.authors = ["Justin Ball, Joel Duffin"]
|
|
12
|
-
s.date = %q{2011-
|
|
12
|
+
s.date = %q{2011-04-25}
|
|
13
13
|
s.description = %q{The invite engine for the muck system.}
|
|
14
14
|
s.email = %q{justin@tatemae.com}
|
|
15
15
|
s.extra_rdoc_files = [
|
|
@@ -108,18 +108,24 @@ Gem::Specification.new do |s|
|
|
|
108
108
|
s.specification_version = 3
|
|
109
109
|
|
|
110
110
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
|
111
|
-
s.add_runtime_dependency(%q<contacts>, [">=
|
|
111
|
+
s.add_runtime_dependency(%q<contacts>, [">= 1.2.4"])
|
|
112
|
+
s.add_runtime_dependency(%q<muck-portablecontacts>, [">= 0"])
|
|
112
113
|
s.add_runtime_dependency(%q<hpricot>, [">= 0"])
|
|
113
114
|
s.add_runtime_dependency(%q<muck-engine>, [">= 0"])
|
|
115
|
+
s.add_runtime_dependency(%q<muck-auth>, [">= 3.5.1"])
|
|
114
116
|
else
|
|
115
|
-
s.add_dependency(%q<contacts>, [">=
|
|
117
|
+
s.add_dependency(%q<contacts>, [">= 1.2.4"])
|
|
118
|
+
s.add_dependency(%q<muck-portablecontacts>, [">= 0"])
|
|
116
119
|
s.add_dependency(%q<hpricot>, [">= 0"])
|
|
117
120
|
s.add_dependency(%q<muck-engine>, [">= 0"])
|
|
121
|
+
s.add_dependency(%q<muck-auth>, [">= 3.5.1"])
|
|
118
122
|
end
|
|
119
123
|
else
|
|
120
|
-
s.add_dependency(%q<contacts>, [">=
|
|
124
|
+
s.add_dependency(%q<contacts>, [">= 1.2.4"])
|
|
125
|
+
s.add_dependency(%q<muck-portablecontacts>, [">= 0"])
|
|
121
126
|
s.add_dependency(%q<hpricot>, [">= 0"])
|
|
122
127
|
s.add_dependency(%q<muck-engine>, [">= 0"])
|
|
128
|
+
s.add_dependency(%q<muck-auth>, [">= 3.5.1"])
|
|
123
129
|
end
|
|
124
130
|
end
|
|
125
131
|
|
metadata
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: muck-invites
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
hash:
|
|
4
|
+
hash: 11
|
|
5
5
|
prerelease:
|
|
6
6
|
segments:
|
|
7
7
|
- 3
|
|
8
|
-
-
|
|
9
|
-
-
|
|
10
|
-
version: 3.
|
|
8
|
+
- 3
|
|
9
|
+
- 0
|
|
10
|
+
version: 3.3.0
|
|
11
11
|
platform: ruby
|
|
12
12
|
authors:
|
|
13
13
|
- Justin Ball, Joel Duffin
|
|
@@ -15,7 +15,7 @@ autorequire:
|
|
|
15
15
|
bindir: bin
|
|
16
16
|
cert_chain: []
|
|
17
17
|
|
|
18
|
-
date: 2011-
|
|
18
|
+
date: 2011-04-25 00:00:00 -06:00
|
|
19
19
|
default_executable:
|
|
20
20
|
dependencies:
|
|
21
21
|
- !ruby/object:Gem::Dependency
|
|
@@ -26,14 +26,16 @@ dependencies:
|
|
|
26
26
|
requirements:
|
|
27
27
|
- - ">="
|
|
28
28
|
- !ruby/object:Gem::Version
|
|
29
|
-
hash:
|
|
29
|
+
hash: 23
|
|
30
30
|
segments:
|
|
31
|
-
-
|
|
32
|
-
|
|
31
|
+
- 1
|
|
32
|
+
- 2
|
|
33
|
+
- 4
|
|
34
|
+
version: 1.2.4
|
|
33
35
|
type: :runtime
|
|
34
36
|
version_requirements: *id001
|
|
35
37
|
- !ruby/object:Gem::Dependency
|
|
36
|
-
name:
|
|
38
|
+
name: muck-portablecontacts
|
|
37
39
|
prerelease: false
|
|
38
40
|
requirement: &id002 !ruby/object:Gem::Requirement
|
|
39
41
|
none: false
|
|
@@ -47,7 +49,7 @@ dependencies:
|
|
|
47
49
|
type: :runtime
|
|
48
50
|
version_requirements: *id002
|
|
49
51
|
- !ruby/object:Gem::Dependency
|
|
50
|
-
name:
|
|
52
|
+
name: hpricot
|
|
51
53
|
prerelease: false
|
|
52
54
|
requirement: &id003 !ruby/object:Gem::Requirement
|
|
53
55
|
none: false
|
|
@@ -60,6 +62,36 @@ dependencies:
|
|
|
60
62
|
version: "0"
|
|
61
63
|
type: :runtime
|
|
62
64
|
version_requirements: *id003
|
|
65
|
+
- !ruby/object:Gem::Dependency
|
|
66
|
+
name: muck-engine
|
|
67
|
+
prerelease: false
|
|
68
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
|
69
|
+
none: false
|
|
70
|
+
requirements:
|
|
71
|
+
- - ">="
|
|
72
|
+
- !ruby/object:Gem::Version
|
|
73
|
+
hash: 3
|
|
74
|
+
segments:
|
|
75
|
+
- 0
|
|
76
|
+
version: "0"
|
|
77
|
+
type: :runtime
|
|
78
|
+
version_requirements: *id004
|
|
79
|
+
- !ruby/object:Gem::Dependency
|
|
80
|
+
name: muck-auth
|
|
81
|
+
prerelease: false
|
|
82
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
|
83
|
+
none: false
|
|
84
|
+
requirements:
|
|
85
|
+
- - ">="
|
|
86
|
+
- !ruby/object:Gem::Version
|
|
87
|
+
hash: 17
|
|
88
|
+
segments:
|
|
89
|
+
- 3
|
|
90
|
+
- 5
|
|
91
|
+
- 1
|
|
92
|
+
version: 3.5.1
|
|
93
|
+
type: :runtime
|
|
94
|
+
version_requirements: *id005
|
|
63
95
|
description: The invite engine for the muck system.
|
|
64
96
|
email: justin@tatemae.com
|
|
65
97
|
executables: []
|