Remove all deprecated use_buefy logic

also remove some static files no longer used, etc.
This commit is contained in:
Lance Edgar 2023-02-03 12:05:17 -06:00
parent 01e5eee981
commit 9faaea881d
112 changed files with 2079 additions and 7039 deletions

View file

@ -2,7 +2,7 @@
################################################################################
#
# Rattail -- Retail Software Framework
# Copyright © 2010-2022 Lance Edgar
# Copyright © 2010-2023 Lance Edgar
#
# This file is part of Rattail.
#
@ -24,8 +24,6 @@
Auth Views
"""
from __future__ import unicode_literals, absolute_import
from rattail.db.auth import authenticate_user, set_user_password
import colander
@ -101,9 +99,7 @@ class AuthenticationView(View):
self.request.session.flash("{} is already logged in".format(self.request.user), 'error')
return self.redirect(referrer)
use_buefy = self.get_use_buefy()
form = forms.Form(schema=UserLogin(), request=self.request,
use_buefy=use_buefy)
form = forms.Form(schema=UserLogin(), request=self.request)
form.save_label = "Login"
form.auto_disable_save = False
form.auto_disable = False # TODO: deprecate / remove this
@ -126,16 +122,13 @@ class AuthenticationView(View):
'tailbone', 'main_image_url',
default=self.request.static_url('tailbone:static/img/home_logo.png'))
context = {
return {
'form': form,
'referrer': referrer,
'image_url': image_url,
'use_buefy': use_buefy,
'index_title': self.rattail_config.node_title(),
'help_url': global_help_url(self.rattail_config),
}
if use_buefy:
context['index_title'] = self.rattail_config.node_title()
return context
def authenticate_user(self, username, password):
app = self.get_rattail_app()
@ -177,15 +170,14 @@ class AuthenticationView(View):
self.request.session.flash("Cannot change password for user: {}".format(self.request.user))
return self.redirect(self.request.get_referrer())
use_buefy = self.get_use_buefy()
schema = ChangePassword().bind(user=self.request.user, request=self.request)
form = forms.Form(schema=schema, request=self.request, use_buefy=use_buefy)
form = forms.Form(schema=schema, request=self.request)
if form.validate(newstyle=True):
set_user_password(self.request.user, form.validated['new_password'])
self.request.session.flash("Your password has been changed.")
return self.redirect(self.request.get_referrer())
return {'form': form, 'use_buefy': use_buefy}
return {'form': form}
def become_root(self):
"""

View file

@ -24,8 +24,6 @@
Base views for maintaining "new-style" batches.
"""
from __future__ import unicode_literals, absolute_import
import os
import sys
import json
@ -37,7 +35,6 @@ import tempfile
from six import StringIO
import json
import six
import markdown
import sqlalchemy as sa
from sqlalchemy import orm
@ -172,7 +169,6 @@ class BatchMasterView(MasterView):
def template_kwargs_view(self, **kwargs):
kwargs = super(BatchMasterView, self).template_kwargs_view(**kwargs)
use_buefy = self.get_use_buefy()
batch = kwargs['instance']
kwargs['batch'] = batch
kwargs['handler'] = self.handler
@ -194,30 +190,22 @@ class BatchMasterView(MasterView):
breakdown = self.make_status_breakdown(batch)
if use_buefy:
factory = self.get_grid_factory()
g = factory('batch_row_status_breakdown', [],
columns=['title', 'count'])
g.set_click_handler('title', "autoFilterStatus(props.row)")
kwargs['status_breakdown_data'] = breakdown
kwargs['status_breakdown_grid'] = HTML.literal(
g.render_buefy_table_element(data_prop='statusBreakdownData',
empty_labels=True))
else:
kwargs['status_breakdown'] = [
(status['title'], status['count'])
for status in breakdown]
factory = self.get_grid_factory()
g = factory('batch_row_status_breakdown', [],
columns=['title', 'count'])
g.set_click_handler('title', "autoFilterStatus(props.row)")
kwargs['status_breakdown_data'] = breakdown
kwargs['status_breakdown_grid'] = HTML.literal(
g.render_buefy_table_element(data_prop='statusBreakdownData',
empty_labels=True))
return kwargs
def make_upload_worksheet_form(self, batch):
action_url = self.get_action_url('upload_worksheet', batch)
use_buefy = self.get_use_buefy()
form = forms.Form(schema=UploadWorksheet(),
request=self.request,
action_url=action_url,
use_buefy=use_buefy,
component='upload-worksheet-form')
form.set_type('worksheet_file', 'file')
# TODO: must set these to avoid some default Buefy code
@ -431,7 +419,6 @@ class BatchMasterView(MasterView):
return dict(batch.params or {})
def render_complete(self, batch, field):
use_buefy = self.get_use_buefy()
text = "Yes" if batch.complete else "No"
if batch.executed or not self.has_perm('edit'):
@ -446,18 +433,13 @@ class BatchMasterView(MasterView):
url = self.get_action_url('toggle_complete', batch)
kwargs = {'@submit': 'togglingBatchComplete = true'}
if not use_buefy:
kwargs['class_'] = 'autodisable'
begin_form = tags.form(url, **kwargs)
if use_buefy:
label = HTML.literal(
'{{{{ togglingBatchComplete ? "Working, please wait..." : "{}" }}}}'.format(label))
submit = self.make_buefy_button(label, is_primary=True,
native_type='submit',
**{':disabled': 'togglingBatchComplete'})
else:
submit = tags.submit('submit', label)
label = HTML.literal(
'{{{{ togglingBatchComplete ? "Working, please wait..." : "{}" }}}}'.format(label))
submit = self.make_buefy_button(label, is_primary=True,
native_type='submit',
**{':disabled': 'togglingBatchComplete'})
form = [
begin_form,
@ -467,23 +449,16 @@ class BatchMasterView(MasterView):
tags.end_form(),
]
if use_buefy:
text = HTML.tag('div', class_='control', c=text)
form = HTML.tag('div', class_='control', c=form)
content = [
HTML.tag('nav', class_='level',
c=[HTML.tag('div', class_='level-left', c=[
text,
HTML.literal('     '),
form,
])]),
]
else:
content = [
text,
HTML.literal('   '),
] + form
text = HTML.tag('div', class_='control', c=text)
form = HTML.tag('div', class_='control', c=form)
content = [
HTML.tag('nav', class_='level',
c=[HTML.tag('div', class_='level-left', c=[
text,
HTML.literal('     '),
form,
])]),
]
return HTML.tag('div', c=content)
@ -491,7 +466,7 @@ class BatchMasterView(MasterView):
user = getattr(batch, field)
if not user:
return ""
title = six.text_type(user)
title = str(user)
url = self.request.route_url('users.view', uuid=user.uuid)
return tags.link_to(title, url)
@ -513,7 +488,7 @@ class BatchMasterView(MasterView):
# TODO: this needs work yet surely...why is this an issue?
# treat 'filename' field specially, for some reason it can be a filedict?
if 'filename' in kwargs and not isinstance(kwargs['filename'], six.string_types):
if 'filename' in kwargs and not isinstance(kwargs['filename'], str):
kwargs['filename'] = '' # null not allowed
# TODO: is this still necessary with colander?
@ -533,7 +508,7 @@ class BatchMasterView(MasterView):
os.remove(upload['temp_path'])
os.rmdir(upload['tempdir'])
for key, upload in six.iteritems(uploads):
for key, upload in uploads.items():
if isinstance(upload, dict):
process(upload, key)
else:
@ -657,7 +632,7 @@ class BatchMasterView(MasterView):
code = row.status_code
if code is None:
return ""
text = self.get_row_status_enum().get(code, six.text_type(code))
text = self.get_row_status_enum().get(code, str(code))
if row.status_text:
return HTML.tag('span', title=row.status_text, c=text)
return text
@ -707,21 +682,12 @@ class BatchMasterView(MasterView):
permission_prefix = self.get_permission_prefix()
if self.request.has_perm('{}.create_row'.format(permission_prefix)):
url = self.get_action_url('create_row', batch)
if self.get_use_buefy():
return self.make_buefy_button("New Row", url=url,
is_primary=True,
icon_left='plus')
else:
text = "Create a new {}".format(self.get_row_model_title())
link = tags.link_to(text, url)
return HTML.tag('p', c=[link])
return self.make_buefy_button("New Row", url=url,
is_primary=True,
icon_left='plus')
def make_batch_row_grid_tools(self, batch):
if self.get_use_buefy():
return
if self.rows_bulk_deletable and not batch.executed and self.request.has_perm('{}.delete_rows'.format(self.get_permission_prefix())):
url = self.request.route_url('{}.delete_rows'.format(self.get_route_prefix()), uuid=batch.uuid)
return HTML.tag('p', c=[tags.link_to("Delete all rows matching current search", url)])
pass
def make_row_grid_kwargs(self, **kwargs):
"""
@ -733,21 +699,19 @@ class BatchMasterView(MasterView):
# TODO: most of this logic is copied from MasterView, should refactor/merge somehow...
if 'main_actions' not in kwargs:
actions = []
use_buefy = self.get_use_buefy()
# view action
if self.rows_viewable:
view = lambda r, i: self.get_row_action_url('view', r)
icon = 'eye' if use_buefy else 'zoomin'
actions.append(self.make_action('view', icon=icon, url=view))
actions.append(self.make_action('view', icon='eye', url=view))
# edit and delete are NOT allowed after execution, or if batch is "complete"
if not batch.executed and not batch.complete:
# edit action
if self.rows_editable and self.has_perm('edit_row'):
icon = 'edit' if use_buefy else 'pencil'
actions.append(self.make_action('edit', icon=icon, url=self.row_edit_action_url))
actions.append(self.make_action('edit', icon='edit',
url=self.row_edit_action_url))
# delete action
if self.rows_deletable and self.has_perm('delete_row'):
@ -793,7 +757,7 @@ class BatchMasterView(MasterView):
# nb. must make new session, separate from main thread
session = app.make_session()
batch = self.get_instance_for_key(key, session)
batch_str = six.text_type(batch)
batch_str = str(batch)
try:
# try to delete batch
@ -869,7 +833,6 @@ class BatchMasterView(MasterView):
"""
defaults = {}
route_prefix = self.get_route_prefix()
use_buefy = self.get_use_buefy()
schema = None
if self.has_execution_options(batch):
@ -891,13 +854,12 @@ class BatchMasterView(MasterView):
labels[field.name] = field.title
# auto-convert select widgets for buefy theme
if use_buefy and isinstance(field.widget, forms.widgets.PlainSelectWidget):
if isinstance(field.widget, forms.widgets.PlainSelectWidget):
field.widget = dfwidget.SelectWidget(values=field.widget.values)
if not schema:
schema = colander.Schema()
kwargs['use_buefy'] = use_buefy
kwargs['component'] = 'execute-form'
form = forms.Form(schema=schema, request=self.request, defaults=defaults, **kwargs)
self.configure_execute_form(form)
@ -1051,8 +1013,7 @@ class BatchMasterView(MasterView):
data = json.dumps({
'everything_complete': True,
})
if six.PY3:
data = data.encode('utf_8')
data = data.encode('utf_8')
cxn.send(data)
cxn.send(suffix)
cxn.close()
@ -1061,7 +1022,7 @@ class BatchMasterView(MasterView):
with short_session() as s:
batch = s.query(self.model_class).get(batch_uuid)
batch_id = batch.id_str
description = six.text_type(batch)
description = str(batch)
self.launch_subprocess(
port=port, username=username,

View file

@ -24,8 +24,6 @@
Views for importer batches
"""
from __future__ import unicode_literals, absolute_import
import sqlalchemy as sa
from rattail.db import model
@ -139,7 +137,6 @@ class ImporterBatchView(BatchMasterView):
def configure_row_grid(self, g):
super(ImporterBatchView, self).configure_row_grid(g)
use_buefy = self.get_use_buefy()
def make_filter(field, **kwargs):
column = getattr(self.current_row_table.c, field)
@ -150,11 +147,8 @@ class ImporterBatchView(BatchMasterView):
# for some reason we have to do this differently for Buefy?
kwargs = {}
if not use_buefy:
kwargs['value_enum'] = self.enum.IMPORTER_BATCH_ROW_STATUS
make_filter('status_code', label="Status", **kwargs)
if use_buefy:
g.filters['status_code'].set_choices(self.enum.IMPORTER_BATCH_ROW_STATUS)
g.filters['status_code'].set_choices(self.enum.IMPORTER_BATCH_ROW_STATUS)
def make_sorter(field):
column = getattr(self.current_row_table.c, field)

View file

@ -24,14 +24,10 @@
Views for inventory batches
"""
from __future__ import unicode_literals, absolute_import
import re
import decimal
import logging
import six
from rattail import pod
from rattail.db import model
from rattail.db.util import make_full_description
@ -234,9 +230,8 @@ class InventoryBatchView(BatchMasterView):
if batch.executed:
return self.redirect(self.get_action_url('view', batch))
use_buefy = self.get_use_buefy()
schema = DesktopForm().bind(session=self.Session())
form = forms.Form(schema=schema, request=self.request, use_buefy=use_buefy)
form = forms.Form(schema=schema, request=self.request)
if self.request.method == 'POST':
if form.validate(newstyle=True):
@ -273,7 +268,7 @@ class InventoryBatchView(BatchMasterView):
else:
dform = form.make_deform_form()
msg = "Form did not validate: {}".format(six.text_type(dform.error))
msg = "Form did not validate: {}".format(str(dform.error))
self.request.session.flash(msg, 'error')
title = self.get_instance_title(batch)
@ -345,7 +340,7 @@ class InventoryBatchView(BatchMasterView):
upc = re.sub(r'\D', '', entry.strip())
if upc:
upc = GPC(upc)
result['upc'] = six.text_type(upc)
result['upc'] = str(upc)
result['upc_pretty'] = upc.pretty()
result['image_url'] = pod.get_image_url(self.rattail_config, upc)
@ -374,10 +369,10 @@ class InventoryBatchView(BatchMasterView):
data = {}
if product and (not product.deleted or self.request.has_perm('products.view_deleted')):
data['uuid'] = product.uuid
data['upc'] = six.text_type(product.upc)
data['upc'] = str(product.upc)
data['upc_pretty'] = product.upc.pretty()
data['full_description'] = product.full_description
data['brand_name'] = six.text_type(product.brand or '')
data['brand_name'] = str(product.brand or '')
data['description'] = product.description
data['size'] = product.size
data['case_quantity'] = 1 # default

View file

@ -2,7 +2,7 @@
################################################################################
#
# Rattail -- Retail Software Framework
# Copyright © 2010-2022 Lance Edgar
# Copyright © 2010-2023 Lance Edgar
#
# This file is part of Rattail.
#
@ -24,12 +24,8 @@
Views for maintaining vendor catalogs
"""
from __future__ import unicode_literals, absolute_import
import logging
import six
from rattail.db import model
import colander
@ -196,9 +192,6 @@ class VendorCatalogView(FileBatchMasterView):
values = [(p.key, p.display) for p in parsers]
if len(values) == 1:
f.set_default('parser_key', parsers[0].key)
use_buefy = self.get_use_buefy()
if not use_buefy:
values.insert(0, ('', "(please choose)"))
f.set_widget('parser_key', dfwidget.SelectWidget(values=values))
else:
f.set_readonly('parser_key')
@ -235,7 +228,7 @@ class VendorCatalogView(FileBatchMasterView):
vendor = self.Session.query(model.Vendor).get(
self.request.POST['vendor_uuid'])
if vendor:
vendor_display = six.text_type(vendor)
vendor_display = str(vendor)
f.set_widget('vendor_uuid',
forms.widgets.JQueryAutocompleteWidget(
field_display=vendor_display,
@ -275,35 +268,20 @@ class VendorCatalogView(FileBatchMasterView):
return parser.display
def template_kwargs_create(self, **kwargs):
use_buefy = self.get_use_buefy()
app = self.get_rattail_app()
vendor_handler = app.get_vendor_handler()
parsers = self.get_parsers()
parsers_data = {}
for parser in parsers:
if use_buefy:
pdata = {'key': parser.key,
'vendor_key': parser.vendor_key}
if parser.vendor_key:
vendor = vendor_handler.get_vendor(self.Session(),
parser.vendor_key)
if vendor:
pdata['vendor_uuid'] = vendor.uuid
pdata['vendor_name'] = vendor.name
parsers_data[parser.key] = pdata
else:
if parser.vendor_key:
vendor = vendor_handler.get_vendor(self.Session(),
parser.vendor_key)
if vendor:
parser.vendormap_value = "{{uuid: '{}', name: '{}'}}".format(
vendor.uuid, vendor.name.replace("'", "\\'"))
else:
log.warning("vendor '{}' not found for parser: {}".format(
parser.vendor_key, parser.key))
parser.vendormap_value = 'null'
else:
parser.vendormap_value = 'null'
pdata = {'key': parser.key,
'vendor_key': parser.vendor_key}
if parser.vendor_key:
vendor = vendor_handler.get_vendor(self.Session(),
parser.vendor_key)
if vendor:
pdata['vendor_uuid'] = vendor.uuid
pdata['vendor_name'] = vendor.name
parsers_data[parser.key] = pdata
kwargs['parsers'] = parsers
kwargs['parsers_data'] = parsers_data
return kwargs

View file

@ -2,7 +2,7 @@
################################################################################
#
# Rattail -- Retail Software Framework
# Copyright © 2010-2022 Lance Edgar
# Copyright © 2010-2023 Lance Edgar
#
# This file is part of Rattail.
#
@ -24,10 +24,7 @@
Various common views
"""
from __future__ import unicode_literals, absolute_import
import os
import six
from rattail.batch import consume_batch_id
from rattail.util import OrderedDict, simple_error, import_module_path
@ -62,14 +59,11 @@ class CommonView(View):
'tailbone', 'main_image_url',
default=self.request.static_url('tailbone:static/img/home_logo.png'))
use_buefy = self.get_use_buefy()
context = {
'image_url': image_url,
'use_buefy': use_buefy,
'index_title': self.rattail_config.node_title(),
'help_url': global_help_url(self.rattail_config),
}
if use_buefy:
context['index_title'] = self.rattail_config.node_title()
if self.expose_quickie_search:
context['quickie'] = self.get_quickie_context()
@ -83,12 +77,8 @@ class CommonView(View):
with open(self.robots_txt_path, 'rt') as f:
content = f.read()
response = self.request.response
if six.PY3:
response.text = content
response.content_type = 'text/plain'
else:
response.body = content
response.content_type = b'text/plain'
response.text = content
response.content_type = 'text/plain'
return response
def get_project_title(self):
@ -114,16 +104,12 @@ class CommonView(View):
"""
Generic view to show "about project" info page.
"""
use_buefy = self.get_use_buefy()
context = {
return {
'project_title': self.get_project_title(),
'project_version': self.get_project_version(),
'packages': self.get_packages(),
'use_buefy': use_buefy,
'index_title': self.rattail_config.node_title(),
}
if use_buefy:
context['index_title'] = self.rattail_config.node_title()
return context
def get_packages(self):
"""
@ -203,7 +189,6 @@ class CommonView(View):
if not self.request.is_root:
raise self.forbidden()
use_buefy = self.get_use_buefy()
app = self.get_rattail_app()
app_title = self.rattail_config.app_title()
poser_handler = app.get_poser_handler()
@ -253,7 +238,6 @@ class CommonView(View):
poser_error = simple_error(error)
return {
'use_buefy': use_buefy,
'app_title': app_title,
'index_title': app_title,
'poser_dir': poser_dir,

View file

@ -2,7 +2,7 @@
################################################################################
#
# Rattail -- Retail Software Framework
# Copyright © 2010-2022 Lance Edgar
# Copyright © 2010-2023 Lance Edgar
#
# This file is part of Rattail.
#
@ -24,12 +24,8 @@
Base View Class
"""
from __future__ import unicode_literals, absolute_import
import os
import six
from rattail.db import model
from rattail.core import Object
from rattail.util import progress_loop
@ -41,7 +37,6 @@ from pyramid.response import FileResponse
from tailbone.db import Session
from tailbone.auth import logout_user
from tailbone.progress import SessionProgress
from tailbone.util import should_use_buefy
from tailbone.config import protected_usernames
@ -94,13 +89,6 @@ class View(object):
def notfound(self):
return httpexceptions.HTTPNotFound()
def get_use_buefy(self):
"""
Returns a flag indicating whether or not the current theme supports
(and therefore should use) the Buefy JS library.
"""
return should_use_buefy(self.request)
def late_login_user(self):
"""
Returns the :class:`rattail:rattail.db.model.User` instance
@ -170,8 +158,6 @@ class View(object):
if attachment:
if not filename:
filename = os.path.basename(path)
if six.PY2:
filename = filename.encode('ascii', 'replace')
response.content_disposition = str('attachment; filename="{}"'.format(filename))
return response

View file

@ -2,7 +2,7 @@
################################################################################
#
# Rattail -- Retail Software Framework
# Copyright © 2010-2022 Lance Edgar
# Copyright © 2010-2023 Lance Edgar
#
# This file is part of Rattail.
#
@ -24,9 +24,6 @@
Customer Views
"""
from __future__ import unicode_literals, absolute_import
import six
import sqlalchemy as sa
import colander
@ -205,7 +202,6 @@ class CustomerView(MasterView):
super(CustomerView, self).configure_common_form(f)
customer = f.model_instance
permission_prefix = self.get_permission_prefix()
use_buefy = self.get_use_buefy()
f.set_renderer('default_email', self.render_default_email)
if not self.creating and customer.emails:
@ -251,12 +247,7 @@ class CustomerView(MasterView):
# people
if self.viewing:
if use_buefy:
f.set_renderer('people', self.render_people_buefy)
elif self.people_detachable and self.has_perm('detach_person'):
f.set_renderer('people', self.render_people_removable)
else:
f.set_renderer('people', self.render_people)
f.set_renderer('people', self.render_people_buefy)
else:
f.remove('people')
@ -288,30 +279,28 @@ class CustomerView(MasterView):
kwargs['show_profiles_helper'] = self.show_profiles_helper
use_buefy = self.get_use_buefy()
if use_buefy:
customer = kwargs['instance']
people = []
for person in customer.people:
data = {
'uuid': person.uuid,
'full_name': person.display_name,
'first_name': person.first_name,
'last_name': person.last_name,
'_action_url_view': self.request.route_url('people.view',
uuid=person.uuid),
}
if self.editable and self.request.has_perm('people.edit'):
data['_action_url_edit'] = self.request.route_url(
'people.edit',
uuid=person.uuid)
if self.people_detachable and self.has_perm('detach_person'):
data['_action_url_detach'] = self.request.route_url(
'customers.detach_person',
uuid=customer.uuid,
person_uuid=person.uuid)
people.append(data)
kwargs['people_data'] = people
customer = kwargs['instance']
people = []
for person in customer.people:
data = {
'uuid': person.uuid,
'full_name': person.display_name,
'first_name': person.first_name,
'last_name': person.last_name,
'_action_url_view': self.request.route_url('people.view',
uuid=person.uuid),
}
if self.editable and self.request.has_perm('people.edit'):
data['_action_url_edit'] = self.request.route_url(
'people.edit',
uuid=person.uuid)
if self.people_detachable and self.has_perm('detach_person'):
data['_action_url_detach'] = self.request.route_url(
'customers.detach_person',
uuid=customer.uuid,
person_uuid=person.uuid)
people.append(data)
kwargs['people_data'] = people
return kwargs
@ -326,20 +315,20 @@ class CustomerView(MasterView):
def render_default_address(self, customer, field):
if customer.addresses:
return six.text_type(customer.addresses[0])
return str(customer.addresses[0])
def grid_render_person(self, customer, field):
person = getattr(customer, field)
if not person:
return ""
return six.text_type(person)
return str(person)
def form_render_person(self, customer, field):
person = getattr(customer, field)
if not person:
return ""
text = six.text_type(person)
text = str(person)
url = self.request.route_url('people.view', uuid=person.uuid)
return tags.link_to(text, url)
@ -350,12 +339,13 @@ class CustomerView(MasterView):
items = []
for person in people:
text = six.text_type(person)
text = str(person)
url = self.request.route_url('people.view', uuid=person.uuid)
link = tags.link_to(text, url)
items.append(HTML.tag('li', c=[link]))
return HTML.tag('ul', c=items)
# TODO: remove if no longer used
def render_people_removable(self, customer, field):
people = customer.people
if not people:
@ -431,7 +421,7 @@ class CustomerView(MasterView):
return ""
items = []
for member in members:
text = six.text_type(member)
text = str(member)
url = self.request.route_url('members.view', uuid=member.uuid)
items.append(HTML.tag('li', tags.link_to(text, url)))
return HTML.tag('ul', HTML.literal('').join(items))
@ -587,7 +577,7 @@ class PendingCustomerView(MasterView):
g.set_enum('status_code', self.enum.PENDING_CUSTOMER_STATUS)
g.filters['status_code'].default_active = True
g.filters['status_code'].default_verb = 'not_equal'
g.filters['status_code'].default_value = six.text_type(self.enum.PENDING_CUSTOMER_STATUS_RESOLVED)
g.filters['status_code'].default_value = str(self.enum.PENDING_CUSTOMER_STATUS_RESOLVED)
g.set_sort_defaults('display_name')
g.set_link('id')

View file

@ -2,7 +2,7 @@
################################################################################
#
# Rattail -- Retail Software Framework
# Copyright © 2010-2022 Lance Edgar
# Copyright © 2010-2023 Lance Edgar
#
# This file is part of Rattail.
#
@ -24,11 +24,8 @@
Customer order item views
"""
from __future__ import unicode_literals, absolute_import
import datetime
import six
from sqlalchemy import orm
from rattail.db import model
@ -156,7 +153,7 @@ class CustomerOrderItemView(MasterView):
def render_person_text(self, item, field):
person = item.order.person
if person:
text = six.text_type(person)
text = str(person)
return text
def render_order_created(self, item, column):
@ -165,14 +162,13 @@ class CustomerOrderItemView(MasterView):
def render_status_code_column(self, item, field):
text = self.enum.CUSTORDER_ITEM_STATUS.get(item.status_code,
six.text_type(item.status_code))
str(item.status_code))
if item.status_text:
return HTML.tag('span', title=item.status_text, c=[text])
return text
def configure_form(self, f):
super(CustomerOrderItemView, self).configure_form(f)
use_buefy = self.get_use_buefy()
item = f.model_instance
# order
@ -222,10 +218,7 @@ class CustomerOrderItemView(MasterView):
f.set_renderer('status_code', self.render_status_code)
# notes
if use_buefy:
f.set_renderer('notes', self.render_notes)
else:
f.remove('notes')
f.set_renderer('notes', self.render_notes)
def highlight_pending_field(self, item, field, value=None):
if value is None:
@ -271,13 +264,12 @@ class CustomerOrderItemView(MasterView):
return outer
def render_status_code(self, item, field):
use_buefy = self.get_use_buefy()
text = self.enum.CUSTORDER_ITEM_STATUS[item.status_code]
if item.status_text:
text = "{} ({})".format(text, item.status_text)
items = [HTML.tag('span', c=[text])]
if use_buefy and self.has_perm('change_status'):
if self.has_perm('change_status'):
button = HTML.tag('b-button', type='is-primary', c="Change Status",
style='margin-left: 1rem;',
icon_pack='fas', icon_left='edit',
@ -484,14 +476,14 @@ class CustomerOrderItemView(MasterView):
order = item.order
if not order:
return ""
text = six.text_type(order)
text = str(order)
url = self.request.route_url('custorders.view', uuid=order.uuid)
return tags.link_to(text, url)
def render_person(self, item, field):
person = item.order.person
if person:
text = six.text_type(person)
text = str(person)
url = self.request.route_url('people.view', uuid=person.uuid)
return tags.link_to(text, url)

View file

@ -24,15 +24,10 @@
Department Views
"""
from __future__ import unicode_literals, absolute_import
import six
from rattail.db import model
from webhelpers2.html import HTML
from tailbone import grids
from tailbone.views import MasterView
@ -99,11 +94,10 @@ class DepartmentView(MasterView):
def configure_form(self, f):
super(DepartmentView, self).configure_form(f)
use_buefy = self.get_use_buefy()
f.remove_field('subdepartments')
if not use_buefy or self.creating or self.editing:
if self.creating or self.editing:
f.remove('employees')
else:
f.set_renderer('employees', self.render_employees)
@ -137,33 +131,20 @@ class DepartmentView(MasterView):
def template_kwargs_view(self, **kwargs):
kwargs = super(DepartmentView, self).template_kwargs_view(**kwargs)
use_buefy = self.get_use_buefy()
department = kwargs['instance']
department_employees = sorted(department.employees, key=six.text_type)
department_employees = sorted(department.employees, key=str)
if use_buefy:
employees = []
for employee in department_employees:
person = employee.person
employees.append({
'uuid': employee.uuid,
'first_name': person.first_name,
'last_name': person.last_name,
'_action_url_view': self.request.route_url('employees.view', uuid=employee.uuid),
'_action_url_edit': self.request.route_url('employees.edit', uuid=employee.uuid),
})
kwargs['employees_data'] = employees
else: # not buefy
if department.employees:
actions = [
grids.GridAction('view', icon='zoomin',
url=lambda r, i: self.request.route_url('employees.view', uuid=r.uuid))
]
kwargs['employees'] = grids.Grid(None, department_employees, ['display_name'], request=self.request,
model_class=model.Employee, main_actions=actions)
else:
kwargs['employees'] = None
employees = []
for employee in department_employees:
person = employee.person
employees.append({
'uuid': employee.uuid,
'first_name': person.first_name,
'last_name': person.last_name,
'_action_url_view': self.request.route_url('employees.view', uuid=employee.uuid),
'_action_url_edit': self.request.route_url('employees.edit', uuid=employee.uuid),
})
kwargs['employees_data'] = employees
return kwargs
@ -218,33 +199,14 @@ class DepartmentView(MasterView):
.distinct()\
.order_by(model.Department.name)
if self.get_use_buefy():
def normalize(dept):
return {
'uuid': dept.uuid,
'number': dept.number,
'name': dept.name,
}
def normalize(dept):
return {
'uuid': dept.uuid,
'number': dept.number,
'name': dept.name,
}
return self.json_response([normalize(d) for d in data])
# nb. the rest of this is legacy / not buefy
def configure(g):
g.configure(include=[
g.name,
], readonly=True)
def row_attrs(row, i):
return {'data-uuid': row.uuid}
grid = self.make_grid(data=data, sortable=False, filterable=False, pageable=False,
configure=configure, width=None, checkboxes=True,
row_attrs=row_attrs, main_actions=[], more_actions=[])
self.request.response.content_type = str('text/html')
self.request.response.text = grid.render_grid()
return self.request.response
return self.json_response([normalize(d) for d in data])
@classmethod
def defaults(cls, config):

View file

@ -2,7 +2,7 @@
################################################################################
#
# Rattail -- Retail Software Framework
# Copyright © 2010-2022 Lance Edgar
# Copyright © 2010-2023 Lance Edgar
#
# This file is part of Rattail.
#
@ -24,9 +24,6 @@
Employee Views
"""
from __future__ import unicode_literals, absolute_import
import six
import sqlalchemy as sa
from rattail.db import model
@ -84,7 +81,6 @@ class EmployeeView(MasterView):
def configure_grid(self, g):
super(EmployeeView, self).configure_grid(g)
route_prefix = self.get_route_prefix()
use_buefy = self.get_use_buefy()
# phone
g.set_joiner('phone', lambda q: q.outerjoin(model.EmployeePhoneNumber, sa.and_(
@ -127,10 +123,7 @@ class EmployeeView(MasterView):
g.set_enum('status', self.enum.EMPLOYEE_STATUS)
g.filters['status'].default_active = True
g.filters['status'].default_verb = 'equal'
if use_buefy:
g.filters['status'].default_value = six.text_type(self.enum.EMPLOYEE_STATUS_CURRENT)
else:
g.filters['status'].default_value = self.enum.EMPLOYEE_STATUS_CURRENT
g.filters['status'].default_value = str(self.enum.EMPLOYEE_STATUS_CURRENT)
else:
g.remove('status')
del g.filters['status']
@ -202,7 +195,7 @@ class EmployeeView(MasterView):
f.set_label('stores', "Stores") # TODO: should not be necessary
if self.creating or self.editing:
stores = self.get_possible_stores().all()
store_values = [(s.uuid, six.text_type(s)) for s in stores]
store_values = [(s.uuid, str(s)) for s in stores]
f.set_node('stores', colander.SchemaNode(colander.Set()))
f.set_widget('stores', dfwidget.SelectWidget(multiple=True,
size=len(stores),
@ -214,7 +207,7 @@ class EmployeeView(MasterView):
f.set_label('departments', "Departments") # TODO: should not be necessary
if self.creating or self.editing:
departments = self.get_possible_departments().all()
dept_values = [(d.uuid, six.text_type(d)) for d in departments]
dept_values = [(d.uuid, str(d)) for d in departments]
f.set_node('departments', colander.SchemaNode(colander.Set()))
f.set_widget('departments', dfwidget.SelectWidget(multiple=True,
size=len(departments),
@ -284,7 +277,7 @@ class EmployeeView(MasterView):
person = employee.person if employee else None
if not person:
return ""
text = six.text_type(person)
text = str(person)
url = self.request.route_url('people.view', uuid=person.uuid)
return tags.link_to(text, url)
@ -293,8 +286,8 @@ class EmployeeView(MasterView):
if not stores:
return ""
items = []
for store in sorted(stores, key=six.text_type):
items.append(HTML.tag('li', c=six.text_type(store)))
for store in sorted(stores, key=str):
items.append(HTML.tag('li', c=str(store)))
return HTML.tag('ul', c=items)
def render_departments(self, employee, field):
@ -302,8 +295,8 @@ class EmployeeView(MasterView):
if not departments:
return ""
items = []
for department in sorted(departments, key=six.text_type):
items.append(HTML.tag('li', c=six.text_type(department)))
for department in sorted(departments, key=str):
items.append(HTML.tag('li', c=str(department)))
return HTML.tag('ul', c=items)
def touch_instance(self, employee):

View file

@ -2,7 +2,7 @@
################################################################################
#
# Rattail -- Retail Software Framework
# Copyright © 2010-2022 Lance Edgar
# Copyright © 2010-2023 Lance Edgar
#
# This file is part of Rattail.
#
@ -24,9 +24,6 @@
Feature views
"""
from __future__ import unicode_literals, absolute_import
import six
import colander
import markdown
@ -49,20 +46,16 @@ class GenerateFeatureView(View):
return handler
def __call__(self):
use_buefy = self.get_use_buefy()
schema = self.handler.make_schema()
app_form = forms.Form(schema=schema, request=self.request,
use_buefy=use_buefy)
for key, value in six.iteritems(self.handler.get_defaults()):
app_form = forms.Form(schema=schema, request=self.request)
for key, value in self.handler.get_defaults().items():
app_form.set_default(key, value)
feature_forms = {}
for feature in self.handler.iter_features():
schema = feature.make_schema()
form = forms.Form(schema=schema, request=self.request,
use_buefy=use_buefy)
for key, value in six.iteritems(feature.get_defaults()):
form = forms.Form(schema=schema, request=self.request)
for key, value in feature.get_defaults().items():
form.set_default(key, value)
feature_forms[feature.feature_key] = form
@ -86,7 +79,6 @@ class GenerateFeatureView(View):
context = {
'index_title': "Generate Feature",
'handler': self.handler,
'use_buefy': use_buefy,
'app_form': app_form,
'feature_type': feature_type,
'feature_forms': feature_forms,

View file

@ -24,8 +24,6 @@
View for running arbitrary import/export jobs
"""
from __future__ import unicode_literals, absolute_import
import getpass
import socket
import sys
@ -34,7 +32,6 @@ import subprocess
import time
import json
import six
import sqlalchemy as sa
from rattail.exceptions import ConfigurationError
@ -222,7 +219,7 @@ class ImportingView(MasterView):
try:
return self.do_runjob(handler_info, form)
except Exception as error:
self.request.session.flash(six.text_type(error), 'error')
self.request.session.flash(str(error), 'error')
return self.redirect(self.request.current_route_url())
return self.render_to_response('runjob', {
@ -274,7 +271,6 @@ class ImportingView(MasterView):
handler = handler_info['_handler']
defaults = {
'request': self.request,
'use_buefy': self.get_use_buefy(),
'model_instance': handler,
'cancel_url': self.request.route_url('{}.view'.format(route_prefix),
key=handler.get_key()),
@ -411,8 +407,7 @@ And here is the output:
data = json.dumps({
'everything_complete': True,
})
if six.PY3:
data = data.encode('utf_8')
data = data.encode('utf_8')
cxn.send(data)
cxn.send(suffix)
cxn.close()

View file

@ -2,7 +2,7 @@
################################################################################
#
# Rattail -- Retail Software Framework
# Copyright © 2010-2022 Lance Edgar
# Copyright © 2010-2023 Lance Edgar
#
# This file is part of Rattail.
#
@ -24,8 +24,6 @@
Label Profile Views
"""
from __future__ import unicode_literals, absolute_import
from rattail.db import model
import colander
@ -93,7 +91,6 @@ class LabelProfileView(MasterView):
pass
def make_printer_settings_form(self, profile, printer):
use_buefy = self.get_use_buefy()
schema = colander.Schema()
for name, label in printer.required_settings.items():
@ -104,7 +101,6 @@ class LabelProfileView(MasterView):
schema.add(node)
form = forms.Form(schema=schema, request=self.request,
use_buefy=use_buefy,
model_instance=profile,
# TODO: ugh, this is necessary to avoid some logic
# which assumes a ColanderAlchemy schema i think?

View file

@ -24,15 +24,12 @@
Views for Luigi
"""
from __future__ import unicode_literals, absolute_import
import json
import logging
import os
import re
import shlex
import six
import sqlalchemy as sa
from rattail.util import simple_error
@ -81,7 +78,6 @@ class LuigiTaskView(MasterView):
luigi_url = self.rattail_config.get('rattail.luigi', 'url')
history_url = '{}/history'.format(luigi_url.rstrip('/')) if luigi_url else None
return self.render_to_response('index', {
'use_buefy': self.get_use_buefy(),
'index_url': None,
'luigi_url': luigi_url,
'luigi_history_url': history_url,
@ -169,7 +165,7 @@ class LuigiTaskView(MasterView):
tasks = []
for task in tasks:
if task['last_date']:
task['last_date'] = six.text_type(task['last_date'])
task['last_date'] = str(task['last_date'])
return tasks
def get_backfill_tasks(self):
@ -179,9 +175,9 @@ class LuigiTaskView(MasterView):
tasks = []
for task in tasks:
if task['last_date']:
task['last_date'] = six.text_type(task['last_date'])
task['last_date'] = str(task['last_date'])
if task['target_date']:
task['target_date'] = six.text_type(task['target_date'])
task['target_date'] = str(task['target_date'])
return tasks
def configure_gather_settings(self, data):
@ -224,7 +220,7 @@ class LuigiTaskView(MasterView):
{'name': 'rattail.luigi.backfill.task.{}.notes'.format(key),
'value': task['notes']},
{'name': 'rattail.luigi.backfill.task.{}.target_date'.format(key),
'value': six.text_type(task['target_date'])},
'value': str(task['target_date'])},
])
if keys:
settings.append({'name': 'rattail.luigi.backfill.tasks',

View file

@ -24,8 +24,6 @@
Model Master View
"""
from __future__ import unicode_literals, absolute_import
import os
import csv
import datetime
@ -252,7 +250,7 @@ class MasterView(View):
def set_labels(self, obj):
labels = self.collect_labels()
for key, label in six.iteritems(labels):
for key, label in labels.items():
obj.set_label(key, label)
def collect_labels(self):
@ -283,7 +281,7 @@ class MasterView(View):
def set_row_labels(self, obj):
labels = self.collect_row_labels()
for key, label in six.iteritems(labels):
for key, label in labels.items():
obj.set_label(key, label)
def collect_row_labels(self):
@ -333,7 +331,6 @@ class MasterView(View):
"""
self.listing = True
grid = self.make_grid()
use_buefy = self.get_use_buefy()
# If user just refreshed the page with a reset instruction, issue a
# redirect in order to clear out the query string.
@ -346,14 +343,9 @@ class MasterView(View):
# return grid only, if partial page was requested
if self.request.params.get('partial'):
if use_buefy:
# render grid data only, as JSON
return render_to_response('json', grid.get_buefy_data(),
request=self.request)
else: # just do traditional thing, render grid HTML
self.request.response.content_type = str('text/html')
self.request.response.text = grid.render_grid()
return self.request.response
# render grid data only, as JSON
return render_to_response('json', grid.get_buefy_data(),
request=self.request)
context = {
'grid': grid,
@ -552,17 +544,16 @@ class MasterView(View):
if self.has_rows and 'main_actions' not in defaults:
actions = []
use_buefy = self.get_use_buefy()
# view action
if self.rows_viewable:
icon = 'eye' if use_buefy else 'zoomin'
actions.append(self.make_action('view', icon=icon, url=self.row_view_action_url))
actions.append(self.make_action('view', icon='eye',
url=self.row_view_action_url))
# edit action
if self.rows_editable and self.has_perm('edit_row'):
icon = 'edit' if use_buefy else 'pencil'
actions.append(self.make_action('edit', icon=icon, url=self.row_edit_action_url))
actions.append(self.make_action('edit', icon='edit',
url=self.row_edit_action_url))
# delete action
if self.rows_deletable and self.has_perm('delete_row'):
@ -626,7 +617,6 @@ class MasterView(View):
Return a dictionary of kwargs to be passed to the factory when
constructing a new version grid.
"""
use_buefy = self.get_use_buefy()
instance = kwargs.get('instance') or self.get_instance()
route = '{}.version'.format(self.get_route_prefix())
defaults = {
@ -638,7 +628,7 @@ class MasterView(View):
if 'main_actions' not in kwargs:
url = lambda txn, i: self.request.route_url(route, uuid=instance.uuid, txnid=txn.id)
defaults['main_actions'] = [
self.make_action('view', icon='eye' if use_buefy else 'zoomin', url=url),
self.make_action('view', icon='eye', url=url),
]
defaults.update(kwargs)
return defaults
@ -735,11 +725,10 @@ class MasterView(View):
delete=False, schema=None, importer_host_title=None):
handler = handler_factory(self.rattail_config)
use_buefy = self.get_use_buefy()
if not schema:
schema = forms.SimpleFileImport().bind(request=self.request)
form = forms.Form(schema=schema, request=self.request, use_buefy=use_buefy)
form = forms.Form(schema=schema, request=self.request)
form.save_label = "Upload"
form.cancel_url = self.get_index_url()
if form.validate(newstyle=True):
@ -771,7 +760,7 @@ class MasterView(View):
value = getattr(obj, field)
if value is None:
return ""
value = six.text_type(value)
value = str(value)
if len(value) > 100:
value = value[:100] + '...'
return value
@ -841,7 +830,7 @@ class MasterView(View):
product = getattr(obj, field)
if not product:
return ""
text = six.text_type(product)
text = str(product)
url = self.request.route_url('products.view', uuid=product.uuid)
return tags.link_to(text, url)
@ -849,7 +838,7 @@ class MasterView(View):
pending = getattr(obj, field)
if not pending:
return
text = six.text_type(pending)
text = str(pending)
url = self.request.route_url('pending_products.view', uuid=pending.uuid)
return tags.link_to(text, url,
class_='has-background-warning')
@ -862,7 +851,7 @@ class MasterView(View):
if short:
text = "({}) {}".format(short, vendor.name)
else:
text = six.text_type(vendor)
text = str(vendor)
url = self.request.route_url('vendors.view', uuid=vendor.uuid)
return tags.link_to(text, url)
@ -918,7 +907,7 @@ class MasterView(View):
person = getattr(obj, field)
if not person:
return ""
text = six.text_type(person)
text = str(person)
url = self.request.route_url('people.view', uuid=person.uuid)
return tags.link_to(text, url)
@ -926,7 +915,7 @@ class MasterView(View):
person = getattr(obj, field)
if not person:
return ""
text = six.text_type(person)
text = str(person)
url = self.request.route_url('people.view_profile', uuid=person.uuid)
return tags.link_to(text, url)
@ -934,7 +923,7 @@ class MasterView(View):
user = getattr(obj, field)
if not user:
return ""
text = six.text_type(user)
text = str(user)
url = self.request.route_url('users.view', uuid=user.uuid)
return tags.link_to(text, url)
@ -954,7 +943,7 @@ class MasterView(View):
customer = getattr(obj, field)
if not customer:
return ""
text = six.text_type(customer)
text = str(customer)
url = self.request.route_url('customers.view', uuid=customer.uuid)
return tags.link_to(text, url)
@ -984,7 +973,7 @@ class MasterView(View):
value = obj.status_code
if value is None:
return ""
status_code_text = enum.get(value, six.text_type(value))
status_code_text = enum.get(value, str(value))
if obj.status_text:
return HTML.tag('span', title=obj.status_text, c=status_code_text)
return status_code_text
@ -1072,7 +1061,6 @@ class MasterView(View):
View for viewing details of an existing model record.
"""
self.viewing = True
use_buefy = self.get_use_buefy()
if instance is None:
instance = self.get_instance()
form = self.make_form(instance)
@ -1090,14 +1078,9 @@ class MasterView(View):
# return grid only, if partial page was requested
if self.request.params.get('partial'):
if use_buefy:
# render grid data only, as JSON
return render_to_response('json', grid.get_buefy_data(),
request=self.request)
else: # just do traditional thing, render grid HTML
self.request.response.content_type = str('text/html')
self.request.response.text = grid.render_grid()
return self.request.response
# render grid data only, as JSON
return render_to_response('json', grid.get_buefy_data(),
request=self.request)
context = {
'instance': instance,
@ -1112,12 +1095,8 @@ class MasterView(View):
context['dform'] = form.make_deform_form()
if self.has_rows:
if use_buefy:
context['rows_grid'] = grid
context['rows_grid_tools'] = HTML(self.make_row_grid_tools(instance) or '').strip()
else:
context['rows_grid'] = grid.render_complete(allow_save_defaults=False,
tools=self.make_row_grid_tools(instance))
context['rows_grid'] = grid
context['rows_grid_tools'] = HTML(self.make_row_grid_tools(instance) or '').strip()
return self.render_to_response('view', context)
@ -1224,18 +1203,12 @@ class MasterView(View):
instance = self.get_instance()
instance_title = self.get_instance_title(instance)
grid = self.make_version_grid(instance=instance)
use_buefy = self.get_use_buefy()
# return grid only, if partial page was requested
if self.request.params.get('partial'):
if use_buefy:
# render grid data only, as JSON
return render_to_response('json', grid.get_buefy_data(),
request=self.request)
else: # just do traditional thing, render grid HTML
self.request.response.content_type = str('text/html')
self.request.response.text = grid.render_grid()
return self.request.response
# render grid data only, as JSON
return render_to_response('json', grid.get_buefy_data(),
request=self.request)
return self.render_to_response('versions', {
'instance': instance,
@ -1567,15 +1540,10 @@ class MasterView(View):
response.content_length = os.path.getsize(path)
content_type = self.download_content_type(path, filename)
if content_type:
if six.PY3:
response.content_type = content_type
else:
response.content_type = six.binary_type(content_type)
response.content_type = content_type
# content-disposition
filename = os.path.basename(path)
if six.PY2:
filename = filename.encode('ascii', 'replace')
response.content_disposition = str('attachment; filename="{}"'.format(filename))
return response
@ -1986,8 +1954,7 @@ class MasterView(View):
# strip suffix, interpret data as JSON
data = data[:-len(suffix)]
if six.PY3:
data = data.decode('utf_8')
data = data.decode('utf_8')
data = json.loads(data)
if data.get('everything_complete'):
@ -2056,7 +2023,7 @@ class MasterView(View):
object_to_keep = self.Session.query(self.get_model_class()).get(uuids[1])
if object_to_remove and object_to_keep and self.request.POST.get('commit-merge') == 'yes':
msg = six.text_type(object_to_remove)
msg = str(object_to_remove)
try:
self.validate_merge(object_to_remove, object_to_keep)
except Exception as error:
@ -2166,7 +2133,7 @@ class MasterView(View):
"""
if hasattr(cls, 'model_key'):
keys = cls.model_key
if isinstance(keys, six.string_types):
if isinstance(keys, str):
keys = [keys]
else:
keys = get_primary_keys(cls.get_model_class())
@ -2399,7 +2366,6 @@ class MasterView(View):
"""
context = {
'master': self,
'use_buefy': self.get_use_buefy(),
'model_title': self.get_model_title(),
'model_title_plural': self.get_model_title_plural(),
'route_prefix': self.get_route_prefix(),
@ -2699,7 +2665,7 @@ class MasterView(View):
# nb. unfortunately HTML.tag() calls its first arg 'tag' and
# so we can't pass a kwarg with that name...so instead we
# patch that into place manually
button = six.text_type(button)
button = str(button)
button = button.replace('<b-button ',
'<b-button tag="a"')
button = HTML.literal(button)
@ -2733,7 +2699,7 @@ class MasterView(View):
btn_kw['icon_left'] = 'external-link-alt'
btn_kw['target'] = '_blank'
button = HTML.tag('b-button', **btn_kw)
button = six.text_type(button)
button = str(button)
button = button.replace('<b-button ',
'<b-button tag="a"')
button = HTML.literal(button)
@ -2840,9 +2806,7 @@ class MasterView(View):
return actions
def make_grid_action_view(self):
use_buefy = self.get_use_buefy()
icon = 'eye' if use_buefy else 'zoomin'
return self.make_action('view', icon=icon, url=self.default_view_url())
return self.make_action('view', icon='eye', url=self.default_view_url())
def default_view_url(self):
if self.use_index_links:
@ -2869,18 +2833,15 @@ class MasterView(View):
return actions
def make_grid_action_edit(self):
use_buefy = self.get_use_buefy()
icon = 'edit' if use_buefy else 'pencil'
return self.make_action('edit', icon=icon, url=self.default_edit_url)
return self.make_action('edit', icon='edit', url=self.default_edit_url)
def make_grid_action_clone(self):
return self.make_action('clone', icon='object-ungroup',
url=self.default_clone_url)
def make_grid_action_delete(self):
use_buefy = self.get_use_buefy()
kwargs = {}
if use_buefy and self.delete_confirm == 'simple':
if self.delete_confirm == 'simple':
kwargs['click_handler'] = 'deleteObject'
return self.make_action('delete', icon='trash', url=self.default_delete_url, **kwargs)
@ -2917,7 +2878,7 @@ class MasterView(View):
mapper = orm.object_mapper(row)
except orm.exc.UnmappedInstanceError:
try:
if isinstance(self.model_key, six.string_types):
if isinstance(self.model_key, str):
return {self.model_key: row[self.model_key]}
return dict([(key, row[key])
for key in self.model_key])
@ -3134,12 +3095,8 @@ class MasterView(View):
"""
if fmt == 'csv':
if six.PY2:
csv_file = open(path, 'wb')
writer = UnicodeDictWriter(csv_file, fields, encoding='utf_8')
else: # PY3
csv_file = open(path, 'wt', encoding='utf_8')
writer = csv.DictWriter(csv_file, fields)
csv_file = open(path, 'wt', encoding='utf_8')
writer = csv.DictWriter(csv_file, fields)
writer.writeheader()
def write(obj, i):
@ -3229,7 +3186,7 @@ class MasterView(View):
if value is None:
value = ''
else:
value = six.text_type(value)
value = str(value)
csvrow[field] = value
@ -3297,13 +3254,8 @@ class MasterView(View):
results = results.with_session(session).all()
fields = self.get_csv_fields()
if six.PY2:
csv_file = open(path, 'wb')
writer = UnicodeDictWriter(csv_file, fields, encoding='utf_8')
else: # PY3
csv_file = open(path, 'wt', encoding='utf_8')
writer = csv.DictWriter(csv_file, fields)
csv_file = open(path, 'wt', encoding='utf_8')
writer = csv.DictWriter(csv_file, fields)
writer.writeheader()
def write(obj, i):
@ -3663,12 +3615,8 @@ class MasterView(View):
if fmt == 'csv':
if six.PY2:
csv_file = open(path, 'wb')
writer = UnicodeDictWriter(csv_file, fields, encoding='utf_8')
else: # PY3
csv_file = open(path, 'wt', encoding='utf_8')
writer = csv.DictWriter(csv_file, fields)
csv_file = open(path, 'wt', encoding='utf_8')
writer = csv.DictWriter(csv_file, fields)
writer.writeheader()
def write(obj, i):
@ -3737,7 +3685,7 @@ class MasterView(View):
if value is None:
value = ''
else:
value = six.text_type(value)
value = str(value)
csvrow[field] = value
@ -3814,7 +3762,7 @@ class MasterView(View):
value = getattr(row, field, None)
if isinstance(value, GPC):
value = six.text_type(value)
value = str(value)
elif isinstance(value, datetime.datetime):
# datetime values we provide to Excel must *not* have time zone info,
@ -3844,14 +3792,9 @@ class MasterView(View):
writer.writerow(self.get_row_csv_row(row, fields))
response = self.request.response
filename = self.get_row_results_csv_filename(obj)
if six.PY3:
response.text = data.getvalue()
response.content_type = 'text/csv'
response.content_disposition = 'attachment; filename={}'.format(filename)
else:
response.body = data.getvalue()
response.content_type = b'text/csv'
response.content_disposition = b'attachment; filename={}'.format(filename)
response.text = data.getvalue()
response.content_type = 'text/csv'
response.content_disposition = 'attachment; filename={}'.format(filename)
data.close()
response.content_length = len(response.body)
return response
@ -3898,7 +3841,7 @@ class MasterView(View):
if isinstance(value, datetime.datetime):
# TODO: this assumes value is *always* naive UTC
value = localtime(self.rattail_config, value, from_utc=True)
csvrow[field] = '' if value is None else six.text_type(value)
csvrow[field] = '' if value is None else str(value)
return csvrow
def get_row_csv_row(self, row, fields):
@ -3911,7 +3854,7 @@ class MasterView(View):
if isinstance(value, datetime.datetime):
# TODO: this assumes value is *always* naive UTC
value = localtime(self.rattail_config, value, from_utc=True)
csvrow[field] = '' if value is None else six.text_type(value)
csvrow[field] = '' if value is None else str(value)
return csvrow
##############################
@ -3966,7 +3909,7 @@ class MasterView(View):
"""
Return a "pretty" title for the instance, to be used in the page title etc.
"""
return six.text_type(instance)
return str(instance)
@classmethod
def get_form_factory(cls):
@ -4078,7 +4021,6 @@ class MasterView(View):
'readonly': self.viewing,
'model_class': getattr(self, 'model_class', None),
'action_url': self.request.current_route_url(_query=None),
'use_buefy': self.get_use_buefy(),
'assume_local_times': self.has_local_times,
'route_prefix': route_prefix,
'can_edit_help': (self.has_perm('edit_help')
@ -4547,7 +4489,6 @@ class MasterView(View):
'readonly': self.viewing,
'model_class': getattr(self, 'model_row_class', None),
'action_url': self.request.current_route_url(_query=None),
'use_buefy': self.get_use_buefy(),
}
if self.creating:
kwargs.setdefault('cancel_url', self.request.get_referrer())
@ -4644,7 +4585,7 @@ class MasterView(View):
# collect any uploaded files
uploads = {}
for key, value in six.iteritems(data):
for key, value in data.items():
if isinstance(value, cgi_FieldStorage):
tempdir = tempfile.mkdtemp()
filename = os.path.basename(value.filename)
@ -4829,13 +4770,13 @@ class MasterView(View):
value = data.get(name)
if simple.get('type') is bool:
value = six.text_type(bool(value)).lower()
value = str(bool(value)).lower()
elif simple.get('type') is int:
value = six.text_type(int(value or '0'))
value = str(int(value or '0'))
elif value is None:
value = ''
else:
value = six.text_type(value)
value = str(value)
# only want to save this setting if we received a
# value, or if empty values are okay to save

View file

@ -24,8 +24,6 @@
Base class for Config Views
"""
from __future__ import unicode_literals, absolute_import
import json
import sqlalchemy as sa
@ -62,7 +60,6 @@ class MenuConfigView(View):
context = {
'config_title': "Menus",
'use_buefy': True,
'index_title': "App Details",
'index_url': self.request.route_url('appinfo'),
}

View file

@ -24,10 +24,6 @@
Message Views
"""
from __future__ import unicode_literals, absolute_import
import six
from rattail.db import model
from rattail.time import localtime
@ -139,7 +135,7 @@ class MessageView(MasterView):
sender = message.sender
if sender is self.request.user:
return 'you'
return six.text_type(sender)
return str(sender)
def render_subject_bold(self, message, field):
if not message.subject:
@ -164,8 +160,6 @@ class MessageView(MasterView):
if not recipients:
return ""
use_buefy = self.get_use_buefy()
# remove current user from displayed list, even if they're a recipient
recips = [r for r in recipients
if r.recipient is not self.request.user]
@ -182,23 +176,17 @@ class MessageView(MasterView):
# client-side JS allowing the user to view all if they want
max_display = 5
if len(recips) > max_display:
if use_buefy:
basic = HTML.tag('span', c="{}, ".format(', '.join(recips[:max_display-1])))
more = tags.link_to("({} more)".format(len(recips[max_display-1:])), '#', **{
'v-show': '!showingAllRecipients',
'@click.prevent': 'showMoreRecipients()',
})
everyone = HTML.tag('span', c=', '.join(recips[max_display-1:]), **{
'v-show': 'showingAllRecipients',
'@click': 'hideMoreRecipients()',
'class_': 'everyone',
})
return HTML.tag('div', c=[basic, more, everyone])
else:
basic = HTML.literal("{}, ".format(', '.join(recips[:max_display-1])))
more = tags.link_to("({} more)".format(len(recips[max_display-1:])), '#', class_='more')
everyone = HTML.tag('span', class_='everyone', c=', '.join(recips[max_display-1:]))
return basic + more + everyone
basic = HTML.tag('span', c="{}, ".format(', '.join(recips[:max_display-1])))
more = tags.link_to("({} more)".format(len(recips[max_display-1:])), '#', **{
'v-show': '!showingAllRecipients',
'@click.prevent': 'showMoreRecipients()',
})
everyone = HTML.tag('span', c=', '.join(recips[max_display-1:]), **{
'v-show': 'showingAllRecipients',
'@click': 'hideMoreRecipients()',
'class_': 'everyone',
})
return HTML.tag('div', c=[basic, more, everyone])
# show the full list if there are few enough recipients for that
return ', '.join(recips)
@ -214,15 +202,9 @@ class MessageView(MasterView):
def configure_form(self, f):
super(MessageView, self).configure_form(f)
use_buefy = self.get_use_buefy()
f.submit_label = "Send Message"
if not use_buefy:
# we have custom logic to disable submit button
f.auto_disable = False
f.auto_disable_save = False
# TODO: A fair amount of this still seems hacky...
f.set_renderer('sender', self.render_sender)
@ -235,13 +217,12 @@ class MessageView(MasterView):
f.set_label('recipients', "To")
# subject
if use_buefy:
f.set_renderer('subject', self.render_subject_bold)
if self.creating:
f.set_widget('subject', dfwidget.TextInputWidget(
placeholder="please enter a subject",
autocomplete='off'))
f.set_required('subject')
f.set_renderer('subject', self.render_subject_bold)
if self.creating:
f.set_widget('subject', dfwidget.TextInputWidget(
placeholder="please enter a subject",
autocomplete='off'))
f.set_required('subject')
# body
f.set_widget('body', dfwidget.TextAreaWidget(cols=50, rows=15))
@ -253,10 +234,7 @@ class MessageView(MasterView):
f.insert_after('recipients', 'set_recipients')
f.remove('recipients')
f.set_node('set_recipients', colander.SchemaNode(colander.Set()))
if use_buefy:
f.set_widget('set_recipients', RecipientsWidgetBuefy())
else:
f.set_widget('set_recipients', RecipientsWidget())
f.set_widget('set_recipients', RecipientsWidgetBuefy())
f.set_label('set_recipients', "To")
if self.replying:
@ -278,17 +256,11 @@ class MessageView(MasterView):
value = [r[0] for r in value]
if old_message.sender is not self.request.user and old_message.sender.active:
value.insert(0, old_message.sender_uuid)
if use_buefy:
f.set_default('set_recipients', value)
else:
f.set_default('set_recipients', ','.join(value))
f.set_default('set_recipients', value)
# Just a normal reply, to sender only.
elif self.filter_reply_recipient(old_message.sender):
if use_buefy:
f.set_default('set_recipients', [old_message.sender.uuid])
else:
f.set_default('set_recipients', old_message.sender.uuid)
f.set_default('set_recipients', [old_message.sender.uuid])
# TODO?
# # Set focus to message body instead of recipients, when replying.
@ -347,11 +319,9 @@ class MessageView(MasterView):
return recipient
def template_kwargs_create(self, **kwargs):
use_buefy = self.get_use_buefy()
recips = self.get_available_recipients()
if use_buefy:
kwargs['recipient_display_map'] = recips
kwargs['recipient_display_map'] = recips
recips = list(recips.items())
recips.sort(key=self.recipient_sortkey)
kwargs['available_recipients'] = recips
@ -359,9 +329,8 @@ class MessageView(MasterView):
if self.replying:
kwargs['original_message'] = self.get_instance()
if use_buefy:
kwargs['index_url'] = None
kwargs['index_title'] = "New Message"
kwargs['index_url'] = None
kwargs['index_title'] = "New Message"
return kwargs
def recipient_sortkey(self, recip):
@ -538,20 +507,6 @@ class SentView(MessageView):
default_active=True, default_verb='contains')
class RecipientsWidget(dfwidget.TextInputWidget):
def deserialize(self, field, pstruct):
if pstruct is colander.null:
return []
elif not isinstance(pstruct, six.string_types):
raise colander.Invalid(field.schema, "Pstruct is not a string")
if self.strip:
pstruct = pstruct.strip()
if not pstruct:
return []
return pstruct.split(',')
class RecipientsWidgetBuefy(dfwidget.Widget):
"""
Custom "message recipients" widget, for use with Buefy / Vue.js themes.
@ -561,7 +516,7 @@ class RecipientsWidgetBuefy(dfwidget.Widget):
def deserialize(self, field, pstruct):
if pstruct is colander.null:
return colander.null
if not isinstance(pstruct, six.string_types):
if not isinstance(pstruct, str):
raise colander.Invalid(field.schema, "Pstruct is not a string")
if not pstruct:
return colander.null

View file

@ -2,7 +2,7 @@
################################################################################
#
# Rattail -- Retail Software Framework
# Copyright © 2010-2022 Lance Edgar
# Copyright © 2010-2023 Lance Edgar
#
# This file is part of Rattail.
#
@ -24,12 +24,9 @@
Person Views
"""
from __future__ import unicode_literals, absolute_import
import datetime
import logging
import six
import sqlalchemy as sa
from sqlalchemy import orm
@ -165,13 +162,10 @@ class PersonView(MasterView):
.filter(model.MergePeopleRequest.merged == None)\
.first()
if merge_request:
use_buefy = self.get_use_buefy()
if use_buefy:
return HTML.tag('span',
class_='has-text-danger has-text-weight-bold',
title="A merge has been requested for this person.",
c="MR")
return "MR"
return HTML.tag('span',
class_='has-text-danger has-text-weight-bold',
title="A merge has been requested for this person.",
c="MR")
def get_instance(self):
# TODO: I don't recall why this fallback check for a vendor contact
@ -335,7 +329,7 @@ class PersonView(MasterView):
employee = person.employee
if not employee:
return ""
text = six.text_type(employee)
text = str(employee)
url = self.request.route_url('employees.view', uuid=employee.uuid)
return tags.link_to(text, url)
@ -346,7 +340,7 @@ class PersonView(MasterView):
items = []
for customer in customers:
customer = customer.customer
text = six.text_type(customer)
text = str(customer)
if customer.number:
text = "(#{}) {}".format(customer.number, text)
elif customer.id:
@ -361,7 +355,7 @@ class PersonView(MasterView):
return ""
items = []
for member in members:
text = six.text_type(member)
text = str(member)
if member.number:
text = "(#{}) {}".format(member.number, text)
elif member.id:
@ -371,7 +365,6 @@ class PersonView(MasterView):
return HTML.tag('ul', c=items)
def render_users(self, person, field):
use_buefy = self.get_use_buefy()
users = person.users
items = []
for user in users:
@ -381,11 +374,8 @@ class PersonView(MasterView):
if items:
return HTML.tag('ul', c=items)
elif self.viewing and self.request.has_perm('users.create'):
if use_buefy:
return HTML.tag('b-button', type='is-primary', c="Make User",
**{'@click': 'clickMakeUser()'})
else:
return HTML.tag('button', type='button', id='make-user', c="Make User")
return HTML.tag('b-button', type='is-primary', c="Make User",
**{'@click': 'clickMakeUser()'})
else:
return ""
@ -428,8 +418,7 @@ class PersonView(MasterView):
'dynamic_content_title': self.get_context_content_title(person),
}
use_buefy = self.get_use_buefy()
template = 'view_profile_buefy' if use_buefy else 'view_profile'
template = 'view_profile_buefy'
return self.render_to_response(template, context)
def get_customer_xref_buttons(self, person):
@ -524,7 +513,7 @@ class PersonView(MasterView):
return context
def get_context_content_title(self, person):
return six.text_type(person)
return str(person)
def get_context_address(self, address):
context = {
@ -534,7 +523,7 @@ class PersonView(MasterView):
'city': address.city,
'state': address.state,
'zipcode': address.zipcode,
'display': six.text_type(address),
'display': str(address),
}
model = self.model
@ -587,12 +576,12 @@ class PersonView(MasterView):
'number': member.number,
'id': member.id,
'active': member.active,
'joined': six.text_type(member.joined) if member.joined else None,
'withdrew': six.text_type(member.withdrew) if member.withdrew else None,
'joined': str(member.joined) if member.joined else None,
'withdrew': str(member.withdrew) if member.withdrew else None,
'customer_uuid': member.customer_uuid,
'customer_name': member.customer.name if member.customer else None,
'person_uuid': member.person_uuid,
'display': six.text_type(member),
'display': str(member),
'person_display_name': member.person.display_name if member.person else None,
'view_url': self.request.route_url('members.view', uuid=member.uuid),
'view_profile_url': profile_url,
@ -614,8 +603,8 @@ class PersonView(MasterView):
for history in employee.sorted_history(reverse=True):
data.append({
'uuid': history.uuid,
'start_date': six.text_type(history.start_date),
'end_date': six.text_type(history.end_date or ''),
'start_date': str(history.start_date),
'end_date': str(history.end_date or ''),
})
return data
@ -911,7 +900,7 @@ class PersonView(MasterView):
'success': True,
'employee': self.get_context_employee(employee),
'employee_view_url': self.request.route_url('employees.view', uuid=employee.uuid),
'start_date': six.text_type(start_date),
'start_date': str(start_date),
'employee_history_data': self.get_context_employee_history(employee),
'dynamic_content_title': self.get_context_content_title(person),
}
@ -942,7 +931,7 @@ class PersonView(MasterView):
'success': True,
'employee': self.get_context_employee(employee),
'employee_view_url': self.request.route_url('employees.view', uuid=employee.uuid),
'end_date': six.text_type(end_date),
'end_date': str(end_date),
'employee_history_data': self.get_context_employee_history(employee),
'dynamic_content_title': self.get_context_content_title(person),
}
@ -975,8 +964,8 @@ class PersonView(MasterView):
return {
'success': True,
'employee': self.get_context_employee(employee),
'start_date': six.text_type(current_history.start_date),
'end_date': six.text_type(current_history.end_date or ''),
'start_date': str(current_history.start_date),
'end_date': str(current_history.end_date or ''),
'employee_history_data': self.get_context_employee_history(employee),
}
@ -1438,7 +1427,7 @@ class MergePeopleRequestView(MasterView):
uuid = getattr(merge_request, field)
person = self.Session.query(self.model.Person).get(uuid)
if person:
return six.text_type(person)
return str(person)
return "(person not found)"
def get_instance_title(self, merge_request):
@ -1459,7 +1448,7 @@ class MergePeopleRequestView(MasterView):
uuid = getattr(merge_request, field)
person = self.Session.query(self.model.Person).get(uuid)
if person:
text = six.text_type(person)
text = str(person)
url = self.request.route_url('people.view', uuid=person.uuid)
return tags.link_to(text, url)
return "(person not found)"

View file

@ -2,7 +2,7 @@
################################################################################
#
# Rattail -- Retail Software Framework
# Copyright © 2010-2021 Lance Edgar
# Copyright © 2010-2023 Lance Edgar
#
# This file is part of Rattail.
#
@ -24,8 +24,6 @@
"Principal" master view
"""
from __future__ import unicode_literals, absolute_import
import copy
from rattail.core import Object
@ -85,12 +83,11 @@ class PrincipalMasterView(MasterView):
context = {'form': form, 'permissions': sorted_perms, 'principals': principals}
if self.get_use_buefy():
perms = self.get_buefy_perms_data(sorted_perms)
context['buefy_perms'] = perms
context['buefy_sorted_groups'] = list(perms)
context['selected_group'] = self.request.POST.get('permission_group', 'common')
context['selected_permission'] = self.request.POST.get('permission', None)
perms = self.get_buefy_perms_data(sorted_perms)
context['buefy_perms'] = perms
context['buefy_sorted_groups'] = list(perms)
context['selected_group'] = self.request.POST.get('permission_group', 'common')
context['selected_permission'] = self.request.POST.get('permission', None)
return self.render_to_response('find_by_perm', context)

View file

@ -24,12 +24,9 @@
Product Views
"""
from __future__ import unicode_literals, absolute_import
import re
import logging
import six
import humanize
import sqlalchemy as sa
from sqlalchemy import orm
@ -212,7 +209,6 @@ class ProductView(MasterView):
super(ProductView, self).configure_grid(g)
app = self.get_rattail_app()
model = self.model
use_buefy = self.get_use_buefy()
def join_vendor(q):
return q.outerjoin(self.ProductVendorCost,
@ -257,9 +253,6 @@ class ProductView(MasterView):
departments = self.get_departments()
department_choices = OrderedDict([('', "(any)")]
+ [(d.uuid, d.name) for d in departments])
if not use_buefy:
department_choices = [tags.Option(name, uuid)
for uuid, name in six.iteritems(department_choices)]
g.set_filter('department', model.Department.uuid,
value_enum=department_choices,
verbs=['equal', 'not_equal', 'is_null', 'is_not_null', 'is_any'],
@ -378,12 +371,9 @@ class ProductView(MasterView):
g.set_filter('report_code_name', model.ReportCode.name)
if self.expose_label_printing and self.has_perm('print_labels'):
if use_buefy:
g.more_actions.append(self.make_action(
'print_label', icon='print', url='#',
click_handler='quickLabelPrint(props.row)'))
else:
g.more_actions.append(grids.GridAction('print_label', icon='print'))
g.more_actions.append(self.make_action(
'print_label', icon='print', url='#',
click_handler='quickLabelPrint(props.row)'))
g.set_renderer('regular_price', self.render_price)
g.set_renderer('on_hand', self.render_on_hand)
@ -572,10 +562,7 @@ class ProductView(MasterView):
if not self.has_perm('versions'):
return text
if self.get_use_buefy():
kwargs = {'@click.prevent': 'showPriceHistory_{}()'.format(typ)}
else:
kwargs = {'id': 'view-{}-price-history'.format(typ)}
kwargs = {'@click.prevent': 'showPriceHistory_{}()'.format(typ)}
history = tags.link_to("(view history)", '#', **kwargs)
if not text:
return history
@ -815,7 +802,7 @@ class ProductView(MasterView):
if 'upc' in data:
if isinstance(data['upc'], GPC):
data['upc'] = six.text_type(data['upc'])
data['upc'] = str(data['upc'])
return data
@ -971,9 +958,9 @@ class ProductView(MasterView):
if self.request.POST.get('brand_uuid'):
brand = self.Session.query(model.Brand).get(self.request.POST['brand_uuid'])
if brand:
brand_display = six.text_type(brand)
brand_display = str(brand)
elif self.editing:
brand_display = six.text_type(product.brand or '')
brand_display = str(product.brand or '')
brands_url = self.request.route_url('brands.autocomplete')
f.set_widget('brand_uuid', forms.widgets.JQueryAutocompleteWidget(
field_display=brand_display, service_url=brands_url))
@ -1139,11 +1126,11 @@ class ProductView(MasterView):
history['price'] = float(price)
history['price_display'] = app.render_currency(price)
changed = localtime(self.rattail_config, history['changed'], from_utc=True)
history['changed'] = six.text_type(changed)
history['changed'] = str(changed)
history['changed_display_html'] = raw_datetime(self.rattail_config, changed)
user = history.pop('changed_by')
history['changed_by_uuid'] = user.uuid if user else None
history['changed_by_display'] = six.text_type(user or "??")
history['changed_by_display'] = str(user or "??")
jsdata.append(history)
return jsdata
@ -1165,18 +1152,17 @@ class ProductView(MasterView):
else:
history['cost_display'] = None
changed = localtime(self.rattail_config, history['changed'], from_utc=True)
history['changed'] = six.text_type(changed)
history['changed'] = str(changed)
history['changed_display_html'] = raw_datetime(self.rattail_config, changed)
user = history.pop('changed_by')
history['changed_by_uuid'] = user.uuid
history['changed_by_display'] = six.text_type(user)
history['changed_by_display'] = str(user)
jsdata.append(history)
return jsdata
def template_kwargs_view(self, **kwargs):
kwargs = super(ProductView, self).template_kwargs_view(**kwargs)
product = kwargs['instance']
use_buefy = self.get_use_buefy()
kwargs['image_url'] = self.products_handler.get_image_url(product)
@ -1184,10 +1170,7 @@ class ProductView(MasterView):
if self.rattail_config.versioning_enabled() and self.has_perm('versions'):
# regular price
if use_buefy:
data = [] # defer fetching until user asks for it
else:
data = self.get_regular_price_history(product)
data = [] # defer fetching until user asks for it
grid = grids.Grid('products.regular_price_history', data,
request=self.request,
columns=[
@ -1201,10 +1184,7 @@ class ProductView(MasterView):
kwargs['regular_price_history_grid'] = grid
# current price
if use_buefy:
data = [] # defer fetching until user asks for it
else:
data = self.get_current_price_history(product)
data = [] # defer fetching until user asks for it
grid = grids.Grid('products.current_price_history', data,
request=self.request,
columns=[
@ -1222,10 +1202,7 @@ class ProductView(MasterView):
kwargs['current_price_history_grid'] = grid
# suggested price
if use_buefy:
data = [] # defer fetching until user asks for it
else:
data = self.get_suggested_price_history(product)
data = [] # defer fetching until user asks for it
grid = grids.Grid('products.suggested_price_history', data,
request=self.request,
columns=[
@ -1239,10 +1216,7 @@ class ProductView(MasterView):
kwargs['suggested_price_history_grid'] = grid
# cost history
if use_buefy:
data = [] # defer fetching until user asks for it
else:
data = self.get_cost_history(product)
data = [] # defer fetching until user asks for it
grid = grids.Grid('products.cost_history', data,
request=self.request,
columns=[
@ -1264,9 +1238,8 @@ class ProductView(MasterView):
kwargs['costs_label_code'] = "Order Code"
kwargs['costs_label_case_size'] = "Case Size"
if use_buefy:
kwargs['vendor_sources'] = self.get_context_vendor_sources(product)
kwargs['lookup_codes'] = self.get_context_lookup_codes(product)
kwargs['vendor_sources'] = self.get_context_vendor_sources(product)
kwargs['lookup_codes'] = self.get_context_lookup_codes(product)
kwargs['panel_fields'] = self.get_panel_fields(product)
@ -1362,7 +1335,7 @@ class ProductView(MasterView):
source['case_size'] = app.render_quantity(cost.case_size)
source['case_cost'] = app.render_currency(cost.case_cost)
text = six.text_type(cost.vendor)
text = str(cost.vendor)
if link_vendor:
url = self.request.route_url('vendors.view', uuid=cost.vendor.uuid)
source['vendor'] = tags.link_to(text, url)
@ -1768,8 +1741,6 @@ class ProductView(MasterView):
# TODO: how to properly detect image type?
# content_type = 'image/png'
content_type = 'image/jpeg'
if not six.PY3:
content_type = six.binary_type(content_type)
self.request.response.content_type = content_type
self.request.response.body = product.image.bytes
return self.request.response
@ -1802,7 +1773,7 @@ class ProductView(MasterView):
printer.print_labels([({'product': product}, quantity)])
except Exception as error:
log.warning("error occurred while printing labels", exc_info=True)
return {'error': six.text_type(error)}
return {'error': str(error)}
return {'ok': True}
def search(self):
@ -1923,7 +1894,7 @@ class ProductView(MasterView):
if product and (not product.deleted or self.request.has_perm('products.view_deleted')):
data = {
'uuid': product.uuid,
'upc': six.text_type(product.upc),
'upc': str(product.upc),
'upc_pretty': product.upc.pretty(),
'full_description': product.full_description,
'image_url': pod.get_image_url(self.rattail_config, product.upc),
@ -2282,7 +2253,7 @@ class PendingProductView(MasterView):
g.set_enum('status_code', self.enum.PENDING_PRODUCT_STATUS)
g.filters['status_code'].default_active = True
g.filters['status_code'].default_verb = 'not_equal'
g.filters['status_code'].default_value = six.text_type(self.enum.PENDING_PRODUCT_STATUS_RESOLVED)
g.filters['status_code'].default_value = str(self.enum.PENDING_PRODUCT_STATUS_RESOLVED)
g.set_sort_defaults('created', 'desc')
@ -2317,9 +2288,9 @@ class PendingProductView(MasterView):
if self.request.POST.get('brand_uuid'):
brand = self.Session.query(model.Brand).get(self.request.POST['brand_uuid'])
if brand:
brand_display = six.text_type(brand)
brand_display = str(brand)
elif self.editing:
brand_display = six.text_type(pending.brand or '')
brand_display = str(pending.brand or '')
brands_url = self.request.route_url('brands.autocomplete')
f.set_widget('brand_uuid', forms.widgets.JQueryAutocompleteWidget(
field_display=brand_display, service_url=brands_url))
@ -2344,7 +2315,7 @@ class PendingProductView(MasterView):
if self.request.POST.get('vendor_uuid'):
vendor = self.Session.query(model.Vendor).get(self.request.POST['vendor_uuid'])
if vendor:
vendor_display = six.text_type(vendor)
vendor_display = str(vendor)
f.set_widget('vendor_uuid', forms.widgets.JQueryAutocompleteWidget(
field_display=vendor_display,
service_url=self.request.route_url('vendors.autocomplete')))

View file

@ -2,7 +2,7 @@
################################################################################
#
# Rattail -- Retail Software Framework
# Copyright © 2010-2022 Lance Edgar
# Copyright © 2010-2023 Lance Edgar
#
# This file is part of Rattail.
#
@ -24,8 +24,6 @@
Project views
"""
from __future__ import unicode_literals, absolute_import
import os
import zipfile
# from collections import OrderedDict
@ -160,7 +158,6 @@ class GenerateProjectView(View):
return RattailProjectHandler(self.rattail_config)
def __call__(self):
use_buefy = self.get_use_buefy()
# choices = OrderedDict([
# ('has_db', {'prompt': "Does project need its own Rattail DB?",
@ -183,8 +180,7 @@ class GenerateProjectView(View):
schema = GenerateTailboneIntegrationProject
else:
schema = GenerateProject
form = forms.Form(schema=schema(), request=self.request,
use_buefy=use_buefy)
form = forms.Form(schema=schema(), request=self.request)
if form.validate(newstyle=True):
zipped = self.generate_project(project_type, form)
return self.file_response(zipped)
@ -195,7 +191,6 @@ class GenerateProjectView(View):
'index_title': "Generate Project",
'handler': self.handler,
# 'choices': choices,
'use_buefy': use_buefy,
}
def generate_project(self, project_type, form):

View file

@ -2,7 +2,7 @@
################################################################################
#
# Rattail -- Retail Software Framework
# Copyright © 2010-2022 Lance Edgar
# Copyright © 2010-2023 Lance Edgar
#
# This file is part of Rattail.
#
@ -24,10 +24,6 @@
Base class for purchasing batch views
"""
from __future__ import unicode_literals, absolute_import
import six
from rattail.db import model, api
import colander
@ -230,7 +226,6 @@ class PurchasingBatchView(BatchMasterView):
batch = f.model_instance
app = self.get_rattail_app()
today = app.localtime().date()
use_buefy = self.get_use_buefy()
# mode
f.set_enum('mode', self.enum.PURCHASE_BATCH_MODE)
@ -278,7 +273,7 @@ class PurchasingBatchView(BatchMasterView):
if self.request.POST.get('vendor_uuid'):
vendor = self.Session.query(model.Vendor).get(self.request.POST['vendor_uuid'])
if vendor:
vendor_display = six.text_type(vendor)
vendor_display = str(vendor)
vendors_url = self.request.route_url('vendors.autocomplete')
f.set_widget('vendor_uuid', forms.widgets.JQueryAutocompleteWidget(
field_display=vendor_display, service_url=vendors_url))
@ -311,14 +306,14 @@ class PurchasingBatchView(BatchMasterView):
if self.request.POST.get('buyer_uuid'):
buyer = self.Session.query(model.Employee).get(self.request.POST['buyer_uuid'])
if buyer:
buyer_display = six.text_type(buyer)
buyer_display = str(buyer)
elif self.creating:
buyer = self.request.user.employee
if buyer:
buyer_display = six.text_type(buyer)
buyer_display = str(buyer)
f.set_default('buyer_uuid', buyer.uuid)
elif self.editing:
buyer_display = six.text_type(batch.buyer or '')
buyer_display = str(batch.buyer or '')
buyers_url = self.request.route_url('employees.autocomplete')
f.set_widget('buyer_uuid', forms.widgets.JQueryAutocompleteWidget(
field_display=buyer_display, service_url=buyers_url))
@ -346,11 +341,7 @@ class PurchasingBatchView(BatchMasterView):
if len(parsers) == 1:
f.set_default('invoice_parser_key', parsers[0].key)
if use_buefy:
f.set_widget('invoice_parser_key', dfwidget.SelectWidget(values=parser_values))
else:
parser_values.insert(0, ('', "(please choose)"))
f.set_widget('invoice_parser_key', forms.widgets.JQuerySelectWidget(values=parser_values))
f.set_widget('invoice_parser_key', dfwidget.SelectWidget(values=parser_values))
else:
f.remove_field('invoice_parser_key')
@ -422,7 +413,7 @@ class PurchasingBatchView(BatchMasterView):
purchase = batch.purchase
if not purchase:
return ""
text = six.text_type(purchase)
text = str(purchase)
url = self.request.route_url('purchases.view', uuid=purchase.uuid)
return tags.link_to(text, url)
@ -435,7 +426,7 @@ class PurchasingBatchView(BatchMasterView):
def render_vendor_contact(self, batch, field):
if batch.vendor.contact:
return six.text_type(batch.vendor.contact)
return str(batch.vendor.contact)
def render_vendor_phone(self, batch, field):
return self.get_vendor_phone_number(batch)
@ -455,7 +446,7 @@ class PurchasingBatchView(BatchMasterView):
employee = batch.buyer
if not employee:
return ""
text = six.text_type(employee)
text = str(employee)
if self.request.has_perm('employees.view'):
url = self.request.route_url('employees.view', uuid=employee.uuid)
return tags.link_to(text, url)
@ -484,7 +475,7 @@ class PurchasingBatchView(BatchMasterView):
def get_buyer_values(self):
buyers = self.get_buyers()
return [(b.uuid, six.text_type(b))
return [(b.uuid, str(b))
for b in buyers]
def get_department_options(self):
@ -802,13 +793,12 @@ class PurchasingBatchView(BatchMasterView):
return app.render_cases_units(cases, units)
def make_row_credits_grid(self, row):
use_buefy = self.get_use_buefy()
route_prefix = self.get_route_prefix()
factory = self.get_grid_factory()
g = factory(
key='{}.row_credits'.format(route_prefix),
data=[] if use_buefy else row.credits,
data=[],
columns=[
'credit_type',
'shorted',
@ -837,17 +827,9 @@ class PurchasingBatchView(BatchMasterView):
return g
def render_row_credits(self, row, field):
use_buefy = self.get_use_buefy()
if not use_buefy and not row.credits:
return
g = self.make_row_credits_grid(row)
if use_buefy:
return HTML.literal(
g.render_buefy_table_element(data_prop='rowData.credits'))
else:
return HTML.literal(g.render_grid())
return HTML.literal(
g.render_buefy_table_element(data_prop='rowData.credits'))
# def item_lookup(self, value, field=None):
# """

View file

@ -2,7 +2,7 @@
################################################################################
#
# Rattail -- Retail Software Framework
# Copyright © 2010-2022 Lance Edgar
# Copyright © 2010-2023 Lance Edgar
#
# This file is part of Rattail.
#
@ -24,10 +24,6 @@
Views for 'costing' (purchasing) batches
"""
from __future__ import unicode_literals, absolute_import
import six
import colander
from deform import widget as dfwidget
@ -188,14 +184,12 @@ class CostingBatchView(PurchasingBatchView):
# okay, at this point we need the user to select a vendor and workflow
self.creating = True
use_buefy = self.get_use_buefy()
model = self.model
context = {}
# form to accept user choice of vendor/workflow
schema = NewCostingBatch().bind(valid_workflows=valid_workflows)
form = forms.Form(schema=schema, request=self.request,
use_buefy=use_buefy)
form = forms.Form(schema=schema, request=self.request)
if len(valid_workflows) == 1:
form.set_default('workflow', valid_workflows[0])
@ -208,17 +202,14 @@ class CostingBatchView(PurchasingBatchView):
.order_by(model.Vendor.id)
vendor_values = [(vendor.uuid, "({}) {}".format(vendor.id, vendor.name))
for vendor in vendors]
if use_buefy:
form.set_widget('vendor', dfwidget.SelectWidget(values=vendor_values))
else:
form.set_widget('vendor', forms.widgets.JQuerySelectWidget(values=vendor_values))
form.set_widget('vendor', dfwidget.SelectWidget(values=vendor_values))
else:
vendor_display = ""
if self.request.method == 'POST':
if self.request.POST.get('vendor'):
vendor = self.Session.query(model.Vendor).get(self.request.POST['vendor'])
if vendor:
vendor_display = six.text_type(vendor)
vendor_display = str(vendor)
vendors_url = self.request.route_url('vendors.autocomplete')
form.set_widget('vendor', forms.widgets.JQueryAutocompleteWidget(
field_display=vendor_display, service_url=vendors_url))
@ -226,12 +217,8 @@ class CostingBatchView(PurchasingBatchView):
# configure workflow field
values = [(workflow['workflow_key'], workflow['display'])
for workflow in workflows]
if use_buefy:
form.set_widget('workflow',
dfwidget.SelectWidget(values=values))
else:
form.set_widget('workflow',
forms.widgets.JQuerySelectWidget(values=values))
form.set_widget('workflow',
dfwidget.SelectWidget(values=values))
form.submit_label = "Continue"
form.cancel_url = self.get_index_url()
@ -254,7 +241,6 @@ class CostingBatchView(PurchasingBatchView):
def configure_form(self, f):
super(CostingBatchView, self).configure_form(f)
route_prefix = self.get_route_prefix()
use_buefy = self.get_use_buefy()
model = self.model
workflow = self.request.matchdict.get('workflow_key')
@ -306,15 +292,14 @@ class CostingBatchView(PurchasingBatchView):
# purchase
if (self.creating and workflow == 'invoice_with_po'
and self.purchase_order_fieldname == 'purchase'):
if use_buefy:
f.replace('purchase', 'purchase_uuid')
purchases = self.handler.get_eligible_purchases(
vendor, self.enum.PURCHASE_BATCH_MODE_COSTING)
values = [(p.uuid, self.handler.render_eligible_purchase(p))
for p in purchases]
f.set_widget('purchase_uuid', dfwidget.SelectWidget(values=values))
f.set_label('purchase_uuid', "Purchase Order")
f.set_required('purchase_uuid')
f.replace('purchase', 'purchase_uuid')
purchases = self.handler.get_eligible_purchases(
vendor, self.enum.PURCHASE_BATCH_MODE_COSTING)
values = [(p.uuid, self.handler.render_eligible_purchase(p))
for p in purchases]
f.set_widget('purchase_uuid', dfwidget.SelectWidget(values=values))
f.set_label('purchase_uuid', "Purchase Order")
f.set_required('purchase_uuid')
def render_costing_workflow(self, batch, field):
key = self.request.matchdict['workflow_key']

View file

@ -2,7 +2,7 @@
################################################################################
#
# Rattail -- Retail Software Framework
# Copyright © 2010-2022 Lance Edgar
# Copyright © 2010-2023 Lance Edgar
#
# This file is part of Rattail.
#
@ -24,12 +24,9 @@
Views for 'ordering' (purchasing) batches
"""
from __future__ import unicode_literals, absolute_import
import os
import json
import six
import openpyxl
from sqlalchemy import orm
@ -313,9 +310,7 @@ class OrderingBatchView(PurchasingBatchView):
if not order_date:
order_date = localtime(self.rattail_config).date()
buefy_data = None
if self.get_use_buefy():
buefy_data = self.get_worksheet_buefy_data(departments)
buefy_data = self.get_worksheet_buefy_data(departments)
return self.render_to_response('worksheet', {
'batch': batch,
@ -334,8 +329,8 @@ class OrderingBatchView(PurchasingBatchView):
def get_worksheet_buefy_data(self, departments):
data = {}
for department in six.itervalues(departments):
for subdepartment in six.itervalues(department._order_subdepartments):
for department in departments.values():
for subdepartment in department._order_subdepartments.values():
for i, cost in enumerate(subdepartment._order_costs, 1):
cases = int(cost._batchrow.cases_ordered or 0) if cost._batchrow else None
units = int(cost._batchrow.units_ordered or 0) if cost._batchrow else None
@ -433,7 +428,7 @@ class OrderingBatchView(PurchasingBatchView):
self.handler.update_row_quantity(row, cases_ordered=cases_ordered,
units_ordered=units_ordered)
except Exception as error:
return {'error': six.text_type(error)}
return {'error': str(error)}
else: # empty order quantities
@ -469,7 +464,7 @@ class OrderingBatchView(PurchasingBatchView):
worksheet.append([])
worksheet.append(['vendor_code', 'upc', 'brand_name', 'description', 'cases_ordered', 'units_ordered'])
for row in batch.active_rows():
worksheet.append([row.vendor_code, six.text_type(row.upc), row.brand_name,
worksheet.append([row.vendor_code, str(row.upc), row.brand_name,
'{} {}'.format(row.description, row.size),
row.cases_ordered, row.units_ordered])

View file

@ -24,14 +24,11 @@
Views for 'receiving' (purchasing) batches
"""
from __future__ import unicode_literals, absolute_import
import os
import re
import decimal
import logging
import six
import humanize
import sqlalchemy as sa
@ -302,13 +299,11 @@ class ReceivingBatchView(PurchasingBatchView):
# okay, at this point we need the user to select a vendor and workflow
self.creating = True
use_buefy = self.get_use_buefy()
context = {}
# form to accept user choice of vendor/workflow
schema = NewReceivingBatch().bind(valid_workflows=valid_workflows)
form = forms.Form(schema=schema, request=self.request,
use_buefy=use_buefy)
form = forms.Form(schema=schema, request=self.request)
# configure vendor field
app = self.get_rattail_app()
@ -325,10 +320,7 @@ class ReceivingBatchView(PurchasingBatchView):
vendors = sorted(vendors.values(), key=lambda v: v.name)
vendor_values = [(vendor.uuid, vendor_handler.render_vendor(vendor))
for vendor in vendors]
if use_buefy:
form.set_widget('vendor', dfwidget.SelectWidget(values=vendor_values))
else:
form.set_widget('vendor', forms.widgets.JQuerySelectWidget(values=vendor_values))
form.set_widget('vendor', dfwidget.SelectWidget(values=vendor_values))
else:
# user may choose *any* available vendor
use_dropdown = vendor_handler.choice_uses_dropdown()
@ -338,10 +330,7 @@ class ReceivingBatchView(PurchasingBatchView):
.all()
vendor_values = [(vendor.uuid, "({}) {}".format(vendor.id, vendor.name))
for vendor in vendors]
if use_buefy:
form.set_widget('vendor', dfwidget.SelectWidget(values=vendor_values))
else:
form.set_widget('vendor', forms.widgets.JQuerySelectWidget(values=vendor_values))
form.set_widget('vendor', dfwidget.SelectWidget(values=vendor_values))
if len(vendors) == 1:
form.set_default('vendor', vendors[0].uuid)
else:
@ -350,7 +339,7 @@ class ReceivingBatchView(PurchasingBatchView):
if self.request.POST.get('vendor'):
vendor = self.Session.query(model.Vendor).get(self.request.POST['vendor'])
if vendor:
vendor_display = six.text_type(vendor)
vendor_display = str(vendor)
vendors_url = self.request.route_url('vendors.autocomplete')
form.set_widget('vendor', forms.widgets.JQueryAutocompleteWidget(
field_display=vendor_display, service_url=vendors_url))
@ -359,12 +348,8 @@ class ReceivingBatchView(PurchasingBatchView):
# configure workflow field
values = [(workflow['workflow_key'], workflow['display'])
for workflow in workflows]
if use_buefy:
form.set_widget('workflow',
dfwidget.SelectWidget(values=values))
else:
form.set_widget('workflow',
forms.widgets.JQuerySelectWidget(values=values))
form.set_widget('workflow',
dfwidget.SelectWidget(values=values))
if len(workflows) == 1:
form.set_default('workflow', workflows[0]['workflow_key'])
@ -427,7 +412,6 @@ class ReceivingBatchView(PurchasingBatchView):
allow_truck_dump = self.batch_handler.allow_truck_dump_receiving()
workflow = self.request.matchdict.get('workflow_key')
route_prefix = self.get_route_prefix()
use_buefy = self.get_use_buefy()
# tweak some things if we are in "step 2" of creating new batch
if self.creating and workflow:
@ -437,7 +421,7 @@ class ReceivingBatchView(PurchasingBatchView):
self.request.matchdict['vendor_uuid'])
assert vendor
f.set_readonly('vendor_uuid')
f.set_default('vendor_uuid', six.text_type(vendor))
f.set_default('vendor_uuid', str(vendor))
# cancel should take us back to choosing a workflow
f.cancel_url = self.request.route_url('{}.create'.format(route_prefix))
@ -532,15 +516,14 @@ class ReceivingBatchView(PurchasingBatchView):
# purchase
if (self.creating and workflow in ('from_po', 'from_po_with_invoice')
and self.purchase_order_fieldname == 'purchase'):
if use_buefy:
f.replace('purchase', 'purchase_uuid')
purchases = self.batch_handler.get_eligible_purchases(
vendor, self.enum.PURCHASE_BATCH_MODE_RECEIVING)
values = [(p.uuid, self.batch_handler.render_eligible_purchase(p))
for p in purchases]
f.set_widget('purchase_uuid', dfwidget.SelectWidget(values=values))
f.set_label('purchase_uuid', "Purchase Order")
f.set_required('purchase_uuid')
f.replace('purchase', 'purchase_uuid')
purchases = self.batch_handler.get_eligible_purchases(
vendor, self.enum.PURCHASE_BATCH_MODE_RECEIVING)
values = [(p.uuid, self.batch_handler.render_eligible_purchase(p))
for p in purchases]
f.set_widget('purchase_uuid', dfwidget.SelectWidget(values=values))
f.set_label('purchase_uuid', "Purchase Order")
f.set_required('purchase_uuid')
elif self.creating or not batch.purchase:
f.remove_field('purchase')
@ -774,26 +757,18 @@ class ReceivingBatchView(PurchasingBatchView):
def template_kwargs_view(self, **kwargs):
kwargs = super(ReceivingBatchView, self).template_kwargs_view(**kwargs)
batch = kwargs['instance']
use_buefy = self.get_use_buefy()
if self.handler.has_purchase_order(batch) and self.handler.has_invoice_file(batch):
breakdown = self.make_po_vs_invoice_breakdown(batch)
factory = self.get_grid_factory()
if use_buefy:
g = factory('batch_po_vs_invoice_breakdown', [],
columns=['title', 'count'])
g.set_click_handler('title', "autoFilterPoVsInvoice(props.row)")
kwargs['po_vs_invoice_breakdown_data'] = breakdown
kwargs['po_vs_invoice_breakdown_grid'] = HTML.literal(
g.render_buefy_table_element(data_prop='poVsInvoiceBreakdownData',
empty_labels=True))
else:
kwargs['po_vs_invoice_breakdown_grid'] = factory(
'batch_po_vs_invoice_breakdown',
data=breakdown,
columns=['title', 'count'])
g = factory('batch_po_vs_invoice_breakdown', [],
columns=['title', 'count'])
g.set_click_handler('title', "autoFilterPoVsInvoice(props.row)")
kwargs['po_vs_invoice_breakdown_data'] = breakdown
kwargs['po_vs_invoice_breakdown_grid'] = HTML.literal(
g.render_buefy_table_element(data_prop='poVsInvoiceBreakdownData',
empty_labels=True))
kwargs['allow_edit_catalog_unit_cost'] = self.allow_edit_catalog_unit_cost(batch)
kwargs['allow_edit_invoice_unit_cost'] = self.allow_edit_invoice_unit_cost(batch)
@ -807,7 +782,7 @@ class ReceivingBatchView(PurchasingBatchView):
credits_data.append({
'uuid': credit.uuid,
'credit_type': credit.credit_type,
'expiration_date': six.text_type(credit.expiration_date) if credit.expiration_date else None,
'expiration_date': str(credit.expiration_date) if credit.expiration_date else None,
'cases_shorted': app.render_quantity(credit.cases_shorted),
'units_shorted': app.render_quantity(credit.units_shorted),
'shorted': app.render_cases_units(credit.cases_shorted,
@ -822,7 +797,6 @@ class ReceivingBatchView(PurchasingBatchView):
def template_kwargs_view_row(self, **kwargs):
kwargs = super(ReceivingBatchView, self).template_kwargs_view_row(**kwargs)
use_buefy = self.get_use_buefy()
app = self.get_rattail_app()
products_handler = app.get_products_handler()
row = kwargs['instance']
@ -834,18 +808,17 @@ class ReceivingBatchView(PurchasingBatchView):
elif row.upc:
kwargs['image_url'] = products_handler.get_image_url(upc=row.upc)
if use_buefy:
kwargs['row_context'] = self.get_context_row(row)
kwargs['row_context'] = self.get_context_row(row)
modes = list(POSSIBLE_RECEIVING_MODES)
types = list(POSSIBLE_CREDIT_TYPES)
if not self.batch_handler.allow_expired_credits():
if 'expired' in modes:
modes.remove('expired')
if 'expired' in types:
types.remove('expired')
kwargs['possible_receiving_modes'] = modes
kwargs['possible_credit_types'] = types
modes = list(POSSIBLE_RECEIVING_MODES)
types = list(POSSIBLE_CREDIT_TYPES)
if not self.batch_handler.allow_expired_credits():
if 'expired' in modes:
modes.remove('expired')
if 'expired' in types:
types.remove('expired')
kwargs['possible_receiving_modes'] = modes
kwargs['possible_credit_types'] = types
return kwargs
@ -962,7 +935,7 @@ class ReceivingBatchView(PurchasingBatchView):
def render_truck_dump_parent(self, batch, field):
truck_dump = self.get_instance()
text = six.text_type(truck_dump)
text = str(truck_dump)
url = self.request.route_url('receiving.view', uuid=truck_dump.uuid)
return tags.link_to(text, url)
@ -992,7 +965,6 @@ class ReceivingBatchView(PurchasingBatchView):
def configure_row_grid(self, g):
super(ReceivingBatchView, self).configure_row_grid(g)
use_buefy = self.get_use_buefy()
batch = self.get_instance()
# vendor_code
@ -1003,13 +975,13 @@ class ReceivingBatchView(PurchasingBatchView):
if (self.handler.has_purchase_order(batch)
or self.handler.has_invoice_file(batch)):
g.remove('catalog_unit_cost')
elif use_buefy and self.allow_edit_catalog_unit_cost(batch):
elif self.allow_edit_catalog_unit_cost(batch):
g.set_raw_renderer('catalog_unit_cost', self.render_catalog_unit_cost)
g.set_click_handler('catalog_unit_cost',
'catalogUnitCostClicked(props.row)')
# invoice_unit_cost
if use_buefy and self.allow_edit_invoice_unit_cost(batch):
if self.allow_edit_invoice_unit_cost(batch):
g.set_raw_renderer('invoice_unit_cost', self.render_invoice_unit_cost)
g.set_click_handler('invoice_unit_cost',
'invoiceUnitCostClicked(props.row)')
@ -1102,7 +1074,7 @@ class ReceivingBatchView(PurchasingBatchView):
def get_row_instance_title(self, row):
if row.product:
return six.text_type(row.product)
return str(row.product)
if row.upc:
return row.upc.pretty()
return super(ReceivingBatchView, self).get_row_instance_title(row)
@ -1119,8 +1091,7 @@ class ReceivingBatchView(PurchasingBatchView):
# first make grid like normal
g = super(ReceivingBatchView, self).make_row_credits_grid(row)
if (self.get_use_buefy()
and self.has_perm('edit_row')
if (self.has_perm('edit_row')
and self.row_editable(row)):
# add the Un-Declare action
@ -1153,56 +1124,52 @@ class ReceivingBatchView(PurchasingBatchView):
# simply invoke this method and return the result. however we're not
# there yet...for now it's only tested for desktop
self.viewing = True
use_buefy = self.get_use_buefy()
row = self.get_row_instance()
# things are a bit different now w/ buefy support..
if use_buefy:
# don't even bother showing this page if that's all the
# request was about
if self.request.method == 'GET':
return self.redirect(self.get_row_action_url('view', row))
# don't even bother showing this page if that's all the
# request was about
if self.request.method == 'GET':
return self.redirect(self.get_row_action_url('view', row))
# make sure edit is allowed
if not (self.has_perm('edit_row') and self.row_editable(row)):
raise self.forbidden()
# make sure edit is allowed
if not (self.has_perm('edit_row') and self.row_editable(row)):
raise self.forbidden()
# check for JSON POST, which is submitted via AJAX from
# the "view row" page
if self.request.method == 'POST' and not self.request.POST:
data = self.request.json_body
kwargs = dict(data)
# check for JSON POST, which is submitted via AJAX from
# the "view row" page
if self.request.method == 'POST' and not self.request.POST:
data = self.request.json_body
kwargs = dict(data)
# TODO: for some reason quantities can come through as strings?
cases = kwargs['quantity']['cases']
if cases is not None:
if cases == '':
cases = None
else:
cases = decimal.Decimal(cases)
kwargs['cases'] = cases
units = kwargs['quantity']['units']
if units is not None:
if units == '':
units = None
else:
units = decimal.Decimal(units)
kwargs['units'] = units
del kwargs['quantity']
# TODO: for some reason quantities can come through as strings?
cases = kwargs['quantity']['cases']
if cases is not None:
if cases == '':
cases = None
else:
cases = decimal.Decimal(cases)
kwargs['cases'] = cases
units = kwargs['quantity']['units']
if units is not None:
if units == '':
units = None
else:
units = decimal.Decimal(units)
kwargs['units'] = units
del kwargs['quantity']
# handler takes care of the receiving logic for us
try:
self.batch_handler.receive_row(row, **kwargs)
# handler takes care of the receiving logic for us
try:
self.batch_handler.receive_row(row, **kwargs)
except Exception as error:
return self.json_response({'error': str(error)})
except Exception as error:
return self.json_response({'error': six.text_type(error)})
self.Session.flush()
self.Session.refresh(row)
return self.json_response({
'ok': True,
'row': self.get_context_row(row)})
self.Session.flush()
self.Session.refresh(row)
return self.json_response({
'ok': True,
'row': self.get_context_row(row)})
batch = row.batch
permission_prefix = self.get_permission_prefix()
@ -1226,15 +1193,12 @@ class ReceivingBatchView(PurchasingBatchView):
}
schema = ReceiveRowForm().bind(session=self.Session())
form = forms.Form(schema=schema, request=self.request, use_buefy=use_buefy)
form = forms.Form(schema=schema, request=self.request)
form.cancel_url = self.get_row_action_url('view', row)
# mode
mode_values = [(mode, mode) for mode in possible_modes]
if use_buefy:
mode_widget = dfwidget.SelectWidget(values=mode_values)
else:
mode_widget = forms.widgets.JQuerySelectWidget(values=mode_values)
mode_widget = dfwidget.SelectWidget(values=mode_values)
form.set_widget('mode', mode_widget)
# quantity
@ -1354,59 +1318,55 @@ class ReceivingBatchView(PurchasingBatchView):
View for declaring a credit, i.e. converting some "received" or similar
quantity, to a credit of some sort.
"""
use_buefy = self.get_use_buefy()
row = self.get_row_instance()
# things are a bit different now w/ buefy support..
if use_buefy:
# don't even bother showing this page if that's all the
# request was about
if self.request.method == 'GET':
return self.redirect(self.get_row_action_url('view', row))
# don't even bother showing this page if that's all the
# request was about
if self.request.method == 'GET':
return self.redirect(self.get_row_action_url('view', row))
# make sure edit is allowed
if not (self.has_perm('edit_row') and self.row_editable(row)):
raise self.forbidden()
# make sure edit is allowed
if not (self.has_perm('edit_row') and self.row_editable(row)):
raise self.forbidden()
# check for JSON POST, which is submitted via AJAX from
# the "view row" page
if self.request.method == 'POST' and not self.request.POST:
data = self.request.json_body
kwargs = dict(data)
# check for JSON POST, which is submitted via AJAX from
# the "view row" page
if self.request.method == 'POST' and not self.request.POST:
data = self.request.json_body
kwargs = dict(data)
# TODO: for some reason quantities can come through as strings?
if kwargs['cases'] is not None:
if kwargs['cases'] == '':
kwargs['cases'] = None
else:
kwargs['cases'] = decimal.Decimal(kwargs['cases'])
if kwargs['units'] is not None:
if kwargs['units'] == '':
kwargs['units'] = None
else:
kwargs['units'] = decimal.Decimal(kwargs['units'])
# TODO: for some reason quantities can come through as strings?
if kwargs['cases'] is not None:
if kwargs['cases'] == '':
kwargs['cases'] = None
else:
kwargs['cases'] = decimal.Decimal(kwargs['cases'])
if kwargs['units'] is not None:
if kwargs['units'] == '':
kwargs['units'] = None
else:
kwargs['units'] = decimal.Decimal(kwargs['units'])
try:
result = self.handler.can_declare_credit(row, **kwargs)
try:
result = self.handler.can_declare_credit(row, **kwargs)
except Exception as error:
return self.json_response({'error': str(error)})
except Exception as error:
return self.json_response({'error': six.text_type(error)})
else:
if result:
self.handler.declare_credit(row, **kwargs)
else:
if result:
self.handler.declare_credit(row, **kwargs)
return self.json_response({
'error': "Handler says you can't declare that credit; "
"not sure why"})
else:
return self.json_response({
'error': "Handler says you can't declare that credit; "
"not sure why"})
self.Session.flush()
self.Session.refresh(row)
return self.json_response({
'ok': True,
'row': self.get_context_row(row)})
self.Session.flush()
self.Session.refresh(row)
return self.json_response({
'ok': True,
'row': self.get_context_row(row)})
batch = row.batch
context = {
@ -1422,16 +1382,12 @@ class ReceivingBatchView(PurchasingBatchView):
}
schema = DeclareCreditForm()
form = forms.Form(schema=schema, request=self.request,
use_buefy=use_buefy)
form = forms.Form(schema=schema, request=self.request)
form.cancel_url = self.get_row_action_url('view', row)
# credit_type
values = [(m, m) for m in POSSIBLE_CREDIT_TYPES]
if use_buefy:
widget = dfwidget.SelectWidget(values=values)
else:
widget = forms.widgets.JQuerySelectWidget(values=values)
widget = dfwidget.SelectWidget(values=values)
form.set_widget('credit_type', widget)
# quantity
@ -1896,7 +1852,7 @@ class ReceivingBatchView(PurchasingBatchView):
if cost == '':
return {'error': "You must specify a cost"}
try:
cost = decimal.Decimal(six.text_type(cost))
cost = decimal.Decimal(str(cost))
except decimal.InvalidOperation:
return {'error': "Cost is not valid!"}
else:

View file

@ -24,16 +24,12 @@
Reporting views
"""
from __future__ import unicode_literals, absolute_import
import calendar
import json
import re
import datetime
import logging
import six
import rattail
from rattail.db import model, Session as RattailSession
from rattail.files import resource_path
@ -64,13 +60,13 @@ def get_upc(product):
UPC formatter. Strips PLUs to bare number, and adds "minus check digit"
for non-PLU UPCs.
"""
upc = six.text_type(product.upc)
upc = str(product.upc)
m = plu_upc_pattern.match(upc)
if m:
return six.text_type(int(m.group(1)))
return str(int(m.group(1)))
m = weighted_upc_pattern.match(upc)
if m:
return six.text_type(int(m.group(1)))
return str(int(m.group(1)))
return '{0}-{1}'.format(upc[:-1], upc[-1])
@ -101,7 +97,7 @@ class OrderingWorksheet(View):
response.headers['Content-Disposition'] = 'attachment; filename=ordering.html'
response.text = body
return response
return {'use_buefy': self.get_use_buefy()}
return {}
def write_report(self, vendor, departments, preferred_only):
"""
@ -174,8 +170,7 @@ class InventoryWorksheet(View):
departments = departments.order_by(model.Department.name)
departments = departments.all()
return{'departments': departments,
'use_buefy': self.get_use_buefy()}
return{'departments': departments}
def write_report(self, department):
"""
@ -313,11 +308,8 @@ class ReportOutputView(ExportMasterView):
columns=['key', 'value'],
labels={'key': "Name"},
)
if self.get_use_buefy():
return HTML.literal(
g.render_buefy_table_element(data_prop='paramsData'))
else:
return HTML.literal(g.render_grid())
return HTML.literal(
g.render_buefy_table_element(data_prop='paramsData'))
def get_params_context(self, report):
params_data = []
@ -332,8 +324,7 @@ class ReportOutputView(ExportMasterView):
kwargs = super(ReportOutputView, self).template_kwargs_view(**kwargs)
output = kwargs['instance']
if self.get_use_buefy():
kwargs['params_data'] = self.get_params_context(output)
kwargs['params_data'] = self.get_params_context(output)
# build custom URL to re-build this report
url = None
@ -348,9 +339,8 @@ class ReportOutputView(ExportMasterView):
def template_kwargs_delete(self, **kwargs):
kwargs = super(ReportOutputView, self).template_kwargs_delete(**kwargs)
if self.get_use_buefy():
report = kwargs['instance']
kwargs['params_data'] = self.get_params_context(report)
report = kwargs['instance']
kwargs['params_data'] = self.get_params_context(report)
return kwargs
@ -359,8 +349,6 @@ class ReportOutputView(ExportMasterView):
View which allows user to choose which type of report they wish to
generate.
"""
use_buefy = self.get_use_buefy()
# handler is responsible for determining which report types are valid
reports = self.report_handler.get_reports()
if isinstance(reports, OrderedDict):
@ -370,7 +358,7 @@ class ReportOutputView(ExportMasterView):
# make form to accept user choice of report type
schema = NewReport().bind(valid_report_types=sorted_reports)
form = forms.Form(schema=schema, request=self.request, use_buefy=use_buefy)
form = forms.Form(schema=schema, request=self.request)
form.submit_label = "Continue"
form.cancel_url = self.request.route_url('report_output')
@ -378,11 +366,8 @@ class ReportOutputView(ExportMasterView):
# e.g. some for customers/membership, others for product movement etc.
values = [(r.type_key, r.name) for r in reports.values()]
values.sort(key=lambda r: r[1])
if use_buefy:
form.set_widget('report_type', forms.widgets.CustomSelectWidget(values=values))
form.widgets['report_type'].set_template_values(input_handler='reportTypeChanged')
else:
form.set_widget('report_type', forms.widgets.PlainSelectWidget(values=values, size=10))
form.set_widget('report_type', forms.widgets.CustomSelectWidget(values=values))
form.widgets['report_type'].set_template_values(input_handler='reportTypeChanged')
# if form validates, that means user has chosen a report type, so we
# just redirect to the appropriate "new report" page
@ -409,7 +394,6 @@ class ReportOutputView(ExportMasterView):
and redirects user to view the output.
"""
app = self.get_rattail_app()
use_buefy = self.get_use_buefy()
type_key = self.request.matchdict['type_key']
report = self.report_handler.get_report(type_key)
if not report:
@ -449,8 +433,7 @@ class ReportOutputView(ExportMasterView):
schema.add(node)
form = forms.Form(schema=schema, request=self.request,
use_buefy=use_buefy, helptext=helptext)
form = forms.Form(schema=schema, request=self.request, helptext=helptext)
form.submit_label = "Generate this Report"
form.cancel_url = self.request.get_referrer(
default=self.request.route_url('{}.create'.format(route_prefix)))
@ -637,8 +620,8 @@ class ProblemReportView(MasterView):
reports = self.handler.get_all_problem_reports()
organized = self.handler.organize_problem_reports(reports)
for system_key, reports in six.iteritems(organized):
for report in six.itervalues(reports):
for system_key, reports in organized.items():
for report in reports.values():
data.append(self.normalize(report))
return data
@ -741,12 +724,12 @@ class ProblemReportView(MasterView):
report['problem_key'])
app.save_setting(session, 'rattail.problems.{}.enabled'.format(key),
six.text_type(data['enabled']).lower())
str(data['enabled']).lower())
for i in range(7):
daykey = 'day{}'.format(i)
app.save_setting(session, 'rattail.problems.{}.{}'.format(key, daykey),
six.text_type(data['days'][daykey]).lower())
str(data['days'][daykey]).lower())
def execute_instance(self, report_info, user, progress=None, **kwargs):
report = report_info['_report']

View file

@ -2,7 +2,7 @@
################################################################################
#
# Rattail -- Retail Software Framework
# Copyright © 2010-2022 Lance Edgar
# Copyright © 2010-2023 Lance Edgar
#
# This file is part of Rattail.
#
@ -24,11 +24,8 @@
Role Views
"""
from __future__ import unicode_literals, absolute_import
import os
import six
from sqlalchemy import orm
from openpyxl.styles import Font, PatternFill
@ -172,7 +169,6 @@ class RoleView(PrincipalMasterView):
def configure_form(self, f):
super(RoleView, self).configure_form(f)
role = f.model_instance
use_buefy = self.get_use_buefy()
app = self.get_rattail_app()
auth = app.get_auth_handler()
@ -213,7 +209,7 @@ class RoleView(PrincipalMasterView):
f.set_type('notes', 'text_wrapped')
# users
if use_buefy and self.viewing:
if self.viewing:
f.set_renderer('users', self.render_users)
else:
f.remove('users')
@ -224,8 +220,7 @@ class RoleView(PrincipalMasterView):
permissions=self.tailbone_permissions))
f.set_node('permissions', colander.Set())
f.set_widget('permissions', PermissionsWidget(
permissions=self.tailbone_permissions,
use_buefy=use_buefy))
permissions=self.tailbone_permissions))
if self.editing:
granted = []
for groupkey in self.tailbone_permissions:
@ -298,8 +293,8 @@ class RoleView(PrincipalMasterView):
# TODO: it seems a bit ugly, to "rebuild" permission groups like this,
# but not sure if there's a better way?
available = {}
for gkey, group in six.iteritems(permissions):
for pkey, perm in six.iteritems(group['perms']):
for gkey, group in permissions.items():
for pkey, perm in group['perms'].items():
if self.request.has_perm(pkey):
if gkey not in available:
available[gkey] = {
@ -315,7 +310,7 @@ class RoleView(PrincipalMasterView):
return "(not applicable)"
if role.session_timeout is None:
return ""
return six.text_type(role.session_timeout)
return str(role.session_timeout)
def objectify(self, form, data=None):
"""
@ -342,8 +337,8 @@ class RoleView(PrincipalMasterView):
auth = app.get_auth_handler()
available = self.tailbone_permissions
for gkey, group in six.iteritems(available):
for pkey, perm in six.iteritems(group['perms']):
for gkey, group in available.items():
for pkey, perm in group['perms'].items():
if pkey in permissions:
auth.grant_permission(role, pkey)
else:
@ -367,23 +362,21 @@ class RoleView(PrincipalMasterView):
kwargs['guest_role'] = guest_role(self.Session())
kwargs['authenticated_role'] = authenticated_role(self.Session())
use_buefy = self.get_use_buefy()
if use_buefy:
role = kwargs['instance']
if role not in (kwargs['guest_role'], kwargs['authenticated_role']):
users_data = []
for user in role.users:
users_data.append({
'uuid': user.uuid,
'full_name': user.display_name,
'username': user.username,
'active': "Yes" if user.active else "No",
'_action_url_view': self.request.route_url('users.view',
uuid=user.uuid),
'_action_url_edit': self.request.route_url('users.edit',
uuid=user.uuid),
})
kwargs['users_data'] = users_data
role = kwargs['instance']
if role not in (kwargs['guest_role'], kwargs['authenticated_role']):
users_data = []
for user in role.users:
users_data.append({
'uuid': user.uuid,
'full_name': user.display_name,
'username': user.username,
'active': "Yes" if user.active else "No",
'_action_url_view': self.request.route_url('users.view',
uuid=user.uuid),
'_action_url_edit': self.request.route_url('users.edit',
uuid=user.uuid),
})
kwargs['users_data'] = users_data
return kwargs

View file

@ -24,22 +24,18 @@
Settings Views
"""
from __future__ import unicode_literals, absolute_import
import os
import re
import subprocess
import sys
import json
import six
from rattail.db import model
from rattail.settings import Setting
from rattail.util import import_module_path, OrderedDict
import colander
from webhelpers2.html import tags
from tailbone import forms
from tailbone.db import Session
@ -312,25 +308,18 @@ class AppSettingsView(View):
option['url'] = self.request.route_url(option['route'])
config_options.append(option)
use_buefy = self.get_use_buefy()
context = {
'index_title': "App Settings",
'form': form,
'dform': form.make_deform_form(),
'groups': groups,
'settings': settings,
'use_buefy': use_buefy,
'config_options': config_options,
}
if use_buefy:
context['buefy_data'] = self.get_buefy_data(form, groups, settings)
# TODO: this seems hacky, and probably only needed if theme changes?
if current_group == '(All)':
current_group = ''
else:
group_options = [tags.Option(group, group) for group in groups]
group_options.insert(0, tags.Option("(All)", "(All)"))
context['group_options'] = group_options
context['buefy_data'] = self.get_buefy_data(form, groups, settings)
# TODO: this seems hacky, and probably only needed if theme changes?
if current_group == '(All)':
current_group = ''
context['current_group'] = current_group
return context
@ -457,7 +446,7 @@ class AppSettingsView(View):
for entry in value.split('\n')]
value = ', '.join(entries)
else:
value = six.text_type(value)
value = str(value)
app = self.get_rattail_app()
app.save_setting(Session(), legacy_name, value)

View file

@ -24,8 +24,6 @@
Common stuff for tempmon views
"""
from __future__ import unicode_literals, absolute_import
from webhelpers2.html import HTML
from tailbone import views, grids
@ -72,50 +70,15 @@ class MasterView(views.MasterView):
return ""
route_prefix = self.get_route_prefix()
use_buefy = self.get_use_buefy()
if use_buefy:
actions = [self.make_grid_action_view()]
if self.request.has_perm('tempmon.probes.edit'):
actions.append(self.make_grid_action_edit())
factory = self.get_grid_factory()
g = factory(
key='{}.probes'.format(route_prefix),
data=[],
columns=[
'description',
'critical_temp_min',
'good_temp_min',
'good_temp_max',
'critical_temp_max',
'status',
'enabled',
],
labels={
'critical_temp_min': "Crit. Min",
'good_temp_min': "Good Min",
'good_temp_max': "Good Max",
'critical_temp_max': "Crit. Max",
},
linked_columns=['description'],
main_actions=actions,
)
return HTML.literal(
g.render_buefy_table_element(data_prop='probesData'))
# not buefy!
view_url = lambda p, i: self.request.route_url('tempmon.probes.view', uuid=p.uuid)
actions = [
grids.GridAction('view', icon='zoomin', url=view_url),
]
actions = [self.make_grid_action_view()]
if self.request.has_perm('tempmon.probes.edit'):
url = lambda p, i: self.request.route_url('tempmon.probes.edit', uuid=p.uuid)
actions.append(grids.GridAction('edit', icon='pencil', url=url))
actions.append(self.make_grid_action_edit())
g = grids.Grid(
factory = self.get_grid_factory()
g = factory(
key='{}.probes'.format(route_prefix),
data=obj.probes,
data=[],
columns=[
'description',
'critical_temp_min',
@ -131,10 +94,8 @@ class MasterView(views.MasterView):
'good_temp_max': "Good Max",
'critical_temp_max': "Crit. Max",
},
url=lambda p: self.request.route_url('tempmon.probes.view', uuid=p.uuid),
linked_columns=['description'],
main_actions=actions,
)
g.set_enum('status', self.enum.TEMPMON_PROBE_STATUS)
g.set_type('enabled', 'boolean')
return HTML.literal(g.render_grid())
return HTML.literal(
g.render_buefy_table_element(data_prop='probesData'))

View file

@ -24,15 +24,11 @@
Tempmon "Dashboard" View
"""
from __future__ import unicode_literals, absolute_import
import datetime
from rattail.time import localtime, make_utc
from rattail_tempmon.db import model as tempmon
from webhelpers2.html import tags
from tailbone.views import View
from tailbone.db import TempmonSession
@ -44,7 +40,6 @@ class TempmonDashboardView(View):
session_key = 'tempmon.dashboard.appliance_uuid'
def dashboard(self):
use_buefy = self.get_use_buefy()
if self.request.method == 'POST':
appliance = None
@ -77,7 +72,6 @@ class TempmonDashboardView(View):
context = {
'index_url': self.request.route_url('tempmon.appliances'),
'index_title': "TempMon Appliances",
'use_buefy': use_buefy,
'appliance': selected_appliance,
}
@ -85,17 +79,9 @@ class TempmonDashboardView(View):
.order_by(tempmon.Appliance.name)\
.all()
if use_buefy:
context['appliances_data'] = [{'uuid': a.uuid,
'name': a.name}
for a in appliances]
else:
appliance_options = tags.Options([
tags.Option(appliance.name, appliance.uuid)
for appliance in appliances])
context['appliance_select'] = tags.select(
'appliance_uuid', selected_uuid, appliance_options)
context['appliances_data'] = [{'uuid': a.uuid,
'name': a.name}
for a in appliances]
return context

View file

@ -2,7 +2,7 @@
################################################################################
#
# Rattail -- Retail Software Framework
# Copyright © 2010-2022 Lance Edgar
# Copyright © 2010-2023 Lance Edgar
#
# This file is part of Rattail.
#
@ -24,12 +24,8 @@
Views for tempmon probes
"""
from __future__ import unicode_literals, absolute_import
import datetime
import six
from rattail.time import make_utc, localtime
from rattail_tempmon.db import model as tempmon
@ -206,7 +202,7 @@ class TempmonProbeView(MasterView):
client = probe.client
if not client:
return ""
text = six.text_type(client)
text = str(client)
url = self.request.route_url('tempmon.clients.view', uuid=client.uuid)
return tags.link_to(text, url)
@ -214,7 +210,7 @@ class TempmonProbeView(MasterView):
appliance = probe.appliance
if not appliance:
return ""
text = six.text_type(appliance)
text = str(appliance)
url = self.request.route_url('tempmon.appliances.view', uuid=appliance.uuid)
return tags.link_to(text, url)
@ -255,7 +251,6 @@ class TempmonProbeView(MasterView):
def graph(self):
probe = self.get_instance()
use_buefy = self.get_use_buefy()
key = 'tempmon.probe.{}.graph_time_range'.format(probe.uuid)
selected = self.request.params.get('time-range')
@ -270,16 +265,13 @@ class TempmonProbeView(MasterView):
tags.Option("Last Week", 'last week'),
])
if use_buefy:
time_range = HTML.tag('b-select', c=[range_options.render()],
**{'v-model': 'currentTimeRange',
'@input': 'timeRangeChanged'})
else:
time_range = tags.select('time-range', selected, range_options)
time_range = HTML.tag('b-select', c=[range_options.render()],
**{'v-model': 'currentTimeRange',
'@input': 'timeRangeChanged'})
context = {
'probe': probe,
'parent_title': six.text_type(probe),
'parent_title': str(probe),
'parent_url': self.get_action_url('view', probe),
'time_range': time_range,
'current_time_range': selected,

View file

@ -2,7 +2,7 @@
################################################################################
#
# Rattail -- Retail Software Framework
# Copyright © 2010-2022 Lance Edgar
# Copyright © 2010-2023 Lance Edgar
#
# This file is part of Rattail.
#
@ -24,10 +24,6 @@
Trainwreck views
"""
from __future__ import unicode_literals, absolute_import
import six
from rattail.time import localtime
from webhelpers2.html import HTML, tags
@ -163,7 +159,7 @@ class TransactionView(MasterView):
g.filters['end_time'].default_active = True
g.filters['end_time'].default_verb = 'equal'
g.filters['end_time'].default_value = six.text_type(localtime(self.rattail_config).date())
g.filters['end_time'].default_value = str(localtime(self.rattail_config).date())
g.set_sort_defaults('end_time', 'desc')
g.set_enum('system', self.enum.TRAINWRECK_SYSTEM)
@ -216,35 +212,29 @@ class TransactionView(MasterView):
route_prefix = self.get_route_prefix()
factory = self.get_grid_factory()
use_buefy = self.get_use_buefy()
g = factory(
key='{}.custorder_xref_markers'.format(route_prefix),
data=[] if use_buefy else txn.custorder_xref_markers,
data=[],
columns=['custorder_xref', 'custorder_item_xref'],
request=self.request)
if use_buefy:
return HTML.literal(
g.render_buefy_table_element(data_prop='custorderXrefMarkersData'))
else:
return HTML.literal(g.render_grid())
return HTML.literal(
g.render_buefy_table_element(data_prop='custorderXrefMarkersData'))
def template_kwargs_view(self, **kwargs):
kwargs = super(TransactionView, self).template_kwargs_view(**kwargs)
use_buefy = self.get_use_buefy()
if use_buefy:
form = kwargs['form']
if 'custorder_xref_markers' in form:
txn = kwargs['instance']
markers = []
for marker in txn.custorder_xref_markers:
markers.append({
'custorder_xref': marker.custorder_xref,
'custorder_item_xref': marker.custorder_item_xref,
})
kwargs['custorder_xref_markers_data'] = markers
form = kwargs['form']
if 'custorder_xref_markers' in form:
txn = kwargs['instance']
markers = []
for marker in txn.custorder_xref_markers:
markers.append({
'custorder_xref': marker.custorder_xref,
'custorder_item_xref': marker.custorder_item_xref,
})
kwargs['custorder_xref_markers_data'] = markers
return kwargs
@ -296,7 +286,7 @@ class TransactionView(MasterView):
def render_transaction(self, item, field):
txn = getattr(item, field)
text = six.text_type(txn)
text = str(txn)
url = self.get_action_url('view', txn)
return tags.link_to(text, url)
@ -306,38 +296,31 @@ class TransactionView(MasterView):
route_prefix = self.get_route_prefix()
factory = self.get_grid_factory()
use_buefy = self.get_use_buefy()
g = factory(
key='{}.discounts'.format(route_prefix),
data=[] if use_buefy else item.discounts,
data=[],
columns=['discount_type', 'description', 'amount'],
labels={'discount_type': "Type"},
request=self.request)
if use_buefy:
return HTML.literal(
g.render_buefy_table_element(data_prop='discountsData'))
else:
g.set_type('amount', 'currency')
return HTML.literal(g.render_grid())
return HTML.literal(
g.render_buefy_table_element(data_prop='discountsData'))
def template_kwargs_view_row(self, **kwargs):
use_buefy = self.get_use_buefy()
if use_buefy:
form = kwargs['form']
if 'discounts' in form:
form = kwargs['form']
if 'discounts' in form:
app = self.get_rattail_app()
item = kwargs['instance']
discounts_data = []
for discount in item.discounts:
discounts_data.append({
'discount_type': discount.discount_type,
'description': discount.description,
'amount': app.render_currency(discount.amount),
})
kwargs['discounts_data'] = discounts_data
app = self.get_rattail_app()
item = kwargs['instance']
discounts_data = []
for discount in item.discounts:
discounts_data.append({
'discount_type': discount.discount_type,
'description': discount.description,
'amount': app.render_currency(discount.amount),
})
kwargs['discounts_data'] = discounts_data
return kwargs
@ -352,7 +335,7 @@ class TransactionView(MasterView):
# find oldest and newest dates for each database
engines_data = []
for key, engine in six.iteritems(trainwreck_engines):
for key, engine in trainwreck_engines.items():
if key == 'default':
session = self.Session()

View file

@ -2,7 +2,7 @@
################################################################################
#
# Rattail -- Retail Software Framework
# Copyright © 2010-2022 Lance Edgar
# Copyright © 2010-2023 Lance Edgar
#
# This file is part of Rattail.
#
@ -24,15 +24,12 @@
Views for app upgrades
"""
from __future__ import unicode_literals, absolute_import
import json
import os
import re
import logging
import warnings
import six
import sqlalchemy as sa
from rattail.core import Object
@ -251,25 +248,24 @@ class UpgradeView(MasterView):
code = getattr(upgrade, field)
text = self.enum.UPGRADE_STATUS[code]
if self.get_use_buefy():
if code == self.enum.UPGRADE_STATUS_EXECUTING:
if code == self.enum.UPGRADE_STATUS_EXECUTING:
text = HTML.tag('span', c=[text])
text = HTML.tag('span', c=[text])
button = HTML.tag('b-button',
type='is-warning',
icon_pack='fas',
icon_left='sad-tear',
c=['{{ declareFailureSubmitting ? "Working, please wait..." : "Declare Failure" }}'],
**{':disabled': 'declareFailureSubmitting',
'@click': 'declareFailureClick'})
button = HTML.tag('b-button',
type='is-warning',
icon_pack='fas',
icon_left='sad-tear',
c=['{{ declareFailureSubmitting ? "Working, please wait..." : "Declare Failure" }}'],
**{':disabled': 'declareFailureSubmitting',
'@click': 'declareFailureClick'})
return HTML.tag('div', class_='level', c=[
HTML.tag('div', class_='level-left', c=[
HTML.tag('div', class_='level-item', c=[text]),
HTML.tag('div', class_='level-item', c=[button]),
]),
])
return HTML.tag('div', class_='level', c=[
HTML.tag('div', class_='level-left', c=[
HTML.tag('div', class_='level-item', c=[text]),
HTML.tag('div', class_='level-item', c=[button]),
]),
])
# just show status per normal
return text
@ -302,14 +298,12 @@ class UpgradeView(MasterView):
return filename
def render_package_diff(self, upgrade, fieldname):
use_buefy = self.get_use_buefy()
try:
before = self.parse_requirements(upgrade, 'before')
after = self.parse_requirements(upgrade, 'after')
kwargs = {}
if use_buefy:
kwargs['extra_row_attrs'] = self.get_extra_diff_row_attrs
kwargs['extra_row_attrs'] = self.get_extra_diff_row_attrs
diff = self.make_diff(before, after,
columns=["package", "old version", "new version"],
render_field=self.render_diff_field,
@ -317,24 +311,16 @@ class UpgradeView(MasterView):
**kwargs)
kwargs = {}
if use_buefy:
kwargs['@click.prevent'] = "showingPackages = 'all'"
kwargs[':style'] = "{'font-weight': showingPackages == 'all' ? 'bold' : null}"
else:
kwargs['class_'] = 'all'
kwargs['@click.prevent'] = "showingPackages = 'all'"
kwargs[':style'] = "{'font-weight': showingPackages == 'all' ? 'bold' : null}"
all_link = tags.link_to("all", '#', **kwargs)
kwargs = {}
if use_buefy:
kwargs['@click.prevent'] = "showingPackages = 'diffs'"
kwargs[':style'] = "{'font-weight': showingPackages == 'diffs' ? 'bold' : null}"
else:
kwargs['class_'] = 'diffs'
kwargs['@click.prevent'] = "showingPackages = 'diffs'"
kwargs[':style'] = "{'font-weight': showingPackages == 'diffs' ? 'bold' : null}"
diffs_link = tags.link_to("diffs only", '#', **kwargs)
kwargs = {}
if not use_buefy:
kwargs['class_'] = 'showing'
showing = HTML.tag('div', c=["showing: "
+ all_link
+ " / "

View file

@ -2,7 +2,7 @@
################################################################################
#
# Rattail -- Retail Software Framework
# Copyright © 2010-2022 Lance Edgar
# Copyright © 2010-2023 Lance Edgar
#
# This file is part of Rattail.
#
@ -24,8 +24,6 @@
Work Order Views
"""
from __future__ import unicode_literals, absolute_import
import sqlalchemy as sa
from rattail.db.model import WorkOrder, WorkOrderEvent
@ -117,7 +115,6 @@ class WorkOrderView(MasterView):
def configure_form(self, f):
super(WorkOrderView, self).configure_form(f)
model = self.model
use_buefy = self.get_use_buefy()
SelectWidget = forms.widgets.JQuerySelectWidget
# id
@ -198,11 +195,7 @@ class WorkOrderView(MasterView):
if status_code in self.enum.WORKORDER_STATUS:
text = self.enum.WORKORDER_STATUS[status_code]
if status_code == self.enum.WORKORDER_STATUS_CANCELED:
use_buefy = self.get_use_buefy()
if use_buefy:
return HTML.tag('span', class_='has-text-danger', c=text)
else:
return HTML.tag('span', style='color: red;', c=text)
return HTML.tag('span', class_='has-text-danger', c=text)
return text
return str(status_code)