function loadRows() { global $prow, $Conf, $Error; $Conf->paper = $prow = PaperTable::paperRow($whyNot); if (!$prow) { errorMsgExit(whyNotText($whyNot, "view")); } if (isset($Error["paperId"]) && $Error["paperId"] != $prow->paperId) { $Error = array(); } }
function loadRows() { global $prow, $rrows, $Conf, $Me; $Conf->paper = $prow = PaperTable::paperRow($whyNot); if (!$prow) { errorMsgExit(whyNotText($whyNot, "view")); } if ($whyNot = $Me->perm_request_review($prow, false)) { $wnt = whyNotText($whyNot, "request reviews for"); error_go(hoturl("paper", array("p" => $prow->paperId, "ls" => @$_REQUEST["ls"])), $wnt); } $rrows = $Conf->reviewRow(array('paperId' => $prow->paperId, 'array' => 1), $whyNot); }
function document_download() { global $Conf, $Me, $Opt; $documentType = HotCRPDocument::parse_dtype(@$_REQUEST["dt"]); if ($documentType === null) { $documentType = @$_REQUEST["final"] ? DTYPE_FINAL : DTYPE_SUBMISSION; } $attachment_filename = false; $docid = null; if (isset($_REQUEST["p"])) { $paperId = cvtint(@$_REQUEST["p"]); } else { if (isset($_REQUEST["paperId"])) { $paperId = cvtint(@$_REQUEST["paperId"]); } else { $s = $orig_s = preg_replace(',\\A/*,', "", Navigation::path()); $documentType = $dtname = null; if (str_starts_with($s, $Opt["downloadPrefix"])) { $s = substr($s, strlen($Opt["downloadPrefix"])); } if (preg_match(',\\Ap(?:aper)?(\\d+)/+(.*)\\z,', $s, $m)) { $paperId = intval($m[1]); if (preg_match(',\\A([^/]+)\\.[^/]+\\z,', $m[2], $mm)) { $dtname = $mm[1]; } else { if (preg_match(',\\A([^/]+)/+(.*)\\z,', $m[2], $mm)) { list($dtype, $attachment_filename) = array($m[1], $m[2]); } } } else { if (preg_match(',\\A(?:paper)?(\\d+)-?([-A-Za-z0-9_]*)(?:\\.[^/]+|/+(.*))\\z,', $s, $m)) { list($paperId, $dtname, $attachment_filename) = array(intval($m[1]), $m[2], @$m[3]); } else { if (preg_match(',\\A([A-Za-z_][-A-Za-z0-9_]*?)?-?(\\d+)(?:\\.[^/]+|/+(.*))\\z,', $s, $m)) { list($paperId, $dtname, $attachment_filename) = array(intval($m[2]), $m[1], @$m[3]); } } } if ($dtname !== null) { $documentType = HotCRPDocument::parse_dtype($dtname ?: "paper"); } if ($documentType !== null && $attachment_filename) { $o = PaperOption::find($documentType); if (!$o || $o->type != "attachments") { $documentType = null; } } } } if ($documentType === null) { document_error("404 Not Found", "Unknown document “" . htmlspecialchars($orig_s) . "”."); } $prow = $Conf->paperRow($paperId, $Me, $whyNot); if (!$prow) { document_error("404 Not Found", whyNotText($whyNot, "view")); } else { if ($whyNot = $Me->perm_view_pdf($prow)) { document_error("403 Forbidden", whyNotText($whyNot, "view")); } else { if ($documentType > 0 && !$Me->can_view_paper_option($prow, $documentType, true)) { document_error("403 Forbidden", "You don’t have permission to view this document."); } } } if ($attachment_filename) { $oa = $prow->option($documentType); foreach ($oa ? $oa->documents($prow) : array() as $doc) { if ($doc->unique_filename == $attachment_filename) { $docid = $doc; } } if (!$docid) { document_error("404 Not Found", "No such attachment “" . htmlspecialchars($orig_s) . "”."); } } // Actually download paper. session_write_close(); // to allow concurrent clicks if ($Conf->downloadPaper($prow, cvtint(@$_REQUEST["save"]) > 0, $documentType, $docid)) { exit; } document_error("500 Server Error", null); }
function handle_response() { global $Conf, $Me, $prow, $crow; $rname = @trim($_REQUEST["response"]); $rnum = $Conf->resp_round_number($rname); if ($rnum === false && $rname) { return Conf::msg_error("No such response round “" . htmlspecialchars($rname) . "”."); } $rnum = (int) $rnum; if ($crow && @(int) $crow->commentRound !== $rnum) { $Conf->warnMsg("Attempt to change response round ignored."); $rnum = @+$crow->commentRound; } if (!($xcrow = $crow)) { $xcrow = (object) array("commentType" => COMMENTTYPE_RESPONSE, "commentRound" => $rnum); } if ($whyNot = $Me->perm_respond($prow, $xcrow, true)) { return Conf::msg_error(whyNotText($whyNot, "respond to reviews for")); } $text = @rtrim($_REQUEST["comment"]); if ($text === "" && !$crow) { return Conf::msg_error("Enter a response."); } save_comment($text, true, $rnum); }
function realize(AssignmentItem $item, $cmap, AssignmentState $state) { $prow = $state->prow($item["pid"]); $is_admin = $state->contact->can_administer($prow); $tag = $item["_tag"]; $previndex = $item->before ? $item->before["_index"] : null; $index = $item->deleted() ? null : $item["_index"]; // check permissions if ($item["_vote"]) { $index = $index ?: null; } else { if ($whyNot = $state->contact->perm_change_tag($prow, $item["ltag"], $previndex, $index, $item->override)) { if (get($whyNot, "otherTwiddleTag")) { return null; } throw new Exception(whyNotText($whyNot, "tag")); } } // actually assign return new TagAssigner($item["pid"], true, $item["_tag"], $index); }
function run(Contact $user, $qreq, $ssel) { global $Conf; $result = Dbl::qe_raw($Conf->paperQuery($user, array("paperId" => $ssel->selection(), "topics" => 1))); $texts = array(); while ($prow = PaperInfo::fetch($result, $user)) { if ($whyNot = $user->perm_view_paper($prow)) { Conf::msg_error(whyNotText($whyNot, "view")); } else { $text = "===========================================================================\n"; $n = "Paper #" . $prow->paperId . ": "; $l = max(14, (int) ((75.5 - strlen($prow->title) - strlen($n)) / 2) + strlen($n)); $text .= prefix_word_wrap($n, $prow->title, $l); $text .= "---------------------------------------------------------------------------\n"; $l = strlen($text); if ($user->can_view_authors($prow, $qreq->t == "a")) { $text .= prefix_word_wrap("Authors: ", $prow->pretty_text_author_list(), 14); } if ($prow->topicIds != "" && ($tt = $prow->unparse_topics_text())) { $text .= prefix_word_wrap("Topics: ", $tt, 14); } if ($l != strlen($text)) { $text .= "---------------------------------------------------------------------------\n"; } $text .= rtrim($prow->abstract) . "\n\n"; defappend($texts[$prow->paperId], $text); $rfSuffix = count($texts) == 1 ? $prow->paperId : "s"; } } if (count($texts)) { downloadText(join("", $ssel->reorder($texts)), "abstract{$rfSuffix}"); } }
function run(Contact $user, $qreq, $ssel) { global $Conf; $result = Dbl::qe_raw($Conf->paperQuery($user, array("paperId" => $ssel->selection(), "allReviewScores" => 1, "reviewerName" => 1))); // compose scores; NB chair is always forceShow $errors = array(); $texts = $any_scores = array(); $any_decision = $any_reviewer_identity = false; $rf = ReviewForm::get(); $bad_pid = -1; while ($row = PaperInfo::fetch($result, $user)) { if (!$row->reviewSubmitted || $row->paperId == $bad_pid) { /* skip */ } else { if ($whyNot = $user->perm_view_review($row, null, true)) { $errors[] = whyNotText($whyNot, "view reviews for") . "<br />"; $bad_pid = $row->paperId; } else { $a = array("paper" => $row->paperId, "title" => $row->title); if ($row->outcome && $user->can_view_decision($row, true)) { $a["decision"] = $any_decision = $Conf->decision_name($row->outcome); } $view_bound = $user->view_score_bound($row, $row, true); $this_scores = false; foreach ($rf->forder as $field => $f) { if ($f->view_score > $view_bound && $f->has_options && ($row->{$field} || $f->allow_empty)) { $a[$f->abbreviation] = $f->unparse_value($row->{$field}); $any_scores[$f->abbreviation] = $this_scores = true; } } if ($user->can_view_review_identity($row, $row, true)) { $any_reviewer_identity = true; $a["email"] = $row->reviewEmail; $a["reviewername"] = trim($row->reviewFirstName . " " . $row->reviewLastName); } if ($this_scores) { arrayappend($texts[$row->paperId], $a); } } } } if (count($texts)) { $header = array("paper", "title"); if ($any_decision) { $header[] = "decision"; } if ($any_reviewer_identity) { array_push($header, "reviewername", "email"); } $header = array_merge($header, array_keys($any_scores)); downloadCSV($ssel->reorder($texts), $header, "scores", ["selection" => true]); } else { if (!count($errors)) { $errors[] = "No papers selected."; } Conf::msg_error(join("", $errors)); } }
private function _review_buttons($prow, $rrow, $type, $reviewPostLink) { global $Conf, $Me; $buttons = array(); // refuse? if ($type == "top" && $rrow && !$rrow->reviewModified && $rrow->reviewType < REVIEW_SECONDARY) { $buttons[] = Ht::submit("accept", "Accept review", array("class" => "b")); $buttons[] = Ht::button("Decline review", array("class" => "b", "onclick" => "popup(this,'ref',0)")); // Also see $_REQUEST["refuse"] case in review.php. $Conf->footerHtml("<div id='popup_ref' class='popupc'>" . Ht::form_div($reviewPostLink) . Ht::hidden("refuse", "refuse") . "<p style='margin:0 0 0.3em'>Select “Decline review” to decline this review. Thank you for keeping us informed.</p>" . Ht::textarea("reason", null, array("id" => "refusereviewreason", "rows" => 3, "cols" => 40, "placeholder" => "Optional explanation", "spellcheck" => "true")) . '<div class="popup_actions">' . Ht::js_button("Cancel", "popup(null,'ref',1)") . Ht::submit("Decline review", array("class" => "bb")) . "</div></div></form></div>", "declinereviewform"); $buttons[] = ""; } $submitted = $rrow && $rrow->reviewSubmitted; if (!$Conf->time_review($rrow, $Me->act_pc($prow, true), true)) { $whyNot = array("deadline" => $rrow && $rrow->reviewType < REVIEW_PC ? "extrev_hard" : "pcrev_hard"); $override_text = whyNotText($whyNot, "review"); if (!$submitted) { $buttons[] = array(Ht::js_button("Submit review", "override_deadlines(this)", array("class" => "bb", "data-override-text" => $override_text, "data-override-submit" => "submitreview")), "(admin only)"); $buttons[] = array(Ht::js_button("Save as draft", "override_deadlines(this)", array("data-override-text" => $override_text, "data-override-submit" => "savedraft")), "(admin only)"); } else { $buttons[] = array(Ht::js_button("Save changes", "override_deadlines(this)", array("class" => "bb", "data-override-text" => $override_text, "data-override-submit" => "submitreview")), "(admin only)"); } } else { if (!$submitted) { $buttons[] = Ht::submit("submitreview", "Submit review", array("class" => "bb")); $buttons[] = Ht::submit("savedraft", "Save as draft"); } else { $buttons[] = Ht::submit("submitreview", "Save changes", array("class" => "bb")); } } if ($rrow && $type == "bottom" && $Me->allow_administer($prow)) { $buttons[] = ""; if ($submitted) { $buttons[] = array(Ht::submit("unsubmitreview", "Unsubmit review"), "(admin only)"); } $buttons[] = array(Ht::js_button("Delete review", "popup(this,'d',0)"), "(admin only)"); $Conf->footerHtml("<div id='popup_d' class='popupc'>\n <p>Be careful: This will permanently delete all information about this\n review assignment from the database and <strong>cannot be\n undone</strong>.</p>\n " . Ht::form_div($reviewPostLink, array("divclass" => "popup_actions")) . Ht::js_button("Cancel", "popup(null,'d',1)") . Ht::submit("deletereview", "Delete review", array("class" => "bb")) . "</div></form></div>"); } return $buttons; }
function downloadForm($editable) { global $rf, $Conf, $Me, $prow, $paperTable, $Opt; $explicit = true; if ($paperTable->rrow) { $rrows = array($paperTable->rrow); } else { if ($editable) { $rrows = array(); } else { $rrows = $paperTable->viewable_rrows; $explicit = false; } } $text = ""; foreach ($rrows as $rr) { if ($rr->reviewSubmitted) { $text .= downloadView($prow, $rr, $editable); } } foreach ($rrows as $rr) { if (!$rr->reviewSubmitted && ($explicit || $rr->reviewModified)) { $text .= downloadView($prow, $rr, $editable); } } if (count($rrows) == 0 && $editable) { $text .= downloadView($prow, null, $editable); } if (!$explicit) { $paperTable->resolveComments(); foreach ($paperTable->crows as $cr) { if ($Me->can_view_comment($prow, $cr, false)) { $text .= $cr->unparse_text($Me, true) . "\n"; } } } if (!$text) { $whyNot = $Me->perm_view_review($prow, null, null); return Conf::msg_error(whyNotText($whyNot ?: array("fail" => 1), "review")); } if ($editable) { $text = ReviewForm::textFormHeader(count($rrows) > 1) . $text; } $filename = (count($rrows) > 1 ? "reviews" : "review") . "-" . $prow->paperId; if (count($rrows) == 1 && $rrows[0]->reviewSubmitted) { $filename .= unparseReviewOrdinal($rrows[0]->reviewOrdinal); } downloadText($text, $filename, !$editable); }