jam-cloud/admin/app/admin/feeds.rb

221 lines
8.4 KiB
Ruby

ActiveAdmin.register_page 'Feed' do
content do
# get user information via params
user_id = nil
user_id = params[:feed][:user_id] if params[:feed] && params[:feed][:user_id] != ''
user_name = 'All'
user_name = User.find(user_id).to_label if user_id
render :partial => 'form', locals: {user_name: user_name, user_id: user_id }
page = (params[:page] ||= 1).to_i
per_page = 10
offset = (page - 1) * per_page
# get feed ids
where_sql = ''
where_sql = "where user_id = '#{user_id}'" if user_id
sql_feed_ids = "SELECT id, 'music_sessions' as type, created_at FROM music_sessions #{where_sql}
UNION ALL
SELECT DISTINCT recording_id as id, 'recordings' as type, created_at FROM recorded_tracks #{where_sql}
UNION ALL
SELECT id, 'diagnostics' as type, created_at FROM diagnostics #{where_sql}
ORDER BY created_at DESC
OFFSET #{offset}
LIMIT #{per_page};"
sql_feed_count = "SELECT COUNT(*) FROM (
SELECT id, 'music_sessions' as type, created_at FROM music_sessions #{where_sql}
UNION ALL
SELECT DISTINCT recording_id as id, 'recordings' as type, created_at FROM recorded_tracks #{where_sql}
UNION ALL
SELECT id, 'diagnostics' as type, created_at FROM diagnostics #{where_sql}
ORDER BY created_at DESC
) AS IDS;"
feed_count = ActiveRecord::Base.connection.execute(sql_feed_count).values[0][0].to_i
id_types = ActiveRecord::Base.connection.execute(sql_feed_ids).values
@feed_pages = WillPaginate::Collection.create(page, per_page) do |pager|
pager.total_entries = feed_count
pager.replace(id_types)
end
div class: 'feed-pagination' do
will_paginate @feed_pages
end
recordings = []
sessions = []
diagnostics = []
id_types.each do |id_and_type|
if id_and_type[1] == "music_sessions"
sessions << JamRuby::MusicSession.find(id_and_type[0])
elsif id_and_type[1] == "recordings"
recordings << JamRuby::Recording.find(id_and_type[0])
elsif id_and_type[1] == "diagnostics"
diagnostics << JamRuby::Diagnostic.find(id_and_type[0])
else
raise "Unknown type returned from feed ids"
end
end
columns do
column do
panel "Music Sessions - #{user_name}" do
if sessions.count > 0
table_for(sessions) do
column :creator do |msh|
link_to msh.creator.to_label, admin_feed_path({feed: {user_id: msh.creator.id}})
end
column :created_at do |msh| msh.created_at.strftime('%b %d %Y, %H:%M') end
column :duration do |msh| "#{msh.duration_minutes.round(2)} minutes" end
column :members do |msh|
uu = msh.unique_users
if uu.length > 0
uu.each do |u|
span link_to u.to_label + ', ', admin_feed_path({feed: {user_id: u.id}})
end
else
span para 'No members'
end
end
column :band do |msh| auto_link(msh.band, msh.band.try(:name)) end
column :fan_access do |msh| msh.fan_access end
column :plays do |msh| msh.plays.count end
column :likes do |msh| msh.likes.count end
column :comments do |msh|
if msh.comment_count > 0
text_node "(#{msh.comment_count}) "
msh.comments.each do |comment|
text_node comment.user.to_label + ', '
end
else
span para 'No comments'
end
end
end
else
span class: 'text-center' do
para 'No session activities.'
end
end
end
panel "Recordings - #{user_name}" do
if recordings.count > 0
table_for(recordings) do
column :starter do |rec|
link_to rec.owner.to_label, admin_feed_path({feed: {user_id: rec.owner.id}})
end
column :mixes do |rec|
ul do
mixes = rec.mixes
if mixes.count > 0
mixes.each do |mix|
li do
text_node "Created At: #{mix.created_at.strftime('%b %d %Y, %H:%M')}, "
text_node "Started At: #{mix.started_at ? mix.started_at.strftime('%b %d %Y, %H:%M') : ''}, "
text_node "Completed At: #{mix.completed_at ? mix.completed_at.strftime('%b %d %Y, %H:%M') : ''}, "
text_node "Error Count: #{mix.error_count}, "
text_node "Error Reason: #{mix.error_reason}, "
text_node "Error Detail: #{mix.error_detail}, "
text_node "Download Count: #{mix.download_count}, "
if !mix.nil? && !mix[:ogg_url].nil?
span link_to 'Download OGG', mix.sign_url(3600, 'ogg')
else
text_node 'OGG download not available'
end
if !mix.nil? && !mix[:mp3_url].nil?
span link_to 'Download MP3', mix.sign_url(3600, 'mp3')
else
text_node 'MP3 download not available'
end
end
end
else
span para 'No mixes'
end
end
end
column :recorded_tracks do |rec|
ul do
rts = rec.recorded_tracks
if rts.count > 0
rts.each do |gt|
li do
span link_to gt.musician.to_label, admin_feed_path({feed: {user_id: gt.musician.id}})
span ", #{gt.instrument_id}, "
span "Download Count: #{gt.download_count}, "
span "Fully uploaded: #{gt.fully_uploaded}, "
span "Upload failures: #{gt.upload_failures}, "
span "Part failures: #{gt.part_failures}, "
if gt[:url]
# span link_to 'Download', gt.sign_url(3600)
else
span 'No track available'
end
end
end
else
span para 'No recorded tracks'
end
end
end
column :claimed_recordings do |rec|
ul do
crs = rec.claimed_recordings
if crs.count > 0
crs.each do |cr|
li do
span cr.name
span link_to cr.user.to_label, admin_feed_path({feed: {user_id: cr.user.id}})
span ", Public: #{cr.is_public}"
end
end
else
span para 'No claimed recordings'
end
end
end
end
else
span class: 'text-center' do
para 'No recording activities.'
end
end
end
panel "Diagnostics - #{user_name}" do
if diagnostics.count > 0 then
table_for(diagnostics) do
column :user do |d|
span link_to d.user.to_label, admin_feed_path({feed: {user_id: d.user.id}})
end
column :created_at do |d| d.created_at.strftime('%b %d %Y, %H:%M') end
column :type
column :creator
column :data do |d|
span style: "white-space: pre;" do
begin
JSON.pretty_generate(JSON.parse(d.data))
rescue
d.data
end
end
end
end
else
span class: 'text-center' do
para 'No diagnostic activities.'
end
end
end
end
end
div class: 'feed-pagination' do
will_paginate @feed_pages
end
end
end