from ast import excepthandler from urllib import parse, response from django import urls from django.db import models from django.conf import settings class AdminAuditLog(models.Model): user = models.ForeignKey( settings.AUTH_USER_MODEL, on_delete=models.DO_NOTHING ) referrer = models.CharField(max_length=255) path = models.CharField(max_length=255) request_method = models.CharField(max_length=16) request_body = models.TextField() response_code = models.CharField(max_length=8) response_body = models.TextField() ip = models.GenericIPAddressField( null=True, blank=True) ua = models.CharField(max_length=256) # UserAgent created_at = models.DateTimeField(auto_now_add=True) class Meta: db_table = 'pingcap_admin_audit_logs' @property def description(self): _parse = parse.urlparse(parse.unquote(self.path or '')) _desc = '' try: _resolve = urls.resolve(_parse.path) view_class = _resolve.func.view_class request_method_name = self.request_method.lower() try: request_method = getattr(view_class, request_method_name) except AttributeError: return f'[Method Not Found] {_parse.path}' request_method_doc = request_method.__doc__ if request_method_doc and request_method_doc.startswith('audit_log:'): _desc = request_method.__doc__.split('audit_log:')[1] for k, v in _resolve.kwargs.items(): _desc += f' {k}: {v}' _desc = _desc.strip() if _parse.query: _query = dict(parse.parse_qsl(_parse.query)) if 'search' in _query: _desc += f' 搜索了: {_query["search"]}' if 'company_name' in _query: _desc += f' 公司名称: {_query["company_name"]}' except urls.exceptions.Resolver404: return f'[URL Not Found] {_parse.path}' return _desc