Change model name

This commit is contained in:
Christian Cueni 2023-01-09 16:45:34 +01:00
parent 660c288f6f
commit 0d64f8fbb6
10 changed files with 51 additions and 35 deletions

View File

@ -83,9 +83,7 @@ function showFileInformation() {
<label class="block text-bold" for="upload"> <label class="block text-bold" for="upload">
{{ $t("circlePage.documents.fileLabel") }} {{ $t("circlePage.documents.fileLabel") }}
</label> </label>
<div <div class="mb-4 btn-secondary mt-4 text-xl relative cursor-pointer">
class="mb-4 btn-secondary mt-4 text-xl relative cursor-pointer"
>
<input @change="fileChange" id="upload" type="file" class="absolute opacity-0" /> <input @change="fileChange" id="upload" type="file" class="absolute opacity-0" />
{{ $t("circlePage.documents.modalAction") }} {{ $t("circlePage.documents.modalAction") }}
</div> </div>

View File

@ -11,6 +11,26 @@ There are buckets for each environment:
- myvbv-stage.iterativ.ch - myvbv-stage.iterativ.ch
- myvbv-prod.iterativ.ch - myvbv-prod.iterativ.ch
Add the following CORS configuration under bucket -> permissions
```
[
{
"AllowedHeaders": [
"*"
],
"AllowedMethods": [
"POST",
"GET"
],
"AllowedOrigins": [
"*"
],
"ExposeHeaders": []
}
]
```
## IAM Users ## IAM Users
In order to access the buckets a user is required. These users are created in In order to access the buckets a user is required. These users are created in

View File

@ -5,7 +5,6 @@ from django.db import migrations, models
class Migration(migrations.Migration): class Migration(migrations.Migration):
dependencies = [ dependencies = [
("files", "0001_initial"), ("files", "0001_initial"),
("learnpath", "0008_alter_learningcontent_contents"), ("learnpath", "0008_alter_learningcontent_contents"),
@ -37,7 +36,7 @@ class Migration(migrations.Migration):
( (
"file", "file",
models.OneToOneField( models.OneToOneField(
on_delete=django.db.models.deletion.CASCADE, to="files.file" on_delete=django.db.models.deletion.CASCADE, to="files.uploadfile"
), ),
), ),
( (

View File

@ -7,7 +7,7 @@ from wagtail.models import Page
from vbv_lernwelt.core.model_utils import find_available_slug from vbv_lernwelt.core.model_utils import find_available_slug
from vbv_lernwelt.core.models import User from vbv_lernwelt.core.models import User
from vbv_lernwelt.course.serializer_helpers import get_course_serializer_class from vbv_lernwelt.course.serializer_helpers import get_course_serializer_class
from vbv_lernwelt.files.models import File from vbv_lernwelt.files.models import UploadFile
class Course(models.Model): class Course(models.Model):
@ -241,7 +241,7 @@ class CourseSessionUser(models.Model):
class CircleDocument(models.Model): class CircleDocument(models.Model):
created_at = models.DateTimeField(auto_now_add=True) created_at = models.DateTimeField(auto_now_add=True)
file = models.OneToOneField(File, on_delete=models.CASCADE) file = models.OneToOneField(UploadFile, on_delete=models.CASCADE)
name = models.CharField(max_length=100) name = models.CharField(max_length=100)
course_session = models.ForeignKey("course.CourseSession", on_delete=models.CASCADE) course_session = models.ForeignKey("course.CourseSession", on_delete=models.CASCADE)

View File

@ -6,7 +6,7 @@ from vbv_lernwelt.core.models import User
from vbv_lernwelt.course.consts import COURSE_TEST_ID from vbv_lernwelt.course.consts import COURSE_TEST_ID
from vbv_lernwelt.course.creators.test_course import create_test_course from vbv_lernwelt.course.creators.test_course import create_test_course
from vbv_lernwelt.course.models import CircleDocument, CourseSession, CourseSessionUser from vbv_lernwelt.course.models import CircleDocument, CourseSession, CourseSessionUser
from vbv_lernwelt.files.models import File from vbv_lernwelt.files.models import UploadFile
from vbv_lernwelt.learnpath.models import Circle, LearningSequence from vbv_lernwelt.learnpath.models import Circle, LearningSequence
@ -66,7 +66,7 @@ class DocumentUploadApiTestCase(APITestCase):
) )
file_id = response.data["file_id"] file_id = response.data["file_id"]
file = File.objects.get(id=file_id) file = UploadFile.objects.get(id=file_id)
self.assertIsNone(file.upload_finished_at) self.assertIsNone(file.upload_finished_at)
@ -109,11 +109,11 @@ class DocumentUploadApiTestCase(APITestCase):
self.assertEqual(response.status_code, 200) self.assertEqual(response.status_code, 200)
self.assertNotEqual(response.data["url"], "") self.assertNotEqual(response.data["url"], "")
file = File.objects.get(id=file_id) file = UploadFile.objects.get(id=file_id)
self.assertIsNotNone(file.upload_finished_at) self.assertIsNotNone(file.upload_finished_at)
def test_can_only_finish_own_files(self): def test_can_only_finish_own_files(self):
file = File( file = UploadFile(
original_file_name="test.pdf", original_file_name="test.pdf",
file_name="test.pdf", file_name="test.pdf",
file_type="application/pdf", file_type="application/pdf",
@ -131,7 +131,7 @@ class DocumentUploadApiTestCase(APITestCase):
ls = LearningSequence.objects.get( ls = LearningSequence.objects.get(
slug="test-lehrgang-lp-circle-analyse-ls-beobachten" slug="test-lehrgang-lp-circle-analyse-ls-beobachten"
) )
file = File( file = UploadFile(
original_file_name="test.pdf", original_file_name="test.pdf",
file_name="test.pdf", file_name="test.pdf",
file_type="application/pdf", file_type="application/pdf",
@ -157,7 +157,7 @@ class DocumentUploadApiTestCase(APITestCase):
except CircleDocument.DoesNotExist: except CircleDocument.DoesNotExist:
pass pass
file = File.objects.get(id=file.id) file = UploadFile.objects.get(id=file.id)
self.assertIsNone(file.upload_finished_at) self.assertIsNone(file.upload_finished_at)
def test_student_cannot_delete_document(self): def test_student_cannot_delete_document(self):
@ -165,7 +165,7 @@ class DocumentUploadApiTestCase(APITestCase):
ls = LearningSequence.objects.get( ls = LearningSequence.objects.get(
slug="test-lehrgang-lp-circle-analyse-ls-beobachten" slug="test-lehrgang-lp-circle-analyse-ls-beobachten"
) )
file = File( file = UploadFile(
original_file_name="test.pdf", original_file_name="test.pdf",
file_name="test.pdf", file_name="test.pdf",
file_type="application/pdf", file_type="application/pdf",
@ -185,7 +185,6 @@ class DocumentUploadApiTestCase(APITestCase):
response = self.client.delete(f"/api/core/document/{document.id}/") response = self.client.delete(f"/api/core/document/{document.id}/")
self.assertEqual(response.status_code, 403) self.assertEqual(response.status_code, 403)
# expert cannot upload in other course # expert cannot upload in other course
# expert cannot delete other upload # expert cannot delete other upload
# exper cannot change course # exper cannot change course

View File

@ -23,7 +23,7 @@ from vbv_lernwelt.course.serializers import (
DocumentUploadStartInputSerializer, DocumentUploadStartInputSerializer,
) )
from vbv_lernwelt.course.services import mark_course_completion from vbv_lernwelt.course.services import mark_course_completion
from vbv_lernwelt.files.models import File from vbv_lernwelt.files.models import UploadFile
from vbv_lernwelt.files.services import FileDirectUploadService from vbv_lernwelt.files.services import FileDirectUploadService
from vbv_lernwelt.learnpath.utils import get_wagtail_type from vbv_lernwelt.learnpath.utils import get_wagtail_type
@ -148,11 +148,11 @@ def get_course_session_users(request, course_slug):
data = { data = {
"cockpit_user": cockpit_user_csu[0].to_dict() "cockpit_user": cockpit_user_csu[0].to_dict()
| { | {
"circles": cockpit_user_csu[0] "circles": cockpit_user_csu[0]
.expert.all() .expert.all()
.values("id", "title", "slug", "translation_key") .values("id", "title", "slug", "translation_key")
}, },
"users": user_data, "users": user_data,
} }
@ -200,7 +200,7 @@ def document_upload_finish(request):
serializer.is_valid(raise_exception=True) serializer.is_valid(raise_exception=True)
file_id = serializer.validated_data["file_id"] file_id = serializer.validated_data["file_id"]
file = get_object_or_404(File, id=file_id) file = get_object_or_404(UploadFile, id=file_id)
if file.uploaded_by != request.user: if file.uploaded_by != request.user:
raise PermissionDenied() raise PermissionDenied()
@ -213,7 +213,7 @@ def document_upload_finish(request):
@api_view(["POST"]) @api_view(["POST"])
def document_direct_upload(request, file_id): def document_direct_upload(request, file_id):
file = get_object_or_404(File, id=file_id) file = get_object_or_404(UploadFile, id=file_id)
file_obj = request.FILES["file"] file_obj = request.FILES["file"]

View File

@ -1,6 +1,6 @@
from django.core.management.base import BaseCommand from django.core.management.base import BaseCommand
from vbv_lernwelt.files.models import File from vbv_lernwelt.files.models import UploadFile
class Command(BaseCommand): class Command(BaseCommand):
@ -20,7 +20,7 @@ class Command(BaseCommand):
num_deleted = 0 num_deleted = 0
unreferenced_uploads = File.objects.filter(upload_finished_at__isnull=True) unreferenced_uploads = UploadFile.objects.filter(upload_finished_at__isnull=True)
if dry_run: if dry_run:
print("------ DRY RUN -------") print("------ DRY RUN -------")

View File

@ -17,7 +17,7 @@ class Migration(migrations.Migration):
operations = [ operations = [
migrations.CreateModel( migrations.CreateModel(
name="File", name="UploadFile",
fields=[ fields=[
( (
"id", "id",

View File

@ -11,7 +11,7 @@ from vbv_lernwelt.files.utils import file_generate_upload_path
# Code https://github.com/HackSoftware/Django-Styleguide-Example/tree/bdadf52b849bb5fa47854a3094f4da6fe9d54d02/styleguide_example/files # Code https://github.com/HackSoftware/Django-Styleguide-Example/tree/bdadf52b849bb5fa47854a3094f4da6fe9d54d02/styleguide_example/files
class File(models.Model): class UploadFile(models.Model):
file = models.FileField(upload_to=file_generate_upload_path, blank=True, null=True) file = models.FileField(upload_to=file_generate_upload_path, blank=True, null=True)
original_file_name = models.TextField() original_file_name = models.TextField()

View File

@ -9,7 +9,7 @@ from django.utils import timezone
from vbv_lernwelt.core.models import User from vbv_lernwelt.core.models import User
from vbv_lernwelt.files.enums import FileUploadStorage from vbv_lernwelt.files.enums import FileUploadStorage
from vbv_lernwelt.files.integrations import s3_generate_presigned_post from vbv_lernwelt.files.integrations import s3_generate_presigned_post
from vbv_lernwelt.files.models import File from vbv_lernwelt.files.models import UploadFile
from vbv_lernwelt.files.utils import ( from vbv_lernwelt.files.utils import (
bytes_to_mib, bytes_to_mib,
file_generate_local_upload_url, file_generate_local_upload_url,
@ -59,12 +59,12 @@ class FileStandardUploadService:
return file_name, file_type return file_name, file_type
@transaction.atomic @transaction.atomic
def create(self, file_name: str = "", file_type: str = "") -> File: def create(self, file_name: str = "", file_type: str = "") -> UploadFile:
_validate_file_size(self.file_obj) _validate_file_size(self.file_obj)
file_name, file_type = self._infer_file_name_and_type(file_name, file_type) file_name, file_type = self._infer_file_name_and_type(file_name, file_type)
obj = File( obj = UploadFile(
file=self.file_obj, file=self.file_obj,
original_file_name=file_name, original_file_name=file_name,
file_name=file_generate_name(file_name), file_name=file_generate_name(file_name),
@ -79,7 +79,7 @@ class FileStandardUploadService:
return obj return obj
@transaction.atomic @transaction.atomic
def update(self, file: File, file_name: str = "", file_type: str = "") -> File: def update(self, file: UploadFile, file_name: str = "", file_type: str = "") -> UploadFile:
_validate_file_size(self.file_obj) _validate_file_size(self.file_obj)
file_name, file_type = self._infer_file_name_and_type(file_name, file_type) file_name, file_type = self._infer_file_name_and_type(file_name, file_type)
@ -111,8 +111,8 @@ class FileDirectUploadService:
self.user = user self.user = user
@transaction.atomic @transaction.atomic
def start(self, file_name: str, file_type: str) -> Tuple[File, Dict[str, Any]]: def start(self, file_name: str, file_type: str) -> Tuple[UploadFile, Dict[str, Any]]:
file = File( file = UploadFile(
original_file_name=file_name, original_file_name=file_name,
file_name=file_generate_name(file_name), file_name=file_generate_name(file_name),
file_type=file_type, file_type=file_type,
@ -145,7 +145,7 @@ class FileDirectUploadService:
return file, presigned_data return file, presigned_data
@transaction.atomic @transaction.atomic
def finish(self, *, file: File) -> File: def finish(self, *, file: UploadFile) -> UploadFile:
# Potentially, check against user # Potentially, check against user
file.upload_finished_at = timezone.now() file.upload_finished_at = timezone.now()
file.full_clean() file.full_clean()
@ -154,7 +154,7 @@ class FileDirectUploadService:
return file return file
@transaction.atomic @transaction.atomic
def upload_local(self, *, file: File, file_obj) -> File: def upload_local(self, *, file: UploadFile, file_obj) -> UploadFile:
_validate_file_size(file_obj) _validate_file_size(file_obj)
# Potentially, check against user # Potentially, check against user