Skip to content

Commit

Permalink
Linting and reorganize web.character.
Browse files Browse the repository at this point in the history
  • Loading branch information
gregersn committed Jan 18, 2025
1 parent 4542293 commit 97cf947
Show file tree
Hide file tree
Showing 13 changed files with 306 additions and 247 deletions.
26 changes: 1 addition & 25 deletions src/whathappened/core/sheets/mechanics/coc7e/convert.py
Original file line number Diff line number Diff line change
@@ -1,30 +1,6 @@
"""CoC conversion functions."""

import math

from whathappened.core.sheets.schema.utils import migrate


def half(value):
if not value:
return 0
if isinstance(value, str):
try:
value = int(value, 10)
except ValueError:
return 0
return math.floor(value / 2)


def fifth(value):
if not value:
return 0
if isinstance(value, str):
try:
value = int(value, 10)
except ValueError:
return 0
return math.floor(value / 5)
from whathappened.core.sheets.schema.utils import fifth, half, migrate


def convert_from_dholes(indata):
Expand Down
27 changes: 26 additions & 1 deletion src/whathappened/core/sheets/schema/utils.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
"""Schema and sheet utilities"""

import copy
from typing import Optional
import math
from typing import Optional, Union
from packaging.version import Version, parse

from whathappened.core.sheets.schema.base import (
Expand All @@ -13,6 +14,30 @@
SheetVersion = Version


def half(value: Union[int, str]):
"""Return half of a value, rounded down."""
if not value:
return 0
if isinstance(value, str):
try:
value = int(value, 10)
except ValueError:
return 0
return math.floor(value / 2)


def fifth(value: Union[int, str]):
"""Return the fifth of a value, rounded down."""
if not value:
return 0
if isinstance(value, str):
try:
value = int(value, 10)
except ValueError:
return 0
return math.floor(value / 5)


def up_or_down(from_version: SheetVersion, to_version: SheetVersion) -> int:
"""Deteremine if migration is up or down."""
if from_version > to_version:
Expand Down
43 changes: 7 additions & 36 deletions src/whathappened/web/character/__init__.py
Original file line number Diff line number Diff line change
@@ -1,47 +1,18 @@
"""Module for the interaction with character sheets in What Happened?"""

import math
from webassets.env import Environment

from whathappened.core.sheets.schema.utils import fifth, half
from whathappened.web.character.utils import datetimeformat, valuetostring

from . import routes # noqa: E402, F401 isort:skip
from .blueprints import bp


@bp.app_template_filter("datetimeformat")
def datetimeformat(value, formatstring: str = "%Y-%m-%d %H:%M:%S"):
"""Jinja filter for formatting datetimes."""
return value.strftime(formatstring)


@bp.app_template_filter("valuetostring")
def valuetostring(value):
if isinstance(value, dict):
return ", ".join(f"{k}: {v}" for k, v in value.items())
return value


@bp.app_template_filter("half")
def half(value):
if not value:
return 0
if isinstance(value, str):
try:
value = int(value, 10)
except ValueError:
return 0
return math.floor(value / 2)


@bp.app_template_filter("fifth")
def fifth(value):
if not value:
return 0
if isinstance(value, str):
try:
value = int(value, 10)
except ValueError:
return 0
return math.floor(value / 5)
bp.add_app_template_filter(datetimeformat)
bp.add_app_template_filter(valuetostring)
bp.add_app_template_filter(half)
bp.add_app_template_filter(fifth)


def register_assets(assets: Environment):
Expand Down
2 changes: 2 additions & 0 deletions src/whathappened/web/character/blueprints.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
"""Character blueprints."""

from flask import Blueprint

bp = Blueprint(
Expand Down
6 changes: 5 additions & 1 deletion src/whathappened/web/character/coc7e/forms.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
"""Forms for CoC7e."""

from wtforms import SelectField

from whathappened.core.sheets.mechanics.coc7e import GameTypes
Expand All @@ -6,7 +8,9 @@


class CreateForm(BaseCreateForm):
"""CoC7e create form."""

gametype = SelectField(
"Type",
choices=GameTypes,
choices=[(gt, gt) for gt in GameTypes],
)
15 changes: 9 additions & 6 deletions src/whathappened/web/character/coc7e/routes.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
"""Special routes for CoC7e."""

from flask import redirect, render_template, url_for, flash

from whathappened.core.database.models import LogEntry, Invite
Expand All @@ -7,7 +9,8 @@
from ..forms import SkillForm, SubskillForm


def view(id, character, editable):
def view(character_id, character, editable):
"""Custom view for CoC7e."""
subskillform = SubskillForm(prefix="subskillform")
if editable and subskillform.data and subskillform.validate_on_submit():
character.mechanics.add_subskill(
Expand All @@ -18,30 +21,30 @@ def view(id, character, editable):
f"add subskill {subskillform.name.data} "
+ f"under {subskillform.parent.data}",
user_id=current_user.id,
) # pyright: ignore[reportGeneralTypeIssues]
)
session.add(logentry)

character.store_data()
session.commit()
return redirect(url_for("character.view", id=id))
return redirect(url_for("character.view", id=character_id))

skillform = SkillForm(prefix="skillform")
if editable and skillform.data and skillform.validate_on_submit():
skills = character.skills()
for skill in skills:
if skillform.name.data == skill["name"]:
flash("Skill already exists")
return redirect(url_for("character.view", id=id))
return redirect(url_for("character.view", id=character_id))

character.add_skill(skillform.name.data)
character.store_data()
logentry = LogEntry(
character, f"add skill {subskillform.name.data}", user_id=current_user.id
) # pyright: ignore[reportGeneralTypeIssues]
)
session.add(logentry)

session.commit()
return redirect(url_for("character.view", id=id))
return redirect(url_for("character.view", id=character_id))

shared = Invite.query_for(character).count()

Expand Down
22 changes: 19 additions & 3 deletions src/whathappened/web/character/forms.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
"""Character forms."""

import json
import logging
from typing import Optional
Expand All @@ -13,20 +15,24 @@


class JsonString(object):
"""Validate string as JSON."""

def __init__(self, message: Optional[str] = None):
if not message:
message = "Field must be a valid JSON string"
self.message = message

def __call__(self, form: FlaskForm, field: Field):
def __call__(self, _: FlaskForm, field: Field):
try:
_ = json.loads(field.data)
except Exception:
except Exception as exc:
logger.error("Could not verify JSON data", exc_info=True)
raise ValidationError(self.message)
raise ValidationError(self.message) from exc


class ImportForm(FlaskForm):
"""Character importing form."""

title = StringField("Title", validators=[DataRequired()])
body = JsonField("Body", validators=[DataRequired()])
conversion = BooleanField("Convert")
Expand All @@ -35,27 +41,37 @@ class ImportForm(FlaskForm):


class EditForm(ImportForm):
"""Edit charcter data form."""

archived = BooleanField("Archived")


class CreateForm(FlaskForm):
"""Create new character form."""

title = StringField("Title", validators=[DataRequired()])
system = HiddenField("System", validators=[DataRequired()])
submit = SubmitField("Create")


class SkillForm(FlaskForm):
"""Edit skill form."""

name = StringField("Name", validators=[DataRequired()])
# value = IntegerField('Value', validators=[DataRequired()])
submit = SubmitField("Add")


class SubskillForm(FlaskForm):
"""Edit subskill form."""

name = StringField("Name", validators=[DataRequired()])
parent = HiddenField("Parent", validators=[DataRequired()])
submit = SubmitField("Add")


class DeleteForm(FlaskForm):
"""Delete character form."""

character_id = HiddenField("CharacterId", validators=[DataRequired()])
submit = SubmitField("Delete")
Loading

0 comments on commit 97cf947

Please sign in to comment.