class ExtraSessionStorage(SessionStorage): """ SessionStorage that includes the property `validated_step_data` for storing cleaned form data per step. """ validated_step_data_key = 'validated_step_data' def init_data(self): super(ExtraSessionStorage, self).init_data() self.data[self.validated_step_data_key] = {} def reset(self): if self.prefix in self.request.session: super(ExtraSessionStorage, self).reset() else: self.init_data() def _get_validated_step_data(self): return self.data[self.validated_step_data_key] def _set_validated_step_data(self, validated_step_data): self.data[self.validated_step_data_key] = validated_step_data validated_step_data = lazy_property(_get_validated_step_data, _set_validated_step_data)
class A(object): def _get_do(self): raise NotImplementedError def _set_do(self, value): raise NotImplementedError do = lazy_property(_get_do, _set_do)
class DjangoFunctionalUtils(object): def _proxy_method(self, *args, **kwargs): print self print args print kwargs django_curry1 = django_functional.curry(_proxy_method, foo='bar') # REVIEW: Cannot mix args and unbound methods. # But curry() isn't a publicly documented method, and Django itself never # mixes the two. django_curry2 = django_functional.curry(_proxy_method, 17, foo='bar') # FAIL. This doesn't work. python_partial1 = functools.partial(_proxy_method, 17, foo='bar') # This works. def python_partial2(self, *args, **kwargs): return functools.partial(self._proxy_method, 17, foo='bar')(*args, **kwargs) # But then you might as well do this. def python_partial3(self, *args, **kwargs): return self._proxy_method(17, foo='bar', *args, **kwargs) # Check out self.__dict__ before and after accessing self.cached_property. @django_functional.cached_property def cached_property(self): return ', '.join(itertools.imap(unicode, xrange(100))) def _get_property(self): return "property" python_property = property(_get_property) django_property = django_functional.lazy_property(_get_property)
class BaseStorage(object): step_key = 'step' step_data_key = 'step_data' step_files_key = 'step_files' extra_data_key = 'extra_data' def __init__(self, prefix, request=None, file_storage=None): self.prefix = 'wizard_%s' % prefix self.request = request self.file_storage = file_storage self._files = {} def init_data(self): self.data = { self.step_key: None, self.step_data_key: {}, self.step_files_key: {}, self.extra_data_key: {}, } def reset(self): # Delete temporary files before breaking reference to them. wizard_files = self.data[self.step_files_key] for step_files in six.itervalues(wizard_files): for step_file in six.itervalues(step_files): self.file_storage.delete(step_file['tmp_name']) self.init_data() def _get_current_step(self): return self.data[self.step_key] def _set_current_step(self, step): self.data[self.step_key] = step current_step = lazy_property(_get_current_step, _set_current_step) def _get_extra_data(self): return self.data[self.extra_data_key] def _set_extra_data(self, extra_data): self.data[self.extra_data_key] = extra_data extra_data = lazy_property(_get_extra_data, _set_extra_data) def get_step_data(self, step): # When reading the serialized data, upconvert it to a MultiValueDict, # some serializers (json) don't preserve the type of the object. values = self.data[self.step_data_key].get(step, None) if values is not None: values = MultiValueDict(values) return values def set_step_data(self, step, cleaned_data): # If the value is a MultiValueDict, convert it to a regular dict of the # underlying contents. Some serializers call the public API on it (as # opposed to the underlying dict methods), in which case the content # can be truncated (__getitem__ returns only the first item). if isinstance(cleaned_data, MultiValueDict): cleaned_data = dict(cleaned_data.lists()) self.data[self.step_data_key][step] = cleaned_data @property def current_step_data(self): return self.get_step_data(self.current_step) def get_step_files(self, step): wizard_files = self.data[self.step_files_key].get(step, {}) if wizard_files and not self.file_storage: raise NoFileStorageConfigured( "You need to define 'file_storage' in your " "wizard view in order to handle file uploads.") files = {} for field, field_dict in six.iteritems(wizard_files): field_dict = field_dict.copy() tmp_name = field_dict.pop('tmp_name') if (step, field) not in self._files: self._files[(step, field)] = UploadedFile( file=self.file_storage.open(tmp_name), **field_dict) files[field] = self._files[(step, field)] return files or None def set_step_files(self, step, files): if files and not self.file_storage: raise NoFileStorageConfigured( "You need to define 'file_storage' in your " "wizard view in order to handle file uploads.") if step not in self.data[self.step_files_key]: self.data[self.step_files_key][step] = {} for field, field_file in six.iteritems(files or {}): tmp_filename = self.file_storage.save(field_file.name, field_file) file_dict = { 'tmp_name': tmp_filename, 'name': field_file.name, 'content_type': field_file.content_type, 'size': field_file.size, 'charset': field_file.charset } self.data[self.step_files_key][step][field] = file_dict @property def current_step_files(self): return self.get_step_files(self.current_step) def update_response(self, response): def post_render_callback(response): for file in self._files.values(): if not file.closed: file.close() if hasattr(response, 'render'): response.add_post_render_callback(post_render_callback) else: post_render_callback(response)
class BaseStorage(object): step_key = 'step' step_data_key = 'step_data' step_files_key = 'step_files' extra_data_key = 'extra_data' def __init__(self, prefix, request=None, file_storage=None): self.prefix = 'wizard_%s' % prefix self.request = request self.file_storage = file_storage def init_data(self): self.data = { self.step_key: None, self.step_data_key: {}, self.step_files_key: {}, self.extra_data_key: {}, } def reset(self): self.init_data() def _get_current_step(self): return self.data[self.step_key] def _set_current_step(self, step): self.data[self.step_key] = step current_step = lazy_property(_get_current_step, _set_current_step) def _get_extra_data(self): return self.data[self.extra_data_key] or {} def _set_extra_data(self, extra_data): self.data[self.extra_data_key] = extra_data extra_data = lazy_property(_get_extra_data, _set_extra_data) def get_step_data(self, step): return self.data[self.step_data_key].get(step, None) def set_step_data(self, step, cleaned_data): self.data[self.step_data_key][step] = cleaned_data @property def current_step_data(self): return self.get_step_data(self.current_step) def get_step_files(self, step): wizard_files = self.data[self.step_files_key].get(step, {}) if wizard_files and not self.file_storage: raise NoFileStorageConfigured files = {} for field, field_dict in wizard_files.iteritems(): field_dict = dict((smart_str(k), v) for k, v in field_dict.iteritems()) tmp_name = field_dict.pop('tmp_name') files[field] = UploadedFile( file=self.file_storage.open(tmp_name), **field_dict) return files or None def set_step_files(self, step, files): if files and not self.file_storage: raise NoFileStorageConfigured if step not in self.data[self.step_files_key]: self.data[self.step_files_key][step] = {} for field, field_file in (files or {}).iteritems(): tmp_filename = self.file_storage.save(field_file.name, field_file) file_dict = { 'tmp_name': tmp_filename, 'name': field_file.name, 'content_type': field_file.content_type, 'size': field_file.size, 'charset': field_file.charset } self.data[self.step_files_key][step][field] = file_dict @property def current_step_files(self): return self.get_step_files(self.current_step) def update_response(self, response): pass
class BaseStorage(object): step_key = 'step' step_data_key = 'step_data' step_files_key = 'step_files' extra_data_key = 'extra_data' def __init__(self, prefix, request=None, file_storage=None): self.prefix = 'wizard_%s' % prefix self.request = request self.file_storage = file_storage def init_data(self): self.data = { self.step_key: None, self.step_data_key: {}, self.step_files_key: {}, self.extra_data_key: {}, } def reset(self): self.init_data() def _get_current_step(self): return self.data[self.step_key] def _set_current_step(self, step): self.data[self.step_key] = step current_step = lazy_property(_get_current_step, _set_current_step) def _get_extra_data(self): return self.data[self.extra_data_key] or {} def _set_extra_data(self, extra_data): self.data[self.extra_data_key] = extra_data extra_data = lazy_property(_get_extra_data, _set_extra_data) def get_step_data(self, step): # When reading the serialized data, upconvert it to a MultiValueDict, # some serializers (json) don't preserve the type of the object. values = self.data[self.step_data_key].get(step, None) if values is not None: values = MultiValueDict(values) return values def set_step_data(self, step, cleaned_data): # If the value is a MultiValueDict, convert it to a regular dict of the # underlying contents. Some serializers call the public API on it (as # opposed to the underlying dict methods), in which case the content # can be truncated (__getitem__ returns only the first item). if isinstance(cleaned_data, MultiValueDict): cleaned_data = dict(cleaned_data.lists()) self.data[self.step_data_key][step] = cleaned_data @property def current_step_data(self): return self.get_step_data(self.current_step) def get_step_files(self, step): wizard_files = self.data[self.step_files_key].get(step, {}) if wizard_files and not self.file_storage: raise NoFileStorageConfigured files = {} for field, field_dict in wizard_files.iteritems(): field_dict = dict((smart_str(k), v) for k, v in field_dict.iteritems()) tmp_name = field_dict.pop('tmp_name') files[field] = UploadedFile( file=self.file_storage.open(tmp_name), **field_dict) return files or None def set_step_files(self, step, files): if files and not self.file_storage: raise NoFileStorageConfigured if step not in self.data[self.step_files_key]: self.data[self.step_files_key][step] = {} for field, field_file in (files or {}).iteritems(): tmp_filename = self.file_storage.save(field_file.name, field_file) file_dict = { 'tmp_name': tmp_filename, 'name': field_file.name, 'content_type': field_file.content_type, 'size': field_file.size, 'charset': field_file.charset } self.data[self.step_files_key][step][field] = file_dict @property def current_step_files(self): return self.get_step_files(self.current_step) def update_response(self, response): pass