def count_assignments(self): """ Looks through all writers' assigned solutions and counts which have been assigned and how many times they have """ problemsAssignedDict = {} # Maps specificProblems to completed counts writersAssignedDict = {} for writer in Writers.get_all_writers(): for (problemNumber, problemLanguage) in writer.assignedProblems: languageObject = Languages.get_language_by_name(problemLanguage) # Only consider the languages and problems sent into the object if (not problemNumber in self.allowedProblemNumbers or not languageObject in self.allowedLanguages): continue specificInstance = SpecificProblem(problemNumber, languageObject) if not specificInstance in problemsAssignedDict: problemsAssignedDict[specificInstance] = 1 else: problemsAssignedDict[specificInstance] += 1 if writer in self.writers: writersAssignedDict[writer] = len(writer.assignedProblems) return (problemsAssignedDict, writersAssignedDict)
def list_writers(writerDirectories: list, problems: list, emails: list, languages: list, writerFirstNames: list, writerNames: list): """ Prints the list of writers and their details to the console. Details are retrieved using Writer.__str__() Arguments: writerDirectories: list - A list of directories to print details for problems: list - Only print writers who have completed this problem emails: list - Only print writers with these emails languages: list - Only print writers who know these languages writerFirstNames: list - Only print writers who have one of these firstname writerNames: list - Only print writers who have one of these fullnames """ # First, we assemble the filter dictionary according to the spec in # util/writer.py filterDict = { Writers.FILTER_KEY_DIRS: writerDirectories, Writers.FILTER_KEY_COMPLETED_PROBLEMS: problems, Writers.FILTER_KEY_EMAILS: emails, Writers.FILTER_KEY_KNOWS_LANGS: languages, Writers.FILTER_KEY_FIRST_NAMES: writerFirstNames, Writers.FILTER_KEY_FULL_NAMES: writerNames } print('\n'.join([str(writer) for writer in Writers.get_writers_from_filter(filterDict)]))
def todo_writers(writerDirectories: list, problems: list, emails: list, languages: list, writerFirstNames: list, writerNames: list): """ Prints the list of what solutions a writer has yet to complete to the console. Arguments: writerDirectories: list - A list of directories to print details for problems: list - Only print writers who have todo this problem emails: list - Only print writers with these emails languages: list - Only print writers who have to complete a problem in these languages writerFirstNames: list - Only print writers who have one of these firstname writerNames: list - Only print writers who have one of these fullnames """ # First, we assemble the filter dictionary according to the spec found in # util/writer.py filterDict = { Writers.FILTER_KEY_DIRS: writerDirectories, Writers.FILTER_KEY_TODO_PROBLEMS: problems, Writers.FILTER_KEY_EMAILS: emails, Writers.FILTER_KEY_TODO_LANGS: languages, Writers.FILTER_KEY_FIRST_NAMES: writerFirstNames, Writers.FILTER_KEY_FULL_NAMES: writerNames } print('\n'.join([_get_todo_str_for_writer(writer) for writer in Writers.get_writers_from_filter(filterDict)]))
def add_user_quick(userName: str): """ Adds a user by simply creating their folder and adding their entry to the writers.json dict. If the writer exists, an exception is thrown. Arguments: userName: str - The writer name to create """ if Writers.writer_exists(userName): raise PyCException('Error: Writer {} already exists'.format(userName)) mappedWriterPath = PathMapper.get_mapped_path(userName) newWriter = Writer(writerPath=mappedWriterPath) try: newWriter.create() except Exception as e: raise PyCException('Error: Could not create writer{}'.format(userName))
def _get_loaded_writers(writerNames: list = None) -> list: """ Loads the writers with the provided names and returns them in a list. Arguments: writerNames: list - The list of names to load writers for. If None, all writers are loaded. """ if writerNames is None or len(writerNames) == 0: return Writers.get_all_writers() loadedWriters = [] for writerName in writerNames: loadedWriter = Writer.load_from_folder(writerName) if loadedWriter is None: raise PyCException('Error: {} is an invalid writer'.format(writerName)) else: loadedWriters.append(loadedWriter) return loadedWriters
def operate(args): """ Takes the passed in args and delegates to proper functionality. This is set as the executable function when the `writers assign` subparser is used. Arguments: args: Namespace - The arguments passed via CLI """ # If the user specified a problem list, use that as the list of problems. problemParser = NumberParse() if not args.problems is None: specifiedProblems = problemParser.str_list_to_uniq_range(args.problems) else: specifiedProblems = problemParser.str_list_to_uniq_range(['1+']) specifiedLanguages = [] if not args.language is None: for languageName in args.language: loadedLanguage = Languages.get_language_by_name(languageName) if loadedLanguage is None: raise PyCException('Error: {} is an invalid language'.format(languageName)) specifiedLanguages.append(loadedLanguage) else: specifiedLanguages = [Languages.get_language_by_name(name) for name in Languages.get_all_language_names()] specifiedWriters = [] if not args.full and not args.writer_names is None and len(args.writer_names) > 0: for writerName in args.writer_names: loadedWriter = Writer.load_from_folder(writerName) if loadedWriter is None: raise PyCException('Error: {} is an invalid writer'.format(writerName)) specifiedWriters.append(loadedWriter) else: specifiedWriters = Writers.get_all_writers() allocator = AssignmentAllocator(specifiedProblems, specifiedLanguages, specifiedWriters, fromScratch=args.full) allocator.do_assignment(Definitions.get_value('complete_threshold'), overflow=args.overallocate)