function run(Contact $user, $qreq, $ssel)
 {
     global $Conf, $Opt;
     // maybe download preferences for someone else
     $Rev = $user;
     if (($cid = cvtint($qreq->reviewer)) > 0 && $user->privChair) {
         if (!($Rev = Contact::find_by_id($cid))) {
             return Conf::msg_error("No such reviewer");
         }
     }
     if (!$Rev->isPC) {
         return self::EPERM;
     }
     $q = $Conf->paperQuery($Rev, array("paperId" => $ssel->selection(), "topics" => 1, "reviewerPreference" => 1));
     $result = Dbl::qe_raw($q);
     $texts = array();
     while ($prow = PaperInfo::fetch($result, $Rev)) {
         $t = $prow->paperId . "," . CsvGenerator::quote($prow->title);
         if ($prow->conflictType > 0) {
             $t .= ",conflict";
         } else {
             $t .= "," . unparse_preference($prow);
         }
         $t .= "\n";
         if ($this->extended) {
             if ($Rev->can_view_authors($prow, false)) {
                 $t .= prefix_word_wrap("#  Authors: ", $prow->pretty_text_author_list(), "#           ");
             }
             $t .= prefix_word_wrap("# Abstract: ", rtrim($prow->abstract), "#           ");
             if ($prow->topicIds != "") {
                 $t .= prefix_word_wrap("#   Topics: ", $prow->unparse_topics_text(), "#           ");
             }
             $t .= "\n";
         }
         defappend($texts[$prow->paperId], $t);
     }
     downloadCSV(join("", $ssel->reorder($texts)), ["paper", "title", "preference"], "revprefs");
 }
 static function setReviewPreference($prow)
 {
     global $Conf, $Me, $Error, $OK;
     $ajax = defval($_REQUEST, "ajax", false);
     if (!$Me->allow_administer($prow) || ($contactId = cvtint(@$_REQUEST["reviewer"])) <= 0) {
         $contactId = $Me->contactId;
     }
     if (isset($_REQUEST["revpref"]) && ($v = parse_preference($_REQUEST["revpref"]))) {
         if (self::save_review_preferences(array(array($prow->paperId, $contactId, $v[0], $v[1])))) {
             $Conf->confirmMsg($ajax ? "Saved" : "Review preference saved.");
         } else {
             $Error["revpref"] = true;
         }
         $v = unparse_preference($v);
     } else {
         $v = null;
         Conf::msg_error($ajax ? "Bad preference" : "Bad preference “" . htmlspecialchars($_REQUEST["revpref"]) . "”.");
         $Error["revpref"] = true;
     }
     if ($ajax) {
         $Conf->ajaxExit(array("ok" => $OK && !@$Error["revpref"], "value" => $v));
     }
 }
 public function text($pl, $row)
 {
     return unparse_preference($this->preference_values($row));
 }
 function unparse_csv(AssignmentSet $aset, AssignmentCsv $acsv)
 {
     if (!$this->pref && $this->exp === null) {
         $pref = "none";
     } else {
         $pref = unparse_preference($this->pref, $this->exp);
     }
     return ["pid" => $this->pid, "action" => "preference", "email" => $this->contact->email, "name" => $this->contact->name_text(), "preference" => $pref];
 }
 static function setpref_api($user, $qreq, $prow)
 {
     global $Conf;
     $cid = $user->contactId;
     if ($user->allow_administer($prow) && $qreq->reviewer && ($x = cvtint($qreq->reviewer)) > 0) {
         $cid = $x;
     }
     if ($v = parse_preference($qreq->pref)) {
         if (PaperActions::save_review_preferences([[$prow->paperId, $cid, $v[0], $v[1]]])) {
             $j = ["ok" => true, "response" => "Saved"];
         } else {
             $j = ["ok" => false];
         }
         $j["value"] = unparse_preference($v);
     } else {
         $j = ["ok" => false, "error" => "Bad preference"];
     }
     json_exit($j);
 }