示例#1
0
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();
    }
}
示例#2
0
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);
}
示例#3
0
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));
     }
 }
示例#8
0
 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;
 }
示例#9
0
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);
}