TG-60 : AJout de l'insertion de paires etudiant/tuteur + envoi de mails + templates de mails

This commit is contained in:
Clément ARNAUDEAU 2017-03-17 17:10:38 +01:00
parent 793544e300
commit 927de058e2
7 changed files with 88 additions and 5 deletions

1
.gitignore vendored
View File

@ -1,2 +1 @@
.idea .idea

View File

@ -95,4 +95,16 @@ PUT -> Modify an existing group
GET -> Getting specified group infos GET -> Getting specified group infos
In: (Suffixes = /bygid/<GROUP_ID> | /byname/<GROUP_NAME> ) In: (Suffixes = /bygid/<GROUP_ID> | /byname/<GROUP_NAME> )
Out: Out:
200 -> GROUP = <GROUP_OBJECT>|null : Dictionary containing group infos or null 200 -> GROUP = <GROUP_OBJECT>|null : Dictionary containing group infos or null
OPTIONS -> Add pairs of users (student/tutor) to the group
In:
pairs -> Table of pairs student's uid/tutor's uid (ex: [[1,2],[3,2]])
Out:
200 -> RESULT = "Pairs added successfully"
400 -> ERROR = "One or more parameters are missing !" : Bad request
400 -> ERROR = "The user with id <USER_ID> doesn't exists !" : The given USER_ID for student or tutor is not found
400 -> ERROR = "A student must have the 'student' role !" : The given USER_ID for student doesn't have the "student" role (4)
400 -> ERROR = "A student can't be a tutor !" : The given USER_ID for tutor have the "student" role (4) and so can't be a tutor
405 -> ERROR = "This group doesn't exists !" : Bad GROUP_ID provided
409 -> ERROR = "Pairs are incorrectly formed !" : Bad syntax in pairs table

1
backend/.gitignore vendored
View File

@ -31,3 +31,4 @@ coverage.xml
#Config files #Config files
config.py config.py
/app/OLA_RESSOURCES/

View File

@ -2,9 +2,9 @@ import os
from flask_restful import Resource, request from flask_restful import Resource, request
from app.core import app from app.api import mailsModels
from app.model import * from app.model import *
from app.utils import checkParams from app.utils import *
class GroupAPI(Resource): class GroupAPI(Resource):
@ -97,7 +97,7 @@ class GroupAPI(Resource):
query = GROUP.update().values(name=name, year=year, class_short=class_short, class_long=class_long, query = GROUP.update().values(name=name, year=year, class_short=class_short, class_long=class_long,
department=department, resp_id=resp_id, sec_id=sec_id, ressources_dir=res_dir) \ department=department, resp_id=resp_id, sec_id=sec_id, ressources_dir=res_dir) \
.where(GROUP.c.id == gid) .where(GROUP.c.id == gid)
res = query.execute() query.execute()
if group["ressources_dir"] != res_dir: if group["ressources_dir"] != res_dir:
os.rename(group["ressources_dir"], res_dir) os.rename(group["ressources_dir"], res_dir)
@ -109,3 +109,43 @@ class GroupAPI(Resource):
return {'GROUP': getGroup(gid=gid)}, 200 return {'GROUP': getGroup(gid=gid)}, 200
elif name != "": elif name != "":
return {'GROUP': getGroup(name=name)}, 200 return {'GROUP': getGroup(name=name)}, 200
def options(self, gid):
args = request.get_json(cache=False, force=True)
if not checkParams(['pairs'], args):
return {"ERROR": "One or more parameters are missing !"}, 400
pairs = args["pairs"]
group = getGroup(gid=gid)
if group is None:
return {"ERROR": "This group does not exists !"}, 405
for p in pairs:
try:
stud = getUser(uid=p[0])
if stud is None:
return {"ERROR": "The user with id " + str(p[0]) + " does not exists !"}, 400
elif stud['role'] != "4":
return {"ERROR": "A student must have the 'student' role !"}, 400
tutor = getUser(uid=p[1])
if tutor is None:
return {"ERROR": "The user with id " + str(p[1]) + " does not exists !"}, 400
elif tutor['role'] == "4":
return {"ERROR": "A student can't be a tutor !"}, 400
elif "3" not in tutor['role'].split('-'):
role = tutor['role'] + "-3"
query = USER.update().values(role=role).where(USER.c.id == p[1])
query.execute()
except IndexError:
return {"ERROR": "Pairs are incorrectly formed !"}, 409
query = TUTORSHIP.insert().values(group_id=gid, student_id=p[0], ptutor_id=p[1])
query.execute()
mail = mailsModels.getMailContent("NEW_TO_GROUP", {"GROUP": group["name"],
"URL": "ola.univ-tlse2.fr/registration/"
+ get_random_string()})
send_mail(mail[0], stud["email"], mail[1])
return {"RESULT": "Pairs added successfully"}, 200

View File

@ -0,0 +1,13 @@
_NEW_USER = ("Votre compte OLA a été créé !", "Bonjour,<br/><p>Votre compte vient d'être créé dans l'Outil du "
"Livret de l'Alternant dans le groupe #GROUPE. Vous pouvez dès "
"maintenant créer un livret en vous rendant à l'adresse : <br/>"
"<a href='#URL'>#URL</a></p><p>Bonne journée !</p>")
def getMailContent(mail_type, args):
mail = None
if mail_type == "NEW_USER":
mail = _NEW_USER
for key, value in args:
mail[1].replace("#" + key, value)
return mail

View File

@ -31,6 +31,8 @@ class Config:
CAS_LOGIN_ROUTE = "/login" CAS_LOGIN_ROUTE = "/login"
CAS_LOGOUT_ROUTE = "/logout" CAS_LOGOUT_ROUTE = "/logout"
CAS_VALIDATE_ROUTE = "/serviceValidate" CAS_VALIDATE_ROUTE = "/serviceValidate"
BASE_RESSOURCES_DIR = "/OLA_RESSOURCES/"
MAILER = True
@ -42,6 +44,7 @@ class Debug(Config):
DEBUG = True DEBUG = True
SESSION_COOKIE_SECURE = False SESSION_COOKIE_SECURE = False
SQLALCHEMY_DATABASE_URI = 'mysql://ola:XXX@localhost/OLA' SQLALCHEMY_DATABASE_URI = 'mysql://ola:XXX@localhost/OLA'
BASE_RESSOURCES_DIR = os.path.abspath(os.path.dirname(__file__))+"/OLA_RESSOURCES/"
class Test(Config): class Test(Config):
@ -49,3 +52,5 @@ class Test(Config):
BASE_DIR = os.path.abspath(os.path.dirname(__file__)) BASE_DIR = os.path.abspath(os.path.dirname(__file__))
SQLALCHEMY_DATABASE_URI = \ SQLALCHEMY_DATABASE_URI = \
'sqlite:///' + os.path.join(BASE_DIR, '../test.db') 'sqlite:///' + os.path.join(BASE_DIR, '../test.db')
BASE_RESSOURCES_DIR = os.path.abspath(os.path.dirname(__file__))+"/OLA_RESSOURCES/"
MAILER = False

View File

@ -3,8 +3,12 @@ import string
from hashlib import sha512 from hashlib import sha512
from flask import json from flask import json
from mailer import Mailer
from mailer import Message
from sqlalchemy.ext.declarative import DeclarativeMeta from sqlalchemy.ext.declarative import DeclarativeMeta
from app.core import app
SIMPLE_CHARS = string.ascii_letters + string.digits SIMPLE_CHARS = string.ascii_letters + string.digits
@ -57,3 +61,12 @@ def new_alchemy_encoder(revisit_self=False, fields_to_expand=[]):
def checkParams(wanted, args): def checkParams(wanted, args):
inter = [elt for elt in wanted if elt in args] inter = [elt for elt in wanted if elt in args]
return len(inter) == len(wanted) return len(inter) == len(wanted)
def send_mail(subject, to, html):
if app.config['MAILER']:
message = Message(From="ola.noreply@univ-tlse2.fr", To=to, charset="utf-8")
message.Subject = subject
message.Html = html
sender = Mailer('localhost') # TODO: Mettre le SMTP de la fac ici
sender.send(message)