More tweaks for python 3

This commit is contained in:
Lance Edgar 2018-02-12 19:22:05 -06:00
parent b0821e8011
commit 17d99e16b9
8 changed files with 35 additions and 17 deletions

View file

@ -714,8 +714,8 @@ class Form(object):
def render_field_readonly(self, field_name, **kwargs): def render_field_readonly(self, field_name, **kwargs):
label = HTML.tag('label', self.get_label(field_name), for_=field_name) label = HTML.tag('label', self.get_label(field_name), for_=field_name)
field = self.render_field_value(field_name) or '' field = self.render_field_value(field_name) or ''
field_div = HTML.tag('div', class_='field', c=field) field_div = HTML.tag('div', class_='field', c=[field])
return HTML.tag('div', class_='field-wrapper {}'.format(field_name), c=label + field_div) return HTML.tag('div', class_='field-wrapper {}'.format(field_name), c=[label, field_div])
def render_field_value(self, field_name): def render_field_value(self, field_name):
record = self.model_instance record = self.model_instance

View file

@ -83,6 +83,7 @@ class JQueryDateWidget(dfwidget.DateInputWidget):
) )
options.update(kw.get('extra_options', {})) options.update(kw.get('extra_options', {}))
kw.setdefault('options_json', json.dumps(options)) kw.setdefault('options_json', json.dumps(options))
kw.setdefault('selected_callback', None)
values = self.get_template_values(field, cstruct, kw) values = self.get_template_values(field, cstruct, kw)
return field.renderer(template, **values) return field.renderer(template, **values)

View file

@ -2,7 +2,7 @@
################################################################################ ################################################################################
# #
# Rattail -- Retail Software Framework # Rattail -- Retail Software Framework
# Copyright © 2010-2017 Lance Edgar # Copyright © 2010-2018 Lance Edgar
# #
# This file is part of Rattail. # This file is part of Rattail.
# #
@ -27,7 +27,7 @@ Core Grid Classes
from __future__ import unicode_literals, absolute_import from __future__ import unicode_literals, absolute_import
import datetime import datetime
import urllib from six.moves import urllib
import six import six
import sqlalchemy as sa import sqlalchemy as sa
@ -911,8 +911,12 @@ class Grid(object):
""" """
Returns the rendered contents of the 'actions' column for a given row. Returns the rendered contents of the 'actions' column for a given row.
""" """
main_actions = filter(None, [self.render_action(a, row, i) for a in self.main_actions]) main_actions = [self.render_action(a, row, i)
more_actions = filter(None, [self.render_action(a, row, i) for a in self.more_actions]) for a in self.main_actions]
main_actions = [a for a in main_actions if a]
more_actions = [self.render_action(a, row, i)
for a in self.more_actions]
more_actions = [a for a in more_actions if a]
if more_actions: if more_actions:
icon = HTML.tag('span', class_='ui-icon ui-icon-carat-1-e') icon = HTML.tag('span', class_='ui-icon ui-icon-carat-1-e')
link = tags.link_to("More" + icon, '#', class_='more') link = tags.link_to("More" + icon, '#', class_='more')
@ -1072,5 +1076,5 @@ class URLMaker(object):
params = self.request.GET.copy() params = self.request.GET.copy()
params["page"] = page params["page"] = page
params["partial"] = "1" params["partial"] = "1"
qs = urllib.urlencode(params, True) qs = urllib.parse.urlencode(params, True)
return '{}?{}'.format(self.request.path, qs) return '{}?{}'.format(self.request.path, qs)

View file

@ -773,4 +773,4 @@ class GridFiltersForm(forms.Form):
""" """
style = 'display: none;' if filtr.verb in filtr.valueless_verbs else None style = 'display: none;' if filtr.verb in filtr.valueless_verbs else None
return HTML.tag('div', class_='value', style=style, return HTML.tag('div', class_='value', style=style,
c=filtr.render_value(**kwargs)) c=[filtr.render_value(**kwargs)])

View file

@ -216,7 +216,10 @@ class MasterView(View):
# Return grid only, if partial page was requested. # Return grid only, if partial page was requested.
if self.request.params.get('partial'): if self.request.params.get('partial'):
self.request.response.content_type = b'text/html' if six.PY3:
self.request.response.content_type = 'text/html'
else:
self.request.response.content_type = b'text/html'
self.request.response.text = grid.render_grid() self.request.response.text = grid.render_grid()
return self.request.response return self.request.response
@ -1227,9 +1230,16 @@ class MasterView(View):
response.content_length = os.path.getsize(path) response.content_length = os.path.getsize(path)
content_type = self.download_content_type(path, filename) content_type = self.download_content_type(path, filename)
if content_type: if content_type:
response.content_type = six.binary_type(content_type) if six.PY3:
filename = os.path.basename(path).encode('ascii', 'replace') response.content_type = content_type
response.content_disposition = b'attachment; filename={}'.format(filename) else:
response.content_type = six.binary_type(content_type)
if six.PY3:
filename = os.path.basename(path)
response.content_disposition = 'attachment; filename={}'.format(filename)
else:
filename = os.path.basename(path).encode('ascii', 'replace')
response.content_disposition = b'attachment; filename={}'.format(filename)
return response return response
def download_content_type(self, path, filename): def download_content_type(self, path, filename):

View file

@ -178,7 +178,7 @@ class PeopleView(MasterView):
for user in users: for user in users:
text = user.username text = user.username
url = self.request.route_url('users.view', uuid=user.uuid) url = self.request.route_url('users.view', uuid=user.uuid)
items.append(HTML.tag('li', c=tags.link_to(text, url))) items.append(HTML.tag('li', c=[tags.link_to(text, url)]))
if items: if items:
return HTML.tag('ul', c=items) return HTML.tag('ul', c=items)
elif self.request.has_perm('users.create'): elif self.request.has_perm('users.create'):

View file

@ -129,8 +129,8 @@ class PermissionsRenderer(Object):
if checked: if checked:
label = perms[key]['label'] label = perms[key]['label']
span = HTML.tag('span', c="[X]" if checked else "[ ]") span = HTML.tag('span', c="[X]" if checked else "[ ]")
inner += HTML.tag('p', class_='perm', c=span + ' ' + label) inner += HTML.tag('p', class_='perm', c=[span, HTML(' '), label])
rendered = True rendered = True
if rendered: if rendered:
html += HTML.tag('div', class_='group', c=inner) html += HTML.tag('div', class_='group', c=[inner])
return html or "(none granted)" return html or "(none granted)"

View file

@ -169,8 +169,11 @@ class UsersView(PrincipalMasterView):
roles = self.get_possible_roles().all() roles = self.get_possible_roles().all()
role_values = [(s.uuid, six.text_type(s)) for s in roles] role_values = [(s.uuid, six.text_type(s)) for s in roles]
f.set_node('roles', colander.Set()) f.set_node('roles', colander.Set())
size = len(roles)
if size < 3:
size = 3
f.set_widget('roles', dfwidget.SelectWidget(multiple=True, f.set_widget('roles', dfwidget.SelectWidget(multiple=True,
size=len(roles), size=size,
values=role_values)) values=role_values))
if self.editing: if self.editing:
f.set_default('roles', [r.uuid for r in user.roles]) f.set_default('roles', [r.uuid for r in user.roles])
@ -234,7 +237,7 @@ class UsersView(PrincipalMasterView):
for role in roles: for role in roles:
text = role.name text = role.name
url = self.request.route_url('roles.view', uuid=role.uuid) url = self.request.route_url('roles.view', uuid=role.uuid)
items.append(HTML.tag('li', c=tags.link_to(text, url))) items.append(HTML.tag('li', c=[tags.link_to(text, url)]))
return HTML.tag('ul', c=items) return HTML.tag('ul', c=items)
def editable_instance(self, user): def editable_instance(self, user):