MDL-53227 mod_feedback: merge files complete_guest.php and complete.php
authorMarina Glancy <marina@moodle.com>
Wed, 24 Feb 2016 07:04:12 +0000 (15:04 +0800)
committerMarina Glancy <marina@moodle.com>
Thu, 17 Mar 2016 23:54:59 +0000 (07:54 +0800)
Simplify access check, add behat tests

mod/feedback/analysis.php
mod/feedback/complete.php
mod/feedback/complete_guest.php
mod/feedback/lib.php
mod/feedback/print.php
mod/feedback/show_entries.php
mod/feedback/tests/behat/anonymous.feature [new file with mode: 0644]
mod/feedback/view.php

index 6fa61e5..928ad43 100644 (file)
@@ -27,48 +27,19 @@ require_once("lib.php");
 
 $current_tab = 'analysis';
 
-$id = required_param('id', PARAM_INT);  //the POST dominated the GET
-$courseid = optional_param('courseid', false, PARAM_INT);
+$id = required_param('id', PARAM_INT);  // Course module id.
 
 $url = new moodle_url('/mod/feedback/analysis.php', array('id'=>$id));
-if ($courseid !== false) {
-    $url->param('courseid', $courseid);
-}
 $PAGE->set_url($url);
 
-if (! $cm = get_coursemodule_from_id('feedback', $id)) {
-    print_error('invalidcoursemodule');
-}
-
-if (! $course = $DB->get_record("course", array("id"=>$cm->course))) {
-    print_error('coursemisconf');
-}
+list($course, $cm) = get_course_and_cm_from_cmid($id, 'feedback');
+require_course_login($course, true, $cm);
 
-if (! $feedback = $DB->get_record("feedback", array("id"=>$cm->instance))) {
-    print_error('invalidcoursemodule');
-}
+$feedback = $PAGE->activityrecord;
 
 $context = context_module::instance($cm->id);
 
-if ($course->id == SITEID) {
-    require_login($course, true);
-} else {
-    require_login($course, true, $cm);
-}
-
-//check whether the given courseid exists
-if ($courseid AND $courseid != SITEID) {
-    if ($course2 = $DB->get_record('course', array('id'=>$courseid))) {
-        require_course_login($course2); //this overwrites the object $course :-(
-        $course = $DB->get_record("course", array("id"=>$cm->course)); // the workaround
-    } else {
-        print_error('invalidcourseid');
-    }
-}
-
-if ( !( ((intval($feedback->publish_stats) == 1) AND
-        has_capability('mod/feedback:viewanalysepage', $context)) OR
-        has_capability('mod/feedback:viewreports', $context))) {
+if (!feedback_can_view_analysis($feedback, $context)) {
     print_error('error');
 }
 
index 0731907..c9f6825 100644 (file)
@@ -75,17 +75,8 @@ if ($gopage < 0 AND !$savevalues) {
     $gonextpage = $gopreviouspage = false;
 }
 
-if (! $cm = get_coursemodule_from_id('feedback', $id)) {
-    print_error('invalidcoursemodule');
-}
-
-if (! $course = $DB->get_record("course", array("id"=>$cm->course))) {
-    print_error('coursemisconf');
-}
-
-if (! $feedback = $DB->get_record("feedback", array("id"=>$cm->instance))) {
-    print_error('invalidcoursemodule');
-}
+list($course, $cm) = get_course_and_cm_from_cmid($id, 'feedback');
+$feedback = $DB->get_record("feedback", array("id" => $cm->instance), '*', MUST_EXIST);
 
 $context = context_module::instance($cm->id);
 
@@ -95,6 +86,14 @@ if (has_capability('mod/feedback:complete', $context)) {
     $feedback_complete_cap = true;
 }
 
+if (!empty($CFG->feedback_allowfullanonymous)
+        AND $course->id == SITEID
+        AND $feedback->anonymous == FEEDBACK_ANONYMOUS_YES
+        AND (!isloggedin() OR isguestuser())) {
+    // Guests are allowed to complete fully anonymous feedback without having 'mod/feedback:complete' capability.
+    $feedback_complete_cap = true;
+}
+
 //check whether the feedback is located and! started from the mainsite
 if ($course->id == SITEID AND !$courseid) {
     $courseid = SITEID;
@@ -110,19 +109,8 @@ if ($course->id == SITEID AND !has_capability('mod/feedback:edititems', $context
     }
 }
 
-if ($feedback->anonymous != FEEDBACK_ANONYMOUS_YES) {
-    if ($course->id == SITEID) {
-        require_login($course, true);
-    } else {
-        require_login($course, true, $cm);
-    }
-} else {
-    if ($course->id == SITEID) {
-        require_course_login($course, true);
-    } else {
-        require_course_login($course, true, $cm);
-    }
-}
+require_course_login($course, true, $cm);
+$PAGE->set_activity_record($feedback);
 
 //check whether the given courseid exists
 if ($courseid AND $courseid != SITEID) {
@@ -140,7 +128,9 @@ if (!$feedback_complete_cap) {
 
 // Mark activity viewed for completion-tracking
 $completion = new completion_info($course);
-$completion->set_module_viewed($cm);
+if (isloggedin() && !isguestuser()) {
+    $completion->set_module_viewed($cm);
+}
 
 /// Print the page header
 $strfeedbacks = get_string("modulenameplural", "feedback");
@@ -158,22 +148,6 @@ $PAGE->set_heading($course->fullname);
 $PAGE->set_title($feedback->name);
 echo $OUTPUT->header();
 
-//ishidden check.
-//feedback in courses
-if ((empty($cm->visible) AND
-        !has_capability('moodle/course:viewhiddenactivities', $context)) AND
-        $course->id != SITEID) {
-    notice(get_string("activityiscurrentlyhidden"));
-}
-
-//ishidden check.
-//feedback on mainsite
-if ((empty($cm->visible) AND
-        !has_capability('moodle/course:viewhiddenactivities', $context)) AND
-        $courseid == SITEID) {
-    notice(get_string("activityiscurrentlyhidden"));
-}
-
 //check, if the feedback is open (timeopen, timeclose)
 $checktime = time();
 $feedback_is_closed = ($feedback->timeopen > $checktime) ||
@@ -207,7 +181,12 @@ if ($feedback_can_submit) {
         // Check if all required items have a value.
         if (feedback_check_values($startitempos, $lastitempos)) {
             $userid = $USER->id; //arb
-            if ($completedid = feedback_save_values($USER->id, true)) {
+            if (isloggedin() && !isguestuser()) {
+                $completedid = feedback_save_values($USER->id, true);
+            } else {
+                $completedid = feedback_save_guest_values(sesskey());
+            }
+            if ($completedid) {
                 if (!$gonextpage AND !$gopreviouspage) {
                     $preservevalues = false;// It can be stored.
                 }
@@ -260,17 +239,19 @@ if ($feedback_can_submit) {
                 } else {
                     feedback_send_email_anonym($cm, $feedback, $course, $userid);
                 }
-                //tracking the submit
-                $tracking = new stdClass();
-                $tracking->userid = $USER->id;
-                $tracking->feedback = $feedback->id;
-                $tracking->completed = $new_completed_id;
-                $DB->insert_record('feedback_tracking', $tracking);
+                if (isloggedin() && !isguestuser()) {
+                    // Tracking the submit.
+                    $tracking = new stdClass();
+                    $tracking->userid = $USER->id;
+                    $tracking->feedback = $feedback->id;
+                    $tracking->completed = $new_completed_id;
+                    $DB->insert_record('feedback_tracking', $tracking);
+                }
                 unset($SESSION->feedback->is_started);
 
                 // Update completion state
                 $completion = new completion_info($course);
-                if ($completion->is_enabled($cm) && $feedback->completionsubmit) {
+                if (isloggedin() && !isguestuser() && $completion->is_enabled($cm) && $feedback->completionsubmit) {
                     $completion->update_state($cm, COMPLETION_COMPLETE);
                 }
 
@@ -326,8 +307,10 @@ if ($feedback_can_submit) {
                 $feedbackcompletedtmp = feedback_set_tmp_values($feedbackcompleted);
             }
         }
-    } else {
+    } else if (isloggedin() && !isguestuser()) {
         $feedbackcompletedtmp = feedback_get_current_completed($feedback->id, true, $courseid);
+    } else {
+        $feedbackcompletedtmp = feedback_get_current_completed($feedback->id, true, $courseid, sesskey());
     }
 
     /// Print the main part of the page
@@ -340,19 +323,6 @@ if ($feedback_can_submit) {
     }
     echo $OUTPUT->heading(format_string($feedback->name));
 
-    if ( (intval($feedback->publish_stats) == 1) AND
-            ( has_capability('mod/feedback:viewanalysepage', $context)) AND
-            !( has_capability('mod/feedback:viewreports', $context)) ) {
-
-        $params = array('userid' => $USER->id, 'feedback' => $feedback->id);
-        if ($multiple_count = $DB->count_records('feedback_tracking', $params)) {
-            echo $OUTPUT->box_start('mdl-align');
-            echo '<a href="'.$analysisurl->out().'">';
-            echo get_string('completed_feedbacks', 'feedback').'</a>';
-            echo $OUTPUT->box_end();
-        }
-    }
-
     if (isset($savereturn) && $savereturn == 'saved') {
         if ($feedback->page_after_submit) {
 
@@ -376,11 +346,11 @@ if ($feedback_can_submit) {
             echo get_string('entries_saved', 'feedback');
             echo '</font></b>';
             echo '</p>';
-            if ( intval($feedback->publish_stats) == 1) {
-                echo '<p align="center"><a href="'.$analysisurl->out().'">';
-                echo get_string('completed_feedbacks', 'feedback').'</a>';
-                echo '</p>';
-            }
+        }
+        if (feedback_can_view_analysis($feedback, $context, $courseid)) {
+            echo '<p align="center"><a href="'.$analysisurl->out().'">';
+            echo get_string('completed_feedbacks', 'feedback').'</a>';
+            echo '</p>';
         }
 
         if ($feedback->site_after_submit) {
@@ -419,23 +389,24 @@ if ($feedback_can_submit) {
             echo $OUTPUT->box_start('feedback_form');
             echo '<form action="complete.php" class="feedback_complete" method="post">';
             echo '<input type="hidden" name="sesskey" value="'.sesskey().'" />';
-            echo $OUTPUT->box_start('feedback_anonymousinfo');
+            $anonymousmodeinfo = '';
             switch ($feedback->anonymous) {
                 case FEEDBACK_ANONYMOUS_YES:
                     echo '<input type="hidden" name="anonymous" value="1" />';
                     $inputvalue = 'value="'.FEEDBACK_ANONYMOUS_YES.'"';
                     echo '<input type="hidden" name="anonymous_response" '.$inputvalue.' />';
-                    echo get_string('mode', 'feedback').': '.get_string('anonymous', 'feedback');
+                    $anonymousmodeinfo = get_string('anonymous', 'feedback');
                     break;
                 case FEEDBACK_ANONYMOUS_NO:
                     echo '<input type="hidden" name="anonymous" value="0" />';
                     $inputvalue = 'value="'.FEEDBACK_ANONYMOUS_NO.'"';
                     echo '<input type="hidden" name="anonymous_response" '.$inputvalue.' />';
-                    echo get_string('mode', 'feedback').': ';
-                    echo get_string('non_anonymous', 'feedback');
+                    $anonymousmodeinfo = get_string('non_anonymous', 'feedback');
                     break;
             }
-            echo $OUTPUT->box_end();
+            if (isloggedin() && !isguestuser()) {
+                echo $OUTPUT->box(get_string('mode', 'feedback') . ': ' . $anonymousmodeinfo, 'feedback_anonymousinfo');
+            }
             //check, if there exists required-elements
             $params = array('feedback' => $feedback->id, 'required' => 1);
             $countreq = $DB->count_records('feedback_item', $params);
index 3e15df1..819cb76 100644 (file)
  */
 
 require_once("../../config.php");
-require_once("lib.php");
 
-feedback_init_feedback_session();
-
-$id = required_param('id', PARAM_INT);
-$completedid = optional_param('completedid', false, PARAM_INT);
-$preservevalues  = optional_param('preservevalues', 0,  PARAM_INT);
-$courseid = optional_param('courseid', false, PARAM_INT);
-$gopage = optional_param('gopage', -1, PARAM_INT);
-$lastpage = optional_param('lastpage', false, PARAM_INT);
-$startitempos = optional_param('startitempos', 0, PARAM_INT);
-$lastitempos = optional_param('lastitempos', 0, PARAM_INT);
-
-$url = new moodle_url('/mod/feedback/complete_guest.php', array('id'=>$id));
-if ($completedid !== false) {
-    $url->param('completedid', $completedid);
-}
-if ($preservevalues !== 0) {
-    $url->param('preservevalues', $preservevalues);
-}
-if ($courseid !== false) {
-    $url->param('courseid', $courseid);
-}
-if ($gopage !== -1) {
-    $url->param('gopage', $gopage);
-}
-if ($lastpage !== false) {
-    $url->param('lastpage', $lastpage);
-}
-if ($startitempos !== 0) {
-    $url->param('startitempos', $startitempos);
-}
-if ($lastitempos !== 0) {
-    $url->param('lastitempos', $lastitempos);
-}
-$PAGE->set_url($url);
-
-$highlightrequired = false;
-
-if (($formdata = data_submitted()) AND !confirm_sesskey()) {
-    print_error('invalidsesskey');
-}
-
-//if the use hit enter into a textfield so the form should not submit
-if (isset($formdata->sesskey) AND
-   !isset($formdata->savevalues) AND
-   !isset($formdata->gonextpage) AND
-   !isset($formdata->gopreviouspage)) {
-
-    $gopage = (int) $formdata->lastpage;
-}
-if (isset($formdata->savevalues)) {
-    $savevalues = true;
-} else {
-    $savevalues = false;
-}
-
-if ($gopage < 0 AND !$savevalues) {
-    if (isset($formdata->gonextpage)) {
-        $gopage = $lastpage + 1;
-        $gonextpage = true;
-        $gopreviouspage = false;
-    } else if (isset($formdata->gopreviouspage)) {
-        $gopage = $lastpage - 1;
-        $gonextpage = false;
-        $gopreviouspage = true;
-    } else {
-        print_error('parameters_missing', 'feedback');
-    }
-} else {
-    $gonextpage = $gopreviouspage = false;
-}
-
-if (! $cm = get_coursemodule_from_id('feedback', $id)) {
-    print_error('invalidcoursemodule');
-}
-
-if (! $course = $DB->get_record("course", array("id"=>$cm->course))) {
-    print_error('coursemisconf');
-}
-
-if (! $feedback = $DB->get_record("feedback", array("id"=>$cm->instance))) {
-    print_error('invalidcoursemodule');
-}
-
-$context = context_module::instance($cm->id);
-
-$feedback_complete_cap = false;
-
-if (isset($CFG->feedback_allowfullanonymous)
-            AND $CFG->feedback_allowfullanonymous
-            AND $course->id == SITEID
-            AND (!$courseid OR $courseid == SITEID)
-            AND $feedback->anonymous == FEEDBACK_ANONYMOUS_YES ) {
-    $feedback_complete_cap = true;
-}
-
-//check whether the feedback is anonymous
-if (isset($CFG->feedback_allowfullanonymous)
-                AND $CFG->feedback_allowfullanonymous
-                AND $feedback->anonymous == FEEDBACK_ANONYMOUS_YES
-                AND $course->id == SITEID ) {
-    $feedback_complete_cap = true;
-}
-if ($feedback->anonymous != FEEDBACK_ANONYMOUS_YES) {
-    print_error('feedback_is_not_for_anonymous', 'feedback');
-}
-
-//check whether the user has a session
-// there used to be a sesskey test - this could not work - sorry
-
-//check whether the feedback is located and! started from the mainsite
-if ($course->id == SITEID AND !$courseid) {
-    $courseid = SITEID;
-}
-
-require_course_login($course);
-
-if ($courseid AND $courseid != SITEID) {
-    $course2 = $DB->get_record('course', array('id'=>$courseid));
-    require_course_login($course2); //this overwrites the object $course :-(
-    $course = $DB->get_record("course", array("id"=>$cm->course)); // the workaround
-}
-
-if (!$feedback_complete_cap) {
-    print_error('error');
-}
-
-
-/// Print the page header
-$strfeedbacks = get_string("modulenameplural", "feedback");
-$strfeedback  = get_string("modulename", "feedback");
-
-$PAGE->set_cm($cm, $course); // set's up global $COURSE
-$PAGE->set_pagelayout('incourse');
-
-$urlparams = array('id'=>$course->id);
-$PAGE->navbar->add($strfeedbacks, new moodle_url('/mod/feedback/index.php', $urlparams));
-$PAGE->navbar->add(format_string($feedback->name));
-$PAGE->set_heading($course->fullname);
-$PAGE->set_title($feedback->name);
-echo $OUTPUT->header();
-
-//ishidden check.
-//hidden feedbacks except feedbacks on mainsite are only accessible with related capabilities
-if ((empty($cm->visible) AND
-        !has_capability('moodle/course:viewhiddenactivities', $context)) AND
-        $course->id != SITEID) {
-    notice(get_string("activityiscurrentlyhidden"));
-}
-
-//check, if the feedback is open (timeopen, timeclose)
-$checktime = time();
-
-$feedback_is_closed = ($feedback->timeopen > $checktime) ||
-                      ($feedback->timeclose < $checktime &&
-                            $feedback->timeclose > 0);
-
-if ($feedback_is_closed) {
-    echo $OUTPUT->box_start('generalbox boxaligncenter');
-    echo $OUTPUT->notification(get_string('feedback_is_not_open', 'feedback'));
-    echo $OUTPUT->continue_button($CFG->wwwroot.'/course/view.php?id='.$course->id);
-    echo $OUTPUT->box_end();
-    echo $OUTPUT->footer();
-    exit;
-}
-
-//additional check for multiple-submit (prevent browsers back-button).
-//the main-check is in view.php
-$feedback_can_submit = true;
-if ($feedback->multiple_submit == 0 ) {
-    if (feedback_is_already_submitted($feedback->id, $courseid)) {
-        $feedback_can_submit = false;
-    }
+// This file is no longer used, however it will remain here to redirect existing links to complete.php.
+$url = new moodle_url('/mod/feedback/complete.php');
+foreach ($_GET as $key => $value) {
+    $url->param($key, $value);
 }
-if ($feedback_can_submit) {
-    //preserving the items
-    if ($preservevalues == 1) {
-        if (!$SESSION->feedback->is_started == true) {
-            print_error('error', 'error', $CFG->wwwroot.'/course/view.php?id='.$course->id);
-        }
-        //check, if all required items have a value
-        if (feedback_check_values($startitempos, $lastitempos)) {
-            $userid = $USER->id; //arb
-            if ($completedid = feedback_save_guest_values(sesskey())) {
-                //now it can be saved
-                if (!$gonextpage AND !$gopreviouspage) {
-                    $preservevalues = false;
-                }
-
-            } else {
-                $savereturn = 'failed';
-                if (isset($lastpage)) {
-                    $gopage = $lastpage;
-                } else {
-                    print_error('parameters_missing', 'feedback');
-                }
-            }
-        } else {
-            $savereturn = 'missing';
-            $highlightrequired = true;
-            if (isset($lastpage)) {
-                $gopage = $lastpage;
-            } else {
-                print_error('parameters_missing', 'feedback');
-            }
-        }
-    }
-
-    //saving the items
-    if ($savevalues AND !$preservevalues) {
-        //exists there any pagebreak, so there are values in the feedback_valuetmp
-        //arb changed from 0 to $USER->id
-        //no strict anonymous feedbacks
-        //if it is a guest taking it then I want to know that it was
-        //a guest (at least in the data saved in the feedback tables)
-        $userid = $USER->id;
-
-        $params = array('id'=>$completedid);
-        $feedbackcompletedtmp = $DB->get_record('feedback_completedtmp', $params);
-
-        //fake saving for switchrole
-        $is_switchrole = feedback_check_is_switchrole();
-        if ($is_switchrole) {
-            $savereturn = 'saved';
-            feedback_delete_completedtmp($completedid);
-        } else {
-            $new_completed_id = feedback_save_tmp_values($feedbackcompletedtmp, false, $userid);
-            if ($new_completed_id) {
-                $savereturn = 'saved';
-                feedback_send_email_anonym($cm, $feedback, $course, $userid);
-                unset($SESSION->feedback->is_started);
-
-            } else {
-                $savereturn = 'failed';
-            }
-        }
-    }
-
-    if ($allbreaks = feedback_get_all_break_positions($feedback->id)) {
-        if ($gopage <= 0) {
-            $startposition = 0;
-        } else {
-            if (!isset($allbreaks[$gopage - 1])) {
-                $gopage = count($allbreaks);
-            }
-            $startposition = $allbreaks[$gopage - 1];
-        }
-        $ispagebreak = true;
-    } else {
-        $startposition = 0;
-        $newpage = 0;
-        $ispagebreak = false;
-    }
-
-    //get the feedbackitems after the last shown pagebreak
-    $select = 'feedback = ? AND position > ?';
-    $params = array($feedback->id, $startposition);
-    $feedbackitems = $DB->get_records_select('feedback_item', $select, $params, 'position');
-
-    //get the first pagebreak
-    $params = array('feedback'=>$feedback->id, 'typ'=>'pagebreak');
-    if ($pagebreaks = $DB->get_records('feedback_item', $params, 'position')) {
-        $pagebreaks = array_values($pagebreaks);
-        $firstpagebreak = $pagebreaks[0];
-    } else {
-        $firstpagebreak = false;
-    }
-    $maxitemcount = $DB->count_records('feedback_item', array('feedback'=>$feedback->id));
-    $feedbackcompletedtmp = feedback_get_current_completed($feedback->id,
-                                                           true,
-                                                           $courseid,
-                                                           sesskey());
-
-    // Print the main part of the page.
-    $analysisurl = new moodle_url('/mod/feedback/analysis.php', array('id'=>$id));
-    if ($courseid > 0) {
-        $analysisurl->param('courseid', $courseid);
-    }
-    echo $OUTPUT->heading(format_string($feedback->name));
-
-    if ( (intval($feedback->publish_stats) == 1) AND
-            ( has_capability('mod/feedback:viewanalysepage', $context)) AND
-            !( has_capability('mod/feedback:viewreports', $context)) ) {
-        echo $OUTPUT->box_start('mdl-align');
-        echo '<a href="'.$analysisurl->out().'">';
-        echo get_string('completed_feedbacks', 'feedback');
-        echo '</a>';
-        echo $OUTPUT->box_end();
-    }
-
-    if (isset($savereturn) && $savereturn == 'saved') {
-        if ($feedback->page_after_submit) {
-            require_once($CFG->libdir . '/filelib.php');
-
-            $page_after_submit_output = file_rewrite_pluginfile_urls($feedback->page_after_submit,
-                                                                    'pluginfile.php',
-                                                                    $context->id,
-                                                                    'mod_feedback',
-                                                                    'page_after_submit',
-                                                                    0);
-
-            echo $OUTPUT->box_start('generalbox boxaligncenter boxwidthwide');
-            echo format_text($page_after_submit_output,
-                             $feedback->page_after_submitformat,
-                             array('overflowdiv' => true));
-            echo $OUTPUT->box_end();
-        } else {
-            echo '<p align="center"><b><font color="green">';
-            echo get_string('entries_saved', 'feedback');
-            echo '</font></b></p>';
-            if ( intval($feedback->publish_stats) == 1) {
-                echo '<p align="center"><a href="'.$analysisurl->out().'">';
-                echo get_string('completed_feedbacks', 'feedback').'</a>';
-                echo '</p>';
-            }
-        }
-        if ($feedback->site_after_submit) {
-            $url = feedback_encode_target_url($feedback->site_after_submit);
-        } else {
-            if ($courseid) {
-                if ($courseid == SITEID) {
-                    $url = $CFG->wwwroot;
-                } else {
-                    $url = $CFG->wwwroot.'/course/view.php?id='.$courseid;
-                }
-            } else {
-                if ($course->id == SITEID) {
-                    $url = $CFG->wwwroot;
-                } else {
-                    $url = $CFG->wwwroot.'/course/view.php?id='.$course->id;
-                }
-            }
-        }
-        echo $OUTPUT->continue_button($url);
-    } else {
-        if (isset($savereturn) && $savereturn == 'failed') {
-            echo $OUTPUT->box_start('mform');
-            echo '<span class="error">'.get_string('saving_failed', 'feedback').'</span>';
-            echo $OUTPUT->box_end();
-        }
-
-        if (isset($savereturn) && $savereturn == 'missing') {
-            echo $OUTPUT->box_start('mform');
-            echo '<span class="error">'.get_string('saving_failed_because_missing_or_false_values', 'feedback').'</span>';
-            echo $OUTPUT->box_end();
-        }
-
-        //print the items
-        if (is_array($feedbackitems)) {
-            echo $OUTPUT->box_start('feedback_form');
-            echo '<form action="complete_guest.php" class="mform" method="post" onsubmit=" ">';
-            echo '<fieldset>';
-            echo '<input type="hidden" name="anonymous" value="0" />';
-            $inputvalue = 'value="'.FEEDBACK_ANONYMOUS_YES.'"';
-            echo '<input type="hidden" name="anonymous_response" '.$inputvalue.' />';
-            echo '<input type="hidden" name="sesskey" value="'.sesskey().'" />';
-            //check, if there exists required-elements
-            $params = array('feedback'=>$feedback->id, 'required'=>1);
-            $countreq = $DB->count_records('feedback_item', $params);
-            if ($countreq > 0) {
-                echo '<div class="fdescription required">';
-                echo get_string('somefieldsrequired', 'form', '<img alt="'.get_string('requiredelement', 'form').
-                    '" src="'.$OUTPUT->pix_url('req') .'" class="req" />');
-                echo '</div>';
-            }
-            echo $OUTPUT->box_start('feedback_items');
-
-            $startitem = null;
-            $select = 'feedback = ? AND hasvalue = 1 AND position < ?';
-            $params = array($feedback->id, $startposition);
-            $itemnr = $DB->count_records_select('feedback_item', $select, $params);
-            $lastbreakposition = 0;
-            $align = right_to_left() ? 'right' : 'left';
-
-            foreach ($feedbackitems as $feedbackitem) {
-                if (!isset($startitem)) {
-                    //avoid showing double pagebreaks
-                    if ($feedbackitem->typ == 'pagebreak') {
-                        continue;
-                    }
-                    $startitem = $feedbackitem;
-                }
-
-                if ($feedbackitem->dependitem > 0) {
-                    //chech if the conditions are ok
-                    $fb_compare_value = feedback_compare_item_value($feedbackcompletedtmp->id,
-                                                                    $feedbackitem->dependitem,
-                                                                    $feedbackitem->dependvalue,
-                                                                    true);
-                    if (!isset($feedbackcompletedtmp->id) OR !$fb_compare_value) {
-                        $lastitem = $feedbackitem;
-                        $lastbreakposition = $feedbackitem->position;
-                        continue;
-                    }
-                }
-
-                if ($feedbackitem->dependitem > 0) {
-                    $dependstyle = ' feedback_complete_depend';
-                } else {
-                    $dependstyle = '';
-                }
-
-                echo $OUTPUT->box_start('feedback_item_box_'.$align.$dependstyle);
-                $value = '';
-                //get the value
-                $frmvaluename = $feedbackitem->typ . '_'. $feedbackitem->id;
-                if (isset($savereturn)) {
-                    $value = isset($formdata->{$frmvaluename}) ? $formdata->{$frmvaluename} : null;
-                    $value = feedback_clean_input_value($feedbackitem, $value);
-                } else {
-                    if (isset($feedbackcompletedtmp->id)) {
-                        $value = feedback_get_item_value($feedbackcompletedtmp->id,
-                                                         $feedbackitem->id,
-                                                         sesskey());
-                    }
-                }
-                if ($feedbackitem->hasvalue == 1 AND $feedback->autonumbering) {
-                    $itemnr++;
-                    echo $OUTPUT->box_start('feedback_item_number_'.$align);
-                    echo $itemnr;
-                    echo $OUTPUT->box_end();
-                }
-                if ($feedbackitem->typ != 'pagebreak') {
-                    echo $OUTPUT->box_start('box generalbox boxalign_'.$align);
-                    feedback_print_item_complete($feedbackitem, $value, $highlightrequired);
-                    echo $OUTPUT->box_end();
-                }
-
-                echo $OUTPUT->box_end();
-
-                $lastbreakposition = $feedbackitem->position; //last item-pos (item or pagebreak)
-                if ($feedbackitem->typ == 'pagebreak') {
-                    break;
-                } else {
-                    $lastitem = $feedbackitem;
-                }
-            }
-            echo $OUTPUT->box_end();
-            echo '<input type="hidden" name="id" value="'.$id.'" />';
-            echo '<input type="hidden" name="feedbackid" value="'.$feedback->id.'" />';
-            echo '<input type="hidden" name="lastpage" value="'.$gopage.'" />';
-            if (isset($feedbackcompletedtmp->id)) {
-                $inputvalue = 'value="'.$feedbackcompletedtmp->id;
-            } else {
-                $inputvalue = 'value=""';
-            }
-            echo '<input type="hidden" name="completedid" '.$inputvalue.' />';
-            echo '<input type="hidden" name="courseid" value="'. $courseid . '" />';
-            echo '<input type="hidden" name="preservevalues" value="1" />';
-            if (isset($startitem)) {
-                echo '<input type="hidden" name="startitempos" value="'.$startitem->position.'" />';
-                echo '<input type="hidden" name="lastitempos" value="'.$lastitem->position.'" />';
-            }
-
-            if ($ispagebreak AND $lastbreakposition > $firstpagebreak->position) {
-                $inputvalue = 'value="'.get_string('previous_page', 'feedback').'"';
-                echo '<input name="gopreviouspage" type="submit" '.$inputvalue.' />';
-            }
-            if ($lastbreakposition < $maxitemcount) {
-                $inputvalue = 'value="'.get_string('next_page', 'feedback').'"';
-                echo '<input name="gonextpage" type="submit" '.$inputvalue.' />';
-            }
-            if ($lastbreakposition >= $maxitemcount) { //last page
-                $inputvalue = 'value="'.get_string('save_entries', 'feedback').'"';
-                echo '<input name="savevalues" type="submit" '.$inputvalue.' />';
-            }
-
-            echo '</form>';
-            echo $OUTPUT->box_end();
-
-            echo $OUTPUT->box_start('feedback_complete_cancel');
-            if ($courseid) {
-                $action = 'action="'.$CFG->wwwroot.'/course/view.php?id='.$courseid.'"';
-            } else {
-                if ($course->id == SITEID) {
-                    $action = 'action="'.$CFG->wwwroot.'"';
-                } else {
-                    $action = 'action="'.$CFG->wwwroot.'/course/view.php?id='.$course->id.'"';
-                }
-            }
-            echo '<form '.$action.' method="post" onsubmit=" ">';
-            echo '<input type="hidden" name="sesskey" value="'.sesskey().'" />';
-            echo '<input type="hidden" name="courseid" value="'. $courseid . '" />';
-            echo '<button type="submit">'.get_string('cancel').'</button>';
-            echo '</form>';
-            echo $OUTPUT->box_end();
-            $SESSION->feedback->is_started = true;
-        }
-    }
-} else {
-    echo $OUTPUT->box_start('generalbox boxaligncenter');
-    echo $OUTPUT->notification(get_string('this_feedback_is_already_submitted', 'feedback'));
-    echo $OUTPUT->continue_button($CFG->wwwroot.'/course/view.php?id='.$course->id);
-    echo $OUTPUT->box_end();
-}
-/// Finish the page
-///////////////////////////////////////////////////////////////////////////
-///////////////////////////////////////////////////////////////////////////
-///////////////////////////////////////////////////////////////////////////
-
-echo $OUTPUT->footer();
-
+redirect($url);
index ea98a20..ce30060 100644 (file)
@@ -3214,3 +3214,29 @@ function feedback_ajax_saveitemorder($itemlist, $feedback) {
     }
     return $result;
 }
+
+/**
+ * Checks if current user is able to view feedback on this course.
+ *
+ * @param stdClass $feedback
+ * @param context_module $context
+ * @param int $courseid
+ * @return bool
+ */
+function feedback_can_view_analysis($feedback, $context, $courseid = false) {
+    if (has_capability('mod/feedback:viewreports', $context)) {
+        return true;
+    }
+
+    if (intval($feedback->publish_stats) != 1 ||
+            !has_capability('mod/feedback:viewanalysepage', $context)) {
+        return false;
+    }
+
+    if (!isloggedin() || isguestuser()) {
+        // There is no tracking for the guests, assume that they can view analysis if condition above is satisfied.
+        return $feedback->course == SITEID;
+    }
+
+    return feedback_is_already_submitted($feedback->id, $courseid);
+}
index d5dfd81..9a79dcf 100644 (file)
@@ -26,26 +26,15 @@ require_once("../../config.php");
 require_once("lib.php");
 
 $id = required_param('id', PARAM_INT);
+$courseid = optional_param('courseid', false, PARAM_INT); // Course where this feedback is mapped to - used for return link.
 
 $PAGE->set_url('/mod/feedback/print.php', array('id'=>$id));
 
-if (! $cm = get_coursemodule_from_id('feedback', $id)) {
-    print_error('invalidcoursemodule');
-}
-
-if (! $course = $DB->get_record("course", array("id"=>$cm->course))) {
-    print_error('coursemisconf');
-}
-
-if (! $feedback = $DB->get_record("feedback", array("id"=>$cm->instance))) {
-    print_error('invalidcoursemodule');
-}
-
-$context = context_module::instance($cm->id);
+list($course, $cm) = get_course_and_cm_from_cmid($id, 'feedback');
+require_course_login($course, true, $cm);
 
-require_login($course, true, $cm);
+$feedback = $PAGE->activityrecord;
 
-require_capability('mod/feedback:view', $context);
 $PAGE->set_pagelayout('embedded');
 
 /// Print the page header
@@ -66,9 +55,14 @@ echo $OUTPUT->header();
 ///////////////////////////////////////////////////////////////////////////
 echo $OUTPUT->heading(format_text($feedback->name));
 
+$continueurl = new moodle_url('/mod/feedback/view.php', array('id' => $id));
+if ($courseid) {
+    $continueurl->param('courseid', $courseid);
+}
+
 $feedbackitems = $DB->get_records('feedback_item', array('feedback'=>$feedback->id), 'position');
 echo $OUTPUT->box_start('generalbox boxaligncenter boxwidthwide');
-echo $OUTPUT->continue_button('view.php?id='.$id);
+echo $OUTPUT->continue_button($continueurl);
 if (is_array($feedbackitems)) {
     $itemnr = 0;
     $align = right_to_left() ? 'right' : 'left';
@@ -111,7 +105,7 @@ if (is_array($feedbackitems)) {
     echo $OUTPUT->box(get_string('no_items_available_yet', 'feedback'),
                     'generalbox boxaligncenter boxwidthwide');
 }
-echo $OUTPUT->continue_button('view.php?id='.$id);
+echo $OUTPUT->continue_button($continueurl);
 echo $OUTPUT->box_end();
 /// Finish the page
 ///////////////////////////////////////////////////////////////////////////
index c31bddf..ee1a6b6 100644 (file)
@@ -277,7 +277,7 @@ if ($do_show == 'showentries') {
 
                     $feedback_completeds_count = $DB->count_records('feedback_completed', $params);
                     print_string('anonymous_entries', 'feedback');
-                    echo '&nbsp;('.$feedback_completeds_count.')';
+                    echo ' ('.$feedback_completeds_count.')';
                     ?>
                 </td>
                 <td align="right">
diff --git a/mod/feedback/tests/behat/anonymous.feature b/mod/feedback/tests/behat/anonymous.feature
new file mode 100644 (file)
index 0000000..2fcbcb1
--- /dev/null
@@ -0,0 +1,245 @@
+@mod @mod_feedback
+Feature: Anonymous feedback
+  In order to collect feedbacks
+  As an admin
+  I need to be able to allow anonymous feedbacks
+
+  Background:
+    Given the following "users" exist:
+      | username | firstname | lastname |
+      | user1    | Username  | 1        |
+      | user2    | Username  | 2        |
+      | teacher  | Teacher   | 3        |
+      | manager  | Manager   | 4        |
+    And the following "courses" exist:
+      | fullname | shortname |
+      | Course 1 | C1        |
+    And the following "course enrolments" exist:
+      | user  | course | role    |
+      | user1 | C1     | student |
+      | user2 | C1     | student |
+      | teacher | C1   | editingteacher |
+    And the following "system role assigns" exist:
+      | user    | course               | role    |
+      | manager | Acceptance test site | manager |
+    And I log in as "admin"
+    And I navigate to "Manage activities" node in "Site administration > Plugins > Activity modules"
+    And I click on "Show" "link" in the "Feedback" "table_row"
+    And I log out
+    And the following "activities" exist:
+      | activity   | name            | course               | idnumber  | anonymous | publish_stats |
+      | feedback   | Site feedback   | Acceptance test site | feedback0 | 1         | 1             |
+      | feedback   | Course feedback | C1                   | feedback1 | 1         | 1             |
+    When I log in as "manager"
+    And I am on site homepage
+    And I follow "Site feedback"
+    And I follow "Edit questions"
+    And I add a "Multiple choice" question to the feedback with:
+      | Question                       | Do you like our site?              |
+      | Label                          | multichoice2                       |
+      | Multiple choice type           | Multiple choice - single answer    |
+      | Hide the "Not selected" option | Yes                                |
+      | Multiple choice values         | Yes\nNo\nI don't know              |
+    And I log out
+
+  Scenario: Guests can see anonymous feedback on front page but can not complete
+    When I follow "Site feedback"
+    Then I should not see "Answer the questions..."
+    And I follow "Preview"
+    And I should see "Do you like our site?"
+    And I press "Continue"
+
+  Scenario: Complete anonymous feedback on the front page as an authenticated user
+    And I log in as "admin"
+    And I set the following system permissions of "Authenticated user" role:
+      | capability | permission |
+      | mod/feedback:view | Allow |
+      | mod/feedback:complete | Allow |
+    And I log out
+    And I log in as "user1"
+    And I am on site homepage
+    When I follow "Site feedback"
+    And I follow "Preview"
+    And I should see "Do you like our site?"
+    And I press "Continue"
+    And I follow "Answer the questions..."
+    And I should see "Do you like our site?"
+    And I set the following fields to these values:
+      | Yes | 1 |
+    And I press "Submit your answers"
+    And I should not see "Submitted answers"
+    And I press "Continue"
+
+  Scenario: Complete anonymous feedback and view analysis on the front page as an authenticated user
+    And I log in as "admin"
+    And I set the following system permissions of "Authenticated user on frontpage" role:
+      | capability                   | permission |
+      | mod/feedback:view            | Allow      |
+      | mod/feedback:complete        | Allow      |
+      | mod/feedback:viewanalysepage | Allow      |
+    And I log out
+    And I log in as "user1"
+    And I am on site homepage
+    When I follow "Site feedback"
+    And I follow "Preview"
+    And I should see "Do you like our site?"
+    And I press "Continue"
+    And I follow "Answer the questions..."
+    And I should see "Do you like our site?"
+    And I set the following fields to these values:
+      | Yes | 1 |
+    And I press "Submit your answers"
+    And I log out
+    And I log in as "user2"
+    And I am on site homepage
+    When I follow "Site feedback"
+    And I follow "Preview"
+    And I should see "Do you like our site?"
+    And I press "Continue"
+    And I follow "Answer the questions..."
+    And I set the following fields to these values:
+      | No | 1 |
+    And I press "Submit your answers"
+    And I follow "Submitted answers"
+    And I should see "Submitted answers: 2"
+    And I should see "Questions: 1"
+    # And I should not see "multichoice2" # TODO MDL-29303 do not show labels to users who can not edit feedback
+    And I should see "Do you like our site?"
+    And I should see "1 (50.00 %)" in the "Yes:" "table_row"
+    And I should see "1 (50.00 %)" in the "No:" "table_row"
+    And I log out
+    And I log in as "manager"
+    And I am on site homepage
+    And I follow "Site feedback"
+    And I follow "Show responses"
+    And I should not see "Username"
+    And I should see "Anonymous entries (2)"
+    And I press "Show responses"
+    And I should not see "Username"
+    And I click on "Show response" "link" in the "Response number: 1" "table_row"
+    And I should not see "Username"
+    And I should see "Response number: 1 (Anonymous)"
+    And I log out
+
+  Scenario: Complete fully anonymous feedback on the front page as a guest
+    And I log in as "admin"
+    And I set the following administration settings values:
+      | feedback_allowfullanonymous | 1 |
+    And I log out
+    When I follow "Site feedback"
+    And I follow "Preview"
+    And I should see "Do you like our site?"
+    And I press "Continue"
+    And I follow "Answer the questions..."
+    And I should see "Do you like our site?"
+    And I set the following fields to these values:
+      | Yes | 1 |
+    And I press "Submit your answers"
+    And I should not see "Submitted answers"
+    And I press "Continue"
+
+  Scenario: Complete fully anonymous feedback and view analyze on the front page as a guest
+    And I log in as "admin"
+    And I set the following administration settings values:
+      | feedback_allowfullanonymous | 1 |
+    And I set the following system permissions of "Guest" role:
+      | capability                   | permission |
+      | mod/feedback:viewanalysepage | Allow      |
+    And I log out
+    When I follow "Site feedback"
+    And I follow "Preview"
+    And I should see "Do you like our site?"
+    And I press "Continue"
+    And I follow "Answer the questions..."
+    And I should see "Do you like our site?"
+    And I set the following fields to these values:
+      | Yes | 1 |
+    And I press "Submit your answers"
+    And I press "Continue"
+    # Starting new feedback
+    When I follow "Site feedback"
+    And I follow "Preview"
+    And I should see "Do you like our site?"
+    And I press "Continue"
+    And I follow "Answer the questions..."
+    And I should see "Do you like our site?"
+    And I set the following fields to these values:
+      | No | 1 |
+    And I press "Submit your answers"
+    And I follow "Submitted answers"
+    And I should see "Submitted answers: 2"
+    And I should see "Questions: 1"
+    # And I should not see "multichoice2" # TODO MDL-29303
+    And I should see "Do you like our site?"
+    And I should see "1 (50.00 %)" in the "Yes:" "table_row"
+    And I should see "1 (50.00 %)" in the "No:" "table_row"
+    And I log in as "manager"
+    And I am on site homepage
+    And I follow "Site feedback"
+    And I follow "Show responses"
+    And I should see "Anonymous entries (2)"
+    And I press "Show responses"
+    And I click on "Show response" "link" in the "Response number: 1" "table_row"
+    And I should see "Response number: 1 (Anonymous)"
+    And I log out
+
+  Scenario: Anonymous feedback in a course
+    # Teacher can not
+    When I log in as "teacher"
+    And I follow "Course 1"
+    And I follow "Course feedback"
+    And I follow "Edit questions"
+    And I add a "Multiple choice" question to the feedback with:
+      | Question                       | Do you like this course?           |
+      | Label                          | multichoice1                       |
+      | Multiple choice type           | Multiple choice - single answer    |
+      | Hide the "Not selected" option | Yes                                |
+      | Multiple choice values         | Yes\nNo\nI don't know              |
+    And I log out
+    And I log in as "user1"
+    And I follow "Course 1"
+    And I follow "Course feedback"
+    And I follow "Preview"
+    Then I should see "Do you like this course?"
+    And I press "Continue"
+    And I follow "Answer the questions..."
+    And I should see "Do you like this course?"
+    And I set the following fields to these values:
+      | Yes | 1 |
+    And I press "Submit your answers"
+    And I log out
+    And I log in as "user2"
+    And I follow "Course 1"
+    And I follow "Course feedback"
+    And I follow "Preview"
+    And I should see "Do you like this course?"
+    And I press "Continue"
+    And I follow "Answer the questions..."
+    And I should see "Do you like this course?"
+    And I set the following fields to these values:
+      | No | 1 |
+    And I press "Submit your answers"
+    And I follow "Submitted answers"
+    And I should see "Submitted answers: 2"
+    And I should see "Questions: 1"
+    # And I should not see "multichoice2" # TODO MDL-29303
+    And I should see "Do you like this course?"
+    And I should see "1 (50.00 %)" in the "Yes:" "table_row"
+    And I should see "1 (50.00 %)" in the "No:" "table_row"
+    And I log out
+    And I log in as "teacher"
+    And I follow "Course 1"
+    And I follow "Course feedback"
+    And I follow "Preview"
+    And I should see "Do you like this course?"
+    And I press "Continue"
+    And I should not see "Answer the questions..."
+    And I follow "Show responses"
+    And I should not see "Username"
+    And I should see "Anonymous entries (2)"
+    And I press "Show responses"
+    And I should not see "Username"
+    And I click on "Show response" "link" in the "Response number: 1" "table_row"
+    And I should not see "Username"
+    And I should see "Response number: 1 (Anonymous)"
+    And I log out
\ No newline at end of file
index 52a5df7..0819c75 100644 (file)
@@ -62,19 +62,7 @@ if ($course->id == SITEID AND !$courseid) {
     $courseid = SITEID;
 }
 
-if ($feedback->anonymous != FEEDBACK_ANONYMOUS_YES) {
-    if ($course->id == SITEID) {
-        require_login($course, true);
-    } else {
-        require_login($course, true, $cm);
-    }
-} else {
-    if ($course->id == SITEID) {
-        require_course_login($course, true);
-    } else {
-        require_course_login($course, true, $cm);
-    }
-}
+require_course_login($course, true, $cm);
 
 if ($course->id == SITEID) {
     $PAGE->set_context($context);
@@ -131,19 +119,6 @@ $strfeedbacks = get_string("modulenameplural", "feedback");
 $strfeedback  = get_string("modulename", "feedback");
 echo $OUTPUT->header();
 
-//ishidden check.
-//feedback in courses
-$cap_viewhiddenactivities = has_capability('moodle/course:viewhiddenactivities', $context);
-if ((empty($cm->visible) and !$cap_viewhiddenactivities) AND $course->id != SITEID) {
-    notice(get_string("activityiscurrentlyhidden"));
-}
-
-//ishidden check.
-//feedback on mainsite
-if ((empty($cm->visible) and !$cap_viewhiddenactivities) AND $courseid == SITEID) {
-    notice(get_string("activityiscurrentlyhidden"));
-}
-
 /// Print the main part of the page
 ///////////////////////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////////////////////
@@ -151,6 +126,9 @@ if ((empty($cm->visible) and !$cap_viewhiddenactivities) AND $courseid == SITEID
 
 $previewimg = $OUTPUT->pix_icon('t/preview', get_string('preview'));
 $previewlnk = new moodle_url('/mod/feedback/print.php', array('id' => $id));
+if ($courseid) {
+    $previewlnk->param('courseid', $courseid);
+}
 $preview = html_writer::link($previewlnk, $previewimg);
 
 echo $OUTPUT->heading(format_string($feedback->name) . $preview);
@@ -296,14 +274,12 @@ if ($feedback_complete_cap) {
     if ($feedback_can_submit) {
         //if the user is not known so we cannot save the values temporarly
         if (!isloggedin() or isguestuser()) {
-            $completefile = 'complete_guest.php';
             $guestid = sesskey();
         } else {
-            $completefile = 'complete.php';
             $guestid = false;
         }
         $url_params = array('id'=>$id, 'courseid'=>$courseid, 'gopage'=>0);
-        $completeurl = new moodle_url('/mod/feedback/'.$completefile, $url_params);
+        $completeurl = new moodle_url('/mod/feedback/complete.php', $url_params);
 
         $feedbackcompletedtmp = feedback_get_current_completed($feedback->id, true, $courseid, $guestid);
         if ($feedbackcompletedtmp) {