module automation_students.projects_repository

Inheritance diagram of ensae_teaching_cs.automation_students.projects_repository

Short summary

module ensae_teaching_cs.automation_students.projects_repository

Some automation helpers to grab mails from students about their projects.

source on GitHub

Classes

class truncated documentation
ProjectsRepository Handle a repository of students projects. See example Récupérer des mails d’étudiants en pièce jointe (1:1). …

Properties

property truncated documentation
Groups Returns all available groups in the repository.
Location  

Static Methods

staticmethod truncated documentation
create_folders_from_dataframe Creates a series of folders for groups of students.
get_regex Retrieves data from file suivi.rst using a regular expression.
match_mail Tries to match a name among a list of mails.
match_mails Tries to match a series of names among a list of mails.

Methods

method truncated documentation
__init__ Location of the repository.
convert_files Converts all notebooks and python scripts into HTML for a group.
dump_group_mails Enumerates all mails sent by or sent to a given group.
enumerate_group_files Enumerates all files in a group.
enumerate_group_mails Enumerates all mails sent by or sent to a given group.
get_emails Retrieves student emails from file suivi.rst.
get_group_location Returns the local folder associated to a group.
get_sections Extracts sections from a filename used to follow a group of students.
get_videos Retrieves student emails from file suivi.rst.
list_mails Returns the number of mails of a group.
remove_group Removes a group.
unzip_convert Unzips files and convert notebooks into HTML.
unzip_files Unzips files and convert notebooks into HTML.
write_summary Produces a summary and uses a Jinja2 template.
zip_group Zips a group.

Documentation

Some automation helpers to grab mails from students about their projects.

source on GitHub

class ensae_teaching_cs.automation_students.projects_repository.ProjectsRepository(location, suivi='suivi.rst', fLOG=<function noLOG>)[source]

Bases : object

Handle a repository of students projects. See example Récupérer des mails d’étudiants en pièce jointe (1:1).

source on GitHub

Location of the repository.

Paramètres:
  • location – location of the repository
  • suivi – name of the file gathering information about each project

source on GitHub

Groups

Returns all available groups in the repository.

source on GitHub

Location

location of the repository

source on GitHub

Type:return
exception MailNotFound[source]

Bases : Exception

Raises an exception if mail not found.

source on GitHub

__init__(location, suivi='suivi.rst', fLOG=<function noLOG>)[source]

Location of the repository.

Paramètres:
  • location – location of the repository
  • suivi – name of the file gathering information about each project

source on GitHub

_default_template_summary = '<?xml version="1.0" encoding="utf-8"?>\n<head>\n<meta http-equiv="content-type" content="text/html; charset=utf-8" />\n</head>\n<body>\n<html>\n<head>\n<title>{{ title }}</title>\n<link rel="stylesheet" type="text/css" href="{{ css }}">\n</head>\n<body>\n<h1>{{ title }}</h1>\n<ol type="1">\n{% for ps in groups %}\n <li><a href="{{ ps["link"] }}">{{ ps["group"] }}</a><small><i>\n {{ ps["nb"] }} files - {{ format_size(ps["size"]) }} -\n last mail {{ ps["emails"][-1]["date"] }} ---\n {{ len(ps["attachments"]) }} attachments</i></small>\n {% if len(ps["attachments"]) + len(ps["links"]) > 0 %}\n <ul>\n {% for day, att, data in ps["attachments"] %}\n <li>att: {{ day }} - <a href="{{ att }}">{{ os.path.split(att)[-1] }}</a></li>\n {% endfor %}\n {% for date, from_, url, domain, last in ps["links"] %}\n <li>link: {{ date }} <a href="{{ url }}">{{ domain }} // {{ last }}</a> from {{ from_ }}</li>\n {% endfor %}\n </ul>\n {% endif %}\n {% if len(ps["created_files"]) > 0 %}\n <ul>\n {% for name, relpath, size in ps["created_files"] %}\n <li>added: <a href="{{ relpath }}">{{ name }}</a> {{ size }}</li>\n {% endfor %}\n </ul>\n {% endif %}\n </li>\n{% endfor %}\n</ol>\n</body>\n</html>\n'
_email_regex = re.compile('[*] *e?mails? *: *([^*+\\n]+)')
_gitlab_regex = re.compile('[*] *gitlab *: *([^*+\\n]+[.]git)')
_known_strings = ['xavierdupre.fr', 'doodle', 'ensaenotebook', 'teralab', 'outlook.com', 'gohlke', 'support.google', 'help.github', 'api.jcdecaux']
_regex_split = re.compile('[-;,. @]')
_video_regex = re.compile('[*] *videos? *: *([^*\\n]+)')
convert_files(group)[source]

Converts all notebooks and python scripts into HTML for a group.

Paramètres:group – group name
Renvoie:list of new files

source on GitHub

static create_folders_from_dataframe(df, root, report='suivi.rst', col_student=None, col_group='Groupe', col_subject='Sujet', col_mail='mail', overwrite=False, email_function=None, must_have_email=True, skip_if_nomail=False, skip_names=None, fLOG=<function noLOG>)[source]

Creates a series of folders for groups of students.

Paramètres:
  • root – where to create the folders
  • col_student – column which contains the student name (firt name + last name), equal to col_mail if None
  • col_group – index of the group (it can be None if each student is a group)
  • col_subject – column which contains the subject
  • col_mail – if there is a column which contains the mail in the input dataframe
  • df – DataFrame
  • email_function – function which infers email from first and last names, see below
  • report – report file
  • overwrite – if False, skip if the report already exists
  • must_have_email – if True, raises an exception if no mail is found
  • skip_if_nomail – skip a name if no mail is found
  • skip_names – less checking for a given set of names
  • fLOG – logging function
Renvoie:

list of creates folders

The function email_function has the following signature:

def email_function(names):
    # part of a names is a list of tokens
    # ...
    return list of mails, skip=boolean

The boolean tells the function to skip this group. email_function can be a list of mails. In that case, this function is replaced by match_mails.

source on GitHub

dump_group_mails(renderer, group, mailbox, subfolder, date=None, skip_function=None, max_dest=5, filename='index_mails.html', overwrite=False, skip_if_empty=False, convert_files=False)[source]

Enumerates all mails sent by or sent to a given group.

Paramètres:
  • renderer – instance of class EmailMessageListRenderer
  • group – group
  • mailbox – mailbox (see pymmails)
  • subfolder – which subfolder of the mailbox to look into
  • date – date
  • skip_function – if not None, use this function on the header/body to avoid loading the entire message (and skip it)
  • max_dest – maximum number of receivers
  • filename – filename which gathers a link to every mail
  • overwrite – overwrite
  • skip_if_empty – skip if no mail?
  • convert_files – unzip and convert
Renvoie:

list of files (see EmailMessageListRenderer.write)

zip, gz, rar, 7z can be uncompressed. It then convert .py and .ipynb into html.

source on GitHub

enumerate_group_files(group)[source]

Enumerates all files in a group.

Paramètres:group – group
Renvoie:iterator on files

source on GitHub

enumerate_group_mails(group, mailbox, subfolder, date=None, skip_function=None, max_dest=5)[source]

Enumerates all mails sent by or sent to a given group.

Paramètres:
  • group – group (if None, goes through all mails)
  • mailbox

    mailbox (see pymmails)

  • subfolder – which subfolder of the mailbox to look into
  • date – date
  • skip_function – if not None, use this function on the header/body to avoid loading the entire message (and skip it)
  • max_dest – maximum number of receivers
Renvoie:

iterator on mails

source on GitHub

get_emails(group, skip_if_empty=False)[source]

Retrieves student emails from file suivi.rst.

Paramètres:
  • group – group
  • skip_if_empty – skip if no mail?
Renvoie:

list of mails

source on GitHub

get_group_location(group)[source]

Returns the local folder associated to a group.

Paramètres:group – group name
Renvoie:local folder

source on GitHub

static get_regex(path, regex, suivi='suivi.rst', skip_if_empty=False)[source]

Retrieves data from file suivi.rst using a regular expression.

Paramètres:
  • path – sub folder to look into
  • suivi – name of the file suivi.rst
  • skip_if_empty – skip of no mail?
Renvoie:

list of mails

source on GitHub

get_sections(group)[source]

Extracts sections from a filename used to follow a group of students.

Paramètres:group – group
Renvoie:dictionary { section : content }

Example of a file:

rapport
+++++++

* bla 1

extrait
+++++++

::

    paragraphe 1

    paragraphe 2

source on GitHub

get_videos(group)[source]

Retrieves student emails from file suivi.rst.

Paramètres:group – group
Renvoie:list of videos

source on GitHub

list_mails(group)[source]

Returns the number of mails of a group.

Paramètres:group – group name
Renvoie:list of mails

source on GitHub

static match_mail(name, emails, threshold=3, exc=True)[source]

Tries to match a name among a list of mails.

Paramètres:
  • name – a name (first name last name separated by a space)
  • emails – list of emails
  • threshold – above this threshold, mails and names don’t match
  • exc – raise an Exception if not found
Renvoie:

list of available mails, boolean

The second results is True if no email were found in the list.

source on GitHub

static match_mails(names, emails, threshold=3, exc=True, skip_names=None)[source]

Tries to match a series of names among a list of mails.

Paramètres:
  • names – list of names (first name last name separated by a space)
  • emails – list of emails
  • threshold – above this threshold, mails and names don’t match
  • exc – raise an Exception if not found
  • skip_names – the second boolean is True is one of the name belongs to this list
Renvoie:

list of available mails, boolean

The second results is True if no email were found in the list.

source on GitHub

remove_group(group)[source]

Removes a group.

Paramètres:group – group
Renvoie:list of removed files

See remove_folder.

source on GitHub

unzip_convert(group)[source]

Unzips files and convert notebooks into HTML.

Paramètres:group – group name
Renvoie:list of new files

source on GitHub

unzip_files(group)[source]

Unzips files and convert notebooks into HTML.

Paramètres:group – group name
Renvoie:list of new filess

source on GitHub

write_summary(render=None, link='index_mails.html', outfile='index.html', title='summary', nolink_if=None)[source]

Produces a summary and uses a Jinja2 template.

Paramètres:
  • render – instance of EmailMessageRenderer), can be None
  • link – look for this file in each folder
  • outfile – output file
  • nolink_if – link containing those strings will be removed (if None, a default set will be assigned)
  • title – title
Renvoie:

summary

The current default template is:

.. runpython::
from ensae_teaching_cs.automation_students.projects_repository import _default_template_summary_template print(_default_template_summary)

source on GitHub

zip_group(group, outfile, addition=None)[source]

Zips a group.

Paramètres:
  • group – group
  • outfile – output file
  • addition – additional files (sequence)
Renvoie:

list of zipped files

source on GitHub