123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195 |
- # Copyright (C) 2012-2015 Zammad Foundation, http://zammad-foundation.org/
- require 'icalendar'
- class IcalTicketsController < ApplicationController
- before_filter { authentication_check_action_token 'iCal' }
- # @path [GET] /ical/tickets_all/:action_token
- #
- # @summary Returns an iCal file with all tickets (open, new, pending, esclation) as events.
- #
- # @parameter action_token(required) [String] The action_token identifying the requested User privileged for 'iCal' action.
- #
- # @response_message 200 [String] iCal file ready to import in calendar applications.
- # @response_message 500 Permission denied.
- def all
- new_open_events_data = new_open_events_data_get
- pending_events_data = pending_events_data_get
- escalation_events_data = escalation_events_data_get
- events_data = new_open_events_data + pending_events_data + escalation_events_data
- events_data_to_ical( events_data )
- end
- # @path [GET] /ical/tickets_new_open/:action_token
- #
- # @summary Returns an iCal file with all new and open tickets as events.
- #
- # @parameter action_token(required) [String] The action_token identifying the requested User privileged for 'iCal' action.
- #
- # @response_message 200 [String] iCal file ready to import in calendar applications.
- # @response_message 500 Permission denied.
- def new_open
- events_data = new_open_events_data_get
- events_data_to_ical( events_data )
- end
- # @path [GET] /ical/tickets_pending/:action_token
- #
- # @summary Returns an iCal file with all pending tickets as events.
- #
- # @parameter action_token(required) [String] The action_token identifying the requested User privileged for 'iCal' action.
- #
- # @response_message 200 [String] iCal file ready to import in calendar applications.
- # @response_message 500 Permission denied.
- def pending
- events_data = pending_events_data_get
- events_data_to_ical( events_data )
- end
- # @path [GET] /ical/ticket_escalation/:action_token
- #
- # @summary Returns an iCal file with all escalation times for tickets as events.
- #
- # @parameter action_token(required) [String] The action_token identifying the requested User privileged for 'iCal' action.
- #
- # @response_message 200 [String] iCal file ready to import in calendar applications.
- # @response_message 500 Permission denied.
- def escalation
- events_data = escalation_events_data_get
- events_data_to_ical( events_data )
- end
- private
- def new_open_events_data_get
- condition = {
- 'tickets.owner_id' => current_user.id,
- 'tickets.state_id' => Ticket::State.where(
- :state_type_id => Ticket::StateType.where(
- :name => [
- 'new',
- 'open',
- ],
- ),
- ),
- }
- tickets = Ticket.search(
- :current_user => current_user,
- :condition => condition,
- )
- events_data = []
- tickets.each do |ticket|
- event_data = {}
- event_data[:dtstart] = Icalendar::Values::Date.new( Date.today )
- event_data[:dtend] = Icalendar::Values::Date.new( Date.today )
- event_data[:summary] = "#{ ticket.state.name } ticket: '#{ ticket.title }'"
- event_data[:description] = "T##{ ticket.number }"
- events_data.push event_data
- end
- return events_data
- end
- def pending_events_data_get
- condition = {
- 'tickets.owner_id' => current_user.id,
- 'tickets.state_id' => Ticket::State.where(
- :state_type_id => Ticket::StateType.where(
- :name => [
- 'pending reminder',
- 'pending action',
- ],
- ),
- ),
- }
- tickets = Ticket.search(
- :current_user => current_user,
- :condition => condition,
- )
- events_data = []
- tickets.each do |ticket|
- event_data = {}
- event_data[:dtstart] = Icalendar::Values::DateTime.new( ticket.pending_time )
- event_data[:dtend] = Icalendar::Values::DateTime.new( ticket.pending_time )
- event_data[:summary] = "#{ ticket.state.name } ticket: '#{ ticket.title }'"
- event_data[:description] = "T##{ ticket.number }"
- events_data.push event_data
- end
- return events_data
- end
- def escalation_events_data_get
- condition = [
- 'tickets.escalation_time IS NOT NULL',
- 'tickets.owner_id = ?', current_user.id
- ]
- tickets = Ticket.search(
- :current_user => current_user,
- :condition => condition,
- )
- events_data = []
- tickets.each do |ticket|
- event_data = {}
- event_data[:dtstart] = Icalendar::Values::DateTime.new( ticket.escalation_time )
- event_data[:dtend] = Icalendar::Values::DateTime.new( ticket.escalation_time )
- event_data[:summary] = "ticket escalation: '#{ ticket.title }'"
- event_data[:description] = "T##{ ticket.number }"
- events_data.push event_data
- end
- return events_data
- end
- def events_data_to_ical(events_data)
- cal = Icalendar::Calendar.new
- events_data.each do |event_data|
- cal.event do |e|
- e.dtstart = event_data[:dtstart]
- e.dtend = event_data[:dtend]
- e.summary = event_data[:summary]
- e.description = event_data[:description]
- e.ip_class = "PRIVATE"
- end
- end
- send_data(
- cal.to_ical,
- :filename => 'new_open.ical',
- :type => 'text/plain',
- :disposition => 'inline'
- )
- end
- end
|