Пример #1
0
def check_for_forbidden_new_keys_created(document_indexes, docrule, user):
    """Checks for user ability to add new key's value

    @param document_indexes is a set of user entered indexing data of specific document
    @param docrule is current docrule id
    @param user is a current request.user"""
    user_locked_keys = []
    mdts = get_mdts_for_docrule(docrule)
    manager = MetaDataTemplateManager()
    # Parsing MDT's
    admin_restricted_keys, locked_keys = manager.get_restricted_keys_names(mdts)
    # doing nothing for 'admincreate' keys if user has permissions or is superuser
    permit = False
    if user.groups.all():
        for group in user.groups.all():
            if group.name == SEC_GROUP_NAMES['edit_fixed_indexes']:
                permit = True
    if user.is_superuser or permit:
        admin_restricted_keys = []
    # Checking all keys locked for editing to staff or superuser only
    for key in admin_restricted_keys:
        value = document_indexes[key]
        exists = check_docs_for_existence(key, value, docrule)
        if not exists:
            user_locked_keys.append((key, 'adminlock'))
            # Checking all the keys that are marked locked
    for key in locked_keys:
        value = document_indexes[key]
        exists = check_docs_for_existence(key, value, docrule)
        if not exists:
            user_locked_keys.append((key, 'locked'))
    return user_locked_keys
Пример #2
0
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
Пример #3
0
def check_for_forbidden_new_keys_created(document_indexes, docrule, user):
    """Checks for user ability to add new key's value

    @param document_indexes is a set of user entered indexing data of specific document
    @param docrule is current docrule id
    @param user is a current request.user"""
    user_locked_keys = []
    mdts = get_mdts_for_docrule(docrule)
    manager = MetaDataTemplateManager()
    # Parsing MDT's
    admin_restricted_keys, locked_keys = manager.get_restricted_keys_names(
        mdts)
    # doing nothing for 'admincreate' keys if user has permissions or is superuser
    permit = False
    if user.groups.all():
        for group in user.groups.all():
            if group.name == SEC_GROUP_NAMES['edit_fixed_indexes']:
                permit = True
    if user.is_superuser or permit:
        admin_restricted_keys = []
    # Checking all keys locked for editing to staff or superuser only
    for key in admin_restricted_keys:
        value = document_indexes[key]
        exists = check_docs_for_existence(key, value, docrule)
        if not exists:
            user_locked_keys.append((key, 'adminlock'))
            # Checking all the keys that are marked locked
    for key in locked_keys:
        value = document_indexes[key]
        exists = check_docs_for_existence(key, value, docrule)
        if not exists:
            user_locked_keys.append((key, 'locked'))
    return user_locked_keys
Пример #4
0
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
Пример #5
0
 def post(self, request):
     for item, value in request.POST.iteritems():
         if not item == u'csrfmiddlewaretoken':
             self.docrule = int(item)
     request.session['indexing_docrule_id'] = self.docrule
     mdts = get_mdts_for_docrule(self.docrule)
     log.debug('MuiIndexingView POST with docrule: %s' % self.docrule)
     if mdts:
         request.session['mdts'] = mdts
         return HttpResponseRedirect(reverse('mdtui-index-details'))
     else:
         warning = MDTUI_ERROR_STRINGS['NO_MDTS']
         if not warning in self.warnings:
             self.warnings.append(warning)
         log.debug(
             'MuiIndexingView POST have not found mdts for docrule docrule: %s'
             % self.docrule)
         return self.get(request)
Пример #6
0
 def post(self, request):
     for item, value in request.POST.iteritems():
         if not item == u'csrfmiddlewaretoken':
             self.docrule = int(item)
     request.session['indexing_docrule_id'] = self.docrule
     mdts = get_mdts_for_docrule(self.docrule)
     log.debug('MuiIndexingView POST with docrule: %s' % self.docrule)
     if mdts:
         request.session['mdts'] = mdts
         return HttpResponseRedirect(reverse('mdtui-index-details'))
     else:
         warning = MDTUI_ERROR_STRINGS['NO_MDTS']
         if not warning in self.warnings:
             self.warnings.append(warning)
         log.debug(
             'MuiIndexingView POST have not found mdts for docrule docrule: %s'
             % self.docrule
         )
         return self.get(request)
Пример #7
0
def indexing_select_type(request, step=None, template='mdtui/indexing.html'):
    """Indexing: Step 1 : Select Document Type

    @param request: is a Django request object
    @param step: is a current step name (for template rendering)
    @param template: is a name of template for this view"""
    # Context init
    context = {'step': step}
    docrule = None
    active_docrule = None
    warnings = []
    docrules_list = make_document_type_select(user=request.user)
    cleanup_search_session(request)
    cleanup_mdts(request)
    log.debug('indexing_select_type view called with docrule: %s' % docrule)
    if request.POST:
        for item, value in request.POST.iteritems():
            if not item == u'csrfmiddlewaretoken':
                docrule = int(item)
        request.session['indexing_docrule_id'] = docrule
        mdts = get_mdts_for_docrule(docrule)
        if mdts:
            request.session['mdts'] = mdts
            return HttpResponseRedirect(reverse('mdtui-index-details'))
        else:
            warnings.append(MDTUI_ERROR_STRINGS['NO_MDTS'])
    else:
        # initializing form with previously selected docrule.
        try:
            docrule = request.session['indexing_docrule_id']
        except KeyError:
            pass
        if docrule:
            active_docrule = docrule

    context.update({
        'active_docrule': active_docrule,
        'docrules_list': docrules_list,
        'warnings': warnings,
    })
    return render_to_response(template, context, context_instance=RequestContext(request))
Пример #8
0
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
Пример #9
0
def search_type(request, step, template='mdtui/search.html'):
    """Search Step 1: Select Search MDT

    @param request: is a Django request object
    @param step: is a current step name (for template rendering)
    @param template: is a name of template for this view"""
    warnings = []
    cleanup_indexing_session(request)

    # Initialising MDT or Docrule form according to data provided
    valid_call = True
    required_mdt = True
    required_docrule = True
    if request.POST:
        # Cleaning search session selections
        cleanup_search_session(request)
        cleanup_mdts(request)
        # Checking if docrule or mdt selected
        try:
            if request.POST['docrule']:
                required_mdt = False
        except KeyError:
            pass
        try:
            if request.POST['mdt']:
                required_docrule = False
        except KeyError:
            pass
        # Do not process in case docrule and MDT provided
        try:
            if request.POST['docrule'] and request.POST['mdt']:
                valid_call = False
                warnings.append(MDTUI_ERROR_STRINGS['NO_MDT_NO_DOCRULE'])
        except KeyError:
            pass

    # Rendering forms accordingly
    mdts_filtered_form = make_mdt_select_form(request.user, required_mdt)
    mdts_form = mdts_filtered_form(request.POST or None)
    docrules_filtered_form = make_document_type_select_form(request.user, required_docrule)
    docrules_form = docrules_filtered_form(request.POST or None)

    # POST Validation for either docrule OR mdt selected
    if request.POST and valid_call:
        if mdts_form.is_valid() and not required_docrule:
            mdts = None
            mdt_form_id = None
            try:
                mdt_form_id = mdts_form.data["mdt"]
            except KeyError:
                pass
            # CouchDB connection Felt down warn user
            if mdt_form_id:
                try:
                    mdt_names = get_mdt_from_search_mdt_select_form(mdt_form_id, mdts_filtered_form)
                    request.session['search_mdt_id'] = mdt_form_id
                    mdts = get_mdts_by_names(mdt_names)
                    docrules_list = mdts['1']['docrule_id']
                    if not request.user.is_superuser:
                        request.session['search_docrule_ids'] = filter_permitted_docrules(docrules_list, request.user)
                    else:
                        request.session['search_docrule_ids'] = docrules_list
                except RequestError:
                    warnings.append(MDTUI_ERROR_STRINGS['NO_DB'])
                if mdts:
                    request.session['mdts'] = mdts
                    if valid_call:
                        return HttpResponseRedirect(reverse('mdtui-search-options'))
            else:
                if not MDTUI_ERROR_STRINGS['NO_MDTS'] in warnings:
                    warnings.append(MDTUI_ERROR_STRINGS['NO_MDTS'])

        if docrules_form.is_valid() and not required_mdt:
            # If Docrule selected than MDT is not required and MDT's form is valid in fact
            docrule_form_id = None
            try:
                docrule_form_id = docrules_form.data["docrule"]
            except KeyError:
                pass
            if docrule_form_id:
                request.session['searching_docrule_id'] = docrule_form_id
                mdts = get_mdts_for_docrule(docrule_form_id)
                if mdts:
                    request.session['mdts'] = mdts
                    if valid_call:
                        return HttpResponseRedirect(reverse('mdtui-search-options'))
            else:
                if not MDTUI_ERROR_STRINGS['NO_MDTS'] in warnings:
                    warnings.append(MDTUI_ERROR_STRINGS['NO_MDTS'])
    else:
        # Populating forms with preexisting data if provided
        mdt_id = None
        docrule_id = None
        # Trying to set docrule if previously selected
        try:
            docrule_id = request.session['searching_docrule_id']
        except KeyError:
            pass
        if docrule_id:
            docrules_form = docrules_filtered_form({'docrule': docrule_id})

        # Trying to set mdt if previously selected
        try:
            mdt_id = request.session['search_mdt_id']
        except KeyError:
            pass
        if mdt_id:
            mdts_form = mdts_filtered_form({'mdt': mdt_id})

    context = {
        'warnings': warnings,
        'step': step,
        'mdts_form': mdts_form,
        'docrules_form': docrules_form,
    }
    return render_to_response(template, context, context_instance=RequestContext(request))
Пример #10
0
def edit(request, code, step='edit', template='mdtui/indexing.html'):
    """Indexing step: Edit. Made for editing indexes of document that is indexed already.

    @param request: is a Django request object
    @param code: is a DMS Object() code for view interactions
    @param step: is a current step name (for template rendering)
    @param template: is a name of template for this view"""
    context = {}
    warnings = []
    error_warnings = []
    form = False
    processor = DocumentProcessor()
    autocomplete_list = None
    changed_indexes = None
    # Storing cancel (return back from edit) url
    try:
        return_url = request.session['edit_return']
    except KeyError:
        try:
            return_url = request.META['HTTP_REFERER']
            request.session['edit_return'] = return_url
        except KeyError:
            return_url = '/'
            pass
        pass

    # Only preserve indexes if returning from edit indexes confirmation step
    if 'HTTP_REFERER' in request.META and request.META['HTTP_REFERER'].endswith(reverse('mdtui-edit-finished')):
        try:
            changed_indexes = request.session['edit_processor_indexes']
        except KeyError:
            pass

    log.debug('indexing_edit view called with return_url: %s, changed_indexes: %s' % (return_url, changed_indexes))
    doc = processor.read(code, {'user': request.user, 'only_metadata': True})
    if not processor.errors and not doc.marked_deleted:
        if not request.POST:
            form = initEditIndexesForm(request, doc, changed_indexes)
            # Setting context variables required for autocomplete
            docrule_id = str(doc.get_docrule().id)
            request.session['indexing_docrule_id'] = docrule_id
            request.session['edit_mdts'] = get_mdts_for_docrule(docrule_id)
        else:
            old_db_info = doc.get_db_info()
            secondary_indexes = processEditDocumentIndexForm(request, doc)
            request.session['edit_processor_indexes'] = secondary_indexes
            request.session['edit_index_barcode'] = code
            old_docs_indexes = {'description': old_db_info['description']}
            for index_name, index_value in old_db_info['mdt_indexes'].iteritems():
                # Converting Old index dates to render according to DMS date format
                if index_value.__class__.__name__ == 'datetime':
                    old_docs_indexes[index_name] = datetime.datetime.strftime(index_value, settings.DATE_FORMAT)
                else:
                    old_docs_indexes[index_name] = index_value
            request.session['old_document_keys'] = old_docs_indexes
            return HttpResponseRedirect(reverse('mdtui-edit-finished'))
    else:
        for error in processor.errors:
            # Intercepting type Exception and using it's message or using error.__str__
            if not error.__class__.__name__ == 'unicode' and 'parameter' in error.__dict__.iterkeys():
                error_warnings.append(error.parameter)
            else:
                error_warnings.append(error)
        if doc.marked_deleted:
            error_warnings.append(MDTUI_ERROR_STRINGS['NO_DOC'])

    if form:
        autocomplete_list = extract_secondary_keys_from_form(form)
        # No form is possible when document does not exist
        context.update({'form': form, })
    # In case of no doc type (empty document) fix
    type_name = None
    if doc.docrule:
        type_name = doc.get_docrule().title
    context.update({
        'step': step,
        'doc_name': code,
        'type_name': type_name,
        'warnings': warnings,
        'autocomplete_fields': autocomplete_list,
        'edit_return': return_url,
        'error_warnings': error_warnings,
    })
    return render(request, template, context)
Пример #11
0
def search_type(request, step, template='mdtui/search.html'):
    """Search Step 1: Select Search MDT

    @param request: is a Django request object
    @param step: is a current step name (for template rendering)
    @param template: is a name of template for this view"""
    warnings = []
    cleanup_indexing_session(request)

    # Initialising MDT or Docrule form according to data provided
    valid_call = True
    required_mdt = True
    required_docrule = True
    if request.POST:
        # Cleaning search session selections
        cleanup_search_session(request)
        cleanup_mdts(request)
        # Checking if docrule or mdt selected
        try:
            if request.POST['docrule']:
                required_mdt = False
        except KeyError:
            pass
        try:
            if request.POST['mdt']:
                required_docrule = False
        except KeyError:
            pass
        # Do not process in case docrule and MDT provided
        try:
            if request.POST['docrule'] and request.POST['mdt']:
                valid_call = False
                warnings.append(MDTUI_ERROR_STRINGS['NO_MDT_NO_DOCRULE'])
        except KeyError:
            pass

    # Rendering forms accordingly
    mdts_filtered_form = make_mdt_select_form(request.user, required_mdt)
    mdts_form = mdts_filtered_form(request.POST or None)
    docrules_filtered_form = make_document_type_select_form(
        request.user, required_docrule)
    docrules_form = docrules_filtered_form(request.POST or None)

    # POST Validation for either docrule OR mdt selected
    if request.POST and valid_call:
        if mdts_form.is_valid() and not required_docrule:
            mdts = None
            mdt_form_id = None
            try:
                mdt_form_id = mdts_form.data["mdt"]
            except KeyError:
                pass
            # CouchDB connection Felt down warn user
            if mdt_form_id:
                try:
                    mdt_names = get_mdt_from_search_mdt_select_form(
                        mdt_form_id, mdts_filtered_form)
                    request.session['search_mdt_id'] = mdt_form_id
                    mdts = get_mdts_by_names(mdt_names)
                    docrules_list = mdts['1']['docrule_id']
                    if not request.user.is_superuser:
                        request.session[
                            'search_docrule_ids'] = filter_permitted_docrules(
                                docrules_list, request.user)
                    else:
                        request.session['search_docrule_ids'] = docrules_list
                except RequestError:
                    warnings.append(MDTUI_ERROR_STRINGS['NO_DB'])
                if mdts:
                    request.session['mdts'] = mdts
                    if valid_call:
                        return HttpResponseRedirect(
                            reverse('mdtui-search-options'))
            else:
                if not MDTUI_ERROR_STRINGS['NO_MDTS'] in warnings:
                    warnings.append(MDTUI_ERROR_STRINGS['NO_MDTS'])

        if docrules_form.is_valid() and not required_mdt:
            # If Docrule selected than MDT is not required and MDT's form is valid in fact
            docrule_form_id = None
            try:
                docrule_form_id = docrules_form.data["docrule"]
            except KeyError:
                pass
            if docrule_form_id:
                request.session['searching_docrule_id'] = docrule_form_id
                mdts = get_mdts_for_docrule(docrule_form_id)
                if mdts:
                    request.session['mdts'] = mdts
                    if valid_call:
                        return HttpResponseRedirect(
                            reverse('mdtui-search-options'))
            else:
                if not MDTUI_ERROR_STRINGS['NO_MDTS'] in warnings:
                    warnings.append(MDTUI_ERROR_STRINGS['NO_MDTS'])
    else:
        # Populating forms with preexisting data if provided
        mdt_id = None
        docrule_id = None
        # Trying to set docrule if previously selected
        try:
            docrule_id = request.session['searching_docrule_id']
        except KeyError:
            pass
        if docrule_id:
            docrules_form = docrules_filtered_form({'docrule': docrule_id})

        # Trying to set mdt if previously selected
        try:
            mdt_id = request.session['search_mdt_id']
        except KeyError:
            pass
        if mdt_id:
            mdts_form = mdts_filtered_form({'mdt': mdt_id})

    context = {
        'warnings': warnings,
        'step': step,
        'mdts_form': mdts_form,
        'docrules_form': docrules_form,
    }
    return render_to_response(template,
                              context,
                              context_instance=RequestContext(request))
Пример #12
0
def edit(request, code, step='edit', template='mdtui/indexing.html'):
    """Indexing step: Edit. Made for editing indexes of document that is indexed already.

    @param request: is a Django request object
    @param code: is a DMS Object() code for view interactions
    @param step: is a current step name (for template rendering)
    @param template: is a name of template for this view"""
    context = {}
    warnings = []
    error_warnings = []
    form = False
    processor = DocumentProcessor()
    autocomplete_list = None
    changed_indexes = None
    # Storing cancel (return back from edit) url
    try:
        return_url = request.session['edit_return']
    except KeyError:
        try:
            return_url = request.META['HTTP_REFERER']
            request.session['edit_return'] = return_url
        except KeyError:
            return_url = '/'
            pass
        pass

    # Only preserve indexes if returning from edit indexes confirmation step
    if 'HTTP_REFERER' in request.META and request.META[
            'HTTP_REFERER'].endswith(reverse('mdtui-edit-finished')):
        try:
            changed_indexes = request.session['edit_processor_indexes']
        except KeyError:
            pass

    log.debug(
        'indexing_edit view called with return_url: %s, changed_indexes: %s' %
        (return_url, changed_indexes))
    doc = processor.read(code, {'user': request.user, 'only_metadata': True})
    if not processor.errors and not doc.marked_deleted:
        if not request.POST:
            form = initEditIndexesForm(request, doc, changed_indexes)
            # Setting context variables required for autocomplete
            docrule_id = str(doc.get_docrule().id)
            request.session['indexing_docrule_id'] = docrule_id
            request.session['edit_mdts'] = get_mdts_for_docrule(docrule_id)
        else:
            old_db_info = doc.get_db_info()
            secondary_indexes = processEditDocumentIndexForm(request, doc)
            request.session['edit_processor_indexes'] = secondary_indexes
            request.session['edit_index_barcode'] = code
            old_docs_indexes = {'description': old_db_info['description']}
            for index_name, index_value in old_db_info[
                    'mdt_indexes'].iteritems():
                # Converting Old index dates to render according to DMS date format
                if index_value.__class__.__name__ == 'datetime':
                    old_docs_indexes[index_name] = datetime.datetime.strftime(
                        index_value, settings.DATE_FORMAT)
                else:
                    old_docs_indexes[index_name] = index_value
            request.session['old_document_keys'] = old_docs_indexes
            return HttpResponseRedirect(reverse('mdtui-edit-finished'))
    else:
        for error in processor.errors:
            # Intercepting type Exception and using it's message or using error.__str__
            if not error.__class__.__name__ == 'unicode' and 'parameter' in error.__dict__.iterkeys(
            ):
                error_warnings.append(error.parameter)
            else:
                error_warnings.append(error)
        if doc.marked_deleted:
            error_warnings.append(MDTUI_ERROR_STRINGS['NO_DOC'])

    if form:
        autocomplete_list = extract_secondary_keys_from_form(form)
        # No form is possible when document does not exist
        context.update({
            'form': form,
        })
    # In case of no doc type (empty document) fix
    type_name = None
    if doc.docrule:
        type_name = doc.get_docrule().title
    context.update({
        'step': step,
        'doc_name': code,
        'type_name': type_name,
        'warnings': warnings,
        'autocomplete_fields': autocomplete_list,
        'edit_return': return_url,
        'error_warnings': error_warnings,
    })
    return render(request, template, context)