Beispiel #1
0
 public function execute(ezcWorkflowExecution $execution)
 {
     $package_instance = new com_meego_package($execution->getVariable('package_instance'));
     // We load the form from the package's repository
     $repository = new com_meego_repository($package_instance->repository);
     $list_of_forms = midgardmvc_ui_forms_generator::list_for_object($repository);
     if (empty($list_of_forms)) {
         return;
     }
     $execution->setVariable('review_form', $list_of_forms[0]->name);
 }
Beispiel #2
0
 public function can_handle(midgard_object $object)
 {
     if (!$object instanceof com_meego_package) {
         return false;
     }
     // Check that the package's repository has a form
     $repository = new com_meego_repository($object->repository);
     if (!midgardmvc_ui_forms_generator::has_object_forms($repository)) {
         return false;
     }
     // Check if the form is assigned to this repository
     $storage = new midgard_query_storage('com_meego_package_repository_form');
     $q = new midgard_query_select($storage);
     $qc = new midgard_query_constraint_group('AND');
     $qc->add_constraint(new midgard_query_constraint(new midgard_query_property('formtitle'), '=', new midgard_query_value($this->workflow['label'])));
     $qc->add_constraint(new midgard_query_constraint(new midgard_query_property('repoguid'), '=', new midgard_query_value($repository->guid)));
     $q->set_constraint($qc);
     $res = $q->execute();
     if (!$q->get_results_count()) {
         return false;
     }
     if (!midgardmvc_core::get_instance()->authentication->is_user()) {
         return true;
     }
     // safety net
     try {
         $user = midgardmvc_core::get_instance()->authentication->get_person();
     } catch (midgard_error_exception $e) {
         // if the person object is gone we will have an exception here
         return false;
     }
     //Hasn't reviewed yet
     $storage = new midgard_query_storage('midgardmvc_ui_forms_form_instance');
     $q = new midgard_query_select($storage);
     $qc = new midgard_query_constraint_group('AND');
     $qc->add_constraint(new midgard_query_constraint(new midgard_query_property('relatedobject'), '=', new midgard_query_value($object->guid)));
     $qc->add_constraint(new midgard_query_constraint(new midgard_query_property('metadata.creator'), '=', new midgard_query_value($user->guid)));
     $q->set_constraint($qc);
     $res = $q->execute();
     if ($q->get_results_count() != 0) {
         return false;
     }
     return true;
 }
 /**
  * @todo: docs
  */
 public function execute(ezcWorkflowExecution $execution)
 {
     $form = midgardmvc_ui_forms_generator::get_by_guid($execution->getVariable('review_form'));
     $instance = new midgardmvc_ui_forms_form_instance($execution->getVariable('review'));
     $review = midgardmvc_ui_forms_store::load_form($form, $instance);
     $items = $form->items;
     $boolean_count = 0;
     $positive = 0;
     $package = new com_meego_package($instance->relatedobject);
     foreach ($items as $key => $item) {
         if ($key == "redirect_link" || $key == "execution") {
             continue;
         }
         try {
             $field = new midgardmvc_ui_forms_form_field($key);
         } catch (Exception $e) {
             midgardmvc_core::get_instance()->log('Invalid field detected in distill review: ' . $key . ', value: ' . $item, 'warning');
         }
         // todo: ugly hardcoded check, but what can we do..
         if ($field->title == "Should the application be in this application catalog?") {
             // if the answer belongs to a certain field then we process
             // this field must be a boolean too
             if ($item instanceof midgardmvc_helper_forms_field_boolean) {
                 if ($item->get_value()) {
                     // add +1 to the package score
                     $package->metadata->score++;
                 } else {
                     //  oh yes, we do give -1 points too ;)
                     $package->metadata->score--;
                 }
                 $res = $package->update();
                 if (!$res) {
                     //update failed; do what?
                 }
             }
         } else {
             // otherwise
             continue;
         }
     }
     // pass on the score
     $execution->setVariable('distilled_review', $package->metadata->score);
 }
Beispiel #4
0
 /**
  * retreives a form instance
  */
 public function get_posted_form_instance(array $args)
 {
     $forminstance = new midgardmvc_ui_forms_form_instance($args['forminstance']);
     $form = new midgardmvc_ui_forms_form($forminstance->form);
     // get user info
     $currentuser = com_meego_packages_utils::get_current_user();
     $formcreator = com_meego_packages_utils::get_user_by_person_guid($forminstance->metadata->creator);
     $form_to_return = midgardmvc_ui_forms_load::load_form(midgardmvc_ui_forms_generator::get_by_guid($form->guid), $forminstance);
     $form_to_return->set_readonly(true);
     if ($currentuser) {
         if ($forminstance->metadata->creator == $currentuser->person) {
             $form_to_return->set_readonly(false);
         }
     }
     $login = '******';
     if ($formcreator) {
         $login = $formcreator->login;
     }
     $this->data['title'] = $form->title . " submitted by " . $login;
     $this->data['form'] = $form_to_return;
     unset($form_to_return);
 }
Beispiel #5
0
 /**
  * Gets a rendered HTML form
  */
 public function get_form(ezcWorkflowExecution $execution)
 {
     $list_of_variables = $execution->getVariables();
     if (array_key_exists('review_form', $list_of_variables)) {
         $db_form = new midgardmvc_ui_forms_form($list_of_variables['review_form']);
         $form = midgardmvc_ui_forms_generator::get_by_form($db_form, false);
         $form->set_readonly(false);
         if ($this->request->isset_data_item('redirect_link')) {
             $redirect_link = $this->request->get_data_item('redirect_link');
         } else {
             if (array_key_exists('HTTP_REFERER', $_SERVER)) {
                 $redirect_link = $_SERVER['HTTP_REFERER'];
             } else {
                 $redirect_link = '';
             }
         }
         $form->set_cancel(null, $this->mvc->i18n->get('cancel', 'midgardmvc_helper_forms'), $redirect_link);
         // add a hidden input with the recirect link
         // where we go upon successful submit
         $field = $form->add_field('redirect_link', 'text');
         $field->set_value($redirect_link);
         $widget = $field->set_widget('hidden');
         // add a hidden input with the execution guid
         $field = $form->add_field('execution', 'text');
         $field->set_value($execution->guid);
         $widget = $field->set_widget('hidden');
         return array('db_form' => $db_form, 'form' => $form);
     }
     return null;
 }
Beispiel #6
0
 /**
  * Returns the stripped down form on a workflow
  *
  * @param object com_meego_package_details object
  */
 public function get_stripped_forms_for_package($package = null)
 {
     $retval = array();
     $object = new com_meego_package($package->packageguid);
     $workflows = midgardmvc_helper_workflow_utils::get_workflows_for_object($object);
     if (is_array($workflows)) {
         $this->mvc->component->load_library('Workflow');
         foreach ($workflows as $name => $workflow_data) {
             $args = array('package' => $package->packagename, 'version' => $package->packageversion, 'project' => $package->repoprojectname, 'repository' => $package->reponame, 'arch' => $package->repoarch, 'workflow' => $name);
             $workflow_definition = new $workflow_data['provider']();
             $values = $workflow_definition->start($object);
             $workflow = $workflow_definition->get();
             if (isset($values['review_form'])) {
                 $form = new midgardmvc_ui_forms_form($values['review_form']);
                 $fields = midgardmvc_ui_forms_generator::list_fields($form);
                 foreach ($fields as $field) {
                     $retval[$name][$field->title]['widget'] = $field->widget;
                     $retval[$name][$field->title]['options'] = $field->options;
                 }
             } else {
                 if (isset($values['execution'])) {
                     $args['execution'] = $values['execution'];
                     $execution = new midgardmvc_helper_workflow_execution_interactive($workflow, $args['execution']);
                     $variables = $execution->getVariables();
                     if (isset($variables['review_form'])) {
                         $form = new midgardmvc_ui_forms_form($variables['review_form']);
                         $fields = midgardmvc_ui_forms_generator::list_fields($form);
                         foreach ($fields as $field) {
                             $retval[$name][$field->title]['widget'] = $field->widget;
                             $retval[$name][$field->title]['options'] = $field->options;
                         }
                     }
                 }
             }
         }
     }
     return $retval;
 }
Beispiel #7
0
 /**
  * Process a comment post
  */
 public function post_add(array $args)
 {
     $success = true;
     if (!$this->user) {
         // Voting requires authentication
         $auth = com_meego_ocs_utils::authenticate($args);
         if (!$auth) {
             return null;
         }
     }
     $ocs = new com_meego_ocs_OCSWriter();
     if (!isset($_POST['content'])) {
         $ocs->writeError('Content must not be empty', 101);
         $ocs->endDocument();
         self::output_xml($ocs);
         return;
     }
     if (!(isset($_POST['message']) || isset($_POST['subject']))) {
         $ocs->writeError('Message or subject must not be empty', 102);
         $ocs->endDocument();
         self::output_xml($ocs);
         return;
     }
     if ($_POST['type'] != '1' && $_POST['type'] != '8') {
         $ocs->writeError('Content type: ' . $_POST['type'] . ' is not supported.', 104);
         $ocs->endDocument();
         self::output_xml($ocs);
         return;
     }
     $package = new com_meego_package();
     $package->get_by_id((int) $_POST['content']);
     if (!$package->guid) {
         $success = false;
         $this->mvc->log(__CLASS__, 'Package with id: ' . $_POST['content'] . ' not found.', 'error');
     }
     if ($success) {
         switch ($_POST['type']) {
             case 1:
                 $message = 'Rating via OCS failed. Could not create rating object for package ' . $package->name . '(id: ' . $package->id . ').';
                 $comment = new com_meego_comments_comment();
                 if (isset($_POST['parent']) && !empty($_POST['parent'])) {
                     $parent = new com_meego_comments_comment();
                     $parent->get_by_id((int) $_POST['parent']);
                     if ($parent->to != $package->guid) {
                         $success = false;
                         $this->mvc->log(__CLASS__, $message . ' Parent comment is not related to the content item', 'error');
                     }
                     $comment->up = $parent->id;
                 }
                 $comment->to = $package->guid;
                 $comment->content = $_POST['message'];
                 if (isset($_POST['subject']) && !empty($_POST['subject'])) {
                     $comment->title = $_POST['subject'];
                 }
                 $comment->create();
                 if ($comment->guid) {
                     $rating = new com_meego_ratings_rating();
                     $rating->to = $package->guid;
                     // for comments we have no votes
                     $rating->rating = 0;
                     $rating->comment = $comment->id;
                     $success = $rating->create();
                     if ($success) {
                         $message = 'Rating via OCS finished. New rating object is: ' . $rating->guid . '.';
                     }
                 }
                 break;
             case 8:
                 $name = substr($_POST['message'], 0, strpos($_POST['message'], ':'));
                 $workflows = $this->mvc->configuration->workflows;
                 if (array_key_exists($name, $workflows)) {
                     if (is_object($package)) {
                         $this->mvc->component->load_library('Workflow');
                         $workflow_definition = new $workflows[$name]['provider']();
                         $values = $workflow_definition->start($package);
                         if (array_key_exists('execution', $values)) {
                             // get the db form and fill in the fields
                             $form = new midgardmvc_ui_forms_form($values['review_form']);
                             $transaction = new midgard_transaction();
                             $transaction->begin();
                             $instance = new midgardmvc_ui_forms_form_instance();
                             $instance->form = $form->id;
                             $instance->relatedobject = $package->guid;
                             $instance->create();
                             if (isset($instance->guid)) {
                                 // give values to the db fields taken from the posted values and store each of them
                                 // use the form instance ID as "form" property of the fields
                                 $posted_values = explode(',', substr($_POST['message'], strpos($_POST['message'], ':') + 1));
                                 $db_fields = midgardmvc_ui_forms_generator::list_fields($form);
                                 $i = 0;
                                 foreach ($db_fields as $dbfield) {
                                     if (!$success) {
                                         // if 1 field creation failed then end this loop as fast as possible
                                         continue;
                                     }
                                     switch ($dbfield->widget) {
                                         case 'checkbox':
                                             $holder = "booleanvalue";
                                             $value = $posted_values[$i];
                                             break;
                                         default:
                                             $options = explode(',', $dbfield->options);
                                             $value = $options[(int) $posted_values[$i]];
                                             $holder = "stringvalue";
                                     }
                                     $field_instance = new midgardmvc_ui_forms_form_instance_field();
                                     $field_instance->form = $instance->id;
                                     $field_instance->field = $dbfield->guid;
                                     $field_instance->{$holder} = $value;
                                     if (!$field_instance->create()) {
                                         $success = false;
                                     }
                                     ++$i;
                                 }
                                 if ($success) {
                                     $message = 'QA via OCS by user ' . $this->user->login . ' for package: ' . $package->name . ' (id: ' . $package->id . ')';
                                     try {
                                         $workflow = $workflow_definition->get();
                                         $execution = new midgardmvc_helper_workflow_execution_interactive($workflow, $values['execution']);
                                     } catch (ezcWorkflowExecutionException $e) {
                                         $success = false;
                                         $this->mvc->log(__CLASS__, $message . ' failed. Workflow: ' . $values['workflow'] . ' not found. See error: ' . $e->getMessage(), 'error');
                                     }
                                     if ($success) {
                                         $args = array('review' => $instance->guid);
                                         try {
                                             $values = $workflow_definition->resume($execution->guid, $args);
                                         } catch (ezcWorkflowInvalidInputException $e) {
                                             $success = false;
                                             $this->mvc->log(__CLASS__, $message . ' failed. Maybe a quick re-submit? See error: ' . $e->getMessage(), 'error');
                                         }
                                         $transaction->commit();
                                         $this->mvc->log(__CLASS__, 'New QA form guid: ' . $instance->guid, 'info');
                                     }
                                 }
                             }
                             if (!$success) {
                                 $this->mvc->log(__CLASS__, $message . ' failed. Probably a form instance or a field creation failed.', 'info');
                                 $transaction->rollback();
                             }
                         }
                     }
                 }
                 break;
         }
         if ($success) {
             // POST went fine
             $ocs->writeMeta(null, null, 'Posting succeded.', 'ok', 100);
             $this->mvc->log(__CLASS__, $message, 'info');
             // create activity object
             $created = null;
             switch ($_POST['type']) {
                 case 1:
                     $verb = 'comment';
                     $summary = 'The user commented an application via OCS.';
                     $creator = $rating->metadata->creator;
                     $created = $rating->metadata->created;
                     $target = $rating->to;
                     break;
                 case 8:
                     $verb = 'review';
                     $summary = 'The user reviewed an application via OCS.';
                     $creator = $instance->metadata->creator;
                     $created = $instance->metadata->created;
                     $target = $instance->relatedobject;
                     break;
             }
             if ($created) {
                 $res = midgardmvc_account_controllers_activity::create_activity($creator, $verb, $target, $summary, 'Apps', $created);
             }
             unset($created, $creator, $target);
         }
     }
     if (!$success) {
         $ocs->writeError('Comment posting (type: ' . $_POST['type'] . ') failed.');
         $this->mvc->log(__CLASS__, $message . ' failed.', 'info');
     }
     $ocs->endDocument();
     self::output_xml($ocs);
 }