| 166 | raise web.HTTPError("400 Bad Request", data=json.dumps(content)) |
| 167 | |
| 168 | def POST(self): |
| 169 | web.header("Content-Type", "application/json") |
| 170 | if not can_write(): |
| 171 | raise web.HTTPError("403 Forbidden") |
| 172 | |
| 173 | i = web.input() |
| 174 | preview = i.get("preview") == "true" |
| 175 | data = web.data() |
| 176 | |
| 177 | try: |
| 178 | edition, _ = parse_data(data) |
| 179 | |
| 180 | except (DataError, json.JSONDecodeError) as e: |
| 181 | return self.error(str(e), "Failed to parse import data") |
| 182 | except ValidationError as e: |
| 183 | return self.error("invalid-value", str(e).replace("\n", ": ")) |
| 184 | |
| 185 | if not edition: |
| 186 | return self.error("unknown-error", "Failed to parse import data") |
| 187 | |
| 188 | try: |
| 189 | reply = add_book.load(edition, save=not preview) |
| 190 | # TODO: If any records have been created, return a 201, otherwise 200 |
| 191 | return json.dumps(reply) |
| 192 | except add_book.RequiredFields as e: |
| 193 | return self.error("missing-required-field", str(e)) |
| 194 | except ClientException as e: |
| 195 | return self.error("bad-request", **json.loads(e.json)) |
| 196 | except TypeError as e: |
| 197 | return self.error("type-error", repr(e)) |
| 198 | except Exception as e: |
| 199 | return self.error("unhandled-exception", repr(e)) |
| 200 | |
| 201 | |
| 202 | def raise_non_book_marc(marc_record, **kwargs): |