Adding slugs, refactoring
This commit is contained in:
@@ -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
|
||||
|
||||
|
||||
@@ -1,3 +0,0 @@
|
||||
from .root import RootController
|
||||
|
||||
__ALL__ = [RootController]
|
||||
|
||||
@@ -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,
|
||||
)
|
||||
@@ -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,
|
||||
)
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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,
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user