Add keyword arguments

Signed-off-by: Roberto Rosario <roberto.rosario.gonzalez@gmail.com>
This commit is contained in:
Roberto Rosario
2019-05-12 02:09:26 -04:00
parent 0d53e74238
commit c7e9a4dc99
28 changed files with 84 additions and 74 deletions

View File

@@ -57,7 +57,7 @@ class Cabinet(MPTTModel):
) )
def get_absolute_url(self): def get_absolute_url(self):
return reverse('cabinets:cabinet_view', args=(self.pk,)) return reverse(viewname='cabinets:cabinet_view', kwargs={'pk': self.pk})
def get_document_count(self, user): def get_document_count(self, user):
""" """

View File

@@ -29,7 +29,7 @@ class DeleteExtraDataMixin(object):
else: else:
self.object.delete() self.object.delete()
return HttpResponseRedirect(success_url) return HttpResponseRedirect(redirect_to=success_url)
class DynamicFormViewMixin(object): class DynamicFormViewMixin(object):

View File

@@ -12,7 +12,6 @@ from django.apps import apps
from django.conf import settings from django.conf import settings
from django.conf.urls import url from django.conf.urls import url
from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes.models import ContentType
from django.core import management
from django.db import connection, models from django.db import connection, models
from django.db.models.signals import post_save, pre_save from django.db.models.signals import post_save, pre_save
from django.http import HttpResponse from django.http import HttpResponse

View File

@@ -77,7 +77,7 @@ class Key(models.Model):
raise ValidationError(_('Key already exists.')) raise ValidationError(_('Key already exists.'))
def get_absolute_url(self): def get_absolute_url(self):
return reverse('django_gpg:key_detail', args=(self.pk,)) return reverse(viewname='django_gpg:key_detail', kwargs={'pk': self.pk})
@property @property
def key_id(self): def key_id(self):

View File

@@ -63,7 +63,7 @@ class KeyDownloadView(SingleObjectDownloadView):
class KeyReceive(ConfirmView): class KeyReceive(ConfirmView):
post_action_redirect = reverse_lazy('django_gpg:key_public_list') post_action_redirect = reverse_lazy(viewname='django_gpg:key_public_list')
view_permission = permission_key_receive view_permission = permission_key_receive
def get_extra_context(self): def get_extra_context(self):
@@ -127,7 +127,7 @@ class KeyQueryView(SimpleView):
def get_extra_context(self): def get_extra_context(self):
return { return {
'form': self.get_form(), 'form': self.get_form(),
'form_action': reverse('django_gpg:key_query_results'), 'form_action': reverse(viewname='django_gpg:key_query_results'),
'submit_icon_class': icon_keyserver_search, 'submit_icon_class': icon_keyserver_search,
'submit_label': _('Search'), 'submit_label': _('Search'),
'submit_method': 'GET', 'submit_method': 'GET',
@@ -145,7 +145,7 @@ class KeyQueryView(SimpleView):
class KeyUploadView(SingleObjectCreateView): class KeyUploadView(SingleObjectCreateView):
fields = ('key_data',) fields = ('key_data',)
model = Key model = Key
post_action_redirect = reverse_lazy('django_gpg:key_public_list') post_action_redirect = reverse_lazy(viewname='django_gpg:key_public_list')
view_permission = permission_key_upload view_permission = permission_key_upload
def get_extra_context(self): def get_extra_context(self):

View File

@@ -18,11 +18,11 @@ class DocumentParsingAPITestCase(DocumentTestMixin, BaseAPITestCase):
def _request_document_page_content_view(self): def _request_document_page_content_view(self):
return self.get( return self.get(
viewname='rest_api:document-page-content-view', viewname='rest_api:document-page-content-view', kwargs={
args=( 'document_pk': self.test_document.pk,
self.test_document.pk, self.test_document.latest_version.pk, 'version_pk': self.test_document.latest_version.pk,
self.test_document.latest_version.pages.first().pk, 'page_pk': self.test_document.latest_version.pages.first().pk
) }
) )
def test_get_document_version_page_content_no_access(self): def test_get_document_version_page_content_no_access(self):

View File

@@ -710,7 +710,10 @@ class WorkflowTransitionsAPITestCase(DocumentTestMixin, WorkflowTestMixin, BaseA
def _request_test_workflow_transition_detail_api_view(self): def _request_test_workflow_transition_detail_api_view(self):
return self.get( return self.get(
viewname='rest_api:workflowtransition-detail', viewname='rest_api:workflowtransition-detail',
args=(self.test_workflow.pk, self.test_workflow_transition.pk) kwargs={
'pk': self.test_workflow.pk,
'transition_pk': self.test_workflow_transition.pk
}
) )
def test_workflow_transition_detail_view_no_access(self): def test_workflow_transition_detail_view_no_access(self):

View File

@@ -98,7 +98,7 @@ class WorkflowInstanceTransitionView(FormView):
'Document "%s" transitioned successfully' 'Document "%s" transitioned successfully'
) % self.get_workflow_instance().document ) % self.get_workflow_instance().document
) )
return HttpResponseRedirect(self.get_success_url()) return HttpResponseRedirect(redirect_to=self.get_success_url())
def get_extra_context(self): def get_extra_context(self):
return { return {

View File

@@ -23,8 +23,9 @@ class DashboardWidgetDocumentPagesTotal(DashboardWidgetNumeric):
icon_class = icon_dashboard_pages_per_month icon_class = icon_dashboard_pages_per_month
label = _('Total pages') label = _('Total pages')
link = reverse_lazy( link = reverse_lazy(
viewname='statistics:statistic_detail', viewname='statistics:statistic_detail', kwargs={
args=('total-document-pages-at-each-month',) 'slug': 'total-document-pages-at-each-month'
}
) )
def render(self, request): def render(self, request):
@@ -44,7 +45,7 @@ class DashboardWidgetDocumentPagesTotal(DashboardWidgetNumeric):
class DashboardWidgetDocumentsTotal(DashboardWidgetNumeric): class DashboardWidgetDocumentsTotal(DashboardWidgetNumeric):
icon_class = icon_dashboard_total_document icon_class = icon_dashboard_total_document
label = _('Total documents') label = _('Total documents')
link = reverse_lazy('documents:document_list') link = reverse_lazy(viewname='documents:document_list')
def render(self, request): def render(self, request):
AccessControlList = apps.get_model( AccessControlList = apps.get_model(
@@ -63,7 +64,7 @@ class DashboardWidgetDocumentsTotal(DashboardWidgetNumeric):
class DashboardWidgetDocumentsInTrash(DashboardWidgetNumeric): class DashboardWidgetDocumentsInTrash(DashboardWidgetNumeric):
icon_class = icon_dashboard_documents_in_trash icon_class = icon_dashboard_documents_in_trash
label = _('Documents in trash') label = _('Documents in trash')
link = reverse_lazy('documents:document_list_deleted') link = reverse_lazy(viewname='documents:document_list_deleted')
def render(self, request): def render(self, request):
AccessControlList = apps.get_model( AccessControlList = apps.get_model(
@@ -82,7 +83,7 @@ class DashboardWidgetDocumentsInTrash(DashboardWidgetNumeric):
class DashboardWidgetDocumentsTypesTotal(DashboardWidgetNumeric): class DashboardWidgetDocumentsTypesTotal(DashboardWidgetNumeric):
icon_class = icon_dashboard_document_types icon_class = icon_dashboard_document_types
label = _('Document types') label = _('Document types')
link = reverse_lazy('documents:document_type_list') link = reverse_lazy(viewname='documents:document_type_list')
def render(self, request): def render(self, request):
AccessControlList = apps.get_model( AccessControlList = apps.get_model(
@@ -102,8 +103,9 @@ class DashboardWidgetDocumentsNewThisMonth(DashboardWidgetNumeric):
icon_class = icon_dashboard_new_documents_this_month icon_class = icon_dashboard_new_documents_this_month
label = _('New documents this month') label = _('New documents this month')
link = reverse_lazy( link = reverse_lazy(
'statistics:statistic_detail', viewname='statistics:statistic_detail', kwargs={
args=('new-documents-per-month',) 'slug': 'new-documents-per-month'
}
) )
def render(self, request): def render(self, request):
@@ -115,8 +117,9 @@ class DashboardWidgetDocumentsPagesNewThisMonth(DashboardWidgetNumeric):
icon_class = icon_dashboard_pages_per_month icon_class = icon_dashboard_pages_per_month
label = _('New pages this month') label = _('New pages this month')
link = reverse_lazy( link = reverse_lazy(
'statistics:statistic_detail', viewname='statistics:statistic_detail', kwargs={
args=('new-document-pages-per-month',) 'slug': 'new-document-pages-per-month'
}
) )
def render(self, request): def render(self, request):

View File

@@ -1,6 +1,5 @@
from __future__ import absolute_import, unicode_literals from __future__ import absolute_import, unicode_literals
import hashlib
import logging import logging
import uuid import uuid
@@ -8,7 +7,7 @@ from django.apps import apps
from django.core.files import File from django.core.files import File
from django.db import models from django.db import models
from django.urls import reverse from django.urls import reverse
from django.utils.encoding import force_text, python_2_unicode_compatible from django.utils.encoding import python_2_unicode_compatible
from django.utils.timezone import now from django.utils.timezone import now
from django.utils.translation import ugettext, ugettext_lazy as _ from django.utils.translation import ugettext, ugettext_lazy as _
@@ -22,19 +21,10 @@ from ..signals import post_document_type_change
from .document_type_models import DocumentType from .document_type_models import DocumentType
__all__ = ('Document', 'UUID_FUNCTION') __all__ = ('Document',)
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
# document image cache name hash function
def hash_function():
return hashlib.sha256()
def UUID_FUNCTION(*args, **kwargs):
return force_text(uuid.uuid4())
@python_2_unicode_compatible @python_2_unicode_compatible
class Document(models.Model): class Document(models.Model):
""" """
@@ -137,7 +127,9 @@ class Document(models.Model):
return False return False
def get_absolute_url(self): def get_absolute_url(self):
return reverse('documents:document_preview', args=(self.pk,)) return reverse(
viewname='documents:document_preview', kwargs={'pk': self.pk}
)
def get_api_image_url(self, *args, **kwargs): def get_api_image_url(self, *args, **kwargs):
latest_version = self.latest_version latest_version = self.latest_version

View File

@@ -127,9 +127,10 @@ class DocumentPage(models.Model):
final_url = furl() final_url = furl()
final_url.args = kwargs final_url.args = kwargs
final_url.path = reverse( final_url.path = reverse(
'rest_api:documentpage-image', args=( viewname='rest_api:documentpage-image', kwargs={
self.document.pk, self.document_version.pk, self.pk 'pk': self.document.pk, 'version_pk': self.document_version.pk,
) 'page_pk': self.pk
}
) )
final_url.args['_hash'] = transformations_hash final_url.args['_hash'] = transformations_hash

View File

@@ -81,7 +81,9 @@ class DocumentType(models.Model):
def get_absolute_url(self): def get_absolute_url(self):
return reverse( return reverse(
'documents:document_type_document_list', args=(self.pk,) viewname='documents:document_type_document_list', kwargs={
'pk': self.pk
}
) )
def get_document_count(self, user): def get_document_count(self, user):

View File

@@ -151,7 +151,11 @@ class DocumentVersion(models.Model):
) )
def get_absolute_url(self): def get_absolute_url(self):
return reverse('documents:document_version_view', args=(self.pk,)) return reverse(
viewname='documents:document_version_view', kwargs={
'pk': self.pk
}
)
def get_api_image_url(self, *args, **kwargs): def get_api_image_url(self, *args, **kwargs):
first_page = self.pages.first() first_page = self.pages.first()

View File

@@ -210,9 +210,9 @@ class DocumentAPITestCase(DocumentTestMixin, BaseAPITestCase):
with open(TEST_DOCUMENT_PATH, mode='rb') as file_descriptor: with open(TEST_DOCUMENT_PATH, mode='rb') as file_descriptor:
return self.post( return self.post(
viewname='rest_api:document-version-list', args=( viewname='rest_api:document-version-list', kwargs={
self.test_document.pk, 'pk': self.test_document.pk,
), data={ }, data={
'comment': '', 'file': file_descriptor, 'comment': '', 'file': file_descriptor,
} }
) )

View File

@@ -85,7 +85,7 @@ class DocumentTypeCreateView(SingleObjectCreateView):
'delete_time_unit' 'delete_time_unit'
) )
model = DocumentType model = DocumentType
post_action_redirect = reverse_lazy('documents:document_type_list') post_action_redirect = reverse_lazy(viewname='documents:document_type_list')
view_permission = permission_document_type_create view_permission = permission_document_type_create
def get_extra_context(self): def get_extra_context(self):
@@ -102,7 +102,7 @@ class DocumentTypeCreateView(SingleObjectCreateView):
class DocumentTypeDeleteView(SingleObjectDeleteView): class DocumentTypeDeleteView(SingleObjectDeleteView):
model = DocumentType model = DocumentType
object_permission = permission_document_type_delete object_permission = permission_document_type_delete
post_action_redirect = reverse_lazy('documents:document_type_list') post_action_redirect = reverse_lazy(viewname='documents:document_type_list')
def get_extra_context(self): def get_extra_context(self):
return { return {
@@ -119,7 +119,7 @@ class DocumentTypeEditView(SingleObjectEditView):
) )
model = DocumentType model = DocumentType
object_permission = permission_document_type_edit object_permission = permission_document_type_edit
post_action_redirect = reverse_lazy('documents:document_type_list') post_action_redirect = reverse_lazy(viewname='documents:document_type_list')
def get_extra_context(self): def get_extra_context(self):
return { return {

View File

@@ -182,10 +182,14 @@ class DocumentDownloadFormView(FormView):
url = reverse(self.multiple_download_view) url = reverse(self.multiple_download_view)
else: else:
url = reverse( url = reverse(
self.single_download_view, args=(self.queryset.first().pk,) viewname=self.single_download_view, kwargs={
'pk': self.queryset.first().pk
}
) )
return HttpResponseRedirect('{}?{}'.format(url, querystring)) return HttpResponseRedirect(
redirect_to='{}?{}'.format(url, querystring)
)
def get_document_queryset(self): def get_document_queryset(self):
id_list = self.request.GET.get( id_list = self.request.GET.get(
@@ -382,7 +386,9 @@ class DocumentEditView(SingleObjectEditView):
def get_post_action_redirect(self): def get_post_action_redirect(self):
return reverse( return reverse(
'documents:document_properties', args=(self.get_object().pk,) viewname='documents:document_properties', kwargs={
'pk': self.get_object().pk
}
) )
@@ -641,7 +647,7 @@ class DocumentPrint(FormView):
context = { context = {
'form_action': reverse( 'form_action': reverse(
'documents:document_print', args=(instance.pk,) viewname='documents:document_print', kwargs={'pk': instance.pk}
), ),
'object': instance, 'object': instance,
'submit_label': _('Submit'), 'submit_label': _('Submit'),

View File

@@ -38,7 +38,7 @@ class Issue46TestCase(DocumentTestMixin, GenericViewTestCase):
# Functional test for the first page of advanced results # Functional test for the first page of advanced results
response = self.get( response = self.get(
viewname='search:results', viewname='search:results',
args=(document_search.get_full_name(),), kwargs={'search_model': document_search.get_full_name()},
data={'label': test_document_label} data={'label': test_document_label}
) )
@@ -58,7 +58,7 @@ class Issue46TestCase(DocumentTestMixin, GenericViewTestCase):
# Functional test for the second page of advanced results # Functional test for the second page of advanced results
response = self.get( response = self.get(
viewname='search:results', viewname='search:results',
args=(document_search.get_full_name(),), kwargs={'search_model': document_search.get_full_name()},
data={'label': test_document_label, 'page': 2} data={'label': test_document_label, 'page': 2}
) )

View File

@@ -134,7 +134,7 @@ class UserMailerBackendSelectionView(FormView):
class UserMailingCreateView(SingleObjectDynamicFormCreateView): class UserMailingCreateView(SingleObjectDynamicFormCreateView):
form_class = UserMailerDynamicForm form_class = UserMailerDynamicForm
post_action_redirect = reverse_lazy('mailer:user_mailer_list') post_action_redirect = reverse_lazy(viewname='mailer:user_mailer_list')
view_permission = permission_user_mailer_create view_permission = permission_user_mailer_create
def get_backend(self): def get_backend(self):

View File

@@ -35,7 +35,7 @@ class DocumentUploadMetadataTestCase(MetadataTypeTestMixin, GenericDocumentViewT
) )
def test_upload_interactive_with_unicode_metadata(self): def test_upload_interactive_with_unicode_metadata(self):
url = furl(reverse('sources:upload_interactive')) url = furl(reverse(viewname='sources:upload_interactive'))
url.args['metadata0_id'] = self.test_metadata_type.pk url.args['metadata0_id'] = self.test_metadata_type.pk
url.args['metadata0_value'] = TEST_METADATA_VALUE_UNICODE url.args['metadata0_value'] = TEST_METADATA_VALUE_UNICODE
@@ -60,7 +60,7 @@ class DocumentUploadMetadataTestCase(MetadataTypeTestMixin, GenericDocumentViewT
) )
def test_upload_interactive_with_ampersand_metadata(self): def test_upload_interactive_with_ampersand_metadata(self):
url = furl(reverse('sources:upload_interactive')) url = furl(reverse(viewname='sources:upload_interactive'))
url.args['metadata0_id'] = self.test_metadata_type.pk url.args['metadata0_id'] = self.test_metadata_type.pk
url.args['metadata0_value'] = TEST_METADATA_VALUE_WITH_AMPERSAND url.args['metadata0_value'] = TEST_METADATA_VALUE_WITH_AMPERSAND

View File

@@ -237,7 +237,7 @@ class DocumentMetadataEditView(MultipleObjectFormActionView):
'Selected documents must be of the same type.' 'Selected documents must be of the same type.'
), request=request ), request=request
) )
return HttpResponseRedirect(self.previous_url) return HttpResponseRedirect(redirect_to=self.previous_url)
return result return result
@@ -462,7 +462,7 @@ class DocumentMetadataRemoveView(MultipleObjectFormActionView):
'Selected documents must be of the same type.' 'Selected documents must be of the same type.'
), request=request ), request=request
) )
return HttpResponseRedirect(self.previous_url) return HttpResponseRedirect(redirect_to=self.previous_url)
return result return result

View File

@@ -36,7 +36,7 @@ class MessageCreateView(SingleObjectCreateView):
class MessageDeleteView(SingleObjectDeleteView): class MessageDeleteView(SingleObjectDeleteView):
model = Message model = Message
object_permission = permission_message_delete object_permission = permission_message_delete
post_action_redirect = reverse_lazy('motd:message_list') post_action_redirect = reverse_lazy(viewname='motd:message_list')
def get_extra_context(self): def get_extra_context(self):
return { return {
@@ -50,7 +50,7 @@ class MessageEditView(SingleObjectEditView):
fields = ('label', 'message', 'enabled', 'start_datetime', 'end_datetime') fields = ('label', 'message', 'enabled', 'start_datetime', 'end_datetime')
model = Message model = Message
object_permission = permission_message_edit object_permission = permission_message_edit
post_action_redirect = reverse_lazy('motd:message_list') post_action_redirect = reverse_lazy(viewname='motd:message_list')
def get_extra_context(self): def get_extra_context(self):
return { return {

View File

@@ -47,7 +47,7 @@ class RoleCreateView(SingleObjectCreateView):
fields = ('label',) fields = ('label',)
model = Role model = Role
view_permission = permission_role_create view_permission = permission_role_create
post_action_redirect = reverse_lazy('permissions:role_list') post_action_redirect = reverse_lazy(viewname='permissions:role_list')
def get_save_extra_data(self): def get_save_extra_data(self):
return {'_user': self.request.user} return {'_user': self.request.user}
@@ -56,7 +56,7 @@ class RoleCreateView(SingleObjectCreateView):
class RoleDeleteView(SingleObjectDeleteView): class RoleDeleteView(SingleObjectDeleteView):
model = Role model = Role
object_permission = permission_role_delete object_permission = permission_role_delete
post_action_redirect = reverse_lazy('permissions:role_list') post_action_redirect = reverse_lazy(viewname='permissions:role_list')
class RoleEditView(SingleObjectEditView): class RoleEditView(SingleObjectEditView):

View File

@@ -96,10 +96,10 @@ class StagingFile(object):
final_url = furl() final_url = furl()
final_url.args = kwargs final_url.args = kwargs
final_url.path = reverse( final_url.path = reverse(
'rest_api:stagingfolderfile-image-view', args=( 'rest_api:stagingfolderfile-image-view', kwargs={
self.staging_folder.pk, 'staging_folder_pk': self.staging_folder.pk,
self.encoded_filename 'encoded_filename': self.encoded_filename
) }
) )
return final_url.tostr() return final_url.tostr()

View File

@@ -174,7 +174,8 @@ class DocumentUploadIssueTestCase(GenericDocumentViewTestCase):
# Test for issue 25 during editing # Test for issue 25 during editing
self.post( self.post(
viewname='documents:document_edit', args=(document.pk,), data={ viewname='documents:document_edit', kwargs={'pk': document.pk},
data={
'description': TEST_DOCUMENT_DESCRIPTION, 'description': TEST_DOCUMENT_DESCRIPTION,
'language': document.language, 'label': document.label 'language': document.language, 'label': document.label
} }
@@ -317,7 +318,7 @@ class SourcesTestCase(GenericDocumentViewTestCase):
def _request_setup_source_create_view(self): def _request_setup_source_create_view(self):
return self.post( return self.post(
args=(SOURCE_CHOICE_WEB_FORM,), kwargs={'pk': SOURCE_CHOICE_WEB_FORM},
viewname='sources:setup_source_create', data={ viewname='sources:setup_source_create', data={
'enabled': True, 'label': TEST_SOURCE_LABEL, 'enabled': True, 'label': TEST_SOURCE_LABEL,
'uncompress': TEST_SOURCE_UNCOMPRESS_N 'uncompress': TEST_SOURCE_UNCOMPRESS_N

View File

@@ -201,7 +201,7 @@ class DocumentCreateWizard(SessionWizardView):
for step in WizardStep.get_all(): for step in WizardStep.get_all():
query_dict.update(step.done(wizard=self) or {}) query_dict.update(step.done(wizard=self) or {})
url = furl(reverse('sources:upload_interactive')) url = furl(reverse(viewname='sources:upload_interactive'))
# Use equal and not .update() to get the same result as using # Use equal and not .update() to get the same result as using
# urlencode(doseq=True) # urlencode(doseq=True)
url.args = query_dict url.args = query_dict

View File

@@ -31,7 +31,7 @@ class TagAPIViewTestMixin(object):
data.update(extra_data) data.update(extra_data)
return getattr(self, verb)( return getattr(self, verb)(
viewname='rest_api:tag-detail', args=(self.test_tag.pk,), viewname='rest_api:tag-detail', kwargs={'pk': self.test_tag.pk},
data=data data=data
) )

View File

@@ -18,7 +18,7 @@ class TaskManagerViewTestCase(GenericViewTestCase):
def _request_active_task_list(self): def _request_active_task_list(self):
return self.get( return self.get(
viewname='task_manager:queue_active_task_list', viewname='task_manager:queue_active_task_list',
args=(self.test_queue.name,), follow=True kwargs={'queue_name': self.test_queue.name}, follow=True
) )
def _request_queue_list(self): def _request_queue_list(self):
@@ -29,13 +29,13 @@ class TaskManagerViewTestCase(GenericViewTestCase):
def _request_reserved_task_list(self): def _request_reserved_task_list(self):
return self.get( return self.get(
viewname='task_manager:queue_reserved_task_list', viewname='task_manager:queue_reserved_task_list',
args=(self.test_queue.name,), follow=True kwargs={'queue_name': self.test_queue.name}, follow=True
) )
def _request_scheduled_task_list(self): def _request_scheduled_task_list(self):
return self.get( return self.get(
viewname='task_manager:queue_scheduled_task_list', viewname='task_manager:queue_scheduled_task_list',
args=(self.test_queue.name,), follow=True kwargs={'queue_name': self.test_queue.name}, follow=True
) )
def test_queue_list_view_no_permissions(self): def test_queue_list_view_no_permissions(self):

View File

@@ -5,7 +5,6 @@ from django.contrib.auth.models import Group
from mayan.apps.common.tests import GenericViewTestCase from mayan.apps.common.tests import GenericViewTestCase
from mayan.apps.documents.tests import GenericDocumentViewTestCase from mayan.apps.documents.tests import GenericDocumentViewTestCase
from mayan.apps.metadata.models import MetadataType
from mayan.apps.metadata.permissions import permission_document_metadata_edit from mayan.apps.metadata.permissions import permission_document_metadata_edit
from mayan.apps.metadata.tests.mixins import MetadataTypeTestMixin from mayan.apps.metadata.tests.mixins import MetadataTypeTestMixin