def test_vfolder_directory_clash(af_vfolder_test_browser_defines_po): """Tests that the creation of a virtual folder fails if it clashes with some already existing directory. References #3905. """ from django.core.exceptions import ValidationError from virtualfolder.models import VirtualFolder vfolder_item = { 'name': "browser", 'location': "/af/vfolder_test/", 'priority': 4, 'is_public': True, 'filter_rules': "browser/defines.po", } vfolder = VirtualFolder(**vfolder_item) with pytest.raises(ValidationError) as excinfo: vfolder.save() assert (u"Problem adding virtual folder 'browser' with location " u"'/af/vfolder_test/': VirtualFolderTreeItem clashes with " u"Directory /af/vfolder_test/browser/") in str(excinfo.value)
def test_extract_vfolder_from_path(): """Tests that vfolder is correctly extracted from path, if any.""" subdir0 = TranslationProject.objects.get( language__code="language1", project__code="project1", ).directory.child_dirs.first() # Check that subdir0 pootle_path matches no vfolder. path = subdir0.pootle_path assert (None, path) == extract_vfolder_from_path(path) # Check that vfoldertreeitem pootle_path returns a vfolder and a clean path. vfolder_item = { 'name': 'vfolder0', 'location': subdir0.pootle_path, 'priority': 4, 'is_public': True, 'filter_rules': subdir0.child_stores.first().name, } vfolder0 = VirtualFolder(**vfolder_item) vfolder0.save() path = subdir0.vf_treeitems.first().pootle_path assert (vfolder0, subdir0.pootle_path) == extract_vfolder_from_path(path) # Check that the right vfolder is matched and returned. subdir1_first_store = subdir0.child_dirs.first().child_stores.first() vfolder_location = subdir0.parent.pootle_path filter_path = subdir1_first_store.pootle_path.replace(vfolder_location, "") vfolder_item.update({ 'location': vfolder_location, 'priority': 2, 'filter_rules': filter_path, }) vfolder1 = VirtualFolder(**vfolder_item) vfolder1.save() path = subdir0.vf_treeitems.first().pootle_path assert (vfolder0, subdir0.pootle_path) == extract_vfolder_from_path(path) # Despite the virtual folders share the same name they have different # locations, but the VirtualFolderTreeItem pootle_path is unique, thus only # one exists. assert 1 == VirtualFolderTreeItem.objects.filter(pootle_path=path).count()
def handle(self, **options): """Add virtual folders from file.""" try: with open(options['vfolder'][0], "r") as inputfile: vfolders = json.load(inputfile) except IOError as e: raise CommandError(e) except ValueError as e: raise CommandError("Please check if the JSON file is malformed. " "Original error:\n%s" % e) for vfolder_item in vfolders: try: temp = ','.join(vfolder_item['filters']['files']) if not temp: raise ValueError except (KeyError, ValueError): raise CommandError("Virtual folder '%s' has no filtering " "rules." % vfolder_item['name']) self.stdout.write("Importing virtual folders...") added_count = 0 updated_count = 0 errored_count = 0 for vfolder_item in vfolders: vfolder_item['name'] = vfolder_item['name'].lower() # Put all the files for each virtual folder as a list and save it # as its filter rules. vfolder_item['filter_rules'] = ','.join( vfolder_item['filters']['files']) if 'filters' in vfolder_item: del vfolder_item['filters'] # Now create or update the virtual folder. try: # Retrieve the virtual folder if it exists. vfolder = VirtualFolder.objects.get( name=vfolder_item['name'], location=vfolder_item['location'], ) except VirtualFolder.DoesNotExist: # If the virtual folder doesn't exist yet then create it. try: self.stdout.write(u'Adding new virtual folder %s...' % vfolder_item['name']) vfolder = VirtualFolder(**vfolder_item) vfolder.save() except ValidationError as e: errored_count += 1 self.stdout.write('FAILED') self.stderr.write(e) else: self.stdout.write('DONE') added_count += 1 else: # Update the already existing virtual folder. changed = False if vfolder.filter_rules != vfolder_item['filter_rules']: vfolder.filter_rules = vfolder_item['filter_rules'] changed = True logging.debug("Filter rules for virtual folder '%s' will " "be changed.", vfolder.name) if ('priority' in vfolder_item and vfolder.priority != vfolder_item['priority']): vfolder.priority = vfolder_item['priority'] changed = True logging.debug("Priority for virtual folder '%s' will be " "changed to %f.", vfolder.name, vfolder.priority) if ('is_public' in vfolder_item and vfolder.is_public != vfolder_item['is_public']): vfolder.is_public = vfolder_item['is_public'] changed = True logging.debug("is_public status for virtual folder " "'%s' will be changed.", vfolder.name) if ('description' in vfolder_item and vfolder.description.raw != vfolder_item['description']): vfolder.description = vfolder_item['description'] changed = True logging.debug("Description for virtual folder '%s' will " "be changed.", vfolder.name) if changed: try: self.stdout.write(u'Updating virtual folder %s...' % vfolder_item['name']) vfolder.save() except ValidationError as e: errored_count += 1 self.stdout.write('FAILED') self.stderr.write(e) else: self.stdout.write('DONE') updated_count += 1 self.stdout.write("\nErrored: %d\nAdded: %d\n" "Updated: %d\nUnchanged: %d" % (errored_count, added_count, updated_count, len(vfolders) - errored_count - added_count - updated_count))
def handle(self, *args, **options): """Add virtual folders from file.""" if not args: raise CommandError("You forgot to provide the mandatory filename.") try: inputfile = open(args[0], "r") vfolders = json.load(inputfile) inputfile.close() except IOError as e: raise CommandError(e) except ValueError as e: raise CommandError("Please check if the JSON file is malformed. " "Original error:\n%s" %e) added_count = 0 updated_count = 0 errored_count = 0 for vfolder_item in vfolders: vfolder_item['name'] = vfolder_item['name'].lower() # Put all the files for each virtual folder as a list and save it # as its filter rules. try: vfolder_item['filter_rules'] = ','.join(vfolder_item['filters']['files']) except KeyError: vfolder_item['filter_rules'] = '' if 'filters' in vfolder_item: del vfolder_item['filters'] # Now create or update the virtual folder. try: # Retrieve the virtual folder if it exists. vfolder = VirtualFolder.objects.get( name=vfolder_item['name'], location=vfolder_item['location'], ) except VirtualFolder.DoesNotExist: # If the virtual folder doesn't exist yet then create it. try: vfolder = VirtualFolder(**vfolder_item) vfolder.save() except ValidationError as e: errored_count += 1 logging.error(e.message) else: added_count += 1 else: # Update the already existing virtual folder. changed = False if vfolder.filter_rules != vfolder_item['filter_rules']: vfolder.filter_rules = vfolder_item['filter_rules'] changed = True logging.info("Filter rules for virtual folder '%s' will " "be changed.", vfolder.name) if ('priority' in vfolder_item and vfolder.priority != vfolder_item['priority']): vfolder.priority = vfolder_item['priority'] changed = True logging.info("Priority for virtual folder '%s' will be " "changed to %f.", vfolder.name, vfolder.priority) if ('is_browsable' in vfolder_item and vfolder.is_browsable != vfolder_item['is_browsable']): vfolder.is_browsable = vfolder_item['is_browsable'] changed = True logging.info("is_browsable status for virtual folder '%s' " "will be changed.", vfolder.name) if ('description' in vfolder_item and vfolder.description.raw != vfolder_item['description']): vfolder.description = vfolder_item['description'] changed = True logging.info("Description for virtual folder '%s' will be " "changed.", vfolder.name) if changed: try: vfolder.save() except ValidationError as e: errored_count += 1 logging.error(e.message) else: updated_count += 1 logging.info("\nErrored: %d\nAdded: %d\nUpdated: %d\nUnchanged: %d", errored_count, added_count, updated_count, len(vfolders)-errored_count-added_count-updated_count)
def handle(self, **options): """Add virtual folders from file.""" try: with open(options['vfolder'][0], "r") as inputfile: vfolders = json.load(inputfile) except IOError as e: raise CommandError(e) except ValueError as e: raise CommandError("Please check if the JSON file is malformed. " "Original error:\n%s" % e) for vfolder_item in vfolders: try: temp = ','.join(vfolder_item['filters']['files']) if not temp: raise ValueError except (KeyError, ValueError): raise CommandError("Virtual folder '%s' has no filtering " "rules." % vfolder_item['name']) self.stdout.write("Importing virtual folders...") added_count = 0 updated_count = 0 errored_count = 0 for vfolder_item in vfolders: vfolder_item['name'] = vfolder_item['name'].lower() # Put all the files for each virtual folder as a list and save it # as its filter rules. vfolder_item['filter_rules'] = ','.join( vfolder_item['filters']['files']) if 'filters' in vfolder_item: del vfolder_item['filters'] # Now create or update the virtual folder. try: # Retrieve the virtual folder if it exists. vfolder = VirtualFolder.objects.get( name=vfolder_item['name'], location=vfolder_item['location'], ) except VirtualFolder.DoesNotExist: # If the virtual folder doesn't exist yet then create it. try: self.stdout.write(u'Adding new virtual folder %s...' % vfolder_item['name']) vfolder = VirtualFolder(**vfolder_item) vfolder.save() except ValidationError as e: errored_count += 1 self.stdout.write('FAILED') self.stderr.write(e) else: self.stdout.write('DONE') added_count += 1 else: # Update the already existing virtual folder. changed = False if vfolder.filter_rules != vfolder_item['filter_rules']: vfolder.filter_rules = vfolder_item['filter_rules'] changed = True logging.debug( "Filter rules for virtual folder '%s' will " "be changed.", vfolder.name) if ('priority' in vfolder_item and vfolder.priority != vfolder_item['priority']): vfolder.priority = vfolder_item['priority'] changed = True logging.debug( "Priority for virtual folder '%s' will be " "changed to %f.", vfolder.name, vfolder.priority) if ('is_public' in vfolder_item and vfolder.is_public != vfolder_item['is_public']): vfolder.is_public = vfolder_item['is_public'] changed = True logging.debug( "is_public status for virtual folder " "'%s' will be changed.", vfolder.name) if ('description' in vfolder_item and vfolder.description.raw != vfolder_item['description']): vfolder.description = vfolder_item['description'] changed = True logging.debug( "Description for virtual folder '%s' will " "be changed.", vfolder.name) if changed: try: self.stdout.write(u'Updating virtual folder %s...' % vfolder_item['name']) vfolder.save() except ValidationError as e: errored_count += 1 self.stdout.write('FAILED') self.stderr.write(e) else: self.stdout.write('DONE') updated_count += 1 self.stdout.write( "\nErrored: %d\nAdded: %d\n" "Updated: %d\nUnchanged: %d" % (errored_count, added_count, updated_count, len(vfolders) - errored_count - added_count - updated_count))
def handle(self, **options): """Add virtual folders from file.""" try: with open(options["vfolder"][0], "r") as inputfile: vfolders = json.load(inputfile) except IOError as e: raise CommandError(e) except ValueError as e: raise CommandError("Please check if the JSON file is malformed. " "Original error:\n%s" % e) for vfolder_item in vfolders: try: temp = ",".join(vfolder_item["filters"]["files"]) if not temp: raise ValueError except (KeyError, ValueError): raise CommandError("Virtual folder '%s' has no filtering " "rules." % vfolder_item["name"]) self.stdout.write("Importing virtual folders...") added_count = 0 updated_count = 0 errored_count = 0 for vfolder_item in vfolders: vfolder_item["name"] = vfolder_item["name"].strip().lower() # Put all the files for each virtual folder as a list and save it # as its filter rules. languages, projects, new_rules = self.parse_vfolder_rules( vfolder_item["location"].strip(), vfolder_item["filters"]["files"] ) vfolder_item["filter_rules"] = new_rules if "filters" in vfolder_item: del vfolder_item["filters"] # Now create or update the virtual folder. try: # Retrieve the virtual folder if it exists. vfolder = VirtualFolder.objects.get(name=vfolder_item["name"]) except VirtualFolder.DoesNotExist: # If the virtual folder doesn't exist yet then create it. try: self.stdout.write(u"Adding new virtual folder %s..." % vfolder_item["name"]) vfolder_item["all_projects"] = not projects vfolder_item["all_languages"] = not languages vfolder = VirtualFolder(**vfolder_item) vfolder.save() except ValidationError as e: errored_count += 1 self.stdout.write("FAILED") self.stderr.write(e) else: if projects: vfolder.projects.add(*Project.objects.filter(code__in=projects)) if languages: vfolder.languages.add(*Language.objects.filter(code__in=languages)) self.stdout.write("DONE") added_count += 1 else: # Update the already existing virtual folder. changed = False if not projects: vfolder.all_projects = True changed = True logging.debug("'All projects' for virtual folder '%s' " "will be changed.", vfolder.name) if not languages: vfolder.all_languages = True changed = True logging.debug("'All languages' for virtual folder '%s' " "will be changed.", vfolder.name) if projects: vfolder.projects.set(*Project.objects.filter(code__in=projects)) if languages: vfolder.languages.set(*Language.objects.filter(code__in=languages)) if vfolder.filter_rules != vfolder_item["filter_rules"]: vfolder.filter_rules = vfolder_item["filter_rules"] changed = True logging.debug("Filter rules for virtual folder '%s' will " "be changed.", vfolder.name) if "priority" in vfolder_item and vfolder.priority != vfolder_item["priority"]: vfolder.priority = vfolder_item["priority"] changed = True logging.debug( "Priority for virtual folder '%s' will be " "changed to %f.", vfolder.name, vfolder.priority ) if "is_public" in vfolder_item and vfolder.is_public != vfolder_item["is_public"]: vfolder.is_public = vfolder_item["is_public"] changed = True logging.debug("is_public status for virtual folder " "'%s' will be changed.", vfolder.name) if "description" in vfolder_item and vfolder.description.raw != vfolder_item["description"]: vfolder.description = vfolder_item["description"] changed = True logging.debug("Description for virtual folder '%s' will " "be changed.", vfolder.name) if changed: try: self.stdout.write(u"Updating virtual folder %s..." % vfolder_item["name"]) vfolder.save() except ValidationError as e: errored_count += 1 self.stdout.write("FAILED") self.stderr.write(e) else: self.stdout.write("DONE") updated_count += 1 self.stdout.write( "\nErrored: %d\nAdded: %d\n" "Updated: %d\nUnchanged: %d" % (errored_count, added_count, updated_count, len(vfolders) - errored_count - added_count - updated_count) )
def handle(self, *args, **options): """Add virtual folders from file.""" if not args: raise CommandError("You forgot to provide the mandatory filename.") try: inputfile = open(args[0], "r") vfolders = json.load(inputfile) inputfile.close() except IOError as e: raise CommandError(e) except ValueError as e: raise CommandError("Please check if the JSON file is malformed. " "Original error:\n%s" % e) added_count = 0 updated_count = 0 errored_count = 0 for vfolder_item in vfolders: vfolder_item['name'] = vfolder_item['name'].lower() # Put all the files for each virtual folder as a list and save it # as its filter rules. try: vfolder_item['filter_rules'] = ','.join( vfolder_item['filters']['files']) except KeyError: vfolder_item['filter_rules'] = '' if 'filters' in vfolder_item: del vfolder_item['filters'] # Now create or update the virtual folder. try: # Retrieve the virtual folder if it exists. vfolder = VirtualFolder.objects.get( name=vfolder_item['name'], location=vfolder_item['location'], ) except VirtualFolder.DoesNotExist: # If the virtual folder doesn't exist yet then create it. try: vfolder = VirtualFolder(**vfolder_item) vfolder.save() except ValidationError as e: errored_count += 1 logging.error(e.message) else: added_count += 1 else: # Update the already existing virtual folder. changed = False if vfolder.filter_rules != vfolder_item['filter_rules']: vfolder.filter_rules = vfolder_item['filter_rules'] changed = True logging.info( "Filter rules for virtual folder '%s' will " "be changed.", vfolder.name) if ('priority' in vfolder_item and vfolder.priority != vfolder_item['priority']): vfolder.priority = vfolder_item['priority'] changed = True logging.info( "Priority for virtual folder '%s' will be " "changed to %f.", vfolder.name, vfolder.priority) if ('is_browsable' in vfolder_item and vfolder.is_browsable != vfolder_item['is_browsable']): vfolder.is_browsable = vfolder_item['is_browsable'] changed = True logging.info( "is_browsable status for virtual folder '%s' " "will be changed.", vfolder.name) if ('description' in vfolder_item and vfolder.description.raw != vfolder_item['description']): vfolder.description = vfolder_item['description'] changed = True logging.info( "Description for virtual folder '%s' will be " "changed.", vfolder.name) if changed: try: vfolder.save() except ValidationError as e: errored_count += 1 logging.error(e.message) else: updated_count += 1 logging.info( "\nErrored: %d\nAdded: %d\nUpdated: %d\nUnchanged: %d", errored_count, added_count, updated_count, len(vfolders) - errored_count - added_count - updated_count)