* Don't fail on urls that don't contain the project id (direct image urls).
* Don't fail when the work is deleted.
* Parse artist name from url when possible. This way the artist finder works on bad_artstation_id posts.
* Set canonical source url to `https://artist.artstation.com/projects/12345` instead of
`https://www.artstation.com/artwork/1235` (this way we preserve the artist name).
* Cache api call.
* Include api call results in /source.json.
Fix exception in Pool#previous_post_id when the post id is not contained
in the pool.
This can happen when a post's pool_string lists the post as being in a
certain pool, but the post is not included in the pool's post_ids. Such
pool_string / post_ids inconsistencies exist because of past bugs.
* Rename Upload#download_for_upload to #get_file_for_upload.
* Fix #get_file_for_upload to raise error if no file or source url was given.
* Fix javascript upload validation to disallow submitting form if file is
not present and the source is not an url.
* create_mod_action_for_destroy didn't exist (pools are never destroyed).
* is_active and is_deleted are already initialized via database defaults.
* creator_name is already defined by belongs_to_creator.
* Returning true/false in validations does nothing.
Bug: in the modqueue, if a user does a detailed rejection of one post,
then tries to do a detailed rejection of another post, the form will
still be filled in with the rejection message from the previous post.
Fix sources choosing the wrong strategy when the referer belongs to a
different site (for example, when uploading a twitter post with a pixiv
referer).
* Fix `match?` to only consider the main url, not the referer.
* Change `match?` to match against a list of domains given by the `domains` method.
* Change `match?` to an instance method.
Bug: if you open the tag edit dialog with shift+e, close it, then open
it again, it won't be vertically centered when it opens the second time.
Fix: hide the related tags section *before* opening the dialog, not after.
Hiding it afterwards shifts the layout, which uncenters the dialog.
Initialize the recent tags, frequent tags, translated tags, and artist
tags columns only once, when the related tags section is first shown.
The related tags section is shown automatically when the 'Edit' tab is
opened, or by default on the uploads page.
This fixes the /related_tags.js and /source.js calls being triggered
every time the tag edit dialog box or the 'Edit' tab was opened.
Refactor the /related_tags.js call so that when the "Related tags"
button is clicked, it only replaces the columns that actually changed,
not the entire related tags section.
This avoids rebuilding the Recent / Frequent / Translated Tags / Artist
columns every time the "Related tags" button is clicked.
Derive the artist name / profile url / page url from the source URLs when
the API response is unavailable because the Tumblr post was deleted.
This fixes the artist finder to work on bad_tumblr_id posts.
If the yande.re or konachan.com post has a source from a supported site,
for example Pixiv or Twitter, then delegate the artist and commentary
lookup to that substrategy.
Only do this for sources from recognized sites, not the null strategy.
Convert to an autosave association on urls. This ensures that when we
save the artist we only validate the added urls, not bad urls that we're
trying to remove, and that url validation errors are propagated up to
the artist object.
This also fixes invalid urls being saved in the artist history despite
validation failing (#3720).
ref: https://danbooru.donmai.us/forum_posts/151011
Bug: `Cookie.get("news-ticker") === key` always returned false because
the cookie was a string but the key was an integer.
Regressed in f72b32b27b after switching from `==` to `===`.
Move Post#humanized_essential_tag_string to TagSetPresenter#humanized_essential_tag_string.
This allows humanized_essential_tag_string to reuse the same set of tags
already fetched by the tag set presenter for the sidebar.
This avoids fetching the tag categories from memcache again (via
Post#typed_tags) when we're already fetched the tags once before.
This also means it's no longer necessary to cache humanized_essential_tag_string
itself in memcache, since it can be generated as quickly as the sidebar taglist.