function run(Contact $user, $qreq, $ssel) { global $Conf; $result = Dbl::qe_raw($Conf->paperQuery($user, ["paperId" => $ssel->selection()])); $downloads = []; $opt = PaperOption::find_document($this->dt); while ($row = PaperInfo::fetch($result, $user)) { if ($whyNot = $user->perm_view_paper_option($row, $opt, true)) { Conf::msg_error(whyNotText($whyNot, "view")); } else { $downloads[] = $row->paperId; } } if (count($downloads)) { session_write_close(); // it can take a while to generate the download if ($Conf->downloadPaper($downloads, true, $this->dt)) { exit; } } // XXX how to return errors? }
function save_paper_json($pj) { global $Conf, $Now; assert(!$this->hide_docids); $paperid = null; if (isset($pj->pid) && is_int($pj->pid) && $pj->pid > 0) { $paperid = $pj->pid; } else { if (!isset($pj->pid) && isset($pj->id) && is_int($pj->id) && $pj->id > 0) { $paperid = $pj->id; } else { if (isset($pj->pid) || isset($pj->id)) { $key = isset($pj->pid) ? "pid" : "id"; $this->set_error_html($key, "Format error [{$key}]"); return false; } } } if (get($pj, "error") || get($pj, "error_html")) { $this->set_error_html("error", "Refusing to save paper with error"); return false; } $this->prow = $old_pj = null; $this->paperid = $paperid ?: -1; if ($paperid) { $this->prow = $Conf->paperRow(["paperId" => $paperid, "topics" => true, "options" => true], $this->contact); } if ($this->prow) { $old_pj = $this->paper_json($this->prow, ["forceShow" => true]); } if ($pj && $old_pj && $paperid != $old_pj->pid) { $this->set_error_html("pid", "Saving paper with different ID"); return false; } $this->normalize($pj, $old_pj); if ($old_pj) { $this->normalize($old_pj, null); } if ($this->nerrors) { return false; } $this->check_invariants($pj, $old_pj); // store documents (options already stored) if (isset($pj->submission) && $pj->submission) { $this->upload_document($pj->submission, PaperOption::find_document(DTYPE_SUBMISSION)); } if (isset($pj->final) && $pj->final) { $this->upload_document($pj->final, PaperOption::find_document(DTYPE_FINAL)); } // create contacts foreach (self::contacts_array($pj) as $c) { $c->only_if_contactdb = !get($c, "contact"); $c->disabled = !!$this->disable_users; if (!Contact::create($c, !$this->no_email) && get($c, "contact")) { $this->set_error_html("contacts", "Could not create an account for contact " . Text::user_html($c) . "."); } } // catch errors if ($this->nerrors) { return false; } // update Paper table $q = array(); foreach (array("title", "abstract", "collaborators") as $k) { $v = convert_to_utf8((string) get($pj, $k)); if (!$old_pj || get($pj, $k) !== null && $v !== (string) get($old_pj, $k)) { $q[] = "{$k}='" . sqlq($v) . "'"; } } if (!$old_pj || get($pj, "authors") !== null) { $autext = convert_to_utf8(self::author_information($pj)); $old_autext = self::author_information($old_pj); if ($autext !== $old_autext || !$old_pj) { $q[] = "authorInformation='" . sqlq($autext) . "'"; } } if ($Conf->submission_blindness() == Conf::BLIND_OPTIONAL && (!$old_pj || get($pj, "nonblind") !== null && !$pj->nonblind != !$old_pj->nonblind)) { $q[] = "blind=" . (get($pj, "nonblind") ? 0 : 1); } if (!$old_pj || get($pj, "submission") !== null) { $new_id = get($pj, "submission") ? $pj->submission->docid : 1; $old_id = $old_pj && get($old_pj, "submission") ? $old_pj->submission->docid : 1; if (!$old_pj || $new_id != $old_id) { $q[] = "paperStorageId={$new_id}"; } } if (!$old_pj || get($pj, "final") !== null) { $new_id = get($pj, "final") ? $pj->final->docid : 0; $old_id = $old_pj && get($old_pj, "final") ? $old_pj->final->docid : 0; if (!$old_pj || $new_id != $old_id) { $q[] = "finalPaperStorageId={$new_id}"; } } if (get($pj, "withdrawn") !== null || get($pj, "submitted") !== null || get($pj, "draft") !== null) { if (get($pj, "submitted") !== null) { $submitted = $pj->submitted; } else { if (get($pj, "draft") !== null) { $submitted = !$pj->draft; } else { if ($old_pj) { $submitted = get($old_pj, "submitted_at") > 0; } else { $submitted = false; } } } if (get($pj, "withdrawn")) { if (!$old_pj || !get($old_pj, "withdrawn")) { $q[] = "timeWithdrawn=" . (get($pj, "withdrawn_at") ?: $Now); $q[] = "timeSubmitted=" . ($submitted ? -100 : 0); } else { if (get($old_pj, "submitted_at") > 0 !== $submitted) { $q[] = "timeSubmitted=" . ($submitted ? -100 : 0); } } } else { if ($submitted) { if (!$old_pj || !get($old_pj, "submitted")) { $q[] = "timeSubmitted=" . (get($pj, "submitted_at") ?: $Now); } if ($old_pj && get($old_pj, "withdrawn")) { $q[] = "timeWithdrawn=0"; } } else { if ($old_pj && (get($old_pj, "withdrawn") || get($old_pj, "submitted"))) { $q[] = "timeSubmitted=0"; $q[] = "timeWithdrawn=0"; } } } } if (get($pj, "final_submitted") !== null) { if ($pj->final_submitted) { $time = get($pj, "final_submitted_at") ?: $Now; } else { $time = 0; } if (!$old_pj || get($old_pj, "final_submitted_at") != $time) { $q[] = "timeFinalSubmitted={$time}"; } } if (!empty($q)) { if ($Conf->submission_blindness() == Conf::BLIND_NEVER) { $q[] = "blind=0"; } else { if ($Conf->submission_blindness() != Conf::BLIND_OPTIONAL) { $q[] = "blind=1"; } } $joindoc = $old_joindoc = null; if (get($pj, "final")) { $joindoc = $pj->final; $old_joindoc = $old_pj ? get($old_pj, "final") : null; } else { if (get($pj, "submission")) { $joindoc = $pj->submission; $old_joindoc = $old_pj ? get($old_pj, "submission") : null; } } if ($joindoc && (!$old_joindoc || $old_joindoc->docid != $joindoc->docid) && get($joindoc, "size") && get($joindoc, "timestamp")) { $q[] = "size=" . $joindoc->size; $q[] = "mimetype='" . sqlq($joindoc->mimetype) . "'"; $q[] = "sha1='" . sqlq($joindoc->sha1) . "'"; $q[] = "timestamp=" . $joindoc->timestamp; } else { if (!$joindoc) { $q[] = "size=0,mimetype='',sha1='',timestamp=0"; } } if ($paperid) { $result = Dbl::qe_raw("update Paper set " . join(",", $q) . " where paperId={$paperid}"); if ($result && $result->affected_rows === 0 && edb_nrows(Dbl::qe_raw("select paperId from Paper where paperId={$paperid}")) === 0) { $result = Dbl::qe_raw("insert into Paper set paperId={$paperid}, " . join(",", $q)); } } else { $result = Dbl::qe_raw("insert into Paper set " . join(",", $q)); if (!$result || !($paperid = $pj->pid = $result->insert_id)) { return $this->set_error_html(false, "Could not create paper."); } if (!empty($this->uploaded_documents)) { Dbl::qe_raw("update PaperStorage set paperId={$paperid} where paperStorageId in (" . join(",", $this->uploaded_documents) . ")"); } } // maybe update `papersub` settings $is_submitted = !get($pj, "withdrawn") && get($pj, "submitted"); $was_submitted = $old_pj && !get($old_pj, "withdrawn") && get($old_pj, "submitted"); if ($is_submitted != $was_submitted) { $Conf->update_papersub_setting($is_submitted); } } // update PaperTopics if (get($pj, "topics")) { $topics = self::topics_sql($pj, $paperid); $old_topics = self::topics_sql($old_pj, $paperid); if ($topics !== $old_topics) { $result = Dbl::qe_raw("delete from PaperTopic where paperId={$paperid}"); if ($topics) { $result = Dbl::qe_raw("insert into PaperTopic (topicId,paperId) values {$topics}"); } } } // update PaperOption if (get($pj, "options")) { $options = convert_to_utf8(self::options_sql($pj, $paperid)); $old_options = self::options_sql($old_pj, $paperid); if ($options !== $old_options) { $result = Dbl::qe("delete from PaperOption where paperId={$paperid} and optionId?a", array_keys($pj->parsed_options)); if ($options) { $result = Dbl::qe_raw("insert into PaperOption (paperId,optionId,value,data) values {$options}"); } } } // update PaperConflict $conflict = $this->conflicts_array($pj, $old_pj); $old_conflict = $this->conflicts_array($old_pj, null); if (join(",", array_keys($conflict)) !== join(",", array_keys($old_conflict)) || join(",", array_values($conflict)) !== join(",", array_values($old_conflict))) { $q = array(); foreach ($conflict as $email => $type) { $q[] = "'" . sqlq($email) . "'"; } $ins = array(); if (!empty($q)) { $result = Dbl::qe_raw("select contactId, email from ContactInfo where email in (" . join(",", $q) . ")"); while ($row = edb_row($result)) { $ins[] = "({$paperid},{$row['0']}," . $conflict[strtolower($row[1])] . ")"; } } $result = Dbl::qe_raw("delete from PaperConflict where paperId={$paperid}"); if (!empty($ins)) { $result = Dbl::qe_raw("insert into PaperConflict (paperId,contactId,conflictType) values " . join(",", $ins)); } } return $paperid; }