request->post()) foreach ($this->request->post('process') as $pid) { if (! Arr::get($this->request->post('remove'),$pid,FALSE)) continue; $po = ORM::factory('Photo',$pid); // 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()); } $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 .= ''; 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)'), 'Proposed Name'=>array('key'=>'path()'), '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 .= '
'; break; } $output .= '
'; $output .= '
'; $output .= ''; $output .= ''; $output .= '
'; $output .= '
'; $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); $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 .= ''; 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)'), 'Proposed Name'=>array('key'=>'file_path(TRUE,TRUE)'), '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 .= '
'; break; } $output .= '
'; $output .= '
'; $output .= ''; $output .= ''; $output .= '
'; $output .= '
'; $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 = ''; $output .= sprintf('%s',$title); $output .= ''.Form::checkbox($condition.'['.$po->{$param}.']',TRUE,$po->{$condition} ? TRUE : FALSE).''; foreach ($dp as $dpo) $output .= ''.Form::checkbox($condition.'['.$dpo->{$param}.']',TRUE,$dpo->{$condition} ? TRUE : FALSE).''; $output .= ''; 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 = ''; $v = $this->evaluate($po,$param); $output .= sprintf('%s',$title); $output .= sprintf('%s',$content ? str_replace('%VALUE%',$v,$content) : $v); foreach ($dp as $dpo) { $d = $this->evaluate($dpo,$param); $output .= sprintf('%s',($d==$v ? 'success' : 'warning'),$content ? str_replace('%VALUE%',$d,$content) : $d); } $output .= ''; return $output; } } ?>