Esempio n. 1
0
 public function rebuildCache($user_id, $force = false)
 {
     $lastBuildTime = $force ? 0 : \GO::config()->get_setting('files_shared_cache_ctime', $user_id);
     if (!$lastBuildTime || $this->_getLastMtime($user_id) > $lastBuildTime) {
         $home = \GO\Files\Model\Folder::model()->findHomeFolder(GO::user());
         $homeFolder = $home->path;
         \GO::debug("Rebuilding shared cache");
         $this->deleteByAttribute('user_id', $user_id);
         $stmt = $this->_findShares($user_id);
         //sort by path and only list top level shares
         $shares = array();
         while ($folder = $stmt->fetch()) {
             //$folder->checkFsSync();
             //sort by path and only list top level shares
             $shares[$folder->path] = $folder;
         }
         ksort($shares);
         foreach ($shares as $path => $folder) {
             $isSubDir = isset($lastPath) && strpos($path . '/', $lastPath . '/') === 0;
             $isInHome = strpos($path . '/', $homeFolder . '/') === 0;
             if (!$isSubDir && !$isInHome) {
                 $sharedRoot = new SharedRootFolder();
                 $sharedRoot->user_id = $user_id;
                 $sharedRoot->folder_id = $folder->id;
                 $sharedRoot->save();
                 $lastPath = $path;
             }
         }
         \GO::config()->save_setting('files_shared_cache_ctime', time(), $user_id);
         return time();
     } else {
         return $lastBuildTime;
     }
 }
Esempio n. 2
0
 private function _getLastMtime($user_id)
 {
     Folder::model()->addRelation('aclItem', array("type" => self::BELONGS_TO, "model" => "GO\\Base\\Model\\Acl", "field" => 'acl_id'));
     $findParams = \GO\Base\Db\FindParams::newInstance()->debugSql()->select("max(a.mtime) AS mtime")->single()->joinModel(array('model' => "GO\\Base\\Model\\Acl", 'localField' => 'acl_id', 'tableAlias' => 'a'));
     $findParams->getCriteria()->addModel(Folder::model())->addCondition('visible', 1);
     //						->addCondition('user_id', $user_id, '!=');
     $result = Folder::model()->find($findParams);
     return $result->mtime;
 }
Esempio n. 3
0
 /**
  * Returns an array with all the child nodes
  *
  * @return Sabre\DAV\INode[]
  */
 public function getChildren()
 {
     \GO::debug('Shared::getChildren()');
     $shares = \GO\Files\Model\Folder::model()->getTopLevelShares(\GO\Base\Db\FindParams::newInstance()->limit(100));
     $nodes = array();
     foreach ($shares as $folder) {
         $nodes[] = new \GO\DAV\FS\Directory($folder->path);
     }
     return $nodes;
 }
Esempio n. 4
0
 protected function beforeSubmit(&$response, &$model, &$params)
 {
     // See if folder with this ID can be accessed.
     $folderModel = \GO\Files\Model\Folder::model()->findByPk($params['folder_id']);
     if (empty($folderModel)) {
         return false;
     }
     $params['user_id'] = $model->user_id = \GO::user()->id;
     $response['user_id'] = \GO::user()->id;
     $response['folder_id'] = $folderModel->id;
     return parent::beforeSubmit($params, $folderModel, $params);
 }
Esempio n. 5
0
 public function __construct($prefixString = '')
 {
     if (!\GO::modules()->isInstalled('files')) {
         throw new \Exception('The current action requires the files module to be activated for the current user.');
     }
     // Make sure the current user's folder exists.
     $userFolderModel = \GO\Files\Model\Folder::model()->findHomeFolder(\GO::user());
     if (empty($userFolderModel)) {
         $userFolder = new \GO\Base\Fs\Folder(\GO::config()->file_storage_path . 'users/' . \GO::user()->username);
         $userFolder->create();
         $userFolderModel = new \GO\Files\Model\Folder();
         $userFolderModel->findByPath('users/' . \GO::user()->username, true);
     }
     parent::__construct(\GO::config()->file_storage_path . $userFolderModel->path . '/' . $prefixString . \GO\Base\Util\Date::get_timestamp(time(), true) . '.log');
 }
Esempio n. 6
0
 protected function actionCreateFile($params)
 {
     $filename = \GO\Base\Fs\File::stripInvalidChars($params['filename']);
     if (empty($filename)) {
         throw new \Exception("Filename can not be empty");
     }
     $template = \GO\Files\Model\Template::model()->findByPk($params['template_id']);
     $folder = \GO\Files\Model\Folder::model()->findByPk($params['folder_id']);
     $path = \GO::config()->file_storage_path . $folder->path . '/' . $filename;
     if (!empty($template->extension)) {
         $path .= '.' . $template->extension;
     }
     $fsFile = new \GO\Base\Fs\File($path);
     $fsFile->putContents($template->content);
     $fileModel = \GO\Files\Model\File::importFromFilesystem($fsFile);
     if (!$fileModel) {
         throw new Exception("Could not create file");
     }
     return array('id' => $fileModel->id, 'success' => true);
 }
Esempio n. 7
0
 protected function actionRemoveDuplicates($params)
 {
     if (!\GO::modules()->tools) {
         throw new \GO\Base\Exception\AccessDenied();
     }
     \GO::session()->runAsRoot();
     \GO\Base\Fs\File::setAllowDeletes(false);
     //VERY IMPORTANT:
     \GO\Files\Model\Folder::$deleteInDatabaseOnly = true;
     \GO\Files\Model\File::$deleteInDatabaseOnly = true;
     $this->lockAction();
     \GO::session()->closeWriting();
     //close writing otherwise concurrent requests are blocked.
     $checkModels = array("GO\\Calendar\\Model\\Event" => array('name', 'start_time', 'end_time', 'calendar_id', 'rrule'), "GO\\Tasks\\Model\\Task" => array('name', 'start_time', 'due_time', 'tasklist_id', 'rrule', 'user_id'), "GO\\Addressbook\\Model\\Contact" => array('first_name', 'middle_name', 'last_name', 'addressbook_id', 'company_id', 'email'), "GO\\Files\\Model\\Folder" => array('name', 'parent_id'));
     echo '<p style="color:red;"><font style="font-size:18px;" >Warning: This script only checks for duplicate items on the displayed columns!</font></p>';
     foreach ($checkModels as $modelName => $checkFields) {
         if (empty($params['model']) || $modelName == $params['model']) {
             echo '<h1>' . $modelName . '</h1>';
             $checkFieldsStr = 't.' . implode(', t.', $checkFields);
             $findParams = \GO\Base\Db\FindParams::newInstance()->ignoreAcl()->select('t.id, count(*) AS n, ' . $checkFieldsStr)->group($checkFields)->having('n>1');
             $stmt1 = \GO::getModel($modelName)->find($findParams);
             echo '<table border="1">';
             echo '<tr><td>ID</th><th>' . implode('</th><th>', $checkFields) . '</th></tr>';
             $count = 0;
             while ($dupModel = $stmt1->fetch()) {
                 $select = 't.id';
                 if (\GO::getModel($modelName)->hasFiles()) {
                     $select .= ', t.files_folder_id';
                 }
                 $findParams = \GO\Base\Db\FindParams::newInstance()->ignoreAcl()->select($select . ', ' . $checkFieldsStr)->order('id', 'ASC');
                 $criteria = $findParams->getCriteria();
                 foreach ($checkFields as $field) {
                     $criteria->addCondition($field, $dupModel->getAttribute($field));
                 }
                 $stmt = \GO::getModel($modelName)->find($findParams);
                 $first = true;
                 while ($model = $stmt->fetch()) {
                     echo '<tr><td>';
                     if (!$first) {
                         echo '<span style="color:red">';
                     }
                     echo $model->id;
                     if (!$first) {
                         echo '</span>';
                     }
                     echo '</th>';
                     foreach ($checkFields as $field) {
                         echo '<td>' . $model->getAttribute($field, 'html') . '</td>';
                     }
                     echo '</tr>';
                     if (!$first) {
                         if (!empty($params['delete'])) {
                             if ($model->hasLinks() && $model->countLinks()) {
                                 echo '<tr><td colspan="99">Skipped delete because model has links</td></tr>';
                             } elseif (($filesFolder = $model->getFilesFolder(false)) && ($filesFolder->hasFileChildren() || $filesFolder->hasFolderChildren())) {
                                 echo '<tr><td colspan="99">Skipped delete because model has folder or files</td></tr>';
                             } else {
                                 $model->delete(true);
                             }
                         }
                         $count++;
                     }
                     $first = false;
                 }
             }
             echo '</table>';
             echo '<p>Found ' . $count . ' duplicates</p>';
             echo '<br /><br /><a href="' . \GO::url('maintenance/removeDuplicates', array('delete' => true, 'model' => $modelName)) . '">Click here to delete the newest duplicates marked in red for model ' . $modelName . '.</a>';
         }
     }
     if (empty($params['model'])) {
         echo '<br /><br /><a href="' . \GO::url('maintenance/removeDuplicates', array('delete' => true)) . '">Click here to delete the newest duplicates marked in red.</a>';
     } else {
         echo '<br /><br /><a href="' . \GO::url('maintenance/removeDuplicates') . '">Show all models.</a>';
     }
 }
Esempio n. 8
0
 private function _moveFiles(ActiveRecord $sourceModel)
 {
     if (!$this->hasFiles()) {
         return false;
     }
     $sourceFolder = \GO\Files\Model\Folder::model()->findByPk($sourceModel->files_folder_id);
     if (!$sourceFolder) {
         return false;
     }
     $this->filesFolder->moveContentsFrom($sourceFolder);
 }
Esempio n. 9
0
    protected function actionCreate($params)
    {
        if ($this->isCli()) {
            \GO::session()->runAsRoot();
        } elseif (!\GO::user()->isAdmin()) {
            throw new \GO\Base\Exception\AccessDenied();
        }
        if (\GO::modules()->customfields) {
            $customfieldModels = \GO\Customfields\CustomfieldsModule::getCustomfieldModels();
            $types = \GO\Customfields\CustomfieldsModule::getCustomfieldTypes();
            foreach ($customfieldModels as $model) {
                //				echo $model->getName(),'<br />';
                $category = \GO\Customfields\Model\Category::model()->createIfNotExists(\GO::getModel($model->getName())->extendsModel(), "Demo Custom fields");
                $category->acl->addGroup(\GO::config()->group_internal, \GO\Base\Model\Acl::WRITE_PERMISSION);
                if (strpos(\GO::getModel($model->getName())->extendsModel(), 'Addressbook\\')) {
                    foreach ($types as $t) {
                        \GO\Customfields\Model\Field::model()->createIfNotExists($category->id, $t['type'], array('datatype' => $t['className'], 'helptext' => $t['className'] == "GO\\Customfields\\Customfieldtype\\Text" ? "Some help text for this field" : ""));
                    }
                } else {
                    \GO\Customfields\Model\Field::model()->createIfNotExists($category->id, "Custom", array('datatype' => "GO\\Customfields\\Customfieldtype\\Text", 'helptext' => "Some help text for this field"));
                }
            }
        }
        $addressbook = \GO\Addressbook\Model\Addressbook::model()->findSingleByAttribute('name', \GO::t('customers', 'addressbook'));
        if (!$addressbook) {
            $addressbook = new \GO\Addressbook\Model\Addressbook();
            $addressbook->setAttributes(array('user_id' => 1, 'name' => \GO::t('prospects', 'addressbook'), 'default_salutation' => \GO::t('defaultSalutation', 'addressbook')));
            $addressbook->save();
            $addressbook->acl->addGroup(\GO::config()->group_internal, \GO\Base\Model\Acl::WRITE_PERMISSION);
        }
        $company = \GO\Addressbook\Model\Company::model()->findSingleByAttribute('email', '*****@*****.**');
        if (!$company) {
            $company = new \GO\Addressbook\Model\Company();
            $company->setAttributes(array('addressbook_id' => $addressbook->id, 'name' => 'Smith Inc', 'address' => 'Kalverstraat', 'address_no' => '1', 'zip' => '1012 NX', 'city' => 'Amsterdam', 'state' => 'Noord-Holland', 'country' => 'NL', 'post_address' => 'Kalverstraat', 'post_address_no' => '1', 'post_zip' => '1012 NX', 'post_city' => 'Amsterdam', 'post_state' => 'Noord-Brabant', 'post_country' => 'NL', 'phone' => '+31 (0) 10 - 1234567', 'fax' => '+31 (0) 1234567', 'email' => '*****@*****.**', 'homepage' => 'http://www.smith.demo', 'bank_no' => '', 'vat_no' => 'NL 1234.56.789.B01', 'user_id' => 1, 'comment' => 'Just a demo company'));
            $company->save();
        }
        $john = \GO\Addressbook\Model\Contact::model()->findSingleByAttribute('email', '*****@*****.**');
        if (!$john) {
            $john = new \GO\Addressbook\Model\Contact();
            $john->addressbook_id = $addressbook->id;
            $john->company_id = $company->id;
            $john->salutation = 'Dear Mr. Smith';
            $john->first_name = 'John';
            $john->last_name = 'Smith';
            $john->function = 'CEO';
            $john->cellular = '06-12345678';
            $john->email = '*****@*****.**';
            $john->address = 'Kalverstraat';
            $john->address_no = '1';
            $john->zip = '1012 NX';
            $john->city = 'Amsterdam';
            $john->state = 'Noord-Holland';
            $john->country = 'NL';
            $john->url_facebook = 'http://www.facebook.com';
            $john->url_linkedin = 'http://www.linkedin.com';
            $john->url_twitter = 'http://www.twitter.com';
            $john->skype_name = 'echo123';
            $john->save();
            $john->setPhoto(new \GO\Base\Fs\File(\GO::modules()->addressbook->path . 'install/noperson.jpg'));
            $john->save();
        }
        $acme = \GO\Addressbook\Model\Company::model()->findSingleByAttribute('email', '*****@*****.**');
        if (!$acme) {
            $acme = new \GO\Addressbook\Model\Company();
            $acme->setAttributes(array('addressbook_id' => $addressbook->id, 'name' => 'ACME Corporation', 'address' => '1111 Broadway', 'address_no' => '', 'zip' => '10019', 'city' => 'New York', 'state' => 'NY', 'country' => 'US', 'post_address' => '1111 Broadway', 'post_address_no' => '', 'post_zip' => '10019', 'post_city' => 'New York', 'post_state' => 'NY', 'post_country' => 'US', 'phone' => '(555) 123-4567', 'fax' => '(555) 123-4567', 'email' => '*****@*****.**', 'homepage' => 'http://www.acme.demo', 'bank_no' => '', 'vat_no' => 'US 1234.56.789.B01', 'user_id' => 1, 'comment' => 'The name Acme became popular for businesses by the 1920s, when alphabetized business telephone directories such as the Yellow Pages began to be widespread. There were a flood of businesses named Acme (some of these still survive[1]). For example, early Sears catalogues contained a number of products with the "Acme" trademark, including anvils, which are frequently used in Warner Bros. cartoons.[2]'));
            $acme->save();
            $acme->addComment("The company is never clearly defined in Road Runner cartoons but appears to be a conglomerate which produces every product type imaginable, no matter how elaborate or extravagant - none of which ever work as desired or expected. In the Road Runner cartoon Beep, Beep, it was referred to as \"Acme Rocket-Powered Products, Inc.\" based in Fairfield, New Jersey. Many of its products appear to be produced specifically for Wile E. Coyote; for example, the Acme Giant Rubber Band, subtitled \"(For Tripping Road Runners)\".");
            $acme->addComment("Sometimes, Acme can also send living creatures through the mail, though that isn't done very often. Two examples of this are the Acme Wild-Cat, which had been used on Elmer Fudd and Sam Sheepdog (which doesn't maul its intended victim); and Acme Bumblebees in one-fifth bottles (which sting Wile E. Coyote). The Wild Cat was used in the shorts Don't Give Up the Sheep and A Mutt in a Rut, while the bees were used in the short Zoom and Bored.");
        }
        $wile = \GO\Addressbook\Model\Contact::model()->findSingleByAttribute('email', '*****@*****.**');
        if (!$wile) {
            $wile = new \GO\Addressbook\Model\Contact();
            $wile->addressbook_id = $addressbook->id;
            $wile->company_id = $acme->id;
            $wile->salutation = 'Dear Mr. Coyote';
            $wile->first_name = 'Wile';
            $wile->middle_name = 'E.';
            $wile->last_name = 'Coyote';
            $wile->function = 'CEO';
            $wile->cellular = '06-12345678';
            $wile->email = '*****@*****.**';
            $wile->address = '1111 Broadway';
            $wile->address_no = '';
            $wile->zip = '10019';
            $wile->city = 'New York';
            $wile->state = 'NY';
            $wile->country = 'US';
            $wile->url_facebook = 'http://www.facebook.com';
            $wile->url_linkedin = 'http://www.linkedin.com';
            $wile->url_twitter = 'http://www.twitter.com';
            $wile->skype_name = 'test';
            $wile->save();
            $wile->setPhoto(new \GO\Base\Fs\File(\GO::modules()->addressbook->path . 'install/wecoyote.png'));
            $wile->save();
            $wile->addComment("Wile E. Coyote (also known simply as \"The Coyote\") and The Road Runner are a duo of cartoon characters from a series of Looney Tunes and Merrie Melodies cartoons. The characters (a coyote and Greater Roadrunner) were created by animation director Chuck Jones in 1948 for Warner Bros., while the template for their adventures was the work of writer Michael Maltese. The characters star in a long-running series of theatrical cartoon shorts (the first 16 of which were written by Maltese) and occasional made-for-television cartoons.");
            $wile->addComment("In each episode, instead of animal senses and cunning, Wile E. Coyote uses absurdly complex contraptions (sometimes in the manner of Rube Goldberg) and elaborate plans to pursue his quarry. It was originally meant to parody chase cartoons like Tom and Jerry, but became popular in its own right, much to Jones' chagrin.");
            $file = new \GO\Base\Fs\File(\GO::modules()->addressbook->path . 'install/Demo letter.docx');
            $copy = $file->copy($wile->filesFolder->fsFolder);
            $wile->filesFolder->addFile($copy->name());
        }
        $internalUserGroup = \GO\Base\Model\Group::model()->findByPk(\GO::config()->group_internal);
        \GO::config()->password_validate = false;
        $elmer = \GO\Base\Model\User::model()->findSingleByAttribute('username', 'elmer');
        if (!$elmer) {
            $elmer = new \GO\Base\Model\User();
            $elmer->username = '******';
            $elmer->first_name = 'Elmer';
            $elmer->last_name = 'Fudd';
            $elmer->email = '*****@*****.**';
            $elmer->password = '******';
            if ($elmer->save()) {
                //make sure he's member of the internal group.
                $internalUserGroup->addUser($elmer->id);
                $this->_setUserContact($elmer);
                $elmer->checkDefaultModels();
            } else {
                var_dump($elmer->getValidationErrors());
                exit;
            }
        }
        $demo = \GO\Base\Model\User::model()->findSingleByAttribute('username', 'demo');
        if (!$demo) {
            $demo = new \GO\Base\Model\User();
            $demo->username = '******';
            $demo->first_name = 'Demo';
            $demo->last_name = 'User';
            $demo->email = '*****@*****.**';
            $demo->password = '******';
            if ($demo->save()) {
                //make sure he's member of the internal group.
                $internalUserGroup->addUser($demo->id);
                $this->_setUserContact($demo);
                $demo->checkDefaultModels();
            } else {
                var_dump($demo->getValidationErrors());
                exit;
            }
        }
        $linda = \GO\Base\Model\User::model()->findSingleByAttribute('username', 'linda');
        if (!$linda) {
            $linda = new \GO\Base\Model\User();
            $linda->username = '******';
            $linda->first_name = 'Linda';
            $linda->last_name = 'Smith';
            $linda->email = '*****@*****.**';
            $linda->password = '******';
            if ($linda->save()) {
                //make sure she's member of the internal group.
                $internalUserGroup->addUser($linda->id);
                $this->_setUserContact($linda);
                $linda->checkDefaultModels();
            } else {
                var_dump($linda->getValidationErrors());
                exit;
            }
        }
        if (\GO::modules()->calendar) {
            //share calendars
            \GO\Calendar\Model\Calendar::model()->getDefault($demo)->acl->addGroup(\GO::config()->group_internal, \GO\Base\Model\Acl::READ_PERMISSION);
            \GO\Calendar\Model\Calendar::model()->getDefault($elmer)->acl->addGroup(\GO::config()->group_internal, \GO\Base\Model\Acl::READ_PERMISSION);
            \GO\Calendar\Model\Calendar::model()->getDefault($linda)->acl->addGroup(\GO::config()->group_internal, \GO\Base\Model\Acl::READ_PERMISSION);
            $events = array(array('Project meeting', 10), array('Meet Wile', 12), array('MT Meeting', 14));
            //start on tuesday.
            $time = \GO\Base\Util\Date::date_add(\GO\Base\Util\Date::get_last_sunday(time()), 2);
            foreach ($events as $e) {
                $event = new \GO\Calendar\Model\Event();
                $event->name = $e[0];
                $event->location = "ACME NY Office";
                $event->start_time = \GO\Base\Util\Date::clear_time($time, $e[1]);
                $event->end_time = $event->start_time + 3600;
                $event->user_id = $demo->id;
                $event->calendar_id = \GO\Calendar\Model\Calendar::model()->getDefault($demo)->id;
                $event->save();
                $participant = new \GO\Calendar\Model\Participant();
                $participant->is_organizer = true;
                $participant->setContact($demo->createContact());
                $event->addParticipant($participant);
                $participant = new \GO\Calendar\Model\Participant();
                $participant->setContact($linda->createContact());
                $event->addParticipant($participant);
                $participant = new \GO\Calendar\Model\Participant();
                $participant->setContact($elmer->createContact());
                $event->addParticipant($participant);
                $participant = new \GO\Calendar\Model\Participant();
                $participant->setContact($wile);
                $event->addParticipant($participant);
                $wile->link($event);
            }
            $events = array(array('Project meeting', 11), array('Meet John', 13), array('MT Meeting', 16));
            foreach ($events as $e) {
                $event = new \GO\Calendar\Model\Event();
                $event->name = $e[0];
                $event->location = "ACME NY Office";
                $event->start_time = \GO\Base\Util\Date::date_add(\GO\Base\Util\Date::clear_time($time, $e[1]), 1);
                $event->end_time = $event->start_time + 3600;
                $event->user_id = $linda->id;
                $event->calendar_id = \GO\Calendar\Model\Calendar::model()->getDefault($linda)->id;
                $event->save();
                $participant = new \GO\Calendar\Model\Participant();
                $participant->is_organizer = true;
                $participant->setContact($linda->createContact());
                $event->addParticipant($participant);
                $participant = new \GO\Calendar\Model\Participant();
                $participant->setContact($demo->createContact());
                $event->addParticipant($participant);
                $participant = new \GO\Calendar\Model\Participant();
                $participant->setContact($john);
                $event->addParticipant($participant);
                $john->link($event);
            }
            $events = array(array('Rocket testing', 8), array('Blast impact test', 15), array('Test range extender', 19));
            foreach ($events as $e) {
                $event = new \GO\Calendar\Model\Event();
                $event->name = $e[0];
                $event->location = "ACME Testing fields";
                $event->start_time = \GO\Base\Util\Date::date_add(\GO\Base\Util\Date::clear_time(time(), $e[1]), 1);
                $event->end_time = $event->start_time + 3600;
                $event->user_id = $linda->id;
                $event->calendar_id = \GO\Calendar\Model\Calendar::model()->getDefault($linda)->id;
                $event->save();
                $participant = new \GO\Calendar\Model\Participant();
                $participant->is_organizer = true;
                $participant->setContact($linda->createContact());
                $event->addParticipant($participant);
                $participant = new \GO\Calendar\Model\Participant();
                $participant->setContact($demo->createContact());
                $event->addParticipant($participant);
                $participant = new \GO\Calendar\Model\Participant();
                $participant->setContact($john);
                $event->addParticipant($participant);
                $john->link($event);
            }
            $view = new \GO\Calendar\Model\View();
            $view->name = \GO::t('group_everyone');
            if ($view->save()) {
                $view->addManyMany('groups', \GO::config()->group_everyone);
                //share view
                $view->acl->addGroup(\GO::config()->group_internal);
            }
            $view = new \GO\Calendar\Model\View();
            $view->name = \GO::t('group_everyone') . ' (' . \GO::t('merge', 'calendar') . ')';
            $view->merge = true;
            $view->owncolor = true;
            if ($view->save()) {
                $view->addManyMany('groups', \GO::config()->group_everyone);
                //share view
                $view->acl->addGroup(\GO::config()->group_internal);
            }
            //resource groups
            $resourceGroup = \GO\Calendar\Model\Group::model()->findSingleByAttribute('name', "Meeting rooms");
            if (!$resourceGroup) {
                $resourceGroup = new \GO\Calendar\Model\Group();
                $resourceGroup->name = "Meeting rooms";
                $resourceGroup->save();
                //$resourceGroup->acl->addGroup(\GO::config()->group_internal);
            }
            $resourceCalendar = \GO\Calendar\Model\Calendar::model()->findSingleByAttribute('name', 'Road Runner Room');
            if (!$resourceCalendar) {
                $resourceCalendar = new \GO\Calendar\Model\Calendar();
                $resourceCalendar->group_id = $resourceGroup->id;
                $resourceCalendar->name = 'Road Runner Room';
                $resourceCalendar->save();
                $resourceCalendar->acl->addGroup(\GO::config()->group_internal);
            }
            $resourceCalendar = \GO\Calendar\Model\Calendar::model()->findSingleByAttribute('name', 'Don Coyote Room');
            if (!$resourceCalendar) {
                $resourceCalendar = new \GO\Calendar\Model\Calendar();
                $resourceCalendar->group_id = $resourceGroup->id;
                $resourceCalendar->name = 'Don Coyote Room';
                $resourceCalendar->save();
                $resourceCalendar->acl->addGroup(\GO::config()->group_internal);
            }
            //setup elmer as a resource admin
            $resourceGroup->addManyMany('admins', $elmer->id);
        }
        if (\GO::modules()->tasks) {
            $task = new \GO\Tasks\Model\Task();
            $task->tasklist_id = \GO\Tasks\Model\Tasklist::model()->getDefault($demo)->id;
            $task->name = 'Feed the dog';
            $task->start_time = time();
            $task->due_time = \GO\Base\Util\Date::date_add(time(), 2);
            $task->save();
            $task = new \GO\Tasks\Model\Task();
            $task->tasklist_id = \GO\Tasks\Model\Tasklist::model()->getDefault($linda)->id;
            $task->name = 'Feed the dog';
            $task->start_time = time();
            $task->due_time = \GO\Base\Util\Date::date_add(time(), 1);
            $task->save();
            $task = new \GO\Tasks\Model\Task();
            $task->tasklist_id = \GO\Tasks\Model\Tasklist::model()->getDefault($elmer)->id;
            $task->name = 'Feed the dog';
            $task->start_time = time();
            $task->due_time = \GO\Base\Util\Date::date_add(time(), 1);
            $task->save();
            $task = new \GO\Tasks\Model\Task();
            $task->tasklist_id = \GO\Tasks\Model\Tasklist::model()->getDefault($demo)->id;
            $task->name = 'Prepare meeting';
            $task->start_time = time();
            $task->due_time = \GO\Base\Util\Date::date_add(time(), 1);
            $task->save();
            $task->link($wile);
            $task->link($event);
            $task = new \GO\Tasks\Model\Task();
            $task->tasklist_id = \GO\Tasks\Model\Tasklist::model()->getDefault($linda)->id;
            $task->name = 'Prepare meeting';
            $task->start_time = time();
            $task->due_time = \GO\Base\Util\Date::date_add(time(), 1);
            $task->save();
            $task->link($wile);
            $task->link($event);
            $task = new \GO\Tasks\Model\Task();
            $task->tasklist_id = \GO\Tasks\Model\Tasklist::model()->getDefault($elmer)->id;
            $task->name = 'Prepare meeting';
            $task->start_time = time();
            $task->due_time = \GO\Base\Util\Date::date_add(time(), 1);
            $task->save();
            $task->link($wile);
            $task->link($event);
        }
        if (\GO::modules()->billing) {
            $rocket = \GO\Billing\Model\Product::model()->findSingleByAttribute('article_id', '12345');
            if (!$rocket) {
                $rocket = new \GO\Billing\Model\Product();
                $rocket->article_id = 12345;
                $rocket->supplier_company_id = $acme->id;
                $rocket->unit = 'pcs';
                $rocket->cost_price = 1000;
                $rocket->list_price = 2999.99;
                $rocket->total_price = 2999.99;
                $rocket->vat = 0;
                if (!$rocket->save()) {
                    var_dump($rocket->getValidationErrors());
                }
                $lang = new \GO\Billing\Model\ProductLanguage();
                $lang->language_id = 1;
                $lang->product_id = $rocket->id;
                $lang->name = 'Master Rocket 1000';
                $lang->description = 'Master Rocket 1000. The ultimate rocket to blast rocky mountains.';
                $lang->save();
            }
            $rocketLauncher = \GO\Billing\Model\Product::model()->findSingleByAttribute('article_id', '234567');
            if (!$rocketLauncher) {
                $rocketLauncher = new \GO\Billing\Model\Product();
                $rocketLauncher->article_id = 234567;
                $rocketLauncher->supplier_company_id = $acme->id;
                $rocketLauncher->unit = 'pcs';
                $rocketLauncher->cost_price = 3000;
                $rocketLauncher->list_price = 8999.99;
                $rocketLauncher->total_price = 8999.99;
                $rocketLauncher->vat = 0;
                if (!$rocketLauncher->save()) {
                    var_dump($rocket->getValidationErrors());
                }
                $lang = new \GO\Billing\Model\ProductLanguage();
                $lang->language_id = 1;
                $lang->product_id = $rocketLauncher->id;
                $lang->name = 'Rocket Launcher 1000';
                $lang->description = 'Rocket Launcher 1000. Required to launch rockets.';
                $lang->save();
            }
            $books = \GO\Billing\Model\Book::model()->find();
            foreach ($books as $book) {
                //give demo access
                $book->acl->addUser($demo->id, \GO\Base\Model\Acl::WRITE_PERMISSION);
                $book->acl->addUser($elmer->id, \GO\Base\Model\Acl::WRITE_PERMISSION);
                $order = new \GO\Billing\Model\Order();
                $order->book_id = $book->id;
                $order->btime = time();
                $order->setCustomerFromContact($john);
                $order->setCustomerFromCompany($company);
                $order->save();
                $order->addProduct($rocketLauncher, 1);
                $order->addProduct($rocket, 4);
                $status = $book->statuses(\GO\Base\Db\FindParams::newInstance()->single());
                $order->status_id = $status->id;
                $order->syncItems();
                $order = new \GO\Billing\Model\Order();
                $order->book_id = $book->id;
                $order->btime = time();
                $order->setCustomerFromContact($wile);
                $order->setCustomerFromCompany($acme);
                $order->save();
                $order->addProduct($rocketLauncher, 1);
                $order->addProduct($rocket, 10);
                $status = $book->statuses(\GO\Base\Db\FindParams::newInstance()->single());
                $order->status_id = $status->id;
                $order->syncItems();
            }
        }
        if (\GO::modules()->tickets) {
            $ticket = new \GO\Tickets\Model\Ticket();
            $ticket->subject = 'Malfunctioning rockets';
            $ticket->setFromContact($wile);
            if (!$ticket->save()) {
                var_dump($ticket->getValidationErrors());
                exit;
            }
            $message = new \GO\Tickets\Model\Message();
            $message->sendEmail = false;
            $message->content = "My rocket always circles back right at me? How do I aim right?";
            $message->is_note = false;
            $message->user_id = 0;
            $ticket->addMessage($message);
            //elmer picks up the ticket
            $ticket->agent_id = $elmer->id;
            $ticket->save();
            //make elmer and demo a ticket agent
            $ticket->type->acl->addUser($elmer->id, \GO\Base\Model\Acl::MANAGE_PERMISSION);
            $ticket->type->acl->addUser($demo->id, \GO\Base\Model\Acl::MANAGE_PERMISSION);
            $message = new \GO\Tickets\Model\Message();
            $message->sendEmail = false;
            $message->content = "Haha, good thing he doesn't know Accelleratii Incredibus designed this rocket and he can't read this note.";
            $message->is_note = true;
            $message->user_id = $elmer->id;
            $ticket->addMessage($message);
            $message = new \GO\Tickets\Model\Message();
            $message->sendEmail = false;
            $message->content = "Gee I don't know how that can happen. I'll send you some new ones!";
            $message->is_note = false;
            $message->status_id = \GO\Tickets\Model\Ticket::STATUS_CLOSED;
            $message->has_status = true;
            $message->user_id = $elmer->id;
            $ticket->addMessage($message);
            $ticket = new \GO\Tickets\Model\Ticket();
            $ticket->subject = 'Can I speed up my rockets?';
            $ticket->setFromContact($wile);
            $ticket->ctime = $ticket->mtime = \GO\Base\Util\Date::date_add(time(), -2);
            if (!$ticket->save()) {
                var_dump($ticket->getValidationErrors());
                exit;
            }
            $message = new \GO\Tickets\Model\Message();
            $message->sendEmail = false;
            $message->content = "The rockets are too slow to hit my fast moving target. Is there a way to speed them up?";
            $message->is_note = false;
            $message->user_id = 0;
            $message->ctime = $message->mtime = \GO\Base\Util\Date::date_add(time(), -2);
            $ticket->addMessage($message);
            //elmer picks up the ticket
            //			$ticket->agent_id=$elmer->id;
            //			$ticket->save();
            $message = new \GO\Tickets\Model\Message();
            $message->sendEmail = false;
            $message->content = "Please respond faster. Can't you see this ticket is marked in red?";
            $message->is_note = false;
            $message->user_id = 0;
            $ticket->addMessage($message);
            if (!\GO::modules()->isInstalled('site') && \GO::modules()->isAvailable('site')) {
                $module = new \GO\Base\Model\Module();
                $module->id = 'site';
                $module->save();
            }
            if (!\GO::modules()->isInstalled('defaultsite') && \GO::modules()->isAvailable('defaultsite')) {
                $module = new \GO\Base\Model\Module();
                $module->id = 'defaultsite';
                $module->save();
            }
            $settings = \GO\Tickets\Model\Settings::model()->findModel();
            $settings->enable_external_page = true;
            $settings->use_alternative_url = true;
            $settings->allow_anonymous = true;
            $settings->alternative_url = \GO::config()->full_url . 'modules/site/index.php?r=tickets/externalpage/ticket';
            $settings->save();
            if (\GO::modules()->summary) {
                $title = "Submit support ticket";
                $announcement = \GO\Summary\Model\Announcement::model()->findSingleByAttribute('title', $title);
                if (!$announcement) {
                    $newTicketUrl = \GO::config()->full_url . 'modules/site/index.php?r=tickets/externalpage/newTicket';
                    $announcement = new \GO\Summary\Model\Announcement();
                    $announcement->title = $title;
                    $announcement->content = 'Anyone can submit tickets to the support system here:' . '<br /><br /><a href="' . $newTicketUrl . '">' . $newTicketUrl . '</a><br /><br />Anonymous ticket posting can be disabled in the ticket module settings.';
                    if ($announcement->save()) {
                        $announcement->acl->addGroup(\GO::config()->group_everyone);
                    }
                }
            }
        }
        if (\GO::modules()->notes) {
            $category = \GO\Notes\Model\Category::model()->findSingleByAttribute('name', \GO::t('general', 'notes'));
            if (!$category) {
                $category = new \GO\Notes\Model\Category();
                $category->name = \GO::t('general', 'notes');
                $category->save();
                $category->acl->addGroup(\GO::config()->group_everyone, \GO\Base\Model\Acl::READ_PERMISSION);
            }
            $note = new \GO\Notes\Model\Note();
            $note->user_id = $elmer->id;
            //$category = \GO\Notes\Model\Category::model()->getDefault($elmer);
            $note->category_id = $category->id;
            $note->name = "Laws and rules";
            $note->content = 'As in other cartoons, the Road Runner and the coyote follow the laws of cartoon physics. For example, the Road Runner has the ability to enter the painted image of a cave, while the coyote cannot (unless there is an opening through which he can fall). Sometimes, however, this is reversed, and the Road Runner can burst through a painting of a broken bridge and continue on his way, while the Coyote will instead enter the mirage painting and fall down the precipice of the cliff where the bridge is out. Sometimes the coyote is allowed to hang in midair until he realizes that he is about to plummet into a chasm (a process occasionally referred to elsewhere as Road-Runnering or Wile E. Coyote moment). The coyote can overtake rocks (or cannons) which fall earlier than he does, and end up being squashed by them. If a chase sequence happens upon a cliff, the Road Runner is not affected by gravity, whereas the Coyote will realize his error eventually and fall to the ground below. A chase sequence that happens upon railroad tracks will always result in the Coyote being run over by a train. If the Coyote uses an explosive (for instance, dynamite) that is triggered by a mechanism that is supposed to force the explosive in a forward motion toward its target, the actual mechanism itself will always shoot forward, leaving the explosive behind to detonate in the Coyote\'s face. Similarly, a complex apparatus that is supposed to propel an object like a boulder or steel ball forward, or trigger a trap, will not work on the Road Runner, but always will on the Coyote. For instance, the Road Runner can jump up and down on the trigger of a large animal trap and eat bird seed off from it, going completely unharmed and not setting off the trap; when the Coyote places the tiniest droplet of oil on the trigger, the trap snaps shut on him without fail. At certain times, the Coyote may don an exquisite Acme costume or propulsion device that briefly allows him to catch up to the Road Runner. This will always result in him losing track of his proximity to large cliffs or walls, and the Road Runner will dart around an extremely sharp turn on a cliff, but the Coyote will rocket right over the edge and fall to the ground.

In his book Chuck Amuck: The Life and Times Of An Animated Cartoonist,[13] Chuck Jones claimed that he and the artists behind the Road Runner and Wile E. cartoons adhered to some simple but strict rules:

The Road Runner cannot harm the Coyote except by going "beep, beep."
No outside force can harm the Coyote — only his own ineptitude or the failure of Acme products. Trains and trucks were the exception from time to time.
The Coyote could stop anytime — if he were not a fanatic. (Repeat: "A fanatic is one who redoubles his effort when he has forgotten his aim." — George Santayana).
Dialogue must never be used, except "beep, beep" and yowling in pain. (This rule, however, was violated in some cartoons.)
The Road Runner must stay on the road — for no other reason than that he\'s a roadrunner. This rule was broken in Beep, Beep, in a sequence where Wile E. chased the Road Runner into a cactus mine. And also in Fastest with the Mostestwhen Coyote lures Road Runner to the edge of a cliff.
All action must be confined to the natural environment of the two characters — the southwest American desert.
All (or at least almost all) tools, weapons, or mechanical conveniences must be obtained from the Acme Corporation. There were sometimes exceptions when the Coyote obtained other items from the desert such as boulders to use in his attempts.
Whenever possible, make gravity the Coyote\'s greatest enemy (e.g., falling off a cliff).
The Coyote is always more humiliated than harmed by his failures.
The audience\'s sympathy must remain with the Coyote.
The Coyote is not allowed to catch or eat the Road Runner, unless he escapes from the grasp. (The robot that the Coyote created in The Solid Tin Coyote caught the Road Runner so this does not break this rule. The Coyote does catch the Road Runner in Soup or Sonic but is too small to eat him. There is also two CGI shorts on The Looney Tunes Show were he caught the bird, but was not able to eat him because the Road Runner got away in both shorts.)';
            $note->save();
            $note->link($john);
            $note = new \GO\Notes\Model\Note();
            $note->user_id = $demo->id;
            $note->category_id = $category->id;
            $note->name = "Wile E. Coyote and Bugs Bunny";
            $note->content = 'Wile E. Coyote has also unsuccessfully attempted to catch and eat Bugs Bunny in another series of cartoons. In these cartoons, the coyote takes on the guise of a self-described "super genius" and speaks with a smooth, generic upper-class accent provided by Mel Blanc. While he is incredibly intelligent, he is limited by technology and his own short-sighted arrogance, and is thus often easily outsmarted, a somewhat physical symbolism of "street smarts" besting "book smarts".

In one short (Hare-Breadth Hurry, 1963), Bugs Bunny — with the help of "speed pills" — even stands in for Road Runner, who has "sprained a giblet", and carries out the duties of outsmarting the hungry scavenger. That is the only Bugs Bunny/Wile E. Coyote short in which the coyote does not speak. As usual Wile E. Coyote ends up falling down a canyon. In a later, made-for-TV short, which had a young Elmer Fudd chasing a young Bugs Bunny, Elmer also falls down a canyon. On the way down he is overtaken by Wile E. Coyote who shows a sign telling Elmer to get out of the way for someone who is more experienced in falling.';
            $note->save();
            $note->link($wile);
        }
        if (\GO::modules()->summary) {
            $title = "Welcome to " . \GO::config()->product_name;
            $announcement = \GO\Summary\Model\Announcement::model()->findSingleByAttribute('title', $title);
            if (!$announcement) {
                $announcement = new \GO\Summary\Model\Announcement();
                $announcement->title = $title;
                $announcement->content = 'This is a demo announcements that administrators can set.<br />Have a look around.<br /><br />We hope you\'ll enjoy Group-Office as much as we do!';
                if ($announcement->save()) {
                    $announcement->acl->addGroup(\GO::config()->group_everyone);
                }
            }
        }
        if (\GO::modules()->files) {
            $demoHome = \GO\Files\Model\Folder::model()->findHomeFolder($demo);
            $file = new \GO\Base\Fs\File(\GO::modules()->files->path . 'install/templates/empty.docx');
            $copy = $file->copy($demoHome->fsFolder);
            $file = new \GO\Base\Fs\File(\GO::modules()->files->path . 'install/templates/empty.odt');
            $copy = $file->copy($demoHome->fsFolder);
            $file = new \GO\Base\Fs\File(\GO::modules()->addressbook->path . 'install/Demo letter.docx');
            $copy = $file->copy($demoHome->fsFolder);
            $file = new \GO\Base\Fs\File(\GO::modules()->addressbook->path . 'install/wecoyote.png');
            $copy = $file->copy($demoHome->fsFolder);
            $file = new \GO\Base\Fs\File(\GO::modules()->addressbook->path . 'install/noperson.jpg');
            $copy = $file->copy($demoHome->fsFolder);
            //add files to db.
            $demoHome->syncFilesystem();
        }
        if (\GO::modules()->projects) {
            $templates = \GO\Projects\Model\Template::model()->find();
            $folderTemplate = $templates->fetch();
            $projectTemplate = $templates->fetch();
            $status = \GO\Projects\Model\Status::model()->findSingle();
            $type = \GO\Projects\Model\Type::model()->findSingleByAttribute('name', 'Demo');
            if (!$type) {
                $type = new \GO\Projects\Model\Type();
                $type->name = 'Demo';
                if (!$type->save()) {
                    var_dump($type->getValidationErrors());
                    exit;
                }
                $type->acl->addGroup(\GO::config()->group_internal, \GO\Base\Model\Acl::WRITE_PERMISSION);
            }
            $folderProject = \GO\Projects\Model\Project::model()->findSingleByAttribute('name', 'Demo');
            if (!$folderProject) {
                $folderProject = new \GO\Projects\Model\Project();
                $folderProject->name = 'Demo';
                $folderProject->description = 'Just a placeholder for sub projects.';
                $folderProject->template_id = $folderTemplate->id;
                $folderProject->type_id = $type->id;
                $folderProject->status_id = $status->id;
                if (!$folderProject->save()) {
                    var_dump($folderProject->getValidationErrors());
                    exit;
                }
            }
            $rocketProject = \GO\Projects\Model\Project::model()->findSingleByAttribute('name', '[001] Develop Rocket 2000');
            if (!$rocketProject) {
                $rocketProject = new \GO\Projects\Model\Project();
                $rocketProject->type_id = $type->id;
                $rocketProject->status_id = $status->id;
                $rocketProject->name = '[001] Develop Rocket 2000';
                $rocketProject->description = 'Better range and accuracy';
                $rocketProject->template_id = $projectTemplate->id;
                $rocketProject->parent_project_id = $folderProject->id;
                $rocketProject->start_time = time();
                $rocketProject->due_time = \GO\Base\Util\Date::date_add(time(), 0, 1);
                $rocketProject->company_id = $acme->id;
                $rocketProject->contact_id = $wile->id;
                $rocketProject->save();
            }
            $launcherProject = \GO\Projects\Model\Project::model()->findSingleByAttribute('name', '[001] Develop Rocket Launcher');
            if (!$launcherProject) {
                $launcherProject = new \GO\Projects\Model\Project();
                $launcherProject->type_id = $type->id;
                $launcherProject->status_id = $status->id;
                $launcherProject->name = '[001] Develop Rocket Launcher';
                $launcherProject->description = 'Better range and accuracy';
                $launcherProject->template_id = $projectTemplate->id;
                $launcherProject->parent_project_id = $folderProject->id;
                $launcherProject->start_time = time();
                $launcherProject->due_time = \GO\Base\Util\Date::date_add(time(), 0, 1);
                $launcherProject->company_id = $acme->id;
                $launcherProject->contact_id = $wile->id;
                $launcherProject->save();
            }
        }
        if (\GO::modules()->projects2) {
            if (!\GO\Projects2\Model\Employee::model()->count()) {
                $employee = new \GO\Projects2\Model\Employee();
                $employee->user_id = $elmer->id;
                $employee->external_fee = 120;
                $employee->internal_fee = 60;
                $employee->save();
                $employee = new \GO\Projects2\Model\Employee();
                $employee->user_id = $demo->id;
                $employee->external_fee = 80;
                $employee->internal_fee = 40;
                $employee->save();
                $employee = new \GO\Projects2\Model\Employee();
                $employee->user_id = $linda->id;
                $employee->external_fee = 90;
                $employee->internal_fee = 45;
                $employee->save();
            } else {
                $employee = \GO\Projects2\Model\Employee::model()->findSingle();
            }
            $templates = \GO\Projects2\Model\Template::model()->find();
            $folderTemplate = $templates->fetch();
            $projectTemplate = $templates->fetch();
            $status = \GO\Projects2\Model\Status::model()->findSingle();
            $type = \GO\Projects2\Model\Type::model()->findSingleByAttribute('name', 'Demo');
            if (!$type) {
                $type = new \GO\Projects2\Model\Type();
                $type->name = 'Demo';
                if (!$type->save()) {
                    var_dump($type->getValidationErrors());
                    exit;
                }
                $type->acl->addGroup(\GO::config()->group_internal, \GO\Base\Model\Acl::WRITE_PERMISSION);
            }
            $folderProject = \GO\Projects2\Model\Project::model()->findSingleByAttribute('name', 'Demo');
            if (!$folderProject) {
                $folderProject = new \GO\Projects2\Model\Project();
                $folderProject->name = 'Demo';
                $folderProject->start_time = time();
                $folderProject->description = 'Just a placeholder for sub projects.';
                $folderProject->template_id = $folderTemplate->id;
                $folderProject->type_id = $type->id;
                $folderProject->status_id = $status->id;
                if (!$folderProject->save()) {
                    var_dump($folderProject->getValidationErrors());
                    exit;
                }
            }
            $rocketProject = \GO\Projects2\Model\Project::model()->findSingleByAttribute('name', '[001] Develop Rocket 2000');
            if (!$rocketProject) {
                $rocketProject = new \GO\Projects2\Model\Project();
                $rocketProject->type_id = $type->id;
                $rocketProject->status_id = $status->id;
                $rocketProject->name = '[001] Develop Rocket 2000';
                $rocketProject->description = 'Better range and accuracy';
                $rocketProject->template_id = $projectTemplate->id;
                $rocketProject->parent_project_id = $folderProject->id;
                $rocketProject->start_time = time();
                $rocketProject->due_time = \GO\Base\Util\Date::date_add(time(), 0, 1);
                $rocketProject->company_id = $acme->id;
                $rocketProject->contact_id = $wile->id;
                //				$rocketProject->budget=20000;
                $rocketProject->save();
                $resource = new \GO\Projects2\Model\Resource();
                $resource->project_id = $rocketProject->id;
                $resource->user_id = $demo->id;
                $resource->budgeted_units = 100;
                $resource->external_fee = 80;
                $resource->internal_fee = 40;
                $resource->save();
                $resource = new \GO\Projects2\Model\Resource();
                $resource->project_id = $rocketProject->id;
                $resource->user_id = $elmer->id;
                $resource->budgeted_units = 16;
                $resource->external_fee = 120;
                $resource->internal_fee = 60;
                $resource->save();
                $resource = new \GO\Projects2\Model\Resource();
                $resource->project_id = $rocketProject->id;
                $resource->user_id = $linda->id;
                $resource->budgeted_units = 16;
                $resource->external_fee = 90;
                $resource->internal_fee = 45;
                $resource->save();
                $groupTask = new \GO\Projects2\Model\Task();
                $groupTask->project_id = $rocketProject->id;
                $groupTask->description = 'Design';
                $groupTask->duration = 8 * 60;
                $groupTask->user_id = $demo->id;
                $groupTask->save();
                $task = new \GO\Projects2\Model\Task();
                $task->parent_id = $groupTask->id;
                $task->project_id = $rocketProject->id;
                $task->description = 'Functional design';
                $task->percentage_complete = 100;
                $task->duration = 8 * 60;
                $task->user_id = $demo->id;
                $task->save();
                $task = new \GO\Projects2\Model\Task();
                $task->parent_id = $groupTask->id;
                $task->project_id = $rocketProject->id;
                $task->description = 'Technical design';
                $task->percentage_complete = 50;
                $task->duration = 8 * 60;
                $task->user_id = $demo->id;
                $task->save();
                $groupTask = new \GO\Projects2\Model\Task();
                $groupTask->project_id = $rocketProject->id;
                $groupTask->description = 'Implementation';
                $groupTask->duration = 8 * 60;
                $groupTask->user_id = $demo->id;
                $groupTask->save();
                $task = new \GO\Projects2\Model\Task();
                $task->parent_id = $groupTask->id;
                $task->project_id = $rocketProject->id;
                $task->description = 'Models';
                $task->duration = 4 * 60;
                $task->user_id = $demo->id;
                $task->save();
                $task = new \GO\Projects2\Model\Task();
                $task->parent_id = $groupTask->id;
                $task->project_id = $rocketProject->id;
                $task->description = 'Controllers';
                $task->duration = 2 * 60;
                $task->user_id = $demo->id;
                $task->save();
                $task = new \GO\Projects2\Model\Task();
                $task->parent_id = $groupTask->id;
                $task->project_id = $rocketProject->id;
                $task->description = 'Views';
                $task->duration = 6 * 60;
                $task->user_id = $demo->id;
                $task->save();
                $groupTask = new \GO\Projects2\Model\Task();
                $groupTask->project_id = $rocketProject->id;
                $groupTask->description = 'Testing';
                $groupTask->duration = 8 * 60;
                $groupTask->user_id = $demo->id;
                $groupTask->save();
                $task = new \GO\Projects2\Model\Task();
                $task->parent_id = $groupTask->id;
                $task->project_id = $rocketProject->id;
                $task->description = 'GUI';
                $task->duration = 8 * 60;
                $task->user_id = $elmer->id;
                $task->save();
                $task = new \GO\Projects2\Model\Task();
                $task->parent_id = $groupTask->id;
                $task->project_id = $rocketProject->id;
                $task->description = 'Security';
                $task->duration = 8 * 60;
                $task->user_id = $elmer->id;
                $task->save();
                $expenseBudget = new \GO\Projects2\Model\ExpenseBudget();
                $expenseBudget->description = 'Machinery';
                $expenseBudget->nett = 10000;
                $expenseBudget->project_id = $rocketProject->id;
                $expenseBudget->save();
                $expense = new \GO\Projects2\Model\Expense();
                $expense->description = 'Rocket fuel';
                $expense->project_id = $rocketProject->id;
                $expense->nett = 3000;
                $expense->save();
                $expense = new \GO\Projects2\Model\Expense();
                $expense->expense_budget_id = $expenseBudget->id;
                $expense->description = 'Fuse machine';
                $expense->project_id = $rocketProject->id;
                $expense->nett = 2000;
                $expense->save();
            }
            $launcherProject = \GO\Projects2\Model\Project::model()->findSingleByAttribute('name', '[001] Develop Rocket Launcher');
            if (!$launcherProject) {
                $launcherProject = new \GO\Projects2\Model\Project();
                $launcherProject->type_id = $type->id;
                $launcherProject->status_id = $status->id;
                $launcherProject->name = '[001] Develop Rocket Launcher';
                $launcherProject->description = 'Better range and accuracy';
                $launcherProject->template_id = $projectTemplate->id;
                $launcherProject->parent_project_id = $folderProject->id;
                $launcherProject->start_time = time();
                $launcherProject->due_time = \GO\Base\Util\Date::date_add(time(), 0, 1);
                $launcherProject->company_id = $acme->id;
                $launcherProject->contact_id = $wile->id;
                $launcherProject->save();
                $resource = new \GO\Projects2\Model\Resource();
                $resource->project_id = $launcherProject->id;
                $resource->user_id = $demo->id;
                $resource->external_fee = 80;
                $resource->internal_fee = 40;
                $resource->budgeted_units = 16;
                $resource->save();
            }
        }
        if (\GO::modules()->bookmarks) {
            $category = \GO\Bookmarks\Model\Category::model()->findSingleByAttribute('name', \GO::t('general', 'bookmarks'));
            if (!$category) {
                $category = new \GO\Bookmarks\Model\Category();
                $category->name = \GO::t('general', 'bookmarks');
                $category->save();
                $category->acl->addGroup(\GO::config()->group_internal, \GO\Base\Model\Acl::READ_PERMISSION);
            }
            $bookmark = \GO\Bookmarks\Model\Bookmark::model()->findSingleByAttribute('name', 'Google Search');
            if (!$bookmark) {
                $bookmark = new \GO\Bookmarks\Model\Bookmark();
                $bookmark->category_id = $category->id;
                $bookmark->name = 'Google Search';
                $bookmark->content = 'http://www.google.com';
                $bookmark->logo = 'icons/viewmag.png';
                $bookmark->public_icon = true;
                $bookmark->description = 'Search the web';
                $bookmark->open_extern = true;
                $bookmark->save();
            }
            $bookmark = \GO\Bookmarks\Model\Bookmark::model()->findSingleByAttribute('name', 'Wikipedia');
            if (!$bookmark) {
                $bookmark = new \GO\Bookmarks\Model\Bookmark();
                $bookmark->category_id = $category->id;
                $bookmark->name = 'Wikipedia';
                $bookmark->content = 'http://www.wikipedia.com';
                $bookmark->logo = 'icons/agt_web.png';
                $bookmark->public_icon = true;
                $bookmark->description = 'The Free Encyclopedia';
                $bookmark->behave_as_module = true;
                $bookmark->save();
            }
        }
        if (\GO::modules()->postfixadmin) {
            $domainModel = \GO\Postfixadmin\Model\Domain::model()->findSingleByAttribute('domain', 'acmerpp.demo');
            if (!$domainModel) {
                $domainModel = new \GO\Postfixadmin\Model\Domain();
                $domainModel->domain = 'acmerpp.demo';
                $domainModel->save();
            }
            $this->_createMailbox($domainModel, $demo);
            $this->_createMailbox($domainModel, $elmer);
            $this->_createMailbox($domainModel, $linda);
        }
        if (\GO::modules()->savemailas) {
            //link some demo mails
            $mimeFile = new \GO\Base\Fs\File(\GO::modules()->savemailas->path . 'install/demo.eml');
            \GO\Savemailas\Model\LinkedEmail::model()->createFromMimeFile($mimeFile, $wile);
            \GO\Savemailas\Model\LinkedEmail::model()->createFromMimeFile($mimeFile, $john);
            if (\GO::modules()->projects) {
                \GO\Savemailas\Model\LinkedEmail::model()->createFromMimeFile($mimeFile, $rocketProject);
                \GO\Savemailas\Model\LinkedEmail::model()->createFromMimeFile($mimeFile, $launcherProject);
            }
            $mimeFile = new \GO\Base\Fs\File(\GO::modules()->savemailas->path . 'install/demo2.eml');
            \GO\Savemailas\Model\LinkedEmail::model()->createFromMimeFile($mimeFile, $wile);
            \GO\Savemailas\Model\LinkedEmail::model()->createFromMimeFile($mimeFile, $john);
            if (\GO::modules()->projects) {
                \GO\Savemailas\Model\LinkedEmail::model()->createFromMimeFile($mimeFile, $rocketProject);
                \GO\Savemailas\Model\LinkedEmail::model()->createFromMimeFile($mimeFile, $launcherProject);
            }
        }
        //useful for other modules to create stuff
        $this->fireEvent('demodata', array('users' => array('demo' => $demo, 'linda' => $linda, 'elmer' => $elmer)));
        if (\GO::modules()->demodata) {
            \GO::modules()->demodata->delete();
        }
        if (!$this->isCli()) {
            //login as demo
            \GO::session()->restart();
            \GO::session()->setCurrentUser($demo->id);
            $this->redirect();
        }
    }
Esempio n. 10
0
 /**
  * Movesthe node
  *
  * @param string $name The new name
  * @return void
  */
 public function move($newPath)
 {
     $this->checkWritePermission();
     \GO::debug('DAVFile::move(' . $this->path . ' -> ' . $newPath . ')');
     $destFsFolder = new \GO\Base\Fs\Folder(dirname($newPath));
     $destFolder = \GO\Files\Model\Folder::model()->findByPath($destFsFolder->stripFileStoragePath());
     $file = \GO\Files\Model\File::model()->findByPath($this->relpath);
     $file->folder_id = $destFolder->id;
     $file->name = \GO\Base\Fs\File::utf8Basename($newPath);
     $file->save();
     $this->relpath = $file->path;
     $this->path = \GO::config()->file_storage_path . $this->relpath;
 }
Esempio n. 11
0
 /**
  * The savemailas module can send attachments along to be stored as files with
  * a note, task, event etc.
  *
  * @param type $response
  * @param type $model
  * @param type $params
  */
 public function processAttachments(&$response, &$model, &$params)
 {
     //Does this belong in the controller?
     if (!empty($params['tmp_files'])) {
         $tmp_files = json_decode($params['tmp_files'], true);
         if (count($tmp_files)) {
             $folder_id = $this->checkModelFolder($model, true, true);
             $folder = \GO\Files\Model\Folder::model()->findByPk($folder_id);
             while ($tmp_file = array_shift($tmp_files)) {
                 if (!empty($tmp_file['tmp_file'])) {
                     $file = new \GO\Base\Fs\File(\GO::config()->tmpdir . $tmp_file['tmp_file']);
                     $file->move(new \GO\Base\Fs\Folder(\GO::config()->file_storage_path . $folder->path));
                     $folder->addFile($file->name());
                 }
             }
         }
     }
 }
Esempio n. 12
0
 /**
  * Saves the report to a file
  * output path and filename should be set before calling this function
  * @param \GO\Projects2\Model\Project $project the project object
  * @return \GO\Files\Model\File
  */
 public function save()
 {
     $file = new \GO\Base\Fs\File($this->_outputPath . '/' . $this->filename . '.' . $this->fileExtension());
     $file->appendNumberToNameIfExists();
     $this->_outputPath = $file->path();
     $str = $this->render(true);
     if (!isset($this->_fp)) {
         $this->_fp = fopen($this->_outputPath, 'w+');
     }
     fputs($this->_fp, $str);
     $folder = \GO\Files\Model\Folder::model()->findByPath($file->parent()->stripFileStoragePath());
     $fileModel = $folder->addFile($file->name());
     return $fileModel;
 }
 public function mkdir($path)
 {
     if ($path == '' || $path == '/') {
         return false;
     } else {
         $tmp_path = dirname($path);
         if ($tmp_path == '.') {
             $tmp_path = '';
         }
         \OCP\Util::writeLog('groupoffice', 'mkdir: ' . $tmp_path, \OCP\Util::DEBUG);
         if ($this->isCreatable($tmp_path)) {
             $fullpath = $this->get_real_path($path);
             $fullpath = dirname($fullpath);
             $folder = \GO\Files\Model\Folder::model()->findByPath($fullpath);
             $folder->addFolder(basename($path));
             return true;
         }
         return false;
     }
 }
Esempio n. 14
0
 public function findRecent($start = false, $limit = false)
 {
     $storeParams = \GO\Base\Db\FindParams::newInstance()->ignoreAcl();
     $joinSearchCacheCriteria = \GO\Base\Db\FindCriteria::newInstance()->addRawCondition('`t`.`id`', '`sc`.`model_id`')->addCondition('model_type_id', $this->modelTypeId(), '=', 'sc');
     $storeParams->join(\GO\Base\Model\SearchCacheRecord::model()->tableName(), $joinSearchCacheCriteria, 'sc', 'INNER');
     $aclJoinCriteria = \GO\Base\Db\FindCriteria::newInstance()->addRawCondition('a.acl_id', 'sc.acl_id', '=', false);
     $aclWhereCriteria = \GO\Base\Db\FindCriteria::newInstance()->addCondition('user_id', \GO::user()->id, '=', 'a', false)->addInCondition("group_id", \GO\Base\Model\User::getGroupIds(\GO::user()->id), "a", false);
     $storeParams->join(\GO\Base\Model\AclUsersGroups::model()->tableName(), $aclJoinCriteria, 'a', 'INNER');
     $storeParams->criteria(\GO\Base\Db\FindCriteria::newInstance()->addModel(Folder::model())->mergeWith($aclWhereCriteria));
     $storeParams->group(array('t.id'))->order('mtime', 'DESC');
     $storeParams->getCriteria()->addCondition('mtime', \GO\Base\Util\Date::date_add(\GO\Base\Util\Date::clear_time(time()), -7), '>');
     if ($start !== false) {
         $storeParams->start($start);
     }
     if ($limit !== false) {
         $storeParams->limit($limit);
     }
     return $this->find($storeParams);
 }
Esempio n. 15
0
 protected function afterSave($wasNew)
 {
     $this->_addQuota();
     if ($wasNew) {
         $this->notifyUsers($this->folder_id, FolderNotificationMessage::ADD_FILE, $this->name, $this->folder->path);
     } else {
         if ($this->isModified() && !$this->isModified('name') && !$this->isModified('folder_id')) {
             $this->notifyUsers($this->folder_id, FolderNotificationMessage::UPDATE_FILE, $this->path);
         }
     }
     //touch the timestamp so it won't sync with the filesystem
     if ($this->isModified('folder_id')) {
         GO::debug("touching parent");
         $this->folder->touch();
         $oldParent = \GO\Files\Model\Folder::model()->findByPk($this->getOldAttributeValue('folder_id'));
         if ($oldParent) {
             GO::debug("touching old parent");
             $oldParent->touch();
         }
     }
     return parent::afterSave($wasNew);
 }
Esempio n. 16
0
<?php

$folder = \GO\Files\Model\Folder::model()->findByPath("log", true);
$folder->setNewAcl();
$folder->readonly = 0;
$folder->save();
Esempio n. 17
0
 }
 $admin = new \GO\Base\Model\User();
 $admin->first_name = \GO::t('system');
 $admin->last_name = \GO::t('admin');
 $admin->username = $args['adminusername'];
 $admin->password = $args['adminpassword'];
 $admin->email = \GO::config()->webmaster_email = $args['adminemail'];
 \GO::config()->save();
 //disable password validation
 \GO::config()->password_validate = false;
 $admin->save();
 $adminGroup->addUser($admin->id);
 $admin->checkDefaultModels();
 //module code here because we need the user and the module for this
 if (\GO::modules()->files) {
     $folder = \GO\Files\Model\Folder::model()->findByPath('users/' . $admin->username . '/Public', true);
     $folder->visible = true;
     $acl = $folder->setNewAcl();
     $acl->addGroup(\GO::config()->group_everyone, \GO\Base\Model\Acl::DELETE_PERMISSION);
     $folder->save();
 }
 //Insert default cronjob record for email reminders
 $cron = new \GO\Base\Cron\CronJob();
 $cron->name = 'Email Reminders';
 $cron->active = true;
 $cron->runonce = false;
 $cron->minutes = '*/5';
 // Every 5 minutes
 $cron->hours = '*';
 $cron->monthdays = '*';
 $cron->months = '*';
Esempio n. 18
0
 public function start(\GO\Base\Model\User $user = null, $reset = false)
 {
     if ($user === null) {
         $user = GO::user();
     }
     GO::session()->runAsRoot();
     GO::setMaxExecutionTime(0);
     self::log("Dropbox sync for user " . $user->username);
     $dbxUser = User::model()->findByPk($user->id);
     if ($reset) {
         $dbxUser->delta_cursor = "";
         $folder = self::getHomeFolder($user);
         $folder->removeChildren();
     }
     $dbxClient = self::getClient($user);
     self::log("Getting Dropbox Changes");
     $hasMore = true;
     while ($hasMore) {
         $delta = $dbxClient->Delta(empty($dbxUser->delta_cursor) ? null : $dbxUser->delta_cursor);
         //			var_dump($delta);
         //			exit();
         if (!isset($delta)) {
             throw new \Exception("Could not get delta from Dropbox!");
         }
         $hasMore = $delta->has_more;
         foreach ($delta->entries as $entry) {
             flush();
             //$entry[1]['path'] = with case. Otherwise we just have a string to lowered path for deleting
             $dbxPath = isset($entry[1]->path) ? $entry[1]->path : $entry[0];
             $goPath = self::dbxToGoPath($dbxPath, $user);
             if (!isset($entry[1])) {
                 //should be deleted
                 $file = File::model()->findByPath($goPath, false);
                 if ($file) {
                     self::log("Deleting file on Group-Office " . $goPath);
                     $file->delete();
                 } else {
                     $folder = Folder::model()->findByPath($goPath, false, array(), false);
                     if ($folder) {
                         self::log("Deleting folder on Group-Office " . $goPath);
                         $folder->delete();
                     } else {
                         self::log("Could not find path for delete file on Group-Office " . $goPath);
                     }
                 }
             } else {
                 if ($entry[1]->is_dir) {
                     self::log("Create folder on Group-Office " . $entry[1]->path . " -> " . $goPath);
                     $folder = Folder::model()->findByPath($goPath, true);
                 } else {
                     self::log("Download from Dropbox " . $entry[1]->path . " -> " . $goPath);
                     $folder = Folder::model()->findByPath(dirname($goPath), true, array(), false);
                     $name = \GO\Base\Fs\File::utf8Basename($goPath);
                     $path = $folder->fsFolder->createChild($name)->path();
                     //$f = fopen($path, "w+b");
                     $fileMetadata = $dbxClient->DownloadFile($entry[0], $path);
                     //fclose($f);
                     touch($path, strtotime($fileMetadata->modified));
                     //todo needs optimize
                     $folder->syncFilesystem();
                 }
             }
         }
     }
     $dbxUser->delta_cursor = $delta->cursor;
     $dbxUser->save();
     self::log("Applying Group-Office changes to Dropbox");
     $folder = self::getHomeFolder($user);
     $goSnapshot = self::getGroupOfficeSnapShot($folder);
     $dbxSnapshot = self::getDropboxSnapshot($user);
     foreach ($goSnapshot as $path => $props) {
         $dbxPath = self::goToDbxPath($props['path'], $user);
         $dbxPathToLower = strtolower($dbxPath);
         if (!isset($dbxSnapshot[$dbxPathToLower]) || $dbxSnapshot[$dbxPathToLower]['mtime'] < $props['mtime']) {
             if (is_file(GO::config()->file_storage_path . $props['path'])) {
                 self::log("Upload to Dropbox " . $path . " -> " . $dbxPath);
                 $localPath = GO::config()->file_storage_path . $props['path'];
                 $meta = $dbxClient->UploadFile($localPath, $dbxPath, true);
                 if (!isset($meta)) {
                     throw new \Exception("Failed to create file '" . $dbxPath . "' on Dropbox");
                 }
             } elseif (!isset($dbxSnapshot[$dbxPathToLower])) {
                 self::log("Create folder on Dropbox " . $path . " -> " . $dbxPath);
                 $folderMetaData = $dbxClient->CreateFolder($dbxPath);
                 if (!isset($folderMetaData)) {
                     throw new \Exception("Failed to create folder '" . $dbxPath . "' on Dropbox");
                 }
             }
         }
     }
     //reverse sort for deleting so that deeper files are deleted first.
     krsort($dbxSnapshot);
     foreach ($dbxSnapshot as $path => $props) {
         $goPath = strtolower(self::dbxToGoPath($path, $user));
         if (!isset($goSnapshot[$goPath])) {
             self::log("Deleting on dropbox " . $path);
             if (!$dbxClient->Delete($path)) {
                 throw new \Exception("Failed to delete '" . $path . "'");
             }
         }
     }
     //get delta again so we won't process our own changes next sync
     $delta = $dbxClient->Delta($dbxUser->delta_cursor);
     $dbxUser->delta_cursor = $delta->cursor;
     $dbxUser->save();
     self::log("Done!");
 }
Esempio n. 19
0
 function process_form()
 {
     \GO::$ignoreAclPermissions = true;
     $this->check_required();
     if (!isset($_POST['salutation'])) {
         $_POST['salutation'] = isset($_POST['sex']) ? \GO::t('default_salutation_' . $_POST['sex']) : \GO::t('default_salutation_unknown');
     }
     //user registation
     //		if(!empty($_POST['username'])){
     //			$credentials = array ('username','first_name','middle_name','last_name','title','initials','sex','email',
     //			'home_phone','fax','cellular','address','address_no',
     //			'zip','city','state','country','company','department','function','work_phone',
     //			'work_fax');
     //
     //			if($_POST['password1'] != $_POST['password2'])
     //			{
     //				throw new Exception(\GO::t('error_match_pass','users'));
     //			}
     //
     //			foreach($credentials as $key)
     //			{
     //				if(!empty($_REQUEST[$key]))
     //				{
     //					$userCredentials[$key] = $_REQUEST[$key];
     //				}
     //			}
     //			$userCredentials['password']=$_POST['password1'];
     //
     //			$userModel = new \GO\Base\Model\User();
     //			$userModel->setAttributes($userCredentials);
     //			$userModel->save();
     //			foreach($this->user_groups as $groupId) {
     //				$currentGroupModel = \GO\Base\Model\Group::model()->findByPk($groupId);
     //				if($groupId>0 && $groupId!=\GO::config()->group_everyone && !$currentGroupModel->hasUser($userModel->id)) {
     //					$currentGroupModel->addUser($userModel->id);
     //				}
     //			}
     //			foreach($this->visible_user_groups as $groupId) {
     //				$userAclModel = \GO\Base\Model\Acl::model()->findByPk($userModel->acl_id);
     //				if($groupId>0 && !empty($userAclModel) && $userAclModel->hasGroup($groupId)) {
     //					$userAclModel->addGroup($groupId);
     //				}
     //			}
     //
     //			\GO::session()->login($userCredentials['username'], $userCredentials['password']);
     //		}
     if (!empty($_POST['email']) && !\GO\Base\Util\String::validate_email($_POST['email'])) {
         throw new Exception(\GO::t('invalidEmailError'));
     }
     if (!empty($_REQUEST['addressbook'])) {
         //			require($GO_LANGUAGE->get_language_file('addressbook'));
         //			require_once($GO_MODULES->modules['addressbook']['class_path'].'addressbook.class.inc.php');
         //			$ab = new addressbook();
         //
         //			$addressbook = $ab->get_addressbook_by_name($_REQUEST['addressbook']);
         $addressbookModel = \GO\Addressbook\Model\Addressbook::model()->findSingleByAttribute('name', $_REQUEST['addressbook']);
         if (!$addressbookModel) {
             throw new Exception('Addressbook not found!');
         }
         $credentials = array('first_name', 'middle_name', 'last_name', 'title', 'initials', 'sex', 'email', 'email2', 'email3', 'home_phone', 'fax', 'cellular', 'comment', 'address', 'address_no', 'zip', 'city', 'state', 'country', 'company', 'department', 'function', 'work_phone', 'work_fax', 'salutation', 'url_linkedin', 'url_facebook', 'url_twitter', 'skype_name');
         foreach ($credentials as $key) {
             if (!empty($_REQUEST[$key])) {
                 $contactCredentials[$key] = $_REQUEST[$key];
             }
         }
         if (isset($contactCredentials['comment']) && is_array($contactCredentials['comment'])) {
             $comments = '';
             foreach ($contactCredentials['comment'] as $key => $value) {
                 if ($value == 'date') {
                     $value = date($_SESSION['GO_SESSION']['date_format'] . ' ' . $_SESSION['GO_SESSION']['time_format']);
                 }
                 if (!empty($value)) {
                     $comments .= trim($key) . ":\n" . trim($value) . "\n\n";
                 }
             }
             $contactCredentials['comment'] = $comments;
         }
         if ($this->no_urls && isset($contactCredentials['comment']) && stripos($contactCredentials['comment'], 'http')) {
             throw new Exception('Sorry, but to prevent spamming we don\'t allow URL\'s in the message');
         }
         $contactCredentials['addressbook_id'] = $addressbookModel->id;
         $contactCredentials['email_allowed'] = isset($_POST['email_allowed']) ? '1' : '0';
         if (!empty($contactCredentials['company']) && empty($contactCredentials['company_id'])) {
             $companyModel = \GO\Addressbook\Model\Company::model()->findSingleByAttributes(array('name' => $contactCredentials['company'], 'addressbook_id' => $contactCredentials['addressbook_id']));
             if (empty($companyModel)) {
                 $companyModel = new \GO\Addressbook\Model\Company();
                 $companyModel->addressbook_id = $contactCredentials['addressbook_id'];
                 $companyModel->name = $contactCredentials['company'];
                 // bedrijfsnaam
                 $companyModel->user_id = \GO::user()->id;
                 $companyModel->save();
                 $contactCredentials['company_id'] = $companyModel->id;
             }
         }
         if (isset($_POST['birthday'])) {
             try {
                 $contactCredentials['birthday'] = \GO\Base\Util\Date::to_db_date($_POST['birthday'], false);
             } catch (Exception $e) {
                 throw new Exception(\GO::t('birthdayFormatMustBe') . ': ' . $_SESSION['GO_SESSION']['date_format'] . '.');
             }
             if (!empty($_POST['birthday']) && $contactCredentials['birthday'] == '0000-00-00') {
                 throw new Exception(\GO::t('invalidDateError'));
             }
         }
         unset($contactCredentials['company']);
         $existingContactModel = false;
         if (!empty($_POST['contact_id'])) {
             $existingContactModel = \GO\Addressbook\Model\Contact::model()->findByPk($_POST['contact_id']);
         } elseif (!empty($contactCredentials['email'])) {
             $existingContactModel = \GO\Addressbook\Model\Contact::model()->findSingleByAttributes(array('email' => $contactCredentials['email'], 'addressbook_id' => $contactCredentials['addressbook_id']));
         }
         if ($existingContactModel) {
             $this->contact_id = $contactId = $existingContactModel->id;
             $filesFolderId = $existingContactModel->files_folder_id = $existingContactModel->getFilesFolder()->id;
             /*
              * Only update empty fields
              */
             if (empty($_POST['contact_id'])) {
                 foreach ($contactCredentials as $key => $value) {
                     if ($key != 'comment') {
                         if (!empty($existingContactModel->{$key})) {
                             unset($contactCredentials[$key]);
                         }
                     }
                 }
             }
             $contactCredentials['id'] = $contactId;
             if (!empty($existingContactModel->comment) && !empty($contactCredentials['comment'])) {
                 $contactCredentials['comment'] = $existingContactModel->comment . "\n\n----\n\n" . $contactCredentials['comment'];
             }
             if (empty($contactCredentials['comment'])) {
                 unset($contactCredentials['comment']);
             }
             $existingContactModel->setAttributes($contactCredentials);
             $existingContactModel->save();
         } else {
             $newContactModel = new \GO\Addressbook\Model\Contact();
             $newContactModel->setAttributes($contactCredentials);
             $newContactModel->save();
             $this->contact_id = $contactId = $newContactModel->id;
             $filesFolderId = $newContactModel->files_folder_id = $newContactModel->getFilesFolder()->id;
             $newContactModel->save();
             if (isset($_POST['contact_id']) && empty($userId) && \GO::user()->id > 0) {
                 $userId = $this->user_id = \GO::user()->id;
             }
             if (!empty($userId)) {
                 $userModel = \GO\Base\Model\User::model()->findByPk($userId);
                 $userModel->contact_id = $contactId;
                 $userModel->save();
             }
         }
         if (!$contactId) {
             throw new Exception(\GO::t('saveError'));
         }
         if (\GO::modules()->isInstalled('files')) {
             $folderModel = \GO\Files\Model\Folder::model()->findByPk($filesFolderId);
             $path = $folderModel->path;
             $response['files_folder_id'] = $filesFolderId;
             $full_path = \GO::config()->file_storage_path . $path;
             foreach ($_FILES as $key => $file) {
                 if ($key != 'photo') {
                     //photo is handled later
                     if (is_uploaded_file($file['tmp_name'])) {
                         $fsFile = new \GO\Base\Fs\File($file['tmp_name']);
                         $fsFile->move(new \GO\Base\Fs\Folder($full_path), $file['name'], false, true);
                         $fsFile->setDefaultPermissions();
                         \GO\Files\Model\File::importFromFilesystem($fsFile);
                     }
                 }
             }
         }
         if (\GO::modules()->isInstalled('customfields')) {
             $cfFields = array();
             foreach ($_POST as $k => $v) {
                 if (strpos($k, 'col_') === 0) {
                     $cfFields[$k] = $v;
                 }
             }
             $contactCfModel = \GO\Addressbook\Customfields\Model\Contact::model()->findByPk($contactId);
             if (!$contactCfModel) {
                 $contactCfModel = new \GO\Addressbook\Customfields\Model\Contact();
                 $contactCfModel->model_id = $contactId;
             }
             $contactCfModel->setAttributes($cfFields);
             $contactCfModel->save();
         }
         if (isset($_POST['mailings'])) {
             foreach ($_POST['mailings'] as $mailingName) {
                 if (!empty($mailingName)) {
                     $addresslistModel = \GO\Addressbook\Model\Addresslist::model()->findSingleByAttribute('name', $mailingName);
                     if (empty($addresslistModel)) {
                         throw new Exception('Addresslist not found!');
                     }
                     $addresslistModel->addManyMany('contacts', $contactId);
                 }
             }
         }
         if ($this->contact_id > 0) {
             if (isset($_FILES['photo']['tmp_name']) && is_uploaded_file($_FILES['photo']['tmp_name'])) {
                 $fsFile = new \GO\Base\Fs\File($_FILES['photo']['tmp_name']);
                 $fsFile->move(new \GO\Base\Fs\Folder(\GO::config()->tmpdir), $_FILES['photo']['name'], false, false);
                 $contactModel = \GO\Addressbook\Model\Contact::model()->findByPk($contactId);
                 $contactModel->setPhoto(\GO::config()->tmpdir . $_FILES['photo']['name']);
             }
         }
         if (!isset($_POST['contact_id'])) {
             /**
              * Send notification of new contact to (1) users specified by 'notify_users'
              * in the form itself and to (2) the addressbook owner if so specified. 
              */
             // Send the email to the admin users in the language of the addressbook owner.
             $oldLanguage = \GO::language()->getLanguage();
             \GO::language()->setLanguage($addressbookModel->user->language);
             $usersToNotify = isset($_POST['notify_users']) ? explode(',', $_POST['notify_users']) : array();
             if (!empty($_POST['notify_addressbook_owner'])) {
                 $usersToNotify[] = $addressbookModel->user_id;
             }
             $mailTo = array();
             foreach ($usersToNotify as $userToNotifyId) {
                 $userModel = \GO\Base\Model\User::model()->findByPk($userToNotifyId);
                 $mailTo[] = $userModel->email;
             }
             if (count($mailTo)) {
                 $viewContactUrl = \GO::createExternalUrl('addressbook', 'showContact', array($contactId));
                 $contactModel = \GO\Addressbook\Model\Contact::model()->findByPk($contactId);
                 $companyModel = \GO\Addressbook\Model\Company::model()->findByPk($contactModel->company_id);
                 if (!empty($companyModel)) {
                     $companyName = $companyModel->name;
                 } else {
                     $companyName = '';
                 }
                 $values = array('address_no', 'address', 'zip', 'city', 'state', 'country');
                 $formatted_address = nl2br(\GO\Base\Util\Common::formatAddress('{country}', '{address}', '{address_no}', '{zip}', '{city}', '{state}'));
                 foreach ($values as $val) {
                     $formatted_address = str_replace('{' . $val . '}', $contactModel->{$val}, $formatted_address);
                 }
                 $body = \GO::t('newContactFromSite', 'addressbook') . ':<br />';
                 $body .= \GO::t('name', 'addressbook') . ': ' . $contactModel->addressbook->name . '<br />';
                 $body .= "<br />" . $contactModel->name;
                 $body .= "<br />" . $formatted_address;
                 if (!empty($contactModel->home_phone)) {
                     $body .= "<br />" . \GO::t('phone') . ': ' . $contactModel->home_phone;
                 }
                 if (!empty($contactModel->cellular)) {
                     $body .= "<br />" . \GO::t('cellular') . ': ' . $contactModel->cellular;
                 }
                 if (!empty($companyName)) {
                     $body .= "<br /><br />" . $companyName;
                 }
                 if (!empty($contactModel->work_phone)) {
                     $body .= "<br />" . \GO::t('workphone') . ': ' . $contactModel->work_phone;
                 }
                 $body .= '<br /><a href="' . $viewContactUrl . '">' . \GO::t('clickHereToView', 'addressbook') . '</a>' . "<br />";
                 $mailFrom = !empty($_POST['mail_from']) ? $_POST['mail_from'] : \GO::config()->webmaster_email;
                 $mailMessage = \GO\Base\Mail\Message::newInstance(\GO::t('newContactAdded', 'addressbook'), $body, 'text/html')->setFrom($mailFrom, \GO::config()->title);
                 foreach ($mailTo as $v) {
                     $mailMessage->addTo($v);
                 }
                 \GO\Base\Mail\Mailer::newGoInstance()->send($mailMessage);
             }
             // Restore the language
             \GO::language()->setLanguage($oldLanguage);
         }
         //
         //
         //	Maybe make this workable with GO 4.0 later....
         //
         //
         //			if(isset($_POST['confirmation_template']))
         //			{
         //				if(empty($_POST['email']))
         //				{
         //					throw new Exception('Fatal error: No email given for confirmation e-mail!');
         //				}
         //
         //				$url = create_direct_url('addressbook', 'showContact', array($contactId));
         //				$body = $lang['addressbook']['newContactFromSite'].'<br /><a href="'.$url.'">'.$lang['addressbook']['clickHereToView'].'</a>';
         //
         //				global $smarty;
         //				$email = $smarty->fetch($_POST['confirmation_template']);
         //
         //				$pos = strpos($email,"\n");
         //
         //				$subject = trim(substr($email, 0, $pos));
         //				$body = trim(substr($email,$pos));
         //
         //				require_once(\GO::config()->class_path.'mail/GoSwift.class.inc.php');
         //				$swift = new GoSwift($_POST['email'], $subject);
         //				$swift->set_body($body);
         //				$swift->set_from(\GO::config()->webmaster_email, \GO::config()->title);
         //				$swift->sendmail();
         //			}
         if (isset($_POST['confirmation_email']) && !empty($_POST['email'])) {
             if (strpos($_POST['confirmation_email'], '../') !== false || strpos($_POST['confirmation_email'], '..\\') !== false) {
                 throw new Exception('Invalid path');
             }
             $path = \GO::config()->file_storage_path . $_POST['confirmation_email'];
             if (!file_exists($path)) {
                 $path = dirname(\GO::config()->get_config_file()) . '/' . $_POST['confirmation_email'];
             }
             //$email = file_get_contents($path);
             //$messageModel = \GO\Email\Model\SavedMessage::model()->createFromMimeFile($path);
             //				$htmlBodyString = \GO\Addressbook\Model\Template::model()->replaceUserTags($messageModel->getHtmlBody());
             //				$htmlBodyString = \GO\Addressbook\Model\Template::model()
             //								->replaceContactTags(
             //												$htmlBodyString,
             //												\GO\Addressbook\Model\Contact::model()->findByPk($contactId),
             //												false);
             //				$messageModel->body =
             $mailMessage = \GO\Base\Mail\Message::newInstance()->loadMimeMessage(file_get_contents($path));
             $htmlBodyString = $mailMessage->getBody();
             foreach ($this->confirmation_replacements as $tag => $replacement) {
                 $htmlBodyString = str_replace('{' . $tag . '}', $replacement, $htmlBodyString);
             }
             $htmlBodyString = \GO\Addressbook\Model\Template::model()->replaceUserTags($htmlBodyString, true);
             $htmlBodyString = \GO\Addressbook\Model\Template::model()->replaceContactTags($htmlBodyString, \GO\Addressbook\Model\Contact::model()->findByPk($contactId), false);
             $mailMessage->setBody($htmlBodyString);
             $mailMessage->setFrom($mailMessage->getFrom(), $mailMessage->getSender());
             $mailMessage->addTo($_POST['email']);
             \GO\Base\Mail\Mailer::newGoInstance()->send($mailMessage);
         }
     }
 }
Esempio n. 20
0
 protected function afterSave($wasNew)
 {
     if ($wasNew) {
         $this->fsFolder->create();
         //sync parent timestamp
         if ($this->parent) {
             $this->parent->mtime = $this->parent->fsFolder->mtime();
             $this->parent->save(true);
             $this->notifyUsers($this->parent->id, FolderNotificationMessage::ADD_FOLDER, $this->name, $this->parent->getPath());
         }
     } else {
         $this->_path = null;
         if (!$this->fsFolder->exists()) {
             if ($this->isModified('parent_id')) {
                 Folder::model()->clearFolderCache();
                 //file will be moved so we need the old folder path.
                 $oldFolderId = $this->getOldAttributeValue('parent_id');
                 $oldFolder = Folder::model()->findByPk($oldFolderId, false, true);
                 $oldRelPath = $oldFolder->path;
                 $oldName = $this->isModified('name') ? $this->getOldAttributeValue('name') : $this->name;
                 $oldPath = \GO::config()->file_storage_path . $oldRelPath . '/' . $oldName;
                 $fsFolder = new \GO\Base\Fs\Folder($oldPath);
                 $newRelPath = $this->getPath(true);
                 $newFsFolder = new \GO\Base\Fs\Folder(\GO::config()->file_storage_path . dirname($newRelPath));
                 if (!$fsFolder->move($newFsFolder)) {
                     throw new \Exception("Could not rename folder on the filesystem");
                 }
                 $this->notifyUsers(array($this->id, $oldFolder->id, $this->parent->id), FolderNotificationMessage::MOVE_FOLDER, $oldRelPath . '/' . $oldName, $newRelPath);
             }
             //if the filesystem folder is missing check if we need to move it when the name or parent folder changes.
             if ($this->isModified('name')) {
                 Folder::model()->clearFolderCache();
                 \GO::debug("Renaming from " . $this->getOldAttributeValue('name') . " to " . $this->name);
                 $oldFsFolder = new \GO\Base\Fs\Folder(dirname($this->fsFolder->path()) . '/' . $this->getOldAttributeValue('name'));
                 $oldFsFolder->rename($this->name);
                 $this->notifyUsers(array($this->id, $this->parent->id), FolderNotificationMessage::RENAME_FOLDER, $this->parent->path . '/' . $this->getOldAttributeValue('name'), $this->parent->path . '/' . $this->name);
             }
         }
     }
     //sync parent timestamp
     if ($this->isModified('parent_id')) {
         if ($this->parent) {
             $oldFolderId = $this->getOldAttributeValue('parent_id');
             $oldFolder = \GO\Files\Model\Folder::model()->findByPk($oldFolderId, false, true);
             //so it won't sync the filesystem
             if ($oldFolder) {
                 GO::debug('touching old parent');
                 $oldFolder->touch();
             }
             GO::debug('touching parent');
             $this->parent->touch();
         }
     }
     return parent::afterSave($wasNew);
 }
Esempio n. 21
0
 /**
  * Moves the node
  *
  * @param string $name The new name
  * @return void
  */
 public function move($newPath)
 {
     \GO::debug("FSD::move({$newPath})");
     if (!is_dir(dirname($newPath))) {
         throw new \Exception('Invalid move!');
     }
     $folder = $this->_getFolder();
     if (!$folder->checkPermissionLevel(\GO\Base\Model\Acl::WRITE_PERMISSION)) {
         throw new Sabre\DAV\Exception\Forbidden();
     }
     $destFsFolder = new \GO\Base\Fs\Folder($newPath);
     //\GO::debug("Dest folder: ".$destFsFolder->stripFileStoragePath());
     $destFolder = \GO\Files\Model\Folder::model()->findByPath($destFsFolder->parent()->stripFileStoragePath());
     $folder->parent_id = $destFolder->id;
     $folder->name = $destFsFolder->name();
     $folder->save();
     $this->relpath = $folder->path;
     $this->path = \GO::config()->file_storage_path . $this->relpath;
 }
Esempio n. 22
0
<?php

if (\GO::modules()->files) {
    $folder = \GO\Files\Model\Folder::model()->findByPath('public/customcss', true);
    $GO_SCRIPTS_JS .= 'GO.customcss.filesFolderId=' . $folder->id . ';';
}
Esempio n. 23
0
 public function setFolderPermissions2()
 {
     if (\GO::modules()->isInstalled('files')) {
         \GO\Base\Fs\Folder::createFromPath(\GO::config()->file_storage_path . 'company_photos');
         $folderModel = \GO\Files\Model\Folder::model()->findByPath('company_photos', true);
         if ($folderModel && !$folderModel->acl_id) {
             $folderModel->setNewAcl(1);
             $folderModel->readonly = 1;
             $folderModel->save();
         }
     }
 }
Esempio n. 24
0
 public function copyContentsFrom(Folder $sourceFolder, $mergeFolders = false)
 {
     //make sure database is in sync with filesystem.
     $sourceFolder->syncFilesystem(true);
     $stmt = $sourceFolder->folders();
     while ($subfolder = $stmt->fetch()) {
         $subfolder->systemSave = true;
         if (!$mergeFolders) {
             $subfolder->copy($this);
         } else {
             if ($existingFolder = $this->hasFolder($subfolder->name)) {
                 $existingFolder->copyContentsFrom($subfolder, true);
             } else {
                 $subfolder->copy($this);
             }
         }
     }
     $stmt = $sourceFolder->files();
     while ($file = $stmt->fetch()) {
         $file->copy($this, false, true);
     }
 }
Esempio n. 25
0
 protected function actionSaveAttachment($params)
 {
     $folder = \GO\Files\Model\Folder::model()->findByPk($params['folder_id']);
     if (!$folder) {
         trigger_error("GO\\Email\\Controller\\Message::actionSaveAttachment(" . $params['folder_id'] . ") folder not found", E_USER_WARNING);
         throw new \GO\Base\Exception\NotFound("Specified folder not found");
     }
     if (!$folder->checkPermissionLevel(\GO\Base\Model\Acl::WRITE_PERMISSION)) {
         throw new \GO\Base\Exception\AccessDenied();
     }
     $params['filename'] = \GO\Base\Fs\File::stripInvalidChars($params['filename']);
     $file = new \GO\Base\Fs\File(GO::config()->file_storage_path . $folder->path . '/' . $params['filename']);
     if (empty($params['tmp_file'])) {
         $account = Account::model()->findByPk($params['account_id']);
         $imap = $account->openImapConnection($params['mailbox']);
         $response['success'] = $imap->save_to_file($params['uid'], $file->path(), $params['number'], $params['encoding'], true);
     } else {
         $tmpfile = new \GO\Base\Fs\File(GO::config()->tmpdir . $params['tmp_file']);
         $file = $tmpfile->copy($file->parent(), $params['filename']);
         $response['success'] = $file != false;
     }
     if (!$folder->hasFile($file->name())) {
         $folder->addFile($file->name());
     }
     if (!$response['success']) {
         $response['feedback'] = 'Could not save to ' . $file->stripFileStoragePath();
     }
     return $response;
 }
Esempio n. 26
0
 public function install()
 {
     // Install the notification cron for income contracts
     \GO\Projects2\Projects2Module::createDefaultIncomeContractNotificationCron();
     //		if(!GO::modules()->isInstalled('projects')){
     GO::getDbConnection()->query("SET sql_mode=''");
     if (!Utils::tableExists("pm_projects")) {
         parent::install();
         $defaultType = new Type();
         $defaultType->name = GO::t('default');
         $defaultType->save();
         $defaultStatus = new Status();
         $defaultStatus->name = GO::t('ongoing', 'projects2');
         $defaultStatus->show_in_tree = true;
         $defaultStatus->save();
         $noneStatus = new Status();
         $noneStatus->name = GO::t('none', 'projects2');
         $noneStatus->show_in_tree = true;
         $noneStatus->filterable = true;
         $noneStatus->save();
         $status = new Status();
         $status->name = GO::t('complete', 'projects2');
         $status->complete = true;
         $status->show_in_tree = false;
         $status->save();
         $folder = new \GO\Base\Fs\Folder(GO::config()->file_storage_path . 'projects2/template-icons');
         $folder->create();
         if (!$folder->child('folder.png')) {
             $file = new \GO\Base\Fs\File(GO::modules()->projects2->path . 'install/images/folder.png');
             $file->copy($folder);
         }
         if (!$folder->child('project.png')) {
             $file = new \GO\Base\Fs\File(GO::modules()->projects2->path . 'install/images/project.png');
             $file->copy($folder);
         }
         $template = new Template();
         $template->name = GO::t('projectsFolder', 'projects2');
         $template->default_status_id = $noneStatus->id;
         $template->default_type_id = $defaultType->id;
         $template->icon = $folder->stripFileStoragePath() . '/folder.png';
         $template->project_type = Template::PROJECT_TYPE_CONTAINER;
         $template->save();
         $template->acl->addGroup(GO::config()->group_everyone);
         $template = new Template();
         $template->name = GO::t('standardProject', 'projects2');
         $template->default_status_id = $defaultStatus->id;
         $template->default_type_id = $defaultType->id;
         $template->project_type = Template::PROJECT_TYPE_PROJECT;
         $template->fields = 'responsible_user_id,status_date,customer,budget_fees,contact,expenses';
         $template->icon = $folder->stripFileStoragePath() . '/project.png';
         $template->save();
         $template->acl->addGroup(GO::config()->group_everyone);
     } else {
         GO::setMaxExecutionTime(0);
         $oldModelTypeId = \GO\Base\Model\ModelType::model()->findByModelName("GO\\Projects\\Model\\Project");
         $modelTypeId = \GO\Base\Model\ModelType::model()->findByModelName("GO\\Projects2\\Model\\Project");
         //copy old projects module tables
         $stmt = GO::getDbConnection()->query('SHOW TABLES');
         while ($r = $stmt->fetch()) {
             $tableName = $r[0];
             if (substr($tableName, 0, 9) == 'go_links_' && !is_numeric(substr($tableName, 9, 1))) {
                 try {
                     $sql = "ALTER TABLE  `{$tableName}` ADD  `ctime` INT NOT NULL DEFAULT  '0';";
                     GO::getDbConnection()->query($sql);
                 } catch (Exception $e) {
                 }
                 $sql = "DELETE FROM `{$tableName}` WHERE model_type_id=" . intval($modelTypeId);
                 GO::debug($sql);
                 GO::getDbConnection()->query($sql);
                 $sql = "INSERT IGNORE INTO `{$tableName}` SELECT id,folder_id, model_id,'{$modelTypeId}', description, ctime FROM `{$tableName}` WHERE model_type_id={$oldModelTypeId}";
                 GO::debug($sql);
                 GO::getDbConnection()->query($sql);
             }
             if (strpos($tableName, 'pm_') !== false) {
                 //some GLOBAL2000 tables we do not want to copy
                 if (!in_array($tableName, array('pm_employees', 'pm_resources', 'pm_employment_agreements'))) {
                     $newTable = str_replace('pm_', "pr2_", $tableName);
                     $sql = "DROP TABLE IF EXISTS `{$newTable}`";
                     GO::getDbConnection()->query($sql);
                     $sql = "CREATE TABLE `{$newTable}` LIKE `{$tableName}`";
                     GO::getDbConnection()->query($sql);
                     $sql = "INSERT INTO `{$newTable}` SELECT * FROM `{$tableName}`";
                     GO::getDbConnection()->query($sql);
                 }
             }
         }
         $sql = "update pr2_projects set name = replace(name, '/','-')";
         GO::getDbConnection()->query($sql);
         //			$sql = "update pr2_projects set files_folder_id=0";
         //			GO::getDbConnection()->query($sql);
         $sql = "select version from go_modules where id='projects'";
         $stmt = GO::getDbConnection()->query($sql);
         $record = $stmt->fetch(PDO::FETCH_ASSOC);
         GO::modules()->projects2->version = $record['version'];
         GO::modules()->projects2->save();
         //			GO::modules()->projects->acl->copyPermissions(GO::modules()->projects2->acl);
         //start files
         //			$sql = "UPDATE pr2_projects SET files_folder_id=(SELECT files_folder_id FROM pm_projects WHERE pm_projects.id=pr2_projects.id);";
         //			GO::getDbConnection()->query($sql);
         $fsFolder = new GO\Base\Fs\Folder(GO::config()->file_storage_path . 'projects2');
         if ($fsFolder->exists()) {
             $fsFolder->rename('projects2-' . date('c'));
         }
         $folder = \GO\Files\Model\Folder::model()->findByPath('projects');
         $folder->name = 'projects2';
         $folder->acl_id = GO::modules()->projects2->acl_id;
         $folder->save();
         //			$sql = "UPDATE pm_projects SET files_folder_id=0;";
         //			GO::getDbConnection()->query($sql);
         $sql = "update `pr2_templates` set icon = replace(icon, 'projects/', 'projects2/');";
         GO::getDbConnection()->query($sql);
         //end files
         //upgrade database
         ob_start();
         $mc = new \GO\Core\Controller\MaintenanceController();
         $mc->run("upgrade", array(), false);
         ob_end_clean();
         //create new acl's
         //			$types = \GO\Projects\Model\Type::model()->find();
         //			foreach($types as $type){
         //				$type2 = Model\Type::model()->findByPk($type->id);
         //				$type2->setNewAcl($type->user_id);
         //				$type->acl->copyPermissions($type2->acl);
         //				$type2->save();
         //			}
         $sql = "ALTER TABLE `pr2_hours` CHANGE `income_id` `old_income_id` INT( 11 ) NULL DEFAULT NULL ;";
         GO::getDbConnection()->query($sql);
         $sql = "ALTER TABLE `pr2_hours` ADD `income_id` INT( 11 ) NULL AFTER `old_income_id` ;";
         GO::getDbConnection()->query($sql);
         $sql = "UPDATE `pr2_hours` SET old_income_id=-1*old_income_id;";
         GO::getDbConnection()->query($sql);
         if (\GO\Base\Db\Utils::tableExists("pm_employment_agreements")) {
             //GLOBAL 2000 version
             $sql = "replace into pr2_employees (user_id, external_fee, internal_fee) select employee_id, max(external_fee),max(internal_fee) from pm_employment_agreements group by employee_id";
             GO::getDbConnection()->query($sql);
             $sql = "replace into pr2_resources (user_id,project_id, external_fee, internal_fee) select user_id,project_id, external_fee, internal_fee from pm_resources";
             GO::getDbConnection()->query($sql);
             //			No longer necessary because of $updates['201310041023'] in updates.inc.php :
             //				//untested
             //				$sql = "ALTER TABLE  `pr2_hours` CHANGE  `external_value`  `external_fee` DOUBLE NOT NULL DEFAULT  '0'";
             //				GO::getDbConnection()->query($sql);
         } else {
             $sql = "insert ignore into pr2_employees (user_id, external_fee, internal_fee) select user_id, max(ext_fee_value), max(int_fee_value) from pm_hours group by user_id";
             GO::getDbConnection()->query($sql);
             $sql = "insert ignore into pr2_resources (user_id,project_id, external_fee, internal_fee) select user_id,project_id, max(ext_fee_value), max(int_fee_value) from pm_hours group by user_id, project_id";
             GO::getDbConnection()->query($sql);
         }
         $sql = "update pr2_templates set project_type=1";
         GO::getDbConnection()->query($sql);
         if (GO::modules()->customfields) {
             //				require(dirname(__FILE__).'/install/migrate/models.php');
             //				\GO\Customfields\CustomfieldsModule::replaceRecords("GO\Projects\Model\Project", "GO\Projects2\Model\Project");
             //				\GO\Customfields\CustomfieldsModule::replaceRecords("GO\Projects\Model\Hour", "GO\Projects2\Model\TimeEntry");
             //$sql = "RENAME TABLE  `cf_pm_projects` TO  `cf_pr2_projects` ";
             //GO::getDbConnection()->query($sql);
             //$sql = "RENAME TABLE  `cf_pm_hours` TO  `cf_pr2_hours` ";
             //GO::getDbConnection()->query($sql);
             $sql = "update `cf_categories` set extends_model = 'GO\\\\Projects2\\\\Model\\\\Project' where extends_model = 'GO\\\\Projects\\\\Model\\\\Project';";
             GO::getDbConnection()->query($sql);
             $sql = "update `cf_categories` set extends_model = 'GO\\\\Projects2\\\\Model\\\\Hour' where extends_model = 'GO\\\\Projects\\\\Model\\\\Hour';";
             GO::getDbConnection()->query($sql);
         }
         // Now, let's make sure that all the projects have a template.
         $folder = new Folder(GO::config()->file_storage_path . 'projects2/template-icons');
         $folder->create();
         if (!$folder->child('folder.png')) {
             $file = new File(GO::modules()->projects2->path . 'install/images/folder.png');
             $file->copy($folder);
         }
         if (!$folder->child('project.png')) {
             $file = new File(GO::modules()->projects2->path . 'install/images/project.png');
             $file->copy($folder);
         }
         if (\GO::modules()->files) {
             $fileFolder = \GO\Files\Model\Folder::model()->findByPath('projects2/template-icons', true);
             if (!$fileFolder->acl_id != \GO::modules()->projects2->acl_id) {
                 $oldIgnore = \GO::$ignoreAclPermissions;
                 \GO::$ignoreAclPermissions = true;
                 $fileFolder->acl_id = \GO::modules()->projects2->acl_id;
                 $fileFolder->save();
                 \GO::$ignoreAclPermissions = $oldIgnore;
             }
             //for icons added after install
             $fileFolder->syncFilesystem();
         }
         $normalTemplate = new Template();
         $normalTemplate->name = GO::t('normalProject', 'projects2');
         $normalTemplate->project_type = Template::PROJECT_TYPE_PROJECT;
         $normalTemplate->fields = 'responsible_user_id,status_date,customer,budget_fees,contact,expenses';
         $normalTemplate->icon = $folder->stripFileStoragePath() . '/project.png';
         $normalTemplate->save();
         GO\Base\Db\Columns::$forceLoad = true;
         $noTemplateProjectsStmt = Project::model()->find(FindParams::newInstance()->criteria(FindCriteria::newInstance()->addCondition('template_id', 0)));
         GO\Base\Db\Columns::$forceLoad = false;
         foreach ($noTemplateProjectsStmt as $noTemplateProjectModel) {
             $noTemplateProjectModel->template_id = $normalTemplate->id;
             $noTemplateProjectModel->save();
         }
         // Upgrade closed weeks
         ob_start();
         $pc = new \GO\Projects2\Controller\ProjectController();
         $pc->run("v1toV2Upgrade", array(), false);
         ob_end_clean();
     }
 }
Esempio n. 27
0
 protected function actionDownload($params)
 {
     \GO::session()->closeWriting();
     \GO::setMaxExecutionTime(0);
     if (isset($params['path'])) {
         $folder = \GO\Files\Model\Folder::model()->findByPath(dirname($params['path']));
         $file = $folder->hasFile(\GO\Base\Fs\File::utf8Basename($params['path']));
     } else {
         $file = \GO\Files\Model\File::model()->findByPk($params['id'], false, true);
     }
     if (!$file) {
         throw new \GO\Base\Exception\NotFound();
     }
     if (!empty($params['random_code'])) {
         if ($file->random_code != $params['random_code']) {
             throw new \GO\Base\Exception\NotFound();
         }
         if (time() > $file->expire_time) {
             throw new \Exception(\GO::t('downloadLinkExpired', 'files'));
         }
     } else {
         $public = substr($file->path, 0, 6) == 'public';
         if (!$public) {
             if (!\GO::user()) {
                 \GO\Base\Util\Http::basicAuth();
             }
             if (!$file->checkPermissionLevel(\GO\Base\Model\Acl::READ_PERMISSION)) {
                 throw new \GO\Base\Exception\AccessDenied();
             }
         }
     }
     // Show the file inside the browser or give it as a download
     $inline = true;
     // Defaults to show inside the browser
     if (isset($params['inline']) && $params['inline'] == "false") {
         $inline = false;
     }
     \GO\Base\Util\Http::outputDownloadHeaders($file->fsFile, $inline, !empty($params['cache']));
     $file->open();
     $this->fireEvent('beforedownload', array(&$this, &$params, &$file));
     $file->fsFile->output();
 }
Esempio n. 28
0
 public function actionRemoveDuplicates($params)
 {
     $this->render('externalHeader');
     \GO::setMaxExecutionTime(300);
     \GO::setMemoryLimit(1024);
     $calendar = \GO\Calendar\Model\Calendar::model()->findByPk($params['calendar_id']);
     if (!$calendar) {
         throw new \GO\Base\Exception\NotFound();
     }
     File::setAllowDeletes(false);
     //VERY IMPORTANT:
     \GO\Files\Model\Folder::$deleteInDatabaseOnly = true;
     \GO::session()->closeWriting();
     //close writing otherwise concurrent requests are blocked.
     $checkModels = array("GO\\Calendar\\Model\\Event" => array('name', 'start_time', 'end_time', 'rrule', 'calendar_id'));
     foreach ($checkModels as $modelName => $checkFields) {
         if (empty($params['model']) || $modelName == $params['model']) {
             echo '<h1>' . \GO::t('removeDuplicates') . '</h1>';
             $checkFieldsStr = 't.' . implode(', t.', $checkFields);
             $findParams = \GO\Base\Db\FindParams::newInstance()->ignoreAcl()->select('t.id, count(*) AS n, ' . $checkFieldsStr)->group($checkFields)->having('n>1');
             $findParams->getCriteria()->addCondition('calendar_id', $calendar->id);
             $stmt1 = \GO::getModel($modelName)->find($findParams);
             echo '<table border="1">';
             echo '<tr><td>ID</th><th>' . implode('</th><th>', $checkFields) . '</th></tr>';
             $count = 0;
             while ($dupModel = $stmt1->fetch()) {
                 $select = 't.id';
                 if (\GO::getModel($modelName)->hasFiles()) {
                     $select .= ', t.files_folder_id';
                 }
                 $findParams = \GO\Base\Db\FindParams::newInstance()->ignoreAcl()->select($select . ', ' . $checkFieldsStr)->order('id', 'ASC');
                 $findParams->getCriteria()->addCondition('calendar_id', $calendar->id);
                 foreach ($checkFields as $field) {
                     $findParams->getCriteria()->addCondition($field, $dupModel->getAttribute($field));
                 }
                 $stmt = \GO::getModel($modelName)->find($findParams);
                 $first = true;
                 while ($model = $stmt->fetch()) {
                     echo '<tr><td>';
                     if (!$first) {
                         echo '<span style="color:red">';
                     }
                     echo $model->id;
                     if (!$first) {
                         echo '</span>';
                     }
                     echo '</th>';
                     foreach ($checkFields as $field) {
                         echo '<td>' . $model->getAttribute($field, 'html') . '</td>';
                     }
                     echo '</tr>';
                     if (!$first) {
                         if (!empty($params['delete'])) {
                             if ($model->hasLinks() && $model->countLinks()) {
                                 echo '<tr><td colspan="99">' . \GO::t('skippedDeleteHasLinks') . '</td></tr>';
                             } elseif (($filesFolder = $model->getFilesFolder(false)) && ($filesFolder->hasFileChildren() || $filesFolder->hasFolderChildren())) {
                                 echo '<tr><td colspan="99">' . \GO::t('skippedDeleteHasFiles') . '</td></tr>';
                             } else {
                                 $model->delete();
                             }
                         }
                         $count++;
                     }
                     $first = false;
                 }
             }
             echo '</table>';
             echo '<p>' . sprintf(\GO::t('foundDuplicates'), $count) . '</p>';
             echo '<br /><br /><a href="' . \GO::url('calendar/calendar/removeDuplicates', array('delete' => true, 'calendar_id' => $calendar->id)) . '">' . \GO::t('clickToDeleteDuplicates') . '</a>';
         }
     }
     $this->render('externalFooter');
 }