Permalink
Browse files

[py3] Ported django.utils.encoding.

* Renamed smart_unicode to smart_text (but kept the old name under
  Python 2 for backwards compatibility).
* Renamed smart_str to smart_bytes.
* Re-introduced smart_str as an alias for smart_text under Python 3
  and smart_bytes under Python 2 (which is backwards compatible).
  Thus smart_str always returns a str objects.
* Used the new smart_str in a few places where both Python 2 and 3
  want a str.
  • Loading branch information...
1 parent ee19171 commit c5ef65bcf324f4c90b53be90f4aec069a68e8c59 @aaugustin aaugustin committed Jul 21, 2012
Showing with 629 additions and 583 deletions.
  1. +4 −4 django/contrib/admin/actions.py
  2. +4 −4 django/contrib/admin/filters.py
  3. +4 −4 django/contrib/admin/helpers.py
  4. +3 −3 django/contrib/admin/models.py
  5. +29 −29 django/contrib/admin/options.py
  6. +6 −6 django/contrib/admin/templatetags/admin_list.py
  7. +9 −9 django/contrib/admin/util.py
  8. +3 −3 django/contrib/admin/views/main.py
  9. +4 −4 django/contrib/admin/widgets.py
  10. +2 −2 django/contrib/admindocs/utils.py
  11. +4 −4 django/contrib/auth/hashers.py
  12. +14 −14 django/contrib/auth/tests/forms.py
  13. +2 −2 django/contrib/auth/tests/views.py
  14. +2 −2 django/contrib/comments/forms.py
  15. +2 −2 django/contrib/comments/managers.py
  16. +2 −2 django/contrib/comments/templatetags/comments.py
  17. +2 −2 django/contrib/contenttypes/generic.py
  18. +2 −2 django/contrib/contenttypes/management.py
  19. +5 −5 django/contrib/contenttypes/models.py
  20. +8 −8 django/contrib/databrowse/datastructures.py
  21. +2 −2 django/contrib/databrowse/plugins/calendars.py
  22. +2 −2 django/contrib/databrowse/plugins/fieldchoices.py
  23. +2 −2 django/contrib/formtools/wizard/storage/base.py
  24. +2 −2 django/contrib/gis/sitemaps/views.py
  25. +2 −2 django/contrib/humanize/templatetags/humanize.py
  26. +2 −2 django/contrib/localflavor/au/forms.py
  27. +4 −4 django/contrib/localflavor/br/forms.py
  28. +2 −2 django/contrib/localflavor/ca/forms.py
  29. +2 −2 django/contrib/localflavor/ch/forms.py
  30. +2 −2 django/contrib/localflavor/cl/forms.py
  31. +2 −2 django/contrib/localflavor/fr/forms.py
  32. +2 −2 django/contrib/localflavor/hk/forms.py
  33. +3 −3 django/contrib/localflavor/hr/forms.py
  34. +5 −5 django/contrib/localflavor/id/forms.py
  35. +3 −3 django/contrib/localflavor/in_/forms.py
  36. +2 −2 django/contrib/localflavor/is_/forms.py
  37. +2 −2 django/contrib/localflavor/it/forms.py
  38. +3 −3 django/contrib/localflavor/it/util.py
  39. +2 −2 django/contrib/localflavor/nl/forms.py
  40. +3 −3 django/contrib/localflavor/pt/forms.py
  41. +2 −2 django/contrib/localflavor/tr/forms.py
  42. +2 −2 django/contrib/localflavor/us/forms.py
  43. +10 −10 django/contrib/markup/templatetags/markup.py
  44. +7 −7 django/contrib/messages/storage/base.py
  45. +2 −2 django/contrib/sessions/backends/db.py
  46. +3 −3 django/contrib/staticfiles/management/commands/collectstatic.py
  47. +3 −3 django/contrib/staticfiles/management/commands/findstatic.py
  48. +5 −5 django/contrib/staticfiles/storage.py
  49. +6 −6 django/contrib/syndication/views.py
  50. +3 −3 django/core/cache/backends/base.py
  51. +2 −2 django/core/context_processors.py
  52. +3 −3 django/core/exceptions.py
  53. +3 −3 django/core/files/base.py
  54. +2 −2 django/core/files/storage.py
  55. +2 −2 django/core/files/uploadedfile.py
  56. +4 −4 django/core/handlers/base.py
  57. +3 −3 django/core/handlers/wsgi.py
  58. +6 −6 django/core/mail/message.py
  59. +2 −2 django/core/management/commands/createcachetable.py
  60. +2 −2 django/core/management/commands/loaddata.py
  61. +1 −1 django/core/serializers/base.py
  62. +1 −1 django/core/serializers/json.py
  63. +7 −7 django/core/serializers/python.py
  64. +1 −1 django/core/serializers/pyyaml.py
  65. +9 −9 django/core/serializers/xml_serializer.py
  66. +6 −6 django/core/signing.py
  67. +6 −6 django/core/urlresolvers.py
  68. +3 −3 django/core/validators.py
  69. +5 −5 django/db/backends/__init__.py
  70. +9 −9 django/db/backends/oracle/base.py
  71. +5 −5 django/db/models/base.py
  72. +7 −7 django/db/models/fields/__init__.py
  73. +2 −2 django/db/models/fields/files.py
  74. +3 −3 django/db/models/fields/related.py
  75. +3 −3 django/db/models/options.py
  76. +3 −3 django/db/models/related.py
  77. +2 −2 django/db/models/sql/query.py
  78. +3 −3 django/db/models/sql/subqueries.py
  79. +10 −10 django/forms/fields.py
  80. +10 −10 django/forms/forms.py
  81. +5 −5 django/forms/models.py
  82. +6 −6 django/forms/util.py
  83. +21 −21 django/forms/widgets.py
  84. +12 −12 django/http/__init__.py
  85. +5 −5 django/http/multipartparser.py
  86. +6 −6 django/template/base.py
  87. +2 −2 django/template/debug.py
  88. +9 −9 django/template/defaultfilters.py
  89. +3 −3 django/template/defaulttags.py
  90. +3 −3 django/templatetags/l10n.py
  91. +5 −5 django/test/client.py
  92. +2 −2 django/test/html.py
  93. +4 −4 django/test/testcases.py
  94. +3 −3 django/utils/_os.py
  95. +2 −2 django/utils/cache.py
  96. +4 −4 django/utils/crypto.py
  97. +3 −3 django/utils/dateformat.py
  98. +42 −24 django/utils/encoding.py
  99. +6 −6 django/utils/feedgenerator.py
  100. +11 −11 django/utils/html.py
  101. +5 −5 django/utils/http.py
  102. +12 −12 django/utils/text.py
  103. +2 −2 django/utils/translation/__init__.py
  104. +3 −3 django/utils/translation/trans_null.py
  105. +3 −3 django/utils/tzinfo.py
  106. +4 −4 django/views/debug.py
  107. +3 −3 django/views/generic/dates.py
  108. +3 −3 django/views/i18n.py
  109. +1 −1 docs/howto/custom-model-fields.txt
  110. +1 −1 docs/ref/databases.txt
  111. +2 −2 docs/ref/models/instances.txt
  112. +1 −1 docs/ref/settings.txt
  113. +12 −12 docs/ref/unicode.txt
  114. +39 −11 docs/ref/utils.txt
  115. +1 −1 docs/releases/1.5.txt
  116. +1 −1 docs/topics/cache.txt
  117. +2 −2 docs/topics/serialization.txt
  118. +4 −4 tests/modeltests/field_subclassing/fields.py
  119. +2 −2 tests/modeltests/field_subclassing/models.py
  120. +30 −30 tests/regressiontests/admin_filters/tests.py
  121. +1 −1 tests/regressiontests/admin_views/admin.py
  122. +3 −3 tests/regressiontests/cache/tests.py
  123. +7 −7 tests/regressiontests/forms/tests/extra.py
  124. +2 −2 tests/regressiontests/signing/tests.py
  125. +3 −3 tests/regressiontests/staticfiles_tests/tests.py
@@ -7,7 +7,7 @@
from django.contrib.admin.util import get_deleted_objects, model_ngettext
from django.db import router
from django.template.response import TemplateResponse
-from django.utils.encoding import force_unicode
+from django.utils.encoding import force_text
from django.utils.translation import ugettext_lazy, ugettext as _
def delete_selected(modeladmin, request, queryset):
@@ -42,7 +42,7 @@ def delete_selected(modeladmin, request, queryset):
n = queryset.count()
if n:
for obj in queryset:
- obj_display = force_unicode(obj)
+ obj_display = force_text(obj)
modeladmin.log_deletion(request, obj, obj_display)
queryset.delete()
modeladmin.message_user(request, _("Successfully deleted %(count)d %(items)s.") % {
@@ -52,9 +52,9 @@ def delete_selected(modeladmin, request, queryset):
return None
if len(queryset) == 1:
- objects_name = force_unicode(opts.verbose_name)
+ objects_name = force_text(opts.verbose_name)
else:
- objects_name = force_unicode(opts.verbose_name_plural)
+ objects_name = force_text(opts.verbose_name_plural)
if perms_needed or protected:
title = _("Cannot delete %(name)s") % {"name": objects_name}
@@ -9,7 +9,7 @@
from django.db import models
from django.core.exceptions import ImproperlyConfigured
-from django.utils.encoding import smart_unicode
+from django.utils.encoding import smart_text
from django.utils.translation import ugettext_lazy as _
from django.utils import timezone
@@ -195,7 +195,7 @@ def choices(self, cl):
}
for pk_val, val in self.lookup_choices:
yield {
- 'selected': self.lookup_val == smart_unicode(pk_val),
+ 'selected': self.lookup_val == smart_text(pk_val),
'query_string': cl.get_query_string({
self.lookup_kwarg: pk_val,
}, [self.lookup_kwarg_isnull]),
@@ -272,7 +272,7 @@ def choices(self, cl):
}
for lookup, title in self.field.flatchoices:
yield {
- 'selected': smart_unicode(lookup) == self.lookup_val,
+ 'selected': smart_text(lookup) == self.lookup_val,
'query_string': cl.get_query_string({
self.lookup_kwarg: lookup}),
'display': title,
@@ -381,7 +381,7 @@ def choices(self, cl):
if val is None:
include_none = True
continue
- val = smart_unicode(val)
+ val = smart_text(val)
yield {
'selected': self.lookup_val == val,
'query_string': cl.get_query_string({
@@ -9,7 +9,7 @@
from django.db.models.fields.related import ManyToManyRel
from django.forms.util import flatatt
from django.template.defaultfilters import capfirst
-from django.utils.encoding import force_unicode, smart_unicode
+from django.utils.encoding import force_text, smart_text
from django.utils.html import conditional_escape, format_html
from django.utils.safestring import mark_safe
from django.utils import six
@@ -122,7 +122,7 @@ def __init__(self, form, field, is_first):
def label_tag(self):
classes = []
- contents = conditional_escape(force_unicode(self.field.label))
+ contents = conditional_escape(force_text(self.field.label))
if self.is_checkbox:
classes.append('vCheckboxLabel')
else:
@@ -166,7 +166,7 @@ def label_tag(self):
label = self.field['label']
return format_html('<label{0}>{1}:</label>',
flatatt(attrs),
- capfirst(force_unicode(label)))
+ capfirst(force_text(label)))
def contents(self):
from django.contrib.admin.templatetags.admin_list import _boolean_icon
@@ -182,7 +182,7 @@ def contents(self):
if boolean:
result_repr = _boolean_icon(value)
else:
- result_repr = smart_unicode(value)
+ result_repr = smart_text(value)
if getattr(attr, "allow_tags", False):
result_repr = mark_safe(result_repr)
else:
@@ -5,15 +5,15 @@
from django.contrib.auth.models import User
from django.contrib.admin.util import quote
from django.utils.translation import ugettext_lazy as _
-from django.utils.encoding import smart_unicode
+from django.utils.encoding import smart_text
ADDITION = 1
CHANGE = 2
DELETION = 3
class LogEntryManager(models.Manager):
def log_action(self, user_id, content_type_id, object_id, object_repr, action_flag, change_message=''):
- e = self.model(None, None, user_id, content_type_id, smart_unicode(object_id), object_repr[:200], action_flag, change_message)
+ e = self.model(None, None, user_id, content_type_id, smart_text(object_id), object_repr[:200], action_flag, change_message)
e.save()
class LogEntry(models.Model):
@@ -34,7 +34,7 @@ class Meta:
ordering = ('-action_time',)
def __repr__(self):
- return smart_unicode(self.action_time)
+ return smart_text(self.action_time)
def __unicode__(self):
if self.action_flag == ADDITION:
@@ -28,7 +28,7 @@
from django.utils.text import capfirst, get_text_list
from django.utils.translation import ugettext as _
from django.utils.translation import ungettext
-from django.utils.encoding import force_unicode
+from django.utils.encoding import force_text
HORIZONTAL, VERTICAL = 1, 2
# returns the <ul> class for a given radio_admin field
@@ -520,7 +520,7 @@ def log_addition(self, request, object):
user_id = request.user.pk,
content_type_id = ContentType.objects.get_for_model(object).pk,
object_id = object.pk,
- object_repr = force_unicode(object),
+ object_repr = force_text(object),
action_flag = ADDITION
)
@@ -535,7 +535,7 @@ def log_change(self, request, object, message):
user_id = request.user.pk,
content_type_id = ContentType.objects.get_for_model(object).pk,
object_id = object.pk,
- object_repr = force_unicode(object),
+ object_repr = force_text(object),
action_flag = CHANGE,
change_message = message
)
@@ -560,7 +560,7 @@ def action_checkbox(self, obj):
"""
A list_display column containing a checkbox widget.
"""
- return helpers.checkbox.render(helpers.ACTION_CHECKBOX_NAME, force_unicode(obj.pk))
+ return helpers.checkbox.render(helpers.ACTION_CHECKBOX_NAME, force_text(obj.pk))
action_checkbox.short_description = mark_safe('<input type="checkbox" id="action-toggle" />')
action_checkbox.allow_tags = True
@@ -674,17 +674,17 @@ def construct_change_message(self, request, form, formsets):
for formset in formsets:
for added_object in formset.new_objects:
change_message.append(_('Added %(name)s "%(object)s".')
- % {'name': force_unicode(added_object._meta.verbose_name),
- 'object': force_unicode(added_object)})
+ % {'name': force_text(added_object._meta.verbose_name),
+ 'object': force_text(added_object)})
for changed_object, changed_fields in formset.changed_objects:
change_message.append(_('Changed %(list)s for %(name)s "%(object)s".')
% {'list': get_text_list(changed_fields, _('and')),
- 'name': force_unicode(changed_object._meta.verbose_name),
- 'object': force_unicode(changed_object)})
+ 'name': force_text(changed_object._meta.verbose_name),
+ 'object': force_text(changed_object)})
for deleted_object in formset.deleted_objects:
change_message.append(_('Deleted %(name)s "%(object)s".')
- % {'name': force_unicode(deleted_object._meta.verbose_name),
- 'object': force_unicode(deleted_object)})
+ % {'name': force_text(deleted_object._meta.verbose_name),
+ 'object': force_text(deleted_object)})
change_message = ' '.join(change_message)
return change_message or _('No fields changed.')
@@ -769,7 +769,7 @@ def response_add(self, request, obj, post_url_continue='../%s/'):
opts = obj._meta
pk_value = obj._get_pk_val()
- msg = _('The %(name)s "%(obj)s" was added successfully.') % {'name': force_unicode(opts.verbose_name), 'obj': force_unicode(obj)}
+ msg = _('The %(name)s "%(obj)s" was added successfully.') % {'name': force_text(opts.verbose_name), 'obj': force_text(obj)}
# Here, we distinguish between different save types by checking for
# the presence of keys in request.POST.
if "_continue" in request.POST:
@@ -782,10 +782,10 @@ def response_add(self, request, obj, post_url_continue='../%s/'):
return HttpResponse(
'<!DOCTYPE html><html><head><title></title></head><body>'
'<script type="text/javascript">opener.dismissAddAnotherPopup(window, "%s", "%s");</script></body></html>' % \
- # escape() calls force_unicode.
+ # escape() calls force_text.
(escape(pk_value), escapejs(obj)))
elif "_addanother" in request.POST:
- self.message_user(request, msg + ' ' + (_("You may add another %s below.") % force_unicode(opts.verbose_name)))
+ self.message_user(request, msg + ' ' + (_("You may add another %s below.") % force_text(opts.verbose_name)))
return HttpResponseRedirect(request.path)
else:
self.message_user(request, msg)
@@ -819,22 +819,22 @@ def response_change(self, request, obj):
pk_value = obj._get_pk_val()
- msg = _('The %(name)s "%(obj)s" was changed successfully.') % {'name': force_unicode(verbose_name), 'obj': force_unicode(obj)}
+ msg = _('The %(name)s "%(obj)s" was changed successfully.') % {'name': force_text(verbose_name), 'obj': force_text(obj)}
if "_continue" in request.POST:
self.message_user(request, msg + ' ' + _("You may edit it again below."))
if "_popup" in request.REQUEST:
return HttpResponseRedirect(request.path + "?_popup=1")
else:
return HttpResponseRedirect(request.path)
elif "_saveasnew" in request.POST:
- msg = _('The %(name)s "%(obj)s" was added successfully. You may edit it again below.') % {'name': force_unicode(verbose_name), 'obj': obj}
+ msg = _('The %(name)s "%(obj)s" was added successfully. You may edit it again below.') % {'name': force_text(verbose_name), 'obj': obj}
self.message_user(request, msg)
return HttpResponseRedirect(reverse('admin:%s_%s_change' %
(opts.app_label, module_name),
args=(pk_value,),
current_app=self.admin_site.name))
elif "_addanother" in request.POST:
- self.message_user(request, msg + ' ' + (_("You may add another %s below.") % force_unicode(verbose_name)))
+ self.message_user(request, msg + ' ' + (_("You may add another %s below.") % force_text(verbose_name)))
return HttpResponseRedirect(reverse('admin:%s_%s_add' %
(opts.app_label, module_name),
current_app=self.admin_site.name))
@@ -995,7 +995,7 @@ def add_view(self, request, form_url='', extra_context=None):
media = media + inline_admin_formset.media
context = {
- 'title': _('Add %s') % force_unicode(opts.verbose_name),
+ 'title': _('Add %s') % force_text(opts.verbose_name),
'adminform': adminForm,
'is_popup': "_popup" in request.REQUEST,
'media': media,
@@ -1019,7 +1019,7 @@ def change_view(self, request, object_id, form_url='', extra_context=None):
raise PermissionDenied
if obj is None:
- raise Http404(_('%(name)s object with primary key %(key)r does not exist.') % {'name': force_unicode(opts.verbose_name), 'key': escape(object_id)})
+ raise Http404(_('%(name)s object with primary key %(key)r does not exist.') % {'name': force_text(opts.verbose_name), 'key': escape(object_id)})
if request.method == 'POST' and "_saveasnew" in request.POST:
return self.add_view(request, form_url=reverse('admin:%s_%s_add' %
@@ -1085,7 +1085,7 @@ def change_view(self, request, object_id, form_url='', extra_context=None):
media = media + inline_admin_formset.media
context = {
- 'title': _('Change %s') % force_unicode(opts.verbose_name),
+ 'title': _('Change %s') % force_text(opts.verbose_name),
'adminform': adminForm,
'object_id': object_id,
'original': obj,
@@ -1194,14 +1194,14 @@ def changelist_view(self, request, extra_context=None):
if changecount:
if changecount == 1:
- name = force_unicode(opts.verbose_name)
+ name = force_text(opts.verbose_name)
else:
- name = force_unicode(opts.verbose_name_plural)
+ name = force_text(opts.verbose_name_plural)
msg = ungettext("%(count)s %(name)s was changed successfully.",
"%(count)s %(name)s were changed successfully.",
changecount) % {'count': changecount,
'name': name,
- 'obj': force_unicode(obj)}
+ 'obj': force_text(obj)}
self.message_user(request, msg)
return HttpResponseRedirect(request.get_full_path())
@@ -1228,7 +1228,7 @@ def changelist_view(self, request, extra_context=None):
'All %(total_count)s selected', cl.result_count)
context = {
- 'module_name': force_unicode(opts.verbose_name_plural),
+ 'module_name': force_text(opts.verbose_name_plural),
'selection_note': _('0 of %(cnt)s selected') % {'cnt': len(cl.result_list)},
'selection_note_all': selection_note_all % {'total_count': cl.result_count},
'title': cl.title,
@@ -1263,7 +1263,7 @@ def delete_view(self, request, object_id, extra_context=None):
raise PermissionDenied
if obj is None:
- raise Http404(_('%(name)s object with primary key %(key)r does not exist.') % {'name': force_unicode(opts.verbose_name), 'key': escape(object_id)})
+ raise Http404(_('%(name)s object with primary key %(key)r does not exist.') % {'name': force_text(opts.verbose_name), 'key': escape(object_id)})
using = router.db_for_write(self.model)
@@ -1275,11 +1275,11 @@ def delete_view(self, request, object_id, extra_context=None):
if request.POST: # The user has already confirmed the deletion.
if perms_needed:
raise PermissionDenied
- obj_display = force_unicode(obj)
+ obj_display = force_text(obj)
self.log_deletion(request, obj, obj_display)
self.delete_model(request, obj)
- self.message_user(request, _('The %(name)s "%(obj)s" was deleted successfully.') % {'name': force_unicode(opts.verbose_name), 'obj': force_unicode(obj_display)})
+ self.message_user(request, _('The %(name)s "%(obj)s" was deleted successfully.') % {'name': force_text(opts.verbose_name), 'obj': force_text(obj_display)})
if not self.has_change_permission(request, None):
return HttpResponseRedirect(reverse('admin:index',
@@ -1288,7 +1288,7 @@ def delete_view(self, request, object_id, extra_context=None):
(opts.app_label, opts.module_name),
current_app=self.admin_site.name))
- object_name = force_unicode(opts.verbose_name)
+ object_name = force_text(opts.verbose_name)
if perms_needed or protected:
title = _("Cannot delete %(name)s") % {"name": object_name}
@@ -1326,9 +1326,9 @@ def history_view(self, request, object_id, extra_context=None):
# If no history was found, see whether this object even exists.
obj = get_object_or_404(model, pk=unquote(object_id))
context = {
- 'title': _('Change history: %s') % force_unicode(obj),
+ 'title': _('Change history: %s') % force_text(obj),
'action_list': action_list,
- 'module_name': capfirst(force_unicode(opts.verbose_name_plural)),
+ 'module_name': capfirst(force_text(opts.verbose_name_plural)),
'object': obj,
'app_label': app_label,
'opts': opts,
@@ -15,7 +15,7 @@
from django.utils import six
from django.utils.text import capfirst
from django.utils.translation import ugettext as _
-from django.utils.encoding import smart_unicode, force_unicode
+from django.utils.encoding import smart_text, force_text
from django.template import Library
from django.template.loader import get_template
from django.template.context import Context
@@ -210,7 +210,7 @@ def items_for_result(cl, result, form):
result_repr = display_for_field(value, f)
if isinstance(f, (models.DateField, models.TimeField, models.ForeignKey)):
row_class = mark_safe(' class="nowrap"')
- if force_unicode(result_repr) == '':
+ if force_text(result_repr) == '':
result_repr = mark_safe('&nbsp;')
# If list_display_links not defined, add the link tag to the first field
if (first and not cl.list_display_links) or field_name in cl.list_display_links:
@@ -224,7 +224,7 @@ def items_for_result(cl, result, form):
else:
attr = pk
value = result.serializable_value(attr)
- result_id = repr(force_unicode(value))[1:]
+ result_id = repr(force_text(value))[1:]
yield format_html('<{0}{1}><a href="{2}"{3}>{4}</a></{5}>',
table_tag,
row_class,
@@ -241,10 +241,10 @@ def items_for_result(cl, result, form):
field_name == cl.model._meta.pk.name and
form[cl.model._meta.pk.name].is_hidden)):
bf = form[field_name]
- result_repr = mark_safe(force_unicode(bf.errors) + force_unicode(bf))
+ result_repr = mark_safe(force_text(bf.errors) + force_text(bf))
yield format_html('<td{0}>{1}</td>', row_class, result_repr)
if form and not form[cl.model._meta.pk.name].is_hidden:
- yield format_html('<td>{0}</td>', force_unicode(form[cl.model._meta.pk.name]))
+ yield format_html('<td>{0}</td>', force_text(form[cl.model._meta.pk.name]))
class ResultList(list):
# Wrapper class used to return items in a list_editable
@@ -267,7 +267,7 @@ def result_hidden_fields(cl):
if cl.formset:
for res, form in zip(cl.result_list, cl.formset.forms):
if form[cl.model._meta.pk.name].is_hidden:
- yield mark_safe(force_unicode(form[cl.model._meta.pk.name]))
+ yield mark_safe(force_text(form[cl.model._meta.pk.name]))
@register.inclusion_tag("admin/change_list_results.html")
def result_list(cl):
Oops, something went wrong.

0 comments on commit c5ef65b

Please sign in to comment.