use izzylog and a few fixes

This commit is contained in:
Izalia Mae 2021-08-17 15:39:15 -04:00
parent c8663acc45
commit 11aaaf3499
8 changed files with 29 additions and 37 deletions

View file

@ -2,10 +2,10 @@ import sys
from os import getppid, environ as env from os import getppid, environ as env
from datetime import datetime from datetime import datetime
from enum import Enum from enum import IntEnum
class Levels(Enum): class Levels(IntEnum):
CRITICAL = 60, CRITICAL = 60,
ERROR = 50 ERROR = 50
WARNING = 40 WARNING = 40
@ -55,7 +55,7 @@ class Log:
def set_config(self, key, value): def set_config(self, key, value):
if key == 'level' and type(value) == str: if key == 'level' and type(value) in [str, int]:
value = self.parse_level(value) value = self.parse_level(value)
setattr(self, key, value) setattr(self, key, value)
@ -73,7 +73,7 @@ class Log:
if isinstance(level, str): if isinstance(level, str):
Levels[level.upper()] Levels[level.upper()]
if level.value < self.level.value: if level < self.level:
return return
default = self.name == 'Default' default = self.name == 'Default'

View file

@ -6,7 +6,7 @@ from multidict import CIMultiDict
from multiprocessing import cpu_count, current_process from multiprocessing import cpu_count, current_process
from urllib.parse import parse_qsl, urlparse from urllib.parse import parse_qsl, urlparse
from izzylib import DotDict, Path, logging from izzylib import DotDict, Path, izzylog as logging
from izzylib.template import Template from izzylib.template import Template
from .config import Config, UserLevel from .config import Config, UserLevel
@ -81,16 +81,16 @@ class Application(sanic.Sanic):
self.register_middleware(mw.handler, mw.attach) self.register_middleware(mw.handler, mw.attach)
def get_menu_item(self, name, level=0): def get_menu_item(self, name):
return self.cfg.menu[parse_level(level)][name] return self.cfg.menu[name]
def set_menu_item(self, name, path, level=0): def set_menu_item(self, name, path, level=0):
self.cfg.menu[parse_level(level)][name] = path self.cfg.menu[name] = (path, parse_level(level))
def del_menu_item(self, name, level=0): def del_menu_item(self, name):
del self.cfg.menu[parse_level(level)][name] del self.cfg.menu[name]
def start(self): def start(self):
@ -123,12 +123,12 @@ class Application(sanic.Sanic):
def parse_level(level): def parse_level(level):
if type(level) == int: if type(level) == int:
new_level = UserLevel(level) level = UserLevel(level)
elif type(level) == str: elif type(level) == str:
new_level = UserLevel[level.upper()] level = UserLevel[level.upper()]
elif type(level) != UserLevel: elif type(level) != UserLevel:
raise TypeError(f'User level must be a string, integer, or UserLevel, not a {level.__class__.__name__}') raise TypeError(f'User level must be a string, integer, or UserLevel, not a {level.__class__.__name__}')
return new_level return level

View file

@ -1,4 +1,4 @@
from enum import Enum from enum import IntEnum
from izzylib import DotDict from izzylib import DotDict
from multiprocessing import cpu_count from multiprocessing import cpu_count
@ -6,7 +6,7 @@ from .request import Request
from .response import Response from .response import Response
class UserLevel(Enum): class UserLevel(IntEnum):
GUEST = 0 GUEST = 0
USER = 10 USER = 10
MODERATOR = 20 MODERATOR = 20
@ -35,12 +35,7 @@ class Config(DotDict):
tpl_context = None, tpl_context = None,
tpl_autoescape = True, tpl_autoescape = True,
tpl_default = True, tpl_default = True,
menu = { menu = {}
UserLevel.GUEST: {},
UserLevel.USER: {},
UserLevel.MODERATOR: {},
UserLevel.ADMIN: {}
}
) )
@ -55,9 +50,6 @@ class Config(DotDict):
def __setitem__(self, key, value): def __setitem__(self, key, value):
if key == 'menu':
raise KeyError('Use the Application.set_menu_item function to set menu items')
if key not in self.defaults.keys(): if key not in self.defaults.keys():
raise KeyError(f'Invalid config key {key}') raise KeyError(f'Invalid config key {key}')

View file

@ -1,5 +1,6 @@
import traceback import traceback
from izzylib import izzylog as logging
from jinja2.exceptions import TemplateNotFound from jinja2.exceptions import TemplateNotFound
from .response import Response from .response import Response
@ -14,12 +15,10 @@ class GenericError:
def __call__(self): def __call__(self):
return self.error, self.handler return self.error, lambda request, exception: self.handler(request, Response(self.app, request), exception)
def handler(self, request, exception): def handler(self, request, response, exception):
response = Response(self.app, request)
try: try:
status = exception.status_code status = exception.status_code
msg = str(exception) msg = str(exception)
@ -42,6 +41,6 @@ class MissingTemplateError(GenericError):
error = TemplateNotFound error = TemplateNotFound
def handler(self, request, exception): def handler(self, request, response, exception):
logging.error('TEMPLATE_ERROR:', f'{exception.__class__.__name__}: {str(exception)}') logging.error('TEMPLATE_ERROR:', f'{exception.__class__.__name__}: {str(exception)}')
return request.response.html('I\'m a dingleberry and forgot to create a template for this page', 500) return response.error('I\'m a dingleberry and forgot to create a template for this page', 500)

View file

@ -27,8 +27,9 @@
#menu.section #menu.section
.title-item.item << Menu .title-item.item << Menu
#items #items
-for label, path in cfg.menu.items() -for label, data in cfg.menu.items()
.item -> %a href='{{cfg.proto}}://{{cfg.web_host}}{{path}}' << {{label}} -if request.user_level >= data[1]
.item -> %a href='{{cfg.proto}}://{{cfg.web_host}}{{data[0]}}' << {{label}}
#content-body.section #content-body.section
-block content -block content

View file

@ -1,7 +1,7 @@
import multiprocessing import multiprocessing
from datetime import datetime, timedelta, timezone from datetime import datetime, timedelta, timezone
from izzylib import logging from izzylib import izzylog as logging, logging as applog
from . import start_time from . import start_time
@ -37,4 +37,4 @@ class AccessLog(MiddlewareBase):
uagent = request.headers.get('user-agent', 'None') uagent = request.headers.get('user-agent', 'None')
address = request.headers.get('x-real-ip', request.forwarded.get('for', request.remote_addr)) address = request.headers.get('x-real-ip', request.forwarded.get('for', request.remote_addr))
logging.info(f'({multiprocessing.current_process().name}) {address} {request.method} {request.path} {response.status} "{uagent}"') applog.info(f'({multiprocessing.current_process().name}) {address} {request.method} {request.path} {response.status} "{uagent}"')

View file

@ -10,6 +10,7 @@ class Request(sanic.request.Request):
self.Headers = Headers(headers) self.Headers = Headers(headers)
self.Data = Data(self) self.Data = Data(self)
self.template = self.app.template self.template = self.app.template
self.user_level = 0
self.setup() self.setup()

View file

@ -147,7 +147,7 @@ class Response:
**self.default_theme **self.default_theme
}) })
html = self.app.template.render(tplfile, context, request=self, pprint=pprint) html = self.app.template.render(tplfile, context, request=self.request, pprint=pprint)
return self.html(html, headers=headers, status=status, content_type=content_type, cookies=cookies) return self.html(html, headers=headers, status=status, content_type=content_type, cookies=cookies)
@ -195,10 +195,9 @@ class Response:
ctype = self.content_types.get(content_type, content_type) ctype = self.content_types.get(content_type, content_type)
self.body = body self.body = body
self.headers = headers
self.status = status self.status = status
self.content_type = content_type self.content_type = content_type
self.headers = headers self.headers.update(headers)
self.headers.pop('content-type', None) self.headers.pop('content-type', None)