Merge branch 'master' into issue-2032-view-comments-on-public-post-without-login
Conflicts: app/controllers/comments_controller.rb app/helpers/comments_helper.rb
This commit is contained in:
commit
3ce0806cbc
320 changed files with 8262 additions and 4743 deletions
|
|
@ -2,7 +2,6 @@ branches:
|
|||
only:
|
||||
- 'master'
|
||||
|
||||
|
||||
rvm:
|
||||
- 1.8.7
|
||||
- ree
|
||||
|
|
|
|||
4
Gemfile
4
Gemfile
|
|
@ -40,7 +40,7 @@ gem 'sqlite3' if ENV['DB'] == 'all' || ENV['DB'] == 'sqlite'
|
|||
# file uploading
|
||||
|
||||
gem 'aws', '2.3.32' # upgrade to 2.4 breaks 1.8 >.<
|
||||
gem 'carrierwave', '0.5.2'
|
||||
gem 'carrierwave', '0.5.3'
|
||||
gem 'excon', '0.2.4'
|
||||
gem 'fastercsv', '1.5.4', :require => false
|
||||
gem 'fog', '0.3.25'
|
||||
|
|
@ -97,6 +97,7 @@ gem 'haml', '3.1.2'
|
|||
gem 'mobile-fu'
|
||||
gem 'sass', '3.1.7'
|
||||
gem 'will_paginate', '3.0.pre2'
|
||||
gem 'client_side_validations'
|
||||
|
||||
# web
|
||||
|
||||
|
|
@ -117,6 +118,7 @@ end
|
|||
group :test do
|
||||
gem 'capybara', '~> 0.3.9'
|
||||
gem 'cucumber-rails', '0.3.2'
|
||||
gem 'cucumber-api-steps', :require => false
|
||||
gem 'database_cleaner', '0.6.0'
|
||||
gem 'diaspora-client', :git => 'git://github.com/diaspora/diaspora-client.git'
|
||||
#"0.1.0", #:path => '~/workspace/diaspora-client'
|
||||
|
|
|
|||
39
Gemfile.lock
39
Gemfile.lock
|
|
@ -104,7 +104,7 @@ GEM
|
|||
xml-simple
|
||||
bcrypt-ruby (2.1.4)
|
||||
builder (2.1.2)
|
||||
bunny (0.7.6)
|
||||
bunny (0.7.8)
|
||||
capistrano (2.5.19)
|
||||
highline
|
||||
net-scp (>= 1.0.0)
|
||||
|
|
@ -120,7 +120,7 @@ GEM
|
|||
rack (>= 1.0.0)
|
||||
rack-test (>= 0.5.4)
|
||||
selenium-webdriver (>= 0.0.3)
|
||||
carrierwave (0.5.2)
|
||||
carrierwave (0.5.3)
|
||||
activesupport (~> 3.0)
|
||||
cgi_multipart_eof_fix (2.5.0)
|
||||
chef (0.9.12)
|
||||
|
|
@ -128,17 +128,18 @@ GEM
|
|||
erubis
|
||||
extlib
|
||||
highline
|
||||
json (<= 1.4.6, >= 1.4.4)
|
||||
json (>= 1.4.4, <= 1.4.6)
|
||||
mixlib-authentication (>= 1.1.0)
|
||||
mixlib-cli (>= 1.1.0)
|
||||
mixlib-config (>= 1.1.2)
|
||||
mixlib-log (>= 1.2.0)
|
||||
moneta
|
||||
ohai (>= 0.5.7)
|
||||
rest-client (< 1.7.0, >= 1.0.4)
|
||||
rest-client (>= 1.0.4, < 1.7.0)
|
||||
uuidtools
|
||||
childprocess (0.2.2)
|
||||
ffi (~> 1.0.6)
|
||||
client_side_validations (3.1.0)
|
||||
closure-compiler (1.1.4)
|
||||
cloudfiles (1.4.10)
|
||||
mime-types (>= 1.16)
|
||||
|
|
@ -150,6 +151,9 @@ GEM
|
|||
gherkin (~> 2.5.0)
|
||||
json (>= 1.4.6)
|
||||
term-ansicolor (>= 1.0.6)
|
||||
cucumber-api-steps (0.6)
|
||||
cucumber (>= 0.8.3)
|
||||
jsonpath (>= 0.1.2)
|
||||
cucumber-rails (0.3.2)
|
||||
cucumber (>= 0.8.0)
|
||||
culerity (0.2.15)
|
||||
|
|
@ -161,7 +165,7 @@ GEM
|
|||
warden (~> 1.0.3)
|
||||
devise_invitable (0.5.0)
|
||||
devise (~> 1.3.1)
|
||||
rails (<= 3.2, >= 3.0.0)
|
||||
rails (>= 3.0.0, <= 3.2)
|
||||
diff-lcs (1.1.3)
|
||||
em-synchrony (0.2.0)
|
||||
eventmachine (>= 0.12.9)
|
||||
|
|
@ -178,7 +182,7 @@ GEM
|
|||
faraday (0.6.1)
|
||||
addressable (~> 2.2.4)
|
||||
multipart-post (~> 1.1.0)
|
||||
rack (< 2, >= 1.1.0)
|
||||
rack (>= 1.1.0, < 2)
|
||||
faraday-stack (0.1.3)
|
||||
faraday (~> 0.6)
|
||||
faraday_middleware (0.6.5)
|
||||
|
|
@ -208,7 +212,7 @@ GEM
|
|||
rspec-instafail (~> 0.1.8)
|
||||
ruby-progressbar (~> 0.0.10)
|
||||
gem_plugin (0.2.3)
|
||||
gherkin (2.5.1)
|
||||
gherkin (2.5.2)
|
||||
json (>= 1.4.6)
|
||||
haml (3.1.2)
|
||||
hashie (1.0.0)
|
||||
|
|
@ -235,6 +239,8 @@ GEM
|
|||
jasmine-core (1.2.0.rc1)
|
||||
json (1.4.6)
|
||||
json_pure (1.6.1)
|
||||
jsonpath (0.4.2)
|
||||
multi_json
|
||||
jwt (0.1.3)
|
||||
json (>= 1.2.4)
|
||||
linecache (0.43)
|
||||
|
|
@ -276,7 +282,7 @@ GEM
|
|||
net-ssh (2.0.24)
|
||||
net-ssh-gateway (1.1.0)
|
||||
net-ssh (>= 1.99.1)
|
||||
newrelic_rpm (3.1.2)
|
||||
newrelic_rpm (3.2.0)
|
||||
nokogiri (1.4.3.1)
|
||||
oa-basic (0.2.6)
|
||||
oa-core (= 0.2.6)
|
||||
|
|
@ -313,7 +319,7 @@ GEM
|
|||
addressable (~> 2.2)
|
||||
ohai (0.5.8)
|
||||
extlib
|
||||
json (<= 1.4.6, >= 1.4.4)
|
||||
json (>= 1.4.4, <= 1.4.6)
|
||||
mixlib-cli
|
||||
mixlib-config
|
||||
mixlib-log
|
||||
|
|
@ -350,7 +356,7 @@ GEM
|
|||
activesupport (= 3.0.10)
|
||||
bundler (~> 1.0)
|
||||
railties (= 3.0.10)
|
||||
rails-i18n (0.1.9)
|
||||
rails-i18n (0.1.10)
|
||||
i18n (~> 0.5)
|
||||
railties (3.0.10)
|
||||
actionpack (= 3.0.10)
|
||||
|
|
@ -361,7 +367,8 @@ GEM
|
|||
rake (0.9.2)
|
||||
rash (0.3.0)
|
||||
hashie (~> 1.0.0)
|
||||
rdoc (3.9.4)
|
||||
rdoc (3.10)
|
||||
json (~> 1.4)
|
||||
redcarpet (2.0.0b5)
|
||||
redis (2.2.2)
|
||||
redis-namespace (0.8.0)
|
||||
|
|
@ -429,7 +436,7 @@ GEM
|
|||
sqlite3 (1.3.4)
|
||||
subexec (0.0.4)
|
||||
systemu (2.4.0)
|
||||
term-ansicolor (1.0.6)
|
||||
term-ansicolor (1.0.7)
|
||||
thin (1.2.11)
|
||||
daemons (>= 1.0.9)
|
||||
eventmachine (>= 0.12.6)
|
||||
|
|
@ -454,13 +461,13 @@ GEM
|
|||
uuidtools (2.1.2)
|
||||
vegas (0.1.8)
|
||||
rack (>= 1.0.0)
|
||||
warden (1.0.5)
|
||||
warden (1.0.6)
|
||||
rack (>= 1.0)
|
||||
webmock (1.6.2)
|
||||
addressable (>= 2.2.2)
|
||||
crack (>= 0.1.7)
|
||||
will_paginate (3.0.pre2)
|
||||
xml-simple (1.1.0)
|
||||
xml-simple (1.1.1)
|
||||
yard (0.7.2)
|
||||
yui-compressor (0.9.6)
|
||||
POpen4 (>= 0.1.4)
|
||||
|
|
@ -478,9 +485,11 @@ DEPENDENCIES
|
|||
capistrano (= 2.5.19)
|
||||
capistrano-ext (= 1.2.1)
|
||||
capybara (~> 0.3.9)
|
||||
carrierwave (= 0.5.2)
|
||||
carrierwave (= 0.5.3)
|
||||
chef (= 0.9.12)
|
||||
client_side_validations
|
||||
cloudfiles (= 1.4.10)
|
||||
cucumber-api-steps
|
||||
cucumber-rails (= 0.3.2)
|
||||
database_cleaner (= 0.6.0)
|
||||
devise (~> 1.3.1)
|
||||
|
|
|
|||
|
|
@ -48,7 +48,7 @@ class ActivityStreams::PhotosController < ApplicationController
|
|||
end
|
||||
|
||||
def show
|
||||
@photo = current_user.find_visible_post_by_id(params[:id])
|
||||
@photo = current_user.find_visible_shareable_by_id(Photo, params[:id])
|
||||
respond_with @photo
|
||||
end
|
||||
|
||||
|
|
|
|||
9
app/controllers/api/v0/tags_controller.rb
Normal file
9
app/controllers/api/v0/tags_controller.rb
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
# Copyright (c) 2010-2011, Diaspora Inc. This file is
|
||||
# licensed under the Affero General Public License version 3 or later. See
|
||||
# the COPYRIGHT file.
|
||||
|
||||
class Api::V0::TagsController < ApplicationController
|
||||
def show
|
||||
render :json => Api::V0::Serializers::Tag.new(params[:name])
|
||||
end
|
||||
end
|
||||
13
app/controllers/api/v0/users_controller.rb
Normal file
13
app/controllers/api/v0/users_controller.rb
Normal file
|
|
@ -0,0 +1,13 @@
|
|||
# Copyright (c) 2010-2011, Diaspora Inc. This file is
|
||||
# licensed under the Affero General Public License version 3 or later. See
|
||||
# the COPYRIGHT file.
|
||||
|
||||
class Api::V0::UsersController < ApplicationController
|
||||
def show
|
||||
if user = User.find_by_username(params[:username])
|
||||
render :json => Api::V0::Serializers::User.new(user)
|
||||
else
|
||||
head :not_found
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
@ -22,7 +22,8 @@ class ApplicationController < ActionController::Base
|
|||
:my_contacts_count,
|
||||
:only_sharing_count,
|
||||
:tag_followings,
|
||||
:tags
|
||||
:tags,
|
||||
:open_publisher
|
||||
|
||||
def ensure_http_referer_is_set
|
||||
request.env['HTTP_REFERER'] ||= '/aspects'
|
||||
|
|
@ -121,7 +122,7 @@ class ApplicationController < ActionController::Base
|
|||
end
|
||||
|
||||
def after_sign_in_path_for(resource)
|
||||
stored_location_for(:user) || (current_user.getting_started? ? getting_started_path : aspects_path)
|
||||
stored_location_for(:user) || (current_user.getting_started? ? getting_started_path : multi_path)
|
||||
end
|
||||
|
||||
def tag_followings
|
||||
|
|
@ -150,7 +151,7 @@ class ApplicationController < ActionController::Base
|
|||
def default_stream_action(stream_klass)
|
||||
authenticate_user!
|
||||
save_sort_order
|
||||
@stream = stream_klass.new(current_user, :max_time => params[:max_time], :order => sort_order)
|
||||
@stream = stream_klass.new(current_user, :max_time => max_time, :order => sort_order)
|
||||
|
||||
if params[:only_posts]
|
||||
render :partial => 'shared/stream', :locals => {:posts => @stream.posts}
|
||||
|
|
|
|||
|
|
@ -14,7 +14,7 @@ class CommentsController < ApplicationController
|
|||
end
|
||||
|
||||
def create
|
||||
target = current_user.find_visible_post_by_id params[:post_id]
|
||||
target = current_user.find_visible_shareable_by_id Post, params[:post_id]
|
||||
text = params[:text]
|
||||
|
||||
if target
|
||||
|
|
@ -56,7 +56,7 @@ class CommentsController < ApplicationController
|
|||
|
||||
def index
|
||||
if user_signed_in?
|
||||
@post = current_user.find_visible_post_by_id(params[:post_id])
|
||||
@post = current_user.find_visible_shareable_by_id(Post, params[:post_id])
|
||||
else
|
||||
@post = Post.where(:id => params[:post_id], :public => true).includes(:author, :comments => :author).first
|
||||
end
|
||||
|
|
|
|||
7
app/controllers/community_spotlight_controller.rb
Normal file
7
app/controllers/community_spotlight_controller.rb
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
require File.join(Rails.root, 'lib', 'stream', 'community_spotlight')
|
||||
|
||||
class CommunitySpotlightController < ApplicationController
|
||||
def index
|
||||
default_stream_action(Stream::CommunitySpotlight)
|
||||
end
|
||||
end
|
||||
|
|
@ -38,9 +38,9 @@ class ContactsController < ApplicationController
|
|||
render :layout => false
|
||||
end
|
||||
|
||||
def featured
|
||||
@featured = true
|
||||
@people = Person.featured_users
|
||||
def spotlight
|
||||
@spotlight = true
|
||||
@people = Person.community_spotlight
|
||||
end
|
||||
|
||||
private
|
||||
|
|
|
|||
|
|
@ -67,7 +67,7 @@ class ConversationsController < ApplicationController
|
|||
|
||||
@contact_ids = ""
|
||||
|
||||
@contacts_json = all_contacts_and_ids.to_json.gsub!(/(")/, '\\"')
|
||||
@contacts_json = all_contacts_and_ids.to_json
|
||||
if params[:contact_id]
|
||||
@contact_ids = current_user.contacts.find(params[:contact_id]).id
|
||||
elsif params[:aspect_id]
|
||||
|
|
|
|||
|
|
@ -1,7 +0,0 @@
|
|||
require File.join(Rails.root, 'lib', 'stream', 'featured_users')
|
||||
|
||||
class FeaturedUsersController < ApplicationController
|
||||
def index
|
||||
default_stream_action(Stream::FeaturedUsers)
|
||||
end
|
||||
end
|
||||
|
|
@ -6,7 +6,7 @@ class HomeController < ApplicationController
|
|||
|
||||
def show
|
||||
if current_user
|
||||
redirect_to :controller => 'aspects', :action => 'index'
|
||||
redirect_to multi_path
|
||||
elsif is_mobile_device?
|
||||
redirect_to user_session_path
|
||||
else
|
||||
|
|
|
|||
|
|
@ -59,10 +59,10 @@ class LikesController < ApplicationController
|
|||
|
||||
def target
|
||||
@target ||= if params[:post_id]
|
||||
current_user.find_visible_post_by_id(params[:post_id])
|
||||
current_user.find_visible_shareable_by_id(Post, params[:post_id])
|
||||
else
|
||||
comment = Comment.find(params[:comment_id])
|
||||
comment = nil unless current_user.find_visible_post_by_id(comment.post_id)
|
||||
comment = nil unless current_user.find_visible_shareable_by_id(Post, comment.commentable_id)
|
||||
comment
|
||||
end
|
||||
end
|
||||
|
|
|
|||
11
app/controllers/multis_controller.rb
Normal file
11
app/controllers/multis_controller.rb
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
# Copyright (c) 2010-2011, Diaspora Inc. This file is
|
||||
# licensed under the Affero General Public License version 3 or later. See
|
||||
# the COPYRIGHT file.
|
||||
|
||||
require File.join(Rails.root, 'lib', 'stream', 'multi')
|
||||
|
||||
class MultisController < ApplicationController
|
||||
def index
|
||||
default_stream_action(Stream::Multi)
|
||||
end
|
||||
end
|
||||
|
|
@ -50,7 +50,7 @@ class NotificationsController < VannaController
|
|||
|
||||
post_process :html do
|
||||
def post_read_all(json)
|
||||
Response.new(:status => 302, :location => aspects_path)
|
||||
Response.new(:status => 302, :location => multi_path)
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
|||
|
|
@ -2,6 +2,8 @@
|
|||
# licensed under the Affero General Public License version 3 or later. See
|
||||
# the COPYRIGHT file.
|
||||
|
||||
require File.join(Rails.root, "lib", 'stream', "person")
|
||||
|
||||
class PeopleController < ApplicationController
|
||||
before_filter :authenticate_user!, :except => [:show]
|
||||
|
||||
|
|
@ -86,7 +88,9 @@ class PeopleController < ApplicationController
|
|||
@aspect = :profile
|
||||
@share_with = (params[:share_with] == 'true')
|
||||
|
||||
max_time = params[:max_time] ? Time.at(params[:max_time].to_i) : Time.now
|
||||
@stream = Stream::Person.new(current_user, @person,
|
||||
:max_time => max_time)
|
||||
|
||||
@profile = @person.profile
|
||||
|
||||
unless params[:format] == "json" # hovercard
|
||||
|
|
@ -104,22 +108,11 @@ class PeopleController < ApplicationController
|
|||
@contacts_of_contact_count = 0
|
||||
@contacts_of_contact = []
|
||||
end
|
||||
|
||||
if (@person != current_user.person) && !@contact.persisted?
|
||||
@commenting_disabled = true
|
||||
else
|
||||
@commenting_disabled = false
|
||||
end
|
||||
@posts = current_user.posts_from(@person).where(:type => ["StatusMessage", "Reshare", "ActivityStreams::Photo"]).includes(:comments).limit(15).where(StatusMessage.arel_table[:created_at].lt(max_time))
|
||||
else
|
||||
@commenting_disabled = true
|
||||
@posts = @person.posts.where(:type => ["StatusMessage", "Reshare", "ActivityStreams::Photo"], :public => true).includes(:comments).limit(15).where(StatusMessage.arel_table[:created_at].lt(max_time)).order('posts.created_at DESC')
|
||||
end
|
||||
@posts.includes(:author => :profile)
|
||||
end
|
||||
|
||||
if params[:only_posts]
|
||||
render :partial => 'shared/stream', :locals => {:posts => @posts}
|
||||
render :partial => 'shared/stream', :locals => {:posts => @stream.posts}
|
||||
else
|
||||
respond_to do |format|
|
||||
format.all { respond_with @person, :locals => {:post_type => :all} }
|
||||
|
|
|
|||
|
|
@ -29,7 +29,7 @@ class PhotosController < ApplicationController
|
|||
@contacts_of_contact_count = 0
|
||||
end
|
||||
|
||||
@posts = current_user.posts_from(@person).where(:type => 'Photo').paginate(:page => params[:page])
|
||||
@posts = current_user.photos_from(@person).paginate(:page => params[:page])
|
||||
|
||||
render 'people/show'
|
||||
|
||||
|
|
@ -118,7 +118,7 @@ class PhotosController < ApplicationController
|
|||
end
|
||||
|
||||
def destroy
|
||||
photo = current_user.posts.where(:id => params[:id]).first
|
||||
photo = current_user.photos.where(:id => params[:id]).first
|
||||
|
||||
if photo
|
||||
current_user.retract(photo)
|
||||
|
|
@ -148,7 +148,7 @@ class PhotosController < ApplicationController
|
|||
end
|
||||
|
||||
def edit
|
||||
if @photo = current_user.posts.where(:id => params[:id]).first
|
||||
if @photo = current_user.photos.where(:id => params[:id]).first
|
||||
respond_with @photo
|
||||
else
|
||||
redirect_to person_photos_path(current_user.person)
|
||||
|
|
@ -156,7 +156,7 @@ class PhotosController < ApplicationController
|
|||
end
|
||||
|
||||
def update
|
||||
photo = current_user.posts.where(:id => params[:id]).first
|
||||
photo = current_user.photos.where(:id => params[:id]).first
|
||||
if photo
|
||||
if current_user.update_post( photo, params[:photo] )
|
||||
flash.now[:notice] = I18n.t 'photos.update.notice'
|
||||
|
|
@ -187,7 +187,7 @@ class PhotosController < ApplicationController
|
|||
end
|
||||
|
||||
def photo
|
||||
@photo ||= current_user.find_visible_post_by_id(params[:id], :type => 'Photo')
|
||||
@photo ||= current_user.find_visible_shareable_by_id(Photo, params[:id])
|
||||
end
|
||||
|
||||
def additional_photos
|
||||
|
|
|
|||
|
|
@ -18,7 +18,7 @@ class PostsController < ApplicationController
|
|||
key = params[:id].to_s.length <= 8 ? :id : :guid
|
||||
|
||||
if user_signed_in?
|
||||
@post = current_user.find_visible_post_by_id(params[:id], :key => key)
|
||||
@post = current_user.find_visible_shareable_by_id(Post, params[:id], :key => key)
|
||||
else
|
||||
@post = Post.where(key => params[:id], :public => true).includes(:author, :comments => :author).first
|
||||
end
|
||||
|
|
@ -30,10 +30,6 @@ class PostsController < ApplicationController
|
|||
notification.save
|
||||
end
|
||||
|
||||
if is_mobile_device?
|
||||
@comments = @post.comments
|
||||
end
|
||||
|
||||
respond_to do |format|
|
||||
format.xml{ render :xml => @post.to_diaspora_xml }
|
||||
format.mobile{render 'posts/show.mobile.haml'}
|
||||
|
|
|
|||
|
|
@ -4,6 +4,9 @@
|
|||
|
||||
class ProfilesController < ApplicationController
|
||||
before_filter :authenticate_user!
|
||||
|
||||
respond_to :html
|
||||
respond_to :js, :only => :update
|
||||
def edit
|
||||
@person = current_user.person
|
||||
@aspect = :person_edit
|
||||
|
|
@ -35,18 +38,30 @@ class ProfilesController < ApplicationController
|
|||
:id => params[:photo_id]).first if params[:photo_id]
|
||||
|
||||
if current_user.update_profile params[:profile]
|
||||
flash[:notice] = I18n.t 'profiles.update.updated'
|
||||
if current_user.getting_started?
|
||||
redirect_to getting_started_path
|
||||
else
|
||||
redirect_to edit_profile_path
|
||||
respond_to do |format|
|
||||
format.js { render :nothing => true, :status => 200 }
|
||||
format.html {
|
||||
flash[:notice] = I18n.t 'profiles.update.updated'
|
||||
if current_user.getting_started?
|
||||
|
||||
redirect_to getting_started_path
|
||||
else
|
||||
redirect_to edit_profile_path
|
||||
end
|
||||
}
|
||||
end
|
||||
|
||||
else
|
||||
flash[:error] = I18n.t 'profiles.update.failed'
|
||||
if params[:getting_started]
|
||||
redirect_to getting_started_path(:step => params[:getting_started])
|
||||
else
|
||||
redirect_to edit_profile_path
|
||||
respond_to do |format|
|
||||
format.js { render :nothing => true, :status => 200 }
|
||||
format.html {
|
||||
flash[:error] = I18n.t 'profiles.update.failed'
|
||||
if params[:getting_started]
|
||||
redirect_to getting_started_path(:step => params[:getting_started])
|
||||
else
|
||||
redirect_to edit_profile_path
|
||||
end
|
||||
}
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
|||
|
|
@ -26,9 +26,26 @@ class ServicesController < ApplicationController
|
|||
:uid => auth['uid'])
|
||||
current_user.services << service
|
||||
|
||||
flash[:notice] = I18n.t 'services.create.success'
|
||||
if service.persisted?
|
||||
fetch_photo = current_user.person.profile[:image_url].blank?
|
||||
|
||||
current_user.update_profile(current_user.person.profile.from_omniauth_hash(user))
|
||||
Resque.enqueue(Jobs::FetchProfilePhoto, current_user.id, service.id, user["image"]) if fetch_photo
|
||||
|
||||
flash[:notice] = I18n.t 'services.create.success'
|
||||
else
|
||||
flash[:error] = I18n.t 'services.create.failure'
|
||||
|
||||
if existing_service = Service.where(:type => service.type.to_s, :uid => service.uid).first
|
||||
flash[:error] << I18n.t('services.create.already_authorized',
|
||||
:diaspora_id => existing_service.user.person.profile.diaspora_handle,
|
||||
:service_name => provider.camelize )
|
||||
:A
|
||||
end
|
||||
end
|
||||
|
||||
if current_user.getting_started
|
||||
redirect_to getting_started_path(:step => 3)
|
||||
redirect_to getting_started_path
|
||||
else
|
||||
redirect_to services_url
|
||||
end
|
||||
|
|
|
|||
|
|
@ -3,18 +3,21 @@
|
|||
# the COPYRIGHT file.
|
||||
#
|
||||
|
||||
class PostVisibilitiesController < ApplicationController
|
||||
class ShareVisibilitiesController < ApplicationController
|
||||
before_filter :authenticate_user!
|
||||
|
||||
def update
|
||||
#note :id references a postvisibility
|
||||
params[:shareable_id] ||= params[:post_id]
|
||||
params[:shareable_type] ||= 'Post'
|
||||
|
||||
@post = accessible_post
|
||||
@contact = current_user.contact_for(@post.author)
|
||||
|
||||
if @contact && @vis = PostVisibility.where(:contact_id => @contact.id,
|
||||
:post_id => params[:post_id]).first
|
||||
@vis.hidden = !@vis.hidden
|
||||
if @contact && @vis = ShareVisibility.where(:contact_id => @contact.id,
|
||||
:shareable_id => params[:shareable_id],
|
||||
:shareable_type => params[:shareable_type]).first
|
||||
@vis.hidden = !@vis.hidden
|
||||
if @vis.save
|
||||
update_cache(@vis)
|
||||
render 'update'
|
||||
|
|
@ -1,9 +0,0 @@
|
|||
require File.join(Rails.root, 'lib', 'stream', 'soup')
|
||||
|
||||
class SoupsController < ApplicationController
|
||||
#before_filter :redirect_unless_admin
|
||||
|
||||
def index
|
||||
default_stream_action(Stream::Soup)
|
||||
end
|
||||
end
|
||||
|
|
@ -4,6 +4,8 @@
|
|||
|
||||
class StatusMessagesController < ApplicationController
|
||||
before_filter :authenticate_user!
|
||||
|
||||
before_filter :remove_getting_started, :only => [:create]
|
||||
|
||||
respond_to :html
|
||||
respond_to :mobile
|
||||
|
|
@ -96,4 +98,11 @@ class StatusMessagesController < ApplicationController
|
|||
def comments_expanded
|
||||
true
|
||||
end
|
||||
|
||||
def remove_getting_started
|
||||
if current_user.getting_started == true
|
||||
current_user.update_attributes(:getting_started => false)
|
||||
end
|
||||
true
|
||||
end
|
||||
end
|
||||
|
|
|
|||
|
|
@ -51,4 +51,16 @@ class TagFollowingsController < ApplicationController
|
|||
redirect_to tag_path(:name => params[:name])
|
||||
end
|
||||
end
|
||||
|
||||
def create_multiple
|
||||
tags = params[:tags].split(",")
|
||||
tags.each do |tag|
|
||||
tag_name = tag.gsub(/^#/,"")
|
||||
|
||||
@tag = ActsAsTaggableOn::Tag.find_or_create_by_name(tag_name)
|
||||
@tag_following = current_user.tag_followings.create(:tag_id => @tag.id)
|
||||
end
|
||||
|
||||
redirect_to multi_path
|
||||
end
|
||||
end
|
||||
|
|
|
|||
|
|
@ -2,6 +2,7 @@
|
|||
# licensed under the Affero General Public License version 3 or later. See
|
||||
# the COPYRIGHT file.
|
||||
require File.join(Rails.root, 'app', 'models', 'acts_as_taggable_on_tag')
|
||||
require File.join(Rails.root, 'lib', 'stream', 'tag')
|
||||
|
||||
class TagsController < ApplicationController
|
||||
skip_before_filter :which_action_and_user
|
||||
|
|
@ -34,34 +35,17 @@ class TagsController < ApplicationController
|
|||
end
|
||||
|
||||
def show
|
||||
params[:name].downcase!
|
||||
@aspect = :tag
|
||||
@tag = ActsAsTaggableOn::Tag.find_by_name(params[:name])
|
||||
@tag_follow_count = @tag.try(:followed_count).to_i
|
||||
|
||||
if current_user
|
||||
@posts = StatusMessage.owned_or_visible_by_user(current_user)
|
||||
else
|
||||
@posts = StatusMessage.all_public
|
||||
end
|
||||
|
||||
@posts = @posts.tagged_with(params[:name]).for_a_stream(max_time, 'created_at')
|
||||
|
||||
@commenting_disabled = true
|
||||
params[:prefill] = "##{params[:name]} "
|
||||
@stream = Stream::Tag.new(current_user, params[:name], :max_time => max_time, :page => params[:page])
|
||||
|
||||
if params[:only_posts]
|
||||
render :partial => 'shared/stream', :locals => {:posts => @posts}
|
||||
else
|
||||
profiles = Profile.tagged_with(params[:name]).where(:searchable => true).select('profiles.id, profiles.person_id')
|
||||
@people = Person.where(:id => profiles.map{|p| p.person_id}).paginate(:page => params[:page], :per_page => 15)
|
||||
@people_count = Person.where(:id => profiles.map{|p| p.person_id}).count
|
||||
render :partial => 'shared/stream', :locals => {:posts => @stream.posts}
|
||||
return
|
||||
end
|
||||
end
|
||||
|
||||
def tag_followed?
|
||||
if @tag_followed.nil?
|
||||
@tag_followed = TagFollowing.joins(:tag).where(:tags => {:name => params[:name]}, :user_id => current_user.id).exists? #,
|
||||
@tag_followed = TagFollowing.joins(:tag).where(:tags => {:name => params[:name]}, :user_id => current_user.id).exists?
|
||||
end
|
||||
@tag_followed
|
||||
end
|
||||
|
|
|
|||
|
|
@ -41,12 +41,20 @@ class UsersController < ApplicationController
|
|||
else
|
||||
flash[:error] = I18n.t 'users.update.password_not_changed'
|
||||
end
|
||||
elsif u[:language]
|
||||
if @user.update_attributes(:language => u[:language])
|
||||
I18n.locale = @user.language
|
||||
flash[:notice] = I18n.t 'users.update.language_changed'
|
||||
elsif u[:show_community_spotlight_in_stream] || u[:getting_started]
|
||||
if @user.update_attributes(u)
|
||||
flash[:notice] = I18n.t 'users.update.settings_updated'
|
||||
redirect_to multi_path
|
||||
return
|
||||
else
|
||||
flash[:error] = I18n.t 'users.update.language_not_changed'
|
||||
flash[:notice] = I18n.t 'users.update.settings_not_updated'
|
||||
end
|
||||
elsif u[:language]
|
||||
if @user.update_attributes(u)
|
||||
I18n.locale = @user.language
|
||||
flash[:notice] = I18n.t 'users.update.language_updated'
|
||||
else
|
||||
flash[:error] = I18n.t 'users.update.language_not_updated'
|
||||
end
|
||||
elsif u[:email]
|
||||
@user.unconfirmed_email = u[:email]
|
||||
|
|
@ -97,13 +105,12 @@ class UsersController < ApplicationController
|
|||
@user = current_user
|
||||
@person = @user.person
|
||||
@profile = @user.profile
|
||||
@services = @user.services
|
||||
@step = 0
|
||||
|
||||
render "users/getting_started"
|
||||
end
|
||||
|
||||
def logged_out
|
||||
@page = :logged_out
|
||||
if user_signed_in?
|
||||
redirect_to root_path
|
||||
end
|
||||
|
|
|
|||
|
|
@ -64,7 +64,7 @@ module ApplicationHelper
|
|||
if current_user.contacts.size > 0
|
||||
contacts_path
|
||||
else
|
||||
featured_users_path
|
||||
community_spotlight_path
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@
|
|||
module AspectGlobalHelper
|
||||
def aspects_with_post(aspects, post)
|
||||
aspects.select do |aspect|
|
||||
AspectVisibility.exists?(:aspect_id => aspect.id, :post_id => post.id)
|
||||
AspectVisibility.exists?(:aspect_id => aspect.id, :shareable_id => post.id, :shareable_type => 'Post')
|
||||
end
|
||||
end
|
||||
|
||||
|
|
@ -21,7 +21,7 @@ module AspectGlobalHelper
|
|||
str = "<span class='aspect_badge single'>"
|
||||
link = opts.delete(:link)
|
||||
if !link
|
||||
str << link_to(aspect.name, "#", 'data-guid' => aspect.id, :class => 'hard_aspect_link').html_safe
|
||||
str << link_to(aspect.name, "#", 'data-guid' => aspect.id).html_safe
|
||||
else
|
||||
str << link_for_aspect(aspect).html_safe
|
||||
end
|
||||
|
|
@ -32,7 +32,7 @@ module AspectGlobalHelper
|
|||
str = ""
|
||||
aspects.each do |aspect|
|
||||
str << '<li>'
|
||||
str << link_for_aspect(aspect, :params => opts, 'data-guid' => aspect.id, :class => 'hard_aspect_link').html_safe
|
||||
str << link_for_aspect(aspect, :params => opts, 'data-guid' => aspect.id).html_safe
|
||||
str << '</li>'
|
||||
end
|
||||
str.html_safe
|
||||
|
|
@ -42,8 +42,6 @@ module AspectGlobalHelper
|
|||
opts[:params] ||= {}
|
||||
params ||= {}
|
||||
opts[:params] = opts[:params].merge("a_ids[]" => aspect.id, :created_at => params[:created_at])
|
||||
opts[:class] ||= ""
|
||||
opts[:class] << " hard_aspect_link"
|
||||
opts['data-guid'] = aspect.id
|
||||
|
||||
link_to aspect.name, aspects_path( opts[:params] ), opts
|
||||
|
|
@ -71,7 +69,7 @@ module AspectGlobalHelper
|
|||
klass = checked ? "selected" : ""
|
||||
|
||||
str = <<LISTITEM
|
||||
<li data-aspect_id=#{aspect.id} class='#{klass}'>
|
||||
<li data-aspect_id=#{aspect.id} class='#{klass} aspect_selector'>
|
||||
#{aspect.name}
|
||||
</li>
|
||||
LISTITEM
|
||||
|
|
|
|||
|
|
@ -3,18 +3,6 @@
|
|||
# the COPYRIGHT file.
|
||||
|
||||
module GettingStartedHelper
|
||||
# @return [Boolean] The user has filled out all profile fields
|
||||
def has_completed_profile?
|
||||
profile = current_user.person.profile
|
||||
[:full_name, :image_url,
|
||||
:birthday, :gender,
|
||||
:bio, :location,
|
||||
:tag_string].map! do |attr|
|
||||
return false if profile.send(attr).blank?
|
||||
end
|
||||
true
|
||||
end
|
||||
|
||||
# @return [Boolean] The user has connected at least one service
|
||||
def has_connected_services?
|
||||
AppConfig[:configured_services].blank? || current_user.services.size > 0
|
||||
|
|
@ -29,7 +17,7 @@ module GettingStartedHelper
|
|||
def has_few_followed_tags?
|
||||
current_user.followed_tags.size > 2
|
||||
end
|
||||
|
||||
|
||||
# @return [Boolean] The user has connected to cubbi.es
|
||||
def has_connected_cubbies?
|
||||
current_user.authorizations.size > 0
|
||||
|
|
@ -40,15 +28,6 @@ module GettingStartedHelper
|
|||
current_user.getting_started == false
|
||||
end
|
||||
|
||||
# @return [String] Welcome text with or without the current_user's first_name
|
||||
def welcome_text
|
||||
if current_user.person.profile.first_name.present?
|
||||
t('users.getting_started.welcome_with_name', :name => current_user.first_name)
|
||||
else
|
||||
t('users.getting_started.welcome')
|
||||
end
|
||||
end
|
||||
|
||||
def tag_link(tag_name)
|
||||
if tag_followed?(tag_name)
|
||||
link_to "##{tag_name}", tag_followings_path(tag_name), :method => :delete, :class => "featured_tag followed"
|
||||
|
|
|
|||
63
app/helpers/interim_stream_hackiness_helper.rb
Normal file
63
app/helpers/interim_stream_hackiness_helper.rb
Normal file
|
|
@ -0,0 +1,63 @@
|
|||
module InterimStreamHackinessHelper
|
||||
def commenting_disabled?(post)
|
||||
return true unless user_signed_in?
|
||||
if defined?(@commenting_disabled)
|
||||
@commenting_disabled
|
||||
elsif defined?(@stream)
|
||||
!@stream.can_comment?(post)
|
||||
else
|
||||
false
|
||||
end
|
||||
end
|
||||
|
||||
##### These methods need to go away once we pass publisher object into the partial ######
|
||||
def publisher_prefill_text
|
||||
if params[:prefill].present?
|
||||
params[:prefill]
|
||||
elsif defined?(@stream)
|
||||
@stream.publisher.prefill
|
||||
else
|
||||
nil
|
||||
end
|
||||
end
|
||||
|
||||
def from_group(post)
|
||||
if defined?(@stream) && params[:controller] == 'multis'
|
||||
@stream.post_from_group(post)
|
||||
else
|
||||
[]
|
||||
end
|
||||
end
|
||||
|
||||
def what_stream_sentence(post)
|
||||
from_group(post).map{|x| I18n.t("streams.#{x.to_s}")}.to_sentence
|
||||
end
|
||||
|
||||
def stream_settings_link(post)
|
||||
link_to "", "#{edit_user_path}#stream-preferences"
|
||||
end
|
||||
|
||||
def publisher_open
|
||||
if defined?(@stream)
|
||||
@stream.publisher.open?
|
||||
else
|
||||
false
|
||||
end
|
||||
end
|
||||
|
||||
def publisher_public
|
||||
if defined?(@stream)
|
||||
@stream.publisher.public?
|
||||
else
|
||||
false
|
||||
end
|
||||
end
|
||||
|
||||
def publisher_explain
|
||||
if defined?(@stream)
|
||||
@stream.publisher.public?
|
||||
else
|
||||
false
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
@ -37,7 +37,7 @@ module PeopleHelper
|
|||
|
||||
def person_image_tag(person, size=nil)
|
||||
size ||= :thumb_small
|
||||
"<img alt=\"#{h(person.name)}\" class=\"avatar\" data-person_id=\"#{person.id}\" src=\"#{person.profile.image_url(size)}\" title=\"#{h(person.name)} (#{h(person.diaspora_handle)})\">".html_safe
|
||||
"<img alt=\"#{h(person.name)}\" class=\"avatar\" data-person_id=\"#{person.id}\" src=\"#{person.profile.image_url(size)}\" title=\"#{h(person.name)}\">".html_safe
|
||||
end
|
||||
|
||||
def person_image_link(person, opts={})
|
||||
|
|
|
|||
|
|
@ -14,4 +14,8 @@ module PublisherHelper
|
|||
def public_helper_text
|
||||
(public_value)? t('javascripts.publisher.public'): t('javascripts.publisher.limited')
|
||||
end
|
||||
|
||||
def all_aspects_selected?(selected_aspects)
|
||||
@all_aspects_selected ||= all_aspects.size == selected_aspects.size
|
||||
end
|
||||
end
|
||||
|
|
|
|||
|
|
@ -7,6 +7,15 @@ module ResharesHelper
|
|||
end
|
||||
end
|
||||
|
||||
def resharable?(post)
|
||||
if reshare?(post)
|
||||
# Reshare post is resharable if you're not the original author nor the resharer
|
||||
post.root.present? && post.root.author_id != current_user.person.id && post.author_id != current_user.person.id
|
||||
else
|
||||
post.author_id != current_user.person.id && post.public?
|
||||
end
|
||||
end
|
||||
|
||||
def reshare_link(post)
|
||||
if reshare?(post)
|
||||
return unless post.root
|
||||
|
|
|
|||
|
|
@ -5,19 +5,19 @@
|
|||
module StreamHelper
|
||||
def next_page_path(opts ={})
|
||||
if controller.instance_of?(TagsController)
|
||||
tag_path(:name => @tag.name, :max_time => @posts.last.created_at.to_i)
|
||||
tag_path(:name => @stream.tag_name, :max_time => time_for_scroll(opts[:ajax_stream], @stream))
|
||||
elsif controller.instance_of?(AppsController)
|
||||
"/apps/1?#{{:max_time => @posts.last.created_at.to_i}.to_param}"
|
||||
elsif controller.instance_of?(PeopleController)
|
||||
person_path(@person, :max_time => @posts.last.created_at.to_i)
|
||||
person_path(@person, :max_time => time_for_scroll(opts[:ajax_stream], @stream))
|
||||
elsif controller.instance_of?(TagFollowingsController)
|
||||
tag_followings_path(:max_time => time_for_scroll(opts[:ajax_stream], @stream), :sort_order => session[:sort_order])
|
||||
elsif controller.instance_of?(FeaturedUsersController)
|
||||
featured_path(:max_time => time_for_scroll(opts[:ajax_stream], @stream), :sort_order => session[:sort_order])
|
||||
elsif controller.instance_of?(CommunitySpotlightController)
|
||||
spotlight_path(:max_time => time_for_scroll(opts[:ajax_stream], @stream), :sort_order => session[:sort_order])
|
||||
elsif controller.instance_of?(MentionsController)
|
||||
mentions_path(:max_time => time_for_scroll(opts[:ajax_stream], @stream), :sort_order => session[:sort_order])
|
||||
elsif controller.instance_of?(SoupsController)
|
||||
soup_path(:max_time => time_for_scroll(opts[:ajax_stream], @stream), :sort_order => session[:sort_order])
|
||||
elsif controller.instance_of?(MultisController)
|
||||
multi_path(:max_time => time_for_scroll(opts[:ajax_stream], @stream), :sort_order => session[:sort_order])
|
||||
elsif controller.instance_of?(PostsController)
|
||||
public_stream_path(:max_time => time_for_scroll(opts[:ajax_stream], @stream), :sort_order => session[:sort_order])
|
||||
elsif controller.instance_of?(AspectsController)
|
||||
|
|
|
|||
19
app/models/api/v0/serializers/tag.rb
Normal file
19
app/models/api/v0/serializers/tag.rb
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
# Copyright (c) 2010-2011, Diaspora Inc. This file is
|
||||
# licensed under the Affero General Public License version 3 or later. See
|
||||
# the COPYRIGHT file.
|
||||
|
||||
class Api::V0::Serializers::Tag
|
||||
|
||||
def initialize(tag)
|
||||
@stream = Stream::Tag.new(nil, tag)
|
||||
end
|
||||
|
||||
def as_json(opts={})
|
||||
{
|
||||
"name" => @stream.tag_name,
|
||||
"person_count" => @stream.tagged_people_count,
|
||||
"followed_count" => @stream.tag_follow_count,
|
||||
"posts" => []
|
||||
}
|
||||
end
|
||||
end
|
||||
20
app/models/api/v0/serializers/user.rb
Normal file
20
app/models/api/v0/serializers/user.rb
Normal file
|
|
@ -0,0 +1,20 @@
|
|||
# Copyright (c) 2010-2011, Diaspora Inc. This file is
|
||||
# licensed under the Affero General Public License version 3 or later. See
|
||||
# the COPYRIGHT file.
|
||||
|
||||
class Api::V0::Serializers::User
|
||||
def initialize(user)
|
||||
@person = user.person
|
||||
@profile = @person.profile
|
||||
end
|
||||
|
||||
def as_json(opts={})
|
||||
{
|
||||
"diaspora_id" => @person.diaspora_handle,
|
||||
"first_name" => @profile.first_name,
|
||||
"last_name" => @profile.last_name,
|
||||
"image_url" => @profile.image_url,
|
||||
"searchable" => @profile.searchable
|
||||
}
|
||||
end
|
||||
end
|
||||
|
|
@ -9,7 +9,8 @@ class Aspect < ActiveRecord::Base
|
|||
has_many :contacts, :through => :aspect_memberships
|
||||
|
||||
has_many :aspect_visibilities
|
||||
has_many :posts, :through => :aspect_visibilities
|
||||
has_many :posts, :through => :aspect_visibilities, :source => :shareable, :source_type => 'Post'
|
||||
has_many :photos, :through => :aspect_visibilities, :source => :shareable, :source_type => 'Photo'
|
||||
|
||||
validates :name, :presence => true, :length => { :maximum => 20 }
|
||||
|
||||
|
|
@ -24,5 +25,17 @@ class Aspect < ActiveRecord::Base
|
|||
def to_s
|
||||
name
|
||||
end
|
||||
|
||||
def << (shareable)
|
||||
case shareable
|
||||
when Post
|
||||
self.posts << shareable
|
||||
when Photo
|
||||
self.photos << shareable
|
||||
else
|
||||
raise "Unknown shareable type '#{shareable.class.base_class.to_s}'"
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ class AspectVisibility < ActiveRecord::Base
|
|||
belongs_to :aspect
|
||||
validates :aspect, :presence => true
|
||||
|
||||
belongs_to :post
|
||||
validates :post, :presence => true
|
||||
belongs_to :shareable, :polymorphic => true
|
||||
validates :shareable, :presence => true
|
||||
|
||||
end
|
||||
|
|
|
|||
|
|
@ -23,7 +23,8 @@ class Comment < ActiveRecord::Base
|
|||
xml_attr :text
|
||||
xml_attr :diaspora_handle
|
||||
|
||||
belongs_to :post
|
||||
belongs_to :commentable, :touch => true, :polymorphic => true
|
||||
alias_attribute :post, :commentable
|
||||
belongs_to :author, :class_name => 'Person'
|
||||
|
||||
validates :text, :presence => true, :length => { :maximum => 2500 }
|
||||
|
|
|
|||
|
|
@ -12,8 +12,8 @@ class Contact < ActiveRecord::Base
|
|||
has_many :aspect_memberships
|
||||
has_many :aspects, :through => :aspect_memberships
|
||||
|
||||
has_many :post_visibilities
|
||||
has_many :posts, :through => :post_visibilities
|
||||
has_many :share_visibilities, :source => :shareable, :source_type => 'Post'
|
||||
has_many :posts, :through => :share_visibilities, :source => :shareable, :source_type => 'Post'
|
||||
|
||||
validate :not_contact_for_self
|
||||
|
||||
|
|
@ -54,9 +54,9 @@ class Contact < ActiveRecord::Base
|
|||
:into => aspects.first)
|
||||
end
|
||||
|
||||
def receive_post(post)
|
||||
PostVisibility.create!(:post_id => post.id, :contact_id => self.id)
|
||||
post.socket_to_user(self.user, :aspect_ids => self.aspect_ids) if post.respond_to? :socket_to_user
|
||||
def receive_shareable(shareable)
|
||||
ShareVisibility.create!(:shareable_id => shareable.id, :shareable_type => shareable.class.base_class.to_s, :contact_id => self.id)
|
||||
shareable.socket_to_user(self.user, :aspect_ids => self.aspect_ids) if shareable.respond_to? :socket_to_user
|
||||
end
|
||||
|
||||
def contacts
|
||||
|
|
|
|||
28
app/models/jobs/fetch_profile_photo.rb
Normal file
28
app/models/jobs/fetch_profile_photo.rb
Normal file
|
|
@ -0,0 +1,28 @@
|
|||
# Copyright (c) 2010-2011, Diaspora Inc. This file is
|
||||
# licensed under the Affero General Public License version 3 or later. See
|
||||
# the COPYRIGHT file.
|
||||
|
||||
|
||||
module Jobs
|
||||
class FetchProfilePhoto < Base
|
||||
@queue = :photos
|
||||
def self.perform(user_id, service_id, fallback_image_url = nil)
|
||||
service = Service.find(service_id)
|
||||
|
||||
image_url = service.profile_photo_url
|
||||
image_url ||= fallback_image_url
|
||||
|
||||
return unless image_url
|
||||
|
||||
user = User.find(user_id)
|
||||
|
||||
@photo = Photo.diaspora_initialize(:author => user.person, :image_url => image_url, :pending => true)
|
||||
@photo.save!
|
||||
|
||||
profile_params = {:image_url => @photo.url(:thumb_large),
|
||||
:image_url_medium => @photo.url(:thumb_medium),
|
||||
:image_url_small => @photo.url(:thumb_small)}
|
||||
user.update_profile(profile_params)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
@ -47,7 +47,7 @@ class Notification < ActiveRecord::Base
|
|||
|
||||
private
|
||||
def self.concatenate_or_create(recipient, target, actor, notification_type)
|
||||
return nil if post_visiblity_is_hidden?(recipient, target)
|
||||
return nil if share_visiblity_is_hidden?(recipient, target)
|
||||
if n = notification_type.where(:target_id => target.id,
|
||||
:target_type => target.class.base_class,
|
||||
:recipient_id => recipient.id,
|
||||
|
|
@ -68,7 +68,7 @@ private
|
|||
|
||||
|
||||
def self.make_notification(recipient, target, actor, notification_type)
|
||||
return nil if post_visiblity_is_hidden?(recipient, target)
|
||||
return nil if share_visiblity_is_hidden?(recipient, target)
|
||||
n = notification_type.new(:target => target,
|
||||
:recipient_id => recipient.id)
|
||||
n.actors = n.actors | [actor]
|
||||
|
|
@ -78,12 +78,12 @@ private
|
|||
end
|
||||
|
||||
#horrible hack that should not be here!
|
||||
def self.post_visiblity_is_hidden?(recipient, post)
|
||||
def self.share_visiblity_is_hidden?(recipient, post)
|
||||
return false unless post.is_a?(Post)
|
||||
|
||||
contact = recipient.contact_for(post.author)
|
||||
return false unless contact && recipient && post
|
||||
pv = PostVisibility.where(:contact_id => contact.id, :post_id => post.id).first
|
||||
pv = ShareVisibility.where(:contact_id => contact.id, :shareable_id => post.id, :shareable_type => post.class.base_class.to_s).first
|
||||
pv.present? ? pv.hidden? : false
|
||||
end
|
||||
end
|
||||
|
|
|
|||
|
|
@ -28,6 +28,7 @@ class Person < ActiveRecord::Base
|
|||
|
||||
has_many :contacts, :dependent => :destroy # Other people's contacts for this person
|
||||
has_many :posts, :foreign_key => :author_id, :dependent => :destroy # This person's own posts
|
||||
has_many :photos, :foreign_key => :author_id, :dependent => :destroy # This person's own photos
|
||||
has_many :comments, :foreign_key => :author_id, :dependent => :destroy # This person's own comments
|
||||
|
||||
belongs_to :owner, :class_name => 'User'
|
||||
|
|
@ -58,8 +59,10 @@ class Person < ActiveRecord::Base
|
|||
select("DISTINCT people.*")
|
||||
}
|
||||
|
||||
def self.featured_users
|
||||
AppConfig[:featured_users].present? ? Person.where(:diaspora_handle => AppConfig[:featured_users]) : []
|
||||
scope :profile_tagged_with, lambda{|tag_name| joins(:profile => :tags).where(:profile => {:tags => {:name => tag_name}}).where('profiles.searchable IS TRUE') }
|
||||
|
||||
def self.community_spotlight
|
||||
AppConfig[:community_spotlight].present? ? Person.where(:diaspora_handle => AppConfig[:community_spotlight]) : []
|
||||
end
|
||||
|
||||
# Set a default of an empty profile when a new Person record is instantiated.
|
||||
|
|
@ -76,7 +79,6 @@ class Person < ActiveRecord::Base
|
|||
self.profile ||= Profile.new unless profile_set
|
||||
end
|
||||
|
||||
|
||||
def self.find_from_id_or_username(params)
|
||||
p = if params[:id].present?
|
||||
Person.where(:id => params[:id]).first
|
||||
|
|
@ -136,8 +138,6 @@ class Person < ActiveRecord::Base
|
|||
Person.searchable.where(sql, *tokens)
|
||||
end
|
||||
|
||||
|
||||
|
||||
def name(opts = {})
|
||||
if self.profile.nil?
|
||||
fix_profile
|
||||
|
|
@ -146,14 +146,17 @@ class Person < ActiveRecord::Base
|
|||
end
|
||||
|
||||
def self.name_from_attrs(first_name, last_name, diaspora_handle)
|
||||
first_name.blank? ? diaspora_handle : "#{first_name.to_s.strip} #{last_name.to_s.strip}"
|
||||
first_name.blank? && last_name.blank? ? diaspora_handle : "#{first_name.to_s.strip} #{last_name.to_s.strip}".strip
|
||||
end
|
||||
|
||||
def first_name
|
||||
@first_name ||= if profile.nil? || profile.first_name.nil? || profile.first_name.blank?
|
||||
self.diaspora_handle.split('@').first
|
||||
else
|
||||
profile.first_name.to_s
|
||||
names = profile.first_name.to_s.split(/\s/)
|
||||
str = names[0...-1].join(' ')
|
||||
str = names[0] if str.blank?
|
||||
str
|
||||
end
|
||||
end
|
||||
|
||||
|
|
@ -248,7 +251,7 @@ class Person < ActiveRecord::Base
|
|||
end
|
||||
|
||||
def has_photos?
|
||||
self.posts.where(:type => "Photo").exists?
|
||||
self.photos.exists?
|
||||
end
|
||||
|
||||
def as_json( opts = {} )
|
||||
|
|
@ -272,6 +275,8 @@ class Person < ActiveRecord::Base
|
|||
person.update_url(url)
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
|
||||
# @param person [Person]
|
||||
# @param url [String]
|
||||
|
|
|
|||
|
|
@ -2,8 +2,12 @@
|
|||
# licensed under the Affero General Public License version 3 or later. See
|
||||
# the COPYRIGHT file.
|
||||
|
||||
class Photo < Post
|
||||
class Photo < ActiveRecord::Base
|
||||
require 'carrierwave/orm/activerecord'
|
||||
|
||||
include Diaspora::Commentable
|
||||
include Diaspora::Shareable
|
||||
|
||||
mount_uploader :processed_image, ProcessedImage
|
||||
mount_uploader :unprocessed_image, UnprocessedImage
|
||||
|
||||
|
|
@ -40,11 +44,25 @@ class Photo < Post
|
|||
end
|
||||
|
||||
def self.diaspora_initialize(params = {})
|
||||
photo = super(params)
|
||||
image_file = params.delete(:user_file)
|
||||
photo = self.new params.to_hash
|
||||
photo.author = params[:author]
|
||||
photo.public = params[:public] if params[:public]
|
||||
photo.pending = params[:pending] if params[:pending]
|
||||
photo.diaspora_handle = photo.author.diaspora_handle
|
||||
|
||||
photo.random_string = ActiveSupport::SecureRandom.hex(10)
|
||||
photo.unprocessed_image.store! image_file
|
||||
|
||||
if params[:user_file]
|
||||
image_file = params.delete(:user_file)
|
||||
photo.unprocessed_image.store! image_file
|
||||
|
||||
elsif params[:image_url]
|
||||
photo.remote_unprocessed_image_url = params[:image_url]
|
||||
photo.unprocessed_image.store!
|
||||
end
|
||||
|
||||
photo.update_remote_path
|
||||
|
||||
photo
|
||||
end
|
||||
|
||||
|
|
|
|||
|
|
@ -3,26 +3,14 @@
|
|||
# the COPYRIGHT file.
|
||||
|
||||
class Post < ActiveRecord::Base
|
||||
require File.join(Rails.root, 'lib/diaspora/web_socket')
|
||||
include ApplicationHelper
|
||||
include ROXML
|
||||
include Diaspora::Webhooks
|
||||
include Diaspora::Guid
|
||||
|
||||
include Diaspora::Likeable
|
||||
include Diaspora::Commentable
|
||||
include Diaspora::Shareable
|
||||
|
||||
xml_attr :diaspora_handle
|
||||
xml_attr :provider_display_name
|
||||
xml_attr :public
|
||||
xml_attr :created_at
|
||||
|
||||
has_many :comments, :order => 'created_at', :dependent => :destroy
|
||||
|
||||
has_many :aspect_visibilities
|
||||
has_many :aspects, :through => :aspect_visibilities
|
||||
|
||||
has_many :post_visibilities
|
||||
has_many :contacts, :through => :post_visibilities
|
||||
has_many :mentions, :dependent => :destroy
|
||||
|
||||
has_many :reshares, :class_name => "Reshare", :foreign_key => :root_guid, :primary_key => :guid
|
||||
|
|
@ -30,49 +18,18 @@ class Post < ActiveRecord::Base
|
|||
|
||||
belongs_to :o_embed_cache
|
||||
|
||||
belongs_to :author, :class_name => 'Person'
|
||||
|
||||
validates :guid, :uniqueness => true
|
||||
|
||||
after_create :cache_for_author
|
||||
|
||||
#scopes
|
||||
scope :all_public, where(:public => true, :pending => false)
|
||||
scope :includes_for_a_stream, includes(:o_embed_cache, {:author => :profile}, :mentions => {:person => :profile}) #note should include root and photos, but i think those are both on status_message
|
||||
|
||||
def self.for_a_stream(max_time, order)
|
||||
by_max_time(max_time, order).
|
||||
includes_for_a_stream.
|
||||
where(:type => Stream::Base::TYPES_OF_POST_IN_STREAM).
|
||||
limit(15)
|
||||
self.for_visible_shareable_sql(max_time, order).
|
||||
includes_for_a_stream
|
||||
end
|
||||
|
||||
def self.by_max_time(max_time, order='created_at')
|
||||
where("posts.#{order} < ?", max_time).order("posts.#{order} desc")
|
||||
end
|
||||
#############
|
||||
|
||||
def diaspora_handle
|
||||
read_attribute(:diaspora_handle) || self.author.diaspora_handle
|
||||
end
|
||||
|
||||
def user_refs
|
||||
if AspectVisibility.exists?(:post_id => self.id)
|
||||
self.post_visibilities.count + 1
|
||||
else
|
||||
self.post_visibilities.count
|
||||
end
|
||||
end
|
||||
|
||||
def reshare_count
|
||||
@reshare_count ||= Post.where(:root_guid => self.guid).count
|
||||
end
|
||||
|
||||
def diaspora_handle= nd
|
||||
self.author = Person.where(:diaspora_handle => nd).first
|
||||
write_attribute(:diaspora_handle, nd)
|
||||
end
|
||||
|
||||
def self.diaspora_initialize params
|
||||
new_post = self.new params.to_hash
|
||||
new_post.author = params[:author]
|
||||
|
|
@ -82,23 +39,15 @@ class Post < ActiveRecord::Base
|
|||
new_post
|
||||
end
|
||||
|
||||
def reshare_count
|
||||
@reshare_count ||= Post.where(:root_guid => self.guid).count
|
||||
end
|
||||
|
||||
# @return Returns true if this Post will accept updates (i.e. updates to the caption of a photo).
|
||||
def mutable?
|
||||
false
|
||||
end
|
||||
|
||||
# The list of people that should receive this Post.
|
||||
#
|
||||
# @param [User] user The context, or dispatching user.
|
||||
# @return [Array<Person>] The list of subscribers to this post
|
||||
def subscribers(user)
|
||||
if self.public?
|
||||
user.contact_people
|
||||
else
|
||||
user.people_in_aspects(user.aspects_with_post(self.id))
|
||||
end
|
||||
end
|
||||
|
||||
def activity_streams?
|
||||
false
|
||||
end
|
||||
|
|
@ -111,12 +60,6 @@ class Post < ActiveRecord::Base
|
|||
I18n.t('notifier.a_post_you_shared')
|
||||
end
|
||||
|
||||
# @return [Integer]
|
||||
def update_comments_counter
|
||||
self.class.where(:id => self.id).
|
||||
update_all(:comments_count => self.comments.count)
|
||||
end
|
||||
|
||||
# @return [Boolean]
|
||||
def cache_for_author
|
||||
if self.should_cache_for_author?
|
||||
|
|
@ -131,72 +74,4 @@ class Post < ActiveRecord::Base
|
|||
self.triggers_caching? && RedisCache.configured? &&
|
||||
RedisCache.acceptable_types.include?(self.type) && user = self.author.owner
|
||||
end
|
||||
|
||||
|
||||
# @param [User] user The user that is receiving this post.
|
||||
# @param [Person] person The person who dispatched this post to the
|
||||
# @return [void]
|
||||
def receive(user, person)
|
||||
#exists locally, but you dont know about it
|
||||
#does not exsist locally, and you dont know about it
|
||||
#exists_locally?
|
||||
#you know about it, and it is mutable
|
||||
#you know about it, and it is not mutable
|
||||
self.class.transaction do
|
||||
local_post = persisted_post
|
||||
|
||||
if local_post && verify_persisted_post(local_post)
|
||||
self.receive_persisted(user, person, local_post)
|
||||
|
||||
elsif !local_post
|
||||
self.receive_non_persisted(user, person)
|
||||
|
||||
else
|
||||
Rails.logger.info("event=receive payload_type=#{self.class} update=true status=abort sender=#{self.diaspora_handle} reason='update not from post owner' existing_post=#{self.id}")
|
||||
false
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
protected
|
||||
|
||||
# @return [Post,void]
|
||||
def persisted_post
|
||||
self.class.where(:guid => self.guid).first
|
||||
end
|
||||
|
||||
# @return [Boolean]
|
||||
def verify_persisted_post(persisted_post)
|
||||
persisted_post.author_id == self.author_id
|
||||
end
|
||||
|
||||
def receive_persisted(user, person, local_post)
|
||||
known_post = user.find_visible_post_by_id(self.guid, :key => :guid)
|
||||
if known_post
|
||||
if known_post.mutable?
|
||||
known_post.update_attributes(self.attributes)
|
||||
true
|
||||
else
|
||||
Rails.logger.info("event=receive payload_type=#{self.class} update=true status=abort sender=#{self.diaspora_handle} reason=immutable") #existing_post=#{known_post.id}")
|
||||
false
|
||||
end
|
||||
else
|
||||
user.contact_for(person).receive_post(local_post)
|
||||
user.notify_if_mentioned(local_post)
|
||||
Rails.logger.info("event=receive payload_type=#{self.class} update=true status=complete sender=#{self.diaspora_handle}") #existing_post=#{local_post.id}")
|
||||
true
|
||||
end
|
||||
end
|
||||
|
||||
def receive_non_persisted(user, person)
|
||||
if self.save
|
||||
user.contact_for(person).receive_post(self)
|
||||
user.notify_if_mentioned(self)
|
||||
Rails.logger.info("event=receive payload_type=#{self.class} update=false status=complete sender=#{self.diaspora_handle}")
|
||||
true
|
||||
else
|
||||
Rails.logger.info("event=receive payload_type=#{self.class} update=false status=abort sender=#{self.diaspora_handle} reason=#{self.errors.full_messages}")
|
||||
false
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
|||
|
|
@ -1,27 +0,0 @@
|
|||
# Copyright (c) 2010-2011, Diaspora Inc. This file is
|
||||
# licensed under the Affero General Public License version 3 or later. See
|
||||
# the COPYRIGHT file.
|
||||
|
||||
class PostVisibility < ActiveRecord::Base
|
||||
|
||||
belongs_to :contact
|
||||
belongs_to :post
|
||||
|
||||
# Perform a batch import, given a set of contacts and a post
|
||||
# @note performs a bulk insert in mySQL; performs linear insertions in postgres
|
||||
# @param contacts [Array<Contact>] Recipients
|
||||
# @param post [Post]
|
||||
# @return [void]
|
||||
def self.batch_import(contact_ids, post)
|
||||
if postgres?
|
||||
contact_ids.each do |contact_id|
|
||||
PostVisibility.find_or_create_by_contact_id_and_post_id(contact_id, post.id)
|
||||
end
|
||||
else
|
||||
new_post_visibilities_data = contact_ids.map do |contact_id|
|
||||
[contact_id, post.id]
|
||||
end
|
||||
PostVisibility.import([:contact_id, :post_id], new_post_visibilities_data)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
@ -45,6 +45,7 @@ class Profile < ActiveRecord::Base
|
|||
before_validation do
|
||||
self.tag_string = self.tag_string.split[0..4].join(' ')
|
||||
end
|
||||
|
||||
before_save do
|
||||
self.build_tags
|
||||
self.construct_full_name
|
||||
|
|
@ -77,6 +78,18 @@ class Profile < ActiveRecord::Base
|
|||
result || '/images/user/default.png'
|
||||
end
|
||||
|
||||
def from_omniauth_hash(omniauth_user_hash)
|
||||
mappings = {"description" => "bio",
|
||||
'image' => 'image_url',
|
||||
'name' => 'first_name',
|
||||
'location' => 'location',
|
||||
}
|
||||
|
||||
update_hash = Hash[omniauth_user_hash.map {|k, v| [mappings[k], v] }]
|
||||
|
||||
self.attributes.merge(update_hash){|key, old, new| old.blank? ? new : old}
|
||||
end
|
||||
|
||||
def image_url= url
|
||||
return image_url if url == ''
|
||||
if url.nil? || url.match(/^https?:\/\//)
|
||||
|
|
|
|||
|
|
@ -15,7 +15,7 @@ class Retraction
|
|||
def subscribers(user)
|
||||
unless self.type == 'Person'
|
||||
@subscribers ||= self.object.subscribers(user)
|
||||
@subscribers -= self.object.resharers
|
||||
@subscribers -= self.object.resharers unless self.object.is_a?(Photo)
|
||||
@subscribers
|
||||
else
|
||||
raise 'HAX: you must set the subscribers manaully before unfriending' if @subscribers.nil?
|
||||
|
|
|
|||
|
|
@ -16,6 +16,11 @@ class Service < ActiveRecord::Base
|
|||
truncated = "#{truncated} #{url}" unless url.blank?
|
||||
return truncated
|
||||
end
|
||||
|
||||
def profile_photo_url
|
||||
nil
|
||||
end
|
||||
|
||||
end
|
||||
require File.join(Rails.root, 'app/models/services/facebook')
|
||||
require File.join(Rails.root, 'app/models/services/twitter')
|
||||
|
|
|
|||
|
|
@ -71,7 +71,11 @@ class Services::Facebook < Service
|
|||
ServiceUser.import(data, :on_duplicate_key_update => OVERRIDE_FIELDS_ON_FB_UPDATE + [:updated_at])
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
def profile_photo_url
|
||||
"https://graph.facebook.com/#{self.uid}/picture?type=large&access_token=#{URI.escape(self.access_token)}"
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
OVERRIDE_FIELDS_ON_FB_UPDATE = [:contact_id, :person_id, :request_id, :invitation_id, :photo_url, :name, :username]
|
||||
|
|
|
|||
|
|
@ -9,6 +9,27 @@ class Services::Twitter < Service
|
|||
Rails.logger.debug("event=post_to_service type=twitter sender_id=#{self.user_id}")
|
||||
message = public_message(post, url)
|
||||
|
||||
configure_twitter
|
||||
|
||||
begin
|
||||
Twitter.update(message)
|
||||
rescue Exception => e
|
||||
Rails.logger.info e.message
|
||||
end
|
||||
end
|
||||
|
||||
def public_message(post, url)
|
||||
super(post, MAX_CHARACTERS, url)
|
||||
end
|
||||
|
||||
def profile_photo_url
|
||||
configure_twitter
|
||||
|
||||
Twitter.profile_image(nickname, :size => "original")
|
||||
end
|
||||
|
||||
private
|
||||
def configure_twitter
|
||||
twitter_key = SERVICES['twitter']['consumer_key']
|
||||
twitter_consumer_secret = SERVICES['twitter']['consumer_secret']
|
||||
|
||||
|
|
@ -22,15 +43,5 @@ class Services::Twitter < Service
|
|||
config.oauth_token = self.access_token
|
||||
config.oauth_token_secret = self.access_secret
|
||||
end
|
||||
|
||||
begin
|
||||
Twitter.update(message)
|
||||
rescue Exception => e
|
||||
Rails.logger.info e.message
|
||||
end
|
||||
end
|
||||
|
||||
def public_message(post, url)
|
||||
super(post, MAX_CHARACTERS, url)
|
||||
end
|
||||
end
|
||||
|
|
|
|||
26
app/models/share_visibility.rb
Normal file
26
app/models/share_visibility.rb
Normal file
|
|
@ -0,0 +1,26 @@
|
|||
# Copyright (c) 2010-2011, Diaspora Inc. This file is
|
||||
# licensed under the Affero General Public License version 3 or later. See
|
||||
# the COPYRIGHT file.
|
||||
|
||||
class ShareVisibility < ActiveRecord::Base
|
||||
belongs_to :contact
|
||||
belongs_to :shareable, :polymorphic => :true
|
||||
|
||||
# Perform a batch import, given a set of contacts and a shareable
|
||||
# @note performs a bulk insert in mySQL; performs linear insertions in postgres
|
||||
# @param contacts [Array<Contact>] Recipients
|
||||
# @param share [Shareable]
|
||||
# @return [void]
|
||||
def self.batch_import(contact_ids, share)
|
||||
if postgres?
|
||||
contact_ids.each do |contact_id|
|
||||
ShareVisibility.find_or_create_by_contact_id_and_shareable_id_and_shareable_type(contact_id, share.id, share.class.base_class.to_s)
|
||||
end
|
||||
else
|
||||
new_share_visibilities_data = contact_ids.map do |contact_id|
|
||||
[contact_id, share.id, share.class.base_class.to_s]
|
||||
end
|
||||
ShareVisibility.import([:contact_id, :shareable_id, :shareable_type], new_share_visibilities_data)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
@ -19,7 +19,10 @@ class StatusMessage < Post
|
|||
xml_attr :raw_message
|
||||
|
||||
has_many :photos, :dependent => :destroy, :foreign_key => :status_message_guid, :primary_key => :guid
|
||||
validate :presence_of_content
|
||||
|
||||
# TODO: disabling presence_of_content() (and its specs in status_message_controller_spec.rb:125) is a quick and dirty fix for federation
|
||||
# a StatusMessage is federated before its photos are so presence_of_content() fails erroneously if no text is present
|
||||
#validate :presence_of_content
|
||||
|
||||
attr_accessible :text, :provider_display_name
|
||||
attr_accessor :oembed_url
|
||||
|
|
@ -32,16 +35,6 @@ class StatusMessage < Post
|
|||
#scopes
|
||||
scope :where_person_is_mentioned, lambda{|person| joins(:mentions).where(:mentions => {:person_id => person.id})}
|
||||
|
||||
def self.owned_or_visible_by_user(user)
|
||||
joins("LEFT OUTER JOIN post_visibilities ON post_visibilities.post_id = posts.id").
|
||||
joins("LEFT OUTER JOIN contacts ON contacts.id = post_visibilities.contact_id").
|
||||
where(Contact.arel_table[:user_id].eq(user.id).or(
|
||||
StatusMessage.arel_table[:public].eq(true).or(
|
||||
StatusMessage.arel_table[:author_id].eq(user.person.id)
|
||||
)
|
||||
)).select('DISTINCT posts.*')
|
||||
end
|
||||
|
||||
def self.tag_stream(user, tag_array, max_time, order)
|
||||
owned_or_visible_by_user(user).
|
||||
joins(:tags).where(:tags => {:name => tag_array}).
|
||||
|
|
|
|||
|
|
@ -28,9 +28,10 @@ class User < ActiveRecord::Base
|
|||
|
||||
validates_presence_of :person, :unless => proc {|user| user.invitation_token.present?}
|
||||
validates_associated :person
|
||||
validate :no_person_with_same_username
|
||||
|
||||
has_one :person, :foreign_key => :owner_id
|
||||
delegate :public_key, :posts, :owns?, :diaspora_handle, :name, :public_url, :profile, :first_name, :last_name, :to => :person
|
||||
delegate :public_key, :posts, :photos, :owns?, :diaspora_handle, :name, :public_url, :profile, :first_name, :last_name, :to => :person
|
||||
|
||||
has_many :invitations_from_me, :class_name => 'Invitation', :foreign_key => :sender_id, :dependent => :destroy
|
||||
has_many :invitations_to_me, :class_name => 'Invitation', :foreign_key => :recipient_id, :dependent => :destroy
|
||||
|
|
@ -57,7 +58,8 @@ class User < ActiveRecord::Base
|
|||
:language,
|
||||
:disable_mail,
|
||||
:invitation_service,
|
||||
:invitation_identifier
|
||||
:invitation_identifier,
|
||||
:show_community_spotlight_in_stream
|
||||
|
||||
|
||||
def self.all_sharing_with_person(person)
|
||||
|
|
@ -207,7 +209,7 @@ class User < ActiveRecord::Base
|
|||
def add_to_streams(post, aspects_to_insert)
|
||||
post.socket_to_user(self, :aspect_ids => aspects_to_insert.map{|x| x.id}) if post.respond_to? :socket_to_user
|
||||
aspects_to_insert.each do |aspect|
|
||||
aspect.posts << post
|
||||
aspect << post
|
||||
end
|
||||
end
|
||||
|
||||
|
|
@ -309,6 +311,7 @@ class User < ActiveRecord::Base
|
|||
params[:image_url_medium] = photo.url(:thumb_medium)
|
||||
params[:image_url_small] = photo.url(:thumb_small)
|
||||
end
|
||||
|
||||
if self.person.profile.update_attributes(params)
|
||||
Postzord::Dispatcher.build(self, profile).post
|
||||
true
|
||||
|
|
@ -470,4 +473,11 @@ class User < ActiveRecord::Base
|
|||
self.email = self.invitation_identifier if self.invitation_service == 'email'
|
||||
self
|
||||
end
|
||||
|
||||
def no_person_with_same_username
|
||||
diaspora_id = "#{self.username}@#{AppConfig[:pod_uri].host}"
|
||||
if self.username_changed? && Person.exists?(:diaspora_handle => diaspora_id)
|
||||
errors[:base] << 'That username has already been taken'
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@
|
|||
-# the COPYRIGHT file.
|
||||
|
||||
%ul#aspect_nav.left_nav
|
||||
%li.all_aspects{:class => ("active" if params["set"] != "all" && params["set"] != "only_sharing" && !@featured && !@finder)}
|
||||
%li.all_aspects
|
||||
.root_element= link_to t('aspects.index.your_aspects'), aspects_path
|
||||
|
||||
%ul.sub_nav
|
||||
|
|
@ -14,8 +14,7 @@
|
|||
%li{:data => {:aspect_id => aspect.id}, :class => ("active" if defined?(stream) && stream.aspect_ids.include?(aspect.id))}
|
||||
.edit
|
||||
= link_to image_tag("icons/pencil.svg", :height => 12, :title => t('.edit_aspect', :name => aspect.name)), edit_aspect_path(aspect), :rel => "facebox"
|
||||
|
||||
%a.aspect_selector{:href => aspects_path("a_ids[]" => aspect.id), :class => "aspect_selector name hard_aspect_link", 'data-guid' => aspect.id}
|
||||
%a.aspect_selector{:href => aspects_path("a_ids[]" => aspect.id), :class => "name", 'data-guid' => aspect.id}
|
||||
= aspect
|
||||
|
||||
%li
|
||||
|
|
|
|||
|
|
@ -4,11 +4,11 @@
|
|||
|
||||
#aspect_stream_header
|
||||
#sort_by
|
||||
= t('.recently')
|
||||
= t('streams.recently')
|
||||
%span.controls
|
||||
= link_to_if(session[:sort_order] == 'created_at', t('.commented_on'), stream.link(:sort_order => 'updated_at'))
|
||||
= link_to_if(session[:sort_order] == 'created_at', t('streams.commented_on'), stream.link(:sort_order => 'updated_at'))
|
||||
·
|
||||
= link_to_if(session[:sort_order] == 'updated_at', t('.posted'), stream.link(:sort_order => 'created_at' ))
|
||||
= link_to_if(session[:sort_order] == 'updated_at', t('streams.posted'), stream.link(:sort_order => 'created_at' ))
|
||||
|
||||
%h3
|
||||
= stream.title
|
||||
|
|
@ -16,11 +16,14 @@
|
|||
= render 'shared/publisher', :selected_aspects => stream.aspects, :aspect_ids => stream.aspect_ids, :for_all_aspects => stream.for_all_aspects?, :aspect => stream.aspect
|
||||
= render 'aspects/no_posts_message'
|
||||
|
||||
- if current_user.contacts.size < 2
|
||||
= render 'aspects/no_contacts_message'
|
||||
#gs-shim{:title => "3. #{t('.stay_updated')}", 'data-content' => t('.stay_updated_explanation')}
|
||||
|
||||
#main_stream.stream{:data => {:guids => stream.aspect_ids.join(','), :time_for_scroll => time_for_scroll(stream.ajax_stream?, stream)}}
|
||||
- if !stream.ajax_stream? && stream.posts.length > 0
|
||||
= render 'shared/stream', :posts => stream.posts
|
||||
#pagination
|
||||
=link_to(t('more'), next_page_path(:ajax_stream => stream.ajax_stream?), :class => 'paginate')
|
||||
|
||||
- if current_user.contacts.size < 2
|
||||
= render 'aspects/no_contacts_message'
|
||||
|
||||
|
|
|
|||
|
|
@ -7,5 +7,5 @@
|
|||
%br
|
||||
%br
|
||||
= t('.try_adding_some_more_contacts')
|
||||
!= t('.or_featured', :link => link_to(t(".featured_users") , featured_users_path))
|
||||
!= t('.or_spotlight', :link => link_to(t(".community_spotlight") , community_spotlight_path))
|
||||
|
||||
|
|
|
|||
|
|
@ -6,25 +6,42 @@
|
|||
- content_for :head do
|
||||
= include_javascripts :home
|
||||
|
||||
- if current_user.getting_started?
|
||||
#welcome-to-diaspora
|
||||
.container{:style => "position: relative;"}
|
||||
.right
|
||||
= link_to image_tag('deletelabel.png'), getting_started_completed_path, :id => "gs-skip-x"
|
||||
.span-23
|
||||
%h1
|
||||
= t('.welcome_to_diaspora', :name => current_user.first_name)
|
||||
%h3
|
||||
= t('.introduce_yourself')
|
||||
%br
|
||||
%br
|
||||
%br
|
||||
%br
|
||||
%br
|
||||
|
||||
.span-5.leftNavBar
|
||||
#home_user_badge
|
||||
= owner_image_link
|
||||
%h3
|
||||
= current_user.first_name
|
||||
%h4
|
||||
= link_to current_user.first_name, "/u/#{current_user.username}"
|
||||
|
||||
- unless has_completed_getting_started?
|
||||
.section
|
||||
%ul.left_nav
|
||||
%li
|
||||
= link_to "Welcome", getting_started_path, :class => "home_selector"
|
||||
.section
|
||||
%ul.left_nav
|
||||
%li
|
||||
%b
|
||||
= link_to t("streams.multi.title"), multi_path, :class => 'home_selector'
|
||||
|
||||
.section
|
||||
= render 'aspects/aspect_listings', :stream => @stream
|
||||
|
||||
.section
|
||||
%ul.left_nav
|
||||
.li
|
||||
%b= link_to t('.mentions'), mentions_path, :class => 'home_selector'
|
||||
%li
|
||||
%b
|
||||
= link_to t('streams.mentions.title'), mentions_path, :class => 'home_selector'
|
||||
|
||||
.section#followed_tags_listing
|
||||
= render 'tags/followed_tags_listings'
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@
|
|||
%li.comment.posted{:id => comment.guid, :class => ("hidden" if(defined? hidden))}
|
||||
- if current_user && (current_user.owns?(comment) || current_user.owns?(post))
|
||||
.right.controls
|
||||
= link_to image_tag('deletelabel.png'), post_comment_path(comment.post_id, comment), :class => "delete comment_delete", :title => t('delete')
|
||||
= link_to image_tag('deletelabel.png'), post_comment_path(comment.commentable_id, comment), :class => "delete comment_delete", :title => t('delete')
|
||||
= person_image_link(comment.author, :size => :thumb_small)
|
||||
.content
|
||||
%span.from
|
||||
|
|
|
|||
|
|
@ -3,33 +3,33 @@
|
|||
-# the COPYRIGHT file.
|
||||
|
||||
%ul#aspect_nav.left_nav
|
||||
%li.all_aspects{:class => ("active" if params["set"] != "all" && params["set"] != "only_sharing" && !@featured && !@finder)}
|
||||
%li.all_aspects{:class => ("active" if params["set"] != "all" && params["set"] != "only_sharing" && !@spotlight && !@finder)}
|
||||
%a.home_selector{:href => contacts_path, :class => ("sub_selected" if params["a_id"])}
|
||||
= t('contacts.index.my_contacts')
|
||||
.contact_count
|
||||
= my_contacts_count
|
||||
= t('contacts.index.my_contacts')
|
||||
|
||||
%ul.sub_nav
|
||||
- for aspect in all_aspects
|
||||
%li{:data => {:aspect_id => aspect.id}, :class => ("active" if params["a_id"].to_i == aspect.id)}
|
||||
%a.aspect_selector{:href => contacts_path(:a_id => aspect.id)}
|
||||
= aspect
|
||||
.contact_count
|
||||
= aspect.contacts.size
|
||||
= aspect
|
||||
|
||||
%li
|
||||
= link_to t('aspects.aspect_listings.add_an_aspect'), new_aspect_path, :class => "new_aspect", :rel => "facebox"
|
||||
|
||||
%li.all_contacts{:class => ("active" if params["set"] == "all" || params["set"] == "only_sharing")}
|
||||
%a.home_selector{:href => contacts_path(:set => "all"), :class => ("sub_selected" if params["set"] == "only_sharing")}
|
||||
= t('contacts.index.all_contacts')
|
||||
.contact_count
|
||||
= all_contacts_count
|
||||
= t('contacts.index.all_contacts')
|
||||
|
||||
%ul.sub_nav
|
||||
%li{:class => ("active" if params["set"] == "only_sharing")}
|
||||
%a.aspect_selector{:href => contacts_path(:set => "only_sharing")}
|
||||
= t('contacts.index.only_sharing_with_me')
|
||||
.contact_count
|
||||
= only_sharing_count
|
||||
= t('contacts.index.only_sharing_with_me')
|
||||
|
||||
|
|
|
|||
|
|
@ -23,9 +23,8 @@
|
|||
- conv_opts[:title] = t('.many_people_are_you_sure', :suggested_limit => suggested_limit) if @contacts.size > suggested_limit
|
||||
|
||||
= link_to t('.start_a_conversation'), new_conversation_path(:aspect_id => @aspect.id, :name => @aspect.name), conv_opts
|
||||
- if @contacts.size > suggested_limit
|
||||
= javascript_tag "$('.conversation_button').tipsy({trigger: 'hover', gravity: 'n'});"
|
||||
= link_to t('.add_to_aspect', :name => @aspect.name), edit_aspect_path(@aspect), :rel => "facebox"
|
||||
- if @contacts.size
|
||||
= link_to t('.add_to_aspect', :name => @aspect.name), edit_aspect_path(@aspect), :rel => "facebox"
|
||||
|
||||
- if @contacts.size > 0
|
||||
- for contact in @contacts
|
||||
|
|
@ -60,9 +59,9 @@
|
|||
%br
|
||||
%br
|
||||
= t('.check_out')
|
||||
= link_to t('contacts.spotlight.community_spotlight'), featured_users_path
|
||||
= link_to t('contacts.spotlight.community_spotlight'), community_spotlight_path
|
||||
- if @aspect
|
||||
or
|
||||
= link_to t('.add_to_aspect', :name => @aspect.name).downcase, edit_aspect_path(@aspect), :rel => "facebox"
|
||||
= link_to t('.add_to_aspect', :name => @aspect.name), edit_aspect_path(@aspect), :rel => "facebox"
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@
|
|||
-# the COPYRIGHT file.
|
||||
|
||||
- content_for :page_title do
|
||||
= t('.community_spotlight')
|
||||
= t('contacts.spotlight.community_spotlight')
|
||||
|
||||
- content_for :head do
|
||||
= include_javascripts :people
|
||||
|
|
@ -14,12 +14,17 @@
|
|||
|
||||
= render 'shared/contact_sidebar'
|
||||
|
||||
.span-18.last
|
||||
.span-18.last{:style => "position:relative;"}
|
||||
|
||||
- if AppConfig[:spotlight_suggest_email].present?
|
||||
.right
|
||||
= link_to "Suggest a member", "mailto:#{AppConfig[:spotlight_suggest_email]}", :class => "button"
|
||||
|
||||
%h3
|
||||
= t('.community_spotlight')
|
||||
= t('contacts.spotlight.community_spotlight')
|
||||
%br
|
||||
|
||||
#featured_users
|
||||
#community_spotlight
|
||||
- unless @people.blank?
|
||||
- @people.each do |person|
|
||||
= render 'featured_users/user', :person => person
|
||||
= render 'community_spotlight/user', :person => person
|
||||
|
|
@ -4,7 +4,7 @@
|
|||
|
||||
:javascript
|
||||
$(document).ready(function () {
|
||||
var data = $.parseJSON( "#{@contacts_json}" ),
|
||||
var data = $.parseJSON( "#{escape_javascript(@contacts_json)}" ),
|
||||
autocompleteInput = $("#contact_autocomplete");
|
||||
|
||||
autocompleteInput.autoSuggest(data, {
|
||||
|
|
|
|||
|
|
@ -1,43 +1,47 @@
|
|||
= javascript_include_tag "validation"
|
||||
= javascript_tag "Diaspora.Page = 'InvitationsEdit';"
|
||||
|
||||
:javascript
|
||||
$(function() {
|
||||
$("#user_username").focus();
|
||||
});
|
||||
|
||||
.span-7.append-1.prepend-3
|
||||
%br
|
||||
%br
|
||||
%br
|
||||
%br
|
||||
%h2
|
||||
= t('.your_account_awaits')
|
||||
%h1
|
||||
= t('welcome')
|
||||
%h3.accept_invitation_text
|
||||
= t('.accept_your_invitation')
|
||||
- flash.each do |name, msg|
|
||||
%p{:class => "login_#{name}"}= msg
|
||||
|
||||
= image_tag 'diaspora_collage.png', :style => "margin-left:-50px;"
|
||||
|
||||
.span-10
|
||||
%br
|
||||
%br
|
||||
%br
|
||||
%br
|
||||
= form_for(resource, :as => resource_name, :url => invitation_path(resource_name), :html => {:method => :put, :class => 'accept_invitation_form'}) do |f|
|
||||
%p
|
||||
= f.label :username , t('username')
|
||||
= f.text_field :username, :title => t('registrations.new.enter_username')
|
||||
%p
|
||||
= f.label :email , t('email')
|
||||
= f.email_field :email, :title => t('registrations.new.enter_email')
|
||||
%p
|
||||
= f.label :password , t('password')
|
||||
= f.password_field :password, :title => t('registrations.new.enter_password')
|
||||
%p
|
||||
= f.label :password_confirmation , t('password_confirmation')
|
||||
= f.password_field :password_confirmation, :title => t('registrations.new.enter_password_again')
|
||||
= f.hidden_field :invitation_token
|
||||
= form_for(resource, :as => resource_name, :url => invitation_path(resource_name), :html => {:method => :put, :class => 'accept_invitation_form'}, :validate => true) do |f|
|
||||
%fieldset
|
||||
.clearfix
|
||||
%b
|
||||
= t('username')
|
||||
= f.text_field :username, :title => t('registrations.new.enter_username')
|
||||
%span.host_uri
|
||||
= "@#{AppConfig[:pod_uri].host}"
|
||||
.clearfix
|
||||
%b
|
||||
= t('email')
|
||||
= f.email_field :email, :title => t('registrations.new.enter_email')
|
||||
.clearfix
|
||||
%b
|
||||
= t('password')
|
||||
= f.password_field :password, :title => t('registrations.new.enter_password')
|
||||
.clearfix
|
||||
%b
|
||||
= t('password_confirmation')
|
||||
= f.password_field :password_confirmation, :title => t('registrations.new.enter_password_again')
|
||||
= f.hidden_field :invitation_token
|
||||
|
||||
.submit_field
|
||||
= f.submit t('registrations.new.create_my_account')
|
||||
.submit_field
|
||||
= f.submit t('registrations.new.create_my_account'), :class => 'in_aspects'
|
||||
|
||||
|
|
|
|||
|
|
@ -1,9 +1,3 @@
|
|||
:javascript
|
||||
$(function() {
|
||||
$('#new_user [title]').tipsy({trigger: 'focus', gravity: ($('html').attr('dir') == 'rtl') ? 'e' : 'w'});
|
||||
$("#user_email").focus();
|
||||
});
|
||||
|
||||
.span-15.last
|
||||
.span-3
|
||||
= image_tag 'icons/monotone_email_letter_round.png', :height => "128px", :width => "128px"
|
||||
|
|
|
|||
|
|
@ -23,7 +23,7 @@
|
|||
|
||||
#nav_badges
|
||||
#home_badge.badge
|
||||
= link_to aspects_path, :title => t('_home') do
|
||||
= link_to multi_path, :title => t('_home') do
|
||||
= image_tag 'icons/home_grey.svg', :height => 16, :alt => t('_home')
|
||||
|
||||
#notification_badge.badge
|
||||
|
|
@ -40,7 +40,10 @@
|
|||
|
||||
#notification_dropdown
|
||||
.header
|
||||
= link_to t('.view_all'), notifications_path, :id => "view_all_notifications"
|
||||
.right
|
||||
= link_to t('notifications.index.mark_all_as_read'), read_all_notifications_path
|
||||
\|
|
||||
= link_to t('.view_all'), notifications_path, :id => "view_all_notifications"
|
||||
%h4
|
||||
= t('.recent_notifications')
|
||||
.notifications
|
||||
|
|
|
|||
|
|
@ -19,8 +19,12 @@
|
|||
|
||||
/ Social Media Icons are by Paul Robert Lloyd @ http://paulrobertlloyd.com/2009/06/social_media_icons
|
||||
|
||||
= stylesheet_link_tag "blueprint/screen", :media => 'screen'
|
||||
= stylesheet_link_tag "blueprint/print", :media => 'print'
|
||||
/ bootstrap/blueprint switch
|
||||
- if @aspect == :getting_started || @page == :logged_out
|
||||
= stylesheet_link_tag "bootstrap.min.css"
|
||||
- else
|
||||
= stylesheet_link_tag "blueprint/screen", :media => 'screen'
|
||||
= stylesheet_link_tag "blueprint/print", :media => 'print'
|
||||
|
||||
= stylesheet_link_tag "login", :media => 'screen'
|
||||
|
||||
|
|
@ -48,7 +52,6 @@
|
|||
= javascript_include_tag 'web-socket-receiver'
|
||||
= render 'js/websocket_js'
|
||||
|
||||
|
||||
= yield(:head)
|
||||
|
||||
-unless Rails.env == "production"
|
||||
|
|
@ -80,7 +83,6 @@
|
|||
piwikTracker.enableLinkTracking();
|
||||
} catch( err ) {}
|
||||
|
||||
|
||||
- if @person
|
||||
%link{:rel => "alternate", :href => "#{@person.public_url}.atom", :type => "application/atom+xml", :title => "#{t('.public_feed', :name => @person.name)}"}
|
||||
|
||||
|
|
@ -91,15 +93,21 @@
|
|||
|
||||
#notifications
|
||||
|
||||
- flash.each do |name, msg|
|
||||
%div{:id => "flash_#{name}"}= msg
|
||||
- unless @page == :logged_out
|
||||
- flash.each do |name, msg|
|
||||
%div{:id => "flash_#{name}"}
|
||||
.message
|
||||
= msg
|
||||
|
||||
%header{:class=>('landing' unless current_user)}
|
||||
= render 'layouts/header'
|
||||
|
||||
.container{:style=> "#{yield(:break_the_mold)}"}
|
||||
.span-24.last{:style=> "#{yield(:break_the_mold)}"}
|
||||
- if @aspsect == :getting_started || @page == :logged_out
|
||||
= yield
|
||||
- else
|
||||
.span-24.last{:style=> "#{yield(:break_the_mold)}"}
|
||||
= yield
|
||||
|
||||
%footer
|
||||
.container
|
||||
|
|
|
|||
|
|
@ -50,7 +50,7 @@
|
|||
= yield
|
||||
|
||||
%header
|
||||
= link_to(image_tag('white@2x.png', :height => 20, :width => 127, :id => 'header_title'), aspects_path)
|
||||
= link_to(image_tag('white@2x.png', :height => 20, :width => 127, :id => 'header_title'), multi_path)
|
||||
- if user_signed_in?
|
||||
- if yield(:header_action).present?
|
||||
= yield(:header_action)
|
||||
|
|
|
|||
|
|
@ -26,12 +26,13 @@
|
|||
.stream_container
|
||||
= render 'people/sub_header', :person => @person, :contact => @contact
|
||||
|
||||
- if @posts.length > 0
|
||||
/ hackity hack until we get a photo stream
|
||||
- if (@posts && @posts.length > 0) || @stream.posts.length > 0
|
||||
-if @post_type == :photos
|
||||
= render 'photos/index', :photos => @posts
|
||||
- else
|
||||
#main_stream.stream
|
||||
= render 'shared/stream', :posts => @posts
|
||||
= render 'shared/stream', :posts => @stream.posts
|
||||
#pagination
|
||||
=link_to(t('more'), next_page_path, :class => 'paginate')
|
||||
|
||||
|
|
|
|||
|
|
@ -20,12 +20,12 @@
|
|||
= link_to t('.return_to_aspects'), aspects_manage_path
|
||||
= t('.to_accept_or_ignore')
|
||||
|
||||
- if @posts.length > 0
|
||||
- if @stream.posts.length > 0
|
||||
-if @post_type == :photos
|
||||
= render 'photos/index', :photos => @posts
|
||||
= render 'photos/index', :photos => @stream.posts
|
||||
- else
|
||||
#main_stream.stream
|
||||
= render 'shared/stream', :posts => @posts
|
||||
= render 'shared/stream', :posts => @stream.posts
|
||||
#pagination
|
||||
=link_to(t('more'), next_page_path, :class => 'paginate')
|
||||
- else
|
||||
|
|
|
|||
|
|
@ -38,7 +38,6 @@
|
|||
var id = responseJSON.data.photo.id;
|
||||
var url = responseJSON.data.photo.unprocessed_image.url;
|
||||
var oldPhoto = $('#photo_id');
|
||||
console.log(responseJSON);
|
||||
if(oldPhoto.length == 0) {
|
||||
$('#update_profile_form').prepend("<input type='hidden' value='" + id + "' id='photo_id' name='photo_id'/>");
|
||||
}else{
|
||||
|
|
@ -47,6 +46,7 @@
|
|||
|
||||
$("#profile_photo_upload").find(".avatar").removeClass('loading');
|
||||
$("#profile_photo_upload").find(".avatar").attr("src",url);
|
||||
$(".avatar[data-person_id=#{current_user.person.id}]").attr("src",url);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
|
@ -55,6 +55,10 @@
|
|||
#profile_photo_upload
|
||||
= owner_image_tag(:thumb_medium)
|
||||
|
||||
-if !aspect.nil? && aspect == :getting_started
|
||||
%br
|
||||
%br
|
||||
|
||||
#file-upload.button
|
||||
=t('.upload')
|
||||
|
||||
|
|
|
|||
|
|
@ -5,3 +5,4 @@
|
|||
.stream
|
||||
= render :partial => 'shared/stream_element',
|
||||
:locals => {:post => @post, :commenting_disabled => commenting_disabled?(@post), :expanded_info => true}
|
||||
|
||||
|
|
|
|||
|
|
@ -5,34 +5,33 @@
|
|||
- content_for :head do
|
||||
= include_javascripts :profile
|
||||
|
||||
:javascript
|
||||
$(document).ready(function () {
|
||||
var data = $.parseJSON( '#{@tags_array.to_json.gsub("'", "\\\\'")}' ),
|
||||
autocompleteInput = $("#profile_tag_string");
|
||||
:javascript
|
||||
$(document).ready(function () {
|
||||
var data = $.parseJSON( '#{@tags_array.to_json.gsub("'", "\\\\'")}' ),
|
||||
autocompleteInput = $("#profile_tag_string");
|
||||
|
||||
autocompleteInput.autoSuggest("#{tags_path}", {
|
||||
selectedItemProp: "name",
|
||||
searchObjProps: "name",
|
||||
asHtmlID: "tags",
|
||||
neverSubmit: true,
|
||||
retriveLimit: 10,
|
||||
selectionLimit: 5,
|
||||
minChars: 2,
|
||||
keyDelay: 200,
|
||||
startText: "",
|
||||
emptyText: "#{t('no_results')}",
|
||||
preFill: data
|
||||
});
|
||||
autocompleteInput.autoSuggest("#{tags_path}", {
|
||||
selectedItemProp: "name",
|
||||
searchObjProps: "name",
|
||||
asHtmlID: "tags",
|
||||
neverSubmit: true,
|
||||
retriveLimit: 10,
|
||||
minChars: 2,
|
||||
keyDelay: 200,
|
||||
startText: "",
|
||||
emptyText: "#{t('no_results')}",
|
||||
preFill: data
|
||||
});
|
||||
|
||||
autocompleteInput.bind('keydown', function(evt){
|
||||
if(evt.keyCode == 13 || evt.keyCode == 9 || evt.keyCode == 32){
|
||||
evt.preventDefault();
|
||||
if( $('li.as-result-item.active').length == 0 ){
|
||||
$('li.as-result-item').first().click();
|
||||
autocompleteInput.bind('keydown', function(evt){
|
||||
if(evt.keyCode == 13 || evt.keyCode == 9 || evt.keyCode == 32){
|
||||
evt.preventDefault();
|
||||
if( $('li.as-result-item.active').length == 0 ){
|
||||
$('li.as-result-item').first().click();
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
%h3
|
||||
= t('profiles.edit.your_public_profile')
|
||||
|
|
|
|||
|
|
@ -1,39 +1,48 @@
|
|||
= javascript_include_tag "validation"
|
||||
-# = javascript_include_tag 'vendor/jquery.ghostInput'
|
||||
|
||||
:javascript
|
||||
$(function() {
|
||||
$("#user_username").focus();
|
||||
});
|
||||
|
||||
= javascript_tag "Diaspora.Page = 'InvitationsEdit';"
|
||||
.span-7.append-1.prepend-3
|
||||
%br
|
||||
%br
|
||||
%br
|
||||
%br
|
||||
%h2
|
||||
= t('.join_the_movement')
|
||||
%h1
|
||||
= t('welcome')
|
||||
%h3.accept_invitation_text
|
||||
= t('.sign_up_today')
|
||||
= t('.sign_up_message')
|
||||
- flash.each do |name, msg|
|
||||
%p{:class => "login_#{name}"}= msg
|
||||
|
||||
= image_tag 'diaspora_collage.png', :style => "margin-left:-50px;"
|
||||
|
||||
.span-10
|
||||
%br
|
||||
%br
|
||||
%br
|
||||
%br
|
||||
= form_for(resource, :as => resource_name, :url => registration_path(resource_name), :html => {:class => 'sign_up_form'}) do |f|
|
||||
%p
|
||||
= f.label :username , t('username')
|
||||
= f.text_field :username, :title => t('.enter_username')
|
||||
%p
|
||||
= f.label :email , t('email')
|
||||
= f.text_field :email, :title => t('.enter_email')
|
||||
|
||||
%p
|
||||
= f.label :password , t('password')
|
||||
= f.password_field :password, :title => t('.enter_password')
|
||||
%p
|
||||
= f.label :password_confirmation , t('password_confirmation')
|
||||
= f.password_field :password_confirmation, :title => t('.enter_password_again')
|
||||
= form_for(resource, :as => resource_name, :html => {:class => 'new_user_form'}, :url => registration_path(resource_name), :validate => true) do |f|
|
||||
%fieldset
|
||||
.clearfix
|
||||
%b
|
||||
= t('username')
|
||||
= f.text_field :username, :title => t('registrations.new.enter_username')
|
||||
%span.host_uri
|
||||
= "@#{AppConfig[:pod_uri].host}"
|
||||
.clearfix
|
||||
%b
|
||||
= t('email')
|
||||
= f.email_field :email, :title => t('registrations.new.enter_email')
|
||||
.clearfix
|
||||
%b
|
||||
= t('password')
|
||||
= f.password_field :password, :title => t('registrations.new.enter_password')
|
||||
.clearfix
|
||||
%b
|
||||
= t('password_confirmation')
|
||||
= f.password_field :password_confirmation, :title => t('registrations.new.enter_password_again')
|
||||
|
||||
.submit_field
|
||||
= f.submit t('registrations.new.create_my_account'), :class => 'in_aspects'
|
||||
|
||||
= f.submit t('.create_my_account')
|
||||
|
||||
|
|
|
|||
40
app/views/registrations/new.mobile.haml
Normal file
40
app/views/registrations/new.mobile.haml
Normal file
|
|
@ -0,0 +1,40 @@
|
|||
-# Copyright (c) 2010-2011, Diaspora Inc. This file is
|
||||
-# licensed under the Affero General Public License version 3 or later. See
|
||||
-# the COPYRIGHT file.
|
||||
|
||||
= javascript_include_tag "validation"
|
||||
|
||||
.stream
|
||||
#login_form
|
||||
.login-container
|
||||
%h2
|
||||
= t('users.getting_started.welcome')
|
||||
= form_for(resource, :as => resource_name, :html => {:class => 'new_user_form'}, :url => registration_path(resource_name), :validate => true) do |f|
|
||||
.row
|
||||
.row
|
||||
= f.label :username, t('username')
|
||||
.centered
|
||||
= f.text_field :username
|
||||
%span.host_uri
|
||||
= "@#{AppConfig[:pod_uri].host}"
|
||||
.row
|
||||
.row
|
||||
= f.label :email, t('email')
|
||||
.centered
|
||||
= f.email_field :email
|
||||
.row
|
||||
.row
|
||||
= f.label :password, t('password')
|
||||
.centered
|
||||
= f.password_field :password
|
||||
.row
|
||||
.row
|
||||
= f.label :password_confirmation, t('password_confirmation')
|
||||
.centered
|
||||
= f.password_field :password_confirmation
|
||||
.row
|
||||
= f.submit t('registrations.new.create_my_account'), :class => 'login-submit'
|
||||
= link_to t('.sign_up'), new_user_session_path()
|
||||
|
||||
%footer
|
||||
|
||||
|
|
@ -8,9 +8,9 @@
|
|||
%hr
|
||||
|
||||
%ul.left_nav
|
||||
- if AppConfig[:featured_users]
|
||||
%li{:class => ("active" if @featured)}
|
||||
= link_to t('contacts.featured.featured_users'), featured_users_path, :class => "element_selector"
|
||||
- if AppConfig[:community_spotlight]
|
||||
%li{:class => ("active" if @spotlight)}
|
||||
= link_to t('contacts.spotlight.community_spotlight'), community_spotlight_path, :class => "element_selector"
|
||||
%li{:class => ("active" if @finder)}
|
||||
= link_to "Facebook Friends", friend_finder_path('facebook'), :class => "element_selector"
|
||||
|
||||
|
|
|
|||
|
|
@ -1,11 +1,12 @@
|
|||
%form{:action => "https://www.paypal.com/cgi-bin/webscr", :method => "post"}
|
||||
%input{:name => "cmd", :type => "hidden", :value => "_s-xclick"}
|
||||
%input{:name => "hosted_button_id", :type => "hidden", :value => AppConfig[:paypal_hosted_button_id]}
|
||||
%input{:name => "on0", :type => "hidden", :value => "Type"}
|
||||
%input{:name => "modify", :type => "hidden", :value => "2"}
|
||||
%select{:name => "os0"}
|
||||
%option{:value => "Mocha"} Mocha : $3.00USD
|
||||
%option{:value => "Americano"} Americano : $5.00USD
|
||||
%option{:value => "Box o' Joe"} Box o' Joe : $20.00USD
|
||||
%input{:name => "currency_code", :type => "hidden", :value => "USD"}
|
||||
-# %form{:action => "https://www.paypal.com/cgi-bin/webscr", :method => "post"}
|
||||
%form{:action => "https://www.diasporafoundation.org/donate", :method => "get"}
|
||||
-# %input{:name => "cmd", :type => "hidden", :value => "_s-xclick"}
|
||||
-# %input{:name => "hosted_button_id", :type => "hidden", :value => AppConfig[:paypal_hosted_button_id]}
|
||||
-# %input{:name => "on0", :type => "hidden", :value => "Type"}
|
||||
-# %input{:name => "modify", :type => "hidden", :value => "2"}
|
||||
%select{:name => "monthly_amount"}
|
||||
%option{:value => "1"} Supporter : $5.00USD
|
||||
%option{:value => "2"} Member : $10.00USD
|
||||
%option{:value => "3"} Freedom Fighter : $20.00USD
|
||||
-# %input{:name => "currency_code", :type => "hidden", :value => "USD"}
|
||||
%input{:name => "submit", :type => "submit", :value => t('aspects.index.donate')}
|
||||
|
|
|
|||
|
|
@ -4,11 +4,49 @@
|
|||
|
||||
:javascript
|
||||
$(function() {
|
||||
$(".question_mark").tipsy({trigger: 'hover', gravity: 'n'});
|
||||
$(".service_icon").tipsy({trigger: 'hover', gravity: 'n'});
|
||||
$(".public_icon").tipsy({trigger: 'hover', gravity: 'n'});
|
||||
$(".question_mark").twipsy({trigger: 'hover', placement: 'bottom'});
|
||||
$(".service_icon").twipsy({trigger: 'hover', placement: 'bottom'});
|
||||
$(".public_icon").twipsy({trigger: 'hover', placement: 'bottom'});
|
||||
});
|
||||
|
||||
- if publisher_open
|
||||
:javascript
|
||||
$(document).ready(function() {
|
||||
Publisher.open();
|
||||
});
|
||||
|
||||
-if publisher_explain
|
||||
:javascript
|
||||
$(document).ready(function()
|
||||
{
|
||||
$("#publisher .dropdown").popover({trigger: 'manual', offset: 10, placement:'below'});
|
||||
$("#publisher .dropdown").bind("click", function(){$(this).popover("hide")});
|
||||
|
||||
$("#publisher #status_message_fake_text").popover({trigger: 'manual', placement: 'right', offset: 30, id: "first_message_explain"});
|
||||
$("#publisher #status_message_fake_text").bind("click", function(){$(this).popover("hide")});
|
||||
|
||||
$("#gs-shim").popover({trigger: 'manual', placement: 'left', offset: -5});
|
||||
$("#gs-shim").bind("click", function(){$(this).popover("hide")});
|
||||
|
||||
setTimeout(function(){
|
||||
$("#publisher #status_message_fake_text").popover("show");
|
||||
}, 600);
|
||||
|
||||
setTimeout(function(){
|
||||
$("#publisher .dropdown").popover("show");
|
||||
}, 1000);
|
||||
|
||||
setTimeout(function(){
|
||||
$("#gs-shim").popover("show");
|
||||
}, 1400);
|
||||
|
||||
$("#publisher .button.creation").bind("click", function(){
|
||||
$("#publisher .dropdown").popover("hide");
|
||||
$("#publisher #status_message_fake_text").popover("hide");
|
||||
$("#gs-shim").popover("hide");
|
||||
});
|
||||
});
|
||||
|
||||
#publisher.closed{:class => ((aspect == :profile)? 'mention_popup' : nil )}
|
||||
.content_creation
|
||||
= form_for(StatusMessage.new, :remote => remote?, :html => {"data-type" => "json"}) do |status|
|
||||
|
|
@ -18,28 +56,53 @@
|
|||
#publisher_textarea_wrapper
|
||||
= link_to( image_tag('deletelabel.png'), "#", :id => "hide_publisher", :title => t('.discard_post'))
|
||||
%ul#photodropzone
|
||||
= status.text_area :fake_text, :rows => 2, :value => h(params[:prefill]), :tabindex => 1, :placeholder => t('.whats_on_your_mind')
|
||||
= status.text_area :fake_text, :rows => 2, :value => h(publisher_prefill_text), :tabindex => 1, :placeholder => t('.whats_on_your_mind'),
|
||||
:title => "1. #{t('shared.public_explain.share')}", 'data-content' => t('shared.public_explain.new_user_welcome_message')
|
||||
= status.hidden_field :text, :value => '', :class => 'clear_on_submit'
|
||||
|
||||
#file-upload{:title => t('.upload_photos')}
|
||||
= image_tag 'icons/camera.svg', :height => 14
|
||||
|
||||
|
||||
- for aspect_id in aspect_ids
|
||||
= hidden_field_tag 'aspect_ids[]', aspect_id.to_s
|
||||
- if publisher_public
|
||||
= hidden_field_tag 'aspect_ids[]', "public"
|
||||
- elsif all_aspects_selected?(selected_aspects)
|
||||
= hidden_field_tag 'aspect_ids[]', "all_aspects"
|
||||
- else
|
||||
- for aspect_id in aspect_ids
|
||||
= hidden_field_tag 'aspect_ids[]', aspect_id.to_s
|
||||
|
||||
.options_and_submit
|
||||
.public_toggle
|
||||
%span#publisher_service_icons
|
||||
= t("shared.publisher.click_to_share_with")
|
||||
- if((defined?(for_all_aspects) && for_all_aspects) || aspect == :profile)
|
||||
= status.hidden_field(:public, :value => public_value )
|
||||
= image_tag "icons/globe.png", :title => public_helper_text, :class => "public_icon #{'dim' if !public_value}", :width => 16, :height => 16
|
||||
- if current_user.services
|
||||
- for service in current_user.services
|
||||
= image_tag "social_media_logos/#{service.provider}-16x16.png", :title => service.provider.titleize, :class => "service_icon dim", :id =>"#{service.provider}", :maxchar => "#{service.class::MAX_CHARACTERS}"
|
||||
= link_to (image_tag "icons/monotone_wrench_settings.png"), "#question_mark_pane", :class => 'question_mark', :rel => 'facebox', :title => t('shared.public_explain.manage')
|
||||
= render "shared/aspect_dropdown", :selected_aspects => selected_aspects, :hang => 'left'
|
||||
|
||||
// NOTE(dropdown special casing to DRY up -- taken from the aspect_dropdown partial)
|
||||
.dropdown{:class => "hang_right", :title => "2. #{t('shared.public_explain.control_your_audience')}", 'data-content'=> t('shared.public_explain.visibility_dropdown')}
|
||||
.button.toggle.publisher
|
||||
- if publisher_public
|
||||
= t('public')
|
||||
- elsif all_aspects_selected?(selected_aspects)
|
||||
= t('all_aspects')
|
||||
- elsif selected_aspects.size == 1
|
||||
= selected_aspects.first.name
|
||||
- else
|
||||
= t('.toggle', :count => selected_aspects.size)
|
||||
▼
|
||||
|
||||
.wrapper
|
||||
%ul.dropdown_list{:unSelectable => 'on', 'data-person_id' => (person.id if defined?(person) && person), 'data-service_uid' => (service_uid if defined?(service_uid))}
|
||||
%li.public.radio{"data-aspect_id" => "public", :class => ("selected" if publisher_public)}
|
||||
Public
|
||||
|
||||
%li.divider.all_aspects.radio{:style => "border-bottom: 1px solid #ddd;", "data-aspect_id" => "all_aspects", :class => ("selected" if (!publisher_public && all_aspects_selected?(selected_aspects)))}
|
||||
= t('all_aspects')
|
||||
|
||||
- for aspect in all_aspects
|
||||
= aspect_dropdown_list_item(aspect, !all_aspects_selected?(selected_aspects) && selected_aspects.include?(aspect) )
|
||||
|
||||
= status.submit t('.share'), :disable_with => t('.posting'), :class => 'button creation', :tabindex => 2
|
||||
|
||||
.facebox_content
|
||||
|
|
|
|||
|
|
@ -69,23 +69,13 @@
|
|||
.content
|
||||
!= t('bookmarklet.explanation', :link => link_to(t('bookmarklet.explanation_link_text'), bookmarklet))
|
||||
|
||||
- if @stream.has_featured_users?
|
||||
.section
|
||||
.title.no_icon
|
||||
%h5
|
||||
=t('aspects.index.community_spotlight')
|
||||
.content#featured_users
|
||||
= link_to t('aspects.index.see_more_from_us'), featured_path, :id => 'view_all_contacts_link'
|
||||
|
||||
- unless AppConfig[:paypal_hosted_button_id].blank?
|
||||
.section
|
||||
.title
|
||||
= image_tag('/images/icons/coffee.png')
|
||||
%h5
|
||||
= t('aspects.index.donate')
|
||||
.content
|
||||
= t('aspects.index.keep_us_running', :pod => URI.parse(AppConfig[:pod_url]).host)
|
||||
%br
|
||||
= render 'shared/donate'
|
||||
|
||||
.section
|
||||
.title
|
||||
= image_tag('/images/icons/coffee.png')
|
||||
%h5
|
||||
= t('aspects.index.donate')
|
||||
.content
|
||||
= t('aspects.index.keep_us_running', :pod => URI.parse(AppConfig[:pod_url]).host)
|
||||
%br
|
||||
= render 'shared/donate'
|
||||
|
||||
|
|
|
|||
|
|
@ -3,24 +3,26 @@
|
|||
-# the COPYRIGHT file.
|
||||
|
||||
|
||||
.stream_element{:id => post.guid}
|
||||
.stream_element{:id => post.guid, :class => from_group(post)}
|
||||
.right.controls
|
||||
- if current_user && post.author.owner_id == current_user.id
|
||||
= link_to image_tag('deletelabel.png'), post_path(post), :confirm => t('are_you_sure'), :method => :delete, :remote => true, :class => "delete stream_element_delete", :title => t('delete')
|
||||
- else
|
||||
= link_to image_tag('deletelabel.png'), post_visibility_path(:id => "42", :post_id => post.id), :method => :put, :remote => true, :class => "delete stream_element_delete vis_hide", :title => t('.hide_and_mute')
|
||||
= link_to image_tag('deletelabel.png'), share_visibility_path(:id => "42", :post_id => post.id), :method => :put, :remote => true, :class => "delete stream_element_delete vis_hide", :title => t('.hide_and_mute')
|
||||
= image_tag 'ajax-loader.gif', :class => "hide_loader hidden"
|
||||
|
||||
.undo_text.hidden
|
||||
%p
|
||||
= t('post_visibilites.update.post_hidden_and_muted', :name => person_link(post.author)).html_safe
|
||||
= t('share_visibilites.update.post_hidden_and_muted', :name => person_link(post.author)).html_safe
|
||||
%p
|
||||
= t('post_visibilites.update.see_it_on_their_profile', :name => person_link(post.author)).html_safe
|
||||
= link_to t('undo'), post_visibility_path(:id => "42", :post_id => post.id), :method => :put, :remote => true
|
||||
= t('share_visibilites.update.see_it_on_their_profile', :name => person_link(post.author)).html_safe
|
||||
= link_to t('undo'), share_visibility_path(:id => "42", :post_id => post.id), :method => :put, :remote => true
|
||||
|
||||
.indicator{:title => "#{what_stream_sentence(post)}"}
|
||||
= stream_settings_link(post)
|
||||
|
||||
.sm_body
|
||||
= person_image_link(post.author, :size => :thumb_small)
|
||||
|
||||
.content
|
||||
%div.post_initial_info
|
||||
%span.from
|
||||
|
|
@ -72,7 +74,7 @@
|
|||
%span.like_action
|
||||
= like_action(post, current_user)
|
||||
|
||||
- if (post.author_id != current_user.person.id) && (post.public?)
|
||||
- if resharable?(post)
|
||||
·
|
||||
%span.reshare_action
|
||||
= reshare_link(post)
|
||||
|
|
|
|||
|
|
@ -26,19 +26,19 @@
|
|||
- if defined?(expanded_info) && expanded_info
|
||||
.comment_container
|
||||
.post_stats
|
||||
- if @post.public?
|
||||
- if post.public?
|
||||
%span.comment_count
|
||||
= @post.reshares.size
|
||||
= post.reshares.size
|
||||
|
||||
%span.comment_count
|
||||
= @post.comments.size
|
||||
= post.comments.size
|
||||
|
||||
%span.like_count
|
||||
= @post.likes.size
|
||||
= post.likes.size
|
||||
|
||||
%ul.comments
|
||||
= render :partial => 'comments/comment', :collection => @comments, :locals => {:post => @post}
|
||||
= render :partial => 'comments/comment', :collection => post.comments, :locals => {:post => post}
|
||||
|
||||
%li.comment.add_comment_bottom_link_container
|
||||
= link_to "Add a comment", new_post_comment_path(@post), :class => 'add_comment_bottom_link btn comment_action inactive'
|
||||
= link_to "Add a comment", new_post_comment_path(post), :class => 'add_comment_bottom_link btn comment_action inactive'
|
||||
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@
|
|||
- if user_signed_in?
|
||||
%ul.left_nav
|
||||
%li
|
||||
%b=link_to t('aspects.index.tags_following'), tag_followings_path, :class => 'home_selector'
|
||||
%b=link_to t('streams.followed_tag.title'), tag_followings_path, :class => 'home_selector'
|
||||
|
||||
%ul.sub_nav
|
||||
- if tags.size > 0
|
||||
|
|
|
|||
|
|
@ -4,8 +4,8 @@
|
|||
|
||||
|
||||
- content_for :page_title do
|
||||
- if params[:name]
|
||||
= "##{params[:name]}"
|
||||
- if @stream.tag_name
|
||||
= @stream.display_tag_name
|
||||
- else
|
||||
= t('.whatup', :pod => @pod_url)
|
||||
|
||||
|
|
@ -17,12 +17,12 @@
|
|||
$(".button.tag_following").hover(function(){
|
||||
$this = $(this);
|
||||
$this.removeClass("in_aspects");
|
||||
$this.val("#{t('.stop_following', :tag => params[:name])}");
|
||||
$this.val("#{t('.stop_following', :tag => @stream.tag_name)}");
|
||||
},
|
||||
function(){
|
||||
$this = $(this);
|
||||
$this.addClass("in_aspects");
|
||||
$this.val("#{t('.following', :tag => params[:name])}");
|
||||
$this.val("#{t('.following', :tag => @stream.tag_name)}");
|
||||
});
|
||||
});
|
||||
$(".people_stream .pagination a").live("click", function() {
|
||||
|
|
@ -36,10 +36,10 @@
|
|||
|
||||
.span-6.tags_people
|
||||
%h3
|
||||
= t('people', :count => @people_count)
|
||||
= t('people', :count => @stream.tagged_people_count)
|
||||
|
||||
.side_stream.stream
|
||||
= render :partial => 'people/index', :locals => {:people => @people}
|
||||
= render :partial => 'people/index', :locals => {:people => @stream.tagged_people}
|
||||
|
||||
%br
|
||||
|
||||
|
|
@ -49,28 +49,28 @@
|
|||
.span-15.last
|
||||
.stream_container
|
||||
#author_info
|
||||
- if user_signed_in? && current_user.person != @person
|
||||
- if user_signed_in?
|
||||
.right
|
||||
- unless tag_followed?
|
||||
= button_to t('.follow', :tag => params[:name]), tag_tag_followings_path(:name => params[:name]), :method => :post, :class => 'button take_action'
|
||||
= button_to t('.follow', :tag => @stream.tag_name), tag_tag_followings_path(:name => @stream.tag_name), :method => :post, :class => 'button take_action'
|
||||
- else
|
||||
= button_to t('.following', :tag => params[:name]), tag_tag_followings_path(:name => params[:name]), :method => :delete, :class => 'button red_on_hover tag_following in_aspects take_action'
|
||||
= button_to t('.following', :tag => @stream.tag_name), tag_tag_followings_path(:name => @stream.tag_name), :method => :delete, :class => 'button red_on_hover tag_following in_aspects take_action'
|
||||
%h2
|
||||
= "##{params[:name]}"
|
||||
= @stream.display_tag_name
|
||||
%small
|
||||
= t('.followed_by')
|
||||
= t('people', :count => @tag_follow_count)
|
||||
= t('people', :count => @stream.tag_follow_count)
|
||||
|
||||
- if current_user
|
||||
= render 'shared/publisher', :selected_aspects => all_aspects.map{|a| a.id}, :aspect_ids => all_aspects.map{|a| a.id}, :for_all_aspects => true, :aspect => all_aspects.first
|
||||
= render 'shared/publisher', :selected_aspects => @stream.aspect_ids, :aspect_ids => @stream.aspect_ids, :for_all_aspects => true, :aspect => @stream.aspect
|
||||
|
||||
%hr
|
||||
|
||||
#main_stream.stream
|
||||
- if @posts.length > 0
|
||||
= render 'shared/stream', :posts => @posts
|
||||
- if @stream.posts.length > 0
|
||||
= render 'shared/stream', :posts => @stream.posts
|
||||
#pagination
|
||||
=link_to(t('more'), next_page_path, :class => 'paginate')
|
||||
- else
|
||||
= t('.nobody_talking', :tag => "##{params[:name]}")
|
||||
= t('.nobody_talking', :tag => @stream.display_tag_name)
|
||||
|
||||
|
|
|
|||
|
|
@ -3,11 +3,11 @@
|
|||
-# the COPYRIGHT file.
|
||||
|
||||
%h1
|
||||
= "##{params[:name]}"
|
||||
= @stream.display_tag_name
|
||||
|
||||
#main_stream.stream
|
||||
= render 'shared/stream', :posts => @posts
|
||||
-if @posts.length > 0
|
||||
= render 'shared/stream', :posts => @stream.posts
|
||||
-if @stream.posts.length > 0
|
||||
#pagination
|
||||
%a.more-link.paginate{:href => next_page_path}
|
||||
%h1
|
||||
|
|
|
|||
|
|
@ -71,8 +71,42 @@
|
|||
%br
|
||||
%br
|
||||
%hr
|
||||
|
||||
%br
|
||||
|
||||
%h3#stream-preferences
|
||||
= t('.stream_preferences')
|
||||
= form_for current_user, :url => user_path, :html => { :method => :put } do |f|
|
||||
= f.error_messages
|
||||
|
||||
%p.checkbox_select
|
||||
= f.label :show_community_spotlight_in_stream, t('.show_community_spotlight')
|
||||
= f.check_box :show_community_spotlight_in_stream
|
||||
|
||||
%br
|
||||
= f.submit t('.change'), :class => 'button'
|
||||
|
||||
%br
|
||||
%br
|
||||
%hr
|
||||
%br
|
||||
|
||||
%h3#getting-started-preferences
|
||||
= t('.show_getting_started')
|
||||
= form_for current_user, :url => user_path, :html => { :method => :put } do |f|
|
||||
= f.error_messages
|
||||
|
||||
%p.checkbox_select
|
||||
= f.label :getting_started, t('.show_getting_started')
|
||||
= f.check_box :getting_started
|
||||
|
||||
%br
|
||||
= f.submit t('.change'), :class => 'button'
|
||||
|
||||
%br
|
||||
%br
|
||||
%hr
|
||||
%br
|
||||
%h3
|
||||
= t('.receive_email_notifications')
|
||||
= form_for 'user', :url => user_path, :html => { :method => :put } do |f|
|
||||
|
|
@ -81,38 +115,38 @@
|
|||
= f.fields_for :email_preferences do |type|
|
||||
#email_prefs
|
||||
%p.checkbox_select
|
||||
= type.label t('.also_commented')
|
||||
= type.check_box :also_commented, {:checked => @email_prefs['also_commented']}, false, true
|
||||
= type.label :also_commented, t('.also_commented')
|
||||
= type.check_box :also_commented, {:checked => @email_prefs['also_commented']}, false, true
|
||||
%br
|
||||
%p.checkbox_select
|
||||
= type.label t('.mentioned')
|
||||
= type.check_box :mentioned, {:checked => @email_prefs['mentioned']}, false, true
|
||||
= type.label :mentioned, t('.mentioned')
|
||||
= type.check_box :mentioned, {:checked => @email_prefs['mentioned']}, false, true
|
||||
|
||||
|
||||
%br
|
||||
%p.checkbox_select
|
||||
= type.label t('.comment_on_post')
|
||||
= type.check_box :comment_on_post, {:checked => @email_prefs['comment_on_post']}, false, true
|
||||
|
||||
%br
|
||||
%p.checkbox_select
|
||||
= type.label t('.private_message')
|
||||
= type.check_box :private_message, {:checked => @email_prefs['private_message']}, false, true
|
||||
|
||||
%br
|
||||
%p.checkbox_select
|
||||
= type.label t('.started_sharing')
|
||||
= type.check_box :started_sharing, {:checked => @email_prefs['started_sharing']}, false, true
|
||||
= type.label :comment_on_post, t('.comment_on_post')
|
||||
= type.check_box :comment_on_post, {:checked => @email_prefs['comment_on_post']}, false, true
|
||||
|
||||
%br
|
||||
%p.checkbox_select
|
||||
= type.label t('.liked')
|
||||
= type.check_box :liked, {:checked => @email_prefs['liked']}, false, true
|
||||
= type.label :private_message, t('.private_message')
|
||||
= type.check_box :private_message, {:checked => @email_prefs['private_message']}, false, true
|
||||
|
||||
%br
|
||||
%p.checkbox_select
|
||||
= type.label t('.reshared')
|
||||
= type.check_box :reshared, {:checked => @email_prefs['reshared']}, false, true
|
||||
= type.label :started_sharing, t('.started_sharing')
|
||||
= type.check_box :started_sharing, {:checked => @email_prefs['started_sharing']}, false, true
|
||||
|
||||
%br
|
||||
%p.checkbox_select
|
||||
= type.label :liked, t('.liked')
|
||||
= type.check_box :liked, {:checked => @email_prefs['liked']}, false, true
|
||||
|
||||
%br
|
||||
%p.checkbox_select
|
||||
= type.label :reshared, t('.reshared')
|
||||
= type.check_box :reshared, {:checked => @email_prefs['reshared']}, false, true
|
||||
%br
|
||||
= f.submit t('.change')
|
||||
|
||||
|
|
|
|||
|
|
@ -2,189 +2,80 @@
|
|||
-# licensed under the Affero General Public License version 3 or later. See
|
||||
-# the COPYRIGHT file.
|
||||
|
||||
.span-5.leftNavBar
|
||||
#home_user_badge
|
||||
= owner_image_link
|
||||
%h3
|
||||
= current_user.first_name
|
||||
- content_for :head do
|
||||
= include_javascripts :profile
|
||||
|
||||
- unless has_completed_getting_started?
|
||||
.section
|
||||
%ul.left_nav
|
||||
%li
|
||||
= link_to t(".welcome"), getting_started_path, :class => "home_selector active"
|
||||
%br
|
||||
|
||||
.section
|
||||
= render 'aspects/aspect_listings'
|
||||
|
||||
.section
|
||||
= render 'tags/followed_tags_listings'
|
||||
|
||||
.span-13.append-1
|
||||
.stream_container
|
||||
%h2
|
||||
= welcome_text
|
||||
%h4
|
||||
%section#hello-there
|
||||
.hero-unit
|
||||
%h1.center
|
||||
= t('.well_hello_there')
|
||||
%p.center
|
||||
= t(".community_welcome")
|
||||
%p
|
||||
= t(".not_mandatory")
|
||||
|
||||
%ul#getting_started
|
||||
%li.profile{:class => ("completed" if has_completed_profile?)}
|
||||
.getting_started_number
|
||||
%h3
|
||||
= @step += 1
|
||||
.content
|
||||
%h3
|
||||
= t(".fill_out_your_profile")
|
||||
#getting_started_profile_photo
|
||||
= person_image_link(current_user.person, :size => :thumb_medium)
|
||||
%p
|
||||
= t(".profile_description")
|
||||
.span-8.fields
|
||||
- [:full_name, :image_url, :birthday, :gender, :bio, :location, :tag_string].each do |attr|
|
||||
.span-4.last
|
||||
= profile_field_tag(current_user.person.profile, attr)
|
||||
.clearfix
|
||||
%br
|
||||
%br
|
||||
|
||||
#edit_profile_button_div
|
||||
= link_to t(".edit_profile"), edit_profile_path, :class => "button", :target => "_blank"
|
||||
.clearfix
|
||||
.row
|
||||
%h2
|
||||
= t(".who_are_you")
|
||||
|
||||
- unless AppConfig[:configured_services].blank?
|
||||
%li.services{:class => ("completed" if has_connected_services?)}
|
||||
.getting_started_number
|
||||
%h3
|
||||
= @step += 1
|
||||
.content
|
||||
%h3
|
||||
= t('.connect_to_your_other_social_networks')
|
||||
|
||||
%p
|
||||
= t('.connect_to_your_other_social_networks_explanation_p1')
|
||||
- if AppConfig[:configured_services].detect{|s| s == "facebook"}
|
||||
= t('.connect_to_your_other_social_networks_explanation_p2')
|
||||
|
||||
#getting_started_service_icons
|
||||
- AppConfig.configured_services.each do |service|
|
||||
- unless current_user.services.any?{|x| x.provider == service}
|
||||
%span.service
|
||||
%span.service_image
|
||||
= link_to(image_tag("social_media_logos/#{service.to_s.downcase}-48x48.png", :title => service.to_s.titleize), "/auth/#{service}")
|
||||
- else
|
||||
%span.service
|
||||
%span.service_image
|
||||
= image_tag( "social_media_logos/#{service.to_s.downcase}-48x48.png", :title => service.to_s.titleize, :class => "dim")
|
||||
%span.checkmark
|
||||
= image_tag( "icons/check_yes_ok.png")
|
||||
|
||||
%li.connect_with_people{:class => ("completed" if has_few_contacts?)}
|
||||
.getting_started_number
|
||||
%h3
|
||||
= @step += 1
|
||||
.content
|
||||
%h3
|
||||
= t('.connect_with_people')
|
||||
|
||||
%p
|
||||
|
||||
= t('.connect_with_people_explanation_pt1', :bold => content_tag(:b, t('.bold'))).html_safe
|
||||
= t('.connect_with_people_explanation_pt2')
|
||||
|
||||
-unless AppConfig[:no_follow_diasporahq]
|
||||
#diaspora_hq_pane
|
||||
- if diasporahq = Person.find_by_diaspora_handle("diasporahq@joindiaspora.com")
|
||||
= person_image_link(diasporahq, :size => :thumb_medium)
|
||||
|
||||
.name
|
||||
= person_link(diasporahq)
|
||||
|
||||
.info
|
||||
= t('.get_updates_from_core')
|
||||
|
||||
.add_to_aspect
|
||||
= render :partial => 'people/relationship_action',
|
||||
:locals => { :person => diasporahq,
|
||||
:contact => current_user.contact_for(diasporahq),
|
||||
:current_user => current_user }
|
||||
|
||||
#featured_users_pane
|
||||
%h4
|
||||
= t('.featured_users')
|
||||
|
||||
%div
|
||||
- Person.featured_users[0..5].each do |person|
|
||||
.featured_user_card_small
|
||||
.right
|
||||
.add_to_aspect
|
||||
= render :partial => 'people/relationship_action',
|
||||
:locals => { :person => person,
|
||||
:contact => current_user.contact_for(person),
|
||||
:current_user => current_user }
|
||||
= person_image_link(person, :target => "_blank")
|
||||
= person_link(person, :class => "hovercardable", :target => "_blank")
|
||||
.tags
|
||||
- person.profile.tags[0..2].each do |tg|
|
||||
= link_to "##{tg}", tag_path(tg.name), :target => "_blank"
|
||||
|
||||
= link_to "#{t('.see_all_featured_users')} ->", featured_users_path, :target => "_blank"
|
||||
|
||||
%br
|
||||
#find_friends_pane
|
||||
%h4
|
||||
= t('.find_friends')
|
||||
.span-5.append-1
|
||||
= form_tag(people_path, :method => 'get', :class => "people search_form") do
|
||||
= text_field_tag 'q', nil, :placeholder => t(".search_for_people"), :type => 'search', :results => 5
|
||||
.span-5.last{:style => "height:30px;"}
|
||||
%h4{:style => "margin-top:7px;"}
|
||||
or
|
||||
= link_to t('.find_friends_from_facebook'), friend_finder_path('facebook'), :target => "_blank"
|
||||
.clearfix
|
||||
%br
|
||||
|
||||
%li.follow_interests{:class => ("completed" if has_few_followed_tags?)}
|
||||
.getting_started_number
|
||||
%h3
|
||||
= @step += 1
|
||||
.content
|
||||
%h3
|
||||
= t('.follow_your_interests')
|
||||
|
||||
%p
|
||||
= t('.hashtag_explanation')
|
||||
|
||||
.span-5.append-1
|
||||
= form_tag(tags_path, :method => 'get', :class => "tag_input search_form") do
|
||||
= text_field_tag 'q', nil, :placeholder => t(".search_for_hashtags"), :type => 'search', :results => 5
|
||||
.span-5.last
|
||||
%h4{:style => "margin-top:7px;"}
|
||||
= t('.featured_tags')
|
||||
%p
|
||||
- ["diaspora", "art", "gif", "french"].each do |tag_name|
|
||||
= tag_link(tag_name)
|
||||
%br
|
||||
.clearfix
|
||||
%br
|
||||
%br
|
||||
|
||||
%li.cubbies{:class => ("completed" if has_connected_cubbies?)}
|
||||
.getting_started_number
|
||||
%h3
|
||||
= @step += 1
|
||||
.content
|
||||
%h3
|
||||
= t(".connect_to")
|
||||
= link_to "Cubbi.es", "http://cubbi.es/", :target => "_blank"
|
||||
%p
|
||||
= t('tokens.show.what_is_cubbies')
|
||||
|
||||
.cubbies_images
|
||||
= image_tag '/images/cubbies_collage.png', :width => 422, :height => 159, :class => "cubbies_collage_small"
|
||||
= image_tag '/images/cubbies_screenshot2.png', :height => 151, :width => 200, :class => "cubbies_user_page_small"
|
||||
|
||||
%li{:style => 'text-align:center;'}
|
||||
.row
|
||||
%p
|
||||
= link_to t('.finished'), getting_started_completed_path, :class => "button"
|
||||
= t('.we_can_speed_things_up')
|
||||
= link_to t('.hooking_up_fb'), "auth/facebook?callback_url=#{getting_started_url}"
|
||||
= t('.what_facebook_does')
|
||||
|
||||
.row
|
||||
.span6
|
||||
= form_tag profile_path, :method => :put, :remote => true, :id => 'edit_profile' do
|
||||
%fieldset
|
||||
.clearfix
|
||||
= label_tag 'profile[first_name]', "Your name", :class => "bootstrapped"
|
||||
.input
|
||||
= text_field_tag 'profile[first_name]', current_user.person.profile.first_name
|
||||
= image_tag 'ajax-loader.gif', :id => "form_spinner", :class => "hidden"
|
||||
|
||||
%span.saved{:class => "hidden"}
|
||||
= image_tag 'icons/check_yes_ok.png'
|
||||
= t(".saved")
|
||||
|
||||
.clearfix
|
||||
= label_tag :your_photo, "Your photo", :class => "bootstrapped"
|
||||
.input{:style => "position:relative;"}
|
||||
= render 'photos/new_profile_photo', :aspect => :getting_started, :person => current_user.person
|
||||
%br
|
||||
%br
|
||||
|
||||
.clearfix
|
||||
.row
|
||||
%h2
|
||||
= t('.what_are_you_in_to')
|
||||
|
||||
.row
|
||||
%p
|
||||
= t('.hashtag_explanation')
|
||||
%i
|
||||
= t('.hashtag_suggestions')
|
||||
|
||||
.row
|
||||
.span13
|
||||
= form_tag(multiple_tag_followings_path, :method => 'post', :class => "tag_input search_form") do
|
||||
%fieldset
|
||||
.clearfix
|
||||
= label_tag 'follow_tags', "Follow tags", :class => "bootstrapped"
|
||||
.input
|
||||
= text_field_tag 'follow_tags', nil, :class => "nostrap"
|
||||
|
||||
.clearfix
|
||||
%br
|
||||
%br
|
||||
%br
|
||||
.input
|
||||
= link_to "#{t('.awesome_take_me_to_diaspora')} »", "#", :id => "awesome_button", :class => "btn primary"
|
||||
|
||||
= image_tag 'ajax-loader.gif', :id => "awesome_spinner", :class => "hidden"
|
||||
|
||||
/.span-5.rightBar.last
|
||||
/ = render 'selected_contacts', :people => @selected_people.sample(20), :count => @contact_count
|
||||
/ = render 'shared/right_sections'
|
||||
|
|
|
|||
|
|
@ -2,36 +2,31 @@
|
|||
-# licensed under the Affero General Public License version 3 or later. See
|
||||
-# the COPYRIGHT file.
|
||||
|
||||
- content_for :head do
|
||||
:css
|
||||
body {
|
||||
margin-top: 220px;
|
||||
}
|
||||
|
||||
|
||||
#grey_header
|
||||
.container{:style => 'text-align:center;'}
|
||||
%h2
|
||||
.row
|
||||
%h3
|
||||
= t('.signed_out')
|
||||
|
||||
%h1
|
||||
= t('.go_mobile')
|
||||
|
||||
.container{:style => 'text-align:center;'}
|
||||
%br
|
||||
%br
|
||||
%br
|
||||
%br
|
||||
%br
|
||||
%br
|
||||
%br
|
||||
%br
|
||||
%br
|
||||
.row.mobile_row
|
||||
= image_tag 'diaspora_mobile_screens.png', :width => 480, :height => 300
|
||||
|
||||
= image_tag 'mobile.jpg', :width => 150, :height => 294
|
||||
.row
|
||||
%h4
|
||||
= t('.simply_visit')
|
||||
%strong
|
||||
= link_to AppConfig[:pod_url], root_url
|
||||
= t('.on_your_mobile_device')
|
||||
|
||||
%br
|
||||
%br
|
||||
%br
|
||||
|
||||
%h4
|
||||
= t('.simply_visit')
|
||||
%strong
|
||||
= link_to AppConfig[:pod_url], root_url
|
||||
= t('.on_your_mobile_device')
|
||||
|
||||
%p.dull
|
||||
= t('.works_on_modern')
|
||||
%p.dull
|
||||
= t('.works_on_modern')
|
||||
|
|
|
|||
|
|
@ -60,10 +60,12 @@ defaults: &defaults
|
|||
# to contact joindiaspora.com, set this to true:
|
||||
no_follow_diasporahq: false
|
||||
|
||||
# Featured users
|
||||
# Community Spotlight
|
||||
# (expressed as an array of Diaspora IDs)
|
||||
featured_users:
|
||||
community_spotlight:
|
||||
- 'diasporahq@joindiaspora.com'
|
||||
# Email to send spotlight suggestions to
|
||||
spotlight_suggest_email: ''
|
||||
|
||||
# List of users who have admin privileges
|
||||
# (expressed as an array of local usernames)
|
||||
|
|
|
|||
|
|
@ -10,8 +10,8 @@ javascripts:
|
|||
jquery:
|
||||
- public/javascripts/vendor/jquery162.min.js
|
||||
main:
|
||||
- public/javascripts/rails.validations.js
|
||||
- public/javascripts/rails.js
|
||||
- public/javascripts/vendor/jquery.tipsy.js
|
||||
- public/javascripts/vendor/jquery.hotkeys.js
|
||||
- public/javascripts/vendor/jquery.autoresize.min.js
|
||||
- public/javascripts/vendor/jquery-ui-1.8.9.custom.min.js
|
||||
|
|
@ -39,6 +39,10 @@ javascripts:
|
|||
- public/javascripts/contact-edit.js
|
||||
- public/javascripts/contact-list.js
|
||||
- public/javascripts/aspect-sorting.js
|
||||
|
||||
- public/javascripts/vendor/bootstrap/bootstrap-twipsy.js
|
||||
- public/javascripts/vendor/bootstrap/bootstrap-popover.js
|
||||
|
||||
login:
|
||||
- public/javascripts/login.js
|
||||
mobile:
|
||||
|
|
@ -78,8 +82,8 @@ stylesheets:
|
|||
- public/stylesheets/hovercard.css
|
||||
- public/stylesheets/vendor/facebox.css
|
||||
- public/stylesheets/vendor/fileuploader.css
|
||||
- public/stylesheets/vendor/tipsy.css
|
||||
- public/stylesheets/vendor/autoSuggest.css
|
||||
- public/stylesheets/interim-bootstrap.css
|
||||
rtl:
|
||||
- public/stylesheets/rtl.css
|
||||
|
||||
|
|
|
|||
|
|
@ -2,6 +2,9 @@
|
|||
# licensed under the Affero General Public License version 3 or later. See
|
||||
# the COPYRIGHT file.
|
||||
|
||||
#Excon needs to see the CA Cert Bundle file
|
||||
ENV["SSL_CERT_FILE"] = AppConfig[:ca_file]
|
||||
|
||||
CarrierWave.configure do |config|
|
||||
if AppConfig[:s3_key] && AppConfig[:s3_secret] && AppConfig[:s3_bucket] && AppConfig[:s3_region]
|
||||
config.storage = :s3
|
||||
|
|
|
|||
14
config/initializers/client_side_validations.rb
Normal file
14
config/initializers/client_side_validations.rb
Normal file
|
|
@ -0,0 +1,14 @@
|
|||
# ClientSideValidations Initializer
|
||||
|
||||
#require 'client_side_validations/simple_form' if defined?(::SimpleForm)
|
||||
#require 'client_side_validations/formtastic' if defined?(::Formtastic)
|
||||
|
||||
# Uncomment the following block if you want each input field to have the validation messages attached.
|
||||
ActionView::Base.field_error_proc = Proc.new do |html_tag, instance|
|
||||
unless html_tag =~ /^<label/
|
||||
%{<div class="field_with_errors">#{html_tag}<label for="#{instance.send(:tag_id)}" class="message">#{instance.error_message.first}</label></div>}.html_safe
|
||||
else
|
||||
%{<div class="field_with_errors">#{html_tag}</div>}.html_safe
|
||||
end
|
||||
end
|
||||
|
||||
|
|
@ -1,8 +1,13 @@
|
|||
#this breaks seed scripts
|
||||
|
||||
unless !ActiveRecord::Base.connection.table_exists?('people') || Rails.env == 'test' || AppConfig[:featured_users].nil? || AppConfig[:featured_users].count == Person.featured_users.count
|
||||
print "Fetching featured users from remote servers"
|
||||
AppConfig[:featured_users].each do |x|
|
||||
if AppConfig[:featured_users].present? && AppConfig[:community_spotlight].blank?
|
||||
AppConfig[:community_spotlight] = AppConfig[:featured_users]
|
||||
puts "DEPRICATION WARNING (10/21/11): Please change `featured_users` in your applicaiton.yml to `community_spotlight`. Thanks!"
|
||||
end
|
||||
|
||||
unless !ActiveRecord::Base.connection.table_exists?('people') || Rails.env == 'test' || AppConfig[:community_spotlight].nil? || AppConfig[:community_spotlight].count == Person.community_spotlight.count
|
||||
print "Fetching community spotlight users from remote servers"
|
||||
AppConfig[:community_spotlight].each do |x|
|
||||
Webfinger.new(x).fetch
|
||||
print "."
|
||||
end
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
require 'resque'
|
||||
|
||||
Resque::Plugins::Timeout.timeout = 120
|
||||
Resque::Plugins::Timeout.timeout = 300
|
||||
|
||||
if !AppConfig.single_process_mode?
|
||||
if redis_to_go = ENV["REDISTOGO_URL"]
|
||||
|
|
|
|||
|
|
@ -84,10 +84,10 @@ ca:
|
|||
accept: "Accepta la invitació"
|
||||
ignore: "Si no voleu acceptar la invitació, ignoreu aquest correu electrònic."
|
||||
no_account_till: "No es crearà el vostre compte fins que no accediu l'enllaç anterior i us registreu."
|
||||
inviters:
|
||||
has_invited_you: "%{name} us ha convidat a unir-vos a Diàspora"
|
||||
inviter:
|
||||
has_invited_you: "%{name}"
|
||||
have_invited_you: "%{names} us han convidat a unir-vos a Diàspora"
|
||||
accept_at: ", a %{url}, podeu acceptar-ho mitjançant l'enllaç següent."
|
||||
accept_at: "a %{url}, podeu acceptar-ho mitjançant l'enllaç següent."
|
||||
shared:
|
||||
mail_signup_form:
|
||||
sign_up_for_an_invite: "Registreu-vos per a rebre una invitació!"
|
||||
|
|
|
|||
|
|
@ -55,7 +55,7 @@ da:
|
|||
new:
|
||||
forgot_password: "Glemt din adgangskode?"
|
||||
no_account: "Ingen konto med den email adresse eksisterer. Hvis du venter på invitation, så åbner vi så snart som muligt"
|
||||
send_password_instructions: "Send mig instruktioner til nulstilning af kodeord"
|
||||
send_password_instructions: "Send mig instruktioner til nulstilning af adgangskode"
|
||||
send_instructions: "Du vil modtage en e-mail med instruktioner om hvordan du kan nulstille din adgangskode om et par minutter."
|
||||
updated: "Dit adgangskode er nu ændret. Du er nu logget ind."
|
||||
registrations:
|
||||
|
|
|
|||
|
|
@ -34,9 +34,9 @@ es-AR:
|
|||
no_account_till: "Tu cuenta no será creada hasta que accedas al anterior enlace y te registres."
|
||||
subject: "¡Te invitaron a unirte a Diáspora*!"
|
||||
inviter:
|
||||
accept_at: "at %{url}, you can accept it through the link below."
|
||||
has_invited_you: "%{name}"
|
||||
have_invited_you: "%{names} have invited you to join Diaspora"
|
||||
accept_at: "en %{url}, podes aceptarlo desde el link de abajo "
|
||||
has_invited_you: "%{name} te ha invitado a unirte a Diaspora"
|
||||
have_invited_you: "%{names} te han invitado a unirte a Diaspora"
|
||||
reset_password_instructions:
|
||||
change: "Cambiar mi contraseña"
|
||||
ignore: "Si vos no hiciste la solicitud, por favor ignorá este correo."
|
||||
|
|
|
|||
|
|
@ -34,7 +34,7 @@ es:
|
|||
no_account_till: "Tu cuenta no será creada hasta que no accedas al enlace de arriba para registrarte."
|
||||
subject: "¡Has sido invitado a unirte a Diaspora*!"
|
||||
inviter:
|
||||
accept_at: "en %{url}, puedes aceptar en el siguiente enlace."
|
||||
accept_at: "en %{url}, puedes aceptar en el enlace más abajo."
|
||||
has_invited_you: "%{name}"
|
||||
have_invited_you: "%{names} te ha invitado a unirte a Diaspora*"
|
||||
reset_password_instructions:
|
||||
|
|
@ -59,7 +59,7 @@ es:
|
|||
send_instructions: "Recibirás un correo con instrucciones para cambiar tu contraseña en pocos minutos."
|
||||
updated: "Tu contraseña ha sido modificada. Ya has accedido a tu cuenta."
|
||||
registrations:
|
||||
destroyed: "!Adiós! Tu cuenta ha sido cancelada. Esperamos volver a verte pronto."
|
||||
destroyed: "¡Adiós! Tu cuenta ha sido cancelada. Esperamos volver a verte pronto."
|
||||
signed_up: "Te has registrado correctamente. Consulta el mensaje de confirmación que te hemos enviado a tu correo."
|
||||
updated: "Has actualizado tu cuenta correctamente."
|
||||
sessions:
|
||||
|
|
@ -67,7 +67,7 @@ es:
|
|||
alpha_software: "Estás a punto de utilizar software en versión alpha."
|
||||
bugs_and_feedback: "Ten en cuenta que puedes sufrir errores. ¡Te animamos a que utilices el botón de Feedback situado a la derecha de tu navegador para informar cualquier fallo! Trabajaremos tan rápido como nos sea posible para resolver cualquier problema que nos remitas."
|
||||
bugs_and_feedback_mobile: "Ten en cuenta que puedes sufrir errores. ¡Te animamos a informar de cualquier fallo! Trabajaremos tan rápido como nos sea posible para resolver cualquier problema que nos remitas."
|
||||
login: "Iniciar sesión"
|
||||
login: "Acceder"
|
||||
modern_browsers: "Sólo es compatible con navegadores modernos."
|
||||
password: "Contraseña"
|
||||
remember_me: "Recordarme"
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue