fix #8131 - chinese translations
[Pman.Core] / UpdateDatabase.php
index ea5625a..6973f56 100644 (file)
@@ -67,12 +67,24 @@ class Pman_Core_UpdateDatabase extends Pman
             'min' => 1,
             'max' => 1,
         ),
+        'skip-email-import' => array(
+            'desc' => 'Skip email import',
+            'default' => '',
+            'min' => 1,
+            'max' => 1,
+        ),
         'procedures-only' => array(
             'desc' => 'Only import procedures (not supported by most modules yet) - ignores sql directory',
             'default' => '',
             'min' => 1,
             'max' => 1,
         ),
+        'disable-create-triggers' => array(
+            'desc' => 'So not create the mysql triggers',
+            'default' => '',
+            'min' => 1,
+            'max' => 1,
+        ),
         
         'json-person' => array(
             'desc' => 'Person JSON file',
@@ -90,7 +102,7 @@ class Pman_Core_UpdateDatabase extends Pman
             
         ),
     );
-    
+  
     static function cli_opts()
     {
         
@@ -113,7 +125,6 @@ class Pman_Core_UpdateDatabase extends Pman
                   
                 $ret = array_merge($ret, $cls->getStaticPropertyValue('cli_opts'));
             }
-            
         }
         
         return $ret;
@@ -129,13 +140,30 @@ class Pman_Core_UpdateDatabase extends Pman
     
     var $emailTemplates = array(
         'EVENT_ERRORS_REPORT' => array(
+            'bcc_group' => 'Empty Group',
             'test_class' => 'Pman/Admin/Report/SendEventErrors',
             'to_group' => 'Administrators',
             'active' => 1,
-            'description' => '9. System Error Messages'
+            'description' => '9.2 System Error Messages',
+            'template_dir' => '/Pman/Admin/templates/mail/'
+        ),
+         'ADMIN_PASSWORD_RESET' => array(
+            'bcc_group' => 'Administrators',
+            'test_class' => 'Pman/Core/DataObjects/Core_person',
+            'to_group' => '',
+            'active' => 1,
+            'description' => '9.1 Management System Password Reset',
+            'template_dir' => '/Pman/Core/templates/mail/'
         )
     );
     
+    var $required_extensions = array(
+        'curl',
+        'gd',
+        'mbstring'
+    );
+    
     function getAuth() {
         
         
@@ -148,7 +176,7 @@ class Pman_Core_UpdateDatabase extends Pman
         parent::getAuth(); // load company!
         $au = $this->getAuthUser();
         if (!$au || $au->company()->comptype != 'OWNER') {
-            $this->jerr("Not authenticated", array('authFailure' => true));
+            $this->jerror("LOGIN-NOAUTH", "Not authenticated", array('authFailure' => true));
         }
         $this->authUser = $au;
         return true;
@@ -156,12 +184,11 @@ class Pman_Core_UpdateDatabase extends Pman
     
     function get($args, $opts=array())
     {
-         
         PEAR::setErrorHandling(PEAR_ERROR_CALLBACK, array($this, 'onPearError'));
    
         $this->checkSystem();
         
-        $this->verifyExtensions(array('curl'));
+        $this->verifyExtensions($this->required_extensions);
         
         if (class_exists('PDO_DataObjects_Introspection')) {
             PDO_DataObject_Introspection::$cache = array();
@@ -193,27 +220,49 @@ class Pman_Core_UpdateDatabase extends Pman
         }
         
         // ask all the modules to verify the opts
-        echo "Checi options\n";
+        echo "Checking options\n";
         $this->checkOpts($opts);
         
-          
+        $response = $this->curl("http://localhost{$this->local_base_url}/Core/UpdateDatabase/VerifyExtensions");
+        $json = json_decode($response, true);
+        
+        if(empty($json['data']) || $json['data'] != 'DONE'){
+            echo "\nError: Missing php extensions:\n";
+            print_r($response);
+            echo "Please install the above extensions and restart the apache.\n";
+            sleep(5);
+            
+            //exit;
+        }
+        
+        echo "Checking Setup Requirements\n";
+        require_once 'Pman/Core/UpdateDatabase/VerifyConfig.php';
+        $sq = new Pman_Core_UpdateDatabase_VerifyConfig();
+        $ret = $sq->get($args, $opts);
+        
+        if(!empty($ret)){
+            echo implode("\n", $ret) . "\n";
+            sleep(30);
+        }
         
         // do this first, so the innodb change + utf8 fixes column max sizes
         
         // this will trigger errors about freetext indexes - we will have to remove them manually.?
         // otherwise we need to do an sql query to find them, then remove them (not really worth it as it only affects really old code..)
-        
+        echo "Run extensions\n";
+
         $this->runExtensions(); 
 
         
         if (empty($opts['data-only'])) {
+            echo "Import SQL\n";
             $this->importSQL();
         }
         if (!empty($opts['only-module-sql'])) {
             return;
         }
         
-        
+        echo "run Update Modules Data\n";
 
         $this->runUpdateModulesData();
         
@@ -228,6 +277,12 @@ class Pman_Core_UpdateDatabase extends Pman
         $this->clearApacheDataobjectsCache();
         
         $this->clearApacheAssetCache();
+        
+        
+        
+        
+        
+        
     }
     
     function output() {
@@ -443,6 +498,7 @@ class Pman_Core_UpdateDatabase extends Pman
            
         $mysql_cmd = $mysql .
             ' -h ' . $dburl['host'] .
+            (empty($dburl['port']) ? '' : " -P{$dburl['port']} ") .
             ' -u' . escapeshellarg($dburl['user']) .
             (!empty($dburl['pass']) ? ' -p' . escapeshellarg($dburl['pass'])  :  '') .
             ' ' . basename($dburl['path']);
@@ -557,7 +613,10 @@ class Pman_Core_UpdateDatabase extends Pman
                 $extra[]  =   "create sequence {$tbl}_seq;";
               
             }
-            
+            if ($tbl && preg_match('#engine=\S+#i',  $l, $m)) {
+                $l = preg_replace('#engine=\S+#i', '', $l);
+                
+            }
             if (preg_match('#alter\s+table\s+(\`[a-z0-9_]+\`)#i',  $l, $m)){
                 $l = preg_replace('#alter\s+table\s+(\`[a-z0-9_]+\`)#i', "ALTER TABLE {$tbl}", $l);
             }
@@ -711,6 +770,7 @@ class Pman_Core_UpdateDatabase extends Pman
             if(!method_exists($x, 'updateData')){
                 continue;
             };
+            $x->rootDir =  $this->rootDir;
             echo "$module\n";
             $x->updateData();
         }
@@ -793,16 +853,27 @@ class Pman_Core_UpdateDatabase extends Pman
             array(
                 'name' => 'bcc-email', // group who are bcc'ed on all requests.
                 'type' => 0, // system
+                'is_system' => 1,
+                'display_name' => 'Standard BCC Group'
             ),
             array(
                 'name' => 'system-email-from',
                 'type' => 0, // system
+                'is_system' => 1,
+                'display_name' => 'Standard System Email From Group'
             ),
             array(
                 'name' => 'core-person-signup-bcc',
                 'type' => 0, // system
+                'is_system' => 1,
+                'display_name' => 'Standard Person Signup BCC Group'
             ),
-        
+            array(
+                'name' => 'Empty Group', // use for no bcc emails.
+                'type' => 0,
+                'is_system' => 1,
+                'display_name' => 'Standard Empty Group'
+            )
 
         ));
         
@@ -815,17 +886,21 @@ class Pman_Core_UpdateDatabase extends Pman
         $c = DB_DataObject::Factory('core_company');
         $c->selectAdd();
         $c->selectAdd('distinct(comptype) as comptype');
-        $c->whereAdd("comptype != ''");
+        $c->whereAdd("
+                comptype != '' 
+            AND 
+                comptype != 'undefined' 
+            AND 
+                comptype != 'undefine'
+        ");
         
         $ctb = array();
         foreach($c->fetchAll('comptype') as $cts) {
             
-            
-            
-           $ctb[]= array( 'etype'=>'COMPTYPE', 'name' => $cts, 'display_name' => ucfirst(strtolower($cts)));
+            $ctb[]= array( 'etype'=>'COMPTYPE', 'name' => $cts, 'display_name' => ucfirst(strtolower($cts)));
         
         }
-         $c = DB_DataObject::Factory('core_enum');
+        $c = DB_DataObject::Factory('core_enum');
          
         $c->initEnums($ctb);
         //DB_DataObject::debugLevel(1);
@@ -847,6 +922,20 @@ class Pman_Core_UpdateDatabase extends Pman
         
     }
     
+    function updateDataEmails()
+    {
+        if (!empty($this->opts['skip-email-import'])) {
+            return;
+        }
+        foreach ($this->emailTemplates as $k => $mail) {
+            
+            $this->initEmails(
+                !empty($mail['template_dir']) ? "{$this->rootDir}{$mail['template_dir']}" : '',
+                array($k => $mail),
+                false
+            );
+        }
+    }
     
     function initEmails($templateDir, $emails, $mapping = false)
     {
@@ -862,13 +951,14 @@ class Pman_Core_UpdateDatabase extends Pman
                 if (empty($data['bcc_group'])) {
                     $this->jerr("missing bcc_group for template $name");
                 }
+                
                 $g = DB_DataObject::Factory('core_group')->lookup('name',$data['bcc_group']);
                 
-                if (empty($g->id)) {
+                if (empty($g->id)) { // Admin group as bcc will not have any member at initialization.
                     $this->jerr("bcc_group {$data['bcc_group']} does not exist when importing template $name");
                 }
                 
-                if (!$g->members('email')) {
+                if (!$g->members('email') && $g->name != 'Empty Group' &&  $g->name != 'Administrators') {
                     $this->jerr("bcc_group {$data['bcc_group']} does not have any members");
                 }
                 
@@ -905,7 +995,11 @@ class Pman_Core_UpdateDatabase extends Pman
                 $cm->active = $data['active'];
             }
             
-            if(!empty($data['description'])){
+            /*
+             * Set description to email.
+             * However we do not update if it is been set.
+             */
+            if(empty($cm->description) && !empty($data['description'])){
                 $cm->description = $cm->escape($data['description']);
             }
             
@@ -936,9 +1030,14 @@ class Pman_Core_UpdateDatabase extends Pman
             
             $opts = array(
                 'update' => 1,
-                'file' => $templateDir. $name .'.html'
             );
-            
+            if (!empty($templateDir)) {
+                $opts['file'] = $templateDir. $name .'.html';
+            }
+            if (!empty($data['raw_content'])) {
+                $opts['raw_content'] = $data['raw_content'];
+                $opts['name'] = $name;
+            }
             if (!empty($data['master'])) {
                 $opts['master'] = $templateDir . $master .'.html';
             }
@@ -960,17 +1059,14 @@ class Pman_Core_UpdateDatabase extends Pman
         }
         HTML_FlexyFramework::get()->generateDataobjectsCache(true);
         
-         
         $this->updateDataEnums();
         $this->updateDataGroups();
         $this->updateDataCompanies();
         
+        $this->updateDataEmails();
+        
         $c = DB_DataObject::Factory('I18n');
         $c->buildDB();
-         
-       
-        
-        
     }
     
     function fixMysqlInnodb()
@@ -1013,7 +1109,9 @@ class Pman_Core_UpdateDatabase extends Pman
                     in_array('STRICT_TRANS_TABLES', $modes) || 
                     !in_array('ALLOW_INVALID_DATES', $modes)
             ){
-                die("Error: set sql_mode include 'ALLOW_INVALID_DATES', remove 'NO_ZERO_IN_DATE' AND 'STRICT_TRANS_TABLES' AND 'NO_ZERO_DATE' in my.cnf\n\n");
+                die("Error: set sql_mode include 'ALLOW_INVALID_DATES', remove 'NO_ZERO_IN_DATE' AND 'STRICT_TRANS_TABLES' AND 'NO_ZERO_DATE' in my.cnf\n\n".
+                    "Recommended line: \n\nsql_mode = ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION,ALLOW_INVALID_DATES\n\n"
+                );
             }
         }
         
@@ -1131,15 +1229,18 @@ class Pman_Core_UpdateDatabase extends Pman
         $dburl = parse_url($ff->database);
         
         $dbtype = $dburl['scheme'];
-       
+        $dbtype  = ($dbtype == 'mysqli') ? 'mysql' : $dbtype;
+        
         foreach($this->extensions as $ext) {
        
             $scls = ucfirst($dbtype). $ext;
             $cls = __CLASS__ . '_'. $scls;
             $fn = implode('/',explode('_', $cls)).'.php';
+            
             if (!file_exists(__DIR__.'/UpdateDatabase/'. $scls .'.php')) {
                 return;
             }
+            echo "Running : {$fn}\n";
             require_once $fn;
             $c = new $cls();
             
@@ -1161,20 +1262,20 @@ class Pman_Core_UpdateDatabase extends Pman
             'pdftoppm',
             'rsvg-convert',  //librsvg2-bin
             'strings',
-            'oathtool'
+            'oathtool',
+            'gifsicle', // used for gif conversions
         );
          
-         
-         
+          
         // these are prefered - but may have complicated depenacies
         $pref = $pref !== false ? $pref :  array(
             'abiword',
-            'faad',
+            //'faad',
             'ffmpeg',
             'html2text', // not availabe in debian squeeze
             'pdftocairo',  //poppler-utils - not available in debian squeeze.
 
-            'lame',
+            //'lame',
             'ssconvert',
             'unoconv',
             'wkhtmltopdf',
@@ -1207,16 +1308,20 @@ class Pman_Core_UpdateDatabase extends Pman
     
     function clearApacheDataobjectsCache()
     {
-        echo "Clearing Database Cache\n";
+        
         // this needs to clear it's own cache along with remote one..
   
+        $url = "http://localhost{$this->local_base_url}/Core/RefreshDatabaseCache";
         
-        $response = $this->curl("http://localhost{$this->local_base_url}/Core/RefreshDatabaseCache");
+        echo "Clearing Database Cache : http://localhost{$this->local_base_url}/Core/RefreshDatabaseCache\n";
+        
+        $response = $this->curl($url);
         
         $json = json_decode($response, true);
         
         if(empty($json['data']) || $json['data'] != 'DONE'){
-            echo $response. "\n";
+            echo "fetching $url\n";
+            echo "GOT:" . $response. "\n";
             echo "Clear DataObjects Cache failed\n";
             exit;
         }
@@ -1226,7 +1331,7 @@ class Pman_Core_UpdateDatabase extends Pman
     
     function clearApacheAssetCache()
     {
-        echo "Clearing Asset Cache\n";
+        echo "Clearing Asset Cache : http://localhost{$this->local_base_url}/Core/Asset\n";
         $response = $this->curl(
             "http://localhost{$this->local_base_url}/Core/Asset",
             array( '_clear_cache' => 1 ,'returnHTML' => 'NO' ),
@@ -1283,7 +1388,7 @@ class Pman_Core_UpdateDatabase extends Pman
         
         foreach ($extensions as $e){
             
-            if(extension_loaded($e)) {
+            if(empty($e) || extension_loaded($e)) {
                 continue;
             }