Remove all deprecated use_buefy
logic
also remove some static files no longer used, etc.
This commit is contained in:
parent
01e5eee981
commit
9faaea881d
112 changed files with 2079 additions and 7039 deletions
|
@ -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):
|
||||
"""
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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')
|
||||
|
|
|
@ -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)
|
||||
|
||||
|
|
|
@ -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):
|
||||
|
|
|
@ -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):
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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?
|
||||
|
|
|
@ -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',
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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'),
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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)"
|
||||
|
|
|
@ -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)
|
||||
|
||||
|
|
|
@ -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')))
|
||||
|
|
|
@ -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):
|
||||
|
|
|
@ -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):
|
||||
# """
|
||||
|
|
|
@ -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']
|
||||
|
|
|
@ -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])
|
||||
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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']
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
||||
|
|
|
@ -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'))
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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
|
||||
+ " / "
|
||||
|
|
|
@ -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)
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue