Why did you put end_time = end_time or datetime.now()
It works together with having the end_time=None default in the method signature. If the method is not given an end_time, it is None, and then it gets the value of datetime.now().
It is essentially a 1-line version of:
if not end_time:
end_time = datetime.now()
You can also use and in a similar way, but with a different meaning. E.g.:
some_value = obj and obj.attribute
I.e., if obj is None, obj.attribute will not get called (which would raise an exception), and some_value gets assigned the None.
This is again a more concise version of:
some_value = obj
some_value = obj.attribute
... or the much uglier (to me):
some_value = obj.attribute if obj else obj
And is this to check to se if the cleaning was started
Yes, but it is not really used in this code, and not very useful either, because the main way to get a cleaning object is with the start_cleaning method, so it is always at least started when you have it.