new file system updates

This commit is contained in:
vabene1111 2021-06-09 14:02:33 +02:00
parent d4e332456b
commit 061aefd233
12 changed files with 87 additions and 21 deletions

View File

@ -1,13 +1,12 @@
from decimal import Decimal
from gettext import gettext as _
from django.contrib.auth.models import User
from django.db.models import QuerySet
from django.db.models import QuerySet, Sum
from drf_writable_nested import (UniqueFieldsMixin,
WritableNestedModelSerializer)
from rest_framework import serializers
from rest_framework.exceptions import ValidationError, NotAuthenticated, NotFound, ParseError
from rest_framework.fields import ModelField
from rest_framework.serializers import BaseSerializer, Serializer
from rest_framework.exceptions import ValidationError, NotFound
from cookbook.models import (Comment, CookLog, Food, Ingredient, Keyword,
MealPlan, MealType, NutritionInformation, Recipe,
@ -105,11 +104,28 @@ class UserPreferenceSerializer(serializers.ModelSerializer):
class UserFileSerializer(serializers.ModelSerializer):
def check_file_limit(self, validated_data):
if self.context['request'].space.max_file_storage_mb == -1:
raise ValidationError(_('File uploads are not enabled for this Space.'))
try:
current_file_size_mb = UserFile.objects.filter(space=self.context['request'].space).aggregate(Sum('file_size_kb'))['file_size_kb__sum'] / 1000
except TypeError:
current_file_size_mb = 0
if (validated_data['file'].size / 1000 / 1000 + current_file_size_mb - 5) > self.context['request'].space.max_file_storage_mb != 0:
raise ValidationError(_('You have reached your file upload limit.'))
def create(self, validated_data):
self.check_file_limit(validated_data)
validated_data['created_by'] = self.context['request'].user
validated_data['space'] = self.context['request'].space
return super().create(validated_data)
def update(self, instance, validated_data):
self.check_file_limit(validated_data)
return super().update(instance, validated_data)
class Meta:
model = UserFile
fields = ('name', 'file', 'file_size_kb', 'id',)
@ -117,6 +133,20 @@ class UserFileSerializer(serializers.ModelSerializer):
extra_kwargs = {"file": {"required": False, }}
class UserFileViewSerializer(serializers.ModelSerializer):
def create(self, validated_data):
raise ValidationError('Cannot create File over this view')
def update(self, instance, validated_data):
return instance
class Meta:
model = UserFile
fields = ('name', 'file', 'id',)
read_only_fields = ('id', 'file')
class StorageSerializer(SpacedModelSerializer):
def create(self, validated_data):
@ -265,7 +295,7 @@ class StepSerializer(WritableNestedModelSerializer):
ingredients = IngredientSerializer(many=True)
ingredients_markdown = serializers.SerializerMethodField('get_ingredients_markdown')
ingredients_vue = serializers.SerializerMethodField('get_ingredients_vue')
file = UserFileSerializer(allow_null=True)
file = UserFileViewSerializer(allow_null=True)
def get_ingredients_vue(self, obj):
return obj.get_instruction_render()

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -598,9 +598,7 @@
this.sortSteps()
for (let s of this.recipe.steps) {
this.sortIngredients(s)
if (s.file !== null){
delete s.file.file //TODO stupid quick hack because I cant figure out how to fix the writable serializer right now
}
}
this.$http.put("{% url 'api:recipe-detail' recipe.pk %}", this.recipe,
{}).then((response) => {

View File

@ -495,6 +495,7 @@ class BookmarkletImportViewSet(viewsets.ModelViewSet):
return self.queryset.filter(space=self.request.space).all()
class UserFileViewSet(viewsets.ModelViewSet, StandardFilterMixin):
queryset = UserFile.objects
serializer_class = UserFileSerializer

View File

@ -29,6 +29,7 @@
<tr>
<th>{{ $t('Name') }}</th>
<th>{{ $t('Size') }} (MB)</th>
<th>{{ $t('Download') }}</th>
<th>{{ $t('Edit') }}</th>
</tr>
</thead>
@ -37,7 +38,9 @@
<td>{{ f.file_size_kb / 1000 }}</td>
<td><a :href="f.file" target="_blank" rel="noreferrer nofollow">{{ $t('Download') }}</a></td>
<td>
<file-editor @change="loadInitial()" :file_id="f.id"></file-editor>
</td>
</tr>
</table>

View File

@ -10,10 +10,26 @@
<template v-if="file!==undefined">
{{ $t('Name') }}
<b-input v-model="file.name"></b-input>
<br/>
{{ $t('File') }}
<b-form-file v-model="file.file"></b-form-file>
</template>
<br/>
<br/>
<template #modal-footer="">
<b-button size="sm" variant="success" @click="modalOk()">
{{ $t('Ok') }}
</b-button>
<b-button size="sm" variant="secondary" @click="$bvModal.hide('modal-file-editor'+file_id)">
{{ $t('Cancel') }}
</b-button>
<b-button size="sm" variant="danger" @click="deleteFile()">
{{ $t('Delete') }}
</b-button>
</template>
</b-modal>
</div>
</template>
@ -66,13 +82,12 @@ export default {
if (!(typeof this.file.file === 'string' || this.file.file instanceof String)) { // only update file if it was changed
passedFile = this.file.file
}
console.log(passedFile)
apiClient.updateUserFile(this.file.id, this.file.name, passedFile).then(request => {
makeToast(this.$t('Success'), this.$t('success_updating_resource'), 'success')
this.$emit('change',)
}).catch(err => {
makeToast(this.$t('Error'), this.$t('err_updating_resource'), 'danger')
makeToast(this.$t('Error'), this.$t('err_updating_resource') + '\n' + err.response.data, 'danger')
console.log(err.request, err.response)
})
},
@ -81,10 +96,24 @@ export default {
apiClient.createUserFile(this.file.name, this.file.file).then(request => {
makeToast(this.$t('Success'), this.$t('success_creating_resource'), 'success')
this.$emit('change',)
this.file = {
name: '',
file: undefined
}
}).catch(err => {
makeToast(this.$t('Error'), this.$t('err_creating_resource') + '\n' + err.response.data, 'danger')
console.log(err.request, err.response)
})
},
deleteFile: function () {
let apiClient = new ApiApiFactory()
apiClient.destroyUserFile(this.file.id).then(results => {
makeToast(this.$t('Success'), this.$t('success_deleting_resource'), 'success')
this.$emit('change',)
}).catch(err => {
makeToast(this.$t('Error'), this.$t('err_creating_resource'), 'danger')
makeToast(this.$t('Error'), this.$t('err_deleting_resource') + '\n' + err.response.data, 'danger')
console.log(err.request, err.response)
})
}

View File

@ -2,9 +2,11 @@
"err_fetching_resource": "There was an error fetching a resource!",
"err_creating_resource": "There was an error creating a resource!",
"err_updating_resource": "There was an error updating a resource!",
"err_deleting_resource": "There was an error deleting a resource!",
"success_fetching_resource": "Successfully fetched a resource!",
"success_creating_resource": "Successfully created a resource!",
"success_updating_resource": "Successfully updated a resource!",
"success_deleting_resource": "Successfully deleted a resource!",
"import_running": "Import running, please wait!",
"all_fields_optional": "All fields are optional and can be left empty.",
@ -60,7 +62,10 @@
"Files": "Files",
"File": "File",
"Edit": "Edit",
"Cancel": "Cancel",
"Delete": "Delete",
"Open": "Open",
"Ok": "Open",
"Save": "Save",
"Step": "Step",
"Search": "Search",