Multi-platform: support multiple files per version #201
@ -17,7 +17,7 @@ urlpatterns = [
|
|||||||
# API
|
# API
|
||||||
path('api/v1/extensions/', api.ExtensionsAPIView.as_view(), name='api'),
|
path('api/v1/extensions/', api.ExtensionsAPIView.as_view(), name='api'),
|
||||||
path(
|
path(
|
||||||
'api/v1/extensions/<str:extension_id>/versions/new/',
|
'api/v1/extensions/<str:extension_id>/versions/upload/',
|
||||||
api.UploadExtensionVersionView.as_view(),
|
api.UploadExtensionVersionView.as_view(),
|
||||||
name='upload-extension-version',
|
name='upload-extension-version',
|
||||||
),
|
),
|
||||||
|
@ -12,7 +12,6 @@ from django.db import transaction
|
|||||||
from common.compare import is_in_version_range, version
|
from common.compare import is_in_version_range, version
|
||||||
from extensions.models import Extension, Platform
|
from extensions.models import Extension, Platform
|
||||||
from extensions.utils import clean_json_dictionary_from_optional_fields
|
from extensions.utils import clean_json_dictionary_from_optional_fields
|
||||||
from extensions.views.manage import NewVersionView
|
|
||||||
from files.forms import FileFormSkipAgreed
|
from files.forms import FileFormSkipAgreed
|
||||||
|
|
||||||
|
|
||||||
@ -201,11 +200,12 @@ class UploadExtensionVersionView(APIView):
|
|||||||
status=status.HTTP_403_FORBIDDEN,
|
status=status.HTTP_403_FORBIDDEN,
|
||||||
)
|
)
|
||||||
|
|
||||||
# Create a NewVersionView instance to handle file creation
|
form = FileFormSkipAgreed(
|
||||||
new_version_view = NewVersionView(request=request, extension=extension)
|
allow_existing_version=True,
|
||||||
|
data={},
|
||||||
# Pass the version_file to the form
|
extension=extension,
|
||||||
form = new_version_view.get_form(FileFormSkipAgreed)
|
request=request,
|
||||||
|
)
|
||||||
form.fields['source'].initial = version_file
|
form.fields['source'].initial = version_file
|
||||||
|
|
||||||
if not form.is_valid():
|
if not form.is_valid():
|
||||||
|
@ -301,7 +301,7 @@ class UploadVersionFileView(
|
|||||||
kwargs = super().get_form_kwargs()
|
kwargs = super().get_form_kwargs()
|
||||||
kwargs['request'] = self.request
|
kwargs['request'] = self.request
|
||||||
kwargs['extension'] = self.extension
|
kwargs['extension'] = self.extension
|
||||||
kwargs['version'] = self.version
|
kwargs['allow_existing_version'] = True
|
||||||
return kwargs
|
return kwargs
|
||||||
|
|
||||||
@transaction.atomic
|
@transaction.atomic
|
||||||
|
@ -74,9 +74,9 @@ class FileForm(forms.ModelForm):
|
|||||||
)
|
)
|
||||||
|
|
||||||
def __init__(self, *args, **kwargs):
|
def __init__(self, *args, **kwargs):
|
||||||
self.request = kwargs.pop('request')
|
self.allow_existing_version = kwargs.pop('allow_existing_version', None)
|
||||||
self.extension = kwargs.pop('extension', None)
|
self.extension = kwargs.pop('extension', None)
|
||||||
self.version = kwargs.pop('version', None)
|
self.request = kwargs.pop('request')
|
||||||
for field in self.base_fields:
|
for field in self.base_fields:
|
||||||
if field not in {'source', 'agreed_with_terms'}:
|
if field not in {'source', 'agreed_with_terms'}:
|
||||||
self.base_fields[field].required = False
|
self.base_fields[field].required = False
|
||||||
@ -166,7 +166,11 @@ class FileForm(forms.ModelForm):
|
|||||||
ManifestValidator(manifest)
|
ManifestValidator(manifest)
|
||||||
ExtensionIDManifestValidator(manifest, self.extension)
|
ExtensionIDManifestValidator(manifest, self.extension)
|
||||||
ExtensionNameManifestValidator(manifest, self.extension)
|
ExtensionNameManifestValidator(manifest, self.extension)
|
||||||
ExtensionVersionManifestValidator(manifest, self.extension, self.version)
|
ExtensionVersionManifestValidator(
|
||||||
|
manifest,
|
||||||
|
self.extension,
|
||||||
|
self.allow_existing_version,
|
||||||
|
)
|
||||||
|
|
||||||
self.cleaned_data['metadata'] = manifest
|
self.cleaned_data['metadata'] = manifest
|
||||||
self.cleaned_data['type'] = EXTENSION_SLUG_TYPES[manifest['type']]
|
self.cleaned_data['type'] = EXTENSION_SLUG_TYPES[manifest['type']]
|
||||||
|
@ -167,36 +167,35 @@ class ExtensionNameManifestValidator:
|
|||||||
class ExtensionVersionManifestValidator:
|
class ExtensionVersionManifestValidator:
|
||||||
"""Validates version."""
|
"""Validates version."""
|
||||||
|
|
||||||
def __init__(self, manifest, extension_to_be_updated, version_to_be_updated):
|
def __init__(self, manifest, extension_to_be_updated, allow_existing_version):
|
||||||
|
|
||||||
# If the extension wasn't created yet, any version is valid
|
# If the extension wasn't created yet, any version is valid
|
||||||
if not extension_to_be_updated:
|
if not extension_to_be_updated:
|
||||||
return
|
return
|
||||||
|
|
||||||
# check for duplicates in database
|
# check for duplicates in database
|
||||||
if not version_to_be_updated:
|
manifest_version = manifest.get('version')
|
||||||
version = manifest.get('version')
|
version = extension_to_be_updated.versions.filter(version=manifest_version).first()
|
||||||
if extension_to_be_updated.versions.filter(version=version).first():
|
if not version:
|
||||||
raise ValidationError(
|
|
||||||
{
|
|
||||||
'source': [
|
|
||||||
f'The version {escape(version)} was already uploaded for this '
|
|
||||||
f'extension ({extension_to_be_updated.name})'
|
|
||||||
],
|
|
||||||
},
|
|
||||||
code='invalid',
|
|
||||||
)
|
|
||||||
return
|
return
|
||||||
|
if not allow_existing_version:
|
||||||
|
raise ValidationError(
|
||||||
|
{
|
||||||
|
'source': [
|
||||||
|
f'The version {escape(manifest_version)} was already uploaded for this '
|
||||||
|
f'extension ({extension_to_be_updated.name})'
|
||||||
|
],
|
||||||
|
},
|
||||||
|
code='invalid',
|
||||||
|
)
|
||||||
|
|
||||||
# check for platforms
|
# check for platforms
|
||||||
if platforms := manifest.get('platforms', None):
|
if platforms := manifest.get('platforms', None):
|
||||||
available_platforms = version_to_be_updated.get_available_platforms()
|
available_platforms = version.get_available_platforms()
|
||||||
if diff := set(platforms) - available_platforms:
|
if diff := set(platforms) - available_platforms:
|
||||||
raise ValidationError(
|
raise ValidationError(
|
||||||
{
|
{
|
||||||
'source': [
|
'source': [f'{version} already has files for {", ".join(diff)}'],
|
||||||
f'{version_to_be_updated} already has files for {", ".join(diff)}'
|
|
||||||
],
|
|
||||||
},
|
},
|
||||||
code='invalid',
|
code='invalid',
|
||||||
)
|
)
|
||||||
|
Loading…
Reference in New Issue
Block a user