Browse Source

Start on files api

David Burke 3 years ago
parent
commit
5d98746ed7
5 changed files with 73 additions and 5 deletions
  1. 42 0
      files/migrations/0003_auto_20210507_1549.py
  2. 9 3
      files/models.py
  3. 8 0
      files/serializers.py
  4. 7 2
      files/views.py
  5. 7 0
      projects/urls.py

+ 42 - 0
files/migrations/0003_auto_20210507_1549.py

@@ -0,0 +1,42 @@
+# Generated by Django 3.1.7 on 2021-05-07 15:49
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('files', '0002_fileblob_organizations'),
+    ]
+
+    operations = [
+        migrations.RemoveField(
+            model_name='fileblob',
+            name='organizations',
+        ),
+        migrations.AddField(
+            model_name='fileblob',
+            name='size',
+            field=models.PositiveIntegerField(null=True),
+        ),
+        migrations.AlterField(
+            model_name='fileblob',
+            name='id',
+            field=models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
+        ),
+        migrations.CreateModel(
+            name='File',
+            fields=[
+                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('created', models.DateTimeField(auto_now_add=True, db_index=True)),
+                ('name', models.TextField()),
+                ('headers', models.JSONField()),
+                ('size', models.PositiveIntegerField(null=True)),
+                ('checksum', models.CharField(db_index=True, max_length=40, null=True)),
+                ('blobs', models.ManyToManyField(to='files.FileBlob')),
+            ],
+            options={
+                'abstract': False,
+            },
+        ),
+    ]

+ 9 - 3
files/models.py

@@ -4,8 +4,8 @@ from glitchtip.base_models import CreatedModel
 
 class FileBlob(CreatedModel):
     upload = models.FileField(upload_to="uploads/")
+    size = models.PositiveIntegerField(null=True)
     checksum = models.CharField(max_length=40, unique=True)
-    organizations = models.ManyToManyField("organizations_ext.Organization")
 
     @classmethod
     def from_files(cls, files, organization=None, logger=None):
@@ -24,5 +24,11 @@ class FileBlob(CreatedModel):
             blob.checksum = file_with_checksum[1]
             blob.upload.save(blob_file.name, blob_file)
             blob.save()
-            if organization:
-                blob.organizations.add(organization)
+
+
+class File(CreatedModel):
+    name = models.TextField()
+    headers = models.JSONField()
+    blobs = models.ManyToManyField(FileBlob)
+    size = models.PositiveIntegerField(null=True)
+    checksum = models.CharField(max_length=40, null=True, db_index=True)

+ 8 - 0
files/serializers.py

@@ -0,0 +1,8 @@
+from rest_framework import serializers
+from .models import File
+
+
+class FileSerializer(serializers.ModelSerializer):
+    class Meta:
+        model = File
+        fields = ("name",)

+ 7 - 2
files/views.py

@@ -5,10 +5,11 @@ from gzip import GzipFile
 from django.conf import settings
 from django.urls import reverse
 from django.shortcuts import get_object_or_404
-from rest_framework import views, status
+from rest_framework import views, status, viewsets
 from rest_framework.response import Response
 from organizations_ext.models import Organization
-from .models import FileBlob
+from .models import FileBlob, File
+from .serializers import FileSerializer
 from .permissions import ChunkUploadPermission
 
 
@@ -117,3 +118,7 @@ class ChunkUploadAPIView(views.APIView):
         logger.info("chunkupload.end", extra={"status": status.HTTP_200_OK})
         return Response(status=status.HTTP_200_OK)
 
+
+class FileViewSet(viewsets.ModelViewSet):
+    queryset = File.objects.all()
+    serializer_class = FileSerializer

+ 7 - 0
projects/urls.py

@@ -4,6 +4,7 @@ from issues.views import IssueViewSet, EventViewSet
 from alerts.views import ProjectAlertViewSet
 from releases.views import ReleaseViewSet
 from environments.views import EnvironmentProjectViewSet
+from files.views import FileViewSet
 from .views import ProjectViewSet, ProjectKeyViewSet, ProjectTeamViewSet
 
 router = routers.SimpleRouter()
@@ -20,7 +21,13 @@ projects_router.register(
 )
 projects_router.register(r"releases", ReleaseViewSet, basename="project-releases")
 
+releases_router = routers.NestedSimpleRouter(
+    projects_router, r"releases", lookup="release"
+)
+releases_router.register(r"files", FileViewSet, basename="files")
+
 urlpatterns = [
     path("", include(router.urls)),
     path("", include(projects_router.urls)),
+    path("", include(releases_router.urls)),
 ]