Example #1
0
File: App.php Project: rmiddle/feg
 function render()
 {
     $active_worker = FegApplication::getActiveWorker();
     $tpl = DevblocksPlatform::getTemplateService();
     $tpl->assign('path', $this->tpl_path);
     $response = DevblocksPlatform::getHttpResponse();
     $stack = $response->path;
     array_shift($stack);
     // reports
     @($reportId = array_shift($stack));
     $report = null;
     // We're given a specific report to display
     if (!empty($reportId)) {
         if (null != ($reportMft = DevblocksPlatform::getExtension($reportId))) {
             // Make sure we have a report group
             if (null == ($report_group_mft_id = $reportMft->params['report_group'])) {
                 return;
             }
             // Make sure the report group exists
             if (null == ($report_group_mft = DevblocksPlatform::getExtension($report_group_mft_id))) {
                 return;
             }
             // Check our permissions on the parent report group before rendering the report
             if (isset($report_group_mft->params['acl']) && !$active_worker->hasPriv($report_group_mft->params['acl'])) {
                 return;
             }
             // Render
             if (null != ($report = $reportMft->createInstance()) && $report instanceof Extension_Report) {
                 /* @var $report Extension_Report */
                 $report->render();
                 return;
             }
         }
     }
     // If we don't have a selected report yet
     if (empty($report)) {
         // Organize into report groups
         $report_groups = array();
         $reportGroupMfts = DevblocksPlatform::getExtensions('feg.report.group', false);
         // [TODO] Alphabetize groups and nested reports
         // Load report groups
         if (!empty($reportGroupMfts)) {
             foreach ($reportGroupMfts as $reportGroupMft) {
                 $report_groups[$reportGroupMft->id] = array('manifest' => $reportGroupMft, 'reports' => array());
             }
         }
         $reportMfts = DevblocksPlatform::getExtensions('feg.report', false);
         // Load reports and file them under groups according to manifest
         if (!empty($reportMfts)) {
             foreach ($reportMfts as $reportMft) {
                 $report_group = $reportMft->params['report_group'];
                 if (isset($report_group)) {
                     $report_groups[$report_group]['reports'][] = $reportMft;
                 }
             }
         }
         $tpl->assign('report_groups', $report_groups);
     }
     $tpl->display('file:' . $this->tpl_path . '/reports/index.tpl');
 }
Example #2
0
 function showTabAction()
 {
     @($ext_id = DevblocksPlatform::importGPC($_REQUEST['ext_id'], 'string', ''));
     if (null != ($tab_mft = DevblocksPlatform::getExtension($ext_id)) && null != ($inst = $tab_mft->createInstance()) && $inst instanceof Extension_ResearchTab) {
         $inst->showTab();
     }
 }
Example #3
0
 function run()
 {
     // Get the controller and run the import action
     if (null != ($extension = DevblocksPlatform::getExtension(ChForumsController::EXTENSION_ID, true))) {
         if (method_exists($extension, 'import')) {
             $extension->import();
         }
     }
 }
Example #4
0
 function handleTabActionAction()
 {
     @($tab = DevblocksPlatform::importGPC($_REQUEST['tab'], 'string', ''));
     @($action = DevblocksPlatform::importGPC($_REQUEST['action'], 'string', ''));
     if (null != ($tab_mft = DevblocksPlatform::getExtension($tab)) && null != ($inst = $tab_mft->createInstance()) && $inst instanceof Extension_HomeTab) {
         if (method_exists($inst, $action . 'Action')) {
             call_user_func(array(&$inst, $action . 'Action'));
         }
     }
 }
Example #5
0
 function authenticateAction()
 {
     @($original_path = explode(',', DevblocksPlatform::importGPC($_POST['original_path'])));
     $manifest = DevblocksPlatform::getExtension('login.default');
     $inst = $manifest->createInstance();
     /* @var $inst Extension_LoginAuthenticator */
     $url_service = DevblocksPlatform::getUrlService();
     if ($inst->authenticate()) {
         //authentication passed
         if ($original_path[0] == '') {
             unset($original_path[0]);
         }
         $devblocks_response = new DevblocksHttpResponse($original_path);
         // Worker
         $worker = CerberusApplication::getActiveWorker();
         // Timezone
         if (null != ($timezone = DAO_WorkerPref::get($worker->id, 'timezone'))) {
             $_SESSION['timezone'] = $timezone;
             @date_default_timezone_set($timezone);
         }
         // Language
         if (null != ($lang_code = DAO_WorkerPref::get($worker->id, 'locale'))) {
             $_SESSION['locale'] = $lang_code;
             DevblocksPlatform::setLocale($lang_code);
         }
         if (!empty($devblocks_response->path) && $devblocks_response->path[0] == 'login') {
             $tour_enabled = intval(DAO_WorkerPref::get($worker->id, 'assist_mode', 1));
             $next_page = $tour_enabled ? 'welcome' : 'home';
             $devblocks_response = new DevblocksHttpResponse(array($next_page));
         }
     } else {
         //authentication failed
         $devblocks_response = new DevblocksHttpResponse(array('login', 'failed'));
     }
     DevblocksPlatform::redirect($devblocks_response);
 }
Example #6
0
 function saveCommunityToolAction()
 {
     @($code = DevblocksPlatform::importGPC($_POST['portal'], 'string'));
     @($name = DevblocksPlatform::importGPC($_POST['portal_name'], 'string', ''));
     @($iDelete = DevblocksPlatform::importGPC($_POST['do_delete'], 'integer', 0));
     UmPortalHelper::setCode($code);
     if (DEMO_MODE) {
         if ($iDelete) {
             DevblocksPlatform::redirect(new DevblocksHttpResponse(array('config', 'communities')));
         } else {
             self::getCommunityToolAction();
         }
         return;
     }
     if (null != ($instance = DAO_CommunityTool::getByCode($code))) {
         // Deleting?
         if (!empty($iDelete)) {
             $tool = DAO_CommunityTool::getByCode($code);
             /* @var $tool Model_CommunityTool */
             DAO_CommunityTool::delete($tool->id);
             DevblocksPlatform::redirect(new DevblocksHttpResponse(array('config', 'communities')));
             return;
         } else {
             $manifest = DevblocksPlatform::getExtension($instance->extension_id, false, true);
             $tool = $manifest->createInstance();
             /* @var $tool Extension_UsermeetTool */
             // Update the tool name if it has changed
             if (0 != strcmp($instance->name, $name)) {
                 DAO_CommunityTool::update($instance->id, array(DAO_CommunityTool::NAME => $name));
             }
             // Defer the rest to tool instances and extensions
             $tool->saveConfiguration();
         }
     }
     self::getCommunityToolAction();
 }
Example #7
0
            $db->Execute(sprintf("DELETE FROM requester WHERE address_id IN (%s)", implode(',', $ids_not_best)));
            // Ticket: First Wrote (merge dupe reqs)
            $db->Execute(sprintf("UPDATE ticket SET first_wrote_address_id = %d WHERE first_wrote_address_id IN (%s)", $best_id, implode(',', $ids_not_best)));
            $db->Execute(sprintf("DELETE FROM ticket WHERE first_wrote_address_id IN (%s)", implode(',', $ids_not_best)));
            // Ticket: Last Wrote (merge dupe reqs)
            $db->Execute(sprintf("UPDATE ticket SET last_wrote_address_id = %d WHERE last_wrote_address_id IN (%s)", $best_id, implode(',', $ids_not_best)));
            $db->Execute(sprintf("DELETE FROM ticket WHERE last_wrote_address_id IN (%s)", implode(',', $ids_not_best)));
            // Addresses
            $db->Execute(sprintf("DELETE FROM address WHERE id IN (%s)", implode(',', $ids_not_best)));
        }
        $rs->MoveNext();
    }
}
// Fix blank ticket.first_message_id links (compose)
$rs = $db->Execute('select t.id,max(m.id) as max_id,min(m.id) as min_id from ticket t inner join message m on (m.ticket_id=t.id) where t.first_message_id = 0 group by t.id;');
while (!$rs->EOF) {
    $db->Execute(sprintf("UPDATE ticket SET first_message_id = %d WHERE id = %d", $rs->fields['max_id'], $rs->fields['id']));
    $rs->MoveNext();
}
// [TODO] This should probably be checked (though MySQL needs special BINARY syntax)
$db->Execute("UPDATE address SET email = LOWER(email)");
// Enable heartbeat cron
if (null != ($cron_mf = DevblocksPlatform::getExtension('cron.heartbeat'))) {
    if (null != ($cron = $cron_mf->createInstance())) {
        $cron->setParam(CerberusCronPageExtension::PARAM_ENABLED, true);
        $cron->setParam(CerberusCronPageExtension::PARAM_DURATION, '5');
        $cron->setParam(CerberusCronPageExtension::PARAM_TERM, 'm');
        $cron->setParam(CerberusCronPageExtension::PARAM_LASTRUN, strtotime('Yesterday'));
    }
}
return TRUE;
Example #8
0
 private function mergeTicket($event)
 {
     // Listen for ticket merges and update our internal ticket_id records
     @($new_ticket_id = $event->params['new_ticket_id']);
     @($old_ticket_ids = $event->params['old_ticket_ids']);
     $translate = DevblocksPlatform::getTranslationService();
     if (empty($new_ticket_id) || empty($old_ticket_ids)) {
         return;
     }
     $setting_manifest = DevblocksPlatform::getExtension(AnswernetLastActionAndAuditLogConfigTab::ID);
     $setting = $setting_manifest->createInstance();
     $al_merge_enabled = intval($setting->getParam(AnswernetLastActionAndAuditLogConfigTab::AL_MERGE_ENABLED, 0));
     $uf_merge_enabled = intval($setting->getParam(AnswernetLastActionAndAuditLogConfigTab::UF_MERGE_ENABLED, 0));
     if (!($al_merge_enabled || $uf_merge_enabled)) {
         return;
     }
     $active_worker = CerberusApplication::getActiveWorker();
     $worker_id = $active_worker->id;
     if (class_exists('DAO_TicketAuditLog', true)) {
         if ($al_merge_enabled) {
             foreach ($old_ticket_ids as $old_id) {
                 $old_ticket = DAO_Ticket::getTicket($old_id);
                 $translate_str = $translate->_('answernet.last_action_and_audit_log.post.merge.new_ticket');
                 $translated = sprintf($translate_str, $old_id, $old_ticket->mask);
                 $fields = array(DAO_TicketAuditLog::TICKET_ID => $new_ticket_id, DAO_TicketAuditLog::WORKER_ID => $worker_id, DAO_TicketAuditLog::CHANGE_DATE => time(), DAO_TicketAuditLog::CHANGE_FIELD => "answernet.last_action_and_audit_log.type.merge", DAO_TicketAuditLog::CHANGE_VALUE => substr($translated, 0, 128));
                 $log_id = DAO_TicketAuditLog::create($fields);
             }
             unset($fields);
         }
     }
     if ($uf_merge_enabled) {
         $new_change_fields[DAO_Ticket::UPDATED_DATE] = time();
         DAO_Ticket::updateTicket($new_ticket_id, $new_change_fields);
         unset($new_change_fields);
     }
 }
Example #9
0
 private function _workerAssignedTask($event)
 {
     $translate = DevblocksPlatform::getTranslationService();
     $events = DevblocksPlatform::getEventService();
     $worker_id = $event->params['worker_id'];
     $context = $event->params['context'];
     $task_id = $event->params['context_id'];
     $mail_service = DevblocksPlatform::getMailService();
     $mailer = null;
     // lazy load
     $settings = DevblocksPlatform::getPluginSettingsService();
     $reply_to = $settings->get('cerberusweb.core', CerberusSettings::DEFAULT_REPLY_FROM, CerberusSettingsDefaults::DEFAULT_REPLY_FROM);
     $reply_personal = $settings->get('cerberusweb.core', CerberusSettings::DEFAULT_REPLY_PERSONAL, CerberusSettingsDefaults::DEFAULT_REPLY_PERSONAL);
     $task = DAO_Task::get($task_id);
     // Sanitize and combine all the destination addresses
     $next_worker = DAO_Worker::get($worker_id);
     $notify_emails = $next_worker->email;
     if (empty($notify_emails)) {
         return;
     }
     try {
         if (null == $mailer) {
             $mailer = $mail_service->getMailer(CerberusMail::getMailerDefaults());
         }
         // Create the message
         $mail = $mail_service->createMessage();
         $mail->setTo(array($notify_emails));
         $mail->setFrom(array($reply_to => $reply_personal));
         $mail->setReplyTo($reply_to);
         $mail->setSubject(sprintf("[Task Assignment #%d]: %s", $task->id, $task->title));
         $headers = $mail->getHeaders();
         $headers->addTextHeader('X-Mailer', 'Cerberus Helpdesk (Build ' . APP_BUILD . ')');
         $headers->addTextHeader('Precedence', 'List');
         $headers->addTextHeader('Auto-Submitted', 'auto-generated');
         $body = sprintf("[Task Assignment #%d]: %s", $task->id, $task->title);
         $mft = DevblocksPlatform::getExtension($context, false, true);
         $ext = $mft->createInstance();
         $url = $ext->getPermalink($task_id);
         $body .= "\r\n" . $url;
         // Comments
         $comments = DAO_Comment::getByContext(CerberusContexts::CONTEXT_TASK, $task_id);
         foreach ($comments as $comment_id => $comment) {
             $address = DAO_Address::get($comment->address_id);
             $body .= "\r\nCommented By: " . $address->first_name . " " . $address->last_name;
             $body .= "\r\n" . $comment->comment;
         }
         unset($comments);
         $body .= "\r\n";
         $mail->setBody($body);
         $result = $mailer->send($mail);
     } catch (Exception $e) {
         echo "Task Email Notification failed to send<br>";
     }
 }
Example #10
0
 function handleRequest(DevblocksHttpRequest $request)
 {
     @($path = $request->path);
     if (empty($path) || !is_array($path)) {
         return;
     }
     $uri = array_shift($path);
     $rss_controllers = DevblocksPlatform::getExtensions('usermeet.sc.rss.controller');
     foreach ($rss_controllers as $extension_id => $rss_controller) {
         if (0 == strcasecmp($rss_controller->params['uri'], $uri)) {
             $controller = DevblocksPlatform::getExtension($extension_id, true);
             $controller->handleRequest(new DevblocksHttpRequest($path));
             return;
         }
     }
     // [TOOD] subcontroller not found
 }
Example #11
0
    $sql = "UPDATE view_rss SET source_extension = 'core.rss.source.ticket' WHERE source_extension = ''";
    $db->Execute($sql);
}
// `worker` ========================
$columns = $datadict->MetaColumns('worker');
$indexes = $datadict->MetaIndexes('worker', false);
if (!isset($columns['IS_DISABLED'])) {
    $sql = $datadict->AddColumnSQL('worker', "is_disabled I1 DEFAULT 0 NOTNULL");
    $datadict->ExecuteSQLArray($sql);
}
if (!isset($indexes['pos'])) {
    $sql = $datadict->CreateIndexSQL('last_activity_date', 'worker', 'last_activity_date');
    $datadict->ExecuteSQLArray($sql);
}
// Configure import cron
if (null != ($cron_mf = DevblocksPlatform::getExtension('cron.import'))) {
    if (null != ($cron = $cron_mf->createInstance())) {
        $cron->setParam(CerberusCronPageExtension::PARAM_ENABLED, false);
        $cron->setParam(CerberusCronPageExtension::PARAM_DURATION, '0');
        $cron->setParam(CerberusCronPageExtension::PARAM_TERM, 'm');
        $cron->setParam(CerberusCronPageExtension::PARAM_LASTRUN, strtotime('Yesterday'));
    }
}
// `worker_event` =============================
if (!isset($tables['worker_event'])) {
    $flds = "\r\n\t\tid I4 DEFAULT 0 NOTNULL PRIMARY,\r\n\t\tcreated_date I4 DEFAULT 0 NOTNULL,\r\n\t\tworker_id I4 DEFAULT 0 NOTNULL,\r\n\t\ttitle C(255) DEFAULT '' NOTNULL,\r\n\t\tcontent XL,\r\n\t\tis_read I1 DEFAULT 0 NOTNULL,\r\n\t\turl C(255) DEFAULT '' NOTNULL\r\n\t";
    $sql = $datadict->CreateTableSQL('worker_event', $flds);
    $datadict->ExecuteSQLArray($sql);
    if (!isset($indexes['created_date'])) {
        $sql = $datadict->CreateIndexSQL('created_date', 'worker_event', 'created_date');
        $datadict->ExecuteSQLArray($sql);
Example #12
0
 public function writeResponse(DevblocksHttpResponse $response)
 {
     $path = $response->path;
     // [JAS]: Ajax? // [TODO] Explore outputting whitespace here for Safari
     //	    if(empty($path))
     //			return;
     $tpl = DevblocksPlatform::getTemplateService();
     $session = DevblocksPlatform::getSessionService();
     $settings = CerberusSettings::getInstance();
     $translate = DevblocksPlatform::getTranslationService();
     $active_worker = CerberusApplication::getActiveWorker();
     $visit = $session->getVisit();
     $page_manifests = $this->_getAllowedPages();
     $controller = array_shift($path);
     // Default page [TODO] This is supposed to come from framework.config.php
     if (empty($controller)) {
         $controller = 'home';
     }
     // [JAS]: Require us to always be logged in for Cerberus pages
     if (empty($visit) && 0 != strcasecmp($controller, 'login')) {
         $query = array();
         if (!empty($response->path)) {
             $query = array('url' => urlencode(implode('/', $response->path)));
         }
         DevblocksPlatform::redirect(new DevblocksHttpRequest(array('login'), $query));
     }
     $page_id = $this->_getPageIdByUri($controller);
     @($page = DevblocksPlatform::getExtension($page_id, true));
     /* @var $page CerberusPageExtension */
     if (empty($page)) {
         header("Status: 404");
         return;
         // [TODO] 404
     }
     // [JAS]: Listeners (Step-by-step guided tour, etc.)
     $listenerManifests = DevblocksPlatform::getExtensions('devblocks.listener.http');
     foreach ($listenerManifests as $listenerManifest) {
         /* @var $listenerManifest DevblocksExtensionManifest */
         $inst = $listenerManifest->createInstance();
         /* @var $inst DevblocksHttpRequestListenerExtension */
         $inst->run($response, $tpl);
     }
     $tpl->assign('active_worker', $active_worker);
     $tour_enabled = false;
     if (!empty($visit) && !is_null($active_worker)) {
         $tour_enabled = intval(DAO_WorkerPref::get($active_worker->id, 'assist_mode', 1));
         if (DEMO_MODE) {
             $tour_enabled = 1;
         }
         // override for DEMO
         $keyboard_shortcuts = intval(DAO_WorkerPref::get($active_worker->id, 'keyboard_shortcuts', 1));
         $tpl->assign('pref_keyboard_shortcuts', $keyboard_shortcuts);
         $active_worker_memberships = $active_worker->getMemberships();
         $tpl->assign('active_worker_memberships', $active_worker_memberships);
         $unread_notifications = DAO_WorkerEvent::getUnreadCountByWorker($active_worker->id);
         $tpl->assign('active_worker_notify_count', $unread_notifications);
         DAO_Worker::logActivity($active_worker->id, $page->getActivity());
     }
     $tpl->assign('tour_enabled', $tour_enabled);
     // [JAS]: Variables provided to all page templates
     $tpl->assign('settings', $settings);
     $tpl->assign('session', $_SESSION);
     $tpl->assign('translate', $translate);
     $tpl->assign('visit', $visit);
     $tpl->assign('license', CerberusLicense::getInstance());
     $tpl->assign('page_manifests', $page_manifests);
     $tpl->assign('page', $page);
     $tpl->assign('response_uri', implode('/', $response->path));
     $core_tpl = DEVBLOCKS_PLUGIN_PATH . 'cerberusweb.core/templates/';
     $tpl->assign('core_tpl', $core_tpl);
     // Prebody Renderers
     $preBodyRenderers = DevblocksPlatform::getExtensions('cerberusweb.renderer.prebody', true);
     if (!empty($preBodyRenderers)) {
         $tpl->assign('prebody_renderers', $preBodyRenderers);
     }
     // Postbody Renderers
     $postBodyRenderers = DevblocksPlatform::getExtensions('cerberusweb.renderer.postbody', true);
     if (!empty($postBodyRenderers)) {
         $tpl->assign('postbody_renderers', $postBodyRenderers);
     }
     // Timings
     $tpl->assign('render_time', microtime(true) - DevblocksPlatform::getStartTime());
     if (function_exists('memory_get_usage') && function_exists('memory_get_peak_usage')) {
         $tpl->assign('render_memory', memory_get_usage() - DevblocksPlatform::getStartMemory());
         $tpl->assign('render_peak_memory', memory_get_peak_usage() - DevblocksPlatform::getStartPeakMemory());
     }
     $tpl->display($core_tpl . 'border.tpl');
     //		$cache = DevblocksPlatform::getCacheService();
     //		$cache->printStatistics();
 }
Example #13
0
 function trigger(Model_DevblocksEvent $event)
 {
     /*
      * [TODO] Look at the hash and spawn our listeners for this particular point
      */
     $events = DevblocksPlatform::getEventRegistry();
     if (null == ($listeners = @$events[$event->id])) {
         $listeners = array();
     }
     // [TODO] Make sure we can't get a double listener
     if (is_array($events['*'])) {
         foreach ($events['*'] as $evt) {
             $listeners[] = $evt;
         }
     }
     if (is_array($listeners) && !empty($listeners)) {
         foreach ($listeners as $listener) {
             /* @var $listener DevblocksExtensionManifest */
             $manifest = DevblocksPlatform::getExtension($listener);
             $inst = $manifest->createInstance();
             /* @var $inst DevblocksEventListenerExtension */
             $inst->handleEvent($event);
         }
     }
 }
Example #14
0
 function showSensorExtensionConfigAction()
 {
     @($ext_id = DevblocksPlatform::importGPC($_REQUEST['ext_id'], 'string', ''));
     @($id = DevblocksPlatform::importGPC($_REQUEST['id'], 'integer', 0));
     if (null == ($sensor = DAO_Sensor::get($id))) {
         $sensor = new Model_Sensor();
     }
     if (!empty($ext_id)) {
         if (null != ($ext = DevblocksPlatform::getExtension($ext_id, true))) {
             if ($ext instanceof Extension_Sensor) {
                 $ext->renderConfig($sensor);
             }
         }
     }
 }
Example #15
0
 function showEntryAction($model = null)
 {
     $tpl = DevblocksPlatform::getTemplateService();
     $tpl_path = dirname(dirname(__FILE__)) . '/templates/';
     $tpl->assign('path', $tpl_path);
     $tpl->cache_lifetime = "0";
     @($id = DevblocksPlatform::importGPC($_REQUEST['id'], 'integer', 0));
     /*
      * [IMPORTANT -- Yes, this is simply a line in the sand.]
      * You're welcome to modify the code to meet your needs, but please respect 
      * our licensing.  Buy a legitimate copy to help support the project!
      * http://www.cerberusweb.com/
      */
     $license = CerberusLicense::getInstance();
     if (empty($id) && (empty($license['serial']) || !empty($license['serial']) && isset($license['a'])) && 10 <= DAO_TimeTrackingEntry::getItemCount()) {
         $tpl->display('file:' . $tpl_path . 'timetracking/rpc/trial.tpl');
         return;
     }
     /*
      * This treats procedurally created model objects
      * the same as existing objects
      */
     if (!empty($id)) {
         // Were we given a model ID to load?
         if (null != ($model = DAO_TimeTrackingEntry::get($id))) {
             $tpl->assign('model', $model);
         }
     } elseif (!empty($model)) {
         // Were we passed a model object without an ID?
         $tpl->assign('model', $model);
     }
     /* @var $model Model_TimeTrackingEntry */
     // Source extension
     if (!empty($model->source_extension_id)) {
         if (null != ($source = DevblocksPlatform::getExtension($model->source_extension_id, true))) {
             $tpl->assign('source', $source);
         }
     }
     // Org Name
     if (!empty($model->debit_org_id)) {
         if (null != ($org = DAO_ContactOrg::get($model->debit_org_id))) {
             $tpl->assign('org', $org);
         }
     }
     // Activities
     // [TODO] Cache
     $billable_activities = DAO_TimeTrackingActivity::getWhere(sprintf("%s!=0", DAO_TimeTrackingActivity::RATE));
     $tpl->assign('billable_activities', $billable_activities);
     $nonbillable_activities = DAO_TimeTrackingActivity::getWhere(sprintf("%s=0", DAO_TimeTrackingActivity::RATE));
     $tpl->assign('nonbillable_activities', $nonbillable_activities);
     // Custom fields
     $custom_fields = DAO_CustomField::getBySource(ChCustomFieldSource_TimeEntry::ID);
     $tpl->assign('custom_fields', $custom_fields);
     $custom_field_values = DAO_CustomFieldValue::getValuesBySourceIds(ChCustomFieldSource_TimeEntry::ID, $id);
     if (isset($custom_field_values[$id])) {
         $tpl->assign('custom_field_values', $custom_field_values[$id]);
     }
     $types = Model_CustomField::getTypes();
     $tpl->assign('types', $types);
     $tpl->display('file:' . $tpl_path . 'timetracking/rpc/time_entry_panel.tpl');
 }
Example #16
0
 function getContactSituationAction()
 {
     @($portal = DevblocksPlatform::importGPC($_REQUEST['portal'], 'string', ''));
     UmPortalHelper::setCode($portal);
     $module = DevblocksPlatform::getExtension('sc.controller.contact', true, true);
     $module->getSituation();
 }
Example #17
0
// ===========================================================================
// Enable Cronjobs

if(null != ($cron = DevblocksPlatform::getExtension('cron.issues.wgm', true, true))) {
	$cron->setParam(CerberusCronPageExtension::PARAM_ENABLED, true);
	$cron->setParam(CerberusCronPageExtension::PARAM_DURATION, '5');
	$cron->setParam(CerberusCronPageExtension::PARAM_TERM, 'm');
	$cron->setParam(CerberusCronPageExtension::PARAM_LASTRUN, strtotime('Yesterday 23:00'));
}

if(null != ($cron = DevblocksPlatform::getExtension('cron.sync.containers.wgm', true, true))) {
	$cron->setParam(CerberusCronPageExtension::PARAM_ENABLED, true);
	$cron->setParam(CerberusCronPageExtension::PARAM_DURATION, '6');
	$cron->setParam(CerberusCronPageExtension::PARAM_TERM, 'h');
	$cron->setParam(CerberusCronPageExtension::PARAM_LASTRUN, strtotime('Yesterday 23:00'));
}

if(null != ($cron = DevblocksPlatform::getExtension('cron.recache.containers.wgm', true, true))) {
	$cron->setParam(CerberusCronPageExtension::PARAM_ENABLED, true);
	$cron->setParam(CerberusCronPageExtension::PARAM_DURATION, '12');
	$cron->setParam(CerberusCronPageExtension::PARAM_TERM, 'h');
	$cron->setParam(CerberusCronPageExtension::PARAM_LASTRUN, strtotime('Yesterday 23:00'));
}

if(null != ($cron = DevblocksPlatform::getExtension('cron.milestones.wgm', true, true))) {
	$cron->setParam(CerberusCronPageExtension::PARAM_ENABLED, true);
	$cron->setParam(CerberusCronPageExtension::PARAM_DURATION, '6');
	$cron->setParam(CerberusCronPageExtension::PARAM_TERM, 'h');
	$cron->setParam(CerberusCronPageExtension::PARAM_LASTRUN, strtotime('Yesterday 23:00'));
}
Example #18
0
 function saveCommunityToolAction()
 {
     @($code = DevblocksPlatform::importGPC($_POST['portal'], 'string'));
     @($iDelete = DevblocksPlatform::importGPC($_POST['do_delete'], 'integer', 0));
     if (DEMO_MODE) {
         if ($iDelete) {
             DevblocksPlatform::redirect(new DevblocksHttpResponse(array('config', 'communities')));
         } else {
             self::getCommunityToolAction();
         }
         return;
     }
     if (null != ($instance = DAO_CommunityTool::getByCode($code))) {
         // Deleting?
         if (!empty($iDelete)) {
             $tool = DAO_CommunityTool::getByCode($code);
             /* @var $tool Model_CommunityTool */
             DAO_CommunityTool::delete($tool->id);
             DevblocksPlatform::redirect(new DevblocksHttpResponse(array('config', 'communities')));
             return;
         } else {
             $manifest = DevblocksPlatform::getExtension($instance->extension_id, false, true);
             $tool = $manifest->createInstance();
             /* @var $tool Extension_UsermeetTool */
             $tool->setPortal($code);
             // [TODO] Kinda hacky
             $tool->saveConfiguration();
         }
     }
     self::getCommunityToolAction();
 }
Example #19
0
 private function _getFieldSource($ext_id)
 {
     $tpl = DevblocksPlatform::getTemplateService();
     $tpl->assign('path', $this->_TPL_PATH);
     $tpl->assign('ext_id', $ext_id);
     // [TODO] Make sure the extension exists before continuing
     $source_manifest = DevblocksPlatform::getExtension($ext_id, false);
     $tpl->assign('source_manifest', $source_manifest);
     $types = Model_CustomField::getTypes();
     $tpl->assign('types', $types);
     // Look up the defined global fields by the given extension
     $fields = DAO_CustomField::getBySource($ext_id);
     $tpl->assign('fields', $fields);
     $tpl->display('file:' . $this->_TPL_PATH . 'setup/tabs/fields/edit_source.tpl');
 }
Example #20
0
 function render()
 {
     $this->_sanitize();
     $tpl = DevblocksPlatform::getTemplateService();
     $tpl->assign('id', $this->id);
     $tpl->assign('view', $this);
     $workers = DAO_Worker::getAll();
     $tpl->assign('workers', $workers);
     $tpl->assign('timestamp_now', time());
     // Pull the results so we can do some row introspection
     $results = $this->getData();
     $tpl->assign('results', $results);
     //		$source_renderers = DevblocksPlatform::getExtensions('cerberusweb.task.source', true);
     // Make a list of unique source_extension and load their renderers
     $source_extensions = array();
     if (is_array($results) && isset($results[0])) {
         foreach ($results[0] as $rows) {
             $source_extension = $rows[SearchFields_Task::SOURCE_EXTENSION];
             if (!isset($source_extensions[$source_extension]) && !empty($source_extension) && null != ($mft = DevblocksPlatform::getExtension($source_extension))) {
                 $source_extensions[$source_extension] = $mft->createInstance();
             }
         }
     }
     $tpl->assign('source_renderers', $source_extensions);
     // Custom fields
     $custom_fields = DAO_CustomField::getBySource(ChCustomFieldSource_Task::ID);
     $tpl->assign('custom_fields', $custom_fields);
     $tpl->cache_lifetime = "0";
     $tpl->assign('view_fields', $this->getColumns());
     $tpl->display('file:' . DEVBLOCKS_PLUGIN_PATH . 'cerberusweb.core/templates/tasks/view.tpl');
 }
Example #21
0
 function doAddWorkspaceAction()
 {
     @($name = DevblocksPlatform::importGPC($_REQUEST['name'], 'string', ''));
     @($source = DevblocksPlatform::importGPC($_REQUEST['source'], 'string', ''));
     @($workspace = DevblocksPlatform::importGPC($_REQUEST['workspace'], 'string', ''));
     @($new_workspace = DevblocksPlatform::importGPC($_REQUEST['new_workspace'], 'string', ''));
     $active_worker = PortSensorApplication::getActiveWorker();
     $visit = PortSensorApplication::getVisit();
     // Source extension exists
     if (null != ($source_manifest = DevblocksPlatform::getExtension($source, false))) {
         // Class exists
         if (null != @($class = $source_manifest->params['view_class'])) {
             if (empty($name)) {
                 $name = $source_manifest->name;
             }
             // New workspace
             if (!empty($new_workspace)) {
                 $workspace = $new_workspace;
             }
             if (empty($workspace)) {
                 $workspace = 'New Workspace';
             }
             $view = new $class();
             /* @var $view Ps_AbstractView */
             // Build the list model
             $list = new Model_WorklistView();
             $list->title = $name;
             $list->columns = $view->view_columns;
             $list->params = $view->params;
             $list->num_rows = $view->renderLimit;
             $list->sort_by = $view->renderSortBy;
             $list->sort_asc = $view->renderSortAsc;
             // Add the worklist
             $fields = array(DAO_Worklist::WORKER_ID => $active_worker->id, DAO_Worklist::VIEW_POS => 1, DAO_Worklist::VIEW_SERIALIZED => serialize($list), DAO_Worklist::WORKSPACE => $workspace, DAO_Worklist::SOURCE_EXTENSION => $source_manifest->id);
             DAO_Worklist::create($fields);
             // Select the new tab
             $visit->set(PortSensorVisit::KEY_HOME_SELECTED_TAB, 'w_' . $workspace);
         }
     }
     DevblocksPlatform::redirect(new DevblocksHttpResponse(array('home')));
 }
Example #22
0
 function showTaskPeekAction()
 {
     @($id = DevblocksPlatform::importGPC($_REQUEST['id'], 'integer', ''));
     @($view_id = DevblocksPlatform::importGPC($_REQUEST['view_id'], 'string', ''));
     @($link_namespace = DevblocksPlatform::importGPC($_REQUEST['link_namespace'], 'string', ''));
     // opt
     @($link_object_id = DevblocksPlatform::importGPC($_REQUEST['link_object_id'], 'integer', 0));
     // opt
     $tpl = DevblocksPlatform::getTemplateService();
     $tpl->cache_lifetime = "0";
     $path = $this->_TPL_PATH;
     $tpl->assign('path', $path);
     if (!empty($id)) {
         $task = DAO_Task::get($id);
         $tpl->assign('task', $task);
         if (!empty($task->source_extension) && !empty($task->source_id)) {
             if (null != ($mft = DevblocksPlatform::getExtension($task->source_extension))) {
                 $source_info = $mft->createInstance();
                 @$tpl->assign('source_info', $source_info->getSourceInfo($task->source_id));
             }
         }
     }
     // Only used on create
     if (!empty($link_namespace) && !empty($link_object_id)) {
         $tpl->assign('link_namespace', $link_namespace);
         $tpl->assign('link_object_id', $link_object_id);
     }
     $workers = DAO_Worker::getAllActive();
     $tpl->assign('workers', $workers);
     // Custom fields
     $custom_fields = DAO_CustomField::getBySource(ChCustomFieldSource_Task::ID);
     $tpl->assign('custom_fields', $custom_fields);
     $custom_field_values = DAO_CustomFieldValue::getValuesBySourceIds(ChCustomFieldSource_Task::ID, $id);
     if (isset($custom_field_values[$id])) {
         $tpl->assign('custom_field_values', $custom_field_values[$id]);
     }
     $types = Model_CustomField::getTypes();
     $tpl->assign('types', $types);
     // View
     $tpl->assign('id', $id);
     $tpl->assign('view_id', $view_id);
     $tpl->display('file:' . $path . 'tasks/rpc/peek.tpl');
 }
Example #23
0
 function saveJobAction()
 {
     $translate = DevblocksPlatform::getTranslationService();
     $worker = CerberusApplication::getActiveWorker();
     if (!$worker || !$worker->is_superuser) {
         echo $translate->_('common.access_denied');
         return;
     }
     if (DEMO_MODE) {
         DevblocksPlatform::setHttpResponse(new DevblocksHttpResponse(array('config', 'scheduler')));
         return;
     }
     // [TODO] Save the job changes
     @($id = DevblocksPlatform::importGPC($_REQUEST['id'], 'string', ''));
     @($enabled = DevblocksPlatform::importGPC($_REQUEST['enabled'], 'integer', 0));
     @($locked = DevblocksPlatform::importGPC($_REQUEST['locked'], 'integer', 0));
     @($duration = DevblocksPlatform::importGPC($_REQUEST['duration'], 'integer', 5));
     @($term = DevblocksPlatform::importGPC($_REQUEST['term'], 'string', 'm'));
     @($starting = DevblocksPlatform::importGPC($_REQUEST['starting'], 'string', ''));
     $manifest = DevblocksPlatform::getExtension($id);
     $job = $manifest->createInstance();
     /* @var $job CerberusCronPageExtension */
     if (!empty($starting)) {
         $starting_time = strtotime($starting);
         if (false === $starting_time) {
             $starting_time = time();
         }
         $starting_time -= CerberusCronPageExtension::getIntervalAsSeconds($duration, $term);
         $job->setParam(CerberusCronPageExtension::PARAM_LASTRUN, $starting_time);
     }
     if (!$job instanceof CerberusCronPageExtension) {
         die($translate->_('common.access_denied'));
     }
     // [TODO] This is really kludgey
     $job->setParam(CerberusCronPageExtension::PARAM_ENABLED, $enabled);
     $job->setParam(CerberusCronPageExtension::PARAM_LOCKED, $locked);
     $job->setParam(CerberusCronPageExtension::PARAM_DURATION, $duration);
     $job->setParam(CerberusCronPageExtension::PARAM_TERM, $term);
     $job->saveConfigurationAction();
     DevblocksPlatform::setHttpResponse(new DevblocksHttpResponse(array('config', 'scheduler')));
 }
Example #24
0
 function authenticateLDAPAction()
 {
     @($server = DevblocksPlatform::importGPC($_POST['server']));
     @($port = DevblocksPlatform::importGPC($_POST['port']));
     @($dn = DevblocksPlatform::importGPC($_POST['dn']));
     @($password = DevblocksPlatform::importGPC($_POST['password']));
     @($original_path = explode(',', DevblocksPlatform::importGPC($_POST['original_path'])));
     @($original_query_str = DevblocksPlatform::importGPC($_POST['original_query']));
     $manifest = DevblocksPlatform::getExtension('login.ldap');
     $inst = $manifest->createInstance();
     /* @var $inst CerberusLoginPageExtension */
     $url_service = DevblocksPlatform::getUrlService();
     if ($inst->authenticate(array('server' => $server, 'port' => $port, 'dn' => $dn, 'password' => $password))) {
         //authentication passed
         $original_query = $url_service->parseQueryString($original_query_str);
         if ($original_path[0] == '') {
             unset($original_path[0]);
         }
         $devblocks_response = new DevblocksHttpResponse($original_path, $original_query);
         if ($devblocks_response->path[0] == 'login') {
             $session = DevblocksPlatform::getSessionService();
             $visit = $session->getVisit();
             $tour_enabled = false;
             if (!empty($visit) && !is_null($visit->getWorker())) {
                 $worker = $visit->getWorker();
                 $tour_enabled = intval(DAO_WorkerPref::get($worker->id, 'assist_mode', 1));
             }
             $next_page = $tour_enabled ? 'welcome' : 'home';
             $devblocks_response = new DevblocksHttpResponse(array($next_page));
         }
     } else {
         //authentication failed
         $devblocks_response = new DevblocksHttpResponse(array('login'));
     }
     DevblocksPlatform::redirect($devblocks_response);
 }
Example #25
0
 public function writeResponse(DevblocksHttpResponse $response)
 {
     $umsession = $this->getSession();
     $stack = $response->path;
     $modules = $this->_getModules();
     $tpl = DevblocksPlatform::getTemplateService();
     $tpl->cache_lifetime = "0";
     $tpl_path = dirname(dirname(__FILE__)) . '/templates/';
     $tpl->assign('tpl_path', $tpl_path);
     $logo_url = DAO_CommunityToolProperty::get($this->getPortal(), self::PARAM_LOGO_URL, '');
     $tpl->assign('logo_url', $logo_url);
     $page_title = DAO_CommunityToolProperty::get($this->getPortal(), self::PARAM_PAGE_TITLE, 'Support Center');
     $tpl->assign('page_title', $page_title);
     $footer_html = DAO_CommunityToolProperty::get($this->getPortal(), self::PARAM_FOOTER_HTML, '');
     $tpl->assign('footer_html', $footer_html);
     $captcha_enabled = DAO_CommunityToolProperty::get($this->getPortal(), self::PARAM_CAPTCHA_ENABLED, 1);
     $tpl->assign('captcha_enabled', $captcha_enabled);
     $allow_logins = DAO_CommunityToolProperty::get($this->getPortal(), self::PARAM_ALLOW_LOGINS, 0);
     $tpl->assign('allow_logins', $allow_logins);
     $allow_subjects = DAO_CommunityToolProperty::get($this->getPortal(), self::PARAM_ALLOW_SUBJECTS, 0);
     $tpl->assign('allow_subjects', $allow_subjects);
     $sFnrSources = DAO_CommunityToolProperty::get($this->getPortal(), self::PARAM_FNR_SOURCES, '');
     $fnr_sources = !empty($sFnrSources) ? unserialize($sFnrSources) : array();
     $iKbEnabled = DAO_CommunityToolProperty::get($this->getPortal(), self::PARAM_KB_ENABLED, 0);
     $tpl->assign('show_search', !empty($fnr_sources) || $iKbEnabled ? true : false);
     $theme = DAO_CommunityToolProperty::get($this->getPortal(), self::PARAM_THEME, self::DEFAULT_THEME);
     if (!is_dir($tpl_path . 'portal/sc/themes/' . $theme)) {
         $theme = self::DEFAULT_THEME;
     }
     $tpl->assign('theme', $theme);
     @($active_user = $umsession->getProperty('sc_login', null));
     $tpl->assign('active_user', $active_user);
     // Usermeet Session
     if (null == ($fingerprint = parent::getFingerprint())) {
         die("A problem occurred.");
     }
     $tpl->assign('fingerprint', $fingerprint);
     $module_uri = array_shift($stack);
     if (isset($modules[$module_uri])) {
         $mf = DevblocksPlatform::getExtension($modules[$module_uri]['extension_id'], false, true);
     } else {
         $mf = DevblocksPlatform::getExtension($this->default_controller, false, true);
     }
     $menu_modules = array();
     if (is_array($modules)) {
         foreach ($modules as $idx => $item) {
             // Must be menu renderable
             if (!empty($item['menu_title']) && !empty($item['uri'])) {
                 // Must not require login, or we must be logged in
                 // [TODO] Check if the module wants to render (KB not empty, etc.)
                 if (!isset($item['requires_login']) || isset($item['requires_login']) && !empty($active_user)) {
                     // Skip KB in menu if no topics are set
                     // [TODO] Hack (shouldn't be hardcoded in menu logic)
                     if (0 == strcasecmp($item['uri'], 'kb') && !$iKbEnabled) {
                         continue;
                     }
                     $menu_modules[$idx] = $item;
                 }
             }
         }
     }
     $tpl->assign('menu', $menu_modules);
     array_unshift($stack, $module_uri);
     $controller = $mf->createInstance();
     $controller->setPortal($this->getPortal());
     $tpl->assign('module', $controller);
     $tpl->assign('module_response', new DevblocksHttpResponse($stack));
     switch ($module_uri) {
         case 'captcha':
             header('Cache-control: max-age=0', true);
             // 1 wk // , must-revalidate
             header('Expires: ' . gmdate('D, d M Y H:i:s', time() - 604800) . ' GMT');
             // 1 wk
             header('Content-type: image/jpeg');
             //header('Content-length: '. count($jpg));
             //		        // Get CAPTCHA secret passphrase
             $phrase = CerberusApplication::generatePassword(4);
             $umsession->setProperty(UmScApp::SESSION_CAPTCHA, $phrase);
             $im = @imagecreate(150, 70) or die("Cannot Initialize new GD image stream");
             $background_color = imagecolorallocate($im, 240, 240, 240);
             $text_color = imagecolorallocate($im, 40, 40, 40);
             //233, 14, 91
             $font = DEVBLOCKS_PATH . 'resources/font/ryanlerch_-_Tuffy_Bold(2).ttf';
             imagettftext($im, 24, mt_rand(0, 20), 5, 60 + 6, $text_color, $font, $phrase);
             //				$im = imagerotate($im, mt_rand(-20,20), $background_color);
             imagejpeg($im, null, 85);
             imagedestroy($im);
             exit;
             break;
         default:
             // Look up the current module
             $tpl->display('file:' . $tpl_path . 'portal/sc/themes/' . $theme . '/index.tpl');
             break;
     }
 }
Example #26
0
 function trigger(Model_DevblocksEvent $event)
 {
     /*
      * [TODO] Look at the hash and spawn our listeners for this particular point
      */
     $events = DevblocksPlatform::getEventRegistry();
     if (null == ($listeners = @$events[$event->id])) {
         $listeners = array();
     }
     // [TODO] Make sure we can't get a double listener
     if (isset($events['*']) && is_array($events['*'])) {
         foreach ($events['*'] as $evt) {
             $listeners[] = $evt;
         }
     }
     if (is_array($listeners) && !empty($listeners)) {
         foreach ($listeners as $listener) {
             /* @var $listener DevblocksExtensionManifest */
             // Extensions can be invoked on these plugins even by workers who cannot see them
             if (null != ($manifest = DevblocksPlatform::getExtension($listener, false, true))) {
                 if (method_exists($manifest, 'createInstance')) {
                     $inst = $manifest->createInstance();
                     /* @var $inst DevblocksEventListenerExtension */
                     if ($inst instanceof DevblocksEventListenerExtension) {
                         $inst->handleEvent($event);
                     }
                 }
             }
         }
     }
 }
Example #27
0
 function handleRequest(DevblocksHttpRequest $request)
 {
     @($reload = DevblocksPlatform::importGPC($_REQUEST['reload'], 'integer', 0));
     @($loglevel = DevblocksPlatform::importGPC($_REQUEST['loglevel'], 'integer', 0));
     $logger = DevblocksPlatform::getConsoleLog();
     $translate = DevblocksPlatform::getTranslationService();
     $settings = CerberusSettings::getInstance();
     $authorized_ips_str = $settings->get(CerberusSettings::AUTHORIZED_IPS);
     $authorized_ips = DevblocksPlatform::parseCrlfString($authorized_ips_str);
     $authorized_ip_defaults = DevblocksPlatform::parseCsvString(AUTHORIZED_IPS_DEFAULTS);
     $authorized_ips = array_merge($authorized_ips, $authorized_ip_defaults);
     @($is_ignoring_wait = DevblocksPlatform::importGPC($_REQUEST['ignore_wait'], 'integer', 0));
     $pass = false;
     foreach ($authorized_ips as $ip) {
         if (substr($ip, 0, strlen($ip)) == substr($_SERVER['REMOTE_ADDR'], 0, strlen($ip))) {
             $pass = true;
             break;
         }
     }
     if (!$pass) {
         echo vsprintf($translate->_('cron.ip_unauthorized'), $_SERVER['REMOTE_ADDR']);
         return;
     }
     $stack = $request->path;
     array_shift($stack);
     // cron
     $job_id = array_shift($stack);
     @set_time_limit(0);
     // Unlimited (if possible)
     $url = DevblocksPlatform::getUrlService();
     $timelimit = intval(ini_get('max_execution_time'));
     if ($reload) {
         $reload_url = sprintf("%s?reload=%d&loglevel=%d&ignore_wait=%d", $url->write('c=cron' . ($job_id ? "&a=" . $job_id : "")), intval($reload), intval($loglevel), intval($is_ignoring_wait));
         echo "<HTML>" . "<HEAD>" . "<TITLE></TITLE>" . "<meta http-equiv='Refresh' content='" . intval($reload) . ";" . $reload_url . "'>" . "<meta http-equiv='Content-Type' content='text/html; charset=UTF-8'>" . "</HEAD>" . "<BODY>";
         // onload=\"setTimeout(\\\"window.location.replace('".$url->write('c=cron')."')\\\",30);\"
     }
     // [TODO] Determine if we're on a time limit under 60 seconds
     $cron_manifests = DevblocksPlatform::getExtensions('cerberusweb.cron', true, true);
     $jobs = array();
     if (empty($job_id)) {
         // do everything
         // Determine who wants to go first by next time and longest waiting
         $nexttime = time() + 86400;
         if (is_array($cron_manifests)) {
             foreach ($cron_manifests as $idx => $instance) {
                 /* @var $instance CerberusCronPageExtension */
                 $lastrun = $instance->getParam(CerberusCronPageExtension::PARAM_LASTRUN, 0);
                 if ($instance->isReadyToRun($is_ignoring_wait)) {
                     if ($timelimit) {
                         if ($lastrun < $nexttime) {
                             $jobs[0] = $cron_manifests[$idx];
                             $nexttime = $lastrun;
                         }
                     } else {
                         $jobs[] =& $cron_manifests[$idx];
                     }
                 }
             }
         }
     } else {
         // single job
         $manifest = DevblocksPlatform::getExtension($job_id, false, true);
         if (empty($manifest)) {
             exit;
         }
         $instance = $manifest->createInstance();
         if ($instance) {
             if ($instance->isReadyToRun($is_ignoring_wait)) {
                 $jobs[0] =& $instance;
             }
         }
     }
     if (!empty($jobs)) {
         foreach ($jobs as $nextjob) {
             $nextjob->setParam(CerberusCronPageExtension::PARAM_LOCKED, time());
             $nextjob->_run();
         }
     } elseif ($reload) {
         $logger->info(vsprintf($translate->_('cron.nothing_to_do'), intval($reload)));
     }
     if ($reload) {
         echo "</BODY>" . "</HTML>";
     }
     exit;
 }
Example #28
0
 function render()
 {
     $this->_sanitize();
     $tpl = DevblocksPlatform::getTemplateService();
     $view_path = dirname(dirname(__FILE__)) . '/templates/tasks/';
     $tpl->assign('view_path', $view_path);
     $tpl->assign('id', $this->id);
     $tpl->assign('view', $this);
     $workers = DAO_Worker::getAll();
     $tpl->assign('workers', $workers);
     $tpl->assign('timestamp_now', time());
     // Pull the results so we can do some row introspection
     $results = $this->getData();
     $tpl->assign('results', $results);
     //		$source_renderers = DevblocksPlatform::getExtensions('cerberusweb.task.source', true);
     // Make a list of unique source_extension and load their renderers
     $source_extensions = array();
     if (is_array($results) && isset($results[0])) {
         foreach ($results[0] as $rows) {
             $source_extension = $rows[SearchFields_Task::SOURCE_EXTENSION];
             if (!isset($source_extensions[$source_extension]) && !empty($source_extension) && null != ($mft = DevblocksPlatform::getExtension($source_extension))) {
                 $source_extensions[$source_extension] = $mft->createInstance();
             }
         }
     }
     $tpl->assign('source_renderers', $source_extensions);
     // Custom fields
     $custom_fields = DAO_CustomField::getBySource(ChCustomFieldSource_Task::ID);
     $tpl->assign('custom_fields', $custom_fields);
     // get the user agent
     if (strpos($_SERVER['HTTP_USER_AGENT'], 'iPhone') || strpos($_SERVER['HTTP_USER_AGENT'], 'iPod')) {
         $maxcols = 1;
     } elseif (strpos($_SERVER['HTTP_USER_AGENT'], 'iPad')) {
         $maxcols = 4;
     } else {
         $maxcols = 4;
     }
     $tpl->assign('maxcols', $maxcols);
     $tpl->assign('view_fields', $this->getColumns());
     $tpl->display('file:' . $view_path . 'view.tpl');
 }