mirror of
https://github.com/TandoorRecipes/recipes.git
synced 2026-01-08 23:58:15 -05:00
fixed file upload
This commit is contained in:
@@ -37,7 +37,7 @@ def get_filetype(name):
|
|||||||
|
|
||||||
def is_file_type_allowed(filename, image_only=False):
|
def is_file_type_allowed(filename, image_only=False):
|
||||||
is_file_allowed = False
|
is_file_allowed = False
|
||||||
allowed_file_types = ['.pdf', '.docx', '.xlsx']
|
allowed_file_types = ['.pdf', '.docx', '.xlsx', '.css']
|
||||||
allowed_image_types = ['.png', '.jpg', '.jpeg', '.gif', '.webp']
|
allowed_image_types = ['.png', '.jpg', '.jpeg', '.gif', '.webp']
|
||||||
check_list = allowed_image_types
|
check_list = allowed_image_types
|
||||||
if not image_only:
|
if not image_only:
|
||||||
|
|||||||
@@ -268,19 +268,24 @@ class UserFileSerializer(serializers.ModelSerializer):
|
|||||||
> self.context['request'].space.max_file_storage_mb != 0):
|
> self.context['request'].space.max_file_storage_mb != 0):
|
||||||
raise ValidationError(_('You have reached your file upload limit.'))
|
raise ValidationError(_('You have reached your file upload limit.'))
|
||||||
|
|
||||||
def create(self, validated_data):
|
def check_file_type(self, validated_data):
|
||||||
if not is_file_type_allowed(validated_data['file'].name):
|
print('checking file type')
|
||||||
return None
|
if 'file' in validated_data:
|
||||||
|
print('filke present in data')
|
||||||
|
if not is_file_type_allowed(validated_data['file'].name, image_only=False):
|
||||||
|
print('is not allowed')
|
||||||
|
raise ValidationError(_('The given file type is not allowed.'))
|
||||||
|
|
||||||
|
def create(self, validated_data):
|
||||||
self.check_file_limit(validated_data)
|
self.check_file_limit(validated_data)
|
||||||
|
self.check_file_type(validated_data)
|
||||||
validated_data['created_by'] = self.context['request'].user
|
validated_data['created_by'] = self.context['request'].user
|
||||||
validated_data['space'] = self.context['request'].space
|
validated_data['space'] = self.context['request'].space
|
||||||
return super().create(validated_data)
|
return super().create(validated_data)
|
||||||
|
|
||||||
def update(self, instance, validated_data):
|
def update(self, instance, validated_data):
|
||||||
if not is_file_type_allowed(validated_data['file'].name):
|
|
||||||
return None
|
|
||||||
self.check_file_limit(validated_data)
|
self.check_file_limit(validated_data)
|
||||||
|
self.check_file_type(validated_data)
|
||||||
return super().update(instance, validated_data)
|
return super().update(instance, validated_data)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
|
|||||||
@@ -79,11 +79,20 @@ onMounted(() => {
|
|||||||
* save file to database via fileApi composable
|
* save file to database via fileApi composable
|
||||||
*/
|
*/
|
||||||
function saveFile() {
|
function saveFile() {
|
||||||
|
loading.value = true
|
||||||
|
|
||||||
|
let event: ("create" | "save") = isUpdate() ? 'save' : 'create'
|
||||||
|
|
||||||
createOrUpdateUserFile(editingObj.value.name, file.value, editingObj.value.id).then(r => {
|
createOrUpdateUserFile(editingObj.value.name, file.value, editingObj.value.id).then(r => {
|
||||||
editingObj.value = r
|
editingObj.value = r
|
||||||
|
editingObjChanged.value = false
|
||||||
|
emit(event, r)
|
||||||
useMessageStore().addPreparedMessage(PreparedMessage.UPDATE_SUCCESS)
|
useMessageStore().addPreparedMessage(PreparedMessage.UPDATE_SUCCESS)
|
||||||
}).catch(err => {
|
}).catch(err => {
|
||||||
useMessageStore().addError(ErrorMessageType.UPDATE_ERROR, err)
|
useMessageStore().addError(ErrorMessageType.UPDATE_ERROR, err)
|
||||||
|
}).finally(() => {
|
||||||
|
editingObjChanged.value = false
|
||||||
|
loading.value = false
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import {useDjangoUrls} from "@/composables/useDjangoUrls";
|
import {useDjangoUrls} from "@/composables/useDjangoUrls";
|
||||||
import {ref} from "vue";
|
import {ref} from "vue";
|
||||||
import {getCookie} from "@/utils/cookie";
|
import {getCookie} from "@/utils/cookie";
|
||||||
import {RecipeFromSourceResponseFromJSON, RecipeImageFromJSON, UserFile, UserFileFromJSON} from "@/openapi";
|
import {RecipeFromSourceResponseFromJSON, RecipeImageFromJSON, ResponseError, UserFile, UserFileFromJSON} from "@/openapi";
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -40,9 +40,13 @@ export function useFileApi() {
|
|||||||
headers: {'X-CSRFToken': getCookie('csrftoken')},
|
headers: {'X-CSRFToken': getCookie('csrftoken')},
|
||||||
body: formData
|
body: formData
|
||||||
}).then(r => {
|
}).then(r => {
|
||||||
|
if (r.ok) {
|
||||||
return r.json().then(r => {
|
return r.json().then(r => {
|
||||||
return UserFileFromJSON(r)
|
return UserFileFromJSON(r)
|
||||||
})
|
})
|
||||||
|
} else {
|
||||||
|
throw new ResponseError(r)
|
||||||
|
}
|
||||||
}).finally(() => {
|
}).finally(() => {
|
||||||
fileApiLoading.value = false
|
fileApiLoading.value = false
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -21,7 +21,9 @@
|
|||||||
<v-btn class="float-right" icon="$create" color="create" v-if="!genericModel.model.disableCreate">
|
<v-btn class="float-right" icon="$create" color="create" v-if="!genericModel.model.disableCreate">
|
||||||
<i class="fa-solid fa-plus"></i>
|
<i class="fa-solid fa-plus"></i>
|
||||||
<model-edit-dialog :close-after-create="false" :model="model"
|
<model-edit-dialog :close-after-create="false" :model="model"
|
||||||
@create="loadItems({page: tablePage, itemsPerPage: useUserPreferenceStore().deviceSettings.general_tableItemsPerPage, search: searchQuery})"></model-edit-dialog>
|
@create="loadItems({page: tablePage, itemsPerPage: useUserPreferenceStore().deviceSettings.general_tableItemsPerPage, search: searchQuery})"
|
||||||
|
@save="loadItems({page: tablePage, itemsPerPage: useUserPreferenceStore().deviceSettings.general_tableItemsPerPage, search: searchQuery})"
|
||||||
|
@delete="loadItems({page: tablePage, itemsPerPage: useUserPreferenceStore().deviceSettings.general_tableItemsPerPage, search: searchQuery})"></model-edit-dialog>
|
||||||
</v-btn>
|
</v-btn>
|
||||||
</template>
|
</template>
|
||||||
<v-card-actions v-if="genericModel.model.name == 'RecipeImport'">
|
<v-card-actions v-if="genericModel.model.name == 'RecipeImport'">
|
||||||
@@ -51,7 +53,8 @@
|
|||||||
<v-icon icon="$menu"></v-icon>
|
<v-icon icon="$menu"></v-icon>
|
||||||
<v-menu activator="parent" close-on-content-click>
|
<v-menu activator="parent" close-on-content-click>
|
||||||
<v-list density="compact">
|
<v-list density="compact">
|
||||||
<v-list-item prepend-icon="$edit" :to="{name: 'ModelEditPage', params: {model: model, id: item.id}}" v-if="!genericModel.model.disableCreate && !genericModel.model.disableUpdate && !genericModel.model.disableDelete" >
|
<v-list-item prepend-icon="$edit" :to="{name: 'ModelEditPage', params: {model: model, id: item.id}}"
|
||||||
|
v-if="!genericModel.model.disableCreate && !genericModel.model.disableUpdate && !genericModel.model.disableDelete">
|
||||||
{{ $t('Edit') }}
|
{{ $t('Edit') }}
|
||||||
</v-list-item>
|
</v-list-item>
|
||||||
<v-list-item prepend-icon="fa-solid fa-arrows-to-dot" v-if="genericModel.model.isMerge" link>
|
<v-list-item prepend-icon="fa-solid fa-arrows-to-dot" v-if="genericModel.model.isMerge" link>
|
||||||
|
|||||||
Reference in New Issue
Block a user