diff --git a/mayan/apps/acls/models.py b/mayan/apps/acls/models.py index 3e7cc833ff..e580c980e0 100644 --- a/mayan/apps/acls/models.py +++ b/mayan/apps/acls/models.py @@ -5,7 +5,7 @@ import logging from django.contrib.contenttypes.fields import GenericForeignKey from django.contrib.contenttypes.models import ContentType from django.db import models -from django.utils.encoding import python_2_unicode_compatible +from django.utils.encoding import force_text, python_2_unicode_compatible from django.utils.translation import ugettext_lazy as _ from permissions.models import Role, StoredPermission @@ -68,7 +68,7 @@ class AccessControlList(models.Model): def get_permission_titles(self): result = ', '.join( - [unicode(permission) for permission in self.permissions.all()] + [force_text(permission) for permission in self.permissions.all()] ) return result or _('None') diff --git a/mayan/apps/acls/views.py b/mayan/apps/acls/views.py index 4e6747b432..b2913d940a 100644 --- a/mayan/apps/acls/views.py +++ b/mayan/apps/acls/views.py @@ -7,6 +7,7 @@ from django.contrib.contenttypes.models import ContentType from django.core.urlresolvers import reverse from django.http import Http404, HttpResponseRedirect from django.shortcuts import get_object_or_404 +from django.utils.encoding import force_text from django.utils.translation import ugettext_lazy as _ from common.views import ( @@ -156,7 +157,7 @@ class ACLPermissionsView(AssignRemoveView): for namespace, permissions in itertools.groupby(entries, lambda entry: entry.namespace): permission_options = [ - (unicode(permission.pk), permission) for permission in permissions + (force_text(permission.pk), permission) for permission in permissions ] results.append( (PermissionNamespace.get(namespace), permission_options) diff --git a/mayan/apps/checkouts/api_views.py b/mayan/apps/checkouts/api_views.py index 6264dfc4a4..f41e76b0e4 100644 --- a/mayan/apps/checkouts/api_views.py +++ b/mayan/apps/checkouts/api_views.py @@ -3,6 +3,7 @@ from __future__ import absolute_import, unicode_literals import pytz from django.shortcuts import get_object_or_404 +from django.utils.encoding import force_text from rest_framework import generics, status from rest_framework.response import Response @@ -76,7 +77,7 @@ class APICheckedoutDocumentListView(generics.ListCreateAPIView): ) except Exception as exception: return Response( - data={'exception': unicode(exception)}, + data={'exception': force_text(exception)}, status=status.HTTP_400_BAD_REQUEST ) diff --git a/mayan/apps/checkouts/exceptions.py b/mayan/apps/checkouts/exceptions.py index 168090eed6..f5452e660c 100644 --- a/mayan/apps/checkouts/exceptions.py +++ b/mayan/apps/checkouts/exceptions.py @@ -1,5 +1,6 @@ from __future__ import unicode_literals +from django.utils.encoding import python_2_unicode_compatible from django.utils.translation import ugettext @@ -17,11 +18,12 @@ class DocumentNotCheckedOut(DocumentCheckoutError): pass +@python_2_unicode_compatible class DocumentAlreadyCheckedOut(DocumentCheckoutError): """ Raised when trying to checkout an already checkedout document """ - def __unicode__(self): + def __str__(self): return ugettext('Document already checked out.') diff --git a/mayan/apps/checkouts/models.py b/mayan/apps/checkouts/models.py index 3ab39c28d3..9830154868 100644 --- a/mayan/apps/checkouts/models.py +++ b/mayan/apps/checkouts/models.py @@ -6,7 +6,7 @@ from django.conf import settings from django.core.exceptions import ValidationError from django.core.urlresolvers import reverse from django.db import models -from django.utils.encoding import python_2_unicode_compatible +from django.utils.encoding import force_text, python_2_unicode_compatible from django.utils.timezone import now from django.utils.translation import ugettext_lazy as _ @@ -46,7 +46,7 @@ class DocumentCheckout(models.Model): objects = DocumentCheckoutManager() def __str__(self): - return unicode(self.document) + return force_text(self.document) def clean(self): if self.expiration_datetime < now(): diff --git a/mayan/apps/common/classes.py b/mayan/apps/common/classes.py index 03ed9f5331..d6ce37a3fe 100644 --- a/mayan/apps/common/classes.py +++ b/mayan/apps/common/classes.py @@ -3,9 +3,11 @@ from __future__ import unicode_literals from django.apps import apps from django.core.urlresolvers import reverse from django.db import models +from django.utils.encoding import force_text, python_2_unicode_compatible from django.utils.translation import ugettext +@python_2_unicode_compatible class Collection(object): _registry = [] @@ -22,8 +24,8 @@ class Collection(object): self._order = order or 99 self.__class__._registry.append(self) - def __unicode__(self): - return unicode(self.label) + def __str__(self): + return force_text(self.label) def resolve(self): self.children = self._get_children() @@ -61,6 +63,7 @@ class DashboardWidget(object): self.__class__._registry.append(self) +@python_2_unicode_compatible class ModelAttribute(object): __registry = {} @@ -98,7 +101,7 @@ class ModelAttribute(object): for count, attribute in enumerate(cls.get_for(model, type_names), 1): result.append( '{}) {}'.format( - count, unicode(attribute.get_display(show_name=True)) + count, force_text(attribute.get_display(show_name=True)) ) ) @@ -112,9 +115,9 @@ class ModelAttribute(object): self.name if show_name else self.label, self.description ) else: - return unicode(self.name if show_name else self.label) + return force_text(self.name if show_name else self.label) - def __unicode__(self): + def __str__(self): return self.get_display() def __init__(self, model, name, label=None, description=None, type_name=None): @@ -154,6 +157,7 @@ class MissingItem(object): self.__class__._registry.append(self) +@python_2_unicode_compatible class Filter(object): _registry = {} @@ -175,8 +179,8 @@ class Filter(object): self.__class__._registry[self.slug] = self - def __unicode__(self): - return unicode(self.label) + def __str__(self): + return force_text(self.label) def get_queryset(self, user): AccessControlList = apps.get_model( diff --git a/mayan/apps/common/generics.py b/mayan/apps/common/generics.py index 064b5f7622..b4dd86c7a0 100644 --- a/mayan/apps/common/generics.py +++ b/mayan/apps/common/generics.py @@ -4,6 +4,7 @@ from django.conf import settings from django.contrib import messages from django.contrib.contenttypes.models import ContentType from django.http import HttpResponseRedirect +from django.utils.encoding import force_text from django.utils.translation import ugettext_lazy as _ from django.views.generic import ( FormView as DjangoFormView, DetailView, TemplateView @@ -56,7 +57,7 @@ class AssignRemoveView(ExtraContextMixin, ViewPermissionCheckMixin, ObjectPermis results = [] for choice in choices: ct = ContentType.objects.get_for_model(choice) - label = unicode(choice) + label = force_text(choice) results.append(('%s,%s' % (ct.model, choice.pk), '%s' % (label))) diff --git a/mayan/apps/common/models.py b/mayan/apps/common/models.py index 91168072fb..84a1f61f19 100644 --- a/mayan/apps/common/models.py +++ b/mayan/apps/common/models.py @@ -6,7 +6,7 @@ from pytz import common_timezones from django.conf import settings from django.db import models -from django.utils.encoding import python_2_unicode_compatible +from django.utils.encoding import force_text, python_2_unicode_compatible from django.utils.translation import ugettext_lazy as _ from .runtime import shared_storage_backend @@ -35,7 +35,7 @@ class SharedUploadedFile(models.Model): return self.filename def save(self, *args, **kwargs): - self.filename = unicode(self.file) + self.filename = force_text(self.file) super(SharedUploadedFile, self).save(*args, **kwargs) def delete(self, *args, **kwargs): @@ -61,7 +61,7 @@ class UserLocaleProfile(models.Model): ) def __str__(self): - return unicode(self.user) + return force_text(self.user) class Meta: verbose_name = _('User locale profile') diff --git a/mayan/apps/common/templatetags/common_tags.py b/mayan/apps/common/templatetags/common_tags.py index 70881111c9..2cb3733b73 100644 --- a/mayan/apps/common/templatetags/common_tags.py +++ b/mayan/apps/common/templatetags/common_tags.py @@ -7,6 +7,7 @@ import sh from django.conf import settings from django.template import Context, Library from django.template.loader import get_template +from django.utils.encoding import force_text import mayan @@ -101,4 +102,4 @@ def build(): @register.filter def get_type(value): - return unicode(type(value)) + return force_text(type(value)) diff --git a/mayan/apps/common/utils.py b/mayan/apps/common/utils.py index fb006f6d57..e24404368c 100644 --- a/mayan/apps/common/utils.py +++ b/mayan/apps/common/utils.py @@ -11,6 +11,7 @@ from django.conf import settings from django.core.urlresolvers import resolve as django_resolve from django.urls.base import get_script_prefix from django.utils.datastructures import MultiValueDict +from django.utils.encoding import force_text from django.utils.http import urlquote as django_urlquote from django.utils.http import urlencode as django_urlencode @@ -136,7 +137,7 @@ def return_attrib(obj, attrib, arguments=None): if settings.DEBUG: return 'Attribute error: %s; %s' % (attrib, exception) else: - return unicode(exception) + return force_text(exception) def urlquote(link=None, get=None): diff --git a/mayan/apps/common/widgets.py b/mayan/apps/common/widgets.py index 0355973315..b9a402f7c3 100644 --- a/mayan/apps/common/widgets.py +++ b/mayan/apps/common/widgets.py @@ -2,7 +2,7 @@ from __future__ import unicode_literals from django import forms from django.forms.utils import flatatt -from django.utils.encoding import force_unicode, force_text +from django.utils.encoding import force_text from django.utils.html import conditional_escape, format_html from django.utils.safestring import mark_safe from django.utils.translation import ugettext_lazy as _ @@ -122,7 +122,7 @@ class TextAreaDiv(forms.widgets.Widget): value = '' flat_attrs = flatatt(self.build_attrs(attrs, name=name)) - content = conditional_escape(force_unicode(value)) + content = conditional_escape(force_text(value)) result = '%s' % (flat_attrs, content) return mark_safe(result) diff --git a/mayan/apps/converter/apps.py b/mayan/apps/converter/apps.py index a04056c761..f742adc89a 100644 --- a/mayan/apps/converter/apps.py +++ b/mayan/apps/converter/apps.py @@ -1,5 +1,6 @@ from __future__ import unicode_literals +from django.utils.encoding import force_text from django.utils.translation import ugettext_lazy as _ from common import MayanAppConfig, menu_object, menu_sidebar @@ -26,7 +27,7 @@ class ConverterApp(MayanAppConfig): SourceColumn(source=Transformation, label=_('Order'), attribute='order') SourceColumn( source=Transformation, label=_('Transformation'), - func=lambda context: unicode(context['object']) + func=lambda context: force_text(context['object']) ) SourceColumn( source=Transformation, label=_('Arguments'), attribute='arguments' diff --git a/mayan/apps/document_indexing/forms.py b/mayan/apps/document_indexing/forms.py index 8bdf0dd1b7..c44915b2f0 100644 --- a/mayan/apps/document_indexing/forms.py +++ b/mayan/apps/document_indexing/forms.py @@ -1,6 +1,7 @@ from __future__ import absolute_import, unicode_literals from django import forms +from django.utils.encoding import force_text from django.utils.translation import ugettext_lazy as _ from common.classes import ModelAttribute @@ -27,7 +28,7 @@ class IndexTemplateNodeForm(forms.ModelForm): self.fields['parent'].widget = forms.widgets.HiddenInput() self.fields['expression'].help_text = ' '.join( [ - unicode(self.fields['expression'].help_text), + force_text(self.fields['expression'].help_text), ModelAttribute.help_text_for( Document, type_names=['indexing'] ).replace('\n', '
') diff --git a/mayan/apps/document_indexing/models.py b/mayan/apps/document_indexing/models.py index 3cced84822..a785669604 100644 --- a/mayan/apps/document_indexing/models.py +++ b/mayan/apps/document_indexing/models.py @@ -5,7 +5,7 @@ import logging from django.core.urlresolvers import reverse from django.db import models, transaction from django.template import Context, Template -from django.utils.encoding import python_2_unicode_compatible +from django.utils.encoding import force_text, python_2_unicode_compatible from django.utils.translation import ugettext, ugettext_lazy as _ from mptt.fields import TreeForeignKey @@ -81,7 +81,7 @@ class Index(models.Model): def get_document_types_names(self): return ', '.join( [ - unicode(document_type) for document_type in self.document_types.all() + force_text(document_type) for document_type in self.document_types.all() ] or ['None'] ) @@ -314,9 +314,9 @@ class IndexInstanceNode(MPTTModel): result = [] for node in self.get_ancestors(include_self=True): if node.is_root_node(): - result.append(unicode(self.index())) + result.append(force_text(self.index())) else: - result.append(unicode(node)) + result.append(force_text(node)) return ' / '.join(result) diff --git a/mayan/apps/document_indexing/widgets.py b/mayan/apps/document_indexing/widgets.py index 24a44680ee..0e75c4f661 100644 --- a/mayan/apps/document_indexing/widgets.py +++ b/mayan/apps/document_indexing/widgets.py @@ -2,6 +2,7 @@ from __future__ import unicode_literals from django.apps import apps +from django.utils.encoding import force_text from django.utils.html import mark_safe, escape @@ -50,7 +51,7 @@ def node_level(node): [ '     ' * node.get_level(), '' if node.is_root_node() else ' ', - unicode(node) + force_text(node) ] ) ) diff --git a/mayan/apps/document_signatures/models.py b/mayan/apps/document_signatures/models.py index fede657b90..0bd47554b1 100644 --- a/mayan/apps/document_signatures/models.py +++ b/mayan/apps/document_signatures/models.py @@ -5,7 +5,7 @@ import uuid from django.core.urlresolvers import reverse from django.db import models -from django.utils.encoding import python_2_unicode_compatible +from django.utils.encoding import force_text, python_2_unicode_compatible from django.utils.translation import ugettext_lazy as _ from model_utils.managers import InheritanceManager @@ -21,7 +21,7 @@ logger = logging.getLogger(__name__) def upload_to(*args, **kwargs): - return unicode(uuid.uuid4()) + return force_text(uuid.uuid4()) @python_2_unicode_compatible diff --git a/mayan/apps/document_signatures/views.py b/mayan/apps/document_signatures/views.py index b556c4601a..8354baf618 100644 --- a/mayan/apps/document_signatures/views.py +++ b/mayan/apps/document_signatures/views.py @@ -7,6 +7,7 @@ from django.core.files import File from django.core.urlresolvers import reverse from django.http import HttpResponseRedirect from django.shortcuts import get_object_or_404 +from django.utils.encoding import force_text from django.utils.translation import ugettext_lazy as _ from acls.models import AccessControlList @@ -284,7 +285,7 @@ class DocumentVersionSignatureDownloadView(SingleObjectDownloadView): signature = self.get_object() return DocumentVersionSignatureDownloadView.VirtualFile( - signature.signature_file, name=unicode(signature) + signature.signature_file, name=force_text(signature) ) diff --git a/mayan/apps/document_states/models.py b/mayan/apps/document_states/models.py index 6984cb15d9..05ae0b6581 100644 --- a/mayan/apps/document_states/models.py +++ b/mayan/apps/document_states/models.py @@ -6,7 +6,7 @@ from django.conf import settings from django.core.exceptions import PermissionDenied, ValidationError from django.core.urlresolvers import reverse from django.db import IntegrityError, models -from django.utils.encoding import python_2_unicode_compatible +from django.utils.encoding import force_text, python_2_unicode_compatible from django.utils.translation import ugettext_lazy as _ from acls.models import AccessControlList @@ -159,7 +159,7 @@ class WorkflowInstance(models.Model): ) def __str__(self): - return unicode(self.workflow) + return force_text(self.workflow) def get_absolute_url(self): return reverse( @@ -277,7 +277,7 @@ class WorkflowInstanceLogEntry(models.Model): comment = models.TextField(blank=True, verbose_name=_('Comment')) def __str__(self): - return unicode(self.transition) + return force_text(self.transition) class Meta: verbose_name = _('Workflow instance log entry') diff --git a/mayan/apps/documents/api_views.py b/mayan/apps/documents/api_views.py index a8ae03d5db..6a4c03462c 100644 --- a/mayan/apps/documents/api_views.py +++ b/mayan/apps/documents/api_views.py @@ -4,6 +4,7 @@ import logging from django.http import HttpResponse from django.shortcuts import get_object_or_404 +from django.utils.encoding import force_text from django_downloadview import DownloadMixin, VirtualFile from rest_framework import generics, status @@ -198,7 +199,7 @@ class APIDocumentVersionDownloadView(DownloadMixin, generics.RetrieveAPIView): def get_file(self): instance = self.get_object() - return VirtualFile(instance.file, name=unicode(instance)) + return VirtualFile(instance.file, name=force_text(instance)) def get_serializer_class(self): return None diff --git a/mayan/apps/documents/models.py b/mayan/apps/documents/models.py index 04325b8ed1..f3ba543f28 100644 --- a/mayan/apps/documents/models.py +++ b/mayan/apps/documents/models.py @@ -8,7 +8,7 @@ from django.conf import settings from django.core.files import File from django.core.urlresolvers import reverse from django.db import models, transaction -from django.utils.encoding import python_2_unicode_compatible +from django.utils.encoding import force_text, python_2_unicode_compatible from django.utils.timezone import now from django.utils.translation import ugettext, ugettext_lazy as _ @@ -52,7 +52,7 @@ def HASH_FUNCTION(data): def UUID_FUNCTION(*args, **kwargs): - return unicode(uuid.uuid4()) + return force_text(uuid.uuid4()) @python_2_unicode_compatible @@ -433,7 +433,7 @@ class DocumentVersion(models.Model): self.document.is_stub = False if not self.document.label: - self.document.label = unicode(self.file) + self.document.label = force_text(self.file) self.document.save() except Exception as exception: @@ -584,7 +584,7 @@ class DocumentVersion(models.Model): """ if self.exists(): source = self.open() - self.checksum = unicode(HASH_FUNCTION(source.read())) + self.checksum = force_text(HASH_FUNCTION(source.read())) source.close() if save: self.save() @@ -682,7 +682,7 @@ class DocumentPage(models.Model): return _( 'Page %(page_num)d out of %(total_pages)d of %(document)s' ) % { - 'document': unicode(self.document), + 'document': force_text(self.document), 'page_num': self.page_number, 'total_pages': self.document_version.pages.count() } @@ -881,7 +881,7 @@ class RecentDocument(models.Model): objects = RecentDocumentManager() def __str__(self): - return unicode(self.document) + return force_text(self.document) def natural_key(self): return self.document.natural_key() + self.user.natural_key() diff --git a/mayan/apps/documents/serializers.py b/mayan/apps/documents/serializers.py index 77a5fcf08d..8def99ad0d 100644 --- a/mayan/apps/documents/serializers.py +++ b/mayan/apps/documents/serializers.py @@ -1,5 +1,7 @@ from __future__ import unicode_literals +from django.utils.encoding import force_text + from rest_framework import serializers from rest_framework.reverse import reverse @@ -281,7 +283,7 @@ class NewDocumentSerializer(serializers.ModelSerializer): description=self.validated_data.get('description', ''), document_type=self.validated_data['document_type'], label=self.validated_data.get( - 'label', unicode(self.validated_data['file']) + 'label', force_text(self.validated_data['file']) ), language=self.validated_data.get( 'language', setting_language.value diff --git a/mayan/apps/documents/tests/test_views.py b/mayan/apps/documents/tests/test_views.py index edef13ce5d..4563612a77 100644 --- a/mayan/apps/documents/tests/test_views.py +++ b/mayan/apps/documents/tests/test_views.py @@ -4,6 +4,7 @@ from __future__ import unicode_literals from django.contrib.contenttypes.models import ContentType from django.test import override_settings +from django.utils.encoding import force_text from common.tests.test_views import GenericViewTestCase from converter.models import Transformation @@ -482,7 +483,7 @@ class DocumentsViewsTestCase(GenericDocumentViewTestCase): ) self.assertContains( - response, unicode(self.document.pages.first()), status_code=200 + response, force_text(self.document.pages.first()), status_code=200 ) diff --git a/mayan/apps/documents/views/document_views.py b/mayan/apps/documents/views/document_views.py index 8820992657..be3bb84833 100644 --- a/mayan/apps/documents/views/document_views.py +++ b/mayan/apps/documents/views/document_views.py @@ -7,6 +7,7 @@ from django.core.exceptions import PermissionDenied from django.core.urlresolvers import reverse, reverse_lazy from django.http import HttpResponseRedirect from django.shortcuts import get_object_or_404 +from django.utils.encoding import force_text from django.utils.http import urlencode from django.utils.translation import ugettext_lazy as _, ungettext @@ -454,7 +455,7 @@ class DocumentDownloadView(SingleObjectDownloadView): if isinstance(item, Document): return item.label else: - return unicode(item) + return force_text(item) def get_document_queryset(self): id_list = self.request.GET.get( diff --git a/mayan/apps/documents/widgets.py b/mayan/apps/documents/widgets.py index 69f14a543d..90e1695563 100644 --- a/mayan/apps/documents/widgets.py +++ b/mayan/apps/documents/widgets.py @@ -2,6 +2,7 @@ from __future__ import unicode_literals from django import forms from django.core.urlresolvers import reverse +from django.utils.encoding import force_text from django.utils.html import strip_tags from django.utils.http import urlencode from django.utils.safestring import mark_safe @@ -308,7 +309,7 @@ class DocumentThumbnailWidget(BaseDocumentThumbnailWidget): class DocumentPageThumbnailWidget(BaseDocumentThumbnailWidget): def get_title(self, instance): - return unicode(instance) + return force_text(instance) class InteractiveDocumentPageWidget(BaseDocumentThumbnailWidget): diff --git a/mayan/apps/dynamic_search/api_views.py b/mayan/apps/dynamic_search/api_views.py index 0932b046e9..9313109b4f 100644 --- a/mayan/apps/dynamic_search/api_views.py +++ b/mayan/apps/dynamic_search/api_views.py @@ -1,5 +1,7 @@ from __future__ import unicode_literals +from django.utils.encoding import force_text + from rest_framework import generics from rest_framework.exceptions import ParseError @@ -40,7 +42,7 @@ class APISearchView(SearchModelMixin, generics.ListAPIView): query_string=self.request.GET, user=self.request.user ) except Exception as exception: - raise ParseError(unicode(exception)) + raise ParseError(force_text(exception)) return queryset @@ -83,7 +85,7 @@ class APIAdvancedSearchView(SearchModelMixin, generics.ListAPIView): global_and_search=global_and_search ) except Exception as exception: - raise ParseError(unicode(exception)) + raise ParseError(force_text(exception)) return queryset diff --git a/mayan/apps/dynamic_search/classes.py b/mayan/apps/dynamic_search/classes.py index bc706fd8bf..20b045c4ce 100644 --- a/mayan/apps/dynamic_search/classes.py +++ b/mayan/apps/dynamic_search/classes.py @@ -6,6 +6,7 @@ import re from django.apps import apps from django.db.models import Q +from django.utils.encoding import force_text from django.utils.module_loading import import_string from django.utils.translation import ugettext as _ @@ -220,7 +221,7 @@ class SearchModel(object): result_set = result_set | model_result_set - elapsed_time = unicode( + elapsed_time = force_text( datetime.datetime.now() - start_time ).split(':')[2] diff --git a/mayan/apps/dynamic_search/mixins.py b/mayan/apps/dynamic_search/mixins.py index a73206d764..631fa219ac 100644 --- a/mayan/apps/dynamic_search/mixins.py +++ b/mayan/apps/dynamic_search/mixins.py @@ -1,6 +1,7 @@ from __future__ import unicode_literals from django.http import Http404 +from django.utils.encoding import force_text from .classes import SearchModel @@ -10,4 +11,4 @@ class SearchModelMixin(object): try: return SearchModel.get(self.kwargs['search_model']) except KeyError as exception: - raise Http404(unicode(exception)) + raise Http404(force_text(exception)) diff --git a/mayan/apps/events/classes.py b/mayan/apps/events/classes.py index 1cc0ad7df5..c54e7aa0ca 100644 --- a/mayan/apps/events/classes.py +++ b/mayan/apps/events/classes.py @@ -1,6 +1,7 @@ from __future__ import unicode_literals from django.apps import apps +from django.utils.encoding import force_text from django.utils.translation import ugettext_lazy as _ from actstream import action @@ -27,7 +28,7 @@ class Event(object): try: return cls.get(name=name).label except KeyError as exception: - return unicode(exception) + return force_text(exception) def __init__(self, name, label): self.name = name diff --git a/mayan/apps/linking/forms.py b/mayan/apps/linking/forms.py index dad3d424cb..56f0f2195a 100644 --- a/mayan/apps/linking/forms.py +++ b/mayan/apps/linking/forms.py @@ -1,6 +1,7 @@ from __future__ import unicode_literals from django import forms +from django.utils.encoding import force_text from django.utils.translation import ugettext_lazy as _ from common.classes import ModelAttribute @@ -14,7 +15,7 @@ class SmartLinkForm(forms.ModelForm): super(SmartLinkForm, self).__init__(*args, **kwargs) self.fields['dynamic_label'].help_text = ' '.join( [ - unicode(self.fields['dynamic_label'].help_text), + force_text(self.fields['dynamic_label'].help_text), ModelAttribute.help_text_for( Document, type_names=['field', 'related', 'property'] ).replace('\n', '
') @@ -36,7 +37,7 @@ class SmartLinkConditionForm(forms.ModelForm): ) self.fields['expression'].help_text = ' '.join( [ - unicode(self.fields['expression'].help_text), + force_text(self.fields['expression'].help_text), ModelAttribute.help_text_for( Document, type_names=['field', 'related', 'property'] ).replace('\n', '
') diff --git a/mayan/apps/linking/models.py b/mayan/apps/linking/models.py index 22e599d50d..7b89185370 100644 --- a/mayan/apps/linking/models.py +++ b/mayan/apps/linking/models.py @@ -3,7 +3,7 @@ from __future__ import unicode_literals from django.db import models from django.db.models import Q from django.template import Context, Template -from django.utils.encoding import python_2_unicode_compatible +from django.utils.encoding import force_text, python_2_unicode_compatible from django.utils.translation import ugettext_lazy as _ from documents.models import Document, DocumentType @@ -43,7 +43,9 @@ class SmartLink(models.Model): return template.render(context=context) except Exception as exception: return _( - 'Error generating dynamic label; %s' % unicode(exception) + 'Error generating dynamic label; %s' % force_text( + exception + ) ) else: return None diff --git a/mayan/apps/metadata/models.py b/mayan/apps/metadata/models.py index b6aaeab76e..0fd67c9771 100644 --- a/mayan/apps/metadata/models.py +++ b/mayan/apps/metadata/models.py @@ -160,7 +160,7 @@ class DocumentMetadata(models.Model): ) def __str__(self): - return unicode(self.metadata_type) + return force_text(self.metadata_type) def delete(self, enforce_required=True, *args, **kwargs): if enforce_required and self.metadata_type.pk in self.document.document_type.metadata.filter(required=True).values_list('metadata_type', flat=True): @@ -209,7 +209,7 @@ class DocumentTypeMetadataType(models.Model): required = models.BooleanField(default=False, verbose_name=_('Required')) def __str__(self): - return unicode(self.metadata_type) + return force_text(self.metadata_type) class Meta: unique_together = ('document_type', 'metadata_type') diff --git a/mayan/apps/metadata/views.py b/mayan/apps/metadata/views.py index 8ddc570f1f..f42253180b 100644 --- a/mayan/apps/metadata/views.py +++ b/mayan/apps/metadata/views.py @@ -313,7 +313,7 @@ class DocumentMetadataEditView(MultipleObjectFormActionView): if isinstance(error, ValidationError): exception_message = ', '.join(error.messages) else: - exception_message = unicode(error) + exception_message = force_text(error) messages.error( self.request, _( diff --git a/mayan/apps/navigation/classes.py b/mayan/apps/navigation/classes.py index e1a153d040..1a313d50e3 100644 --- a/mayan/apps/navigation/classes.py +++ b/mayan/apps/navigation/classes.py @@ -11,7 +11,7 @@ from django.core.exceptions import PermissionDenied from django.core.urlresolvers import resolve, reverse from django.template import VariableDoesNotExist, Variable from django.template.defaulttags import URLNode -from django.utils.encoding import force_text, smart_str, smart_unicode +from django.utils.encoding import force_text from django.utils.http import urlencode, urlquote from common.utils import return_attrib @@ -351,11 +351,11 @@ class Link(object): # Lets a new link keep the same URL query string of the current URL if self.keep_query: # Sometimes we are required to remove a key from the URL QS - previous_path = smart_unicode( + previous_path = force_text( urllib.unquote_plus( - smart_str( + force_text( request.get_full_path() - ) or smart_str( + ) or force_text( request.META.get( 'HTTP_REFERER', reverse(settings.LOGIN_REDIRECT_URL) diff --git a/mayan/apps/ocr/forms.py b/mayan/apps/ocr/forms.py index 939e19a741..8d1729138c 100644 --- a/mayan/apps/ocr/forms.py +++ b/mayan/apps/ocr/forms.py @@ -1,7 +1,7 @@ from __future__ import unicode_literals from django import forms -from django.utils.encoding import force_unicode +from django.utils.encoding import force_text from django.utils.html import conditional_escape from django.utils.safestring import mark_safe from django.utils.translation import ugettext_lazy as _, ugettext @@ -33,7 +33,7 @@ class DocumentContentForm(forms.Form): except DocumentPageContent.DoesNotExist: pass else: - content.append(conditional_escape(force_unicode(page_content))) + content.append(conditional_escape(force_text(page_content))) content.append( '\n\n\n
- %s -

\n\n\n' % ( ugettext( diff --git a/mayan/apps/ocr/models.py b/mayan/apps/ocr/models.py index 9b9cdf77d1..f0723c4cfe 100644 --- a/mayan/apps/ocr/models.py +++ b/mayan/apps/ocr/models.py @@ -1,7 +1,7 @@ from __future__ import unicode_literals from django.db import models -from django.utils.encoding import python_2_unicode_compatible +from django.utils.encoding import force_text, python_2_unicode_compatible from django.utils.translation import ugettext_lazy as _ from documents.models import DocumentPage, DocumentType, DocumentVersion @@ -37,7 +37,7 @@ class DocumentVersionOCRError(models.Model): result = models.TextField(blank=True, null=True, verbose_name=_('Result')) def __str__(self): - return unicode(self.document_version) + return force_text(self.document_version) class Meta: ordering = ('datetime_submitted',) @@ -57,7 +57,7 @@ class DocumentPageContent(models.Model): content = models.TextField(blank=True, verbose_name=_('Content')) def __str__(self): - return unicode(self.document_page) + return force_text(self.document_page) class Meta: verbose_name = _('Document page content') diff --git a/mayan/apps/ocr/utils.py b/mayan/apps/ocr/utils.py index 809ae16b83..b2b9d19a03 100644 --- a/mayan/apps/ocr/utils.py +++ b/mayan/apps/ocr/utils.py @@ -1,6 +1,6 @@ from __future__ import unicode_literals -from django.utils.encoding import force_unicode +from django.utils.encoding import force_text from django.utils.html import conditional_escape @@ -11,4 +11,4 @@ def get_document_ocr_content(document): except DocumentPageContent.DoesNotExist: pass else: - yield conditional_escape(force_unicode(page_content)) + yield conditional_escape(force_text(page_content)) diff --git a/mayan/apps/permissions/classes.py b/mayan/apps/permissions/classes.py index 32cf056d67..7ee6eea93e 100644 --- a/mayan/apps/permissions/classes.py +++ b/mayan/apps/permissions/classes.py @@ -4,6 +4,7 @@ import logging from django.apps import apps from django.core.exceptions import PermissionDenied +from django.utils.encoding import force_text, python_2_unicode_compatible from django.utils.translation import ugettext_lazy as _ from .exceptions import InvalidNamespace @@ -11,6 +12,7 @@ from .exceptions import InvalidNamespace logger = logging.getLogger(__name__) +@python_2_unicode_compatible class PermissionNamespace(object): _registry = {} @@ -35,8 +37,8 @@ class PermissionNamespace(object): self.permissions = [] self.__class__._registry[name] = self - def __unicode__(self): - return unicode(self.label) + def __str__(self): + return force_text(self.label) def add_permission(self, name, label): permission = Permission(namespace=self, name=name, label=label) @@ -44,6 +46,7 @@ class PermissionNamespace(object): return permission +@python_2_unicode_compatible class Permission(object): _permissions = {} _stored_permissions_cache = {} @@ -105,11 +108,8 @@ class Permission(object): def __repr__(self): return self.pk - def __unicode__(self): - return unicode(self.label) - def __str__(self): - return str(self.__unicode__()) + return force_text(self.label) @property def stored_permission(self): diff --git a/mayan/apps/permissions/models.py b/mayan/apps/permissions/models.py index 0099eb2d81..47ffc81912 100644 --- a/mayan/apps/permissions/models.py +++ b/mayan/apps/permissions/models.py @@ -5,7 +5,7 @@ import logging from django.contrib.auth.models import Group from django.core.urlresolvers import reverse from django.db import models -from django.utils.encoding import python_2_unicode_compatible +from django.utils.encoding import force_text, python_2_unicode_compatible from django.utils.translation import ugettext_lazy as _ from .classes import Permission @@ -34,7 +34,7 @@ class StoredPermission(models.Model): pass def __str__(self): - return unicode(getattr(self, 'volatile_permission', self.name)) + return force_text(getattr(self, 'volatile_permission', self.name)) def natural_key(self): return (self.namespace, self.name) diff --git a/mayan/apps/permissions/views.py b/mayan/apps/permissions/views.py index f04eaf82b0..7722b5df21 100644 --- a/mayan/apps/permissions/views.py +++ b/mayan/apps/permissions/views.py @@ -5,6 +5,7 @@ import itertools from django.contrib.auth.models import Group from django.core.urlresolvers import reverse_lazy from django.shortcuts import get_object_or_404 +from django.utils.encoding import force_text from django.utils.translation import ugettext_lazy as _ from common.views import ( @@ -61,12 +62,12 @@ class SetupRoleMembersView(AssignRemoveView): def left_list(self): return [ - (unicode(group.pk), group.name) for group in set(Group.objects.all()) - set(self.get_object().groups.all()) + (force_text(group.pk), group.name) for group in set(Group.objects.all()) - set(self.get_object().groups.all()) ] def right_list(self): return [ - (unicode(group.pk), group.name) for group in self.get_object().groups.all() + (force_text(group.pk), group.name) for group in self.get_object().groups.all() ] def remove(self, item): @@ -102,7 +103,7 @@ class SetupRolePermissionsView(AssignRemoveView): for namespace, permissions in itertools.groupby(StoredPermission.objects.exclude(id__in=self.get_object().permissions.values_list('pk', flat=True)), lambda entry: entry.namespace): permission_options = [ - (unicode(permission.pk), permission) for permission in permissions + (force_text(permission.pk), permission) for permission in permissions ] results.append( (PermissionNamespace.get(namespace), permission_options) @@ -114,7 +115,7 @@ class SetupRolePermissionsView(AssignRemoveView): results = [] for namespace, permissions in itertools.groupby(self.get_object().permissions.all(), lambda entry: entry.namespace): permission_options = [ - (unicode(permission.pk), permission) for permission in permissions + (force_text(permission.pk), permission) for permission in permissions ] results.append( (PermissionNamespace.get(namespace), permission_options) diff --git a/mayan/apps/rest_api/classes.py b/mayan/apps/rest_api/classes.py index 6a47538bbe..8e359f7108 100644 --- a/mayan/apps/rest_api/classes.py +++ b/mayan/apps/rest_api/classes.py @@ -2,9 +2,11 @@ from __future__ import unicode_literals from django.conf.urls import include, url from django.conf import settings +from django.utils.encoding import force_text, python_2_unicode_compatible from django.utils.module_loading import import_string +@python_2_unicode_compatible class APIEndPoint(object): _registry = {} @@ -16,8 +18,8 @@ class APIEndPoint(object): def get(cls, name): return cls._registry[name] - def __unicode__(self): - return unicode(self.app.name) + def __str__(self): + return force_text(self.app.name) def __init__(self, app, version_string, name=None): self.app = app diff --git a/mayan/apps/smart_settings/classes.py b/mayan/apps/smart_settings/classes.py index c12e50f57b..b7f89c26c8 100644 --- a/mayan/apps/smart_settings/classes.py +++ b/mayan/apps/smart_settings/classes.py @@ -9,11 +9,12 @@ import yaml from django.apps import apps from django.conf import settings from django.utils.functional import Promise -from django.utils.encoding import force_text +from django.utils.encoding import force_text, python_2_unicode_compatible logger = logging.getLogger(__name__) +@python_2_unicode_compatible class Namespace(object): _registry = {} @@ -42,8 +43,8 @@ class Namespace(object): for namespace in cls.get_all(): namespace.invalidate_cache() - def __unicode__(self): - return unicode(self.label) + def __str__(self): + return force_text(self.label) def __init__(self, name, label): if name in self.__class__._registry: @@ -63,6 +64,7 @@ class Namespace(object): setting.invalidate_cache() +@python_2_unicode_compatible class Setting(object): _registry = {} @@ -89,8 +91,8 @@ class Setting(object): namespace.settings.append(self) self.__class__._registry[global_name] = self - def __unicode__(self): - return unicode(self.global_name) + def __str__(self): + return force_text(self.global_name) def cache_value(self): environment_value = os.environ.get('MAYAN_{}'.format(self.global_name)) diff --git a/mayan/apps/sources/classes.py b/mayan/apps/sources/classes.py index beea517edf..6df53aa478 100644 --- a/mayan/apps/sources/classes.py +++ b/mayan/apps/sources/classes.py @@ -11,6 +11,7 @@ except ImportError: from StringIO import StringIO from django.core.files import File +from django.utils.encoding import force_text, python_2_unicode_compatible from converter import TransformationResize, converter_class @@ -39,6 +40,7 @@ class Attachment(File): ) +@python_2_unicode_compatible class StagingFile(object): """ Simple class to extend the File class to add preview capabilities @@ -57,8 +59,8 @@ class StagingFile(object): filename.encode('utf8') ) - def __unicode__(self): - return unicode(self.filename) + def __str__(self): + return force_text(self.filename) def as_file(self): return File( diff --git a/mayan/apps/sources/forms.py b/mayan/apps/sources/forms.py index 8b555d345e..53fa556139 100644 --- a/mayan/apps/sources/forms.py +++ b/mayan/apps/sources/forms.py @@ -3,6 +3,7 @@ from __future__ import unicode_literals import logging from django import forms +from django.utils.encoding import force_text from django.utils.translation import ugettext from django.utils.translation import ugettext_lazy as _ @@ -59,7 +60,7 @@ class StagingUploadForm(UploadBaseForm): try: self.fields['staging_file_id'].choices = [ - (staging_file.encoded_filename, unicode(staging_file)) for staging_file in self.source.get_files() + (staging_file.encoded_filename, force_text(staging_file)) for staging_file in self.source.get_files() ] except Exception as exception: logger.error('exception: %s', exception) diff --git a/mayan/apps/sources/models.py b/mayan/apps/sources/models.py index e069ad1051..9bd935264f 100644 --- a/mayan/apps/sources/models.py +++ b/mayan/apps/sources/models.py @@ -22,7 +22,7 @@ from django.core.exceptions import ValidationError from django.core.files import File from django.core.files.base import ContentFile from django.db import models, transaction -from django.utils.encoding import python_2_unicode_compatible +from django.utils.encoding import force_text, python_2_unicode_compatible from django.utils.timezone import now from django.utils.translation import ugettext_lazy as _ @@ -66,7 +66,7 @@ class Source(models.Model): @classmethod def class_fullname(cls): - return unicode(dict(SOURCE_CHOICES).get(cls.source_type)) + return force_text(dict(SOURCE_CHOICES).get(cls.source_type)) def __str__(self): return '%s' % self.label @@ -133,7 +133,7 @@ class Source(models.Model): try: compressed_file = CompressedFile(file_object) for compressed_file_child in compressed_file.children(): - kwargs.update({'label': unicode(compressed_file_child)}) + kwargs.update({'label': force_text(compressed_file_child)}) self.upload_document( file_object=File(compressed_file_child), **kwargs ) @@ -315,9 +315,9 @@ class StagingFolderSource(InteractiveSource): def get_preview_size(self): dimensions = [] - dimensions.append(unicode(self.preview_width)) + dimensions.append(force_text(self.preview_width)) if self.preview_height: - dimensions.append(unicode(self.preview_height)) + dimensions.append(force_text(self.preview_height)) return DIMENSION_SEPARATOR.join(dimensions) @@ -556,7 +556,7 @@ class EmailBaseModel(IntervalBaseModel): headers = decode_header(header_text) header_sections = [ - unicode(text, charset or default) for text, charset in headers + force_text(text, charset or default) for text, charset in headers ] return ''.join(header_sections) @@ -740,7 +740,7 @@ class WatchFolderSource(IntervalBaseModel): def check_source(self): # Force self.folder_path to unicode to avoid os.listdir returning # str for non-latin filenames, gh-issue #163 - for file_name in os.listdir(unicode(self.folder_path)): + for file_name in os.listdir(force_text(self.folder_path)): full_path = os.path.join(self.folder_path, file_name) if os.path.isfile(full_path): with File(file=open(full_path, mode='rb')) as file_object: diff --git a/mayan/apps/sources/tasks.py b/mayan/apps/sources/tasks.py index 6d26b7fa8d..b5301668c0 100644 --- a/mayan/apps/sources/tasks.py +++ b/mayan/apps/sources/tasks.py @@ -4,6 +4,7 @@ from django.apps import apps from django.contrib.auth import get_user_model from django.core.files import File from django.db import OperationalError +from django.utils.encoding import force_text from django.utils.translation import ugettext_lazy as _ from mayan.celery import app @@ -128,8 +129,10 @@ def task_source_handle_upload(self, document_type_id, shared_uploaded_file_id, s for compressed_file_child in compressed_file.children(): # TODO: find way to uniquely identify child files # Use filename in the mean time. - if unicode(compressed_file_child) not in skip_list: - kwargs.update({'label': unicode(compressed_file_child)}) + if force_text(compressed_file_child) not in skip_list: + kwargs.update( + {'label': force_text(compressed_file_child)} + ) try: child_shared_uploaded_file = SharedUploadedFile.objects.create( @@ -153,7 +156,7 @@ def task_source_handle_upload(self, document_type_id, shared_uploaded_file_id, s ) return else: - skip_list.append(unicode(compressed_file_child)) + skip_list.append(force_text(compressed_file_child)) task_upload_document.delay( shared_uploaded_file_id=child_shared_uploaded_file.pk, **kwargs diff --git a/mayan/apps/sources/wizards.py b/mayan/apps/sources/wizards.py index fb8c58b893..ebdbd263f6 100644 --- a/mayan/apps/sources/wizards.py +++ b/mayan/apps/sources/wizards.py @@ -3,6 +3,7 @@ from __future__ import unicode_literals from django.contrib import messages from django.core.urlresolvers import reverse from django.http import HttpResponseRedirect +from django.utils.encoding import force_text from django.utils.http import urlencode from django.utils.translation import ugettext_lazy as _ @@ -118,7 +119,7 @@ class DocumentCreateWizard(ViewPermissionCheckMixin, SessionWizardView): pass try: - query_dict['tags'] = ([unicode(tag.pk) for tag in self.get_cleaned_data_for_step(STEP_TAGS)['tags']]) + query_dict['tags'] = ([force_text(tag.pk) for tag in self.get_cleaned_data_for_step(STEP_TAGS)['tags']]) except AttributeError: pass diff --git a/mayan/apps/statistics/classes.py b/mayan/apps/statistics/classes.py index 31257e6a0e..6c66e231b4 100644 --- a/mayan/apps/statistics/classes.py +++ b/mayan/apps/statistics/classes.py @@ -3,12 +3,14 @@ from __future__ import unicode_literals import json from django.apps import apps +from django.utils.encoding import force_text, python_2_unicode_compatible from celery.schedules import crontab from mayan.celery import app +@python_2_unicode_compatible class StatisticNamespace(object): _registry = {} @@ -26,8 +28,8 @@ class StatisticNamespace(object): self._statistics = [] self.__class__._registry[slug] = self - def __unicode__(self): - return unicode(self.label) + def __str__(self): + return force_text(self.label) def add_statistic(self, *args, **kwargs): statistic = Statistic(*args, **kwargs) @@ -39,6 +41,7 @@ class StatisticNamespace(object): return self._statistics +@python_2_unicode_compatible class Statistic(object): _registry = {} @@ -108,8 +111,8 @@ class Statistic(object): self.__class__._registry[slug] = self - def __unicode__(self): - return unicode(self.label) + def __str__(self): + return force_text(self.label) def execute(self): self.store_results(results=self.func())