Coverage for mongo/base.py: 100%

44 statements  

« prev     ^ index     » next       coverage.py v7.9.2, created at 2026-07-24 16:42 +0000

1from . import engine 

2from mongoengine.errors import * 

3import logging 

4 

5__all__ = ['MongoBase'] 

6 

7 

8class MongoBase: 

9 qs_filter = {} 

10 

11 def __init_subclass__(cls, engine, **kwargs): 

12 super().__init_subclass__(**kwargs) 

13 cls.engine = engine 

14 

15 def __new__(cls, pk, *args, **kwargs): 

16 if isinstance(pk, cls): 

17 return pk 

18 new = super().__new__(cls) 

19 # got a engine instance 

20 if isinstance(pk, new.engine): 

21 new.obj = pk 

22 else: 

23 try: 

24 new.obj = new.engine.objects(pk=pk).get() 

25 except engine.DoesNotExist: 

26 new.obj = new.engine(id=pk) 

27 return new 

28 

29 def __getattr__(self, name): 

30 return self.obj.__getattribute__(name) 

31 

32 def __setattr__(self, name, value): 

33 if name in self.engine._fields: 

34 self.obj.__setattr__(name, value) 

35 else: 

36 super().__setattr__(name, value) 

37 

38 def __eq__(self, other): 

39 return self and other is not None and self.pk == other.pk 

40 

41 def __bool__(self): 

42 try: 

43 return self._qs.filter(pk=self.pk, **self.qs_filter).__bool__() 

44 except ValidationError: 

45 return False 

46 

47 def __str__(self): 

48 return f'{self.__class__.__name__.lower()} [{self.pk}]' 

49 

50 def __repr__(self): 

51 return self.obj.to_json() if self else '{}' 

52 

53 def reload(self, *fields): 

54 if self: 

55 self.obj.reload(*fields) 

56 return self 

57 

58 @property 

59 def logger(self): 

60 return logging.getLogger(__name__)