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 sphx_glr_gyexamples_automation_fetch_student_projects_from_gmail.py. …

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 :epkg:`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 :epkg:`HTML`.
unzip_files Unzips files and convert notebooks into :epkg:`HTML`.
write_summary Produces a summary and uses a :epkg:`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 sphx_glr_gyexamples_automation_fetch_student_projects_from_gmail.py.

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

return – location of the repository

source on GitHub

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 :epkg:`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
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 :epkg:`HTML`.

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

source on GitHub

unzip_files(group)[source]

Unzips files and convert notebooks into :epkg:`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 :epkg:`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)
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