def security_hash(self, request, form):
        """
        Calculates the security hash for the given HttpRequest and Form instances.

        Subclasses may want to take into account request-specific information,
        such as the IP address.
        """
        return security_hash(form)
def preview_full_clean(form):
    """
    In ``preview_post`` stage after running ``full_clean`` on original form
        - it drops all file fields and fill-in *_path fields

    because after in ``post_post`` stage it wont pass validation anyway,
    user doesn't upload file twice

    """

    super(form.__class__, form).full_clean()

    file_fields = [(fname, field) for fname, field in form.fields.iteritems()
        if isinstance(field, forms.FileField)]

    for fname, field in file_fields:
        tmp_dir = os.path.join(
            UPLOAD_DIR,
            TODAYS_DIR,
            security_hash(form)) 
        mkdir_p(tmp_dir)

        upload_cleanup()

        upload = form.cleaned_data[fname]

        if not upload:
            return  # just nop

        fd_name = os.sep.join((tmp_dir, upload.name))
        fd = open(fd_name, 'w')
        for chunk in upload.chunks():
            fd.write(chunk)
        fd.flush()

        # required for ImageField: django uses just .read() 
        # into PIL.Image() - otherwise it will be given empty file
        upload.seek(0)

        form.fields.pop(fname)

        path_fname = fname + PATH_SUFFIX
        form.cleaned_data[path_fname] = fd.name  # in view
        form.data[path_fname] = fd.name  # in template, as initial

        if isinstance(field, PreviewField):
            preview_fname = fname + PREVIEW_SUFFIX
            form.cleaned_data[preview_fname] = fd.name  # in view
            form.data[preview_fname] = fd.name  # in template, as initial