| 1 | from django.db import models |
| 2 | from rest_framework import exceptions |
| 3 | |
| 4 | from timecheck.settings import conf |
| 5 | |
| 6 | |
| 7 | class 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 | |
| 21 | class 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 | |
| 30 | class 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") |