2012/08/11

録画リストビューにクエリー機能をつけてみた

チケットリストにビデオサムネイルが付く感じ?

前記事で録画チケットから視聴するためのリストビューをredmineプラグインで作ったけどオリンピックとかひたすら録画したら結構な数になった。そろそろ録画ビデオの検索機能が欲しくなった。
ということで、チケットをクエリ検索するのと同じ感覚の録画リストを作ってみた。

プロジェクトメニュー
今までのControllerやViewはそのままに、今回作ったプラグインビューはプロジェクトメニューで表示されるようにした。いろんなアプローチ方法があるって言うのが便利かなと思って。

init.rb
 # Project Menu
  menu :project_menu, :videos_show, { :controller => 'video', :action => 'show' },
  :caption => "Videos", :param => :project_id, :after => :overview
  permission :videos_show, {:video => :show}, :public => true

  Redmine::MenuManager.map :project_menu do |menu|
    menu.delete :activity
  end
こんな感じで、init.rbにプロジェクトメニューで、videoコントローラの'show'アクションが表示されるように。
そしてパーミッションは特に指定する必要がないんでパブリックです。
ついでに、活動(activity)メニューが邪魔なので消しました。
そこにVideosメニューが代わりに入る感じ。

活動メニューは仕事では結構便利だけど、この録画システムではすごい数のチケットが毎日登録されていて、その情報が表示されるとすごい時間がかかる。間違って押してしまうと暫く動かない。目的にそぐわないんで消してしまった。

改良版コントローラ
app/controllers/video_controller.rb
# -*- coding: utf-8 -*-                                                                                                           
class VideoController < ApplicationController
  menu_item :videos_show, :only => [:show]
  menu_item :videos_index, :only => [:index]
  menu_item :videos_view, :only => [:list]
  unloadable

  helper :queries
  include QueriesHelper
  helper :repositories
  include RepositoriesHelper
  helper :sort
  include SortHelper
  include IssuesHelper

  def index
    @issues = get_video_issues
  end

  def list
    # @issues = get_video_issues                                                                                                  
    @issue_pages, @issues = get_video_issues_paginate
  end

  def play
    @issue = Issue.find(params[:id])
  end

  def podcast
    @issues = get_public_issues
    render :layout => false, :content_type => 'text/xml'
  end

  def get_public_issues
    Issue.find(:all, :conditions => {:tracker_id => 3, :status_id => 6}, :order => "start_date DESC")
  end

  def get_video_issues
    Issue.find(:all, :conditions => {:tracker_id => 3, :status_id => 4}, :order => "start_date DESC")
  end

  def get_video_issues_paginate
    paginate(:issue, :per_page => 5,
             :conditions => {:tracker_id => 3, :status_id => 4}, :order => "start_date DESC")
  end

  def show
    @project = Project.find(params[:project_id])
    retrieve_query
    sort_init(@query.sort_criteria.empty? ? [['id', 'desc']] : @query.sort_criteria)
    sort_update(@query.sortable_columns)

    if @query.valid?
      @limit = per_page_option
      @issue_count = @query.issue_count
      @issue_pages = Paginator.new self, @issue_count, @limit, params['page']
      @offset ||= @issue_pages.current.offset
      @issues = @query.issues(:include => [:assigned_to, :tracker, :priority, :category, :fixed_version],
                              :order => sort_clause,
                              :offset => @offset,
                              :limit => @limit)
      @issue_count_by_group = @query.issue_count_by_group
    end

    #render :template => 'issues/index', :layout => !request.xhr?                                                                 
  end
end

前記事から書き加えたのは以下のような感じ。
  menu_item :videos_show, :only => [:show]
  menu_item :videos_index, :only => [:index]
  menu_item :videos_view, :only => [:list]
このmenu_item云々を付けておかないとメニュー押したときに選択状態にならないんだね。あとは、
  helper :queries
  include QueriesHelper
  helper :repositories
  include RepositoriesHelper
  helper :sort
  include SortHelper
  include IssuesHelper
と
  def show
の部分。

この辺りは、redmine/app/controllers/issues_controller.rbのindexアクションを参考に必要な部分だけにした感じ。
クエリ機能とついでにページ機能も付いた。

app/views/show.html.erb
app/views/_list.html.erb
ここは、
redmine/app/views/issues/index.html.erb
redmine/app/views/issues/_list.html.erb
をコピペして多少のパッチを当てただけなのでソースは載せません。
パッチした部分は以下の通り。

index.html.erb
<%= form_tag({ :controller => 'issues', :action => 'index', :project_id => @project },
を
<%= form_tag({ :controller => 'video', :action => 'show', :project_id => @project },
と
<%= render :partial => 'issues/list', :locals => {:issues => @issues, :query => @query} %>
を
<%= render :partial => 'video/list', :locals => {:issues => @issues, :query => @query} %>
あとはcsvとか別フォーマットで出力する場合のところや、atomのところとか、call_hookのところとかを削除して終わり。
最初はsidebarの追加コードを外してたんだけれど、付けてみたらすごい便利になった。
普通のチケットとして扱えて、録画ファイルが添付されているチケットはサムネイルが表示されて、クリックするとビデオ視聴できる。

_list.html.erb
テーブルヘッダのチェックボックスのところをコメントアウトして、テーブル本体を
<!--<td class="checkbox hide-when-print"><%= check_box_tag("ids[]", issue.id, false, :id => nil) %></td>-->
<td><% thumb = issue.attachments.detect {|a| a.content_type == "image/jpg"} %>
<% if !thumb.nil? %>
  <%= link_to image_tag("/videos/"+thumb.disk_filename), {:action => 'play', :id => issue.id } %>
<% end %></td>
こんな感じにリプレース。
image_tagでサムネイル表示して、playアクションへのリンクにした。

なんか、初めからこうすれば良かったってくらい馴染んだ感じになった。
検索できるし、ソートできるし、ページもあるし。

最初はよくわからないまま始めたんで要領が悪かったけど、少しずつ分かってくると、こうすれば楽じゃんっていう発想が出来るようになってくるもんだよね。

0 件のコメント:

コメントを投稿