Browse Source

Move model related to example to example app

pull/1656/head
Hironsan 3 years ago
parent
commit
35846a42d4
24 changed files with 325 additions and 110 deletions
  1. 18
      backend/api/admin.py
  2. 46
      backend/api/migrations/0034_auto_20220128_0246.py
  3. 34
      backend/api/migrations/0035_auto_20220128_0246.py
  4. 79
      backend/api/models.py
  5. 3
      backend/auto_labeling/pipeline/labels.py
  6. 3
      backend/data_export/pipeline/repositories.py
  7. 3
      backend/data_import/pipeline/data.py
  8. 3
      backend/data_import/pipeline/writers.py
  9. 3
      backend/data_import/tests/test_tasks.py
  10. 19
      backend/examples/admin.py
  11. 2
      backend/examples/filters.py
  12. 0
      backend/examples/managers.py
  13. 79
      backend/examples/migrations/0001_initial.py
  14. 83
      backend/examples/models.py
  15. 2
      backend/examples/serializers.py
  16. 2
      backend/examples/tests/test_filters.py
  17. 3
      backend/examples/tests/test_models.py
  18. 2
      backend/examples/views/comment.py
  19. 3
      backend/examples/views/example.py
  20. 3
      backend/examples/views/example_state.py
  21. 38
      backend/labels/migrations/0004_auto_20220128_0246.py
  22. 3
      backend/labels/models.py
  23. 2
      backend/labels/serializers.py
  24. 2
      backend/metrics/views.py

18
backend/api/admin.py

@ -1,13 +1,7 @@
from django.contrib import admin
from .models import (Comment, Example, Project, Seq2seqProject,
SequenceLabelingProject, Tag, TextClassificationProject)
class ExampleAdmin(admin.ModelAdmin):
list_display = ('text', 'project', 'meta')
ordering = ('project',)
search_fields = ('text',)
from .models import (Project, Seq2seqProject, SequenceLabelingProject, Tag,
TextClassificationProject)
class ProjectAdmin(admin.ModelAdmin):
@ -22,16 +16,8 @@ class TagAdmin(admin.ModelAdmin):
search_fields = ('text',)
class CommentAdmin(admin.ModelAdmin):
list_display = ('user', 'example', 'text', 'created_at', )
ordering = ('user', 'created_at', )
search_fields = ('user',)
admin.site.register(Example, ExampleAdmin)
admin.site.register(Project, ProjectAdmin)
admin.site.register(TextClassificationProject, ProjectAdmin)
admin.site.register(SequenceLabelingProject, ProjectAdmin)
admin.site.register(Seq2seqProject, ProjectAdmin)
admin.site.register(Comment, CommentAdmin)
admin.site.register(Tag, TagAdmin)

46
backend/api/migrations/0034_auto_20220128_0246.py

@ -0,0 +1,46 @@
# Generated by Django 3.2.11 on 2022-01-28 02:46
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('api', '0033_auto_20220127_0654'),
]
operations = [
migrations.SeparateDatabaseAndState(
state_operations=[
migrations.RemoveField(
model_name='example',
name='annotations_approved_by',
),
migrations.RemoveField(
model_name='example',
name='project',
),
migrations.AlterUniqueTogether(
name='examplestate',
unique_together=None,
),
migrations.RemoveField(
model_name='examplestate',
name='confirmed_by',
),
migrations.RemoveField(
model_name='examplestate',
name='example',
),
migrations.DeleteModel(
name='Comment',
),
],
database_operations=[
migrations.AlterModelTable(
name='Comment',
table='examples_comment'
)
]
)
]

34
backend/api/migrations/0035_auto_20220128_0246.py

@ -0,0 +1,34 @@
# Generated by Django 3.2.11 on 2022-01-28 02:46
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('api', '0034_auto_20220128_0246'),
('labels', '0004_auto_20220128_0246'),
]
operations = [
migrations.SeparateDatabaseAndState(
state_operations=[
migrations.DeleteModel(
name='Example',
),
migrations.DeleteModel(
name='ExampleState',
),
],
database_operations=[
migrations.AlterModelTable(
name='Example',
table='examples_example'
),
migrations.AlterModelTable(
name='ExampleState',
table='examples_examplestate'
)
]
)
]

79
backend/api/models.py

@ -1,12 +1,9 @@
import abc
import uuid
from django.contrib.auth.models import User
from django.db import models
from polymorphic.models import PolymorphicModel
from .managers import ExampleManager, ExampleStateManager
DOCUMENT_CLASSIFICATION = 'DocumentClassification'
SEQUENCE_LABELING = 'SequenceLabeling'
SEQ2SEQ = 'Seq2seq'
@ -148,82 +145,6 @@ class ImageClassificationProject(Project):
return True
class Example(models.Model):
objects = ExampleManager()
uuid = models.UUIDField(default=uuid.uuid4, editable=False, db_index=True, unique=True)
meta = models.JSONField(default=dict)
filename = models.FileField(default='.', max_length=1024)
project = models.ForeignKey(
to=Project,
on_delete=models.CASCADE,
related_name='examples'
)
annotations_approved_by = models.ForeignKey(
to=User,
on_delete=models.SET_NULL,
null=True,
blank=True
)
text = models.TextField(null=True, blank=True)
created_at = models.DateTimeField(auto_now_add=True, db_index=True)
updated_at = models.DateTimeField(auto_now=True)
@property
def comment_count(self):
return Comment.objects.filter(example=self.id).count()
@property
def data(self):
if self.project.is_text_project:
return self.text
else:
return str(self.filename)
class Meta:
ordering = ['created_at']
class ExampleState(models.Model):
objects = ExampleStateManager()
example = models.ForeignKey(
to=Example,
on_delete=models.CASCADE,
related_name='states'
)
confirmed_by = models.ForeignKey(
to=User,
on_delete=models.CASCADE
)
confirmed_at = models.DateTimeField(auto_now=True)
class Meta:
unique_together = (('example', 'confirmed_by'),)
class Comment(models.Model):
text = models.TextField()
example = models.ForeignKey(
to=Example,
on_delete=models.CASCADE,
related_name='comments'
)
user = models.ForeignKey(
to=User,
on_delete=models.CASCADE,
null=True
)
created_at = models.DateTimeField(auto_now_add=True, db_index=True)
updated_at = models.DateTimeField(auto_now=True)
@property
def username(self):
return self.user.username
class Meta:
ordering = ['created_at']
class Tag(models.Model):
text = models.TextField()
project = models.ForeignKey(

3
backend/auto_labeling/pipeline/labels.py

@ -4,7 +4,8 @@ from typing import List
from auto_labeling_pipeline.labels import Labels
from django.contrib.auth.models import User
from api.models import Project, Example
from api.models import Project
from examples.models import Example
from label_types.models import CategoryType, SpanType
from labels.models import Label, Category, Span, TextLabel

3
backend/data_export/pipeline/repositories.py

@ -3,7 +3,8 @@ import itertools
from collections import defaultdict
from typing import Dict, Iterator, List
from api.models import Example, Project
from api.models import Project
from examples.models import Example
from .data import Record

3
backend/data_import/pipeline/data.py

@ -4,7 +4,8 @@ from typing import Any, Dict
from pydantic import BaseModel, validator
from api.models import Example, Project
from api.models import Project
from examples.models import Example
class BaseData(BaseModel, abc.ABC):

3
backend/data_import/pipeline/writers.py

@ -5,7 +5,8 @@ from typing import Any, Dict, List
from django.conf import settings
from api.models import Example, Project
from api.models import Project
from examples.models import Example
from label_types.models import CategoryType, SpanType
from .exceptions import FileParseException
from .readers import BaseReader

3
backend/data_import/tests/test_tasks.py

@ -5,7 +5,8 @@ from django.test import TestCase
from data_import.celery_tasks import import_dataset
from api.models import (DOCUMENT_CLASSIFICATION,
INTENT_DETECTION_AND_SLOT_FILLING, SEQ2SEQ,
SEQUENCE_LABELING, Example)
SEQUENCE_LABELING)
from examples.models import Example
from label_types.models import CategoryType, SpanType
from labels.models import Category, Span
from api.tests.api.utils import prepare_project

19
backend/examples/admin.py

@ -0,0 +1,19 @@
from django.contrib import admin
from .models import Example, Comment
class ExampleAdmin(admin.ModelAdmin):
list_display = ('text', 'project', 'meta')
ordering = ('project',)
search_fields = ('text',)
class CommentAdmin(admin.ModelAdmin):
list_display = ('user', 'example', 'text', 'created_at', )
ordering = ('user', 'created_at', )
search_fields = ('user',)
admin.site.register(Example, ExampleAdmin)
admin.site.register(Comment, CommentAdmin)

2
backend/examples/filters.py

@ -1,7 +1,7 @@
from django.db.models import Count, Q
from django_filters.rest_framework import BooleanFilter, FilterSet
from api.models import Example
from .models import Example
class ExampleFilter(FilterSet):

backend/api/managers.py → backend/examples/managers.py

79
backend/examples/migrations/0001_initial.py

@ -0,0 +1,79 @@
# Generated by Django 3.2.11 on 2022-01-28 02:46
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
import uuid
class Migration(migrations.Migration):
initial = True
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('api', '0034_auto_20220128_0246'),
]
operations = [
migrations.SeparateDatabaseAndState(
state_operations=[
migrations.CreateModel(
name='Example',
fields=[
('id',
models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('uuid', models.UUIDField(db_index=True, default=uuid.uuid4, editable=False, unique=True)),
('meta', models.JSONField(default=dict)),
('filename', models.FileField(default='.', max_length=1024, upload_to='')),
('text', models.TextField(blank=True, null=True)),
('created_at', models.DateTimeField(auto_now_add=True, db_index=True)),
('updated_at', models.DateTimeField(auto_now=True)),
('annotations_approved_by',
models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL,
to=settings.AUTH_USER_MODEL)),
('project',
models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='examples',
to='api.project')),
],
options={
'ordering': ['created_at'],
},
),
migrations.CreateModel(
name='Comment',
fields=[
('id',
models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('text', models.TextField()),
('created_at', models.DateTimeField(auto_now_add=True, db_index=True)),
('updated_at', models.DateTimeField(auto_now=True)),
('example',
models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='comments',
to='examples.example')),
('user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE,
to=settings.AUTH_USER_MODEL)),
],
options={
'ordering': ['created_at'],
},
),
migrations.CreateModel(
name='ExampleState',
fields=[
('id',
models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('confirmed_at', models.DateTimeField(auto_now=True)),
('confirmed_by',
models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
('example',
models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='states',
to='examples.example')),
],
options={
'unique_together': {('example', 'confirmed_by')},
},
),
]
)
]

83
backend/examples/models.py

@ -0,0 +1,83 @@
import uuid
from django.contrib.auth.models import User
from django.db import models
from api.models import Project
from .managers import ExampleManager, ExampleStateManager
class Example(models.Model):
objects = ExampleManager()
uuid = models.UUIDField(default=uuid.uuid4, editable=False, db_index=True, unique=True)
meta = models.JSONField(default=dict)
filename = models.FileField(default='.', max_length=1024)
project = models.ForeignKey(
to=Project,
on_delete=models.CASCADE,
related_name='examples'
)
annotations_approved_by = models.ForeignKey(
to=User,
on_delete=models.SET_NULL,
null=True,
blank=True
)
text = models.TextField(null=True, blank=True)
created_at = models.DateTimeField(auto_now_add=True, db_index=True)
updated_at = models.DateTimeField(auto_now=True)
@property
def comment_count(self):
return Comment.objects.filter(example=self.id).count()
@property
def data(self):
if self.project.is_text_project:
return self.text
else:
return str(self.filename)
class Meta:
ordering = ['created_at']
class ExampleState(models.Model):
objects = ExampleStateManager()
example = models.ForeignKey(
to=Example,
on_delete=models.CASCADE,
related_name='states'
)
confirmed_by = models.ForeignKey(
to=User,
on_delete=models.CASCADE
)
confirmed_at = models.DateTimeField(auto_now=True)
class Meta:
unique_together = (('example', 'confirmed_by'),)
class Comment(models.Model):
text = models.TextField()
example = models.ForeignKey(
to=Example,
on_delete=models.CASCADE,
related_name='comments'
)
user = models.ForeignKey(
to=User,
on_delete=models.CASCADE,
null=True
)
created_at = models.DateTimeField(auto_now_add=True, db_index=True)
updated_at = models.DateTimeField(auto_now=True)
@property
def username(self):
return self.user.username
class Meta:
ordering = ['created_at']

2
backend/examples/serializers.py

@ -1,6 +1,6 @@
from rest_framework import serializers
from api.models import Comment, Example, ExampleState
from .models import Example, ExampleState, Comment
class CommentSerializer(serializers.ModelSerializer):

2
backend/examples/tests/test_filters.py

@ -2,8 +2,8 @@ from unittest.mock import MagicMock
from django.test import TestCase
from api.models import Example
from api.tests.api.utils import make_doc, make_example_state, prepare_project
from examples.models import Example
from examples.filters import ExampleFilter

3
backend/examples/tests/test_models.py

@ -1,8 +1,9 @@
from django.test import TestCase
from model_mommy import mommy
from api.models import IMAGE_CLASSIFICATION, SEQUENCE_LABELING, ExampleState
from api.models import IMAGE_CLASSIFICATION, SEQUENCE_LABELING
from api.tests.api.utils import prepare_project
from examples.models import ExampleState
class TestExampleState(TestCase):

2
backend/examples/views/comment.py

@ -3,8 +3,8 @@ from rest_framework import filters, generics, status
from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response
from api.models import Comment
from members.permissions import IsInProjectOrAdmin
from examples.models import Comment
from examples.permissions import IsOwnComment
from examples.serializers import CommentSerializer

3
backend/examples/views/example.py

@ -7,8 +7,9 @@ from rest_framework import filters, generics, status
from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response
from api.models import Example, Project
from api.models import Project
from examples.filters import ExampleFilter
from examples.models import Example
from examples.serializers import ExampleSerializer
from members.permissions import IsInProjectReadOnlyOrAdmin

3
backend/examples/views/example_state.py

@ -2,7 +2,8 @@ from django.shortcuts import get_object_or_404
from rest_framework import generics
from rest_framework.permissions import IsAuthenticated
from api.models import Example, ExampleState, Project
from api.models import Project
from examples.models import Example, ExampleState
from examples.serializers import ExampleStateSerializer
from members.permissions import IsInProjectOrAdmin

38
backend/labels/migrations/0004_auto_20220128_0246.py

@ -0,0 +1,38 @@
# Generated by Django 3.2.11 on 2022-01-28 02:46
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('examples', '0001_initial'),
('labels', '0003_auto_20220127_0654'),
]
operations = [
migrations.SeparateDatabaseAndState(
state_operations=[
migrations.AlterField(
model_name='category',
name='example',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='categories',
to='examples.example'),
),
migrations.AlterField(
model_name='span',
name='example',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='spans',
to='examples.example'),
),
migrations.AlterField(
model_name='textlabel',
name='example',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='texts',
to='examples.example'),
),
],
database_operations=[]
)
]

3
backend/labels/models.py

@ -3,7 +3,8 @@ from django.core.exceptions import ValidationError
from django.db import models
from .managers import LabelManager, CategoryManager, SpanManager, TextLabelManager
from api.models import Example, Project
from api.models import Project
from examples.models import Example
from label_types.models import CategoryType, SpanType, RelationType

2
backend/labels/serializers.py

@ -1,6 +1,6 @@
from rest_framework import serializers
from api.models import Example
from examples.models import Example
from label_types.models import CategoryType, SpanType
from .models import Category, Span, TextLabel, Relation

2
backend/metrics/views.py

@ -5,7 +5,7 @@ from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response
from rest_framework.views import APIView
from api.models import Example, ExampleState
from examples.models import Example, ExampleState
from label_types.models import LabelType, CategoryType, SpanType
from labels.models import Label, Category, Span
from members.models import Member

Loading…
Cancel
Save