A context manager that temporarily overrides the method on a request, additionally setting the `view.request` attribute. Usage: with override_method(view, request, 'POST') as request: ... # Do stuff with `view` and `request`
| 32 | |
| 33 | |
| 34 | class override_method: |
| 35 | """ |
| 36 | A context manager that temporarily overrides the method on a request, |
| 37 | additionally setting the `view.request` attribute. |
| 38 | |
| 39 | Usage: |
| 40 | |
| 41 | with override_method(view, request, 'POST') as request: |
| 42 | ... # Do stuff with `view` and `request` |
| 43 | """ |
| 44 | |
| 45 | def __init__(self, view, request, method): |
| 46 | self.view = view |
| 47 | self.request = request |
| 48 | self.method = method |
| 49 | self.action = getattr(view, 'action', None) |
| 50 | |
| 51 | def __enter__(self): |
| 52 | self.view.request = clone_request(self.request, self.method) |
| 53 | # For viewsets we also set the `.action` attribute. |
| 54 | action_map = getattr(self.view, 'action_map', {}) |
| 55 | self.view.action = action_map.get(self.method.lower()) |
| 56 | return self.view.request |
| 57 | |
| 58 | def __exit__(self, *args, **kwarg): |
| 59 | self.view.request = self.request |
| 60 | self.view.action = self.action |
| 61 | |
| 62 | |
| 63 | class WrappedAttributeError(Exception): |
no outgoing calls
no test coverage detected