chaw / branches / master / models / timeline.php

history
<?php
/**
 * Chaw : source code and project management
 *
 * @copyright  Copyright 2009, Garrett J. Woodworth (gwoohoo@gmail.com)
 * @license    GNU AFFERO GENERAL PUBLIC LICENSE v3 (http://opensource.org/licenses/agpl-v3.html)
 *
 */
/**
 * undocumented class
 *
 * @package default
 */
class Timeline extends AppModel {

	/**
	 * undocumented variable
	 *
	 * @var string
	 */
	var $name = 'Timeline';

	/**
	 * undocumented variable
	 *
	 * @var string
	 */
	var $useTable = 'timeline';

	/**
	 * undocumented variable
	 *
	 * @var string
	 */
	var $_findMethods = array('events' => true);

	/**
	 * undocumented variable
	 *
	 * @var string
	 */
	var $actsAs = array('Containable');

	/**
	 * undocumented variable
	 *
	 * @var string
	 */
	var $validate = array(
		'model' => array('notEmpty'),
		'foreign_key' => array('numeric')
	);

	/**
	 * undocumented variable
	 *
	 * @var string
	 */
	var $belongsTo = array(
		'Project',
		'Comment' => array(
			'foreignKey' => 'foreign_key',
			'conditions' => array('Timeline.model = \'Comment\''),
			'dependent' => true
		),
		'Commit' => array(
			'foreignKey' => 'foreign_key',
			'conditions' => array('Timeline.model = \'Commit\''),
			'dependent' => true
		),
		'Ticket' => array(
			'foreignKey' => 'foreign_key',
			'conditions' => array('Timeline.model = \'Ticket\''),
			'dependent' => true
		),
		'Wiki' => array(
			'foreignKey' => 'foreign_key',
			'conditions' => array('Timeline.model = \'Wiki\''),
			'dependent' => true
		)
	);

	/**
	 * undocumented function
	 *
	 * @param string $conditions
	 * @param string $recursive
	 * @param string $extra
	 * @return void
	 */
	function paginateCount($conditions = array(), $recursive = 0, $extra = array()) {
		$this->unbindModel(array('belongsTo' => array(
			'Comment', 'Ticket', 'Wiki', 'Commit',
		)), false);
		return $this->find('count', compact('conditions'));
	}

	/**
	 * undocumented function
	 *
	 * @param string $conditions
	 * @param string $fields
	 * @param string $order
	 * @param string $limit
	 * @param string $page
	 * @param string $recursive
	 * @param string $extra
	 * @return void
	 */
	function paginate($conditions = array(), $fields = array(), $order = array(), $limit = null, $page = null, $recursive = 0, $extra = array()) {
		return $this->find('events', compact('conditions', 'fields', 'order', 'limit', 'page', 'recursive'));
	}

	/**
	 * undocumented function
	 *
	 * @param string $state
	 * @param string $query
	 * @param string $results
	 * @return void
	 */
	function _findEvents($state, $query, $results = array()) {
		if ($state == 'before') {
			$defaults = array(
				'order' => array(
					'Timeline.created' => 'DESC',
					'Timeline.id' => 'DESC'
				)
			);
			$query = Set::pushDiff($defaults, $query);
			return $query;
		}

		$data = array();
		foreach ((array)$results as $key => $timeline) {
			$type = $timeline['Timeline']['model'];
			if (!isset($this->{$type})) {
				continue;
			}

			$this->{$type}->recursive = 0;

			if ($type == 'Comment') {
				$this->{$type}->recursive = 2;
				$this->{$type}->Ticket->unbindModel(array(
					'hasMany' => array('Comment'),
				));
			}

			$related = $this->{$type}->findById($timeline['Timeline']['foreign_key']);

			if (!empty($related)) {
				$data[] = array_merge($timeline, (array)$related);
			}
		}
		return $data;
	}
}
?>