Added delete and removed Kohana
This commit is contained in:
@@ -1,50 +0,0 @@
|
||||
<?php defined('SYSPATH') or die('No direct access allowed.');
|
||||
|
||||
/**
|
||||
* This class extends the core Kohana class by adding some core application
|
||||
* specific functions, and configuration.
|
||||
*
|
||||
* @package Photo
|
||||
* @category Helpers
|
||||
* @author Deon George
|
||||
* @copyright (c) 2014 Deon George
|
||||
* @license http://dev.leenooks.net/license.html
|
||||
*/
|
||||
class Config extends Kohana_Config {
|
||||
/**
|
||||
* Some early initialisation
|
||||
*
|
||||
* At this point, KH hasnt been fully initialised either, so we cant rely on
|
||||
* too many KH functions yet.
|
||||
*
|
||||
* NOTE: Kohana doesnt provide a parent construct for the Kohana_Config class.
|
||||
*/
|
||||
public function __construct() {
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the singleton instance of Config.
|
||||
*
|
||||
* $config = Config::instance();
|
||||
*
|
||||
* @return Config
|
||||
* @compat Restore KH 3.1 functionality
|
||||
*/
|
||||
public static function instance() {
|
||||
if (Config::$_instance === NULL)
|
||||
// Create a new instance
|
||||
Config::$_instance = new Config;
|
||||
|
||||
return Config::$_instance;
|
||||
}
|
||||
|
||||
public static function Copywrite() {
|
||||
return '(c) 2014 Deon George';
|
||||
}
|
||||
|
||||
public static function version() {
|
||||
// @todo Work out our versioning
|
||||
return 'TBA';
|
||||
}
|
||||
}
|
||||
?>
|
@@ -1,290 +0,0 @@
|
||||
<?php defined('SYSPATH') or die('No direct access allowed.');
|
||||
|
||||
/**
|
||||
* Mark all accounts that have no outstanding invoices and active services as disabled.
|
||||
*
|
||||
* @package Photo
|
||||
* @category Controllers
|
||||
* @author Deon George
|
||||
* @copyright (c) 2014 Deon George
|
||||
* @license http://dev.leenooks.net/license.html
|
||||
*/
|
||||
class Controller_Photo extends Controller_TemplateDefault {
|
||||
public function action_index() {
|
||||
}
|
||||
|
||||
public function action_delete() {
|
||||
$output = '';
|
||||
|
||||
// Update the current posted photos.
|
||||
if ($this->request->post())
|
||||
foreach ($this->request->post('process') as $pid) {
|
||||
$po = ORM::factory('Photo',$pid);
|
||||
$po->remove = Arr::get($this->request->post('remove'),$pid);
|
||||
$po->save();
|
||||
|
||||
// If the photo is not marked as remove, or flagged, dont do it.
|
||||
if (! $po->loaded() OR $po->flag OR ! $po->remove)
|
||||
continue;
|
||||
|
||||
if (! is_writable(dirname($po->file_path())))
|
||||
$output .= sprintf('Dont have write permissions on %s',dirname($po->file_path()));
|
||||
|
||||
$output .= sprintf('Removing %s (%s)',$po->id,$po->file_path());
|
||||
|
||||
// Delete it
|
||||
$po->delete();
|
||||
}
|
||||
|
||||
$p = ORM::factory('Photo');
|
||||
|
||||
// Review a specific photo, or the next one marked remove
|
||||
if ($x=$this->request->param('id'))
|
||||
$p->where('id','=',$x);
|
||||
|
||||
else
|
||||
$p->where('remove','=',TRUE)
|
||||
->where_open()
|
||||
->where('flag','!=',TRUE)
|
||||
->or_where('flag','is',NULL)
|
||||
->where_close();
|
||||
|
||||
$output .= Form::open(sprintf('%s/%s',strtolower($this->request->controller()),$this->request->action()));
|
||||
|
||||
foreach ($p->find_all() as $po) {
|
||||
$dp = $po->list_duplicate()->find_all();
|
||||
|
||||
$output .= Form::hidden('process[]',$po->id);
|
||||
foreach ($dp as $dpo)
|
||||
$output .= Form::hidden('process[]',$dpo->id);
|
||||
|
||||
$output .= '<table class="table table-striped table-condensed table-hover">';
|
||||
|
||||
foreach (array(
|
||||
'ID'=>array('key'=>'id','value'=>HTML::anchor('/photo/details/%VALUE%','%VALUE%')),
|
||||
'Thumbnail'=>array('key'=>'id','value'=>HTML::anchor('/photo/view/%VALUE%',HTML::image('photo/thumbnail/%VALUE%'))),
|
||||
'Signature'=>array('key'=>'signature'),
|
||||
'Date Taken'=>array('key'=>'date_taken()'),
|
||||
'File Modified'=>array('key'=>'date_file("m",TRUE)'),
|
||||
'File Created'=>array('key'=>'date_file("c",TRUE)'),
|
||||
'Filename'=>array('key'=>'file_path(TRUE,FALSE)'),
|
||||
'Filesize'=>array('key'=>'file_size()'),
|
||||
'Width'=>array('key'=>'width'),
|
||||
'Height'=>array('key'=>'height'),
|
||||
'Orientation'=>array('key'=>'orientation'),
|
||||
'Orientate'=>array('key'=>'rotation()'),
|
||||
'Make'=>array('key'=>'make'),
|
||||
'Model'=>array('key'=>'model'),
|
||||
) as $k=>$v)
|
||||
$output .= $this->table_duplicate_details($dp,$po,$v['key'],$k,Arr::get($v,'value','%VALUE%'));
|
||||
|
||||
foreach (array(
|
||||
'Delete'=>array('key'=>'id','value'=>'remove'),
|
||||
) as $k=>$v)
|
||||
$output .= $this->table_duplicate_checkbox($dp,$po,$v['key'],$k,Arr::get($v,'value','%VALUE%'));
|
||||
|
||||
$output .= '</table>';
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
$output .= '<div class="row">';
|
||||
$output .= '<div class="col-md-offset-2">';
|
||||
$output .= '<button type="submit" class="btn btn-primary">Save changes</button>';
|
||||
$output .= '<button type="button" class="btn">Cancel</button>';
|
||||
$output .= '</div>';
|
||||
$output .= '</div>';
|
||||
|
||||
$output .= Form::close();
|
||||
|
||||
Block::factory()
|
||||
->title('Delete Photo:'.$po->id)
|
||||
->title_icon('icon-delete')
|
||||
->body($output);
|
||||
}
|
||||
|
||||
public function action_details() {
|
||||
$po = ORM::factory('Photo',$this->request->param('id'));
|
||||
if (! $po->loaded())
|
||||
HTTP::redirect('index');
|
||||
|
||||
Block::factory()
|
||||
->title('Details for Photo:'.$po->id)
|
||||
->body(Debug::vars($po->info()));
|
||||
}
|
||||
|
||||
public function action_duplicate() {
|
||||
$output = '';
|
||||
|
||||
// Update the current posted photos.
|
||||
if ($this->request->post())
|
||||
foreach ($this->request->post('process') as $pid) {
|
||||
$po = ORM::factory('Photo',$pid);
|
||||
|
||||
$po->duplicate = Arr::get($this->request->post('duplicate'),$pid);
|
||||
$po->remove = Arr::get($this->request->post('remove'),$pid);
|
||||
$po->flag = Arr::get($this->request->post('flag'),$pid);
|
||||
|
||||
if ($po->changed())
|
||||
$output .= HTML::anchor(URL::link('','photo/duplicate/'.$po->id),$po->id).' updated.<br/>';
|
||||
|
||||
$po->save();
|
||||
|
||||
}
|
||||
|
||||
$p = ORM::factory('Photo');
|
||||
|
||||
// Review a specific photo, or the next one marked duplicate
|
||||
if ($x=$this->request->param('id'))
|
||||
$p->where('id','=',$x);
|
||||
|
||||
else
|
||||
$p->where('duplicate','=',TRUE)
|
||||
->where_open()
|
||||
->where('remove','!=',TRUE)
|
||||
->or_where('remove','is',NULL)
|
||||
->where_close();
|
||||
|
||||
$output .= Form::open(sprintf('%s/%s',strtolower($this->request->controller()),$this->request->action()));
|
||||
|
||||
foreach ($p->find_all() as $po) {
|
||||
$dp = $po->list_duplicate()->find_all();
|
||||
|
||||
// Check that there are still duplicates
|
||||
if ($dp->count() == 0) {
|
||||
$po->duplicate = NULL;
|
||||
$po->save();
|
||||
continue;
|
||||
}
|
||||
|
||||
$output .= Form::hidden('process[]',$po->id);
|
||||
foreach ($dp as $dpo)
|
||||
$output .= Form::hidden('process[]',$dpo->id);
|
||||
|
||||
$output .= '<table class="table table-striped table-condensed table-hover">';
|
||||
|
||||
foreach (array(
|
||||
'ID'=>array('key'=>'id','value'=>HTML::anchor('/photo/details/%VALUE%','%VALUE%')),
|
||||
'Thumbnail'=>array('key'=>'id','value'=>HTML::anchor('/photo/view/%VALUE%',HTML::image('photo/thumbnail/%VALUE%'))),
|
||||
'ThumbSig'=>array('key'=>'thumbnail_sig()'),
|
||||
'Signature'=>array('key'=>'signature'),
|
||||
'Date Taken'=>array('key'=>'date_taken()'),
|
||||
'File Modified'=>array('key'=>'date_file("m",TRUE)'),
|
||||
'File Created'=>array('key'=>'date_file("c",TRUE)'),
|
||||
'Filename'=>array('key'=>'file_path(TRUE,FALSE)'),
|
||||
'Filesize'=>array('key'=>'file_size()'),
|
||||
'Width'=>array('key'=>'width'),
|
||||
'Height'=>array('key'=>'height'),
|
||||
'Orientation'=>array('key'=>'orientation'),
|
||||
'Orientate'=>array('key'=>'rotation()'),
|
||||
'Make'=>array('key'=>'make'),
|
||||
'Model'=>array('key'=>'model'),
|
||||
'Exif Diff'=>array('key'=>"propertydiff({$po->id})"),
|
||||
) as $k=>$v)
|
||||
$output .= $this->table_duplicate_details($dp,$po,$v['key'],$k,Arr::get($v,'value','%VALUE%'));
|
||||
|
||||
foreach (array(
|
||||
'Flag'=>array('key'=>'id','value'=>'flag'),
|
||||
'Duplicate'=>array('key'=>'id','value'=>'duplicate'),
|
||||
'Delete'=>array('key'=>'id','value'=>'remove'),
|
||||
) as $k=>$v)
|
||||
$output .= $this->table_duplicate_checkbox($dp,$po,$v['key'],$k,Arr::get($v,'value','%VALUE%'));
|
||||
|
||||
$output .= '</table>';
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
$output .= '<div class="row">';
|
||||
$output .= '<div class="col-md-offset-2">';
|
||||
$output .= '<button type="submit" class="btn btn-primary">Save changes</button>';
|
||||
$output .= '<button type="button" class="btn">Cancel</button>';
|
||||
$output .= '</div>';
|
||||
$output .= '</div>';
|
||||
|
||||
$output .= Form::close();
|
||||
|
||||
Block::factory()
|
||||
->title('Duplicate Photo:'.$po->id)
|
||||
->title_icon('icon-edit')
|
||||
->body($output);
|
||||
}
|
||||
|
||||
public function action_thumbnail() {
|
||||
// Get the file path from the request
|
||||
$po = ORM::factory('Photo',$this->request->param('id'));
|
||||
|
||||
return $this->image($po->thumbnail(),$po->date_taken,$po->type(TRUE));
|
||||
}
|
||||
|
||||
public function action_view() {
|
||||
$po = ORM::factory('Photo',$this->request->param('id'));
|
||||
|
||||
return $this->image($po->image(),$po->date_taken,$po->type(TRUE));
|
||||
}
|
||||
|
||||
private function image($content,$modified,$type) {
|
||||
// Send the file content as the response
|
||||
if ($content)
|
||||
$this->response->body($content);
|
||||
// Return a 404 status
|
||||
else
|
||||
$this->response->status(404);
|
||||
|
||||
// Generate and check the ETag for this file
|
||||
if (Kohana::$environment < Kohana::TESTING OR Kohana::$config->load('debug')->etag)
|
||||
$this->check_cache(sha1($this->response->body()));
|
||||
|
||||
// Set the proper headers to allow caching
|
||||
$this->response->headers('Content-Type',$type);
|
||||
$this->response->headers('Content-Length',(string)$this->response->content_length());
|
||||
$this->response->headers('Last-Modified',date('r',$modified));
|
||||
$this->auto_render = FALSE;
|
||||
}
|
||||
|
||||
private function table_duplicate_checkbox(Database_MySQL_Result $dp,Model_Photo $po,$param,$title,$condition) {
|
||||
$output = '<tr>';
|
||||
|
||||
$output .= sprintf('<th>%s</th>',$title);
|
||||
|
||||
$output .= '<td>'.Form::checkbox($condition.'['.$po->{$param}.']',TRUE,$po->{$condition} ? TRUE : FALSE).'</td>';
|
||||
|
||||
foreach ($dp as $dpo)
|
||||
$output .= '<td>'.Form::checkbox($condition.'['.$dpo->{$param}.']',TRUE,$dpo->{$condition} ? TRUE : FALSE).'</td>';
|
||||
|
||||
$output .= '</tr>';
|
||||
|
||||
return $output;
|
||||
}
|
||||
|
||||
private function evaluate(Model $o,$param) {
|
||||
$result = NULL;
|
||||
|
||||
if (preg_match('/\(/',$param) OR preg_match('/-\>/',$param))
|
||||
eval("\$result = \$o->$param;");
|
||||
else
|
||||
$result = $o->display($param);
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
private function table_duplicate_details(Database_MySQL_Result $dp,Model_Photo $po,$param,$title='',$content='') {
|
||||
$output = '<tr>';
|
||||
|
||||
$v = $this->evaluate($po,$param);
|
||||
|
||||
$output .= sprintf('<th>%s</th>',$title);
|
||||
$output .= sprintf('<td>%s</td>',$content ? str_replace('%VALUE%',$v,$content) : $v);
|
||||
|
||||
foreach ($dp as $dpo) {
|
||||
$d = $this->evaluate($dpo,$param);
|
||||
|
||||
$output .= sprintf('<td class="%s">%s</td>',($d==$v ? 'success' : 'warning'),$content ? str_replace('%VALUE%',$d,$content) : $d);
|
||||
}
|
||||
|
||||
$output .= '</tr>';
|
||||
|
||||
return $output;
|
||||
}
|
||||
}
|
||||
?>
|
@@ -1,15 +0,0 @@
|
||||
<?php defined('SYSPATH') or die('No direct access allowed.');
|
||||
|
||||
/**
|
||||
* This class overrides Kohana's Cookie
|
||||
*
|
||||
* @package Photo
|
||||
* @category Modifications
|
||||
* @author Deon George
|
||||
* @copyright (c) 2014 Deon George
|
||||
* @license http://dev.leenooks.net/license.html
|
||||
*/
|
||||
class Cookie extends Kohana_Cookie {
|
||||
public static $salt = 'Photo';
|
||||
}
|
||||
?>
|
@@ -1,24 +0,0 @@
|
||||
<?php defined('SYSPATH') or die('No direct access allowed.');
|
||||
|
||||
/**
|
||||
* This class extends the core Kohana class by adding some core application
|
||||
* specific functions, and configuration.
|
||||
*
|
||||
* @package Photo
|
||||
* @category Helpers
|
||||
* @author Deon George
|
||||
* @copyright (c) 2014 Deon George
|
||||
* @license http://dev.leenooks.net/license.html
|
||||
*/
|
||||
class File extends Kohana_File {
|
||||
public static function ParentDirExist($path,$create=FALSE) {
|
||||
$isDir = is_dir($path);
|
||||
|
||||
if ($isDir OR ! $create)
|
||||
return $isDir;
|
||||
|
||||
if (File::ParentDirExist(dirname($path),$create))
|
||||
return mkdir($path);
|
||||
}
|
||||
}
|
||||
?>
|
@@ -1,277 +0,0 @@
|
||||
<?php defined('SYSPATH') or die('No direct access allowed.');
|
||||
|
||||
/**
|
||||
* This class supports Photos.
|
||||
*
|
||||
* @package Photo
|
||||
* @category Models
|
||||
* @author Deon George
|
||||
* @copyright (c) 2014 Deon George
|
||||
* @license http://dev.leenooks.net/license.html
|
||||
*/
|
||||
class Model_Photo extends ORM {
|
||||
private $_path = '/mnt/net/qnap/Multimedia/Photos';
|
||||
private $_io = NULL;
|
||||
|
||||
protected $_has_many = array(
|
||||
'album'=>array('through'=>'album_photo'),
|
||||
'people'=>array('through'=>'photo_people','far_key'=>'people_id'),
|
||||
'tags'=>array('through'=>'photo_tag','far_key'=>'tag_id'),
|
||||
'photo_tag'=>array('far_key'=>'id'),
|
||||
'photo_people'=>array('far_key'=>'id'),
|
||||
);
|
||||
|
||||
/**
|
||||
* Filters used to format the display of values into friendlier values
|
||||
*/
|
||||
protected $_display_filters = array(
|
||||
'date_orig'=>array(
|
||||
array('Site::Datetime',array(':value')),
|
||||
),
|
||||
'date_taken'=>array(
|
||||
array('Site::Datetime',array(':value')),
|
||||
),
|
||||
'signature'=>array(
|
||||
array('Model_Photo::Signaturetrim',array(':value')),
|
||||
),
|
||||
);
|
||||
|
||||
public function date_file($type,$format=FALSE) {
|
||||
switch ($type) {
|
||||
case 'a': $t = fileatime($this->file_path());
|
||||
break;
|
||||
case 'c': $t = filectime($this->file_path());
|
||||
break;
|
||||
case 'm': $t = filemtime($this->file_path());
|
||||
break;
|
||||
}
|
||||
|
||||
return $format ? Site::Datetime($t) : $t;
|
||||
}
|
||||
|
||||
public function date_taken() {
|
||||
return $this->display('date_taken').($this->subsectime ? '.'.$this->subsectime : '');
|
||||
}
|
||||
|
||||
public function file_path($short=FALSE,$new=FALSE) {
|
||||
$file = $this->filename;
|
||||
|
||||
if ($new)
|
||||
$file = sprintf('%s.%s',((is_null($this->date_taken) OR ! $this->date_taken)
|
||||
? sprintf('UNKNOWN/%07s',$this->file_path_id())
|
||||
: sprintf('%s_%03s',date('Y/m/d-His',$this->date_taken),$this->subsectime).($this->subsectime ? '' : sprintf('-%05s',$this->id))),$this->type());
|
||||
|
||||
return (($short OR preg_match('/^\//',$file)) ? '' : $this->_path.DIRECTORY_SEPARATOR).$file;
|
||||
}
|
||||
|
||||
public function file_path_id($sep=3,$depth=9) {
|
||||
return trim(chunk_split(sprintf("%0{$depth}s",$this->id),$sep,'/'),'/');
|
||||
}
|
||||
|
||||
public function file_path_short($path) {
|
||||
return preg_replace(":^{$this->_path}".DIRECTORY_SEPARATOR.":",'',$path);
|
||||
}
|
||||
|
||||
public function delete() {
|
||||
if (unlink($this->file_path())) {
|
||||
// Remove any tags
|
||||
foreach ($this->photo_tag->find_all() as $o)
|
||||
$o->delete();
|
||||
|
||||
// Remove any people
|
||||
foreach ($this->photo_people->find_all() as $o)
|
||||
$o->delete();
|
||||
|
||||
return parent::delete();
|
||||
}
|
||||
|
||||
// If unlink failed...
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
public function file_size() {
|
||||
return filesize($this->file_path());
|
||||
}
|
||||
|
||||
public function gps(array $coordinate,$hemisphere) {
|
||||
if (! $coordinate OR ! $hemisphere)
|
||||
return NULL;
|
||||
|
||||
for ($i=0; $i<3; $i++) {
|
||||
$part = explode('/', $coordinate[$i]);
|
||||
|
||||
if (count($part) == 1)
|
||||
$coordinate[$i] = $part[0];
|
||||
|
||||
elseif (count($part) == 2)
|
||||
$coordinate[$i] = floatval($part[0])/floatval($part[1]);
|
||||
|
||||
else
|
||||
$coordinate[$i] = 0;
|
||||
}
|
||||
|
||||
list($degrees, $minutes, $seconds) = $coordinate;
|
||||
|
||||
$sign = ($hemisphere == 'W' || $hemisphere == 'S') ? -1 : 1;
|
||||
|
||||
return round($sign*($degrees+$minutes/60+$seconds/3600),$degrees > 100 ? 3 : 4);
|
||||
}
|
||||
|
||||
public function image() {
|
||||
$imo = $this->io();
|
||||
|
||||
if (array_key_exists('exif',$imo->getImageProfiles()))
|
||||
$imo->removeImageProfile('exif');
|
||||
|
||||
$this->rotate($imo);
|
||||
|
||||
return $imo->getImageBlob();
|
||||
}
|
||||
|
||||
public function info() {
|
||||
$imo = $this->io();
|
||||
|
||||
return $imo->getImageProperties();
|
||||
}
|
||||
|
||||
public function io($attr=NULL) {
|
||||
if (is_nulL($this->_io))
|
||||
$this->_io = new Imagick($this->file_path());
|
||||
|
||||
return is_null($attr) ? $this->_io : $this->_io->getImageProperty($attr);
|
||||
}
|
||||
|
||||
public function move($path='') {
|
||||
if (! $path)
|
||||
$path = $this->file_path(FALSE,TRUE);
|
||||
|
||||
// Check if there is already a phoot here - and if it is pending delete.
|
||||
$po = ORM::factory('Photo',array('filename'=>$this->file_path_short($path)));
|
||||
|
||||
// @todo Move any tags if we are replacing an existing photo.
|
||||
if ($po->loaded() AND (! $po->remove OR ($po->remove AND ! $po->delete())))
|
||||
return FALSE;
|
||||
|
||||
unset($po);
|
||||
|
||||
// If the file already exists, or we cant create the dir structure, we'll ignore the move
|
||||
if (file_exists($path) OR ! File::ParentDirExist(dirname($path),TRUE))
|
||||
return FALSE;
|
||||
|
||||
if (rename($this->file_path(),$path)) {
|
||||
// Convert the path to a relative one.
|
||||
$this->filename = $this->file_path_short($path);
|
||||
|
||||
// If the DB update failed, move it back.
|
||||
if (! $this->save() AND ! rename($path,$this->file_path()))
|
||||
throw new Kohana_Exception('Error: Unable to move file, ID: :id, OLD: :oldname, NEW: :newname',
|
||||
array(':id'=>$this->id,':oldname'=>$this->file_path(),':newname'=>$path));
|
||||
|
||||
chmod($this->file_path(),0444);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
public function propertydiff($id) {
|
||||
if ($id == $this->id)
|
||||
return;
|
||||
|
||||
$po = ORM::factory($this->_object_name,$id);
|
||||
if (! $po->loaded())
|
||||
return;
|
||||
|
||||
$result = array_diff_assoc($this->info(),$po->info());
|
||||
|
||||
return join('|',array_keys($result));
|
||||
}
|
||||
|
||||
/*
|
||||
private function rotate(Imagick $imo) {
|
||||
switch ($this->orientation) {
|
||||
case 3: $imo->rotateImage(new ImagickPixel('none'),180);
|
||||
break;
|
||||
case 6: $imo->rotateImage(new ImagickPixel('none'),90);
|
||||
break;
|
||||
case 8: $imo->rotateImage(new ImagickPixel('none'),-90);
|
||||
break;
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
||||
public function rotation() {
|
||||
switch ($this->orientation) {
|
||||
case 1: return 'None!';
|
||||
case 3: return 'Upside Down';
|
||||
case 6: return 'Rotate Right';
|
||||
case 8: return 'Rotate Left';
|
||||
default:
|
||||
return 'unknown?';
|
||||
}
|
||||
}
|
||||
|
||||
public static function SignatureTrim($signature,$chars=6) {
|
||||
return sprintf('%s...%s',substr($signature,0,$chars),substr($signature,-1*$chars));
|
||||
}
|
||||
|
||||
/*
|
||||
public function thumbnail($rotate=TRUE) {
|
||||
if (! $this->thumbnail)
|
||||
return NULL;
|
||||
|
||||
$imo = new Imagick();
|
||||
|
||||
$imo->readImageBlob($this->thumbnail);
|
||||
|
||||
if ($rotate)
|
||||
$this->rotate($imo);
|
||||
|
||||
return $imo->getImageBlob();
|
||||
}
|
||||
*/
|
||||
|
||||
public function thumbnail_sig() {
|
||||
return md5($this->thumbnail()).':'.strlen($this->thumbnail());
|
||||
}
|
||||
|
||||
public function type($mime=FALSE) {
|
||||
return strtolower($mime ? File::mime_by_ext(pathinfo($this->filename,PATHINFO_EXTENSION)) : pathinfo($this->filename,PATHINFO_EXTENSION));
|
||||
}
|
||||
|
||||
public function list_duplicate() {
|
||||
$po = ORM::factory($this->_object_name);
|
||||
|
||||
if ($this->loaded())
|
||||
$po->where('id','!=',$this->id);
|
||||
|
||||
// Ignore photo's pending removal.
|
||||
$po->where_open();
|
||||
$po->where('remove','!=',TRUE);
|
||||
$po->or_where('remove','is',NULL);
|
||||
$po->where_close();
|
||||
|
||||
// Where the signature is the same
|
||||
$po->where_open();
|
||||
$po->where('signature','=',$this->signature);
|
||||
|
||||
// Or they have the same time taken with the same camera
|
||||
if ($this->date_taken AND ($this->model OR $this->make)) {
|
||||
$po->or_where_open();
|
||||
$po->where('date_taken','=',$this->date_taken);
|
||||
$po->where('subsectime','=',$this->subsectime);
|
||||
|
||||
if (! is_null($this->model))
|
||||
$po->and_where('model','=',$this->model);
|
||||
|
||||
if (! is_null($this->make))
|
||||
$po->and_where('make','=',$this->make);
|
||||
|
||||
$po->where_close();
|
||||
}
|
||||
|
||||
$po->where_close();
|
||||
|
||||
return $po;
|
||||
}
|
||||
}
|
||||
?>
|
Reference in New Issue
Block a user