Skip to content

Commit

Permalink
[webui] move things from Webui::Person to User model
Browse files Browse the repository at this point in the history
  • Loading branch information
coolo committed Oct 18, 2013
1 parent b734bb9 commit d456006
Show file tree
Hide file tree
Showing 19 changed files with 166 additions and 188 deletions.
2 changes: 1 addition & 1 deletion src/api/app/models/project.rb
Expand Up @@ -40,7 +40,7 @@ class ForbiddenError < APIException
has_many :attribs, :dependent => :destroy, foreign_key: :db_project_id
has_many :repositories, :dependent => :destroy, foreign_key: :db_project_id
has_many :messages, :as => :db_object, :dependent => :delete_all
has_many :watched_projects, :dependent => :destroy
has_many :watched_projects, :dependent => :destroy, inverse_of: :project

has_many :linkedprojects, -> { order(:position) }, :class_name => 'LinkedProject', foreign_key: :db_project_id

Expand Down
37 changes: 36 additions & 1 deletion src/api/app/models/user.rb
Expand Up @@ -26,7 +26,7 @@ class User < ActiveRecord::Base
has_many :taggings, :dependent => :destroy
has_many :tags, :through => :taggings

has_many :watched_projects, :foreign_key => 'bs_user_id', :dependent => :destroy
has_many :watched_projects, :foreign_key => 'bs_user_id', :dependent => :destroy, inverse_of: :user
has_many :groups_users, :foreign_key => 'user_id'
has_many :roles_users, :foreign_key => 'user_id'
has_many :relationships
Expand Down Expand Up @@ -377,6 +377,11 @@ def realname_for_login(login)
end
end

after_save :cleanup_cache
def cleanup_cache
Rails.cache.delete('meta_user_%d' % id)
end

def to_axml
Rails.cache.fetch('meta_user_%d' % id) do
render_axml
Expand Down Expand Up @@ -773,6 +778,36 @@ def request_ids_by_class
result
end


def self.fetch_field(person, field)
p = User.where(login: person).pluck(field)
p[0] || ''
end

def self.email_for_login(person)
fetch_field(person, :email)
end

def self.realname_for_login(person)
fetch_field(person, :realname)
end

def watched_project_names
Project.where(id: watched_projects.pluck(:project_id)).pluck(:name)
end

def add_watched_project(name)
watched_projects.create(project: Project.find_by_name!(name))
end

def remove_watched_project(name)
watched_projects.joins(:project).where(projects: { name: name }).delete_all
end

def watches?(name)
watched_projects.joins(:project).where(projects: { name: name }).exists?
end

protected
# This method allows to execute a block while deactivating timestamp
# updating.
Expand Down
5 changes: 3 additions & 2 deletions src/api/app/models/watched_project.rb
@@ -1,6 +1,7 @@
# TODO: why not use habtm?
class WatchedProject < ActiveRecord::Base
belongs_to :user, foreign_key: 'bs_user_id'
belongs_to :project
belongs_to :user, foreign_key: 'bs_user_id', inverse_of: :watched_projects
belongs_to :project, inverse_of: :watched_projects

validates :project_id, presence: true
validates :bs_user_id, presence: true
Expand Down
3 changes: 2 additions & 1 deletion src/api/config/environments/development.rb
Expand Up @@ -27,7 +27,8 @@
config.assets.compress = false

# Expands the lines which load the assets
config.assets.debug = true
config.assets.logger = false
config.assets.debug = false

# Enable debug logging by default
config.log_level = :debug
Expand Down
3 changes: 3 additions & 0 deletions src/api/config/environments/test.rb
Expand Up @@ -25,6 +25,9 @@
config.active_support.deprecation = :log

config.eager_load = true

# Expands the lines which load the assets
config.assets.debug = false
end

CONFIG['source_host'] = "localhost"
Expand Down
20 changes: 10 additions & 10 deletions src/api/webui/app/controllers/webui/home_controller.rb
Expand Up @@ -21,7 +21,7 @@ def index
end
@ipackages = @displayed_user.involved_packages.each.map {|x| [x.name, x.project]}
begin
@owned = ReverseOwner.find_cached(:user => @displayed_user.login).each.map {|x| [x.package, x.project]}
@owned = ReverseOwner.find(:user => @displayed_user.login).each.map {|x| [x.package, x.project]}
# :limit => "#{@owner_limit}", :devel => "#{@owner_devel}"
rescue ActiveXML::Transport::Error
# OBSRootOwner isn't set...
Expand All @@ -41,21 +41,21 @@ def icon
content = Rails.cache.fetch(key, :expires_in => 5.hours) do

if ::Configuration.use_gravatar?
email = Person.email_for_login(user)
email = User.email_for_login(user)
hash = Digest::MD5.hexdigest(email.downcase)
begin
content = ActiveXML.api.load_external_url("http://www.gravatar.com/avatar/#{hash}?s=#{size}&d=wavatar")
content.force_encoding("ASCII-8BIT")
rescue ActiveXML::Transport::Error
end
end

unless content
#TODO/FIXME: Looks like an asset...
f = File.open("#{Rails.root}/app/assets/images/default_face.png", "r")
content = f.read
f.close
end
content.force_encoding("ASCII-8BIT")
content || 'none'
end

if content == 'none'
redirect_to ActionController::Base.helpers.asset_path("default_face.png")
return
end

expires_in 5.hours, public: true
Expand Down Expand Up @@ -128,7 +128,7 @@ def remove_watched_project

def overwrite_user
@displayed_user = @user
user = find_cached(Person, params['user'] ) if params['user'] && !params['user'].empty?
user = Person.find(params['user'] ) if params['user'].present?
@displayed_user = user if user
unless @displayed_user
flash[:error] = "Please log in"
Expand Down
2 changes: 1 addition & 1 deletion src/api/webui/app/controllers/webui/main_controller.rb
Expand Up @@ -115,7 +115,7 @@ def add_news
redirect_to(:action => 'index') and return
end
#TODO - make use of permissions.status_message_create
StatusMessage.create!(message: params[:message], severity: params[:severity], user: @user.api_user)
StatusMessage.create!(message: params[:message], severity: params[:severity], user: User.current)
redirect_to(:action => 'index')
end

Expand Down
7 changes: 3 additions & 4 deletions src/api/webui/app/controllers/webui/project_controller.rb
Expand Up @@ -1098,14 +1098,13 @@ def package_buildresult
end

def toggle_watch
if @user.watches? @project.name
if User.current.watches? @project.name
logger.debug "Remove #{@project} from watchlist for #{@user}"
@user.remove_watched_project @project.name
User.current.remove_watched_project @project.name
else
logger.debug "Add #{@project} to watchlist for #{@user}"
@user.add_watched_project @project.name
User.current.add_watched_project @project.name
end
@user.save

if request.env['HTTP_REFERER']
redirect_to :back
Expand Down
22 changes: 13 additions & 9 deletions src/api/webui/app/controllers/webui/user_controller.rb
Expand Up @@ -25,29 +25,33 @@ def logout

def login
@return_to_path = params['return_to_path'] || root_path
User.current ||= User.find_by_login('_nobody_')
end

def do_login
@return_to_path = params['return_to_path'] || root_path
if !params[:username].blank? and params[:password]
if params[:username].present? and params[:password]
logger.debug "Doing form authorization to login user #{params[:username]}"
session[:login] = params[:username]
session[:password] = params[:password]
authenticate_form_auth

# TODO: remove again and use
User.current = User.where( login: session[:login] ).first
begin
p = Person.find( session[:login] )
rescue ActiveXML::Transport::UnauthorizedError => exception
logger.info "Login to #{@return_to_path} failed for #{session[:login]}: #{exception}"
reset_session
flash.now[:error] = 'Authentication failed'
render :template => 'webui/user/login', :locals => {:return_to_path => @return_to_path} and return
ActiveXML.api.direct_http '/'
rescue ActiveXML::Transport::UnauthorizedError
User.current = nil
end
unless p
unless User.current
reset_session
flash.now[:error] = 'Authentication failed'
render :template => 'webui/user/login', :locals => {:return_to_path => @return_to_path} and return
User.current = User.find_by_login('_nobody_')
render :template => 'webui/user/login', :locals => {:return_to_path => @return_to_path}
return
end
flash[:success] = 'You are logged in now'
session[:login] = User.current.login
redirect_to params[:return_to_path] and return
end
flash[:error] = 'Authentication failed'
Expand Down
11 changes: 5 additions & 6 deletions src/api/webui/app/controllers/webui/webui_controller.rb
Expand Up @@ -107,6 +107,7 @@ def authenticate
end

def authenticate_proxy
Rails.logger.debug "PROXY!!!"
mode = :off
mode = CONFIG['proxy_auth_host'] unless CONFIG['proxy_auth_host'].blank?
proxy_user = request.env['HTTP_X_USERNAME']
Expand Down Expand Up @@ -241,12 +242,7 @@ def lockout_spiders

def check_user
check_spiders
return unless session[:login]
if discard_cache?
Rails.cache.delete("person_#{session[:login]}")
Person.free_cache(session[:login])
end
@user ||= Person.find_cached(session[:login], :is_current => true)
@user ||= Person.find(session[:login]) if session[:login]
if @user
User.current = User.find_by_login session[:login]
Rails.cache.set_domain(@user.to_s) if Rails.cache.respond_to?('set_domain')
Expand All @@ -258,6 +254,9 @@ def check_user
rescue Timeout::Error
# TODO: add all temporary errors here, but no catch all
end
else
# TODO: rebase on application_controller and use load_nobdy
User.current = User.find_by_login('_nobody_')
end
end

Expand Down
11 changes: 0 additions & 11 deletions src/api/webui/app/helpers/webui/webui_helper.rb
Expand Up @@ -11,17 +11,6 @@ def logged_in?
!session[:login].nil?
end

def current_user
if logged_in?
begin
@user ||= Person.find_cached( session[:login] )
rescue RuntimeError
logger.error "Cannot load person data for #{session[:login]} in application_helper"
end
end
return @user
end

def repo_url(project, repo='' )
if @configuration['download_url']
"#{@configuration['download_url']}/" + project.to_s.gsub(/:/,':/') + "/#{repo}"
Expand Down
52 changes: 0 additions & 52 deletions src/api/webui/app/models/webui/person.rb
Expand Up @@ -32,28 +32,6 @@ def make_stub( opt )
end
end

def self.find_cached(login, opts = {})
if opts.has_key?(:is_current)
# skip memcache
Person.free_cache(login, opts)
end
super
end

# temporary aid
def self.from_user(user)
Person.new(user.render_axml)
end

def api_user
User.find_by_login(login)
end

def self.email_for_login(person)
p = Person.find_hashed(person)
return p["email"] || ''
end

def initialize(data)
super(data)
@login = self.to_hash["login"]
Expand Down Expand Up @@ -89,36 +67,6 @@ def to_s
login
end

def add_watched_project(name)
return nil unless name
add_element('watchlist') unless has_element?(:watchlist)
watchlist.add_element('project', :name => name)
logger.debug "user '#{login}' is now watching project '#{name}'"
Rails.cache.delete("person_#{login}_watchlist")
end

def remove_watched_project(name)
return nil unless name
return nil unless watches? name
watchlist.delete_element "project[@name='#{name}']"
logger.debug "user '#{login}' removes project '#{name}' from watchlist"
Rails.cache.delete("person_#{login}_watchlist")
end

def watched_projects
return @watched_projects if @watched_projects
watchlist = to_hash["watchlist"]
if watchlist
return @watched_projects = watchlist.elements("project").map {|p| p["name"]}.sort {|a,b| a.downcase <=> b.downcase}
else
return @watched_projects = []
end
end

def watches?(name)
return watched_projects.include? name
end

def free_cache
Rails.cache.delete("person_#{login}")
Rails.cache.delete("person_#{login}_watchlist")
Expand Down
30 changes: 15 additions & 15 deletions src/api/webui/app/views/layouts/webui/_header.html.erb
@@ -1,21 +1,21 @@
<!-- Start: Header -->
<div id="header">
<!-- Start: Header -->
<div id="header">

<div id="header-content" class="container_12">
<div id="header-content" class="container_12">

<%= link_to image_tag( "obs-logo_small.png", :height => 26 ) , { :controller => 'main',
:action => :index }, { :id => "header-logo"} -%>
<%= link_to image_tag("obs-logo_small.png", :height => 26), { :controller => 'main',
:action => :index }, { :id => "header-logo" } -%>

<ul id="global-navigation">
<li></li>
<% if current_user -%>
<li id="item-favorites" style="float: right;"><a href="#">Watchlist</a></li>
<% end -%>
</ul>
<ul id="global-navigation">
<li></li>
<% unless User.current.is_nobody? -%>
<li id="item-favorites" style="float: right;"><a href="#">Watchlist</a></li>
<% end -%>
</ul>

<%= render :partial => "layouts/webui/watch_and_search" %>
<%= render :partial => "layouts/webui/watch_and_search" %>

</div>
</div>
<!-- End: Header -->
</div>
</div>
<!-- End: Header -->

@@ -1,10 +1,10 @@
<div class="grid_6 omega" style="text-align: right;">
<% if @user %>
<%= link_to @user, :controller => 'home', :action => :index %>
<div class="grid_6 omega" style="text-align: right">
<% unless User.current.is_nobody? %>
<%= link_to User.current, :controller => 'home', :action => :index %>
<% if @nr_requests_that_need_work and @nr_requests_that_need_work > 0 %> |
<%= link_to "You have "+ pluralize(@nr_requests_that_need_work, 'task'), {:controller => 'home', :action => 'index'}, {:title => "where an action is requested from you"} %>
<% end %> |
<%= link_to "Home Project", :controller => 'project', :action => :show, :project => "home:#{@user}" %> |
<%= link_to "Home Project", :controller => 'project', :action => :show, :project => "home:#{User.current}" %> |
<%= link_to "Logout", { :controller => 'user', :action => 'logout' }, :method => :post, id: 'logout-link' %>
<% else %>
<% if CONFIG['proxy_auth_mode'] == :on %>
Expand Down

0 comments on commit d456006

Please sign in to comment.