2014-04-25 10:00:50 +08:00
< ? php
App :: uses ( 'AppController' , 'Controller' );
/**
* Events Controller
*
* @ property Event $Event
*/
class EventsController extends AppController {
/**
* Components
*
* @ var array
*/
2015-06-11 10:58:58 +08:00
public $components = array ( 'RequestHandler' , 'Scaler' , 'Image' , 'Paginator' );
2014-04-25 10:00:50 +08:00
/**
* index method
*
* @ return void
2015-06-11 10:58:58 +08:00
* This also creates a thumbnail for each event .
2014-04-25 10:00:50 +08:00
*/
public function index () {
$this -> Event -> recursive = - 1 ;
2015-06-11 10:58:58 +08:00
if ( $this -> request -> params [ 'named' ]) {
$this -> FilterComponent = $this -> Components -> load ( 'Filter' );
$conditions = $this -> FilterComponent -> buildFilter ( $this -> request -> params [ 'named' ]);
} else {
$conditions = array ();
}
// How many events to return
$this -> loadModel ( 'Config' );
$limit = $this -> Config -> find ( 'list' , array (
'conditions' => array ( 'Name' => 'ZM_WEB_EVENTS_PER_PAGE' ),
'fields' => array ( 'Name' , 'Value' )
2014-04-25 10:00:50 +08:00
));
2015-06-11 10:58:58 +08:00
$this -> Paginator -> settings = array (
2015-08-08 04:25:48 +08:00
// https://github.com/ZoneMinder/ZoneMinder/issues/995
// 'limit' => $limit['ZM_WEB_EVENTS_PER_PAGE'],
// PP - 25 events per page which is what the above
// default is, is way too low for an API
// changing this to 100 so we don't kill ZM
// with many event APIs. In future, we can
// make a nice ZM_API_ITEMS_PER_PAGE for all pagination
// API
'limit' => '100' ,
2015-06-11 10:58:58 +08:00
'order' => array ( 'StartTime' , 'MaxScore' ),
'paramType' => 'querystring' ,
'conditions' => $conditions
);
$events = $this -> Paginator -> paginate ( 'Event' );
// For each event, get its thumbnail data (path, width, height)
foreach ( $events as $key => $value ) {
2015-09-29 02:41:36 +08:00
// PP - $thumbData = $this->createThumbnail($value['Event']['Id']);
$thumbData = " " ;
2015-06-11 10:58:58 +08:00
$events [ $key ][ 'thumbData' ] = $thumbData ;
}
$this -> set ( compact ( 'events' ));
2014-04-25 10:00:50 +08:00
}
/**
* view method
*
* @ throws NotFoundException
* @ param string $id
* @ return void
*/
public function view ( $id = null ) {
2015-06-11 10:58:58 +08:00
$this -> loadModel ( 'Config' );
$configs = $this -> Config -> find ( 'list' , array (
'fields' => array ( 'Name' , 'Value' ),
'conditions' => array ( 'Name' => array ( 'ZM_DIR_EVENTS' ))
));
$this -> Event -> recursive = 1 ;
2014-04-25 10:00:50 +08:00
if ( ! $this -> Event -> exists ( $id )) {
throw new NotFoundException ( __ ( 'Invalid event' ));
}
$options = array ( 'conditions' => array ( 'Event.' . $this -> Event -> primaryKey => $id ));
$event = $this -> Event -> find ( 'first' , $options );
2015-06-11 10:58:58 +08:00
2015-11-05 03:23:28 +08:00
$path = $configs [ 'ZM_DIR_EVENTS' ] . '/' . $this -> Image -> getEventPath ( $event ) . '/' ;
2015-06-11 10:58:58 +08:00
$event [ 'Event' ][ 'BasePath' ] = $path ;
2015-11-05 03:23:28 +08:00
# Get the previous and next events for any monitor
$this -> Event -> id = $id ;
$event_neighbors = $this -> Event -> find ( 'neighbors' );
2015-11-03 05:54:52 +08:00
$event [ 'Event' ][ 'Next' ] = $event_neighbors [ 'next' ][ 'Event' ][ 'Id' ];
$event [ 'Event' ][ 'Prev' ] = $event_neighbors [ 'prev' ][ 'Event' ][ 'Id' ];
2015-06-11 10:58:58 +08:00
2015-11-05 03:23:28 +08:00
# Also get the previous and next events for the same monitor
$event_monitor_neighbors = $this -> Event -> find ( 'neighbors' , array (
'conditions' => array ( 'Event.MonitorId' => $event [ 'Event' ][ 'MonitorId' ])
));
$event [ 'Event' ][ 'NextOfMonitor' ] = $event_monitor_neighbors [ 'next' ][ 'Event' ][ 'Id' ];
$event [ 'Event' ][ 'PrevOfMonitor' ] = $event_monitor_neighbors [ 'prev' ][ 'Event' ][ 'Id' ];
2014-04-25 10:00:50 +08:00
$this -> set ( array (
'event' => $event ,
'_serialize' => array ( 'event' )
));
}
/**
* add method
*
* @ return void
*/
public function add () {
if ( $this -> request -> is ( 'post' )) {
$this -> Event -> create ();
if ( $this -> Event -> save ( $this -> request -> data )) {
return $this -> flash ( __ ( 'The event has been saved.' ), array ( 'action' => 'index' ));
}
}
$monitors = $this -> Event -> Monitor -> find ( 'list' );
$this -> set ( compact ( 'monitors' ));
}
/**
* edit method
*
* @ throws NotFoundException
* @ param string $id
* @ return void
*/
public function edit ( $id = null ) {
2014-04-26 02:20:55 +08:00
$this -> Event -> id = $id ;
2014-04-25 10:00:50 +08:00
if ( ! $this -> Event -> exists ( $id )) {
throw new NotFoundException ( __ ( 'Invalid event' ));
}
2014-04-26 02:20:55 +08:00
if ( $this -> Event -> save ( $this -> request -> data )) {
$message = 'Saved' ;
2014-04-25 10:00:50 +08:00
} else {
2014-04-26 02:20:55 +08:00
$message = 'Error' ;
2014-04-25 10:00:50 +08:00
}
2014-04-26 02:20:55 +08:00
$this -> set ( array (
'message' => $message ,
'_serialize' => array ( 'message' )
));
2014-04-25 10:00:50 +08:00
}
/**
* delete method
*
* @ throws NotFoundException
* @ param string $id
* @ return void
*/
public function delete ( $id = null ) {
$this -> Event -> id = $id ;
if ( ! $this -> Event -> exists ()) {
throw new NotFoundException ( __ ( 'Invalid event' ));
}
$this -> request -> allowMethod ( 'post' , 'delete' );
if ( $this -> Event -> delete ()) {
2015-09-29 02:41:36 +08:00
// PP - lets make sure the frame table entry is removed too
$this -> loadModel ( 'Frame' );
$this -> Frame -> delete ();
2014-04-25 10:00:50 +08:00
return $this -> flash ( __ ( 'The event has been deleted.' ), array ( 'action' => 'index' ));
} else {
return $this -> flash ( __ ( 'The event could not be deleted. Please, try again.' ), array ( 'action' => 'index' ));
}
2015-06-11 10:58:58 +08:00
}
public function search () {
$this -> Event -> recursive = - 1 ;
$conditions = array ();
foreach ( $this -> params [ 'named' ] as $param_name => $value ) {
// Transform params into mysql
if ( preg_match ( " /interval/i " , $value , $matches )) {
$condition = array ( " $param_name >= (date_sub(now(), $value )) " );
} else {
$condition = array ( $param_name => $value );
}
array_push ( $conditions , $condition );
}
$results = $this -> Event -> find ( 'all' , array (
'conditions' => $conditions
));
$this -> set ( array (
'results' => $results ,
'_serialize' => array ( 'results' )
));
}
public function consoleEvents ( $interval = null ) {
$this -> Event -> recursive = - 1 ;
$results = array ();
$query = $this -> Event -> query ( " select MonitorId, COUNT(*) AS Count from Events WHERE StartTime >= (DATE_SUB(NOW(), interval $interval )) GROUP BY MonitorId; " );
foreach ( $query as $result ) {
$results [ $result [ 'Events' ][ 'MonitorId' ]] = $result [ 0 ][ 'Count' ];
}
$this -> set ( array (
'results' => $results ,
'_serialize' => array ( 'results' )
));
}
// Create a thumbnail and return the thumbnail's data for a given event id.
public function createThumbnail ( $id = null ) {
$this -> Event -> recursive = - 1 ;
if ( ! $this -> Event -> exists ( $id )) {
throw new NotFoundException ( __ ( 'Invalid event' ));
}
$event = $this -> Event -> find ( 'first' , array (
'conditions' => array ( 'Id' => $id )
));
// Find the max Frame for this Event. Error out otherwise.
$this -> loadModel ( 'Frame' );
if ( ! $frame = $this -> Frame -> find ( 'first' , array (
'conditions' => array (
'EventId' => $event [ 'Event' ][ 'Id' ],
'Score' => $event [ 'Event' ][ 'MaxScore' ]
)
))) {
throw new NotFoundException ( __ ( " Can not find Frame for Event " . $event [ 'Event' ][ 'Id' ]));
}
$this -> loadModel ( 'Config' );
// Get the config options required for reScale and getImageSrc
// The $bw, $thumbs and unset() code is a workaround / temporary
// until I have a better way of handing per-bandwidth config options
$bw = ( isset ( $_COOKIE [ 'zmBandwidth' ]) ? strtoupper ( substr ( $_COOKIE [ 'zmBandwidth' ], 0 , 1 )) : 'L' );
$thumbs = " ZM_WEB_ ${ bw } _SCALE_THUMBS " ;
$config = $this -> Config -> find ( 'list' , array (
'conditions' => array ( 'OR' => array (
'Name' => array ( 'ZM_WEB_LIST_THUMB_WIDTH' ,
'ZM_WEB_LIST_THUMB_HEIGHT' ,
'ZM_EVENT_IMAGE_DIGITS' ,
'ZM_DIR_IMAGES' ,
" $thumbs " ,
'ZM_DIR_EVENTS'
)
)),
'fields' => array ( 'Name' , 'Value' )
));
$config [ 'ZM_WEB_SCALE_THUMBS' ] = $config [ $thumbs ];
unset ( $config [ $thumbs ]);
// reScale based on either the width, or the hight, of the event.
if ( $config [ 'ZM_WEB_LIST_THUMB_WIDTH' ] ) {
$thumbWidth = $config [ 'ZM_WEB_LIST_THUMB_WIDTH' ];
$scale = ( 100 * $thumbWidth ) / $event [ 'Event' ][ 'Width' ];
$thumbHeight = $this -> Scaler -> reScale ( $event [ 'Event' ][ 'Height' ], $scale );
}
elseif ( $config [ 'ZM_WEB_LIST_THUMB_HEIGHT' ] ) {
$thumbHeight = $config [ 'ZM_WEB_LIST_THUMB_HEIGHT' ];
$scale = ( 100 * $thumbHeight ) / $event [ 'Event' ][ 'Height' ];
$thumbWidth = $this -> Scaler -> reScale ( $event [ 'Event' ][ 'Width' ], $scale );
}
else {
throw new NotFoundException ( __ ( 'No thumbnail width or height specified, please check in Options->Web' ));
}
$imageData = $this -> Image -> getImageSrc ( $event , $frame , $scale , $config );
$thumbData [ 'Path' ] = $imageData [ 'thumbPath' ];
$thumbData [ 'Width' ] = ( int ) $thumbWidth ;
$thumbData [ 'Height' ] = ( int ) $thumbHeight ;
return ( $thumbData );
}
public function archive ( $id = null ) {
$this -> Event -> recursive = - 1 ;
if ( ! $this -> Event -> exists ( $id )) {
throw new NotFoundException ( __ ( 'Invalid event' ));
}
// Get the current value of Archive
$archived = $this -> Event -> find ( 'first' , array (
'fields' => array ( 'Event.Archived' ),
'conditions' => array ( 'Event.Id' => $id )
));
// If 0, 1, if 1, 0
$archiveVal = (( $archived [ 'Event' ][ 'Archived' ] == 0 ) ? 1 : 0 );
// Save the new value
$this -> Event -> id = $id ;
$this -> Event -> saveField ( 'Archived' , $archiveVal );
$this -> set ( array (
'archived' => $archiveVal ,
'_serialize' => array ( 'archived' )
));
}
}