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); }
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); }
/** * 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); }
/** * 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; }
/** * 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; }
/** * 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); }