Source code for sni.api.models
"""
ESI related database models
"""
import mongoengine as me
from sni.user.models import User
from sni.utils import DAY
import sni.utils as utils
[docs]class CrashReportRequest(me.EmbeddedDocument):
"""
Represents a request made to the API.
"""
# cookies = me.DictField(default=None)
# hooks = me.DictField(default=None)
# auth = me.DynamicField(default=None)
# data = me.DynamicField(default=None, null=True)
# files = me.DictField(default=None, null=True)
# json = me.DynamicField(default=None, null=True)
headers = me.DictField(default=None, null=True)
"""Headers of the request"""
method = me.StringField(default=None)
"""HTTP method of the request"""
params = me.DynamicField(default=None, null=True)
"""URL parameters of the request"""
url = me.StringField(default=None)
"""URL of the request"""
[docs] def to_dict(self) -> dict:
"""
Returns a dict representation
"""
return {
"headers": self.headers,
"method": self.method,
"params": self.params,
"url": self.url,
}
[docs]class CrashReportToken(me.EmbeddedDocument):
"""
Represents a token in a crash report. See :class:`sni.uac.models.Token`
"""
created_on = me.DateTimeField()
"""See :class:`sni.uac.models.Token`"""
expires_on = me.DateTimeField()
"""See :class:`sni.uac.models.Token`"""
owner = me.ReferenceField(User)
"""See :class:`sni.uac.models.Token`"""
token_type = me.StringField()
"""See :class:`sni.uac.models.Token`"""
uuid = me.UUIDField()
"""See :class:`sni.uac.models.Token`"""
[docs] def to_dict(self) -> dict:
"""
Returns a dict representation
"""
return {
"created_on": str(self.created_on),
"expires_on": str(self.expires_on),
"owner": {
"authorized_to_login": self.owner.authorized_to_login,
"character_id": self.owner.character_id,
"character_name": self.owner.character_name,
"clearance_level": self.owner.clearance_level,
"created_on": str(self.owner.created_on),
"updated_on": str(self.owner.updated_on),
},
"token_type": self.token_type,
"uuid": str(self.uuid),
}
[docs]class CrashReport(me.Document):
"""
Information about a crash, i.e. an uncaught exception that occured during
an API request processing. (in fact, the exception is still cought by
:meth:`sni.api.server.exception_handler` as a last resort, and this is
where this class is used to save traces to the database).
"""
SCHEMA_VERSION = 1
"""Latest schema version for this collection"""
_version = me.IntField(default=SCHEMA_VERSION, required=True)
"""Schema version of this document"""
request = me.EmbeddedDocumentField(CrashReportRequest, required=True)
"""See :class:`sni.api.models.CrashReportRequest`"""
timestamp = me.DateTimeField(default=utils.now, required=True)
"""When the crash occured. This field is indexed in decreasing order."""
trace = me.ListField(me.StringField())
"""Python trace"""
token = me.EmbeddedDocumentField(CrashReportToken, null=True)
"""See :class:`sni.api.models.CrashReportToken`"""
meta = {
"indexes": [
"-timestamp",
{"fields": ["timestamp"], "expireAfterSeconds": 90 * DAY,},
]
}
def __repr__(self) -> str:
return f"<CrashReport: {self.pk} {self.timestamp}>"
[docs] def to_dict(self) -> dict:
"""
Returns a dict representation
"""
return {
"id": str(self.pk),
"request": self.request.to_dict(),
"timestamp": str(self.timestamp),
"token": self.token.to_dict() if self.token else None,
"trace": self.trace,
}