fix #8131 - chinese translations
[Pman.Core] / DataObjects / Events.php
index d702868..a04484c 100644 (file)
@@ -7,7 +7,7 @@
  *
  * 
  */
-require_once 'DB/DataObject.php';
+class_exists('DB_DataObject') ? '' : require_once 'DB/DataObject.php';
 
 class Pman_Core_DataObjects_Events extends DB_DataObject 
 {
@@ -25,7 +25,8 @@ class Pman_Core_DataObjects_Events extends DB_DataObject
     public $person_id;                       // int(11)  
     public $remarks;                         // blob(65535)  blob
     public $person_table;                    // string(64)
-    
+    public $dupe_id;                    // int(11)
+
     /* the code above is auto generated do not remove the tag below */
     ###END_AUTOCODE
     
@@ -37,19 +38,22 @@ class Pman_Core_DataObjects_Events extends DB_DataObject
     {
         $tn = $this->tableName();
         // if not empty on_table
+        
         if(!empty($q['person_table'])){
             $jt = DB_DataObject::factory($q['person_table']);
+
             
-            if(!array_key_exists("{$jt->tableName()}_id", $this->table())){ // coz we have triiger on mysql...
+            
+            if(!array_key_exists("{$jt->tableName()}_id", $this->tableColumns())){ // coz we have triiger on mysql...
                 
                 $keys = $jt->keys();
             
                 $this->_join = "LEFT JOIN {$jt->tableName()} AS join_person_id_id ON (join_person_id_id.{$keys[0]}=Events.person_id)";
+                
                 $this->selectAdd();
                 $this->selectAs();
 
                 $this->selectAs($jt, 'person_id_%s', 'join_person_id_id');
-
                 if (method_exists($jt,'nameColumn')) {
                     $this->selectAdd("join_person_id_id.{$jt->nameColumn()} as person_id_name");
                 }
@@ -61,19 +65,20 @@ class Pman_Core_DataObjects_Events extends DB_DataObject
             }
         
         } else {
-            $person = 'Person';
+            
+            $person = $au->tableName(); //'Person';  -- projects may not use person as the auth table...
             $cfg = HTML_FlexyFramework::get()->Pman;
             if (!empty($cfg['authTable'])) {
                 $person =$cfg['authTable'];
             }
             
             $jt = DB_DataObject::factory($person);
-            $this->whereAdd("
-                    person_table  = '{$jt->tableName()}'
-                    OR
-                    person_table = ''
-                    OR person_table IS NULL"
-            ); // default to  our standard.. - unless otherwise requested..
+            //$this->whereAdd("
+            //        person_table  = '{$jt->tableName()}'
+            //        OR
+            //        person_table = ''
+            //        OR person_table IS NULL"
+            //); // default to  our standard.. - unless otherwise requested..
         }
         
         
@@ -85,6 +90,11 @@ class Pman_Core_DataObjects_Events extends DB_DataObject
             $dt = date('Y-m-d' , strtotime($q['query']['to']));
             $this->whereAdd(" {$tn}.event_when <=  '$dt' ");
         }
+        
+        if(!empty($q['_with_dupe_count'])){
+            $this->dupe_id = 0;                                   
+            $this->selectAdd("(select count(*)+1 from Events ev_cnt where ev_cnt.dupe_id = {$tn}.id) as dupe_count");
+        }
         /*
         if (!empty($q['query']['grouped']) && $q['query']['grouped'] == 'gr') {
             // grouped..
@@ -96,12 +106,6 @@ class Pman_Core_DataObjects_Events extends DB_DataObject
         }
         */
         
-        if (!$au->hasPerm("Admin.Admin_Tab", 'S')) {
-            //DB_DataObject::DebugLevel(1);
-            // they can only view their changes..
-            $this->person_id = $au->id;
-            
-        }
         // _join = tablename,tablename...
         
         /// on_table=cohead
@@ -114,9 +118,7 @@ class Pman_Core_DataObjects_Events extends DB_DataObject
             // empty ontable queries.. these are valid..
             $this->whereAdd("$tn.on_table = ''");
         }
-        
-        
-        
+      
         if (isset($q['query']['person_sum'])) {
             //DB_DataObject::debugLevel(1);
             $this->_extra_cols = array('qty' );
@@ -147,7 +149,7 @@ class Pman_Core_DataObjects_Events extends DB_DataObject
             //DB_DataObject::DebugLevel(1);
             $joins = explode(',',$q['_join']);
             
-            $this->selectAdd(); // ???
+            //$this->selectAdd(); // ??? << this wipes out the default options
             $distinct = false;
             
             foreach($joins as $t) {
@@ -157,13 +159,14 @@ class Pman_Core_DataObjects_Events extends DB_DataObject
                     continue;
                 }
                 $jtn = $x->tableName();
-                $jk = array_shift($x->keys());
+                $jks = $x->keys();
+                $jk = array_shift($jks);
                 $this->_join .= "
                 
                     LEFT JOIN {$jtn} as join_on_id_{$jtn} ON {$tn}.on_id = join_on_id_{$jtn}.{$jk}
                         AND on_table = '{$jtn}'
                 ";
-                $keys = array_keys($x->table());
+                $keys = array_keys($x->tableColumns());
                 if (isset($q['_join_cols'])) {
                     $jcs = explode(',',$q['_join_cols'] );
                     //DB_DataObject::DebugLevel(1);
@@ -207,8 +210,9 @@ class Pman_Core_DataObjects_Events extends DB_DataObject
             if (!$obj) {
                 $roo->jerr("ontable is invalid");
             }
+            
             if (!method_exists($obj,'relatedWhere')) {
-                $roo->jerr( $q['_related_on_table'] . " Does not have method relatedWhere :" .
+                $roo->jerr( $q['_related_on_table'] . " Does not have method relatedWhere  or relatedEventsWhere:" .
                            implode(',', get_class_methods($obj)));
             }
             if ($obj && method_exists($obj,'relatedWhere')) {
@@ -232,11 +236,10 @@ class Pman_Core_DataObjects_Events extends DB_DataObject
                 $this->whereAdd(implode(' OR ' , $w));
             }
             
-            
-            
-            
+         
             
         }
+        
         // since roo does not support autojoin yet..
         if (!isset($q['_distinct'])) {
             //$this->autoJoinExtra();
@@ -253,8 +256,16 @@ class Pman_Core_DataObjects_Events extends DB_DataObject
         } 
         
     }
-      
     
+    function applyPermissionFilters($q, $au ,$roo)
+    {
+        if (!$au->hasPerm("Admin.Admin_Tab", 'S')) {
+            //DB_DataObject::DebugLevel(1);
+            // they can only view their changes..
+            $this->whereAdd("($tn.person_id = {$au->id} OR $tn.person_id = 0)");
+//            $this->person_id = $au->id;
+        }
+    }
     
     /**
      * check who is trying to access this. false == access denied..
@@ -297,24 +308,27 @@ class Pman_Core_DataObjects_Events extends DB_DataObject
         $ff = HTML_FlexyFramework::get();
         $pg = $ff->page;
         $au = $pg->getAuthUser();
-        
+
         if ($ff->cli) { // && empty($au) && isset($obj->person_id)) {
             $au = false;
            // $au = DB_DataObject::Factory('Person'); // not always a person..
            // $au->get($obj->person_id);
         } 
-          
+
         $this->person_name = $au && !empty($au->name) ? $au->name : '';
+        //print_r($au);
+        //exit;
+        //$this->who = $au && !empty($au->name) ? $au->name : '';
         if (empty($au) || (isset($au->id) && empty($au->id))) {
             // not authenticated - and a standard id based object
             $this->person_id = 0;
         } else {
             $col = $au->tableName() == "Person" ? 'person_id' : $au->tableName() . '_id';
             // does $col exist?
-            $cols = $this->table();
+            $cols = $this->tableColumns();
             $col = isset($cols[$col]) ? $col : 'person_id'; // for BC.... - revert to using person_id
             $this->{$col} = $au->pid();
-            //$this->person_id = $au ? (!empty($au->id) ? $au->id : $au->pid()) : -1;
+            //$this->person_id = $au ? (!empty($au->id) ? $au->id : $au->pid()) : -1;            
         }
         $this->person_table = $au ? $au->tableName() : '';
         $this->ipaddr = isset($_SERVER["REMOTE_ADDR"]) ? $_SERVER["REMOTE_ADDR"] : 'cli';
@@ -329,9 +343,15 @@ class Pman_Core_DataObjects_Events extends DB_DataObject
         $rem  = array();
         // should this really go in remarks? - 
         if ($obj && method_exists($obj,'toEventString')) {
-            $rem[] = $obj->toEventString() ;
+            if($obj->toEventString() !== false){
+                $rem[] = $obj->toEventString();
+            }
+        }
+        
+        if(!empty($remarks)){
+            $rem[] = $remarks;
         }
-        $rem[] = $remarks;
+        
         $this->remarks = implode(' : ', $rem);
     }
     
@@ -351,7 +371,7 @@ class Pman_Core_DataObjects_Events extends DB_DataObject
         }
          
         $ret = 0;
-        foreach(array_keys($new->table()) as $k) {
+        foreach(array_keys($new->tableColumns()) as $k) {
             // should we JSON serialize this?
             $n = empty($new->$k) ? '' : $new->$k;
             $o = empty($old->$k) || empty($old->$k) ? '' : $old->$k;
@@ -409,7 +429,7 @@ class Pman_Core_DataObjects_Events extends DB_DataObject
             if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
                 $this->ipaddr = $_SERVER['HTTP_X_FORWARDED_FOR'];
             }
-        }
+        }        
     }
     
     function beforeUpdate($old, $request,$roo)
@@ -450,26 +470,79 @@ class Pman_Core_DataObjects_Events extends DB_DataObject
         self::$deleted[] = $del;
         return true;
     }
+    static $extra_data = false;
+    
+    static function writeEventLogExtra($data) {
+        self::$extra_data = $data;
+    }
+    static $files = array();
+    
+    /**
+     * Add a file to the output log
+     * this needs to be called before addEvent, and the data format should be the same as $_FILES
+     * eg.
+     * 
+     * DB_DataObject::factory('Events')->addFile(array(
+     *    'tmp_name' => real file location
+     *    'name' => real file name
+     *    'type' => mimetype
+     *    'size' => filesize
+     *    
+     * ))
+     * 
+     */
+    function addFile($data)
+    {
+        self::$files[] = $data;
+    }
     
-    function writeEventLog($extra_data  = '')
+    function logDir($user = false)
     {
         $ff  = HTML_FlexyFramework::get();
-        if (empty($ff->Pman['event_log_dir'])) {
+        if ($user === false) {
+            if (function_exists('posix_getpwuid')) {
+                $uinfo = posix_getpwuid( posix_getuid () ); 
+             
+                $user = $uinfo['name'];
+            } else {
+                $user = getenv('USERNAME'); // windows.
+            }
+        } 
+        
+   
+        if (!empty($ff->Pman['storedir'])) {
+            return $ff->Pman['storedir'] .'/Events/'.$user;
+        }
+        // DEPRICATED... 
+        if (!empty($ff->Pman['event_log_dir'])) {
+            return $ff->Pman['event_log_dir'] . '/'.$user;
+        }
+        
+        return false;
+    }
+    
+    
+    
+    function writeEventLog($extra_data  = false)
+    {
+        $logdir = $this->logDir();
+        
+        if (!$logdir) {
             return false;
         }
         
-        // add user (eg. www-data or local user if not..)
-        if (function_exists('posix_getpwuid')) {
-            $uinfo = posix_getpwuid( posix_getuid () ); 
          
-            $user = $uinfo['name'];
-        } else {
-            $user = getenv('USERNAME'); // windows.
-        }
         //print_r($this);
-        $file = $ff->Pman['event_log_dir']. '/'. $user. date('/Y/m/d/'). $this->id . ".json";
+        $file = $logdir.  date('/Y/m/d/'). $this->id . ".json";
         if (!file_exists(dirname($file))) {
-            mkdir(dirname($file),0700,true);
+            
+            @mkdir(dirname($file),0700,true); // this might fail if it does not have correct permissions..
+            clearstatcache();
+            if (!file_exists(dirname($file))) {
+                //print_r($this);
+                die("Events:: writeEventLog: could not create $file - permissons are not correct\n"); // fatal, otherwise we loop!?
+            }
+            
         }
         
         // Remove all the password from logs...
@@ -483,9 +556,10 @@ class Pman_Core_DataObjects_Events extends DB_DataObject
         
         $i=0;
         $files = array();
+          
          
-        $i = 0;
-        foreach ($_FILES as $k=>$f){
+        
+        foreach (array_merge($_FILES, self::$files) as $k=>$f){
             // does not handle any other file[] arrary very well..
             if (empty($f['tmp_name']) || !file_exists($f['tmp_name'])) {
                 continue;
@@ -495,11 +569,14 @@ class Pman_Core_DataObjects_Events extends DB_DataObject
             
              
             $files[$k]['tmp_name'] =  $this->id . '-'. $i;
-            $nf = $ff->Pman['event_log_dir']. '/'. $user. date('/Y/m/d/').   $files[$k]['tmp_name']; 
+            $nf = $logdir .   date('/Y/m/d/').   $files[$k]['tmp_name']; 
             if (!copy($f['tmp_name'], $nf)) {
                 print_r("failed to copy {$f['tmp_name']}...\n");
             }
         }
+        
+        
+        
         $out = array(
             'REQUEST_URI' => empty($_SERVER['REQUEST_URI']) ? 'cli' : $_SERVER['REQUEST_URI'],
             'HTTP_USER_AGENT' => empty($_SERVER['HTTP_USER_AGENT']) ? '' : $_SERVER['HTTP_USER_AGENT'],
@@ -511,9 +588,22 @@ class Pman_Core_DataObjects_Events extends DB_DataObject
         if (!empty(self::$deleted)) {
             $out['DELETED_DATAOBJECTS'] = self::$deleted;
         }
-        if (!empty($extra_data)) {
+        if ($extra_data !== false) {
             $out['EXTRA'] = $extra_data;
         }
+        if ( self::$extra_data !== false) {
+            $out['EXTRA_DATA'] =  self::$extra_data;
+        }
+        $total_data = 0;
+        foreach($out as $k=>$v) {
+            if (!empty($v) && $k != 'REQUEST_URI') {
+                $total_data++;
+            }
+        }
+        if (!$total_data) {
+            return; // do not write an empty file with no usefull info.
+        }
+        
         
         file_put_contents($file, json_encode($out));
         
@@ -567,24 +657,23 @@ class Pman_Core_DataObjects_Events extends DB_DataObject
     
     function retrieveEventLog()
     {
-        $ff  = HTML_FlexyFramework::get();
-        if (empty($ff->Pman['event_log_dir'])) {
+
+        $logdir = $this->logDir();
+        if (!$logdir) {
             return false;
-        }
-        
-        if (function_exists('posix_getpwuid')) {
-            $uinfo = posix_getpwuid( posix_getuid () ); 
          
-            $user = $uinfo['name'];
-        } else {
-            $user = getenv('USERNAME'); // windows.
         }
         
         $date = date('/Y/m/d/', strtotime($this->event_when));
         
-        $file = $ff->Pman['event_log_dir']. '/'. $user. $date. $this->id . ".json";
-        if (!file_exists(dirname($file))) {
-            return false;
+        $file = $logdir. $date. $this->id . ".json";
+        if (!file_exists($file)) {
+            
+            // try looking www-dir..
+            $file = $this->logDir('www-data'). $date. $this->id . ".json";
+            if (!file_exists($file)) {   
+                return false;
+            }
         }
         
         return $file;
@@ -622,6 +711,8 @@ class Pman_Core_DataObjects_Events extends DB_DataObject
                 $restored[$d['_table']] = array();
             }
             
+            $restored[$d['_table']][] = $d['id'];
+            
             $table = DB_DataObject::factory($d['_table']);
             
             if (!is_a($table,'DB_DataObject')) {
@@ -631,15 +722,41 @@ class Pman_Core_DataObjects_Events extends DB_DataObject
             unset($d['_table']);
             
             $table->setFrom($d);
+            
+            /*
+             * need to use the old id
+             */
             $table->id = $d['id'];
             
             $table->sequenceKey(false,false);
             
             $table->insert();
-             
+            
+            if($table->tableName() == 'crm_mailing_list_member'){
+                $ml = DB_DataObject::factory('crm_mailing_list');
+                if(!$ml->get($table->mailing_list_id)){
+                    continue;
+                }
+
+                $mlm = DB_DataObject::factory('crm_mailing_list_member');
+                $mlm->setFrom(array(
+                    'mailing_list_id' => $table->mailing_list_id,
+                    'is_active' => 1
+                ));
+
+                $o = clone($ml);
+                $ml->no_members = $mlm->count();
+                $ml->update($o);
+            }
         }
         
-        
+        $roo->jok('RESTORE');
+    }
+    function selectAddPersonEmail()
+    {
+        $this->selectAdd('join_person_id_id.email as email');
         
     }
+    
+    
 }