Allow bans to be scoped using regular expression.
Merge rule and rule ban into ban (#45)
Coding style cleanups and setup pre-commit hooks (#42)
Massive cleanup in preparation for 0.30 (#25)
* Only use environment variable to configure the application.
In order to simplify deployment on containerized or 12-factor centric
environment (such as Docker or Heroku) where writing configuration
file is not preferrable.
We also prefer to have only a single way to configure application,
which means Pyramid-style ini configurations are now dropped in favor
for environment variable.
* Refactor post utils into post filters
Akismet, DNSBL and proxy checking are now refactored into a 'filter'
which can be easily extended.
* Replaced Beaker with PyNaCl-based session storage.
This change switched session storage from Memcached-based session
storage to a cookie-based session storage with strong encryption
* Replaced app-specific settings with setting model.
Application specific settings are now stored in the database instead
of configuration file as these configurations are not required
for running the app and may require a bit more complicate data
* Add services layer
We've added services layer and successfully migrated the application
to use services rather than calling components directly. This change
will make it easier to extend as well as optimizing the application
in the future.
This change also allowed us to remove complexity from model, such as
that post-commit hooks are now done within the services layer.
Caching is also implemented in some services, such as settings.
* Explicitly setting up routes.
We will add authentication and authorization, which requires
flexibility on the routing configuration, which means the helper in
its current form is no longer preferrable.
* Use Pyramid native CSRF implementation.
We have now switched to Pyramid's native CSRF implementation instead
of using home-grown SecureForm. This change resulted in a simplified
form handling throughout the application.
* Replaced fb2 maintenance scripts.
As we will have a proper admin interface, these scripts are no
longer necessary and its usage are discouraged. Due to this, we are
dropping all the maintenance scripts in favor for a more specific
* Remove PyCharm-style type annotations.
To be replaced with Python 3.5-style type annotations in order to
incorporate type checking with MyPy.
* Consolidate assets directory for concerns separation.
Move all assets-related files into assets/ so it's clear that which
files are responsible for compiling assets (and thus purgable after
assets are compiled when building images).
* Convert JsonType field to native JSON field.
SQLALchemy has since supported the native JSON field in PostgreSQL
and it is no longer necessary to use our own implementation of JSON
field that was a wrapper over Text.
* Cleanup migration files
Styling fixes per Flake8.
* Update dependencies.
Make sure dependencies are up-to-date.
Allow rule override to be scoped.
Add robots.txt internal page.
Always take overrides into consideration when check board status.
Add proxy blocker.
Allow proxies to be blocked using either Black Box or GetIPIntel
or both (configurable). Celery initialization has also been changed
to load full Pyramid environment in order to make initialization
Allow slash in page names.
Add page model and views.
Allow creation of custom pages that may be use to store static content
such as guidelines or deletion policies. There also exists an
"internal pages" that are used for site customization.
Currently two internal pages are available:
* global_css — custom CSS that applies to every page.
* global_appendix — area that appear on top of footer on every page.
Any number of pages may be created.
Add rules system for evaluating rules based on IP address.
The rules system currently support two type of rules:
* Ban — disallow matched IP address to post in a board.
* Override — override board status for a certain IP address.
Each rule may be trigger on/off and may specify active period.
Allow boards to be restricted, locked and archived.
For moderation purpose. Behavior for each status is as follows:
* open — anyone may create new topic and post.
* restricted — nobody can create new topic but may post.
* locked — nobody may create new topic nor post.
* archived — same as locked, but board is no longer shown in the list.
| Status | Shown in list | New Topic | New Post |
| open | Yes | Yes | Yes |
| restricted | Yes | No | Yes |
| locked | Yes | No | No |
| archived | No | No | No |
Fix double topic query in topic show page.
Use topic_meta for topic metadata retrieval instead of subquery
Since we now allow posts to be deleted and the post may be restored
later, topic metadata such as post count now need to explicitly tracked
somewhere (since we can no longer reuse post.number).
Rename pages to boards.
Pages namespace will be used for site Wiki.
Switch to Python 3.5.
As libraries are dropping Python 3.2 support. This change also switched
from PyPy back to CPython since PyPy3.3 is still alpha, and Python 3.5
support is still forthcoming.
Following to this change, libraries are either deprecated, upgraded or
replaced as appropriate. The list includes:
* Replaced IPy with built-in ipaddress module.
* Replaced mock with built-in unittest.mock module.
* Replaced pg8000 with psycopg2.
* Updated Pyramid to 1.7.
* Updated Alembic to 0.8.
* Updated MarkupSafe to latest.
* Updated wtforms to latest.
* Updated coverage to latest.
* Removed Pygments version lock.
Any code that are incompatible with Python 3.5 are also updated.
Allow params to be passed as JSON.
When 'application/json' header is given in the request, the params
will now be treat as JSON instead of the usual urlencoded params
since API usage is likely to be JSON.