OpenWeek 2019

Améliorer une feature d'INGInious

https://openweek.github.io/presentations/presentation-inginious/index.html

Maxime Mawait - maxime.mawait@student.uclouvain.be Tom Rousseaux - tom.rousseaux@student.uclouvain.be

Objectifs du projet


  • Travailler dans un projet open-source existant
  • Apprendre à utiliser MongoDB
  • Améliorer la partie statistique de l'administration de cours

INGInious


  • Application web
  • Développée au département
  • Execute de manière sûre du code dangereux venant des étudiants

Architecture d'INGInious


Frontend


  • Classes gérant l'affiche des classes
  • Templates webpy/html
  • Scripts et classes gérant la session de l'utilisateur

Page existante 1/3

Page existante 2/3

Page existante 3/3

Ce que vous allez faire:


  • Identifiez des statistiques ou points intéressants à être investigués
  • Ecrire des queries avec pymongo
  • Améliorer l'UI

Tutoriel PyMongo

Données 1/3


  • Dans MongoDB, les données sont des JSON
  • Même structure que les dictionnaires en python

Données 2/3



            from pymongo import MongoClient
            cars = [ {'name': 'Audi', 'price': 52642},
                {'name': 'Mercedes', 'price': 57127},
                {'name': 'Skoda', 'price': 9000},
                {'name': 'Volvo', 'price': 29000},
                {'name': 'Bentley', 'price': 350000},
                {'name': 'Citroen', 'price': 21000},
                {'name': 'Hummer', 'price': 41400},
                {'name': 'Volkswagen', 'price': 21600} ]
            client = MongoClient('mongodb://localhost:27017/')
            with client:
                db = client.testdb
                db.cars.insert_many(cars)
            

Données 3/3



> db.cars.find()
{ "_id" : ObjectId("5b41eb21b9c5d915989d48a8"), "price" : 52642, "name" : "Audi" }
{ "_id" : ObjectId("5b41eb21b9c5d915989d48a9"), "price" : 57127, "name" : "Mercedes" }
{ "_id" : ObjectId("5b41eb21b9c5d915989d48aa"), "price" : 9000, "name" : "Skoda" }
{ "_id" : ObjectId("5b41eb21b9c5d915989d48ab"), "price" : 29000, "name" : "Volvo" }
{ "_id" : ObjectId("5b41eb21b9c5d915989d48ac"), "price" : 350000, "name" : "Bentley" }
{ "_id" : ObjectId("5b41eb21b9c5d915989d48ad"), "price" : 21000, "name" : "Citroen" }
{ "_id" : ObjectId("5b41eb21b9c5d915989d48ae"), "price" : 41400, "name" : "Hummer" }
{ "_id" : ObjectId("5b41eb21b9c5d915989d48af"), "price" : 21600, "name" : "Volkswagen" }
            

Aggrégation


client = MongoClient('mongodb://localhost:27017/')

with client:
    
    db = client.testdb

    agr = [{ '$match': {'$or': [ { 'name': "Audi" }, { 'name': "Volvo" }] }}, 
        { '$group': {'_id': 1, 'sum2cars': { '$sum': "$price" } }}]

    val = list(db.cars.aggregate(agr))

    print('The sum of prices of two cars is {}'.format(val[0]['sum2cars']))
            

Tutoriel complet ici et plus d'infos dans la documentation