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">
<option name="languageLevel" value="ES6" />
</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">
<option name="shown" value="true" />
</component>

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

@ -2,6 +2,17 @@
## [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
### Changed

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

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

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

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

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

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

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

@ -9,7 +9,7 @@ from django.forms import (
TextInput,
)
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

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

@ -1,6 +1,6 @@
from django.conf import settings
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.utils.context import switch_language
@ -35,7 +35,7 @@ class Command(BaseCommand):
if obj.has_translation(language_code):
obj.delete_translation(language_code)
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):
setattr(obj, field, translation)
obj.save()

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

@ -24,7 +24,7 @@ from django.db.models import (
from django.db.models.signals import post_delete
from django.dispatch import receiver
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 TranslatableModel, TranslatedFields
from semantic_version import Spec, Version

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

@ -1,5 +1,5 @@
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()

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

@ -1,5 +1,5 @@
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):

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

@ -17,7 +17,7 @@ from django.forms import (
from django.forms.fields import CharField, ChoiceField, EmailField, HiddenInput
from django.utils.functional import lazy
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.models import App, Category, Screenshot

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

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

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

@ -8,7 +8,7 @@ from captcha.fields import CaptchaField
from django import forms
from django.contrib.auth import get_user_model
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):

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

@ -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.user.views import (
@ -14,18 +14,18 @@ from nextcloudappstore.user.views import (
app_name = "user"
urlpatterns = [
url(r"^$", AccountView.as_view(), name="account"),
url(r"^integrations/?$", IntegrationsView.as_view(), name="account-integrations"),
url(r"^integrations/(?P<pk>[a-z0-9_]+)/?$", IntegrationScaffoldingView.as_view(), name="account-integration"),
url(
path("", AccountView.as_view(), name="account"),
re_path(r"^integrations/?$", IntegrationsView.as_view(), name="account-integrations"),
re_path(r"^integrations/(?P<pk>[a-z0-9_]+)/?$", IntegrationScaffoldingView.as_view(), name="account-integration"),
re_path(
r"^integrations/(?P<pk>[a-z0-9_]+)/moderate/?$",
IntegrationScaffoldingView.as_view(),
name="account-integration-moderate",
),
url(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"),
url(r"^password/?$", PasswordView.as_view(), name="account-password"),
url(r"^token/?$", APITokenView.as_view(), name="account-api-token"),
url(r"^delete/?$", DeleteAccountView.as_view(), name="account-deletion"),
url(r"^change-language/?$", ChangeLanguageView.as_view(), name="account-change-language"),
re_path(r"^transfer-apps/?$", TransferAppsView.as_view(), name="account-transfer-apps"),
re_path(r"^transfer-apps/(?P<pk>[a-z0-9_]+)/?$", TransferAppsView.as_view(), name="account-transfer-app"),
re_path(r"^password/?$", PasswordView.as_view(), name="account-password"),
re_path(r"^token/?$", APITokenView.as_view(), name="account-api-token"),
re_path(r"^delete/?$", DeleteAccountView.as_view(), name="account-deletion"),
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]]
name = "alabaster"
@ -389,19 +389,19 @@ files = [
[[package]]
name = "django"
version = "3.2.20"
description = "A high-level Python Web framework that encourages rapid development and clean, pragmatic design."
version = "4.2.5"
description = "A high-level Python web framework that encourages rapid development and clean, pragmatic design."
optional = false
python-versions = ">=3.6"
python-versions = ">=3.8"
files = [
{file = "Django-3.2.20-py3-none-any.whl", hash = "sha256:a477ab326ae7d8807dc25c186b951ab8c7648a3a23f9497763c37307a2b5ef87"},
{file = "Django-3.2.20.tar.gz", hash = "sha256:dec2a116787b8e14962014bf78e120bba454135108e1af9e9b91ade7b2964c40"},
{file = "Django-4.2.5-py3-none-any.whl", hash = "sha256:b6b2b5cae821077f137dc4dade696a1c2aa292f892eca28fa8d7bfdf2608ddd4"},
{file = "Django-4.2.5.tar.gz", hash = "sha256:5e5c1c9548ffb7796b4a8a4782e9a2e5a3df3615259fc1bfd3ebc73b646146c1"},
]
[package.dependencies]
asgiref = ">=3.3.2,<4"
pytz = "*"
sqlparse = ">=0.2.2"
asgiref = ">=3.6.0,<4"
sqlparse = ">=0.3.1"
tzdata = {version = "*", markers = "sys_platform == \"win32\""}
[package.extras]
argon2 = ["argon2-cffi (>=19.1.0)"]
@ -439,16 +439,19 @@ files = [
Django = ">=2.2"
[[package]]
name = "django-cors-middleware"
version = "1.5.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."
name = "django-cors-headers"
version = "4.2.0"
description = "django-cors-headers is a Django application for handling the server headers required for Cross-Origin Resource Sharing (CORS)."
optional = false
python-versions = "*"
python-versions = ">=3.8"
files = [
{file = "django-cors-middleware-1.5.0.tar.gz", hash = "sha256:856dbe4d7aae65844ccc68acb49c6da7dbf7cbacaf5bcf37019f4c0c60b3be84"},
{file = "django_cors_middleware-1.5.0-py3-none-any.whl", hash = "sha256:5bbdea85e22909d596e26f6e0dbc174d5521429fa3943ae02a2c6c48e76c88c7"},
{file = "django_cors_headers-4.2.0-py3-none-any.whl", hash = "sha256:9ada212b0e2efd4a5e339360ffc869cb21ac5605e810afe69f7308e577ea5bde"},
{file = "django_cors_headers-4.2.0.tar.gz", hash = "sha256:f9749c6410fe738278bc2b6ef17f05195bc7b251693c035752d8257026af024f"},
]
[package.dependencies]
Django = ">=3.2"
[[package]]
name = "django-csp"
version = "3.7"
@ -1714,6 +1717,17 @@ files = [
{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]]
name = "urllib3"
version = "2.0.4"
@ -1787,4 +1801,4 @@ testing = ["big-O", "flake8 (<5)", "jaraco.functools", "jaraco.itertools", "more
[metadata]
lock-version = "2.0"
python-versions = "^3.9"
content-hash = "506ba4b73172f4917c86800e9157ff9b6c1e0a7e8e0dc1fc35e081183e749d0a"
content-hash = "813eb93631f308e3288bf4f59f3c1536ff3f0dff5bae088c4ad8e5005c75af74"

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

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