Coverage for /var/srv/projects/api.amasfac.comuna18.com/tmp/venv/lib/python3.9/site-packages/django/contrib/messages/storage/fallback.py: 32%

29 statements  

« prev     ^ index     » next       coverage.py v6.4.4, created at 2023-07-17 14:22 -0600

1from django.contrib.messages.storage.base import BaseStorage 

2from django.contrib.messages.storage.cookie import CookieStorage 

3from django.contrib.messages.storage.session import SessionStorage 

4 

5 

6class FallbackStorage(BaseStorage): 

7 """ 

8 Try to store all messages in the first backend. Store any unstored 

9 messages in each subsequent backend. 

10 """ 

11 

12 storage_classes = (CookieStorage, SessionStorage) 

13 

14 def __init__(self, *args, **kwargs): 

15 super().__init__(*args, **kwargs) 

16 self.storages = [ 

17 storage_class(*args, **kwargs) for storage_class in self.storage_classes 

18 ] 

19 self._used_storages = set() 

20 

21 def _get(self, *args, **kwargs): 

22 """ 

23 Get a single list of messages from all storage backends. 

24 """ 

25 all_messages = [] 

26 for storage in self.storages: 

27 messages, all_retrieved = storage._get() 

28 # If the backend hasn't been used, no more retrieval is necessary. 

29 if messages is None: 

30 break 

31 if messages: 

32 self._used_storages.add(storage) 

33 all_messages.extend(messages) 

34 # If this storage class contained all the messages, no further 

35 # retrieval is necessary 

36 if all_retrieved: 

37 break 

38 return all_messages, all_retrieved 

39 

40 def _store(self, messages, response, *args, **kwargs): 

41 """ 

42 Store the messages and return any unstored messages after trying all 

43 backends. 

44 

45 For each storage backend, any messages not stored are passed on to the 

46 next backend. 

47 """ 

48 for storage in self.storages: 

49 if messages: 

50 messages = storage._store(messages, response, remove_oldest=False) 

51 # Even if there are no more messages, continue iterating to ensure 

52 # storages which contained messages are flushed. 

53 elif storage in self._used_storages: 

54 storage._store([], response) 

55 self._used_storages.remove(storage) 

56 return messages