Adding slugs, refactoring

This commit is contained in:
evilchili
2024-01-28 22:14:50 -08:00
parent 64451ddf8b
commit 8f17ddfb05
10 changed files with 151 additions and 58 deletions
+1 -1
View File
@@ -9,7 +9,7 @@ from wsgiref.simple_server import make_server
import webhelpers2
import tw2.core
from ttfrog.webserver.controllers import RootController
from ttfrog.webserver.controllers.root import RootController
from ttfrog.db import db
import ttfrog.path
-3
View File
@@ -1,3 +0,0 @@
from .root import RootController
__ALL__ = [RootController]
+19
View File
@@ -0,0 +1,19 @@
import inspect
from tg import flash
from tg import TGController
from tg import tmpl_context
from markupsafe import Markup
class BaseController(TGController):
def _before(self, *args, **kwargs):
tmpl_context.project_name = 'TableTop Frog'
def output(self, **kwargs) -> dict:
return dict(
page=inspect.stack()[1].function,
flash=Markup(flash.render('flash', use_js=False)),
**kwargs,
)
+54 -11
View File
@@ -1,29 +1,72 @@
import base64
import hashlib
import logging
from tg import expose
from tg import TGController
from tg import flash
from tg import validate
from tg.controllers.util import redirect
from ttfrog.db import db
from ttfrog.db.schema import Character
from ttfrog.webserver.controllers.base import BaseController
from ttfrog.webserver.widgets import CharacterSheet
class CharacterSheetController(TGController):
class CharacterSheetController(BaseController):
@expose()
def _lookup(self, *parts):
return FormController(parts[0]), parts[1:]
slug = parts[0] if parts else ''
return FormController(slug), parts[1:] if len(parts) > 1 else []
class FormController:
class FormController(BaseController):
def __init__(self, slug: str):
super().__init__()
self.character = dict()
if slug:
self.load(slug)
self.load_from_slug(slug)
def load(self, slug: str) -> None:
@property
def uri(self):
if self.character:
return f"/sheet/{self.character['slug']}/{self.character['name']}"
else:
return None
@property
def all_characters(self):
return [row._mapping for row in db.query(Character).all()]
def load_from_slug(self, slug) -> None:
self.character = db.query(Character).filter(Character.columns.slug == slug)[0]._mapping
def save(self, fields) -> str:
rec = dict()
if not self.character:
result, error = db.insert(Character, **fields)
if error:
return error
fields['id'] = result.inserted_primary_key[0]
fields['slug'] = db.slugify(fields)
else:
rec = dict(**self.character)
rec.update(**fields)
result, error = db.update(Character, **rec)
self.load_from_slug(rec['slug'])
if not error:
flash(f"{self.character['name']} updated!")
return redirect(self.uri)
flash(error)
@expose('character_sheet.html')
def _default(self, *args, **kwargs):
if kwargs:
db.update(Character, **kwargs)
self.load(self.character['slug'])
return dict(page='sheet', form=CharacterSheet, character=self.character)
@validate(form=CharacterSheet)
def _default(self, *args, **fields):
if fields:
return self.save(fields)
return self.output(
form=CharacterSheet,
character=self.character,
all_characters=self.all_characters,
)
+5 -7
View File
@@ -1,18 +1,16 @@
from tg import expose
from tg import TGController
from tg import tmpl_context
from ttfrog.db import db
from ttfrog.webserver.controllers.base import BaseController
from ttfrog.webserver.controllers.character_sheet import CharacterSheetController
class RootController(TGController):
class RootController(BaseController):
# serve character sheet interface on /sheet
sheet = CharacterSheetController()
def _before(self, *args, **kwargs):
tmpl_context.project_name = 'TableTop Frog'
@expose('index.html')
def index(self):
ancestries = [row._mapping for row in db.query(db.ancestry).all()]
return dict(page='index', content=str(ancestries))
return self.output(content=str(ancestries))
+16 -8
View File
@@ -1,13 +1,21 @@
import tw2.core
import tw2.core as twc
import tw2.forms
from tg import lurl
from ttfrog.db import db
class CharacterSheet(tw2.forms.Form):
class child(tw2.forms.TableLayout):
name = tw2.forms.TextField()
level = tw2.forms.TextField()
ancestry_name = tw2.forms.TextField(label='Ancestry')
id = tw2.forms.HiddenField()
action = ''
class child(tw2.forms.TableLayout):
name = tw2.forms.TextField(validator=twc.Required)
level = tw2.forms.SingleSelectField(
prompt_text=None,
options=range(1, 21),
validator=twc.validation.IntValidator(min=1, max=20)
)
ancestry_name = tw2.forms.SingleSelectField(
label='Ancestry',
prompt_text=None,
options=twc.Deferred(lambda: [a.name for a in db.query(db.ancestry)]),
validator=twc.Required,
)