diff --git a/app/apps/api/serializers.py b/app/apps/api/serializers.py index fc2d0296f3c4f0a7c133c0ddcedeb1b1906c15f7..f57fc5d0e243ef4d341a533b78924eff83884287 100644 --- a/app/apps/api/serializers.py +++ b/app/apps/api/serializers.py @@ -4,6 +4,7 @@ import html from django.conf import settings from django.db.utils import IntegrityError +from django.utils import timezone from django.utils.translation import gettext_lazy as _ from rest_framework import serializers @@ -395,8 +396,7 @@ class SegTrainSerializer(ProcessSerializerMixin, serializers.Serializer): OcrModelDocument.objects.create( document=self.document, ocr_model=model, - trained_on=False, - executed_on=True, + executed_on=timezone.now(), ) segtrain.delay(model.pk if model else None, self.document.pk, @@ -437,8 +437,7 @@ class TrainSerializer(ProcessSerializerMixin, serializers.Serializer): OcrModelDocument.objects.create( document=self.document, ocr_model=model, - trained_on=False, - executed_on=True, + executed_on=timezone.now(), ) train.delay([part.pk for part in self.validated_data.get('parts')], diff --git a/app/apps/core/admin.py b/app/apps/core/admin.py index c19039b5318bf3f98208e4620b6f12d421ee5e07..fc4881acc459bfda675ba233c15881cad5a6c3e6 100644 --- a/app/apps/core/admin.py +++ b/app/apps/core/admin.py @@ -51,7 +51,7 @@ class OcrModelAdmin(admin.ModelAdmin): class OcrModelDocumentAdmin(admin.ModelAdmin): - list_display = ['document', 'ocr_model', 'trained_on', 'executed_on', 'created'] + list_display = ['document', 'ocr_model', 'trained_on', 'executed_on', 'created_at'] admin.site.register(Document, DocumentAdmin) diff --git a/app/apps/core/forms.py b/app/apps/core/forms.py index d9811a51df935a0e3179a61375285a3a7bc348b8..dbddbe187612c210da646ed1a973631f1bb9aca5 100644 --- a/app/apps/core/forms.py +++ b/app/apps/core/forms.py @@ -7,6 +7,7 @@ from django.conf import settings from django.core.validators import FileExtensionValidator, MinValueValidator, MaxValueValidator from django.db.models import Q from django.forms.models import inlineformset_factory +from django.utils import timezone from django.utils.functional import cached_property from django.utils.translation import gettext_lazy as _ @@ -178,8 +179,7 @@ class DocumentSegmentForm(DocumentProcessForm1): OcrModelDocument.objects.create( document=self.parts[0].document, ocr_model=model, - trained_on=False, - executed_on=True, + executed_on=timezone.now(), ) # Note: needs to save the file in a second step because the path needs the db PK model.file = data['upload_model'] @@ -190,10 +190,10 @@ class DocumentSegmentForm(DocumentProcessForm1): ocr_model_document, created = OcrModelDocument.objects.get_or_create( ocr_model=model, document=self.parts[0].document, - defaults={'trained_on': False, 'executed_on': True} + defaults={'executed_on': timezone.now()} ) if not created: - ocr_model_document.executed_on = True + ocr_model_document.executed_on = timezone.now() ocr_model_document.save() else: model = None @@ -240,10 +240,10 @@ class DocumentTrainForm(DocumentProcessForm1): ocr_model_document, created = OcrModelDocument.objects.get_or_create( ocr_model=model, document=self.parts[0].document, - defaults={'trained_on': True, 'executed_on': False} + defaults={'trained_on': timezone.now()} ) if not created: - ocr_model_document.trained_on = True + ocr_model_document.trained_on = timezone.now() ocr_model_document.save() elif data.get('upload_model'): @@ -254,8 +254,7 @@ class DocumentTrainForm(DocumentProcessForm1): OcrModelDocument.objects.create( document=self.parts[0].document, ocr_model=model, - trained_on=True, - executed_on=False, + trained_on=timezone.now(), ) # Note: needs to save the file in a second step because the path needs the db PK model.file = data['upload_model'] @@ -270,8 +269,7 @@ class DocumentTrainForm(DocumentProcessForm1): OcrModelDocument.objects.create( document=self.parts[0].document, ocr_model=model, - trained_on=True, - executed_on=False, + trained_on=timezone.now(), ) else: @@ -313,10 +311,10 @@ class DocumentSegtrainForm(DocumentProcessForm1): ocr_model_document, created = OcrModelDocument.objects.get_or_create( ocr_model=model, document=self.parts[0].document, - defaults={'trained_on': True, 'executed_on': False} + defaults={'trained_on': timezone.now()} ) if not created: - ocr_model_document.trained_on = True + ocr_model_document.trained_on = timezone.now() ocr_model_document.save() elif data.get('upload_model'): model = OcrModel.objects.create( @@ -326,8 +324,7 @@ class DocumentSegtrainForm(DocumentProcessForm1): OcrModelDocument.objects.create( document=self.parts[0].document, ocr_model=model, - trained_on=True, - executed_on=False, + trained_on=timezone.now(), ) # Note: needs to save the file in a second step because the path needs the db PK model.file = data['upload_model'] @@ -342,8 +339,7 @@ class DocumentSegtrainForm(DocumentProcessForm1): OcrModelDocument.objects.create( document=self.parts[0].document, ocr_model=model, - trained_on=True, - executed_on=False, + trained_on=timezone.now(), ) else: @@ -383,8 +379,7 @@ class DocumentTranscribeForm(DocumentProcessForm1): OcrModelDocument.objects.create( document=self.parts[0].document, ocr_model=model, - trained_on=False, - executed_on=True, + executed_on=timezone.now(), ) # Note: needs to save the file in a second step because the path needs the db PK model.file = data['upload_model'] @@ -395,10 +390,10 @@ class DocumentTranscribeForm(DocumentProcessForm1): ocr_model_document, created = OcrModelDocument.objects.get_or_create( ocr_model=model, document=self.parts[0].document, - defaults={'trained_on': False, 'executed_on': True} + defaults={'executed_on': timezone.now()} ) if not created: - ocr_model_document.executed_on = True + ocr_model_document.executed_on = timezone.now() ocr_model_document.save() else: raise forms.ValidationError( @@ -552,20 +547,20 @@ class DocumentProcessForm(BootstrapFormMixin, forms.Form): ocr_model_document, created = OcrModelDocument.objects.get_or_create( ocr_model=model, document=self.parts[0].document, - defaults={'trained_on': True, 'executed_on': False} + defaults={'trained_on': timezone.now()} ) if not created: - ocr_model_document.trained_on = True + ocr_model_document.trained_on = timezone.now() ocr_model_document.save() elif task == self.TASK_SEGTRAIN and data.get('segtrain_model'): model = data.get('segtrain_model') ocr_model_document, created = OcrModelDocument.objects.get_or_create( ocr_model=model, document=self.parts[0].document, - defaults={'trained_on': True, 'executed_on': False} + defaults={'trained_on': timezone.now()} ) if not created: - ocr_model_document.trained_on = True + ocr_model_document.trained_on = timezone.now() ocr_model_document.save() elif data.get('upload_model'): model = OcrModel.objects.create( @@ -575,8 +570,7 @@ class DocumentProcessForm(BootstrapFormMixin, forms.Form): OcrModelDocument.objects.create( document=self.parts[0].document, ocr_model=model, - trained_on=False, - executed_on=True, + executed_on=timezone.now(), ) # Note: needs to save the file in a second step because the path needs the db PK model.file = data['upload_model'] @@ -591,28 +585,27 @@ class DocumentProcessForm(BootstrapFormMixin, forms.Form): OcrModelDocument.objects.create( document=self.parts[0].document, ocr_model=model, - trained_on=True, - executed_on=False, + trained_on=timezone.now(), ) elif data.get('ocr_model'): model = data.get('ocr_model') ocr_model_document, created = OcrModelDocument.objects.get_or_create( ocr_model=model, document=self.parts[0].document, - defaults={'trained_on': False, 'executed_on': True} + defaults={'executed_on': timezone.now()} ) if not created: - ocr_model_document.executed_on = True + ocr_model_document.executed_on = timezone.now() ocr_model_document.save() elif data.get('seg_model'): model = data.get('seg_model') ocr_model_document, created = OcrModelDocument.objects.get_or_create( ocr_model=model, document=self.parts[0].document, - defaults={'trained_on': False, 'executed_on': True} + defaults={'executed_on': timezone.now()} ) if not created: - ocr_model_document.executed_on = True + ocr_model_document.executed_on = timezone.now() ocr_model_document.save() else: if task in (self.TASK_TRAIN, self.TASK_SEGTRAIN): diff --git a/app/apps/core/migrations/0045_auto_20210518_1235.py b/app/apps/core/migrations/0045_auto_20210521_1034.py similarity index 79% rename from app/apps/core/migrations/0045_auto_20210518_1235.py rename to app/apps/core/migrations/0045_auto_20210521_1034.py index a31d68191b9f1cb0167aa391b0c0f427a7eb5f95..1deb56b1d079224722452b5809392605a2aeefc8 100644 --- a/app/apps/core/migrations/0045_auto_20210518_1235.py +++ b/app/apps/core/migrations/0045_auto_20210521_1034.py @@ -1,7 +1,8 @@ -# Generated by Django 2.2.19 on 2021-05-18 12:35 +# Generated by Django 2.2.19 on 2021-05-21 10:34 from django.db import migrations, models import django.db.models.deletion +from django.utils import timezone def populate_m2m(apps, schema_editor): @@ -10,10 +11,9 @@ def populate_m2m(apps, schema_editor): OcrModelDocument.objects.bulk_create([ OcrModelDocument( - document_id = model.document_id, - ocr_model_id = model.id, - trained_on = False, - executed_on = True, + document_id=model.document_id, + ocr_model_id=model.id, + executed_on=timezone.now(), ) for model in OcrModel.objects.exclude(document__isnull=True) ]) @@ -29,9 +29,9 @@ class Migration(migrations.Migration): name='OcrModelDocument', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('created', models.DateTimeField(auto_now_add=True)), - ('trained_on', models.BooleanField()), - ('executed_on', models.BooleanField()), + ('created_at', models.DateTimeField(auto_now_add=True)), + ('trained_on', models.DateTimeField(null=True)), + ('executed_on', models.DateTimeField(null=True)), ('document', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='ocr_model_documents', to='core.Document')), ('ocr_model', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='ocr_model_documents', to='core.OcrModel')), ], diff --git a/app/apps/core/models.py b/app/apps/core/models.py index 20b352fdeca66d1565b3b1ef4483639a1d7bcc9e..edf76b241ba693089144c12776edc229a3c72cbd 100644 --- a/app/apps/core/models.py +++ b/app/apps/core/models.py @@ -1083,7 +1083,7 @@ class LineTranscription(Versioned, models.Model): def models_path(instance, filename): fn, ext = os.path.splitext(filename) - return 'models/%s%s' % (slugify(fn), ext) + return 'models/%d/%s%s' % (instance.owner.pk, slugify(fn), ext) class OcrModel(Versioned, models.Model): @@ -1182,9 +1182,9 @@ class OcrModel(Versioned, models.Model): class OcrModelDocument(models.Model): document = models.ForeignKey(Document, on_delete=models.CASCADE, related_name='ocr_model_documents') ocr_model = models.ForeignKey(OcrModel, on_delete=models.CASCADE, related_name='ocr_model_documents') - created = models.DateTimeField(auto_now_add=True) - trained_on = models.BooleanField() - executed_on = models.BooleanField() + created_at = models.DateTimeField(auto_now_add=True) + trained_on = models.DateTimeField(null=True) + executed_on = models.DateTimeField(null=True) class Meta: unique_together = (('document', 'ocr_model'),) diff --git a/app/apps/core/tests/factory.py b/app/apps/core/tests/factory.py index 9c5655cc1675fbc79be57fb20ebc9da0e5576c31..2c4028a24bf89e54afe0ae63d9999a08ee4ccde5 100644 --- a/app/apps/core/tests/factory.py +++ b/app/apps/core/tests/factory.py @@ -6,6 +6,7 @@ import os.path from django.conf import settings from django.core.files.uploadedfile import SimpleUploadedFile from django.test import TestCase +from django.utils import timezone from django_redis import get_redis_connection from kraken.lib import vgsl @@ -93,7 +94,7 @@ class CoreFactory(): model = document.ocr_models.add( name=model_name, job=job, - through_defaults={'trained_on': False, 'executed_on': True} + through_defaults={'executed_on': timezone.now()} ) modeldir = os.path.join(settings.MEDIA_ROOT, os.path.split( model.file.field.upload_to(model, 'test-model.mlmodel'))[0])