Compare commits

..

No commits in common. "master" and "v0.3.1" have entirely different histories.

6 changed files with 107 additions and 76 deletions

View file

@ -1,9 +1,13 @@
.. -*- mode: rst -*-
# rattail-tutorial rattail-tutorial
================
This project is intended for use as a "tutorial" for Rattail app development. This project is intended for use as a "tutorial" for Rattail app development.
It contains documentation for the tutorial itself, but also contains It contains documentation for the tutorial itself, but also contains
code for the tutorial app, which users may run locally for testing. code for the tutorial app, which users may run locally for testing.
See the [Rattail website](https://rattailproject.org/) for more info. See the `Rattail website`_ for more info.
.. _`Rattail website`: https://rattailproject.org/

View file

@ -125,7 +125,7 @@ rattail-tutorial app instead, you should do this::
mkdir -p ~/src mkdir -p ~/src
cd ~/src cd ~/src
git clone https://forgejo.wuttaproject.org/rattail/rattail-tutorial.git git clone https://rattailproject.org/git/rattail-tutorial.git
pip install -e rattail-tutorial pip install -e rattail-tutorial
Creating the Project Creating the Project

View file

@ -8,7 +8,7 @@ build-backend = "hatchling.build"
name = "rattail-tutorial" name = "rattail-tutorial"
version = "0.3.1" version = "0.3.1"
description = "Rattail Development Tutorial" description = "Rattail Development Tutorial"
readme = "README.md" readme = "README.rst"
authors = [{name = "Lance Edgar", email = "lance@edbob.org"}] authors = [{name = "Lance Edgar", email = "lance@edbob.org"}]
license = {text = "GNU GPL v3+"} license = {text = "GNU GPL v3+"}
classifiers = [ classifiers = [
@ -43,17 +43,13 @@ main = "rattail_tutorial.web.app:main"
[project.entry-points."rattail.config.extensions"] [project.entry-points."rattail.config.extensions"]
rattail_tutorial = "rattail_tutorial.config:RattailTutorialConfig" rattail_tutorial = "rattail_tutorial.config:Rattail_tutorialConfig"
[project.entry-points."rattail.emails"]
rattail_tutorial = "rattail_tutorial.emails"
[project.urls] [project.urls]
Homepage = "https://rattailproject.org" Homepage = "https://rattailproject.org"
repository = "https://forgejo.wuttaproject.org/rattail/rattail-tutorial" repository = "https://kallithea.rattailproject.org/rattail-project/rattail-tutorial"
Changelog = "https://forgejo.wuttaproject.org/rattail/rattail-tutorial/src/branch/master/CHANGELOG.md" Changelog = "https://kallithea.rattailproject.org/rattail-project/rattail-tutorial/files/master/CHANGELOG.md"
[tool.commitizen] [tool.commitizen]

View file

@ -2,7 +2,7 @@
################################################################################ ################################################################################
# #
# Rattail -- Retail Software Framework # Rattail -- Retail Software Framework
# Copyright © 2010-2024 Lance Edgar # Copyright © 2010-2019 Lance Edgar
# #
# This file is part of Rattail. # This file is part of Rattail.
# #
@ -24,10 +24,10 @@
Custom config Custom config
""" """
from wuttjamaican.conf import WuttaConfigExtension from rattail.config import ConfigExtension
class RattailTutorialConfig(WuttaConfigExtension): class Rattail_tutorialConfig(ConfigExtension):
""" """
Rattail config extension for Rattail Tutorial Rattail config extension for Rattail Tutorial
""" """
@ -36,4 +36,5 @@ class RattailTutorialConfig(WuttaConfigExtension):
def configure(self, config): def configure(self, config):
# set some default config values # set some default config values
config.setdefault('tailbone.menus.handler', 'rattail_tutorial.web.menus:TutorialMenuHandler') config.setdefault('rattail.mail', 'emails', 'rattail_tutorial.emails')
config.setdefault('tailbone', 'menus', 'rattail_tutorial.web.menus')

View file

@ -2,7 +2,7 @@
################################################################################ ################################################################################
# #
# Rattail -- Retail Software Framework # Rattail -- Retail Software Framework
# Copyright © 2010-2024 Lance Edgar # Copyright © 2010-2019 Lance Edgar
# #
# This file is part of Rattail. # This file is part of Rattail.
# #
@ -26,6 +26,9 @@ Custom email profiles
from rattail.mail import Email from rattail.mail import Email
# bring in some common ones from rattail
from rattail.emails import datasync_error_watcher_get_changes, filemon_action_error
class rattail_import_sample_updates(Email): class rattail_import_sample_updates(Email):
""" """

View file

@ -2,7 +2,7 @@
################################################################################ ################################################################################
# #
# Rattail -- Retail Software Framework # Rattail -- Retail Software Framework
# Copyright © 2010-2024 Lance Edgar # Copyright © 2010-2019 Lance Edgar
# #
# This file is part of Rattail. # This file is part of Rattail.
# #
@ -24,139 +24,166 @@
Web Menus Web Menus
""" """
from tailbone import menus as base
def simple_menus(request):
url = request.route_url
class TutorialMenuHandler(base.MenuHandler): menus = [
""" {
Demo menu handler
"""
def make_menus(self, request, **kwargs):
products_menu = self.make_products_menu(request)
vendors_menu = self.make_vendors_menu(request)
company_menu = self.make_company_menu(request)
batches_menu = self.make_batches_menu(request)
admin_menu = self.make_admin_menu(request,
include_stores=False,
include_tenders=False)
menus = [
products_menu,
vendors_menu,
company_menu,
batches_menu,
admin_menu,
]
return menus
def make_products_menu(self, request, **kwargs):
return {
'title': "Products", 'title': "Products",
'type': 'menu', 'type': 'menu',
'items': [ 'items': [
{ {
'title': "Products", 'title': "Products",
'route': 'products', 'url': url('products'),
'perm': 'products.list', 'perm': 'products.list',
}, },
{ {
'title': "Brands", 'title': "Brands",
'route': 'brands', 'url': url('brands'),
'perm': 'brands.list', 'perm': 'brands.list',
}, },
{ {
'title': "Report Codes", 'title': "Report Codes",
'route': 'reportcodes', 'url': url('reportcodes'),
'perm': 'reportcodes.list', 'perm': 'reportcodes.list',
}, },
], ],
} },
{
def make_vendors_menu(self, request, **kwargs):
return {
'title': "Vendors", 'title': "Vendors",
'type': 'menu', 'type': 'menu',
'items': [ 'items': [
{ {
'title': "Vendors", 'title': "Vendors",
'route': 'vendors', 'url': url('vendors'),
'perm': 'vendors.list', 'perm': 'vendors.list',
}, },
{'type': 'sep'}, {'type': 'sep'},
{ {
'title': "Catalogs", 'title': "Catalogs",
'route': 'vendorcatalogs', 'url': url('vendorcatalogs'),
'perm': 'vendorcatalogs.list', 'perm': 'vendorcatalogs.list',
}, },
{ {
'title': "Upload New Catalog", 'title': "Upload New Catalog",
'route': 'vendorcatalogs.create', 'url': url('vendorcatalogs.create'),
'perm': 'vendorcatalogs.create', 'perm': 'vendorcatalogs.create',
}, },
], ],
} },
{
def make_company_menu(self, request, **kwargs):
return {
'title': "Company", 'title': "Company",
'type': 'menu', 'type': 'menu',
'items': [ 'items': [
{ {
'title': "Stores", 'title': "Stores",
'route': 'stores', 'url': url('stores'),
'perm': 'stores.list', 'perm': 'stores.list',
}, },
{ {
'title': "Departments", 'title': "Departments",
'route': 'departments', 'url': url('departments'),
'perm': 'departments.list', 'perm': 'departments.list',
}, },
{ {
'title': "Subdepartments", 'title': "Subdepartments",
'route': 'subdepartments', 'url': url('subdepartments'),
'perm': 'subdepartments.list', 'perm': 'subdepartments.list',
}, },
{'type': 'sep'}, {'type': 'sep'},
{ {
'title': "Employees", 'title': "Employees",
'route': 'employees', 'url': url('employees'),
'perm': 'employees.list', 'perm': 'employees.list',
}, },
{'type': 'sep'}, {'type': 'sep'},
{ {
'title': "Customers", 'title': "Customers",
'route': 'customers', 'url': url('customers'),
'perm': 'customers.list', 'perm': 'customers.list',
}, },
{ {
'title': "Customer Groups", 'title': "Customer Groups",
'route': 'customergroups', 'url': url('customergroups'),
'perm': 'customergroups.list', 'perm': 'customergroups.list',
}, },
], ],
} },
{
def make_batches_menu(self, request, **kwargs):
return {
'title': "Batches", 'title': "Batches",
'type': 'menu', 'type': 'menu',
'items': [ 'items': [
{ {
'title': "Handheld", 'title': "Handheld",
'route': 'batch.handheld', 'url': url('batch.handheld'),
'perm': 'batch.handheld.list', 'perm': 'batch.handheld.list',
}, },
{ {
'title': "Inventory", 'title': "Inventory",
'route': 'batch.inventory', 'url': url('batch.inventory'),
'perm': 'batch.inventory.list', 'perm': 'batch.inventory.list',
}, },
], ],
} },
{
'title': "Admin",
'type': 'menu',
'items': [
{
'title': "Users",
'url': url('users'),
'perm': 'users.list',
},
{
'title': "User Events",
'url': url('userevents'),
'perm': 'userevents.list',
},
{
'title': "Roles",
'url': url('roles'),
'perm': 'roles.list',
},
{'type': 'sep'},
{
'title': "App Settings",
'url': url('appsettings'),
'perm': 'settings.list',
},
{
'title': "Email Settings",
'url': url('emailprofiles'),
'perm': 'emailprofiles.list',
},
{
'title': "Email Attempts",
'url': url('email_attempts'),
'perm': 'email_attempts.list',
},
{
'title': "Raw Settings",
'url': url('settings'),
'perm': 'settings.list',
},
{'type': 'sep'},
{
'title': "DataSync Changes",
'url': url('datasyncchanges'),
'perm': 'datasync.list',
},
{
'title': "Tables",
'url': url('tables'),
'perm': 'tables.list',
},
{
'title': "Rattail Tutorial Upgrades",
'url': url('upgrades'),
'perm': 'upgrades.list',
},
],
},
]
return menus