Skip to content

Commit

Permalink
Merge pull request #132 from mekanix/feature/optional-model
Browse files Browse the repository at this point in the history
Generate optional models
  • Loading branch information
mekanix committed Apr 3, 2024
2 parents 70b6b31 + 542e49a commit c733f21
Show file tree
Hide file tree
Showing 6 changed files with 24 additions and 35 deletions.
2 changes: 1 addition & 1 deletion bin/security.sh
Original file line number Diff line number Diff line change
Expand Up @@ -6,4 +6,4 @@ export FREENIT_ENV="test"


setup no
bandit `find freenit -type f -name '*.py'`
bandit `find freenit -type f -name '*.py' | grep -v 'freenit/cli\.py'`
10 changes: 10 additions & 0 deletions freenit/models/ormar/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -39,3 +39,13 @@ class OrmarRoleMixin:
metadata=config.metadata,
engine=config.engine,
)


def generate_optional(Model):
class OptionalModel(Model):
pass

for field_name in OptionalModel.model_fields:
OptionalModel.model_fields[field_name].default = None

return OptionalModel
8 changes: 2 additions & 6 deletions freenit/models/ormar/role.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,8 @@
from .base import OrmarBaseModel, OrmarRoleMixin, ormar_config
from .base import OrmarBaseModel, OrmarRoleMixin, generate_optional, ormar_config


class Role(OrmarBaseModel, OrmarRoleMixin):
ormar_config = ormar_config.copy()


class RoleOptional(Role):
pass

for field_name in RoleOptional.model_fields:
RoleOptional.model_fields[field_name].default = None
RoleOptional = generate_optional(Role)
8 changes: 2 additions & 6 deletions freenit/models/ormar/theme.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import ormar

from .base import OrmarBaseModel, ormar_config
from .base import OrmarBaseModel, ormar_config, generate_optional


class Theme(OrmarBaseModel):
Expand All @@ -24,8 +24,4 @@ class Theme(OrmarBaseModel):
font_family_mono: str = ormar.Text()


class ThemeOptional(Theme):
pass

for field_name in ThemeOptional.model_fields:
ThemeOptional.model_fields[field_name].default = None
ThemeOptional = generate_optional(Theme)
18 changes: 8 additions & 10 deletions freenit/models/ormar/user.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,16 @@
from __future__ import annotations
from copy import deepcopy

import ormar
import ormar.exceptions
from fastapi import HTTPException

from freenit.auth import verify
from freenit.models.ormar.base import OrmarBaseModel, OrmarUserMixin, ormar_config
from freenit.models.ormar.base import (
OrmarBaseModel,
OrmarUserMixin,
generate_optional,
ormar_config,
)
from freenit.models.role import Role


Expand All @@ -31,11 +35,5 @@ class User(BaseUser, OrmarUserMixin):
roles = ormar.ManyToMany(Role, unique=True)


class UserOptional(User):
pass

for field_name in UserOptional.model_fields:
UserOptional.model_fields[field_name].default = None


UserOptionalPydantic = UserOptional.get_pydantic(exclude={"admin", "active"})
UserOptional = generate_optional(User)
UserOptionalPydantic = User.get_pydantic(exclude={"admin", "active"})
13 changes: 1 addition & 12 deletions freenit/models/safe.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,22 +2,11 @@
from freenit.models.user import User

if User.dbtype() == "ormar":
from ormar.queryset.field_accessor import FieldAccessor

RoleSafe = Role.get_pydantic(exclude={"users__password"})

include_fields = set()
for attr in dir(User):
a = getattr(User, attr, None)
if isinstance(a, FieldAccessor):
include_fields.add(attr)

UserSafe = User.get_pydantic(exclude={"password"}, include=include_fields)
UserSafe = User.get_pydantic(exclude={"password"})
elif User.dbtype() == "bonsai":
from freenit.config import getConfig

config = getConfig()
auth = config.get_model("user")

UserSafe = auth.UserSafe
RoleSafe = Role

0 comments on commit c733f21

Please sign in to comment.