Metadata-Version: 2.4
Name: vitriolic
Version: 5.0.0a2
Summary: A suite of packages for the Django framework to provide integrated Content Management and Sports Administration functionality for sporting associations.
Author-email: Gary Reynolds <gary@touch.asn.au>
License-Expression: BSD-3-Clause
Project-URL: Source Code, https://github.com/goodtune/vitriolic
Classifier: Development Status :: 5 - Production/Stable
Classifier: Environment :: Web Environment
Classifier: Framework :: Django
Classifier: Framework :: Django :: 5.2
Classifier: Framework :: Django :: 6.0
Classifier: Framework :: Django :: 6.1
Classifier: Intended Audience :: Developers
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3 :: Only
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: Programming Language :: Python :: 3.14
Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content
Requires-Python: <3.15,>=3.11
Description-Content-Type: text/markdown
License-File: LICENSE
Requires-Dist: django-guardian>=2.4
Requires-Dist: django-modelforms>=1.0
Requires-Dist: django-mptt
Requires-Dist: django-timezone-field
Requires-Dist: django>=5.2
Requires-Dist: first
Requires-Dist: mcp<3,>=2
Requires-Dist: namedentities
Requires-Dist: psycopg
Provides-Extra: admin
Provides-Extra: common
Provides-Extra: content
Provides-Extra: news
Requires-Dist: django-imagekit; extra == "news"
Requires-Dist: python-dateutil; extra == "news"
Requires-Dist: python-magic; extra == "news"
Provides-Extra: competition
Requires-Dist: beautifulsoup4>=4.12; extra == "competition"
Requires-Dist: pydantic>=2.0; extra == "competition"
Requires-Dist: celery>5; extra == "competition"
Requires-Dist: cloudinary; extra == "competition"
Requires-Dist: django-embed-video; extra == "competition"
Requires-Dist: django-filter; extra == "competition"
Requires-Dist: django-formtools; extra == "competition"
Requires-Dist: django-htmx>=1.23.2; extra == "competition"
Requires-Dist: django-mathfilters; extra == "competition"
Requires-Dist: django-oauth-toolkit>=3.4; extra == "competition"
Requires-Dist: djangorestframework>3.11; extra == "competition"
Requires-Dist: drf-nested-routers; extra == "competition"
Requires-Dist: google-api-python-client; extra == "competition"
Requires-Dist: google-auth-oauthlib; extra == "competition"
Requires-Dist: icalendar; extra == "competition"
Requires-Dist: internationaltouch-oauth2client; extra == "competition"
Requires-Dist: markdown; extra == "competition"
Requires-Dist: pyparsing; extra == "competition"
Requires-Dist: python-dateutil; extra == "competition"
Requires-Dist: python-magic; extra == "competition"
Requires-Dist: requests; extra == "competition"
Provides-Extra: async
Requires-Dist: datastar-py>=1.0.3; extra == "async"
Requires-Dist: redis>=5.0.1; extra == "async"
Provides-Extra: redis
Dynamic: license-file

# vitriolic

[![PyPi Version](https://img.shields.io/pypi/v/vitriolic.svg)](https://pypi.python.org/pypi/vitriolic)

This project unifies the various subprojects Touch Technology has created over the years that were intended to be
reusable in isolation, but in practice never stood alone for long. The maintenance burden has become too great.

## Origin of the name

I decided to do this on Tuesday 8th November, US Election day 2016. The [wiktionary word of the day] was `vitriolic`
which, given the nature of Donald Trump's campaign to become American President, it seemed like a pretty good fit.

~~As at time of authoring this document I have no idea if he'll win the election.~~

This project will now forever remind me of the day that America shat the bed.

## Upgrading

[Upgrading from 4.x](docs/upgrading.md) lists the admin templates that moved in 5.0 and the four old names that still
work.

## Supported Django versions

The aim is to support the current Django LTS release plus the feature releases that follow it. I don't work on this
project all the time, so I need it to be as stable as possible for as long as possible.

Django 5.2 is the minimum supported version. As of this release, we target and test against:

| Django | Python                 | PostgreSQL | Upstream support ends |
|--------|------------------------|------------|-----------------------|
| 5.2    | 3.11, 3.12, 3.13, 3.14 | 14+        | April 2028 (LTS)      |
| 6.0    | 3.12, 3.13, 3.14       | 14+        | April 2027            |
| 6.1    | 3.12, 3.13, 3.14       | 15+        | December 2027         |

The test suite runs against PostgreSQL 15, the oldest release supported by every Django version above.

## Settings the competition sites need

Some pages load template tag libraries that your project has to install. A page whose library is
missing fails when it renders, with a `TemplateSyntaxError`. `manage.py check` reports the gap at
start up, with the lines to add, for each site that your URLconf mounts:

| Site | Needs | Check |
|------|-------|-------|
| `CompOpsSite` | On Django 5.2 only: `template_partials` in `INSTALLED_APPS`, its tags in the template `builtins` and its loader around your template loaders. [The settings in full][compops-partials]. | `tournamentcontrol.competition.E002` (builtins), `E003` (loaders); `CompOpsSite()` itself refuses to mount without the app |
| `TournamentCalculatorSite` | `"mathfilters"` in `INSTALLED_APPS`. | `tournamentcontrol.competition.E004` |
| `CompetitionSite` | `"embed_video"` in `INSTALLED_APPS`, for the match video page. | `tournamentcontrol.competition.W001` (a warning) |

`pip install vitriolic[competition]` installs `django-mathfilters` and `django-embed-video`, but you add them
to `INSTALLED_APPS` yourself. A site is found by its app name (`compops`, `calculator` and `competition`), so a
site that you mount under another `app_name` is not checked.

[compops-partials]: https://github.com/goodtune/vitriolic/blob/main/docs/compops.md#template-partials-on-django-52

[wiktionary word of the day]: https://en.wiktionary.org/wiki/Wiktionary:Word_of_the_day
