Add custom project generator for apps based on Corporal

and make related changes to support that use case
This commit is contained in:
Lance Edgar 2023-05-05 00:18:38 -05:00
parent 4cb00eeab7
commit 89e16b6a35
11 changed files with 193 additions and 11 deletions

View file

View file

@ -0,0 +1,37 @@
# -*- coding: utf-8; -*-
"""
Corporal project generator
"""
from rattail.projects import PoserProjectGenerator
class CorporalProjectGenerator(PoserProjectGenerator):
"""
Generator for projects based on Corporal.
"""
key = 'corporal'
def normalize_context(self, context):
# set these first
context['has_db'] = True
context['has_web'] = True
context['alembic_version_locations'] = [
'rattail.db:alembic/versions',
'rattail_corepos.db:alembic/versions',
]
context['mako_directories'] = [
'{}.web:templates'.format(context['pkg_name']),
'corporal.web:templates',
'tailbone_corepos:templates',
'tailbone:templates',
]
# then do parent logic
context = super(CorporalProjectGenerator, self).normalize_context(context)
# add dependencies
context['requires']['Corporal'] = True
return context

View file

@ -0,0 +1,10 @@
## -*- coding: utf-8; mode: python; -*-
# -*- coding: utf-8; -*-
"""
${name} data models
"""
# bring in all of Corporal
from corporal.db.model import *
# TODO: import other/custom models here...

View file

@ -0,0 +1,14 @@
## -*- coding: utf-8; mode: conf; -*-
<%inherit file="rattail.projects:poser/package/templates/installer/rattail.conf.mako" />
${parent.body()}
####################
## preamble
####################
<%def name="render_group_preamble()">
${parent.render_group_preamble()}
[corepos]
foo = bar
</%def>

View file

@ -0,0 +1,15 @@
## -*- coding: utf-8; mode: python; -*-
# -*- coding: utf-8; -*-
"""
${name} Views
"""
from corporal.web.views import essentials
def includeme(config):
# include all views deemed "essential" for Corporal
essentials.defaults(config)
# TODO: include more (e.g. custom) views here as needed

View file

@ -35,12 +35,25 @@ class CorporalMenuHandler(base.MenuHandler):
reports_menu = self.make_reports_menu(request, include_poser=True)
other_menu = {
'title': "Other",
'type': 'menu',
'items': [
{
'title': "Generate New Project",
'route': 'generated_projects.create',
'perm': 'generated_projects.create',
},
],
}
admin_menu = self.make_admin_menu(request, include_stores=False)
menus = [
corepos_menu,
batch_menu,
reports_menu,
other_menu,
admin_menu,
]

View file

@ -3,16 +3,8 @@
Corporal Views
"""
from corporal.web.views import essentials
def includeme(config):
# core views
config.include('tailbone.views.essentials')
config.include('tailbone.views.poser')
# main views for CORE-POS
config.include('tailbone_corepos.views')
# batches
config.include('tailbone_corepos.views.batch.vendorcatalog')
config.include('tailbone_corepos.views.batch.coremember')
essentials.defaults(config)

View file

@ -0,0 +1,48 @@
# -*- coding: utf-8; -*-
################################################################################
#
# Rattail -- Retail Software Framework
# Copyright © 2010-2023 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 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 General Public License for more
# details.
#
# You should have received a copy of the GNU General Public License along with
# Rattail. If not, see <http://www.gnu.org/licenses/>.
#
################################################################################
"""
Essential views for convenient includes
"""
def defaults(config, **kwargs):
mod = lambda spec: kwargs.get(spec, spec)
# core views
config.include(mod('tailbone.views.essentials'))
config.include(mod('tailbone.views.poser'))
config.include(mod('tailbone.views.projects'))
# main views for CORE-POS
config.include(mod('tailbone_corepos.views'))
# batches
config.include(mod('tailbone_corepos.views.batch.vendorcatalog'))
config.include(mod('tailbone_corepos.views.batch.coremember'))
# corporal-specific
config.include(mod('corporal.web.views.supplemental'))
def includeme(config):
defaults(config)

View file

@ -0,0 +1,39 @@
# -*- coding: utf-8; -*-
"""
Project views
"""
from tailbone.views import ViewSupplement
class GeneratedProjectViewSupplement(ViewSupplement):
"""
View supplement for generating projects
"""
route_prefix = 'generated_projects'
def configure_form_corporal(self, f):
f.set_grouping([
("Naming", [
'name',
'pkg_name',
'pypi_name',
'organization',
]),
("Core", [
'extends_config',
'has_cli',
]),
("Database", [
'extends_db',
]),
])
# default settings
f.set_default('extends_config', False)
f.set_default('extends_db', False)
def includeme(config):
GeneratedProjectViewSupplement.defaults(config)

View file

@ -0,0 +1,8 @@
# -*- coding: utf-8; -*-
"""
Include all supplemental views
"""
def includeme(config):
config.include('corporal.web.views.projects')

View file

@ -107,5 +107,11 @@ setup(
'rattail.emails': [
'corporal = corporal.emails',
],
'rattail.projects': [
'corporal = corporal.projects.corporal:CorporalProjectGenerator',
],
},
)