Migration updates
Squash version page migrations. Add manual OCR and parsing migrations. Fix tests. Page search updates. Signed-off-by: Roberto Rosario <roberto.rosario@mayan-edms.com>
This commit is contained in:
@@ -3,13 +3,13 @@ from __future__ import unicode_literals
|
|||||||
from django.contrib import admin
|
from django.contrib import admin
|
||||||
|
|
||||||
from .models import (
|
from .models import (
|
||||||
DocumentPageContent, DocumentVersionParseError
|
DocumentVersionPageContent, DocumentVersionParseError
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@admin.register(DocumentPageContent)
|
@admin.register(DocumentVersionPageContent)
|
||||||
class DocumentPageContentAdmin(admin.ModelAdmin):
|
class DocumentVersionPageContentAdmin(admin.ModelAdmin):
|
||||||
list_display = ('document_page',)
|
list_display = ('document_version_page',)
|
||||||
|
|
||||||
|
|
||||||
@admin.register(DocumentVersionParseError)
|
@admin.register(DocumentVersionParseError)
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ from rest_framework.response import Response
|
|||||||
from mayan.apps.documents.models import Document
|
from mayan.apps.documents.models import Document
|
||||||
from mayan.apps.rest_api.permissions import MayanPermission
|
from mayan.apps.rest_api.permissions import MayanPermission
|
||||||
|
|
||||||
from .models import DocumentPageContent
|
from .models import DocumentVersionPageContent
|
||||||
from .permissions import permission_content_view
|
from .permissions import permission_content_view
|
||||||
from .serializers import DocumentPageContentSerializer
|
from .serializers import DocumentPageContentSerializer
|
||||||
|
|
||||||
@@ -41,8 +41,8 @@ class APIDocumentPageContentView(generics.RetrieveAPIView):
|
|||||||
|
|
||||||
try:
|
try:
|
||||||
content = instance.content
|
content = instance.content
|
||||||
except DocumentPageContent.DoesNotExist:
|
except DocumentVersionPageContent.DoesNotExist:
|
||||||
content = DocumentPageContent.objects.none()
|
content = DocumentVersionPageContent.objects.none()
|
||||||
|
|
||||||
serializer = self.get_serializer(content)
|
serializer = self.get_serializer(content)
|
||||||
return Response(serializer.data)
|
return Response(serializer.data)
|
||||||
|
|||||||
@@ -133,7 +133,7 @@ class DocumentParsingApp(MayanAppConfig):
|
|||||||
)
|
)
|
||||||
|
|
||||||
document_search.add_model_field(
|
document_search.add_model_field(
|
||||||
field='versions__pages__content__content', label=_('Content')
|
field='pages__content__content', label=_('Content')
|
||||||
)
|
)
|
||||||
|
|
||||||
document_page_search.add_model_field(
|
document_page_search.add_model_field(
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ from django.utils.translation import ugettext_lazy as _, ugettext
|
|||||||
|
|
||||||
from mayan.apps.common.widgets import TextAreaDiv
|
from mayan.apps.common.widgets import TextAreaDiv
|
||||||
|
|
||||||
from .models import DocumentPageContent
|
from .models import DocumentVersionPageContent
|
||||||
|
|
||||||
|
|
||||||
class DocumentContentForm(forms.Form):
|
class DocumentContentForm(forms.Form):
|
||||||
@@ -29,7 +29,7 @@ class DocumentContentForm(forms.Form):
|
|||||||
for page in document_pages:
|
for page in document_pages:
|
||||||
try:
|
try:
|
||||||
page_content = page.content.content
|
page_content = page.content.content
|
||||||
except DocumentPageContent.DoesNotExist:
|
except DocumentVersionPageContent.DoesNotExist:
|
||||||
pass
|
pass
|
||||||
else:
|
else:
|
||||||
content.append(conditional_escape(force_text(page_content)))
|
content.append(conditional_escape(force_text(page_content)))
|
||||||
@@ -73,7 +73,7 @@ class DocumentPageContentForm(forms.Form):
|
|||||||
|
|
||||||
try:
|
try:
|
||||||
page_content = document_page.content.content
|
page_content = document_page.content.content
|
||||||
except DocumentPageContent.DoesNotExist:
|
except DocumentVersionPageContent.DoesNotExist:
|
||||||
pass
|
pass
|
||||||
else:
|
else:
|
||||||
content = conditional_escape(force_text(page_content))
|
content = conditional_escape(force_text(page_content))
|
||||||
|
|||||||
@@ -0,0 +1,28 @@
|
|||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
import django.db.models.deletion
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
dependencies = [
|
||||||
|
('document_parsing', '0004_auto_20180917_0645'),
|
||||||
|
('documents', '0052_rename_document_page'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.RenameModel(
|
||||||
|
'DocumentPageContent', 'DocumentVersionPageContent'
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='documentversionpagecontent',
|
||||||
|
name='document_page',
|
||||||
|
field=models.OneToOneField(
|
||||||
|
on_delete=django.db.models.deletion.CASCADE,
|
||||||
|
name='document_version_page',
|
||||||
|
related_name='content',
|
||||||
|
to='documents.DocumentVersionPage',
|
||||||
|
verbose_name='Document version page'
|
||||||
|
),
|
||||||
|
),
|
||||||
|
]
|
||||||
@@ -5,20 +5,20 @@ from django.utils.encoding import force_text, python_2_unicode_compatible
|
|||||||
from django.utils.translation import ugettext_lazy as _
|
from django.utils.translation import ugettext_lazy as _
|
||||||
|
|
||||||
from mayan.apps.documents.models import (
|
from mayan.apps.documents.models import (
|
||||||
DocumentPage, DocumentType, DocumentVersion
|
DocumentPage, DocumentType, DocumentVersion, DocumentVersionPage
|
||||||
)
|
)
|
||||||
|
|
||||||
from .managers import DocumentPageContentManager, DocumentTypeSettingsManager
|
from .managers import DocumentPageContentManager, DocumentTypeSettingsManager
|
||||||
|
|
||||||
|
|
||||||
@python_2_unicode_compatible
|
@python_2_unicode_compatible
|
||||||
class DocumentPageContent(models.Model):
|
class DocumentVersionPageContent(models.Model):
|
||||||
"""
|
"""
|
||||||
This model store's the parsed content of a document page.
|
This model store's the parsed content of a document page.
|
||||||
"""
|
"""
|
||||||
document_page = models.OneToOneField(
|
document_version_page = models.OneToOneField(
|
||||||
on_delete=models.CASCADE, related_name='content',
|
on_delete=models.CASCADE, related_name='content',
|
||||||
to=DocumentPage, verbose_name=_('Document page')
|
to=DocumentVersionPage, verbose_name=_('Document version page')
|
||||||
)
|
)
|
||||||
content = models.TextField(
|
content = models.TextField(
|
||||||
blank=True, help_text=_(
|
blank=True, help_text=_(
|
||||||
@@ -30,8 +30,8 @@ class DocumentPageContent(models.Model):
|
|||||||
objects = DocumentPageContentManager()
|
objects = DocumentPageContentManager()
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
verbose_name = _('Document page content')
|
verbose_name = _('Document version page content')
|
||||||
verbose_name_plural = _('Document pages contents')
|
verbose_name_plural = _('Document version pages contents')
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return force_text(self.document_page)
|
return force_text(self.document_page)
|
||||||
|
|||||||
@@ -2,10 +2,10 @@ from __future__ import unicode_literals
|
|||||||
|
|
||||||
from rest_framework import serializers
|
from rest_framework import serializers
|
||||||
|
|
||||||
from .models import DocumentPageContent
|
from .models import DocumentVersionPageContent
|
||||||
|
|
||||||
|
|
||||||
class DocumentPageContentSerializer(serializers.ModelSerializer):
|
class DocumentPageContentSerializer(serializers.ModelSerializer):
|
||||||
class Meta:
|
class Meta:
|
||||||
fields = ('content',)
|
fields = ('content',)
|
||||||
model = DocumentPageContent
|
model = DocumentVersionPageContent
|
||||||
|
|||||||
@@ -7,7 +7,9 @@ from .views import (
|
|||||||
DocumentContentView, DocumentContentDeleteView,
|
DocumentContentView, DocumentContentDeleteView,
|
||||||
DocumentContentDownloadView, DocumentPageContentView,
|
DocumentContentDownloadView, DocumentPageContentView,
|
||||||
DocumentParsingErrorsListView, DocumentSubmitView,
|
DocumentParsingErrorsListView, DocumentSubmitView,
|
||||||
DocumentTypeSettingsEditView, DocumentTypeSubmitView, ParseErrorListView
|
DocumentTypeSettingsEditView, DocumentTypeSubmitView,
|
||||||
|
DocumentVersionPageContentView,
|
||||||
|
ParseErrorListView
|
||||||
)
|
)
|
||||||
|
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
@@ -34,6 +36,11 @@ urlpatterns = [
|
|||||||
regex=r'^documents/pages/(?P<pk>\d+)/content/$',
|
regex=r'^documents/pages/(?P<pk>\d+)/content/$',
|
||||||
view=DocumentPageContentView.as_view(), name='document_page_content'
|
view=DocumentPageContentView.as_view(), name='document_page_content'
|
||||||
),
|
),
|
||||||
|
url(
|
||||||
|
regex=r'^documents/versions/pages/(?P<pk>\d+)/content/$',
|
||||||
|
view=DocumentVersionPageContentView.as_view(),
|
||||||
|
name='document_version_page_content'
|
||||||
|
),
|
||||||
url(
|
url(
|
||||||
regex=r'^documents/(?P<pk>\d+)/submit/$',
|
regex=r'^documents/(?P<pk>\d+)/submit/$',
|
||||||
view=DocumentSubmitView.as_view(), name='document_submit'
|
view=DocumentSubmitView.as_view(), name='document_submit'
|
||||||
|
|||||||
@@ -13,11 +13,11 @@ from mayan.apps.common.generics import (
|
|||||||
from mayan.apps.common.mixins import ExternalObjectMixin
|
from mayan.apps.common.mixins import ExternalObjectMixin
|
||||||
from mayan.apps.documents.forms import DocumentTypeFilteredSelectForm
|
from mayan.apps.documents.forms import DocumentTypeFilteredSelectForm
|
||||||
from mayan.apps.documents.models import (
|
from mayan.apps.documents.models import (
|
||||||
Document, DocumentType, DocumentVersionPage
|
Document, DocumentPage, DocumentType, DocumentVersionPage
|
||||||
)
|
)
|
||||||
|
|
||||||
from .forms import DocumentContentForm, DocumentPageContentForm
|
from .forms import DocumentContentForm, DocumentPageContentForm
|
||||||
from .models import DocumentPageContent, DocumentVersionParseError
|
from .models import DocumentVersionPageContent, DocumentVersionParseError
|
||||||
from .permissions import (
|
from .permissions import (
|
||||||
permission_content_view, permission_document_type_parsing_setup,
|
permission_content_view, permission_document_type_parsing_setup,
|
||||||
permission_parse_document
|
permission_parse_document
|
||||||
@@ -48,7 +48,7 @@ class DocumentContentDeleteView(MultipleObjectConfirmActionView):
|
|||||||
return result
|
return result
|
||||||
|
|
||||||
def object_action(self, form, instance):
|
def object_action(self, form, instance):
|
||||||
DocumentPageContent.objects.delete_content_for(
|
DocumentVersionPageContent.objects.delete_content_for(
|
||||||
document=instance, user=self.request.user
|
document=instance, user=self.request.user
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -89,7 +89,7 @@ class DocumentContentDownloadView(SingleObjectDownloadView):
|
|||||||
|
|
||||||
class DocumentPageContentView(SingleObjectDetailView):
|
class DocumentPageContentView(SingleObjectDetailView):
|
||||||
form_class = DocumentPageContentForm
|
form_class = DocumentPageContentForm
|
||||||
model = DocumentVersionPage
|
model = DocumentPage
|
||||||
object_permission = permission_content_view
|
object_permission = permission_content_view
|
||||||
|
|
||||||
def dispatch(self, request, *args, **kwargs):
|
def dispatch(self, request, *args, **kwargs):
|
||||||
@@ -109,6 +109,30 @@ class DocumentPageContentView(SingleObjectDetailView):
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
class DocumentVersionPageContentView(SingleObjectDetailView):
|
||||||
|
form_class = DocumentPageContentForm
|
||||||
|
model = DocumentVersionPage
|
||||||
|
object_permission = permission_content_view
|
||||||
|
|
||||||
|
def dispatch(self, request, *args, **kwargs):
|
||||||
|
result = super(DocumentPageContentView, self).dispatch(
|
||||||
|
request, *args, **kwargs
|
||||||
|
)
|
||||||
|
self.get_object().document.add_as_recent_document_for_user(
|
||||||
|
request.user
|
||||||
|
)
|
||||||
|
return result
|
||||||
|
|
||||||
|
def get_extra_context(self):
|
||||||
|
return {
|
||||||
|
'hide_labels': True,
|
||||||
|
'object': self.get_object(),
|
||||||
|
'title': _(
|
||||||
|
'Content for document version page: %s'
|
||||||
|
) % self.get_object(),
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
class DocumentParsingErrorsListView(SingleObjectListView):
|
class DocumentParsingErrorsListView(SingleObjectListView):
|
||||||
view_permission = permission_content_view
|
view_permission = permission_content_view
|
||||||
|
|
||||||
|
|||||||
@@ -127,6 +127,7 @@ class DocumentsApp(MayanAppConfig):
|
|||||||
DocumentType = self.get_model(model_name='DocumentType')
|
DocumentType = self.get_model(model_name='DocumentType')
|
||||||
DocumentTypeFilename = self.get_model(model_name='DocumentTypeFilename')
|
DocumentTypeFilename = self.get_model(model_name='DocumentTypeFilename')
|
||||||
DocumentVersion = self.get_model(model_name='DocumentVersion')
|
DocumentVersion = self.get_model(model_name='DocumentVersion')
|
||||||
|
DocumentVersionPage = self.get_model(model_name='DocumentVersionPage')
|
||||||
DuplicatedDocument = self.get_model(model_name='DuplicatedDocument')
|
DuplicatedDocument = self.get_model(model_name='DuplicatedDocument')
|
||||||
|
|
||||||
DynamicSerializerField.add_serializer(
|
DynamicSerializerField.add_serializer(
|
||||||
@@ -228,7 +229,7 @@ class DocumentsApp(MayanAppConfig):
|
|||||||
model=Document, manager_name='passthrough'
|
model=Document, manager_name='passthrough'
|
||||||
)
|
)
|
||||||
ModelPermission.register_inheritance(
|
ModelPermission.register_inheritance(
|
||||||
model=DocumentPage, related='document_version__document',
|
model=DocumentPage, related='document',
|
||||||
)
|
)
|
||||||
ModelPermission.register_manager(
|
ModelPermission.register_manager(
|
||||||
model=DocumentPage, manager_name='passthrough'
|
model=DocumentPage, manager_name='passthrough'
|
||||||
@@ -245,6 +246,9 @@ class DocumentsApp(MayanAppConfig):
|
|||||||
ModelPermission.register_inheritance(
|
ModelPermission.register_inheritance(
|
||||||
model=DocumentVersion, related='document',
|
model=DocumentVersion, related='document',
|
||||||
)
|
)
|
||||||
|
ModelPermission.register_inheritance(
|
||||||
|
model=DocumentVersionPage, related='document_version',
|
||||||
|
)
|
||||||
|
|
||||||
# Document and document page thumbnail widget
|
# Document and document page thumbnail widget
|
||||||
document_page_thumbnail_widget = DocumentPageThumbnailWidget()
|
document_page_thumbnail_widget = DocumentPageThumbnailWidget()
|
||||||
|
|||||||
@@ -5,7 +5,6 @@ import django.db.models.deletion
|
|||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
dependencies = [
|
dependencies = [
|
||||||
('documents', '0051_documentpage_enabled'),
|
('documents', '0051_documentpage_enabled'),
|
||||||
]
|
]
|
||||||
@@ -20,8 +19,20 @@ class Migration(migrations.Migration):
|
|||||||
name='document_version',
|
name='document_version',
|
||||||
field=models.ForeignKey(
|
field=models.ForeignKey(
|
||||||
on_delete=django.db.models.deletion.CASCADE,
|
on_delete=django.db.models.deletion.CASCADE,
|
||||||
related_name='version_pages', to='documents.DocumentVersion',
|
related_name='pages', to='documents.DocumentVersion',
|
||||||
verbose_name='Document version'
|
verbose_name='Document version'
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name='documentversionpage',
|
||||||
|
name='enabled',
|
||||||
|
),
|
||||||
|
migrations.AlterModelOptions(
|
||||||
|
name='documentversionpage',
|
||||||
|
options={
|
||||||
|
'ordering': ('page_number',),
|
||||||
|
'verbose_name': 'Document version page',
|
||||||
|
'verbose_name_plural': 'Document version pages'
|
||||||
|
},
|
||||||
|
),
|
||||||
]
|
]
|
||||||
@@ -1,27 +0,0 @@
|
|||||||
from __future__ import unicode_literals
|
|
||||||
|
|
||||||
from django.db import migrations
|
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
|
||||||
dependencies = [
|
|
||||||
('documents', '0052_auto_20191007_1921'),
|
|
||||||
('ocr', '0008_auto_20180917_0646'),
|
|
||||||
('document_parsing', '0004_auto_20180917_0645'),
|
|
||||||
]
|
|
||||||
|
|
||||||
operations = [
|
|
||||||
migrations.CreateModel(
|
|
||||||
name='DocumentPageResult',
|
|
||||||
fields=[
|
|
||||||
],
|
|
||||||
options={
|
|
||||||
'verbose_name': 'Document version page',
|
|
||||||
'verbose_name_plural': 'Document version pages',
|
|
||||||
'ordering': ('document_version__document', 'page_number'),
|
|
||||||
'proxy': True,
|
|
||||||
'indexes': [],
|
|
||||||
},
|
|
||||||
bases=('documents.documentversionpage',),
|
|
||||||
),
|
|
||||||
]
|
|
||||||
@@ -1,5 +1,3 @@
|
|||||||
# -*- coding: utf-8 -*-
|
|
||||||
# Generated by Django 1.11.22 on 2019-10-08 21:16
|
|
||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
from django.db import migrations, models
|
from django.db import migrations, models
|
||||||
@@ -7,10 +5,9 @@ import django.db.models.deletion
|
|||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
dependencies = [
|
dependencies = [
|
||||||
('contenttypes', '0002_remove_content_type_name'),
|
('contenttypes', '0002_remove_content_type_name'),
|
||||||
('documents', '0054_auto_20191008_1522'),
|
('documents', '0052_rename_document_page'),
|
||||||
]
|
]
|
||||||
|
|
||||||
operations = [
|
operations = [
|
||||||
@@ -25,22 +22,36 @@ class Migration(migrations.Migration):
|
|||||||
('document', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='pages', to='documents.Document', verbose_name='Document')),
|
('document', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='pages', to='documents.Document', verbose_name='Document')),
|
||||||
],
|
],
|
||||||
options={
|
options={
|
||||||
|
'unique_together': set([('document', 'page_number')]),
|
||||||
'verbose_name': 'Document page',
|
'verbose_name': 'Document page',
|
||||||
'verbose_name_plural': 'Document pages',
|
'verbose_name_plural': 'Document pages',
|
||||||
'ordering': ('page_number',),
|
'ordering': ('page_number',),
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
migrations.AlterModelOptions(
|
migrations.CreateModel(
|
||||||
name='documentversionpage',
|
name='DocumentPageResult',
|
||||||
options={'ordering': ('page_number',), 'verbose_name': 'Document version page', 'verbose_name_plural': 'Document version pages'},
|
fields=[
|
||||||
|
],
|
||||||
|
options={
|
||||||
|
'verbose_name': 'Document page result',
|
||||||
|
'verbose_name_plural': 'Document pages result',
|
||||||
|
'ordering': ('document', 'page_number'),
|
||||||
|
'proxy': True,
|
||||||
|
'indexes': [],
|
||||||
|
},
|
||||||
|
bases=('documents.documentpage',),
|
||||||
),
|
),
|
||||||
migrations.AlterField(
|
migrations.CreateModel(
|
||||||
model_name='documentversionpage',
|
name='DocumentVersionPageResult',
|
||||||
name='document_version',
|
fields=[
|
||||||
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='pages', to='documents.DocumentVersion', verbose_name='Document version'),
|
],
|
||||||
),
|
options={
|
||||||
migrations.AlterUniqueTogether(
|
'verbose_name': 'Document version page',
|
||||||
name='documentpage',
|
'verbose_name_plural': 'Document version pages',
|
||||||
unique_together=set([('document', 'page_number')]),
|
'ordering': ('document_version__document', 'page_number'),
|
||||||
|
'proxy': True,
|
||||||
|
'indexes': [],
|
||||||
|
},
|
||||||
|
bases=('documents.documentversionpage',),
|
||||||
),
|
),
|
||||||
]
|
]
|
||||||
@@ -1,31 +0,0 @@
|
|||||||
# -*- coding: utf-8 -*-
|
|
||||||
# Generated by Django 1.11.22 on 2019-10-08 15:22
|
|
||||||
from __future__ import unicode_literals
|
|
||||||
|
|
||||||
from django.db import migrations
|
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
|
||||||
|
|
||||||
dependencies = [
|
|
||||||
('documents', '0053_auto_20191007_1922'),
|
|
||||||
]
|
|
||||||
|
|
||||||
operations = [
|
|
||||||
migrations.DeleteModel(
|
|
||||||
name='DocumentPageResult',
|
|
||||||
),
|
|
||||||
migrations.CreateModel(
|
|
||||||
name='DocumentVersionPageResult',
|
|
||||||
fields=[
|
|
||||||
],
|
|
||||||
options={
|
|
||||||
'verbose_name': 'Document version page',
|
|
||||||
'verbose_name_plural': 'Document version pages',
|
|
||||||
'ordering': ('document_version__document', 'page_number'),
|
|
||||||
'proxy': True,
|
|
||||||
'indexes': [],
|
|
||||||
},
|
|
||||||
bases=('documents.documentversionpage',),
|
|
||||||
),
|
|
||||||
]
|
|
||||||
62
mayan/apps/documents/migrations/0054_reset_document_pages.py
Normal file
62
mayan/apps/documents/migrations/0054_reset_document_pages.py
Normal file
@@ -0,0 +1,62 @@
|
|||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
from django.db import migrations
|
||||||
|
|
||||||
|
|
||||||
|
def get_latest_version(document):
|
||||||
|
return document.versions.order_by('timestamp').last()
|
||||||
|
|
||||||
|
|
||||||
|
def operation_reset_document_pages(apps, schema_editor):
|
||||||
|
Document = apps.get_model(app_label='documents', model_name='Document')
|
||||||
|
DocumentPage = apps.get_model(
|
||||||
|
app_label='documents', model_name='DocumentPage'
|
||||||
|
)
|
||||||
|
|
||||||
|
# Define inside the function to use the migration's apps instance
|
||||||
|
def pages_reset(document):
|
||||||
|
ContentType = apps.get_model('contenttypes', 'ContentType')
|
||||||
|
DocumentVersionPage = apps.get_model(
|
||||||
|
app_label='documents', model_name='DocumentVersionPage'
|
||||||
|
)
|
||||||
|
|
||||||
|
content_type = ContentType.objects.get_for_model(
|
||||||
|
model=DocumentVersionPage
|
||||||
|
)
|
||||||
|
|
||||||
|
for document_page in document.pages.all():
|
||||||
|
document_page.delete()
|
||||||
|
|
||||||
|
for version_page in get_latest_version(document=document).pages.all():
|
||||||
|
document_page = document.pages.create(
|
||||||
|
content_type=content_type,
|
||||||
|
page_number=version_page.page_number,
|
||||||
|
object_id=version_page.pk,
|
||||||
|
)
|
||||||
|
|
||||||
|
for document in Document.objects.using(schema_editor.connection.alias).all():
|
||||||
|
pages_reset(document=document)
|
||||||
|
|
||||||
|
|
||||||
|
def operation_reset_document_pages_reverse(apps, schema_editor):
|
||||||
|
Document = apps.get_model(app_label='documents', model_name='Document')
|
||||||
|
DocumentPage = apps.get_model(
|
||||||
|
app_label='documents', model_name='DocumentPage'
|
||||||
|
)
|
||||||
|
|
||||||
|
for document in Document.objects.using(schema_editor.connection.alias).all():
|
||||||
|
for document_page in document.pages.all():
|
||||||
|
document_page.delete()
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
dependencies = [
|
||||||
|
('documents', '0053_create_document_page_and_result_models'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.RunPython(
|
||||||
|
code=operation_reset_document_pages,
|
||||||
|
reverse_code=operation_reset_document_pages_reverse
|
||||||
|
),
|
||||||
|
]
|
||||||
@@ -116,6 +116,14 @@ class Document(models.Model):
|
|||||||
)
|
)
|
||||||
return partition
|
return partition
|
||||||
|
|
||||||
|
@property
|
||||||
|
def checksum(self):
|
||||||
|
return self.latest_version.checksum
|
||||||
|
|
||||||
|
@property
|
||||||
|
def date_updated(self):
|
||||||
|
return self.latest_version.timestamp
|
||||||
|
|
||||||
def delete(self, *args, **kwargs):
|
def delete(self, *args, **kwargs):
|
||||||
to_trash = kwargs.pop('to_trash', True)
|
to_trash = kwargs.pop('to_trash', True)
|
||||||
|
|
||||||
@@ -140,6 +148,14 @@ class Document(models.Model):
|
|||||||
else:
|
else:
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
@property
|
||||||
|
def file_mime_encoding(self):
|
||||||
|
return self.latest_version.encoding
|
||||||
|
|
||||||
|
@property
|
||||||
|
def file_mimetype(self):
|
||||||
|
return self.latest_version.mimetype
|
||||||
|
|
||||||
def get_absolute_url(self):
|
def get_absolute_url(self):
|
||||||
return reverse(
|
return reverse(
|
||||||
viewname='documents:document_preview', kwargs={'pk': self.pk}
|
viewname='documents:document_preview', kwargs={'pk': self.pk}
|
||||||
@@ -154,6 +170,10 @@ class Document(models.Model):
|
|||||||
def is_in_trash(self):
|
def is_in_trash(self):
|
||||||
return self.in_trash
|
return self.in_trash
|
||||||
|
|
||||||
|
@property
|
||||||
|
def latest_version(self):
|
||||||
|
return self.versions.order_by('timestamp').last()
|
||||||
|
|
||||||
def natural_key(self):
|
def natural_key(self):
|
||||||
return (self.uuid,)
|
return (self.uuid,)
|
||||||
natural_key.dependencies = ['documents.DocumentType']
|
natural_key.dependencies = ['documents.DocumentType']
|
||||||
@@ -171,8 +191,6 @@ class Document(models.Model):
|
|||||||
|
|
||||||
logger.info('New document version queued for document: %s', self)
|
logger.info('New document version queued for document: %s', self)
|
||||||
|
|
||||||
self.reset_pages(update_page_count=False)
|
|
||||||
|
|
||||||
return document_version
|
return document_version
|
||||||
|
|
||||||
def open(self, *args, **kwargs):
|
def open(self, *args, **kwargs):
|
||||||
@@ -197,7 +215,7 @@ class Document(models.Model):
|
|||||||
)
|
)
|
||||||
return DocumentPage.passthrough.filter(document=self)
|
return DocumentPage.passthrough.filter(document=self)
|
||||||
|
|
||||||
def reset_pages(self, update_page_count=True):
|
def pages_reset(self, update_page_count=True):
|
||||||
with transaction.atomic():
|
with transaction.atomic():
|
||||||
for page in self.pages.all():
|
for page in self.pages.all():
|
||||||
page.delete()
|
page.delete()
|
||||||
@@ -254,25 +272,3 @@ class Document(models.Model):
|
|||||||
@property
|
@property
|
||||||
def size(self):
|
def size(self):
|
||||||
return self.latest_version.size
|
return self.latest_version.size
|
||||||
|
|
||||||
# Compatibility methods
|
|
||||||
|
|
||||||
@property
|
|
||||||
def checksum(self):
|
|
||||||
return self.latest_version.checksum
|
|
||||||
|
|
||||||
@property
|
|
||||||
def date_updated(self):
|
|
||||||
return self.latest_version.timestamp
|
|
||||||
|
|
||||||
@property
|
|
||||||
def file_mime_encoding(self):
|
|
||||||
return self.latest_version.encoding
|
|
||||||
|
|
||||||
@property
|
|
||||||
def file_mimetype(self):
|
|
||||||
return self.latest_version.mimetype
|
|
||||||
|
|
||||||
@property
|
|
||||||
def latest_version(self):
|
|
||||||
return self.versions.order_by('timestamp').last()
|
|
||||||
|
|||||||
@@ -29,9 +29,8 @@ from ..settings import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
from .document_models import Document
|
from .document_models import Document
|
||||||
#from .document_version_page_models import DocumentVersionPage
|
|
||||||
|
|
||||||
__all__ = ('DocumentPage',)# 'DocumentPageResult')
|
__all__ = ('DocumentPage', 'DocumentPageResult')
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
@@ -301,9 +300,9 @@ class DocumentPage(models.Model):
|
|||||||
return '{}-{}'.format(self.document.uuid, self.pk)
|
return '{}-{}'.format(self.document.uuid, self.pk)
|
||||||
|
|
||||||
|
|
||||||
#class DocumentVersionPageResult(DocumentVersionPage):
|
class DocumentPageResult(DocumentPage):
|
||||||
# class Meta:
|
class Meta:
|
||||||
# ordering = ('document_version__document', 'page_number')
|
ordering = ('document', 'page_number')
|
||||||
# proxy = True
|
proxy = True
|
||||||
# verbose_name = _('Document version page')
|
verbose_name = _('Document page result')
|
||||||
# verbose_name_plural = _('Document version pages')
|
verbose_name_plural = _('Document pages result')
|
||||||
|
|||||||
@@ -246,12 +246,12 @@ class DocumentVersion(models.Model):
|
|||||||
|
|
||||||
return result
|
return result
|
||||||
|
|
||||||
@property
|
#@property
|
||||||
def page_count(self):
|
#def page_count(self):
|
||||||
"""
|
# """
|
||||||
The number of pages that the document posses.
|
# The number of pages that the document posses.
|
||||||
"""
|
# """
|
||||||
return self.pages.count()
|
# return self.pages.count()
|
||||||
|
|
||||||
def revert(self, _user=None):
|
def revert(self, _user=None):
|
||||||
"""
|
"""
|
||||||
@@ -326,6 +326,8 @@ class DocumentVersion(models.Model):
|
|||||||
sender=Document, instance=self.document
|
sender=Document, instance=self.document
|
||||||
)
|
)
|
||||||
|
|
||||||
|
self.document.pages_reset(update_page_count=False)
|
||||||
|
|
||||||
def save_to_file(self, file_object):
|
def save_to_file(self, file_object):
|
||||||
"""
|
"""
|
||||||
Save a copy of the document from the document storage backend
|
Save a copy of the document from the document storage backend
|
||||||
|
|||||||
@@ -41,14 +41,12 @@ class DocumentVersionPage(models.Model):
|
|||||||
on_delete=models.CASCADE, related_name='pages', to=DocumentVersion,
|
on_delete=models.CASCADE, related_name='pages', to=DocumentVersion,
|
||||||
verbose_name=_('Document version')
|
verbose_name=_('Document version')
|
||||||
)
|
)
|
||||||
enabled = models.BooleanField(default=True, verbose_name=_('Enabled'))
|
|
||||||
page_number = models.PositiveIntegerField(
|
page_number = models.PositiveIntegerField(
|
||||||
db_index=True, default=1, editable=False,
|
db_index=True, default=1, editable=False,
|
||||||
verbose_name=_('Page number')
|
verbose_name=_('Page number')
|
||||||
)
|
)
|
||||||
|
|
||||||
objects = DocumentVersionPageManager()
|
objects = DocumentVersionPageManager()
|
||||||
#passthrough = models.Manager()
|
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
ordering = ('page_number',)
|
ordering = ('page_number',)
|
||||||
@@ -261,11 +259,11 @@ class DocumentVersionPage(models.Model):
|
|||||||
return (self.page_number, self.document_version.natural_key())
|
return (self.page_number, self.document_version.natural_key())
|
||||||
natural_key.dependencies = ['documents.DocumentVersion']
|
natural_key.dependencies = ['documents.DocumentVersion']
|
||||||
|
|
||||||
#@property
|
@property
|
||||||
#def siblings(self):
|
def siblings(self):
|
||||||
# return DocumentVersionPage.objects.filter(
|
return DocumentVersionPage.objects.filter(
|
||||||
# document_version=self.document_version
|
document_version=self.document_version
|
||||||
# )
|
)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def uuid(self):
|
def uuid(self):
|
||||||
|
|||||||
@@ -71,7 +71,7 @@ queue_tools.add_task_type(
|
|||||||
)
|
)
|
||||||
|
|
||||||
queue_uploads.add_task_type(
|
queue_uploads.add_task_type(
|
||||||
dotted_path='mayan.apps.documents.tasks.task_document_reset_pages',
|
dotted_path='mayan.apps.documents.tasks.task_document_pages_reset',
|
||||||
label=_('Reset document pages')
|
label=_('Reset document pages')
|
||||||
)
|
)
|
||||||
queue_uploads.add_task_type(
|
queue_uploads.add_task_type(
|
||||||
|
|||||||
@@ -17,12 +17,20 @@ def transformation_format_uuid(term_string):
|
|||||||
return term_string
|
return term_string
|
||||||
|
|
||||||
|
|
||||||
def get_queryset_page_search_queryset():
|
def get_queryset_document_page_search_queryset():
|
||||||
# Ignore documents in trash can
|
# Ignore documents in trash can
|
||||||
DocumentPage = apps.get_model(
|
DocumentPage = apps.get_model(
|
||||||
|
app_label='documents', model_name='DocumentPage'
|
||||||
|
)
|
||||||
|
return DocumentPage.objects.filter(document__in_trash=False)
|
||||||
|
|
||||||
|
|
||||||
|
def get_queryset_document_version_page_search_queryset():
|
||||||
|
# Ignore documents in trash can
|
||||||
|
DocumentVersionPage = apps.get_model(
|
||||||
app_label='documents', model_name='DocumentVersionPage'
|
app_label='documents', model_name='DocumentVersionPage'
|
||||||
)
|
)
|
||||||
return DocumentPage.objects.filter(document_version__document__in_trash=False)
|
return DocumentVersionPage.objects.filter(document_version__document__in_trash=False)
|
||||||
|
|
||||||
|
|
||||||
document_search = SearchModel(
|
document_search = SearchModel(
|
||||||
@@ -49,25 +57,50 @@ document_search.add_model_field(
|
|||||||
|
|
||||||
document_page_search = SearchModel(
|
document_page_search = SearchModel(
|
||||||
app_label='documents', list_mode=LIST_MODE_CHOICE_ITEM,
|
app_label='documents', list_mode=LIST_MODE_CHOICE_ITEM,
|
||||||
model_name='DocumentVersionPage', permission=permission_document_view,
|
model_name='DocumentPage', permission=permission_document_view,
|
||||||
queryset=get_queryset_page_search_queryset,
|
queryset=get_queryset_document_page_search_queryset,
|
||||||
serializer_path='mayan.apps.documents.serializers.DocumentPageSerializer'
|
serializer_path='mayan.apps.documents.serializers.DocumentPageSerializer'
|
||||||
)
|
)
|
||||||
|
|
||||||
|
document_version_page_search = SearchModel(
|
||||||
|
app_label='documents', list_mode=LIST_MODE_CHOICE_ITEM,
|
||||||
|
model_name='DocumentVersionPage', permission=permission_document_view,
|
||||||
|
queryset=get_queryset_document_version_page_search_queryset,
|
||||||
|
serializer_path='mayan.apps.documents.serializers.DocumentPageVersionSerializer'
|
||||||
|
)
|
||||||
|
|
||||||
document_page_search.add_model_field(
|
document_page_search.add_model_field(
|
||||||
field='document_version__document__document_type__label',
|
field='document__document_type__label',
|
||||||
label=_('Document type')
|
label=_('Document type')
|
||||||
)
|
)
|
||||||
document_page_search.add_model_field(
|
document_page_search.add_model_field(
|
||||||
field='document_version__document__versions__mimetype',
|
field='document__versions__mimetype',
|
||||||
label=_('MIME type')
|
label=_('MIME type')
|
||||||
)
|
)
|
||||||
document_page_search.add_model_field(
|
document_page_search.add_model_field(
|
||||||
|
field='document__label', label=_('Label')
|
||||||
|
)
|
||||||
|
document_page_search.add_model_field(
|
||||||
|
field='document__description', label=_('Description')
|
||||||
|
)
|
||||||
|
document_page_search.add_model_field(
|
||||||
|
field='document__document_version__checksum', label=_('Checksum')
|
||||||
|
)
|
||||||
|
|
||||||
|
document_version_page_search.add_model_field(
|
||||||
|
field='document_version__document__document_type__label',
|
||||||
|
label=_('Document type')
|
||||||
|
)
|
||||||
|
document_version_page_search.add_model_field(
|
||||||
|
field='document_version__document__versions__mimetype',
|
||||||
|
label=_('MIME type')
|
||||||
|
)
|
||||||
|
document_version_page_search.add_model_field(
|
||||||
field='document_version__document__label', label=_('Label')
|
field='document_version__document__label', label=_('Label')
|
||||||
)
|
)
|
||||||
document_page_search.add_model_field(
|
document_version_page_search.add_model_field(
|
||||||
field='document_version__document__description', label=_('Description')
|
field='document_version__document__description', label=_('Description')
|
||||||
)
|
)
|
||||||
document_page_search.add_model_field(
|
document_version_page_search.add_model_field(
|
||||||
field='document_version__checksum', label=_('Checksum')
|
field='document_version__checksum', label=_('Checksum')
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -66,7 +66,7 @@ def task_delete_stubs():
|
|||||||
|
|
||||||
|
|
||||||
@app.task(bind=True, default_retry_delay=RETRY_DELAY_DOCUMENT_RESET_PAGES, ignore_result=True)
|
@app.task(bind=True, default_retry_delay=RETRY_DELAY_DOCUMENT_RESET_PAGES, ignore_result=True)
|
||||||
def task_document_reset_pages(self, document_id):
|
def task_document_pages_reset(self, document_id):
|
||||||
Document = apps.get_model(
|
Document = apps.get_model(
|
||||||
app_label='documents', model_name='Document'
|
app_label='documents', model_name='Document'
|
||||||
)
|
)
|
||||||
@@ -74,7 +74,7 @@ def task_document_reset_pages(self, document_id):
|
|||||||
document = Document.objects.get(pk=document_id)
|
document = Document.objects.get(pk=document_id)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
document.reset_pages()
|
document.pages_reset()
|
||||||
except OperationalError as exception:
|
except OperationalError as exception:
|
||||||
logger.warning(
|
logger.warning(
|
||||||
'Operational error during attempt to reset pages for '
|
'Operational error during attempt to reset pages for '
|
||||||
|
|||||||
@@ -70,6 +70,7 @@ class DocumentTestMixin(object):
|
|||||||
self.test_document = document
|
self.test_document = document
|
||||||
self.test_documents.append(document)
|
self.test_documents.append(document)
|
||||||
self.test_document_version = document.latest_version
|
self.test_document_version = document.latest_version
|
||||||
|
self.test_document_page = document.pages_all.first()
|
||||||
|
|
||||||
|
|
||||||
class DocumentTypeViewTestMixin(object):
|
class DocumentTypeViewTestMixin(object):
|
||||||
@@ -264,4 +265,3 @@ class DocumentViewTestMixin(object):
|
|||||||
|
|
||||||
def _request_empty_trash_view(self):
|
def _request_empty_trash_view(self):
|
||||||
return self.post(viewname='documents:trash_can_empty')
|
return self.post(viewname='documents:trash_can_empty')
|
||||||
|
|
||||||
|
|||||||
@@ -530,8 +530,7 @@ class DocumentPageAPIViewTestMixin(object):
|
|||||||
page = self.test_document.pages.first()
|
page = self.test_document.pages.first()
|
||||||
return self.get(
|
return self.get(
|
||||||
viewname='rest_api:documentpage-image', kwargs={
|
viewname='rest_api:documentpage-image', kwargs={
|
||||||
'pk': page.document.pk, 'version_pk': page.document_version.pk,
|
'pk': page.document.pk, 'page_pk': page.pk
|
||||||
'page_pk': page.pk
|
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -552,6 +551,33 @@ class DocumentPageAPIViewTestCase(
|
|||||||
self.assertEqual(response.status_code, status.HTTP_200_OK)
|
self.assertEqual(response.status_code, status.HTTP_200_OK)
|
||||||
|
|
||||||
|
|
||||||
|
class DocumentVersionPageAPIViewTestMixin(object):
|
||||||
|
def _request_document_version_page_image(self):
|
||||||
|
page = self.test_document_version.pages.first()
|
||||||
|
return self.get(
|
||||||
|
viewname='rest_api:documentversionpage-image', kwargs={
|
||||||
|
'pk': page.document.pk, 'version_pk': page.document_version.pk,
|
||||||
|
'page_pk': page.pk
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class DocumentVersionPageAPIViewTestCase(
|
||||||
|
DocumentVersionPageAPIViewTestMixin, DocumentTestMixin, BaseAPITestCase
|
||||||
|
):
|
||||||
|
def test_document_version_page_api_image_view_no_access(self):
|
||||||
|
response = self._request_document_version_page_image()
|
||||||
|
self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)
|
||||||
|
|
||||||
|
def test_document_version_page_api_image_view_with_access(self):
|
||||||
|
self.grant_access(
|
||||||
|
obj=self.test_document, permission=permission_document_view
|
||||||
|
)
|
||||||
|
|
||||||
|
response = self._request_document_version_page_image()
|
||||||
|
self.assertEqual(response.status_code, status.HTTP_200_OK)
|
||||||
|
|
||||||
|
|
||||||
class TrashedDocumentAPIViewTestMixin(object):
|
class TrashedDocumentAPIViewTestMixin(object):
|
||||||
def _request_test_document_api_trash_view(self):
|
def _request_test_document_api_trash_view(self):
|
||||||
return self.delete(
|
return self.delete(
|
||||||
@@ -580,7 +606,6 @@ class TrashedDocumentAPIViewTestMixin(object):
|
|||||||
return self.get(
|
return self.get(
|
||||||
viewname='rest_api:documentpage-image', kwargs={
|
viewname='rest_api:documentpage-image', kwargs={
|
||||||
'pk': latest_version.document.pk,
|
'pk': latest_version.document.pk,
|
||||||
'version_pk': latest_version.pk,
|
|
||||||
'page_pk': latest_version.pages.first().pk
|
'page_pk': latest_version.pages.first().pk
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -9,10 +9,10 @@ from ..permissions import (
|
|||||||
from .base import GenericDocumentViewTestCase
|
from .base import GenericDocumentViewTestCase
|
||||||
|
|
||||||
|
|
||||||
class DocumentPageDisableViewTestCase(GenericDocumentViewTestCase):
|
class DocumentPageDisableViewTestMixin(object):
|
||||||
def setUp(self):
|
def _disable_test_document_page(self):
|
||||||
super(DocumentPageDisableViewTestCase, self).setUp()
|
self.test_document_page.enabled = False
|
||||||
self.test_document_page = self.test_document.pages_all.first()
|
self.test_document_page.save()
|
||||||
|
|
||||||
def _request_test_document_page_disable_view(self):
|
def _request_test_document_page_disable_view(self):
|
||||||
return self.post(
|
return self.post(
|
||||||
@@ -21,6 +21,31 @@ class DocumentPageDisableViewTestCase(GenericDocumentViewTestCase):
|
|||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def _request_test_document_page_enable_view(self):
|
||||||
|
return self.post(
|
||||||
|
viewname='documents:document_page_enable', kwargs={
|
||||||
|
'pk': self.test_document_page.pk
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
def _request_test_document_page_multiple_disable_view(self):
|
||||||
|
return self.post(
|
||||||
|
viewname='documents:document_page_multiple_disable', data={
|
||||||
|
'id_list': self.test_document_page.pk
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
def _request_test_document_page_multiple_enable_view(self):
|
||||||
|
return self.post(
|
||||||
|
viewname='documents:document_page_multiple_enable', data={
|
||||||
|
'id_list': self.test_document_page.pk
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class DocumentPageDisableViewTestCase(
|
||||||
|
DocumentPageDisableViewTestMixin, GenericDocumentViewTestCase
|
||||||
|
):
|
||||||
def test_document_page_disable_view_no_permission(self):
|
def test_document_page_disable_view_no_permission(self):
|
||||||
test_document_page_count = self.test_document.pages.count()
|
test_document_page_count = self.test_document.pages.count()
|
||||||
|
|
||||||
@@ -45,13 +70,6 @@ class DocumentPageDisableViewTestCase(GenericDocumentViewTestCase):
|
|||||||
test_document_page_count, self.test_document.pages.count()
|
test_document_page_count, self.test_document.pages.count()
|
||||||
)
|
)
|
||||||
|
|
||||||
def _request_test_document_page_multiple_disable_view(self):
|
|
||||||
return self.post(
|
|
||||||
viewname='documents:document_page_multiple_disable', data={
|
|
||||||
'id_list': self.test_document_page.pk
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
def test_document_page_multiple_disable_view_no_permission(self):
|
def test_document_page_multiple_disable_view_no_permission(self):
|
||||||
test_document_page_count = self.test_document.pages.count()
|
test_document_page_count = self.test_document.pages.count()
|
||||||
|
|
||||||
@@ -76,17 +94,6 @@ class DocumentPageDisableViewTestCase(GenericDocumentViewTestCase):
|
|||||||
test_document_page_count, self.test_document.pages.count()
|
test_document_page_count, self.test_document.pages.count()
|
||||||
)
|
)
|
||||||
|
|
||||||
def _disable_test_document_page(self):
|
|
||||||
self.test_document_page.enabled = False
|
|
||||||
self.test_document_page.save()
|
|
||||||
|
|
||||||
def _request_test_document_page_enable_view(self):
|
|
||||||
return self.post(
|
|
||||||
viewname='documents:document_page_enable', kwargs={
|
|
||||||
'pk': self.test_document_page.pk
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
def test_document_page_enable_view_no_permission(self):
|
def test_document_page_enable_view_no_permission(self):
|
||||||
self._disable_test_document_page()
|
self._disable_test_document_page()
|
||||||
|
|
||||||
@@ -114,13 +121,6 @@ class DocumentPageDisableViewTestCase(GenericDocumentViewTestCase):
|
|||||||
test_document_page_count, self.test_document.pages.count()
|
test_document_page_count, self.test_document.pages.count()
|
||||||
)
|
)
|
||||||
|
|
||||||
def _request_test_document_page_multiple_enable_view(self):
|
|
||||||
return self.post(
|
|
||||||
viewname='documents:document_page_multiple_enable', data={
|
|
||||||
'id_list': self.test_document_page.pk
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
def test_document_page_multiple_enable_view_no_permission(self):
|
def test_document_page_multiple_enable_view_no_permission(self):
|
||||||
self._disable_test_document_page()
|
self._disable_test_document_page()
|
||||||
test_document_page_count = self.test_document.pages.count()
|
test_document_page_count = self.test_document.pages.count()
|
||||||
@@ -148,7 +148,7 @@ class DocumentPageDisableViewTestCase(GenericDocumentViewTestCase):
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
class DocumentPageViewTestCase(GenericDocumentViewTestCase):
|
class DocumentPageViewTestMixin(object):
|
||||||
def _request_test_document_page_list_view(self):
|
def _request_test_document_page_list_view(self):
|
||||||
return self.get(
|
return self.get(
|
||||||
viewname='documents:document_pages', kwargs={
|
viewname='documents:document_pages', kwargs={
|
||||||
@@ -156,6 +156,18 @@ class DocumentPageViewTestCase(GenericDocumentViewTestCase):
|
|||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def _request_test_document_page_view(self, document_page):
|
||||||
|
return self.get(
|
||||||
|
viewname='documents:document_page_view', kwargs={
|
||||||
|
'pk': document_page.pk,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class DocumentPageViewTestCase(
|
||||||
|
DocumentPageViewTestMixin, GenericDocumentViewTestCase
|
||||||
|
):
|
||||||
|
|
||||||
def test_document_page_list_view_no_permission(self):
|
def test_document_page_list_view_no_permission(self):
|
||||||
response = self._request_test_document_page_list_view()
|
response = self._request_test_document_page_list_view()
|
||||||
self.assertEqual(response.status_code, 404)
|
self.assertEqual(response.status_code, 404)
|
||||||
@@ -170,13 +182,6 @@ class DocumentPageViewTestCase(GenericDocumentViewTestCase):
|
|||||||
response=response, text=self.test_document.label, status_code=200
|
response=response, text=self.test_document.label, status_code=200
|
||||||
)
|
)
|
||||||
|
|
||||||
def _request_test_document_page_view(self, document_page):
|
|
||||||
return self.get(
|
|
||||||
viewname='documents:document_page_view', kwargs={
|
|
||||||
'pk': document_page.pk,
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
def test_document_page_view_no_permissions(self):
|
def test_document_page_view_no_permissions(self):
|
||||||
response = self._request_test_document_page_view(
|
response = self._request_test_document_page_view(
|
||||||
document_page=self.test_document.pages.first()
|
document_page=self.test_document.pages.first()
|
||||||
|
|||||||
@@ -1,9 +1,11 @@
|
|||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
from mayan.apps.common.tests.base import BaseTestCase
|
from mayan.apps.common.tests.base import BaseTestCase
|
||||||
from mayan.apps.documents.permissions import permission_document_view
|
|
||||||
from mayan.apps.documents.search import document_search, document_page_search
|
from ..permissions import permission_document_view
|
||||||
from mayan.apps.documents.tests.mixins import DocumentTestMixin
|
from ..search import document_search, document_page_search
|
||||||
|
|
||||||
|
from .mixins import DocumentTestMixin
|
||||||
|
|
||||||
|
|
||||||
class DocumentSearchTestCase(DocumentTestMixin, BaseTestCase):
|
class DocumentSearchTestCase(DocumentTestMixin, BaseTestCase):
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ from ..permissions import (
|
|||||||
from .base import GenericDocumentViewTestCase
|
from .base import GenericDocumentViewTestCase
|
||||||
|
|
||||||
|
|
||||||
class TrashedDocumentTestCase(GenericDocumentViewTestCase):
|
class TrashedDocumentTestMixin(object):
|
||||||
def _request_document_restore_get_view(self):
|
def _request_document_restore_get_view(self):
|
||||||
return self.get(
|
return self.get(
|
||||||
viewname='documents:document_restore', kwargs={
|
viewname='documents:document_restore', kwargs={
|
||||||
@@ -17,6 +17,46 @@ class TrashedDocumentTestCase(GenericDocumentViewTestCase):
|
|||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def _request_document_restore_post_view(self):
|
||||||
|
return self.post(
|
||||||
|
viewname='documents:document_restore', kwargs={
|
||||||
|
'pk': self.test_document.pk
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
def _request_document_trash_get_view(self):
|
||||||
|
return self.get(
|
||||||
|
viewname='documents:document_trash', kwargs={
|
||||||
|
'pk': self.test_document.pk
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
def _request_document_trash_post_view(self):
|
||||||
|
return self.post(
|
||||||
|
viewname='documents:document_trash', kwargs={
|
||||||
|
'pk': self.test_document.pk
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
def _request_trashed_document_delete_get_view(self):
|
||||||
|
return self.get(
|
||||||
|
viewname='documents:document_delete', kwargs={
|
||||||
|
'pk': self.test_document.pk
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
def _request_trashed_document_delete_post_view(self):
|
||||||
|
return self.post(
|
||||||
|
viewname='documents:document_delete', kwargs={
|
||||||
|
'pk': self.test_document.pk
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
def _request_trashed_document_list_view(self):
|
||||||
|
return self.get(viewname='documents:document_list_deleted')
|
||||||
|
|
||||||
|
|
||||||
|
class TrashedDocumentTestCase(GenericDocumentViewTestCase):
|
||||||
def test_document_restore_get_view_no_permission(self):
|
def test_document_restore_get_view_no_permission(self):
|
||||||
self.test_document.delete()
|
self.test_document.delete()
|
||||||
self.assertEqual(Document.objects.count(), 0)
|
self.assertEqual(Document.objects.count(), 0)
|
||||||
@@ -43,13 +83,6 @@ class TrashedDocumentTestCase(GenericDocumentViewTestCase):
|
|||||||
|
|
||||||
self.assertEqual(Document.objects.count(), document_count)
|
self.assertEqual(Document.objects.count(), document_count)
|
||||||
|
|
||||||
def _request_document_restore_post_view(self):
|
|
||||||
return self.post(
|
|
||||||
viewname='documents:document_restore', kwargs={
|
|
||||||
'pk': self.test_document.pk
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
def test_document_restore_post_view_no_permission(self):
|
def test_document_restore_post_view_no_permission(self):
|
||||||
self.test_document.delete()
|
self.test_document.delete()
|
||||||
self.assertEqual(Document.objects.count(), 0)
|
self.assertEqual(Document.objects.count(), 0)
|
||||||
@@ -74,13 +107,6 @@ class TrashedDocumentTestCase(GenericDocumentViewTestCase):
|
|||||||
self.assertEqual(DeletedDocument.objects.count(), 0)
|
self.assertEqual(DeletedDocument.objects.count(), 0)
|
||||||
self.assertEqual(Document.objects.count(), 1)
|
self.assertEqual(Document.objects.count(), 1)
|
||||||
|
|
||||||
def _request_document_trash_get_view(self):
|
|
||||||
return self.get(
|
|
||||||
viewname='documents:document_trash', kwargs={
|
|
||||||
'pk': self.test_document.pk
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
def test_document_trash_get_view_no_permissions(self):
|
def test_document_trash_get_view_no_permissions(self):
|
||||||
document_count = Document.objects.count()
|
document_count = Document.objects.count()
|
||||||
|
|
||||||
@@ -101,13 +127,6 @@ class TrashedDocumentTestCase(GenericDocumentViewTestCase):
|
|||||||
|
|
||||||
self.assertEqual(Document.objects.count(), document_count)
|
self.assertEqual(Document.objects.count(), document_count)
|
||||||
|
|
||||||
def _request_document_trash_post_view(self):
|
|
||||||
return self.post(
|
|
||||||
viewname='documents:document_trash', kwargs={
|
|
||||||
'pk': self.test_document.pk
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
def test_document_trash_post_view_no_permissions(self):
|
def test_document_trash_post_view_no_permissions(self):
|
||||||
response = self._request_document_trash_post_view()
|
response = self._request_document_trash_post_view()
|
||||||
self.assertEqual(response.status_code, 404)
|
self.assertEqual(response.status_code, 404)
|
||||||
@@ -126,13 +145,6 @@ class TrashedDocumentTestCase(GenericDocumentViewTestCase):
|
|||||||
self.assertEqual(DeletedDocument.objects.count(), 1)
|
self.assertEqual(DeletedDocument.objects.count(), 1)
|
||||||
self.assertEqual(Document.objects.count(), 0)
|
self.assertEqual(Document.objects.count(), 0)
|
||||||
|
|
||||||
def _request_document_delete_get_view(self):
|
|
||||||
return self.get(
|
|
||||||
viewname='documents:document_delete', kwargs={
|
|
||||||
'pk': self.test_document.pk
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
def test_document_delete_get_view_no_permissions(self):
|
def test_document_delete_get_view_no_permissions(self):
|
||||||
self.test_document.delete()
|
self.test_document.delete()
|
||||||
self.assertEqual(Document.objects.count(), 0)
|
self.assertEqual(Document.objects.count(), 0)
|
||||||
@@ -140,7 +152,7 @@ class TrashedDocumentTestCase(GenericDocumentViewTestCase):
|
|||||||
|
|
||||||
trashed_document_count = DeletedDocument.objects.count()
|
trashed_document_count = DeletedDocument.objects.count()
|
||||||
|
|
||||||
response = self._request_document_delete_get_view()
|
response = self._request_trashed_document_delete_get_view()
|
||||||
self.assertEqual(response.status_code, 404)
|
self.assertEqual(response.status_code, 404)
|
||||||
|
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
@@ -158,26 +170,19 @@ class TrashedDocumentTestCase(GenericDocumentViewTestCase):
|
|||||||
|
|
||||||
trashed_document_count = DeletedDocument.objects.count()
|
trashed_document_count = DeletedDocument.objects.count()
|
||||||
|
|
||||||
response = self._request_document_delete_get_view()
|
response = self._request_trashed_document_delete_get_view()
|
||||||
self.assertEqual(response.status_code, 200)
|
self.assertEqual(response.status_code, 200)
|
||||||
|
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
DeletedDocument.objects.count(), trashed_document_count
|
DeletedDocument.objects.count(), trashed_document_count
|
||||||
)
|
)
|
||||||
|
|
||||||
def _request_document_delete_post_view(self):
|
|
||||||
return self.post(
|
|
||||||
viewname='documents:document_delete', kwargs={
|
|
||||||
'pk': self.test_document.pk
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
def test_document_delete_post_view_no_permissions(self):
|
def test_document_delete_post_view_no_permissions(self):
|
||||||
self.test_document.delete()
|
self.test_document.delete()
|
||||||
self.assertEqual(Document.objects.count(), 0)
|
self.assertEqual(Document.objects.count(), 0)
|
||||||
self.assertEqual(DeletedDocument.objects.count(), 1)
|
self.assertEqual(DeletedDocument.objects.count(), 1)
|
||||||
|
|
||||||
response = self._request_document_delete_post_view()
|
response = self._request_trashed_document_delete_post_view()
|
||||||
self.assertEqual(response.status_code, 404)
|
self.assertEqual(response.status_code, 404)
|
||||||
|
|
||||||
self.assertEqual(Document.objects.count(), 0)
|
self.assertEqual(Document.objects.count(), 0)
|
||||||
@@ -192,19 +197,16 @@ class TrashedDocumentTestCase(GenericDocumentViewTestCase):
|
|||||||
obj=self.test_document, permission=permission_document_delete
|
obj=self.test_document, permission=permission_document_delete
|
||||||
)
|
)
|
||||||
|
|
||||||
response = self._request_document_delete_post_view()
|
response = self._request_trashed_document_delete_post_view()
|
||||||
self.assertEqual(response.status_code, 302)
|
self.assertEqual(response.status_code, 302)
|
||||||
|
|
||||||
self.assertEqual(DeletedDocument.objects.count(), 0)
|
self.assertEqual(DeletedDocument.objects.count(), 0)
|
||||||
self.assertEqual(Document.objects.count(), 0)
|
self.assertEqual(Document.objects.count(), 0)
|
||||||
|
|
||||||
def _request_document_list_deleted_view(self):
|
|
||||||
return self.get(viewname='documents:document_list_deleted')
|
|
||||||
|
|
||||||
def test_deleted_document_list_view_no_permissions(self):
|
def test_deleted_document_list_view_no_permissions(self):
|
||||||
self.test_document.delete()
|
self.test_document.delete()
|
||||||
|
|
||||||
response = self._request_document_list_deleted_view()
|
response = self._request_trashed_document_list_view()
|
||||||
self.assertNotContains(
|
self.assertNotContains(
|
||||||
response=response, text=self.test_document.label, status_code=200
|
response=response, text=self.test_document.label, status_code=200
|
||||||
)
|
)
|
||||||
@@ -216,7 +218,7 @@ class TrashedDocumentTestCase(GenericDocumentViewTestCase):
|
|||||||
obj=self.test_document, permission=permission_document_view
|
obj=self.test_document, permission=permission_document_view
|
||||||
)
|
)
|
||||||
|
|
||||||
response = self._request_document_list_deleted_view()
|
response = self._request_trashed_document_list_view()
|
||||||
self.assertContains(
|
self.assertContains(
|
||||||
response=response, text=self.test_document.label, status_code=200
|
response=response, text=self.test_document.label, status_code=200
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -44,7 +44,7 @@ from ..permissions import (
|
|||||||
from ..settings import (
|
from ..settings import (
|
||||||
setting_print_width, setting_print_height, setting_recent_added_count
|
setting_print_width, setting_print_height, setting_recent_added_count
|
||||||
)
|
)
|
||||||
from ..tasks import task_document_reset_pages
|
from ..tasks import task_document_pages_reset
|
||||||
from ..utils import parse_range
|
from ..utils import parse_range
|
||||||
|
|
||||||
__all__ = (
|
__all__ = (
|
||||||
@@ -450,7 +450,7 @@ class DocumentPagesResetView(MultipleObjectConfirmActionView):
|
|||||||
def object_action(self, form, instance):
|
def object_action(self, form, instance):
|
||||||
latest_version = instance.latest_version
|
latest_version = instance.latest_version
|
||||||
if latest_version:
|
if latest_version:
|
||||||
task_document_reset_pages.apply_async(
|
task_document_pages_reset.apply_async(
|
||||||
kwargs={'document_id': instance.pk}
|
kwargs={'document_id': instance.pk}
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
|
|||||||
@@ -3,13 +3,14 @@ from __future__ import unicode_literals
|
|||||||
from django.contrib import admin
|
from django.contrib import admin
|
||||||
|
|
||||||
from .models import (
|
from .models import (
|
||||||
DocumentPageOCRContent, DocumentTypeSettings, DocumentVersionOCRError
|
DocumentTypeSettings, DocumentVersionPageOCRContent,
|
||||||
|
DocumentVersionOCRError
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@admin.register(DocumentPageOCRContent)
|
@admin.register(DocumentVersionPageOCRContent)
|
||||||
class DocumentPageOCRContentAdmin(admin.ModelAdmin):
|
class DocumentVersionPageOCRContentAdmin(admin.ModelAdmin):
|
||||||
list_display = ('document_page',)
|
list_display = ('document_version_page',)
|
||||||
|
|
||||||
|
|
||||||
@admin.register(DocumentTypeSettings)
|
@admin.register(DocumentTypeSettings)
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ from rest_framework.response import Response
|
|||||||
from mayan.apps.documents.models import Document, DocumentVersion
|
from mayan.apps.documents.models import Document, DocumentVersion
|
||||||
from mayan.apps.rest_api.permissions import MayanPermission
|
from mayan.apps.rest_api.permissions import MayanPermission
|
||||||
|
|
||||||
from .models import DocumentPageOCRContent
|
from .models import DocumentVersionPageOCRContent
|
||||||
from .permissions import permission_ocr_content_view, permission_ocr_document
|
from .permissions import permission_ocr_content_view, permission_ocr_document
|
||||||
from .serializers import DocumentPageOCRContentSerializer
|
from .serializers import DocumentPageOCRContentSerializer
|
||||||
|
|
||||||
@@ -90,8 +90,8 @@ class APIDocumentPageOCRContentView(generics.RetrieveAPIView):
|
|||||||
|
|
||||||
try:
|
try:
|
||||||
ocr_content = instance.ocr_content
|
ocr_content = instance.ocr_content
|
||||||
except DocumentPageOCRContent.DoesNotExist:
|
except DocumentVersionPageOCRContent.DoesNotExist:
|
||||||
ocr_content = DocumentPageOCRContent.objects.none()
|
ocr_content = DocumentVersionPageOCRContent.objects.none()
|
||||||
|
|
||||||
serializer = self.get_serializer(ocr_content)
|
serializer = self.get_serializer(ocr_content)
|
||||||
return Response(serializer.data)
|
return Response(serializer.data)
|
||||||
|
|||||||
@@ -128,7 +128,7 @@ class OCRApp(MayanAppConfig):
|
|||||||
)
|
)
|
||||||
|
|
||||||
document_search.add_model_field(
|
document_search.add_model_field(
|
||||||
field='versions__version_pages__ocr_content__content', label=_('OCR')
|
field='pages__ocr_content__content', label=_('OCR')
|
||||||
)
|
)
|
||||||
|
|
||||||
document_page_search.add_model_field(
|
document_page_search.add_model_field(
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ from django.utils.translation import ugettext_lazy as _, ugettext
|
|||||||
|
|
||||||
from mayan.apps.common.widgets import TextAreaDiv
|
from mayan.apps.common.widgets import TextAreaDiv
|
||||||
|
|
||||||
from .models import DocumentPageOCRContent
|
from .models import DocumentVersionPageOCRContent
|
||||||
|
|
||||||
|
|
||||||
class DocumentPageOCRContentForm(forms.Form):
|
class DocumentPageOCRContentForm(forms.Form):
|
||||||
@@ -30,7 +30,7 @@ class DocumentPageOCRContentForm(forms.Form):
|
|||||||
|
|
||||||
try:
|
try:
|
||||||
page_content = page.ocr_content.content
|
page_content = page.ocr_content.content
|
||||||
except DocumentPageOCRContent.DoesNotExist:
|
except DocumentVersionPageOCRContent.DoesNotExist:
|
||||||
pass
|
pass
|
||||||
else:
|
else:
|
||||||
content = conditional_escape(force_text(page_content))
|
content = conditional_escape(force_text(page_content))
|
||||||
@@ -66,7 +66,7 @@ class DocumentOCRContentForm(forms.Form):
|
|||||||
for page in document_pages:
|
for page in document_pages:
|
||||||
try:
|
try:
|
||||||
page_content = page.ocr_content.content
|
page_content = page.ocr_content.content
|
||||||
except DocumentPageOCRContent.DoesNotExist:
|
except DocumentVersionPageOCRContent.DoesNotExist:
|
||||||
pass
|
pass
|
||||||
else:
|
else:
|
||||||
content.append(conditional_escape(force_text(page_content)))
|
content.append(conditional_escape(force_text(page_content)))
|
||||||
|
|||||||
28
mayan/apps/ocr/migrations/0009_rename_page_content.py
Normal file
28
mayan/apps/ocr/migrations/0009_rename_page_content.py
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
import django.db.models.deletion
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
dependencies = [
|
||||||
|
('ocr', '0008_auto_20180917_0646'),
|
||||||
|
('documents', '0052_rename_document_page'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.RenameModel(
|
||||||
|
'DocumentPageOCRContent', 'DocumentVersionPageOCRContent'
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='documentversionpageocrcontent',
|
||||||
|
name='document_page',
|
||||||
|
field=models.OneToOneField(
|
||||||
|
on_delete=django.db.models.deletion.CASCADE,
|
||||||
|
name='document_version_page',
|
||||||
|
related_name='ocr_content',
|
||||||
|
to='documents.DocumentVersionPage',
|
||||||
|
verbose_name='Document version page'
|
||||||
|
),
|
||||||
|
),
|
||||||
|
]
|
||||||
@@ -5,7 +5,7 @@ from django.utils.encoding import force_text, python_2_unicode_compatible
|
|||||||
from django.utils.translation import ugettext_lazy as _
|
from django.utils.translation import ugettext_lazy as _
|
||||||
|
|
||||||
from mayan.apps.documents.models import (
|
from mayan.apps.documents.models import (
|
||||||
DocumentPage, DocumentType, DocumentVersion
|
DocumentPage, DocumentType, DocumentVersion, DocumentVersionPage
|
||||||
)
|
)
|
||||||
|
|
||||||
from .managers import (
|
from .managers import (
|
||||||
@@ -38,13 +38,13 @@ class DocumentTypeSettings(models.Model):
|
|||||||
|
|
||||||
|
|
||||||
@python_2_unicode_compatible
|
@python_2_unicode_compatible
|
||||||
class DocumentPageOCRContent(models.Model):
|
class DocumentVersionPageOCRContent(models.Model):
|
||||||
"""
|
"""
|
||||||
This model stores the OCR results for a document page.
|
This model stores the OCR results for a document page.
|
||||||
"""
|
"""
|
||||||
document_page = models.OneToOneField(
|
document_version_page = models.OneToOneField(
|
||||||
on_delete=models.CASCADE, related_name='ocr_content',
|
on_delete=models.CASCADE, related_name='ocr_content',
|
||||||
to=DocumentPage, verbose_name=_('Document page')
|
to=DocumentVersionPage, verbose_name=_('Document version page')
|
||||||
)
|
)
|
||||||
content = models.TextField(
|
content = models.TextField(
|
||||||
blank=True, help_text=_(
|
blank=True, help_text=_(
|
||||||
@@ -55,8 +55,8 @@ class DocumentPageOCRContent(models.Model):
|
|||||||
objects = DocumentPageOCRContentManager()
|
objects = DocumentPageOCRContentManager()
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
verbose_name = _('Document page OCR content')
|
verbose_name = _('Document version page OCR content')
|
||||||
verbose_name_plural = _('Document pages OCR contents')
|
verbose_name_plural = _('Document version pages OCR contents')
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return force_text(self.document_page)
|
return force_text(self.document_page)
|
||||||
|
|||||||
@@ -2,10 +2,10 @@ from __future__ import unicode_literals
|
|||||||
|
|
||||||
from rest_framework import serializers
|
from rest_framework import serializers
|
||||||
|
|
||||||
from .models import DocumentPageOCRContent
|
from .models import DocumentVersionPageOCRContent
|
||||||
|
|
||||||
|
|
||||||
class DocumentPageOCRContentSerializer(serializers.ModelSerializer):
|
class DocumentPageOCRContentSerializer(serializers.ModelSerializer):
|
||||||
class Meta:
|
class Meta:
|
||||||
fields = ('content',)
|
fields = ('content',)
|
||||||
model = DocumentPageOCRContent
|
model = DocumentVersionPageOCRContent
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ from mayan.apps.documents.models import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
from .forms import DocumentPageOCRContentForm, DocumentOCRContentForm
|
from .forms import DocumentPageOCRContentForm, DocumentOCRContentForm
|
||||||
from .models import DocumentPageOCRContent, DocumentVersionOCRError
|
from .models import DocumentVersionPageOCRContent, DocumentVersionOCRError
|
||||||
from .permissions import (
|
from .permissions import (
|
||||||
permission_ocr_content_view, permission_ocr_document,
|
permission_ocr_content_view, permission_ocr_document,
|
||||||
permission_document_type_ocr_setup
|
permission_document_type_ocr_setup
|
||||||
@@ -48,7 +48,7 @@ class DocumentOCRContentDeleteView(MultipleObjectConfirmActionView):
|
|||||||
return result
|
return result
|
||||||
|
|
||||||
def object_action(self, form, instance):
|
def object_action(self, form, instance):
|
||||||
DocumentPageOCRContent.objects.delete_content_for(
|
DocumentVersionPageOCRContent.objects.delete_content_for(
|
||||||
document=instance, user=self.request.user
|
document=instance, user=self.request.user
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user