def initIndexesForm(request):
    """
    DocumentIndexForm/DocumentSearchForm initialization

    in case of GET returns an empty base form,
    in case of POST returns populated (from request) form instance.
    in both cases form is rendered with MDT index fields

    @param request: is a Django request object
    """
    details = None
    search = determine_search_req(request)
    try:
        # Try to use cached MDT's
        details = request.session['mdts']
    except KeyError:
        if search:
            session_var = 'search_docrule_id'
        else:
            session_var = 'indexing_docrule_id'

        # Get MDT's from CouchDB
        try:
            details = get_mdts_for_docrule(request.session[session_var])
            # Store MDT's into improvised cache
            request.session['mdts'] = details
        except KeyError:
            pass

    initial_data = {}
    if not search:
        if 'document_keys_dict' in request.session.iterkeys():
            initial_data = request.session['document_keys_dict']

    # Selecting form depending on request type
    if search:
        form = DocumentSearchOptionsForm()
    else:
        form = DocumentIndexForm()

    if details and not details == 'error':
        # MDT's exist for ths docrule adding fields to form
        if search:
            fields = render_fields_from_docrules(details, request.POST or None, search=True)
        else:
            fields = render_fields_from_docrules(details, request.POST or None)
        if fields:
            form.setFields(fields)

    if request.POST:
        # Populating ata into form for POST data
        form.setData(request.POST)
    elif initial_data:
        # Populating initial data for partially proper form rendering
        form.populateFormSecondary(initial_data)
    form.validation_ok()
    return form
def initEditIndexesForm(request, doc, given_indexes=None):
    """
    Edit form creating with population from existing document

    Inherits initIndexesForm with faking it's data to be rendered properly
    """
    initial_indexes = None
    docrule_id = str(doc.get_docrule().id)
    POST = request.POST
    # TODO: cashe MDTS
    mdts = get_mdts_for_docrule(docrule_id)
    # Faking POST request to populate from with initial indexes properly
    if not POST:
        # Constructing form indexes from previous data or doc metadata
        if given_indexes or doc.db_info:
            initial_indexes = construct_edit_indexes_data(mdts, given_indexes or doc.db_info)
            # Converting dates into strings if relevant.
            for key, value in initial_indexes.iteritems():
                # Metaclass based conversions to
                if value.__class__.__name__ == 'datetime':
                    initial_indexes[key] = value.strftime(settings.DATE_FORMAT)
            request.POST = initial_indexes
    form = EditDocumentIndexForm()
    if mdts and not mdts == 'error':
        # MDT's exist for this docrule adding fields to form
        fields = render_fields_from_docrules(mdts, request.POST or None)
        if fields:
            form.setFields(fields)
    if not POST:
        form.setData(initial_indexes)
    # TODO: test validation working here, if relevant
    else:
        form.setData(POST)
        form.validation_ok()
    return form
def initEditIndexesForm(request, doc, given_indexes=None):
    """
    Edit form creating with population from existing document

    Inherits initIndexesForm with faking it's data to be rendered properly

    @param request: is a Django request object
    @param doc: is a DMS Object() instance
    @param given_indexes: is a set of indexes to populate for upon initializations.
        e.g. instantiate form with provided data instead of empty fields.
    """
    initial_indexes = None
    docrule_id = str(doc.get_docrule().id)
    POST = request.POST
    # TODO: cashe MDTS
    mdts = get_mdts_for_docrule(docrule_id)
    # Faking POST request to populate from with initial indexes properly
    if not POST:
        # Constructing form indexes from previous data or doc metadata
        if given_indexes or doc.db_info:
            initial_indexes = construct_edit_indexes_data(mdts, given_indexes or doc.db_info)
            # Converting dates into strings if relevant.
            for key, value in initial_indexes.iteritems():
                # Metaclass based conversions to
                if value.__class__.__name__ == 'datetime':
                    initial_indexes[key] = value.strftime(settings.DATE_FORMAT)
            request.POST = initial_indexes
    form = EditDocumentIndexForm()
    if mdts and not mdts == 'error':
        # MDT's exist for this docrule adding fields to form
        fields = render_fields_from_docrules(mdts, request.POST or None)
        if fields:
            form.setFields(fields)
    if not POST:
        form.setData(initial_indexes)
    # TODO: test validation working here, if relevant
    else:
        form.setData(POST)
        form.validation_ok()
    return form