Skip to content

Commit

Permalink
Merge pull request #106 from MEHRSHAD-MIRSHEKARY/feat/validators
Browse files Browse the repository at this point in the history
🔧 ✨ Feat/validators
  • Loading branch information
ARYAN-NIKNEZHAD authored Oct 4, 2024
2 parents 66a4d0f + 6f81bdc commit 3d24dc7
Show file tree
Hide file tree
Showing 7 changed files with 111 additions and 14 deletions.
4 changes: 2 additions & 2 deletions django_logging/formatters/__init__.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from .colored_formatter import ColoredFormatter
from .flat_formatter import FLATFormatter
from .json_formatter import JSONFormatter # pylint: disable=E0401, E0611
from .xml_formatter import XMLFormatter # pylint: disable=E0401, E0611
from .json_formatter import JSONFormatter
from .xml_formatter import XMLFormatter
1 change: 0 additions & 1 deletion django_logging/formatters/base.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import re
from datetime import datetime
from logging import Formatter, LogRecord
from typing import Any, Dict, List, Optional, Union

Expand Down
4 changes: 1 addition & 3 deletions django_logging/formatters/flat_formatter.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
from logging import LogRecord

from django_logging.formatters.base import ( # pylint: disable=E0401, E0611
BaseStructuredFormatter,
)
from django_logging.formatters.base import BaseStructuredFormatter


class FLATFormatter(BaseStructuredFormatter):
Expand Down
4 changes: 1 addition & 3 deletions django_logging/formatters/xml_formatter.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,7 @@
from typing import Any
from xml.dom import minidom # nosec B408

from django_logging.formatters.base import ( # pylint: disable=E0401, E0611
BaseStructuredFormatter,
)
from django_logging.formatters.base import BaseStructuredFormatter


class XMLFormatter(BaseStructuredFormatter):
Expand Down
4 changes: 1 addition & 3 deletions django_logging/middleware/monitor_log_size.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,7 @@
from django.http import HttpRequest, HttpResponseBase
from django.utils.timezone import now

from django_logging.middleware.base import ( # pylint: disable=E0401, E0611
BaseMiddleware,
)
from django_logging.middleware.base import BaseMiddleware

logger = logging.getLogger(__name__)

Expand Down
37 changes: 36 additions & 1 deletion django_logging/settings/checks.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,23 +2,29 @@

from django.core.checks import Error, register

from django_logging.constants import DefaultLoggingSettings
from django_logging.constants import ALLOWED_FILE_FORMAT_TYPES, DefaultLoggingSettings
from django_logging.utils.get_conf import (
get_config,
get_log_dir_size_limit,
is_auto_initialization_enabled,
is_initialization_message_enabled,
is_log_sql_queries_enabled,
)
from django_logging.validators.config_validators import (
validate_boolean_setting,
validate_date_format,
validate_directory,
validate_email_notifier,
validate_extra_log_files,
validate_format_option,
validate_integer_setting,
validate_log_file_format_types,
validate_log_levels,
)
from django_logging.validators.email_settings_validator import check_email_settings


# pylint: disable=too-many-locals
@register()
def check_logging_settings(app_configs: Dict[str, Any], **kwargs: Any) -> List[Error]:
"""Check and validate logging settings in the Django configuration.
Expand Down Expand Up @@ -109,6 +115,25 @@ def check_logging_settings(app_configs: Dict[str, Any], **kwargs: Any) -> List[E
)
)

# Validate LOG_FILE_FORMAT_TYPES
log_file_format_types = log_settings.get("log_file_format_types", {})
errors.extend(
validate_log_file_format_types(
log_file_format_types,
"LOG_FILE_FORMAT_TYPES",
logging_defaults.log_levels,
ALLOWED_FILE_FORMAT_TYPES + ["NORMAL"],
)
)

# Validate EXTRA_LOG_FILES
extra_log_files = log_settings.get("extra_log_files", {})
errors.extend(
validate_extra_log_files(
extra_log_files, "EXTRA_LOG_FILES", logging_defaults.log_levels
)
)

# Validate LOG_CONSOLE_FORMAT
log_console_format = log_settings.get("console_format")
errors.extend(validate_format_option(log_console_format, "LOG_CONSOLE_FORMAT")) # type: ignore
Expand Down Expand Up @@ -145,6 +170,16 @@ def check_logging_settings(app_configs: Dict[str, Any], **kwargs: Any) -> List[E
)
)

# Validate LOG_SQL_QUERIES_ENABLE
errors.extend(
validate_boolean_setting(is_log_sql_queries_enabled(), "LOG_SQL_QUERIES_ENABLE")
)

# Validate LOG_DIR_SIZE_LIMIT
errors.extend(
validate_integer_setting(get_log_dir_size_limit(), "LOG_DIR_SIZE_LIMIT")
)

# Validate LOG_EMAIL_NOTIFIER
log_email_notifier = log_settings.get("log_email_notifier")
errors.extend(validate_email_notifier(log_email_notifier)) # type: ignore
Expand Down
71 changes: 70 additions & 1 deletion django_logging/validators/config_validators.py
Original file line number Diff line number Diff line change
Expand Up @@ -246,7 +246,76 @@ def validate_integer_setting(value: int, config_name: str) -> List[Error]:
Error(
f"{config_name} is not a valid integer.",
hint=f"Ensure {config_name} is a valid positive integer",
id=f"django_logging.E021_{config_name}",
id=f"django_logging.E019_{config_name}",
)
)
return errors


def validate_log_file_format_types(
format_types: Dict,
config_name: str,
valid_levels: LogLevels,
valid_formats: List[str],
) -> List[Error]:
errors = []
if not isinstance(format_types, dict):
errors.append(
Error(
f"{config_name} is not a dictionary.",
hint=f"Ensure {config_name} is a dictionary with log levels as keys.",
id=f"django_logging.E022_{config_name}",
)
)
else:
for level, format_type in format_types.items():
if level not in valid_levels:
errors.append(
Error(
f"Invalid log level '{level}' in {config_name}.",
hint=f"Valid log levels are: {valid_levels}.",
id=f"django_logging.E023_{config_name}",
)
)
elif format_type.upper() not in valid_formats:
errors.append(
Error(
f"Invalid log format type '{format_type}' for level '{level}' in {config_name}.",
hint=f"Valid format types are: {valid_formats}.",
id=f"django_logging.E024_{config_name}",
)
)
return errors


def validate_extra_log_files(
extra_log_files: Dict, config_name: str, valid_levels: LogLevels
) -> List[Error]:
errors = []
if not isinstance(extra_log_files, dict):
errors.append(
Error(
f"{config_name} is not a dictionary.",
hint=f"Ensure {config_name} is a dictionary with log levels as keys.",
id=f"django_logging.E025_{config_name}",
)
)
else:
for level, value in extra_log_files.items():
if level not in valid_levels:
errors.append(
Error(
f"Invalid log level '{level}' in {config_name}.",
hint=f"Valid log levels are: {valid_levels}.",
id=f"django_logging.E026_{config_name}",
)
)
elif not isinstance(value, bool):
errors.append(
Error(
f"Invalid value '{value}' for level '{level}' in {config_name}.",
hint="Value must be either True or False.",
id=f"django_logging.E027_{config_name}",
)
)
return errors

0 comments on commit 3d24dc7

Please sign in to comment.