irongit

Enhanced time synchronization for drf views.

42 lines1.4 KBPython
1from django.db import models
2from rest_framework import exceptions
3
4from timecheck.settings import conf
5
6
7class InvalidServerDatetimeField(exceptions.APIException):
8 status_code = 500
9
10 def __init__(self, field_name: str, val: models.Model | object):
11 if isinstance(val, models.Model):
12 fields = {f.name: getattr(val, f.name) for f in val._meta.fields}
13 val_info = f"<Model {val.__class__.__name__}: {fields}>"
14 else:
15 val_info = repr(val)
16 super().__init__(
17 f"InvalidServerDatetimeField: {field_name} is not a valid datetime. {val_info} is a {type(val)}",
18 )
19
20
21class InvalidClientDatetimeField(exceptions.APIException):
22 status_code = 400
23
24 def __init__(self, field_name: str, val: str):
25 super().__init__(
26 f"InvalidClientDatetimeField: {field_name} header {val}",
27 )
28
29
30class NoUpdate(exceptions.APIException):
31 status_code = conf["noupdate_code"]
32
33 def __init__(self, request_method: str | None, code: int) -> None:
34 self.status_code = code
35 if request_method in ["POST", "PUT"]:
36 super().__init__(
37 "NoUpdate: Client has submitted older data than the server. Skipping update",
38 )
39 elif request_method == "GET":
40 super().__init__("NoUpdate: Client is already up to date")
41 else:
42 super().__init__("NoUpdate")