Clean up and optimize logic for copying field state on publish.

Review Request #13066 — Created May 25, 2023 and updated

Review Board

The code for copying state on publish is pretty old, and had some very
inefficient database operations. Particularly for screenshots and file

While care was done to avoid any database operations on review
requests/drafts without screenshots or file attachments, the actual
copying logic itself was messy:

  1. Much of the code between screenshots and file attachments were

  2. Full-model fetches were performed when we only needed small pieces of

  3. Copying of items was done one-by-one, instead of batch-copying.

  4. We looped over objects twice for captions, which wasn't necessary.

  5. We redefined update_list every time we performed a publish.

This change redoes much of this logic. There's now a single function
that can handle copying state for both screenshots and file attachments.
This takes in parameters for the counts and relations, figures out what
minimum information we need to fetch, and performs the copy as
efficiently as possible.

Some related code has been cleaned up to avoid re-fetching attributes
line after line after line.

While this won't offer a massive speed improvement for most deployments,
it will at least reduce the work the database needs to perform whenever
we publish going forward.

Unit tests pass.

Clean up and optimize logic for copying field state on publish.
Checks run (2 succeeded)
flake8 passed.
JSHint passed.