People could delete their own comments on torrents other than
the one the URL would indicate, which meant they could mess with
the total comment count on a torrent by having it be higher than
it actually is through repeatedly posting and deleting comments
that way.
However, they could only ever delete their own comments, so this
isn't a huge issue in the first place.
Before bootstrap-select is loaded, a small JS piece replaces the
class for the pickers with the appropriate bootstrap-select classes.
If there is no JS, the dropdowns will stay as form-control.
* Implement torrent nuking ability for mods
This deletes all torrents of a specific user.
A current caveat is that it will delete both sukebei and nyaa torrents,
but will only leave a log entry in the current flavour's log.
Also did some bootstrap untangling on the user view page.
* Per-flavour logging
Hopefully this works. Maybe.
* Tracker API: chunk into 100-element sublists
* isort
* Restrict nuking to superadmins
Also do a lint.sh.
* Implement upload ratelimit for non-trusted uploaders
Users may upload X torrents in Y minutes after which they
will have to wait Z minutes between uploads.
* Show torrent period count when ratelimited
* Only ratelimit new accounts
This tells users who are banned the reason that they are banned,
and doesn't show the same message for inactive users.
IP banned users are still just shown the boring 403 page.
Previously, people couldn't quite tell you needed to give a report
reason. Now we disable the submit button until there is a reason,
and flask.flash() if someone manages to submit an empty reason
anyway.
Disables all POSTs, optionally allowing users to log in (without updating last login date)
Blocked POSTs will redirect to the GET endpoint if possible, otherwise to referrer or in last case, home page.
API requests will get a plaintext message with 405 status code.
Index names are not necessarily named 'ix_table_column', so inspect the real schema for index names. Results are cached in memory.
(I have no clue how, but mine are prefixed idx_ instead of ix_!)
Clears out the "sort" variable naming as well.
MINIMUM_ANONYMOUS_TORRENT_SIZE can be used to require a minimum total
size of torrents uploaded by anonymous users (ie. without accounts).
Sets up a "framework" for post-WTForm torrent validation as well;
this can easily be extended into filename blacklists and such.
As per comments in #288, Firefox forces a "what do you want to do with this"-dialog for 'attachment' even when it's set to open them immediately in another program.
* Replace all `from nyaa import app` imports with `app = flask.current_app` (or `from flask import current_app as app` where possible)
* Add a separate config object for top-level and class statements as `nyaa.extensions.config`
Required because those codes don't have app context at the time of evaluation/execution.
* Remove `routes.py` file and register all blueprints in `nyaa/__init__.py`
* Refactor `nyaa/__init__.py` into an app factory
* Update tools
* Update tests (temporary, will be replaced)
url-list is supposed to be omitted in case of no webseeds,
but qB will instead use an empty bytestring '' as the value.
This commit makes the validation more lenient regarding url-list.
* Update isort settings
* Apply import sorting (isort) on all files in nyaa/
* Fixed Flake8 errors in nyaa/ (see PR for list)
* Add isort to lint.sh and requirements.txt
read(1) returns b'' on EOF, which wasn't checked for in a couple cases,
which could cause empty/truncated input to enter one of the `while True`
loops without hope of exit. programming is hard.
This changes the tracker announce URL message to be one of those
bootstrap alert bubbles, and adds an additional warning which tells
people to read the rules and not upload off-topic crap.
* Make rfc822 filters compatible with Windows systems.
.strftime() is relative to the system it's being run on.
UNIX has '%s' for seconds since the EPOCH, Windows doesn't (ValueError).
Solution: use .timestamp() to achieve the same result on both platforms.
This also allows us to drop the float() around it, since it returns a float.
* Start testing filters
* Add placeholders for more tests
* Make 'tests' folder a Python package
Now you can run tests with just `pytest tests`
* Update readme and travis config
* Test timesince()
* Update and organize .gitignore
Deleted: (nothing)
Added: Coverage files, .idea\
* Test filter_truthy, category_name
* Tests for backend.py
* Tests for bencode.py
* Move (empty) test_models.py to tests package
* Tests for utils.py
* Fixes for flattenDict
* Change name to `flatten_dict`
* `newkey` was assigned but never used
* Add a helper class for testing
* Show coverage on Travis
(only Travis for now...)
* Remove IDE
* Use correct assert functions
* Update README.md
* Admin log added
* Add admin log to top bar
* Fixed some admin log bugs
* Remove comment_id column because comments die when they are killed
* Fix tabs in admin log template
* Fixed sort of admin logs to be created_time desc
* Fix navbar wrapping to a new line
when 992px <= width <= 1200px
* Put reports and admin log in "Admin" dropdown
Applied ./lint.sh fixes
Fixed long lines
* Updated log to be text instead of id based to account for future deletions
* Small fix in log message formatting
The responsive table actually does *worse* in narrow layouts because
the action column fucks off out of view and needs to be scrolled to
if the report reason is long. With a normal table you may not get
consistent row heights, but at least you don't have to horizontally
scroll to perform an action.
Also fixed a goof where I used a style attribute instead of making
the max-width for the action column a class.
Condense the table, vertically align the text inside rows, use a
bootstrap styled select, group it together with the review button
and shrink it down a little.
Apparently some people don't understand what the report button
is for. Adding this small warning can be considered a success even
if it just leads to one less stupid report.
* Fix markdown renderer
Use a simple for loop instead of `for (var target of markdownTargets)`, because it's unsupported in IE.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for...of#Browser_compatibility
* view.html : HTML Fixes
- Remove unmatched `</a>`
- Add missing `</div>`
- Use single quotes in {{ }}
- Closing tags comments
* layout.html
- Use single quotes in {{ }}
- Closing tags comments
* help.html: Convert all `<p>` to `<div>`
HTML spec doesn't allow lists inside `<p>` elements.
* Missing semicolon in `<script>`
This fixes searching for "Machiavellianism", 16 chars ("Machiavellianis", 15 chars, worked previously).
Does not (seem to!) break anything, but requires a re-indexing of ES.
Small nitpick change.
"Edit" being the button that saves the edits might be a little
confusing, whereas "Save Changes" is less ambiguous and more
easily recognised.
It includes little anchors over headings that you can click to link
your one reading-challenged friend to the right section.
In the future, adding an explanation of the different categories
and labels under a new h2 would be a good thing.
A small convenience change which by sets the focus to the newly
opened modal dialog's text field if the report button is hit.
This way, people can type away their gripes with the torrent without
having to click into the text field first.
This allows us to easily extend the bases into Nyaa and Sukebei models, with working FKs and relationships.
Note: the schema will (should!) otherwise match, however; the following index on Torrent was renamed:
uploader_flag_idx will be <prefix>_uploader_flag_idx, as we will be always creating both flavors.
The index rename should not affect SQA, but will potentially break migrations.
Add support for sorting comments (in advance),
add th for sorting by comments_count, add title to the counter box and fix it being under the torrent's name,