update dependencies (#766)

* update dependencies

* fix lint

* sync migration

---------

Co-authored-by: mein Name <ich@example.com>
This commit is contained in:
Henri Dickson 2024-10-28 11:14:22 -04:00 committed by GitHub
parent 7293e6c4bd
commit 4c5c9703f5
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
12 changed files with 215 additions and 337 deletions

3
.gitignore vendored
View file

@ -13,6 +13,9 @@ __pycache__/
# VS Code configuration files
.vscode/
# Zed settings
.zed
# flake8
tox.ini

View file

@ -1,7 +1,7 @@
exclude: ^test_data/
repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v4.6.0
rev: v5.0.0
hooks:
- id: check-yaml
args: [--unsafe]
@ -25,7 +25,7 @@ repos:
- id: mixed-line-ending
- repo: https://github.com/astral-sh/ruff-pre-commit
rev: v0.4.7
rev: v0.7.1
hooks:
- id: ruff
# - id: ruff-format
@ -42,11 +42,16 @@ repos:
- id: black
- repo: https://github.com/Riverside-Healthcare/djLint
rev: v1.34.1
rev: v1.35.2
hooks:
- id: djlint-reformat-django
- id: djlint-django
# - repo: https://github.com/RobertCraigie/pyright-python
# rev: v1.1.386
# hooks:
# - id: pyright
- repo: local
hooks:
- id: pyright

View file

@ -110,8 +110,6 @@ env = environ.FileAwareEnv(
IGDB_API_CLIENT_SECRET=(str, ""),
# Discord webhooks
DISCORD_WEBHOOKS=(dict, {"user-report": None}),
# Slack API token, for sending exceptions to Slack, may deprecate in future
SLACK_API_TOKEN=(str, ""),
THREADS_APP_ID=(str, ""),
THREADS_APP_SECRET=(str, ""),
NEODB_ENABLE_LOGIN_BLUESKY=(bool, False),
@ -276,8 +274,6 @@ GOOGLE_API_KEY = env("GOOGLE_API_KEY")
DISCOGS_API_KEY = env("DISCOGS_API_KEY")
IGDB_CLIENT_ID = env("IGDB_API_CLIENT_ID")
IGDB_CLIENT_SECRET = env("IGDB_API_CLIENT_SECRET")
SLACK_TOKEN = env("SLACK_API_TOKEN")
SLACK_CHANNEL = "alert"
DOWNLOADER_PROXY_LIST = env("NEODB_DOWNLOADER_PROXY_LIST")
DOWNLOADER_BACKUP_PROXY = env("NEODB_DOWNLOADER_BACKUP_PROXY", default="") # type: ignore
@ -412,15 +408,6 @@ logging.getLogger("urllib3").setLevel(logging.WARNING)
logging.getLogger("httpx").setLevel(logging.WARNING)
logging.getLogger("httpcore").setLevel(logging.WARNING)
if SLACK_TOKEN:
INSTALLED_APPS += [
"django_slack",
]
LOGGING["handlers"]["slack"] = {
"level": "ERROR",
"class": "django_slack.log.SlackExceptionHandler",
}
LOGGING["loggers"]["django"] = {"handlers": ["slack"], "level": "ERROR"}
MARKDOWNX_MARKDOWNIFY_FUNCTION = "journal.models.render_md"

View file

@ -3,7 +3,6 @@
import uuid
import django.db.models.deletion
import simple_history.models
from django.db import migrations, models
import catalog.common.utils
@ -101,76 +100,6 @@ class Migration(migrations.Migration):
("edited_time", models.DateTimeField(auto_now=True)),
],
),
migrations.CreateModel(
name="HistoricalItem",
fields=[
(
"id",
models.BigIntegerField(
auto_created=True, blank=True, db_index=True, verbose_name="ID"
),
),
(
"uid",
models.UUIDField(db_index=True, default=uuid.uuid4, editable=False),
),
(
"title",
models.CharField(default="", max_length=1000, verbose_name="标题"),
),
(
"brief",
models.TextField(blank=True, default="", verbose_name="简介"),
),
(
"primary_lookup_id_type",
models.CharField(
max_length=50, null=True, verbose_name="主要标识类型"
),
),
(
"primary_lookup_id_value",
models.CharField(
max_length=1000, null=True, verbose_name="主要标识数值"
),
),
(
"metadata",
models.JSONField(
blank=True, default=dict, null=True, verbose_name="其它信息"
),
),
(
"cover",
models.TextField(
blank=True,
default="item/default.svg",
max_length=100,
verbose_name="封面",
),
),
("created_time", models.DateTimeField(blank=True, editable=False)),
("edited_time", models.DateTimeField(blank=True, editable=False)),
("is_deleted", models.BooleanField(db_index=True, default=False)),
("history_id", models.AutoField(primary_key=True, serialize=False)),
("history_date", models.DateTimeField(db_index=True)),
("history_change_reason", models.CharField(max_length=100, null=True)),
(
"history_type",
models.CharField(
choices=[("+", "Created"), ("~", "Changed"), ("-", "Deleted")],
max_length=1,
),
),
],
options={
"verbose_name": "historical item",
"verbose_name_plural": "historical items",
"ordering": ("-history_date", "-history_id"),
"get_latest_by": ("history_date", "history_id"),
},
bases=(simple_history.models.HistoricalChanges, models.Model),
),
migrations.CreateModel(
name="Item",
fields=[

View file

@ -47,54 +47,6 @@ class Migration(migrations.Migration):
to="contenttypes.contenttype",
),
),
migrations.AddField(
model_name="historicalitem",
name="history_user",
field=models.ForeignKey(
null=True,
on_delete=django.db.models.deletion.SET_NULL,
related_name="+",
to=settings.AUTH_USER_MODEL,
),
),
migrations.AddField(
model_name="historicalitem",
name="last_editor",
field=models.ForeignKey(
blank=True,
db_constraint=False,
null=True,
on_delete=django.db.models.deletion.DO_NOTHING,
related_name="+",
to=settings.AUTH_USER_MODEL,
),
),
migrations.AddField(
model_name="historicalitem",
name="merged_to_item",
field=models.ForeignKey(
blank=True,
db_constraint=False,
default=None,
null=True,
on_delete=django.db.models.deletion.DO_NOTHING,
related_name="+",
to="catalog.item",
),
),
migrations.AddField(
model_name="historicalitem",
name="polymorphic_ctype",
field=models.ForeignKey(
blank=True,
db_constraint=False,
editable=False,
null=True,
on_delete=django.db.models.deletion.DO_NOTHING,
related_name="+",
to="contenttypes.contenttype",
),
),
migrations.AddField(
model_name="externalresource",
name="item",

View file

@ -55,55 +55,13 @@ class Migration(migrations.Migration):
("apple_podcast", "Apple Podcast"),
("apple_music", "Apple Music"),
("fedi", "Fediverse"),
("qidian", "Qidian"),
("ypshuo", "Ypshuo"),
],
max_length=50,
verbose_name="IdType of the source site",
),
),
migrations.AlterField(
model_name="item",
name="brief",
field=models.TextField(blank=True, default="", verbose_name="description"),
),
migrations.AlterField(
model_name="item",
name="cover",
field=models.ImageField(
blank=True,
default="item/default.svg",
upload_to=catalog.common.utils.item_cover_path,
verbose_name="cover",
),
),
migrations.AlterField(
model_name="item",
name="metadata",
field=models.JSONField(
blank=True, default=dict, null=True, verbose_name="metadata"
),
),
migrations.AlterField(
model_name="item",
name="primary_lookup_id_type",
field=models.CharField(
max_length=50, null=True, verbose_name="Primary ID Type"
),
),
migrations.AlterField(
model_name="item",
name="primary_lookup_id_value",
field=models.CharField(
help_text="automatically detected, usually no change necessary, left empty if unsure",
max_length=1000,
null=True,
verbose_name="Primary ID Value",
),
),
migrations.AlterField(
model_name="item",
name="title",
field=models.CharField(default="", max_length=1000, verbose_name="title"),
),
migrations.AlterField(
model_name="itemlookupid",
name="id_type",
@ -148,11 +106,57 @@ class Migration(migrations.Migration):
("apple_podcast", "Apple Podcast"),
("apple_music", "Apple Music"),
("fedi", "Fediverse"),
("qidian", "Qidian"),
("ypshuo", "Ypshuo"),
],
max_length=50,
verbose_name="source site",
),
),
migrations.AlterField(
model_name="item",
name="brief",
field=models.TextField(blank=True, default="", verbose_name="description"),
),
migrations.AlterField(
model_name="item",
name="cover",
field=models.ImageField(
blank=True,
default="item/default.svg",
upload_to=catalog.common.utils.item_cover_path,
verbose_name="cover",
),
),
migrations.AlterField(
model_name="item",
name="metadata",
field=models.JSONField(
blank=True, default=dict, null=True, verbose_name="metadata"
),
),
migrations.AlterField(
model_name="item",
name="primary_lookup_id_type",
field=models.CharField(
max_length=50, null=True, verbose_name="Primary ID Type"
),
),
migrations.AlterField(
model_name="item",
name="primary_lookup_id_value",
field=models.CharField(
help_text="automatically detected, usually no change necessary, left empty if unsure",
max_length=1000,
null=True,
verbose_name="Primary ID Value",
),
),
migrations.AlterField(
model_name="item",
name="title",
field=models.CharField(default="", max_length=1000, verbose_name="title"),
),
migrations.AlterField(
model_name="itemlookupid",
name="id_value",

View file

@ -34,15 +34,15 @@ class Bandcamp(AbstractSite):
hostname = parsed_url.netloc
try:
answers = dns.resolver.query(hostname, "CNAME")
for rdata in answers: # type:ignore
if str(rdata.target) == "dom.bandcamp.com.":
for rdata in answers:
if str(rdata.target) == "dom.bandcamp.com.": # type:ignore
return True
except Exception:
pass
try:
answers = dns.resolver.query(hostname, "A")
for rdata in answers: # type:ignore
if str(rdata.address) == "35.241.62.186":
for rdata in answers:
if str(rdata.address) == "35.241.62.186": # type:ignore
return True
except Exception:
pass

View file

@ -77,7 +77,7 @@ class Bangumi(AbstractSite):
case "别名":
other_title = (
[d["v"] for d in v]
if type(v) == list
if isinstance(v, list)
else ([v] if isinstance(v, str) else [])
)
case "imdb_id":
@ -93,13 +93,13 @@ class Bangumi(AbstractSite):
case "作者":
authors = (
[d["v"] for d in v]
if type(v) == list
if isinstance(v, list)
else ([v] if isinstance(v, str) else [])
)
case "平台":
platform = (
[d["v"] for d in v]
if type(v) == list
if isinstance(v, list)
else ([v] if isinstance(v, str) else [])
)
case "游戏类型":
@ -109,7 +109,7 @@ class Bangumi(AbstractSite):
else ([v] if isinstance(v, str) else [])
)
case "官方网站" | "website":
site = v[0] if type(v) == list else v
site = v[0] if isinstance(v, list) else v
img_url = o["images"].get("large") or o["images"].get("common")
raw_img = None

View file

@ -16,12 +16,12 @@ _logger = logging.getLogger(__name__)
def _get_preferred_languages():
langs = {}
for l in PREFERRED_LANGUAGES:
if l == "zh":
for la in PREFERRED_LANGUAGES:
if la == "zh":
langs.update({"zh-cn": "zh-CN", "zh-tw": "zh-TW"})
# zh-HK data is not good
else:
langs[l] = l
langs[la] = la
return langs

View file

@ -5,77 +5,83 @@ description = "🧩 self-hosted server tracking what you read/watch/listen/play,
readme = "README.md"
requires-python = ">= 3.12"
dependencies = [
"blurhash-python",
"cachetools",
"dateparser",
"discord.py",
"blurhash-python>=1.2.2",
"cachetools>=5.5.0",
"dateparser>=1.2.0",
"django<5.0",
"django-anymail",
"django-anymail>=12.0",
"django-auditlog>=3.0.0",
"django-bleach",
"django-bleach>=3.1.0",
"django-compressor",
"django-cors-headers",
"django-environ",
"django-hijack>=3.5.4",
"django-jsonform",
"django-environ>=0.11.2",
"django-hijack>=3.7.0",
"django-jsonform>=2.23.1",
"django-maintenance-mode",
"django-markdownx",
"django-ninja>=1.2.2",
"django-oauth-toolkit==2.3.0",
"django-markdownx>=4.0.7",
"django-ninja>=1.3.0",
"django-polymorphic @ git+https://github.com/jazzband/django-polymorphic/@v4.0.0a",
"django-redis",
"django-rq",
"django-sass-processor",
"django-simple-history ",
"django-slack",
"django-tz-detect",
"django-user-messages",
"dnspython",
"easy-thumbnails",
"filetype",
"gunicorn",
"httpx",
"igdb-api-v4",
"langdetect",
"libsass",
"listparser",
"loguru",
"lxml",
"markdownify",
"mistune",
"openpyxl",
"podcastparser",
"django-redis>=5.4.0",
"django-rq>=2.10.2",
"django-sass-processor>=1.4.1",
"django-tz-detect>=0.5.0",
"django-user-messages>=1.1.0",
"dnspython>=2.7.0",
"easy-thumbnails>=2.10",
"filetype>=1.2.0",
"gunicorn>=23.0.0",
"httpx>=0.27.2",
"igdb-api-v4>=0.3.3",
"langdetect>=1.0.9",
"listparser>=0.20",
"loguru>=0.7.2",
"lxml>=5.3.0",
"markdownify>=0.13.1",
"mistune>=3.0.2",
"openpyxl>=3.1.5",
"podcastparser>=0.6.10",
"psycopg2-binary",
"requests",
"rq",
"sentry-sdk",
"setproctitle",
"tqdm",
"typesense",
"urlman",
"validators",
"requests>=2.32.3",
"sentry-sdk>=2.17.0",
"setproctitle>=1.3.3",
"tqdm>=4.66.6",
"typesense>=0.21.0",
"urlman>=2.0.2",
"validators>=0.34.0",
"deepmerge>=1.1.1",
"django-typed-models @ git+https://github.com/alphatownsman/django-typed-models.git",
"atproto>=0.0.49",
"atproto>=0.0.55",
"discord-py>=2.4.0",
]
[tool.rye]
managed = true
virtual = true
dev-dependencies = [
"pre-commit>=3.7.0",
"pre-commit>=4.0.1",
"black~=24.4.2",
"django-stubs>=5.1.0",
"djlint~=1.34.1",
"djlint>=1.35.2",
"isort~=5.13.2",
"lxml-stubs>=0.5.1",
"pyright>=1.1.384",
"ruff",
"mkdocs-material>=9.5.25",
"pyright>=1.1.386",
"ruff>=0.7.1",
"mkdocs-material>=9.5.42",
]
[tool.pyright]
exclude = [ "media", ".venv", ".git", "playground", "catalog/*/tests.py", "journal/tests.py", "neodb", "**/migrations", "**/sites/douban_*", "neodb-takahe" ]
exclude = [
"media",
".venv",
".git",
"playground",
"catalog/*/tests.py",
"journal/tests.py",
"neodb",
"**/migrations",
"**/sites/douban_*",
"neodb-takahe",
]
reportIncompatibleVariableOverride = false
[tool.djlint]
@ -86,14 +92,36 @@ indent=2
profile = "black"
[tool.mypy]
exclude = ['^neodb-takahe/', '^legacy/', '^media/', '^playground/', '^catalog/*/tests.py', '^journal/tests.py', '^neodb/', '.*migrations.*', '.*sites/douban_.*' ]
exclude = [
'^neodb-takahe/',
'^legacy/',
'^media/',
'^playground/',
'^catalog/*/tests.py',
'^journal/tests.py',
'^neodb/',
'.*migrations.*',
'.*sites/douban_.*',
]
plugins = ["mypy_django_plugin.main"]
[tool.django-stubs]
django_settings_module = "boofilsic.settings"
[tool.ruff]
exclude = ["neodb-takahe/*", "media", ".venv", ".git", "playground", "**/tests.py", "neodb", "**/migrations", "**/commands", "**/importers", "legacy" ]
exclude = [
"neodb-takahe/*",
"media",
".venv",
".git",
"playground",
"**/tests.py",
"neodb",
"**/migrations",
"**/commands",
"**/importers",
"legacy",
]
lint.ignore = ["F401", "F403", "F405"]
[tool.setuptools]

View file

@ -21,7 +21,7 @@ asgiref==3.8.1
# via django
# via django-cors-headers
# via django-stubs
atproto==0.0.49
atproto==0.0.55
attrs==23.2.0
# via aiohttp
babel==2.15.0
@ -32,7 +32,7 @@ black==24.4.2
bleach==5.0.1
# via django-bleach
blurhash-python==1.2.2
cachetools==5.3.3
cachetools==5.5.0
certifi==2024.6.2
# via httpcore
# via httpx
@ -56,12 +56,11 @@ colorama==0.4.6
# via mkdocs-material
cryptography==42.0.8
# via atproto
# via jwcrypto
cssbeautifier==1.15.1
# via djlint
dateparser==1.2.0
deepmerge==1.1.1
discord-py==2.3.2
discord-py==2.4.0
distlib==0.3.8
# via virtualenv
django==4.2.14
@ -74,17 +73,14 @@ django==4.2.14
# via django-jsonform
# via django-markdownx
# via django-ninja
# via django-oauth-toolkit
# via django-polymorphic
# via django-redis
# via django-rq
# via django-simple-history
# via django-slack
# via django-stubs
# via django-stubs-ext
# via django-tz-detect
# via easy-thumbnails
django-anymail==10.3
django-anymail==12.0
django-appconf==1.0.6
# via django-compressor
django-auditlog==3.0.0
@ -92,28 +88,25 @@ django-bleach==3.1.0
django-compressor==4.4
django-cors-headers==4.3.1
django-environ==0.11.2
django-hijack==3.5.4
django-jsonform==2.22.0
django-hijack==3.7.0
django-jsonform==2.23.1
django-maintenance-mode==0.21.1
django-markdownx==4.0.7
django-ninja==1.2.2
django-oauth-toolkit==2.3.0
django-ninja==1.3.0
django-polymorphic @ git+https://github.com/jazzband/django-polymorphic/@1039f882b99f97bf657bd958c949ee6a3b00377a
django-redis==5.4.0
django-rq==2.10.2
django-sass-processor==1.4.1
django-simple-history==3.7.0
django-slack==5.19.0
django-stubs==5.1.0
django-stubs-ext==5.1.0
# via django-stubs
django-typed-models @ git+https://github.com/alphatownsman/django-typed-models.git@03921e05b39d07d143519a435259f66387a088bc
django-tz-detect==0.5.0
django-user-messages==1.0.0
djlint==1.34.1
dnspython==2.6.1
django-user-messages==1.1.0
djlint==1.35.2
dnspython==2.7.0
# via atproto
easy-thumbnails==2.8.5
easy-thumbnails==2.10
editorconfig==0.12.4
# via cssbeautifier
# via jsbeautifier
@ -127,7 +120,7 @@ frozenlist==1.4.1
# via aiosignal
ghp-import==2.1.0
# via mkdocs
gunicorn==22.0.0
gunicorn==23.0.0
h11==0.14.0
# via httpcore
html-tag-names==0.1.2
@ -136,7 +129,7 @@ html-void-elements==0.1.0
# via djlint
httpcore==1.0.5
# via httpx
httpx==0.26.0
httpx==0.27.2
# via atproto
identify==2.5.36
# via pre-commit
@ -145,7 +138,7 @@ idna==3.7
# via httpx
# via requests
# via yarl
igdb-api-v4==0.3.2
igdb-api-v4==0.3.3
isort==5.13.2
jinja2==3.1.4
# via mkdocs
@ -155,22 +148,19 @@ jsbeautifier==1.15.1
# via djlint
json5==0.9.25
# via djlint
jwcrypto==1.5.6
# via django-oauth-toolkit
langdetect==1.0.9
libipld==1.2.3
libipld==3.0.0
# via atproto
libsass==0.23.0
listparser==0.20
loguru==0.7.2
lxml==5.2.2
lxml==5.3.0
lxml-stubs==0.5.1
markdown==3.6
# via django-markdownx
# via mkdocs
# via mkdocs-material
# via pymdown-extensions
markdownify==0.12.1
markdownify==0.13.1
markupsafe==2.1.5
# via jinja2
# via mkdocs
@ -182,7 +172,7 @@ mkdocs==1.6.0
# via mkdocs-material
mkdocs-get-deps==0.2.0
# via mkdocs
mkdocs-material==9.5.25
mkdocs-material==9.5.42
mkdocs-material-extensions==1.3.1
# via mkdocs-material
multidict==6.0.5
@ -193,9 +183,7 @@ mypy-extensions==1.0.0
nodeenv==1.9.1
# via pre-commit
# via pyright
oauthlib==3.2.2
# via django-oauth-toolkit
openpyxl==3.1.3
openpyxl==3.1.5
packaging==24.0
# via black
# via gunicorn
@ -215,7 +203,7 @@ platformdirs==4.2.2
# via mkdocs-get-deps
# via virtualenv
podcastparser==0.6.10
pre-commit==3.7.1
pre-commit==4.0.1
protobuf==5.27.0
# via igdb-api-v4
psycopg2-binary==2.9.9
@ -230,7 +218,7 @@ pygments==2.18.0
# via mkdocs-material
pymdown-extensions==10.8.1
# via mkdocs-material
pyright==1.1.384
pyright==1.1.386
python-dateutil==2.9.0.post0
# via dateparser
# via django-auditlog
@ -261,8 +249,6 @@ regex==2023.12.25
# via mkdocs-material
requests==2.32.3
# via django-anymail
# via django-oauth-toolkit
# via django-slack
# via igdb-api-v4
# via mkdocs-material
# via typesense
@ -270,8 +256,8 @@ rjsmin==1.2.1
# via django-compressor
rq==1.16.2
# via django-rq
ruff==0.4.7
sentry-sdk==2.4.0
ruff==0.7.1
sentry-sdk==2.17.0
setproctitle==1.3.3
six==1.16.0
# via bleach
@ -290,7 +276,7 @@ sqlparse==0.5.0
# via django
tinycss2==1.1.1
# via bleach
tqdm==4.66.4
tqdm==4.66.6
# via djlint
types-pyyaml==6.0.12.20240311
# via django-stubs
@ -299,7 +285,6 @@ typing-extensions==4.12.1
# via atproto
# via django-stubs
# via django-stubs-ext
# via jwcrypto
# via pydantic
# via pydantic-core
# via pyright
@ -310,7 +295,7 @@ urllib3==2.2.1
# via requests
# via sentry-sdk
urlman==2.0.2
validators==0.28.3
validators==0.34.0
virtualenv==20.26.2
# via pre-commit
watchdog==4.0.1

View file

@ -20,7 +20,7 @@ anyio==4.4.0
asgiref==3.8.1
# via django
# via django-cors-headers
atproto==0.0.49
atproto==0.0.55
attrs==23.2.0
# via aiohttp
beautifulsoup4==4.12.3
@ -28,7 +28,7 @@ beautifulsoup4==4.12.3
bleach==5.0.1
# via django-bleach
blurhash-python==1.2.2
cachetools==5.3.3
cachetools==5.5.0
certifi==2024.6.2
# via httpcore
# via httpx
@ -44,10 +44,9 @@ click==8.1.7
# via rq
cryptography==42.0.8
# via atproto
# via jwcrypto
dateparser==1.2.0
deepmerge==1.1.1
discord-py==2.3.2
discord-py==2.4.0
django==4.2.16
# via django-anymail
# via django-appconf
@ -58,15 +57,12 @@ django==4.2.16
# via django-jsonform
# via django-markdownx
# via django-ninja
# via django-oauth-toolkit
# via django-polymorphic
# via django-redis
# via django-rq
# via django-simple-history
# via django-slack
# via django-tz-detect
# via easy-thumbnails
django-anymail==10.3
django-anymail==12.0
django-appconf==1.0.6
# via django-compressor
django-auditlog==3.0.0
@ -74,62 +70,54 @@ django-bleach==3.1.0
django-compressor==4.4
django-cors-headers==4.3.1
django-environ==0.11.2
django-hijack==3.5.4
django-jsonform==2.22.0
django-hijack==3.7.0
django-jsonform==2.23.1
django-maintenance-mode==0.21.1
django-markdownx==4.0.7
django-ninja==1.2.2
django-oauth-toolkit==2.3.0
django-ninja==1.3.0
django-polymorphic @ git+https://github.com/jazzband/django-polymorphic/@1039f882b99f97bf657bd958c949ee6a3b00377a
django-redis==5.4.0
django-rq==2.10.2
django-sass-processor==1.4.1
django-simple-history==3.7.0
django-slack==5.19.0
django-typed-models @ git+https://github.com/alphatownsman/django-typed-models.git@03921e05b39d07d143519a435259f66387a088bc
django-tz-detect==0.5.0
django-user-messages==1.0.0
dnspython==2.6.1
django-user-messages==1.1.0
dnspython==2.7.0
# via atproto
easy-thumbnails==2.8.5
easy-thumbnails==2.10
et-xmlfile==1.1.0
# via openpyxl
filetype==1.2.0
frozenlist==1.4.1
# via aiohttp
# via aiosignal
gunicorn==22.0.0
gunicorn==23.0.0
h11==0.14.0
# via httpcore
httpcore==1.0.5
# via httpx
httpx==0.26.0
httpx==0.27.2
# via atproto
idna==3.7
# via anyio
# via httpx
# via requests
# via yarl
igdb-api-v4==0.3.2
jwcrypto==1.5.6
# via django-oauth-toolkit
igdb-api-v4==0.3.3
langdetect==1.0.9
libipld==1.2.3
libipld==3.0.0
# via atproto
libsass==0.23.0
listparser==0.20
loguru==0.7.2
lxml==5.2.2
lxml==5.3.0
markdown==3.6
# via django-markdownx
markdownify==0.12.1
markdownify==0.13.1
mistune==3.0.2
multidict==6.0.5
# via aiohttp
# via yarl
oauthlib==3.2.2
# via django-oauth-toolkit
openpyxl==3.1.3
openpyxl==3.1.5
packaging==24.0
# via gunicorn
pillow==10.3.0
@ -165,15 +153,13 @@ regex==2024.5.15
# via dateparser
requests==2.32.3
# via django-anymail
# via django-oauth-toolkit
# via django-slack
# via igdb-api-v4
# via typesense
rjsmin==1.2.1
# via django-compressor
rq==1.16.2
# via django-rq
sentry-sdk==2.4.0
sentry-sdk==2.17.0
setproctitle==1.3.3
six==1.16.0
# via bleach
@ -190,11 +176,10 @@ sqlparse==0.5.0
# via django
tinycss2==1.1.1
# via bleach
tqdm==4.66.4
tqdm==4.66.6
typesense==0.21.0
typing-extensions==4.12.1
# via atproto
# via jwcrypto
# via pydantic
# via pydantic-core
tzlocal==5.2
@ -204,7 +189,7 @@ urllib3==2.2.1
# via requests
# via sentry-sdk
urlman==2.0.2
validators==0.28.3
validators==0.34.0
webencodings==0.5.1
# via bleach
# via tinycss2