updated Django from 3.2 to 4.2.5, replaced non-supported django-cors-middleware package with django-cors-headers

Signed-off-by: Alexander Piskun <bigcat88@icloud.com>
This commit is contained in:
Alexander Piskun 2023-09-06 15:33:34 +03:00
Родитель 687262b8cd
Коммит ce70659c63
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 1F0BF0EC3CF22721
21 изменённых файлов: 125 добавлений и 82 удалений

17
.idea/dataSources.xml Normal file
Просмотреть файл

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="DataSourceManagerImpl" format="xml" multifile-model="true">
<data-source source="LOCAL" name="db" uuid="9942693d-1eec-4d21-9645-d0997498be97">
<driver-ref>sqlite.xerial</driver-ref>
<synchronize>true</synchronize>
<jdbc-driver>org.sqlite.JDBC</jdbc-driver>
<jdbc-url>jdbc:sqlite:$PROJECT_DIR$/db.sqlite3</jdbc-url>
<working-dir>$ProjectFileDir$</working-dir>
<libraries>
<library>
<url>file://$APPLICATION_CONFIG_DIR$/jdbc-drivers/Xerial SQLiteJDBC/3.40.1/org/xerial/sqlite-jdbc/3.40.1.0/sqlite-jdbc-3.40.1.0.jar</url>
</library>
</libraries>
</data-source>
</component>
</project>

Просмотреть файл

@ -3,7 +3,7 @@
<component name="JavaScriptSettings"> <component name="JavaScriptSettings">
<option name="languageLevel" value="ES6" /> <option name="languageLevel" value="ES6" />
</component> </component>
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.7 (appstore)" project-jdk-type="Python SDK" /> <component name="ProjectRootManager" version="2" project-jdk-name="Poetry (appstore)" project-jdk-type="Python SDK" />
<component name="PyCharmProfessionalAdvertiser"> <component name="PyCharmProfessionalAdvertiser">
<option name="shown" value="true" /> <option name="shown" value="true" />
</component> </component>

Просмотреть файл

@ -2,6 +2,17 @@
## [Unreleased] ## [Unreleased]
## [4.3.0] - 2023-09-07
### Changed
- Replaced `django-cors-middleware` package with `django-cors-headers`
- Updated Django from `3.2` to `4.2.5` version.
### Fixed
- Bug in REST API for deleting releases when APP_ID contains number. #1127
## [4.2.0] - 2023-07-18 ## [4.2.0] - 2023-07-18
### Changed ### Changed

Просмотреть файл

@ -7,7 +7,7 @@ manage-script=$(CURDIR)/manage.py
manage=$(poetry_run) $(manage-script) manage=$(poetry_run) $(manage-script)
db=sqlite db=sqlite
npm=npm npm=npm
prod_version=12.0.0 prod_version=27.0.0
.PHONY: test .PHONY: test
test: test:

Просмотреть файл

@ -13,8 +13,10 @@
</facet> </facet>
</component> </component>
<component name="NewModuleRootManager"> <component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$" /> <content url="file://$MODULE_DIR$">
<orderEntry type="jdk" jdkName="Python 3.7 (appstore)" jdkType="Python SDK" /> <excludeFolder url="file://$MODULE_DIR$/.venv" />
</content>
<orderEntry type="jdk" jdkName="Poetry (appstore)" jdkType="Python SDK" />
<orderEntry type="sourceFolder" forTests="false" /> <orderEntry type="sourceFolder" forTests="false" />
</component> </component>
<component name="PackageRequirementsSettings"> <component name="PackageRequirementsSettings">

Просмотреть файл

@ -10,7 +10,7 @@ Installing Packages
First you want to switch your machine to an up to date Node.js (16) and NPM (8) versions:: First you want to switch your machine to an up to date Node.js (16) and NPM (8) versions::
cd ~ cd ~
curl -sL https://deb.nodesource.com/setup_16.x | sudo bash - curl -sL https://deb.nodesource.com/setup_18.x | sudo bash -
sudo apt -y install nodejs -y sudo apt -y install nodejs -y

Просмотреть файл

@ -1,7 +1,7 @@
from django.conf.urls import include, url from django.urls import include, path
app_name = "api" app_name = "api"
urlpatterns = [ urlpatterns = [
url(r"^v1/", include("nextcloudappstore.api.v1.urls", namespace="v1")), path("v1/", include("nextcloudappstore.api.v1.urls", namespace="v1")),
] ]

Просмотреть файл

@ -1,4 +1,4 @@
from django.conf.urls import url from django.urls import re_path
from django.views.decorators.http import etag from django.views.decorators.http import etag
from nextcloudappstore.api.v1.views import ( from nextcloudappstore.api.v1.views import (
@ -24,19 +24,19 @@ from nextcloudappstore.core.versioning import SEMVER_REGEX
app_name = "v1" app_name = "v1"
urlpatterns = [ urlpatterns = [
url(r"^platforms\.json$", etag(nextcloud_release_etag)(NextcloudReleaseView.as_view()), name="platforms"), re_path(r"^platforms\.json$", etag(nextcloud_release_etag)(NextcloudReleaseView.as_view()), name="platforms"),
url(r"^platform/(?P<version>\d+\.\d+\.\d+)/apps\.json$", etag(apps_etag)(AppView.as_view()), name="app"), re_path(r"^platform/(?P<version>\d+\.\d+\.\d+)/apps\.json$", etag(apps_etag)(AppView.as_view()), name="app"),
url(r"^apps\.json$", etag(apps_all_etag)(AppsView.as_view()), name="apps"), re_path(r"^apps\.json$", etag(apps_all_etag)(AppsView.as_view()), name="apps"),
url(r"^apps/releases/?$", AppReleaseView.as_view(), name="app-release-create"), re_path(r"^apps/releases/?$", AppReleaseView.as_view(), name="app-release-create"),
url(r"^apps/?$", AppRegisterView.as_view(), name="app-register"), re_path(r"^apps/?$", AppRegisterView.as_view(), name="app-register"),
url(r"^apps/(?P<pk>[a-z0-9_]+)/?$", AppView.as_view(), name="app-delete"), re_path(r"^apps/(?P<pk>[a-z0-9_]+)/?$", AppView.as_view(), name="app-delete"),
url(r"^ratings.json$", etag(app_ratings_etag)(AppRatingView.as_view()), name="app-ratings"), re_path(r"^ratings.json$", etag(app_ratings_etag)(AppRatingView.as_view()), name="app-ratings"),
url( re_path(
r"^apps/(?P<app>[a-z0-9_]+)/releases/(?:(?P<nightly>nightly)/)?" r"(?P<version>" + SEMVER_REGEX + ")/?$", r"^apps/(?P<app>[a-z0-9_]+)/releases/(?:(?P<nightly>nightly)/)?" r"(?P<version>" + SEMVER_REGEX + ")/?$",
AppReleaseView.as_view(), AppReleaseView.as_view(),
name="app-release-delete", name="app-release-delete",
), ),
url(r"^token/?$", SessionObtainAuthToken.as_view(), name="user-token"), re_path(r"^token/?$", SessionObtainAuthToken.as_view(), name="user-token"),
url(r"^token/new/?$", RegenerateAuthToken.as_view(), name="user-token-new"), re_path(r"^token/new/?$", RegenerateAuthToken.as_view(), name="user-token-new"),
url(r"^categories.json$", etag(categories_etag)(CategoryView.as_view()), name="category"), re_path(r"^categories.json$", etag(categories_etag)(CategoryView.as_view()), name="category"),
] ]

Просмотреть файл

@ -3,7 +3,7 @@ from django.conf import settings
from django.contrib.syndication.views import Feed from django.contrib.syndication.views import Feed
from django.urls import reverse, reverse_lazy from django.urls import reverse, reverse_lazy
from django.utils.feedgenerator import Atom1Feed from django.utils.feedgenerator import Atom1Feed
from django.utils.translation import ugettext_lazy as _ # type: ignore from django.utils.translation import gettext_lazy as _ # type: ignore
from markdown import markdown from markdown import markdown
from parler.models import TranslationDoesNotExist from parler.models import TranslationDoesNotExist

Просмотреть файл

@ -9,7 +9,7 @@ from django.forms import (
TextInput, TextInput,
) )
from django.utils.translation import get_language_info from django.utils.translation import get_language_info
from django.utils.translation import ugettext_lazy as _ # type: ignore from django.utils.translation import gettext_lazy as _ # type: ignore
from nextcloudappstore.core.models import App, AppRating from nextcloudappstore.core.models import App, AppRating

Просмотреть файл

@ -1,6 +1,6 @@
from django.conf import settings from django.conf import settings
from django.core.management import BaseCommand, CommandError from django.core.management import BaseCommand, CommandError
from django.utils.translation import ugettext from django.utils.translation import gettext
from parler.models import TranslatableModel from parler.models import TranslatableModel
from parler.utils.context import switch_language from parler.utils.context import switch_language
@ -35,7 +35,7 @@ class Command(BaseCommand):
if obj.has_translation(language_code): if obj.has_translation(language_code):
obj.delete_translation(language_code) obj.delete_translation(language_code)
source = [self._get_en(obj, field) for field in fields] source = [self._get_en(obj, field) for field in fields]
translations = [ugettext(value) for value in source] translations = [gettext(value) for value in source]
for field, translation in zip(fields, translations): for field, translation in zip(fields, translations):
setattr(obj, field, translation) setattr(obj, field, translation)
obj.save() obj.save()

Просмотреть файл

@ -24,7 +24,7 @@ from django.db.models import (
from django.db.models.signals import post_delete from django.db.models.signals import post_delete
from django.dispatch import receiver from django.dispatch import receiver
from django.utils import timezone from django.utils import timezone
from django.utils.translation import ugettext_lazy as _ # type: ignore from django.utils.translation import gettext_lazy as _ # type: ignore
from parler.models import TranslatableManager # type: ignore from parler.models import TranslatableManager # type: ignore
from parler.models import TranslatableModel, TranslatedFields from parler.models import TranslatableModel, TranslatedFields
from semantic_version import Spec, Version from semantic_version import Spec, Version

Просмотреть файл

@ -1,5 +1,5 @@
from django import template from django import template
from django.utils.translation import ugettext_lazy as _ # type: ignore from django.utils.translation import gettext_lazy as _ # type: ignore
register = template.Library() register = template.Library()

Просмотреть файл

@ -1,5 +1,5 @@
from django.core.validators import URLValidator from django.core.validators import URLValidator
from django.utils.translation import ugettext_lazy as _ # type: ignore from django.utils.translation import gettext_lazy as _ # type: ignore
class HttpsUrlValidator(URLValidator): class HttpsUrlValidator(URLValidator):

Просмотреть файл

@ -17,7 +17,7 @@ from django.forms import (
from django.forms.fields import CharField, ChoiceField, EmailField, HiddenInput from django.forms.fields import CharField, ChoiceField, EmailField, HiddenInput
from django.utils.functional import lazy from django.utils.functional import lazy
from django.utils.text import slugify from django.utils.text import slugify
from django.utils.translation import ugettext_lazy as _ # type: ignore from django.utils.translation import gettext_lazy as _ # type: ignore
from nextcloudappstore.core.facades import resolve_file_relative_path from nextcloudappstore.core.facades import resolve_file_relative_path
from nextcloudappstore.core.models import App, Category, Screenshot from nextcloudappstore.core.models import App, Category, Screenshot

Просмотреть файл

@ -139,7 +139,7 @@ ACCOUNT_CONFIRM_EMAIL_ON_GET = True
ACCOUNT_SIGNUP_FORM_CLASS = "nextcloudappstore.user.forms.SignupFormRecaptcha" ACCOUNT_SIGNUP_FORM_CLASS = "nextcloudappstore.user.forms.SignupFormRecaptcha"
ACCOUNT_LOGIN_ON_EMAIL_CONFIRMATION = True ACCOUNT_LOGIN_ON_EMAIL_CONFIRMATION = True
ACCOUNT_LOGOUT_ON_PASSWORD_CHANGE = True ACCOUNT_LOGOUT_ON_PASSWORD_CHANGE = True
PASSWORD_RESET_TIMEOUT_DAYS = 1 PASSWORD_RESET_TIMEOUT = 1
ACCOUNT_FORMS = { ACCOUNT_FORMS = {
"login": "allauth.account.forms.LoginForm", "login": "allauth.account.forms.LoginForm",
"add_email": "allauth.account.forms.AddEmailForm", "add_email": "allauth.account.forms.AddEmailForm",

Просмотреть файл

@ -2,11 +2,10 @@ from allauth.account.views import signup
from allauth.socialaccount.views import signup as social_signup from allauth.socialaccount.views import signup as social_signup
from csp.decorators import csp_update from csp.decorators import csp_update
from django.conf import settings from django.conf import settings
from django.conf.urls import include, url
from django.conf.urls.i18n import i18n_patterns from django.conf.urls.i18n import i18n_patterns
from django.contrib import admin from django.contrib import admin
from django.contrib.auth.decorators import login_required from django.contrib.auth.decorators import login_required
from django.urls import path from django.urls import include, path, re_path
from django.views.decorators.http import etag from django.views.decorators.http import etag
from nextcloudappstore.core.caching import app_rating_etag from nextcloudappstore.core.caching import app_rating_etag
@ -28,30 +27,30 @@ from nextcloudappstore.scaffolding.views import (
admin.site.login = login_required(admin.site.login) admin.site.login = login_required(admin.site.login)
urlpatterns = [ urlpatterns = [
url(r"^$", CategoryAppListView.as_view(), {"id": None}, name="home"), path("", CategoryAppListView.as_view(), {"id": None}, name="home"),
url(r"^featured$", CategoryAppListView.as_view(), {"id": None, "is_featured_category": True}, name="featured"), path("featured", CategoryAppListView.as_view(), {"id": None, "is_featured_category": True}, name="featured"),
url(r"^signup/$", csp_update(**settings.CSP_SIGNUP)(signup), name="account_signup"), path("signup/", csp_update(**settings.CSP_SIGNUP)(signup), name="account_signup"),
url(r"^social/signup/$", csp_update(**settings.CSP_SIGNUP)(social_signup), name="socialaccount_signup"), path("social/signup/", csp_update(**settings.CSP_SIGNUP)(social_signup), name="socialaccount_signup"),
url(r"^", include("allauth.urls")), path("", include("allauth.urls")),
url(r"^categories/(?P<id>[\w]*)/?$", CategoryAppListView.as_view(), name="category-app-list"), re_path(r"^categories/(?P<id>[\w]*)/?$", CategoryAppListView.as_view(), name="category-app-list"),
url(r"^developer/apps/generate/?$", AppScaffoldingView.as_view(), name="app-scaffold"), re_path(r"^developer/apps/generate/?$", AppScaffoldingView.as_view(), name="app-scaffold"),
url(r"^developer/integration/new/?$", IntegrationScaffoldingView.as_view(), name="integration-scaffold"), re_path(r"^developer/integration/new/?$", IntegrationScaffoldingView.as_view(), name="integration-scaffold"),
url(r"^developer/apps/releases/new/?$", AppUploadView.as_view(), name="app-upload"), re_path(r"^developer/apps/releases/new/?$", AppUploadView.as_view(), name="app-upload"),
url(r"^developer/apps/new/?$", AppRegisterView.as_view(), name="app-register"), re_path(r"^developer/apps/new/?$", AppRegisterView.as_view(), name="app-register"),
url(r"^apps/(?P<id>[\w_]+)/?$", AppDetailView.as_view(), name="app-detail"), re_path(r"^apps/(?P<id>[\w_]+)/?$", AppDetailView.as_view(), name="app-detail"),
url(r"^apps/(?P<id>[\w_]+)/releases/?$", AppReleasesView.as_view(), name="app-releases"), re_path(r"^apps/(?P<id>[\w_]+)/releases/?$", AppReleasesView.as_view(), name="app-releases"),
url(r"^apps/(?P<id>[\w_]+)/description/?$", app_description, name="app-description"), re_path(r"^apps/(?P<id>[\w_]+)/description/?$", app_description, name="app-description"),
url(r"^apps/(?P<id>[\w_]+)/ratings.json$", etag(app_rating_etag)(AppRatingApi.as_view()), name="app-ratings"), re_path(r"^apps/(?P<id>[\w_]+)/ratings.json$", etag(app_rating_etag)(AppRatingApi.as_view()), name="app-ratings"),
url(r"^api/", include("nextcloudappstore.api.urls", namespace="api")), path("api/", include("nextcloudappstore.api.urls", namespace="api")),
url(r"^account/", include("nextcloudappstore.user.urls", namespace="user")), path("account/", include("nextcloudappstore.user.urls", namespace="user")),
url(r"^admin/", admin.site.urls), re_path(r"^admin/", admin.site.urls),
url(r"^i18n/", include("django.conf.urls.i18n")), path("i18n/", include("django.conf.urls.i18n")),
path("captcha/", include("captcha.urls")), path("captcha/", include("captcha.urls")),
] ]
urlpatterns += i18n_patterns( urlpatterns += i18n_patterns(
url(r"feeds/releases.rss", AppReleaseRssFeed(), name="feeds-releases-rss"), re_path(r"feeds/releases.rss", AppReleaseRssFeed(), name="feeds-releases-rss"),
url(r"feeds/releases.atom", AppReleaseAtomFeed(), name="feeds-releases-atom"), re_path(r"feeds/releases.atom", AppReleaseAtomFeed(), name="feeds-releases-atom"),
) )
if settings.DEBUG: if settings.DEBUG:
@ -59,7 +58,7 @@ if settings.DEBUG:
import debug_toolbar import debug_toolbar
urlpatterns += [ urlpatterns += [
url(r"^__debug__/", include(debug_toolbar.urls)), path("__debug__/", include(debug_toolbar.urls)),
] ]
except ImportError: except ImportError:
pass pass

Просмотреть файл

@ -8,7 +8,7 @@ from captcha.fields import CaptchaField
from django import forms from django import forms
from django.contrib.auth import get_user_model from django.contrib.auth import get_user_model
from django.forms import CharField, EmailField, PasswordInput from django.forms import CharField, EmailField, PasswordInput
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import gettext_lazy as _
class SignupFormRecaptcha(forms.Form): class SignupFormRecaptcha(forms.Form):

Просмотреть файл

@ -1,4 +1,4 @@
from django.conf.urls import url from django.urls import path, re_path
from nextcloudappstore.scaffolding.views import IntegrationScaffoldingView from nextcloudappstore.scaffolding.views import IntegrationScaffoldingView
from nextcloudappstore.user.views import ( from nextcloudappstore.user.views import (
@ -14,18 +14,18 @@ from nextcloudappstore.user.views import (
app_name = "user" app_name = "user"
urlpatterns = [ urlpatterns = [
url(r"^$", AccountView.as_view(), name="account"), path("", AccountView.as_view(), name="account"),
url(r"^integrations/?$", IntegrationsView.as_view(), name="account-integrations"), re_path(r"^integrations/?$", IntegrationsView.as_view(), name="account-integrations"),
url(r"^integrations/(?P<pk>[a-z0-9_]+)/?$", IntegrationScaffoldingView.as_view(), name="account-integration"), re_path(r"^integrations/(?P<pk>[a-z0-9_]+)/?$", IntegrationScaffoldingView.as_view(), name="account-integration"),
url( re_path(
r"^integrations/(?P<pk>[a-z0-9_]+)/moderate/?$", r"^integrations/(?P<pk>[a-z0-9_]+)/moderate/?$",
IntegrationScaffoldingView.as_view(), IntegrationScaffoldingView.as_view(),
name="account-integration-moderate", name="account-integration-moderate",
), ),
url(r"^transfer-apps/?$", TransferAppsView.as_view(), name="account-transfer-apps"), re_path(r"^transfer-apps/?$", TransferAppsView.as_view(), name="account-transfer-apps"),
url(r"^transfer-apps/(?P<pk>[a-z0-9_]+)/?$", TransferAppsView.as_view(), name="account-transfer-app"), re_path(r"^transfer-apps/(?P<pk>[a-z0-9_]+)/?$", TransferAppsView.as_view(), name="account-transfer-app"),
url(r"^password/?$", PasswordView.as_view(), name="account-password"), re_path(r"^password/?$", PasswordView.as_view(), name="account-password"),
url(r"^token/?$", APITokenView.as_view(), name="account-api-token"), re_path(r"^token/?$", APITokenView.as_view(), name="account-api-token"),
url(r"^delete/?$", DeleteAccountView.as_view(), name="account-deletion"), re_path(r"^delete/?$", DeleteAccountView.as_view(), name="account-deletion"),
url(r"^change-language/?$", ChangeLanguageView.as_view(), name="account-change-language"), re_path(r"^change-language/?$", ChangeLanguageView.as_view(), name="account-change-language"),
] ]

46
poetry.lock сгенерированный
Просмотреть файл

@ -1,4 +1,4 @@
# This file is automatically @generated by Poetry 1.6.1 and should not be changed by hand. # This file is automatically @generated by Poetry 1.5.1 and should not be changed by hand.
[[package]] [[package]]
name = "alabaster" name = "alabaster"
@ -389,19 +389,19 @@ files = [
[[package]] [[package]]
name = "django" name = "django"
version = "3.2.20" version = "4.2.5"
description = "A high-level Python Web framework that encourages rapid development and clean, pragmatic design." description = "A high-level Python web framework that encourages rapid development and clean, pragmatic design."
optional = false optional = false
python-versions = ">=3.6" python-versions = ">=3.8"
files = [ files = [
{file = "Django-3.2.20-py3-none-any.whl", hash = "sha256:a477ab326ae7d8807dc25c186b951ab8c7648a3a23f9497763c37307a2b5ef87"}, {file = "Django-4.2.5-py3-none-any.whl", hash = "sha256:b6b2b5cae821077f137dc4dade696a1c2aa292f892eca28fa8d7bfdf2608ddd4"},
{file = "Django-3.2.20.tar.gz", hash = "sha256:dec2a116787b8e14962014bf78e120bba454135108e1af9e9b91ade7b2964c40"}, {file = "Django-4.2.5.tar.gz", hash = "sha256:5e5c1c9548ffb7796b4a8a4782e9a2e5a3df3615259fc1bfd3ebc73b646146c1"},
] ]
[package.dependencies] [package.dependencies]
asgiref = ">=3.3.2,<4" asgiref = ">=3.6.0,<4"
pytz = "*" sqlparse = ">=0.3.1"
sqlparse = ">=0.2.2" tzdata = {version = "*", markers = "sys_platform == \"win32\""}
[package.extras] [package.extras]
argon2 = ["argon2-cffi (>=19.1.0)"] argon2 = ["argon2-cffi (>=19.1.0)"]
@ -439,16 +439,19 @@ files = [
Django = ">=2.2" Django = ">=2.2"
[[package]] [[package]]
name = "django-cors-middleware" name = "django-cors-headers"
version = "1.5.0" version = "4.2.0"
description = "django-cors-middleware is a Django application for handling the server headers required for Cross-Origin Resource Sharing (CORS). Fork of django-cors-headers." description = "django-cors-headers is a Django application for handling the server headers required for Cross-Origin Resource Sharing (CORS)."
optional = false optional = false
python-versions = "*" python-versions = ">=3.8"
files = [ files = [
{file = "django-cors-middleware-1.5.0.tar.gz", hash = "sha256:856dbe4d7aae65844ccc68acb49c6da7dbf7cbacaf5bcf37019f4c0c60b3be84"}, {file = "django_cors_headers-4.2.0-py3-none-any.whl", hash = "sha256:9ada212b0e2efd4a5e339360ffc869cb21ac5605e810afe69f7308e577ea5bde"},
{file = "django_cors_middleware-1.5.0-py3-none-any.whl", hash = "sha256:5bbdea85e22909d596e26f6e0dbc174d5521429fa3943ae02a2c6c48e76c88c7"}, {file = "django_cors_headers-4.2.0.tar.gz", hash = "sha256:f9749c6410fe738278bc2b6ef17f05195bc7b251693c035752d8257026af024f"},
] ]
[package.dependencies]
Django = ">=3.2"
[[package]] [[package]]
name = "django-csp" name = "django-csp"
version = "3.7" version = "3.7"
@ -1714,6 +1717,17 @@ files = [
{file = "typing_extensions-4.6.3.tar.gz", hash = "sha256:d91d5919357fe7f681a9f2b5b4cb2a5f1ef0a1e9f59c4d8ff0d3491e05c0ffd5"}, {file = "typing_extensions-4.6.3.tar.gz", hash = "sha256:d91d5919357fe7f681a9f2b5b4cb2a5f1ef0a1e9f59c4d8ff0d3491e05c0ffd5"},
] ]
[[package]]
name = "tzdata"
version = "2023.3"
description = "Provider of IANA time zone data"
optional = false
python-versions = ">=2"
files = [
{file = "tzdata-2023.3-py2.py3-none-any.whl", hash = "sha256:7e65763eef3120314099b6939b5546db7adce1e7d6f2e179e3df563c70511eda"},
{file = "tzdata-2023.3.tar.gz", hash = "sha256:11ef1e08e54acb0d4f95bdb1be05da659673de4acbd21bf9c69e94cc5e907a3a"},
]
[[package]] [[package]]
name = "urllib3" name = "urllib3"
version = "2.0.4" version = "2.0.4"
@ -1787,4 +1801,4 @@ testing = ["big-O", "flake8 (<5)", "jaraco.functools", "jaraco.itertools", "more
[metadata] [metadata]
lock-version = "2.0" lock-version = "2.0"
python-versions = "^3.9" python-versions = "^3.9"
content-hash = "506ba4b73172f4917c86800e9157ff9b6c1e0a7e8e0dc1fc35e081183e749d0a" content-hash = "813eb93631f308e3288bf4f59f3c1536ff3f0dff5bae088c4ad8e5005c75af74"

Просмотреть файл

@ -1,12 +1,12 @@
[tool.poetry] [tool.poetry]
name = "nextcloudappstore" name = "nextcloudappstore"
version = "4.2.0" version = "4.3.0"
description = "App store for Nextcloud apps" description = "App store for Nextcloud apps"
authors = ["Morris Jobke <hey@morrisjobke.de>"] authors = ["Morris Jobke <hey@morrisjobke.de>"]
[tool.poetry.dependencies] [tool.poetry.dependencies]
python = "^3.9" python = "^3.9"
Django = "~3.2" django = "~4.2.5"
django-braces = "~1.15.0" django-braces = "~1.15.0"
djangorestframework-camel-case = "^1.3.0" djangorestframework-camel-case = "^1.3.0"
django-parler-rest = "^2.1" django-parler-rest = "^2.1"
@ -14,7 +14,7 @@ django-parler = "^2.3"
django-allauth = "^0.54.0" django-allauth = "^0.54.0"
lxml = "^4.7.1" lxml = "^4.7.1"
requests = ">=2.31.0, <2.32.0" requests = ">=2.31.0, <2.32.0"
django-cors-middleware = "^1.5.0" django-cors-headers = "^4.2.0"
django-csp = "^3.7" django-csp = "^3.7"
pyOpenSSL = "^23.0.0" pyOpenSSL = "^23.0.0"
Markdown = "^3.3.6" Markdown = "^3.3.6"