Remove some more edbob cruft.
This commit is contained in:
parent
9806c7a0a2
commit
8bf292ebac
|
@ -26,15 +26,11 @@ Common Field Renderers
|
|||
|
||||
from __future__ import unicode_literals
|
||||
|
||||
import pytz
|
||||
import humanize
|
||||
|
||||
import formalchemy
|
||||
from formalchemy.fields import FieldRenderer, SelectFieldRenderer, CheckBoxFieldRenderer
|
||||
from pyramid.renderers import render
|
||||
from webhelpers.html import HTML
|
||||
|
||||
from rattail.time import timezone
|
||||
from tailbone.util import pretty_datetime
|
||||
|
||||
|
||||
class AutocompleteFieldRenderer(FieldRenderer):
|
||||
|
@ -80,34 +76,6 @@ class AutocompleteFieldRenderer(FieldRenderer):
|
|||
return unicode(value)
|
||||
|
||||
|
||||
def pretty_datetime(config, value):
|
||||
"""
|
||||
Formats a datetime as a "pretty" human-readable string, with a tooltip
|
||||
showing the ISO string value.
|
||||
|
||||
:param config: Reference to a config object.
|
||||
|
||||
:param value: A ``datetime.datetime`` instance. Note that if this instance
|
||||
is not timezone-aware, its timezone is assumed to be UTC.
|
||||
"""
|
||||
if not value:
|
||||
return ''
|
||||
|
||||
# Make sure we're dealing with a tz-aware value. If we're given a naive
|
||||
# value, we assume it to be local to the UTC timezone.
|
||||
if not value.tzinfo:
|
||||
value = pytz.utc.localize(value)
|
||||
|
||||
# Convert value to local timezone, and make a naive copy.
|
||||
local = timezone(config)
|
||||
value = local.normalize(value.astimezone(local))
|
||||
naive_value = value.replace(tzinfo=None)
|
||||
|
||||
return HTML.tag('span',
|
||||
title=value.strftime('%Y-%m-%d %H:%M:%S %Z%z'),
|
||||
c=humanize.naturaltime(naive_value))
|
||||
|
||||
|
||||
class DateTimeFieldRenderer(formalchemy.DateTimeFieldRenderer):
|
||||
"""
|
||||
Custom date/time field renderer, which displays a "pretty" value in
|
||||
|
|
|
@ -30,7 +30,8 @@ from formalchemy import TextFieldRenderer
|
|||
from rattail.gpc import GPC
|
||||
from .common import AutocompleteFieldRenderer
|
||||
from webhelpers.html import literal
|
||||
from edbob.pyramid.forms import pretty_datetime
|
||||
|
||||
from tailbone.util import pretty_datetime
|
||||
|
||||
|
||||
__all__ = ['ProductFieldRenderer', 'GPCFieldRenderer',
|
||||
|
@ -122,5 +123,6 @@ class PriceWithExpirationFieldRenderer(PriceFieldRenderer):
|
|||
if result:
|
||||
price = self.field.raw_value
|
||||
if price.ends:
|
||||
result += ' (%s)' % pretty_datetime(price.ends, from_='utc')
|
||||
result = '{0} ({1})'.format(
|
||||
result, pretty_datetime(self.request.rattail_config, price.ends))
|
||||
return result
|
||||
|
|
|
@ -1,9 +1,8 @@
|
|||
#!/usr/bin/env python
|
||||
# -*- coding: utf-8 -*-
|
||||
################################################################################
|
||||
#
|
||||
# Rattail -- Retail Software Framework
|
||||
# Copyright © 2010-2012 Lance Edgar
|
||||
# Copyright © 2010-2014 Lance Edgar
|
||||
#
|
||||
# This file is part of Rattail.
|
||||
#
|
||||
|
@ -21,18 +20,19 @@
|
|||
# along with Rattail. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
################################################################################
|
||||
|
||||
"""
|
||||
Template Context Helpers
|
||||
"""
|
||||
|
||||
from __future__ import unicode_literals
|
||||
|
||||
import datetime
|
||||
from decimal import Decimal
|
||||
|
||||
from webhelpers.html import *
|
||||
from webhelpers.html.tags import *
|
||||
|
||||
from edbob.pyramid.forms import pretty_datetime
|
||||
from tailbone.util import pretty_datetime
|
||||
|
||||
|
||||
def pretty_date(date):
|
||||
|
|
|
@ -1,9 +1,8 @@
|
|||
#!/usr/bin/env python
|
||||
# -*- coding: utf-8 -*-
|
||||
################################################################################
|
||||
#
|
||||
# Rattail -- Retail Software Framework
|
||||
# Copyright © 2010-2012 Lance Edgar
|
||||
# Copyright © 2010-2014 Lance Edgar
|
||||
#
|
||||
# This file is part of Rattail.
|
||||
#
|
||||
|
@ -21,13 +20,12 @@
|
|||
# along with Rattail. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
################################################################################
|
||||
|
||||
"""
|
||||
Static Assets
|
||||
"""
|
||||
|
||||
from __future__ import unicode_literals
|
||||
|
||||
|
||||
def includeme(config):
|
||||
# TODO: Remove edbob.
|
||||
config.include('edbob.pyramid.static')
|
||||
config.add_static_view('tailbone', 'tailbone:static')
|
||||
|
|
32
tailbone/static/css/perms.css
Normal file
32
tailbone/static/css/perms.css
Normal file
|
@ -0,0 +1,32 @@
|
|||
|
||||
/******************************
|
||||
* Permission Lists
|
||||
******************************/
|
||||
|
||||
div.field-wrapper.permissions div.field div.group {
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
div.field-wrapper.permissions div.field div.group p {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
div.field-wrapper.permissions div.field label {
|
||||
float: none;
|
||||
font-weight: normal;
|
||||
}
|
||||
|
||||
div.field-wrapper.permissions div.field label input {
|
||||
margin-left: 15px;
|
||||
margin-right: 10px;
|
||||
}
|
||||
|
||||
div.field-wrapper.permissions div.field div.group p.perm {
|
||||
font-weight: normal;
|
||||
margin-left: 15px;
|
||||
}
|
||||
|
||||
div.field-wrapper.permissions div.field div.group p.perm span {
|
||||
font-family: monospace;
|
||||
margin-right: 10px;
|
||||
}
|
|
@ -4,10 +4,10 @@
|
|||
<head>
|
||||
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
|
||||
<title>Working...</title>
|
||||
${h.javascript_link(request.static_url('edbob.pyramid:static/js/jquery.js'))}
|
||||
${h.javascript_link(request.static_url('edbob.pyramid:static/js/edbob.js'))}
|
||||
${h.stylesheet_link(request.static_url('edbob.pyramid:static/css/base.css'))}
|
||||
${h.stylesheet_link(request.static_url('edbob.pyramid:static/css/layout.css'))}
|
||||
${h.javascript_link(request.static_url('tailbone:static/js/lib/jquery-1.9.1.min.js'))}
|
||||
${h.javascript_link(request.static_url('tailbone:static/js/tailbone.js'))}
|
||||
${h.stylesheet_link(request.static_url('tailbone:static/css/base.css'))}
|
||||
${h.stylesheet_link(request.static_url('tailbone:static/css/layout.css'))}
|
||||
<style type="text/css">
|
||||
|
||||
#container {
|
||||
|
|
|
@ -1,9 +1,9 @@
|
|||
## -*- coding: utf-8 -*-
|
||||
<%inherit file="edbob.pyramid:templates/crud.mako" />
|
||||
<%inherit file="/crud.mako" />
|
||||
|
||||
<%def name="head_tags()">
|
||||
${parent.head_tags()}
|
||||
${h.stylesheet_link(request.static_url('edbob.pyramid:static/css/perms.css'))}
|
||||
${h.stylesheet_link(request.static_url('tailbone:static/css/perms.css'))}
|
||||
</%def>
|
||||
|
||||
<%def name="context_menu_items()">
|
||||
|
|
62
tailbone/util.py
Normal file
62
tailbone/util.py
Normal file
|
@ -0,0 +1,62 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
################################################################################
|
||||
#
|
||||
# Rattail -- Retail Software Framework
|
||||
# Copyright © 2010-2014 Lance Edgar
|
||||
#
|
||||
# This file is part of Rattail.
|
||||
#
|
||||
# Rattail is free software: you can redistribute it and/or modify it under the
|
||||
# terms of the GNU Affero General Public License as published by the Free
|
||||
# Software Foundation, either version 3 of the License, or (at your option)
|
||||
# any later version.
|
||||
#
|
||||
# Rattail is distributed in the hope that it will be useful, but WITHOUT ANY
|
||||
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
||||
# FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for
|
||||
# more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Affero General Public License
|
||||
# along with Rattail. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
################################################################################
|
||||
"""
|
||||
Utilities
|
||||
"""
|
||||
|
||||
from __future__ import unicode_literals
|
||||
|
||||
import pytz
|
||||
import humanize
|
||||
|
||||
from webhelpers.html import HTML
|
||||
|
||||
from rattail.time import timezone
|
||||
|
||||
|
||||
def pretty_datetime(config, value):
|
||||
"""
|
||||
Formats a datetime as a "pretty" human-readable string, with a tooltip
|
||||
showing the ISO string value.
|
||||
|
||||
:param config: Reference to a config object.
|
||||
|
||||
:param value: A ``datetime.datetime`` instance. Note that if this instance
|
||||
is not timezone-aware, its timezone is assumed to be UTC.
|
||||
"""
|
||||
if not value:
|
||||
return ''
|
||||
|
||||
# Make sure we're dealing with a tz-aware value. If we're given a naive
|
||||
# value, we assume it to be local to the UTC timezone.
|
||||
if not value.tzinfo:
|
||||
value = pytz.utc.localize(value)
|
||||
|
||||
# Convert value to local timezone, and make a naive copy.
|
||||
local = timezone(config)
|
||||
value = local.normalize(value.astimezone(local))
|
||||
naive_value = value.replace(tzinfo=None)
|
||||
|
||||
return HTML.tag('span',
|
||||
title=value.strftime('%Y-%m-%d %H:%M:%S %Z%z'),
|
||||
c=humanize.naturaltime(naive_value))
|
|
@ -1,9 +1,8 @@
|
|||
#!/usr/bin/env python
|
||||
# -*- coding: utf-8 -*-
|
||||
################################################################################
|
||||
#
|
||||
# Rattail -- Retail Software Framework
|
||||
# Copyright © 2010-2012 Lance Edgar
|
||||
# Copyright © 2010-2014 Lance Edgar
|
||||
#
|
||||
# This file is part of Rattail.
|
||||
#
|
||||
|
@ -21,11 +20,12 @@
|
|||
# along with Rattail. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
################################################################################
|
||||
|
||||
"""
|
||||
Auth Views
|
||||
"""
|
||||
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from pyramid.httpexceptions import HTTPFound
|
||||
from pyramid.security import remember, forget, authenticated_userid
|
||||
|
||||
|
@ -36,7 +36,8 @@ import formencode
|
|||
from pyramid_simpleform import Form
|
||||
from ..forms.simpleform import FormRenderer
|
||||
|
||||
import edbob
|
||||
from rattail.time import localtime
|
||||
|
||||
from ..db import Session
|
||||
from rattail.db.auth import authenticate_user, set_user_password
|
||||
|
||||
|
@ -85,20 +86,13 @@ def login(request):
|
|||
form.data['username'],
|
||||
form.data['password'])
|
||||
if user:
|
||||
request.session.flash("%s logged in at %s" % (
|
||||
user.display_name,
|
||||
edbob.local_time().strftime('%I:%M %p')))
|
||||
request.session.flash("{0} logged in at {1}".format(
|
||||
user, localtime(request.rattail_config).strftime('%I:%M %p')))
|
||||
headers = remember(request, user.uuid)
|
||||
return HTTPFound(location=referrer, headers=headers)
|
||||
request.session.flash("Invalid username or password")
|
||||
|
||||
url = request.rattail_config.get('edbob.pyramid', 'login.logo_url',
|
||||
default=request.static_url('edbob.pyramid:static/img/logo.jpg'))
|
||||
kwargs = eval(request.rattail_config.get('edbob.pyramid', 'login.logo_kwargs',
|
||||
default="dict(width=500)"))
|
||||
|
||||
return {'form': FormRenderer(form), 'referrer': referrer,
|
||||
'logo_url': url, 'logo_kwargs': kwargs}
|
||||
return {'form': FormRenderer(form), 'referrer': referrer}
|
||||
|
||||
|
||||
def logout(request):
|
||||
|
|
|
@ -1,9 +1,8 @@
|
|||
#!/usr/bin/env python
|
||||
# -*- coding: utf-8 -*-
|
||||
################################################################################
|
||||
#
|
||||
# Rattail -- Retail Software Framework
|
||||
# Copyright © 2010-2012 Lance Edgar
|
||||
# Copyright © 2010-2014 Lance Edgar
|
||||
#
|
||||
# This file is part of Rattail.
|
||||
#
|
||||
|
@ -21,18 +20,18 @@
|
|||
# along with Rattail. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
################################################################################
|
||||
|
||||
"""
|
||||
Core Batch Views
|
||||
"""
|
||||
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from pyramid.httpexceptions import HTTPFound
|
||||
from pyramid.renderers import render_to_response
|
||||
|
||||
from webhelpers.html import tags
|
||||
|
||||
from edbob.pyramid.forms import PrettyDateTimeFieldRenderer
|
||||
from ...forms import EnumFieldRenderer
|
||||
from tailbone.forms import DateTimeFieldRenderer, EnumFieldRenderer
|
||||
from ...grids.search import BooleanSearchFilter
|
||||
from .. import SearchableAlchemyGridView, CrudView, View
|
||||
from ...progress import SessionProgress
|
||||
|
@ -86,7 +85,6 @@ class BatchesGrid(SearchableAlchemyGridView):
|
|||
|
||||
def grid(self):
|
||||
g = self.make_grid()
|
||||
g.executed.set(renderer=PrettyDateTimeFieldRenderer(from_='utc'))
|
||||
g.configure(
|
||||
include=[
|
||||
g.source,
|
||||
|
@ -94,7 +92,7 @@ class BatchesGrid(SearchableAlchemyGridView):
|
|||
g.destination,
|
||||
g.description,
|
||||
g.rowcount.label("Row Count"),
|
||||
g.executed,
|
||||
g.executed.with_renderer(DateTimeFieldRenderer(self.request.rattail_config)),
|
||||
],
|
||||
readonly=True)
|
||||
if self.request.has_perm('batches.read'):
|
||||
|
@ -121,7 +119,6 @@ class BatchCrud(CrudView):
|
|||
def fieldset(self, model):
|
||||
fs = self.make_fieldset(model)
|
||||
fs.action_type.set(renderer=EnumFieldRenderer(enum.BATCH_ACTION))
|
||||
fs.executed.set(renderer=PrettyDateTimeFieldRenderer(from_='utc'))
|
||||
fs.configure(
|
||||
include=[
|
||||
fs.source,
|
||||
|
@ -130,7 +127,7 @@ class BatchCrud(CrudView):
|
|||
fs.action_type,
|
||||
fs.description,
|
||||
fs.rowcount.label("Row Count").readonly(),
|
||||
fs.executed.readonly(),
|
||||
fs.executed.with_renderer(DateTimeFieldRenderer(self.request.rattail_config)).readonly(),
|
||||
])
|
||||
return fs
|
||||
|
||||
|
|
|
@ -33,7 +33,7 @@ from ..forms import AlchemyForm
|
|||
from formalchemy import FieldSet
|
||||
from ..db import Session
|
||||
|
||||
from edbob.util import requires_impl, prettify
|
||||
from edbob.util import prettify
|
||||
|
||||
|
||||
__all__ = ['CrudView']
|
||||
|
@ -46,18 +46,16 @@ class CrudView(View):
|
|||
update_cancel_route = None
|
||||
|
||||
@property
|
||||
@requires_impl(is_property=True)
|
||||
def mapped_class(self):
|
||||
pass
|
||||
raise NotImplementedError
|
||||
|
||||
@property
|
||||
def pretty_name(self):
|
||||
return self.mapped_class.__name__
|
||||
|
||||
@property
|
||||
@requires_impl(is_property=True)
|
||||
def home_route(self):
|
||||
pass
|
||||
raise NotImplementedError
|
||||
|
||||
@property
|
||||
def home_url(self):
|
||||
|
|
|
@ -37,7 +37,6 @@ from webhelpers.html.tags import link_to
|
|||
from pyramid.httpexceptions import HTTPFound
|
||||
from pyramid.renderers import render_to_response
|
||||
|
||||
import edbob
|
||||
from . import SearchableAlchemyGridView
|
||||
|
||||
import rattail.labels
|
||||
|
|
|
@ -35,12 +35,11 @@ from pyramid.response import Response
|
|||
|
||||
from ..db import Session
|
||||
|
||||
from edbob.time import local_time
|
||||
|
||||
import rattail
|
||||
from rattail import enum
|
||||
from rattail.db import model
|
||||
from rattail.files import resource_path
|
||||
from rattail.time import localtime
|
||||
|
||||
|
||||
plu_upc_pattern = re.compile(r'^000000000(\d{5})$')
|
||||
|
@ -112,7 +111,7 @@ class OrderingWorksheet(View):
|
|||
key = '{0} {1}'.format(brand, product.description)
|
||||
return key
|
||||
|
||||
now = local_time()
|
||||
now = localtime(self.request.rattail_config)
|
||||
data = dict(
|
||||
vendor=vendor,
|
||||
costs=costs,
|
||||
|
@ -174,7 +173,7 @@ class InventoryWorksheet(View):
|
|||
q = q.order_by(model.Brand.name, model.Product.description)
|
||||
return q.all()
|
||||
|
||||
now = local_time()
|
||||
now = localtime(self.request.rattail_config)
|
||||
data = dict(
|
||||
date=now.strftime('%a %d %b %Y'),
|
||||
time=now.strftime('%I:%M %p'),
|
||||
|
|
|
@ -12,12 +12,6 @@ class TestCase(unittest.TestCase):
|
|||
|
||||
def setUp(self):
|
||||
self.config = testing.setUp()
|
||||
# self.config = testing.setUp(settings={
|
||||
# 'mako.directories': [
|
||||
# 'rattail.pyramid:templates',
|
||||
# 'edbob.pyramid:templates',
|
||||
# ],
|
||||
# })
|
||||
|
||||
def tearDown(self):
|
||||
testing.tearDown()
|
||||
|
@ -36,34 +30,3 @@ def mock_query():
|
|||
query.distinct.return_value = query
|
||||
query.order_by.return_value = query
|
||||
return query
|
||||
|
||||
|
||||
# class DataTestCase(TestCase):
|
||||
# """
|
||||
# Base class for all test suites which require fixture data.
|
||||
# """
|
||||
|
||||
# def setUp(self):
|
||||
# from sqlalchemy import create_engine
|
||||
# from edbob import db
|
||||
# from rattail.pyramid import Session
|
||||
# from edbob.db.util import install_core_schema
|
||||
# from edbob.db.extensions import activate_extension
|
||||
# from rattail.pyramid.tests.fixtures import load_fixtures
|
||||
|
||||
# engine = create_engine('postgresql://rattail:1pKglVgdHOP1MYGVdUZr@localhost/rattail.test')
|
||||
|
||||
# db.engines = {'default': engine}
|
||||
# db.engine = engine
|
||||
# db.Session.configure(bind=engine)
|
||||
# Session.configure(bind=engine)
|
||||
|
||||
# install_core_schema(engine)
|
||||
# activate_extension('rattail', engine)
|
||||
# load_fixtures(engine)
|
||||
# super(DataTestCase, self).setUp()
|
||||
|
||||
# # def tearDown(self):
|
||||
# # from rattail.pyramid import Session
|
||||
# # super(DataTestCase, self).tearDown()
|
||||
# # Session.configure(bind=None)
|
||||
|
|
Loading…
Reference in a new issue