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)
Example #2
0
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)]))
Example #3
0
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)]))
Example #4
0
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))
Example #5
0
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)