def get(self, request): if not request.user.is_authenticated(): log.error('ParallelKeysHandler.read attempted with unauthenticated user.') return Response(status=status.HTTP_401_UNAUTHORIZED) mdts_ids = None docrule_id = request.GET.get('docrule', None) key_name = request.GET.get('key', None) autocomplete_req = request.GET.get('req', None) if not docrule_id: mdts_ids = request.GET.get('mdt_ids', None) if not mdts_ids: return Response([], status=status.HTTP_400_BAD_REQUEST) if (docrule_id or mdts_ids) and key_name and autocomplete_req: manager = MetaDataTemplateManager() if mdts_ids: doc_mdts = manager.get_mdts_by_name(mdts_ids) else: doc_mdts = manager.get_mdts_for_docrule(docrule_id) resp = process_pkeys_request(docrule_id, key_name, autocomplete_req, doc_mdts) return Response(resp) else: return Response(status=status.HTTP_404_NOT_FOUND)
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 read(self, request): if not request.user.is_authenticated(): log.error('ParallelKeysHandler.read attempted with unauthenticated user.') return rc.FORBIDDEN mdts_ids = None docrule_id = request.GET.get('docrule', None) key_name = request.GET.get('key', None) autocomplete_req = request.GET.get('req', None) if not docrule_id: mdts_ids = request.GET.get('mdt_ids', None) if not mdts_ids: return rc.BAD_REQUEST if (docrule_id or mdts_ids) and key_name and autocomplete_req: manager = MetaDataTemplateManager() if mdts_ids: doc_mdts = manager.get_mdts_by_name(mdts_ids) else: doc_mdts = manager.get_mdts_for_docrule(docrule_id) resp = process_pkeys_request(docrule_id, key_name, autocomplete_req, doc_mdts) return resp else: return rc.NOT_FOUND
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 get(self, request): # Catch get with no payload docrule_id = request.GET.get('docrule_id', None) if not docrule_id: log.error( 'MetaDataTemplateHandler.read attempted with no payload.') return Response([]) log.debug('MetaDataTemplateHandler.read underway with docrule_id %s.' % docrule_id) # Retrieve MDT from docrule_id manager = MetaDataTemplateManager() result = manager.get_mdts_for_docrule(docrule_id) log.debug('MetaDataTemplateHandler.read result: %s.' % result) if not result: log.error('MetaDataTemplateHandler.read error with docrule_id %s' % docrule_id) return Response(status=status.HTTP_404_NOT_FOUND) log.info( 'MetaDataTemplateHandler.read request fulfilled for docrule_id %s' % docrule_id) return Response(result, status=status.HTTP_200_OK)
def get(self, request): if not request.user.is_authenticated(): log.error( 'ParallelKeysHandler.read attempted with unauthenticated user.' ) return Response(status=status.HTTP_401_UNAUTHORIZED) mdts_ids = None docrule_id = request.GET.get('docrule', None) key_name = request.GET.get('key', None) autocomplete_req = request.GET.get('req', None) if not docrule_id: mdts_ids = request.GET.get('mdt_ids', None) if not mdts_ids: return Response([], status=status.HTTP_400_BAD_REQUEST) if (docrule_id or mdts_ids) and key_name and autocomplete_req: manager = MetaDataTemplateManager() if mdts_ids: doc_mdts = manager.get_mdts_by_name(mdts_ids) else: doc_mdts = manager.get_mdts_for_docrule(docrule_id) resp = process_pkeys_request(docrule_id, key_name, autocomplete_req, doc_mdts) return Response(resp) else: return Response(status=status.HTTP_404_NOT_FOUND)
def read(self, request): if not request.user.is_authenticated(): log.error('MetaDataTemplateHandler.read attempted with unauthenticated user.') return rc.FORBIDDEN # Catch get with no payload try: docrule_id = request.GET['docrule_id'] # FIXME: Need to standardize the arguments / nomenclature except KeyError: log.error('MetaDataTemplateHandler.read attempted with no payload.') if settings.DEBUG: raise else: return rc.BAD_REQUEST log.debug('MetaDataTemplateHandler.read underway with docrule_id %s.' % docrule_id) # Retrieve MDT from docrule_id manager = MetaDataTemplateManager() result = manager.get_mdts_for_docrule(docrule_id) log.debug('MetaDataTemplateHandler.read result: %s.' % result) if not result: log.error('MetaDataTemplateHandler.read error with docrule_id %s' % docrule_id) return rc.NOT_FOUND log.info('MetaDataTemplateHandler.read request fulfilled for docrule_id %s' % docrule_id) return result
def handle(self, *args, **options): quiet = options.get('quiet', False) if not quiet: self.stdout.write("Export of DMS MDT's command called.\n") # Try and Fetch all mdts manager = MetaDataTemplateManager() mdts = manager.get_all_mdts() # Validating all OK if not mdts: if not quiet: self.stderr.write('DMS has no MDT-s.') return for mdt_link in mdts.itervalues(): filename = mdt_link['mdt_id'] mdt_instance = manager.get_mdts_by_name([filename, ]) filename += '.json' file_obj = open(os.path.join(filename), 'w+') file_obj.seek(0) mdt_obj = mdt_instance['1'] try: del mdt_obj["doc_type"] except KeyError: pass mdt_jsoned = json.dumps(mdt_obj, sort_keys=True, indent=4) file_obj.write(mdt_jsoned) if not quiet: self.stderr.write('Exported to file: %s\n'% filename) if not quiet: self.stdout.write("Exporting %s MDT's" % str(len(mdts))) self.stdout.write('\n')
def get_keys_for_docrule(self, docrule_id, mdts = None): pkeys = {} mdt_manager = MetaDataTemplateManager() mdt_manager.docrule_id = docrule_id # valid Mdt id... if mdt_manager.mdt_read_call_valid(): if not mdts: mdts = mdt_manager.get_mdts_for_docrule(docrule_id) pkeys = self.get_parallel_keys_for_mdts(mdts) return pkeys
def get_mdts_by_names(names_list): """ Proxy for clean implementation Planned to be refactored out upon implementing something like search manager or uniting main system core with search logic. """ manager = MetaDataTemplateManager() mdts = manager.get_mdts_by_name(names_list) return mdts
def handle(self, *args, **options): quiet = options.get('quiet', False) if not quiet: self.stdout.write('Trying to import MDT\n') if len(args) == 0: self.stdout.write('No MDT specified\n') return for mdt_file in args: cnt = 0 # Checking for file if not os.path.exists(mdt_file): if not quiet: self.stderr.write('Could not import %s: no such file\n' % mdt_file) continue file_obj = open(os.path.join(mdt_file)) file_obj.seek(0) # Catch improper MDT payload try: mdt_data = json.load(file_obj) except ValueError, e: if not quiet: self.stderr.write( 'MDT fail to create with bad json payload. %s\n' % e) continue pass # Try and validate MDT manager = MetaDataTemplateManager() if not manager.validate_mdt(mdt_data): if not quiet: self.stderr.write( 'MDT %s fail to create. JSON did not validate.\n', mdt_file) continue # Store MDT result = manager.store(mdt_data) if result is False: if not quiet: self.stderr.write( 'MDT %s creation error occurred on storing process.\n', mdt_file) continue if result and not quiet: self.stderr.write(str(result)) self.stdout.write('\n') if result: cnt += 1
def check_for_secondary_keys_pairs(input_keys_list, docrule_id): """Checks for parallel keys pairs if they already exist in Secondary Keys. Scenario: Existing Parallell key: JOHN 1234 user enters MIKE 1234 where MIKE already exists in combination with another numeric id we should still issue a warning. EG. The combination of key values is new! (even though no new keys have been created) """ # Copying dictionary data and operating with them in function sec_keys_list = {} suspicious_keys_list = {} if input_keys_list: for key in input_keys_list.iterkeys(): sec_keys_list[key] = input_keys_list[key] suspicious_keys_list = {} p_keys_manager = ParallelKeysManager() mdt_manager = MetaDataTemplateManager() keys_list = [key for key in sec_keys_list.iterkeys()] # Cleaning from not secondary keys for key in keys_list: if key == 'date' or key == 'description': del sec_keys_list[key] # Getting list of parallel keys for this docrule. mdts = mdt_manager.get_mdts_for_docrule(docrule_id) pkeys = p_keys_manager.get_parallel_keys_for_mdts(mdts) # Getting Pkeys lists. checked_keys = [] for key in sec_keys_list.iterkeys(): key_pkeys = p_keys_manager.get_parallel_keys_for_key(pkeys, key) pkeys_with_values = p_keys_manager.get_parallel_keys_for_pkeys( key_pkeys, sec_keys_list) # Checking if this parallel keys group already was checked. if not pkeys_with_values in checked_keys: checked_keys.append(pkeys_with_values) # Getting all keys for parallel key to check if it exists in any document metadata already. for pkey, pvalue in pkeys_with_values: documents = CouchDocument.view('dmscouch/search_autocomplete', key=[docrule_id, pkey, pvalue], reduce=False) # Appending non existing keys into list to be checked. if not documents: suspicious_keys_list[pkey] = pvalue if suspicious_keys_list: log.debug('Found new unique key/values in secondary keys: ', suspicious_keys_list) else: log.debug('Found NO new unique key/values in secondary keys') return suspicious_keys_list
def check_for_secondary_keys_pairs(input_keys_list, docrule_id): """Checks for parallel keys pairs if they already exist in Secondary Keys. Scenario: Existing Parallell key: JOHN 1234 user enters MIKE 1234 where MIKE already exists in combination with another numeric id we should still issue a warning. EG. The combination of key values is new! (even though no new keys have been created) """ # Copying dictionary data and operating with them in function sec_keys_list = {} suspicious_keys_list = {} if input_keys_list: for key in input_keys_list.iterkeys(): sec_keys_list[key] = input_keys_list[key] suspicious_keys_list = {} p_keys_manager = ParallelKeysManager() mdt_manager = MetaDataTemplateManager() keys_list = [key for key in sec_keys_list.iterkeys()] # Cleaning from not secondary keys for key in keys_list: if key == 'date' or key == 'description': del sec_keys_list[key] # Getting list of parallel keys for this docrule. mdts = mdt_manager.get_mdts_for_docrule(docrule_id) pkeys = p_keys_manager.get_parallel_keys_for_mdts(mdts) # Getting Pkeys lists. checked_keys = [] for key in sec_keys_list.iterkeys(): key_pkeys = p_keys_manager.get_parallel_keys_for_key(pkeys, key) pkeys_with_values = p_keys_manager.get_parallel_keys_for_pkeys(key_pkeys, sec_keys_list) # Checking if this parallel keys group already was checked. if not pkeys_with_values in checked_keys: checked_keys.append(pkeys_with_values) # Getting all keys for parallel key to check if it exists in any document metadata already. for pkey, pvalue in pkeys_with_values: documents = CouchDocument.view('dmscouch/search_autocomplete', key=[docrule_id, pkey, pvalue], reduce=False) # Appending non existing keys into list to be checked. if not documents: suspicious_keys_list[pkey] = pvalue if suspicious_keys_list: log.debug('Found new unique key/values in secondary keys: ', suspicious_keys_list) else: log.debug('Found NO new unique key/values in secondary keys') return suspicious_keys_list
def make_mdt_select_form(user=None, required=True): """ Special method to construct custom MDTSearchSelectForm suggests MDT's for search that only restricted by user Docrule permissions. E.g.: 'MDT1' is shown in MDTSearchSelectForm only if: 'MDT1' has connected 'docrule1' AND 'user', that is provided to method, has permission to interact with this DocumentTypeRule ('docrule1' in our case). """ # Fetching all mdts that have more than 1 docrule mdt_m = MetaDataTemplateManager() all_mdts = {} try: couch_mdts = mdt_m.get_all_mdts() # Filtering with more than 1 docrule count if couch_mdts: for mdt_id, mdt in couch_mdts.iteritems(): mdt_docrules = mdt['docrule_id'] if mdt_docrules.__len__() > 1: all_mdts[mdt_id] = mdt except RequestError: # No CouchDB pass filtered_mdts = {} # Filtering MDT's displaying only permitted ones for provided user if not user.is_superuser and all_mdts: allowed_docrules_pks = list_permitted_docrules_pks(user) # Filtering all_mdts by only allowed ones for mdt in all_mdts: mdt_docrules = all_mdts[mdt]['docrule_id'] for docrule_id in mdt_docrules: if docrule_id in allowed_docrules_pks: filtered_mdts[mdt] = all_mdts[mdt] # listing mdts to display in form by number, mdt_id if filtered_mdts: mdt_choices = [(mdt, all_mdts[mdt]['mdt_id']) for mdt in filtered_mdts.iterkeys()] else: mdts_list = [mdt for mdt in all_mdts.iterkeys()] mdt_choices = [(mdt, all_mdts[mdt]['mdt_id']) for mdt in mdts_list] mdt_choices.sort() # Constructing form class MDTSelectForm(forms.Form): mdt = forms.ChoiceField(choices=mdt_choices, label=SEARCH_STRING_REPR['MDT_SEARCH'], required=required) return MDTSelectForm
def handle(self, *args, **options): quiet = options.get('quiet', False) if not quiet: self.stdout.write('Trying to import MDT\n') if len(args) == 0: self.stdout.write('No MDT specified\n') return for mdt_file in args: cnt = 0 # Checking for file if not os.path.exists(mdt_file): if not quiet: self.stderr.write('Could not import %s: no such file\n' % mdt_file) continue file_obj = open(os.path.join(mdt_file)) file_obj.seek(0) # Catch improper MDT payload try: mdt_data = json.load(file_obj) except ValueError, e: if not quiet: self.stderr.write('MDT fail to create with bad json payload. %s\n' % e) continue pass # Try and validate MDT manager = MetaDataTemplateManager() if not manager.validate_mdt(mdt_data): if not quiet: self.stderr.write('MDT %s fail to create. JSON did not validate.\n', mdt_file) continue # Store MDT result = manager.store(mdt_data) if result is False: if not quiet: self.stderr.write('MDT %s creation error occurred on storing process.\n', mdt_file) continue if result and not quiet: self.stderr.write(str(result)) self.stdout.write('\n') if result: cnt += 1
def get_mdts_for_docrule(docrule_id): """ Generates list of form fields for document. Uses MDT's for docrule to list form fields. """ log.debug("Getting MDT's from CouchDB") if docrule_id.__class__.__name__ == 'int': docrule_id = str(docrule_id) mdt_manager = MetaDataTemplateManager() mdt_manager.docrule_id = docrule_id mdts_dict = mdt_manager.get_mdts_for_docrule(docrule_id) # there is at least 1 MDT exists if not mdts_dict=='error': log.debug("Got MDT's: %s" % mdts_dict) else: log.debug("No MDT's found") return mdts_dict
def get_mdts_for_docrule(docrule_id): """ Generates list of form fields for document. Uses MDT's for docrule to list form fields. """ log.debug("Getting MDT's from CouchDB") if docrule_id.__class__.__name__ == 'int': docrule_id = str(docrule_id) mdt_manager = MetaDataTemplateManager() mdt_manager.docrule_id = docrule_id mdts_dict = mdt_manager.get_mdts_for_docrule(docrule_id) # there is at least 1 MDT exists if not mdts_dict == 'error': log.debug("Got MDT's: %s" % mdts_dict) else: log.debug("No MDT's found") return mdts_dict
def get(self, request): # Catch get with no payload docrule_id = request.GET.get('docrule_id', None) if not docrule_id: log.error('MetaDataTemplateHandler.read attempted with no payload.') return Response([]) log.debug('MetaDataTemplateHandler.read underway with docrule_id %s.' % docrule_id) # Retrieve MDT from docrule_id manager = MetaDataTemplateManager() result = manager.get_mdts_for_docrule(docrule_id) log.debug('MetaDataTemplateHandler.read result: %s.' % result) if not result: log.error('MetaDataTemplateHandler.read error with docrule_id %s' % docrule_id) return Response(status=status.HTTP_404_NOT_FOUND) log.info('MetaDataTemplateHandler.read request fulfilled for docrule_id %s' % docrule_id) return Response(result, status=status.HTTP_200_OK)
class MetaDataTemplateHandler(APIView): """Read / Create / Delete Meta Data Templates @param docrule_id: is used for read @param mdt_id: is used for delete Example MDT: :: { "docrule_id": "used to assign this to document type rules", "description": "<-- description of this metadata template -->", "fields": { // examples: "<-- field number -->": { "type": "string|integer|date", "length": "<--optional-->", "field_name":"<-- field name used in UI -->", "description": "<-- description used in UI -->" }, "1": { "type": "integer", "field_name": "Employee ID", "description": "Unique (Staff) ID of the person" }, "2": { "type": "string", "length": 60, "field_name": "Employee Name", "description": "Name of the person associated with the document" } }, // parallel fields mapping "parallel": { "<-- set id -->": ["<-- first 'field' -->", "<-- second 'field' -->"] "1": [ "1", "2"], } } """ allowed_methods = ('GET', 'POST', 'DELETE') parser_classes = (FormParser, MultiPartParser) """ """ @method_decorator(logged_in_or_basicauth(AUTH_REALM)) @method_decorator(group_required(API_GROUP_NAME) ) # FIXME: Should be more granular permissions def post(self, request): # Catch post with no payload try: mdt = request.POST['mdt'] except KeyError: log.error( 'MetaDataTemplateHandler.create attempted with no payload.') if settings.DEBUG: raise else: return Response(status=status.HTTP_400_BAD_REQUEST) # Catch improper MDT payload try: data = json.loads(str(mdt)) except ValueError, e: log.error( 'MetaDataTemplateHandler.create attempted with bad json payload. %s' % e) if settings.DEBUG: raise else: return Response(status=status.HTTP_400_BAD_REQUEST) # Try and validate MDT manager = MetaDataTemplateManager() if not manager.validate_mdt(mdt): return Response(status=status.HTTP_400_BAD_REQUEST) # Store MDT result = manager.store(data) if result is False: log.error( 'MetaDataTemplateHandler.create error occurred on store.') return Response(status=status.HTTP_409_CONFLICT) log.info('MetaDataTemplateHandler.create request fulfilled.') return Response(result, status=status.HTTP_200_OK)
if body: try: d = json.loads(body) mdt_id = d['mdt_id'] except: log.error( 'MetaDataTemplateHandler.delete attempted with invalid request %s' % body) return Response(status=status.HTTP_400_BAD_REQUEST) # Catch mdt_id is None if mdt_id is None: return Response(status=status.HTTP_400_BAD_REQUEST) # Delete MDT via Manager manager = MetaDataTemplateManager() result = manager.delete_mdt(mdt_id) if result is True: log.info( 'MetaDataTemplateHandler.delete request fulfilled for mdt_id %s' % mdt_id) return Response(status=status.HTTP_204_NO_CONTENT) else: log.info( 'MetaDataTemplateHandler.delete request not found for mdt_id %s' % mdt_id) return Response(status=status.HTTP_404_NOT_FOUND) @renderer_classes((JSONPRenderer, JSONRenderer)) class ParallelKeysHandler(APIView):
raise else: return rc.BAD_REQUEST # Catch improper MDT payload try: data = json.loads(str(mdt)) except ValueError, e: log.error('MetaDataTemplateHandler.create attempted with bad json payload. %s' % e) if settings.DEBUG: raise else: return rc.BAD_REQUEST # Try and validate MDT manager = MetaDataTemplateManager() if not manager.validate_mdt(mdt): return rc.BAD_REQUEST # Store MDT result = manager.store(data) if result is False: log.error('MetaDataTemplateHandler.create error occurred on store.') return rc.DUPLICATE_ENTRY log.info('MetaDataTemplateHandler.create request fulfilled.') return result @method_decorator(logged_in_or_basicauth(AUTH_REALM)) @method_decorator(group_required('api')) # FIXME: Should be more granular permissions def read(self, request):
try: mdt_id = request.REQUEST.get('mdt_id') log.info('MetaDataTemplateHandler.delete attempted with valid request %s' % mdt_id) except KeyError, e: log.error('MetaDataTemplateHandler.delete attempted with invalid request %s' % e) if settings.DEBUG: raise else: return rc.BAD_REQUEST # Catch mdt_id is None if mdt_id is None: return rc.BAD_REQUEST # Delete MDT via Manager manager = MetaDataTemplateManager() result = manager.delete_mdt(mdt_id) if result is True: log.info('MetaDataTemplateHandler.delete request fulfilled for mdt_id %s' % mdt_id) return rc.DELETED else: log.info('MetaDataTemplateHandler.delete request not found for mdt_id %s' % mdt_id) return rc.NOT_FOUND class ParallelKeysHandler(BaseHandler): """Read parallel keys for autocomplete""" allowed_methods = ('GET', 'OPTIONS') """ docrule is used for indexing