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
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 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
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 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)
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)
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))
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
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))
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)
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))
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)