Skip to content

Commit 7cf7217

Browse files
authored
Merge pull request #121 from Nathan-Etave/feat/administration
PR: Merge de feat/administration dans dev
2 parents ad2e7c6 + 6dd03af commit 7cf7217

File tree

12 files changed

+213
-29
lines changed

12 files changed

+213
-29
lines changed

app/administration/routes.py

Lines changed: 47 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
from app.models.utilisateur import UTILISATEUR
1717
from app.models.a_acces import A_ACCES
1818
from app.models.role import ROLE
19-
from app.utils import Whoosh
19+
from app.utils import Whoosh, check_notitications
2020
from fasteners import InterProcessLock
2121

2222

@@ -37,6 +37,7 @@ def administration():
3737
roles=all_roles,
3838
is_admin=True,
3939
is_authenticated=True,
40+
has_notifications=check_notitications(),
4041
)
4142

4243

@@ -209,7 +210,7 @@ def create_folder(data):
209210
db.session.commit()
210211
except Exception as e:
211212
db.session.rollback()
212-
socketio.emit('folder_creation_failed', {'error': str(e)}, namespace='/administration')
213+
socketio.emit('folder_not_created', {'error': str(e)}, namespace='/administration')
213214
return
214215
try:
215216
db.session.execute(A_ACCES.insert().values(id_Role=1, id_Dossier=folder.id_Dossier))
@@ -220,7 +221,7 @@ def create_folder(data):
220221
db.session.rollback()
221222
db.session.delete(folder)
222223
db.session.commit()
223-
socketio.emit('folder_creation_failed', {'error': str(e)}, namespace='/administration')
224+
socketio.emit('folder_not_created', {'error': str(e)}, namespace='/administration')
224225
return
225226
try:
226227
if parent_folder_id != 0:
@@ -233,6 +234,47 @@ def create_folder(data):
233234
db.session.execute(A_ACCES.delete().where(A_ACCES.c.id_Role == role).where(A_ACCES.c.id_Dossier == folder.id_Dossier))
234235
db.session.delete(folder)
235236
db.session.commit()
236-
socketio.emit('folder_creation_failed', {'error': str(e)}, namespace='/administration')
237+
socketio.emit('folder_not_created', {'error': str(e)}, namespace='/administration')
237238
return
238-
socketio.emit('folder_created', {'folderId': folder.id_Dossier, 'folderName': folder_name, 'folderColor': folder.couleur_Dossier, 'parentFolderId': parent_folder_id}, namespace='/administration')
239+
socketio.emit('folder_created', {'folderId': folder.id_Dossier, 'folderName': folder_name, 'folderColor': folder.couleur_Dossier, 'parentFolderId': parent_folder_id}, namespace='/administration')
240+
241+
@socketio.on('modify_folder', namespace='/administration')
242+
def modify_folder(data):
243+
folder_id = data.get('folderId')
244+
folder_name = data.get('folderName')
245+
parent_folder_id = data.get('parentFolderId')
246+
folder_roles = data.get('folderRoles')
247+
folder_color = data.get('folderColor')
248+
folder = DOSSIER.query.get(folder_id)
249+
folder.nom_Dossier = folder_name
250+
folder.couleur_Dossier = folder_color
251+
try:
252+
if parent_folder_id != 0:
253+
db.session.execute(SOUS_DOSSIER.delete().where(SOUS_DOSSIER.c.id_Dossier_Enfant == folder_id))
254+
db.session.execute(SOUS_DOSSIER.insert().values(id_Dossier_Parent=parent_folder_id, id_Dossier_Enfant=folder_id))
255+
db.session.commit()
256+
else:
257+
db.session.execute(SOUS_DOSSIER.delete().where(SOUS_DOSSIER.c.id_Dossier_Enfant == folder_id))
258+
db.session.commit()
259+
except Exception as e:
260+
db.session.rollback()
261+
socketio.emit('folder_not_modified', {'error': str(e)}, namespace='/administration')
262+
return
263+
try:
264+
db.session.execute(A_ACCES.delete().where(A_ACCES.c.id_Dossier == folder_id))
265+
db.session.commit()
266+
except Exception as e:
267+
db.session.rollback()
268+
socketio.emit('folder_not_modified', {'error': str(e)}, namespace='/administration')
269+
return
270+
try:
271+
db.session.execute(A_ACCES.insert().values(id_Role=1, id_Dossier=folder_id))
272+
for role in folder_roles:
273+
db.session.execute(A_ACCES.insert().values(id_Role=role, id_Dossier=folder_id))
274+
db.session.commit()
275+
except Exception as e:
276+
db.session.rollback()
277+
socketio.emit('folder_not_modified', {'error': str(e)}, namespace='/administration')
278+
return
279+
db.session.commit()
280+
socketio.emit('folder_modified', {'folderId': folder_id, 'folderName': folder_name, 'folderColor': folder_color}, namespace='/administration')

app/decorators.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
def admin_required(f):
66
@wraps(f)
77
def decorated_function(*args, **kwargs):
8-
if not current_user.id_Role == 1:
8+
if not current_user.is_admin():
99
abort(403)
1010
return f(*args, **kwargs)
1111
return decorated_function

app/desktop/routes.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,9 @@
44
from app import socketio
55
from app.extensions import db
66
from app.models.fichier import FICHIER
7+
from app.utils import check_notitications
78

89
@bp.route('/')
910
@login_required
1011
def desktop():
11-
return render_template('desktop/index.html', is_authenticated=True, is_admin=current_user.id_Role == 1, has_notifications=current_user.NOTIFICATION != [])
12+
return render_template('desktop/index.html', is_authenticated=True, is_admin=current_user.is_admin(), has_notifications=check_notitications())

app/home/routes.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
from app.models.a_recherche import A_RECHERCHE
88
from app.forms.search_form import SearchForm
99
from datetime import datetime
10+
from app.utils import check_notitications
1011

1112

1213
@bp.route("/", methods=["GET", "POST"])
@@ -33,8 +34,8 @@ def home():
3334
return render_template(
3435
"home/index.html",
3536
is_authenticated=True,
36-
is_admin=current_user.id_Role == 1,
37-
has_notifications=current_user.NOTIFICATION != [],
37+
is_admin=current_user.is_admin(),
38+
has_notifications=check_notitications(),
3839
favorite_files=favorite_files,
3940
researches=researches,
4041
form=form,

app/models/utilisateur.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,9 @@ def get_id(self):
2525

2626
def to_dict(self):
2727
return {c.name: getattr(self, c.name) for c in self.__table__.columns}
28+
29+
def is_admin(self):
30+
return self.id_Role == 1
2831

2932
FICHIER_: Mapped[List['FICHIER']] = relationship('FICHIER', secondary='FAVORIS', back_populates='UTILISATEUR_')
3033
ROLE_: Mapped[Optional['ROLE']] = relationship('ROLE', back_populates='UTILISATEUR')

app/notifications/routes.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
from app.models.notification import NOTIFICATION
1919
from app.models.utilisateur import UTILISATEUR
2020
from app.models.role import ROLE
21+
from app.utils import check_notitications
2122

2223

2324
@bp.route("/", methods=["GET"])
@@ -36,7 +37,7 @@ def notifications():
3637
roles=roles,
3738
is_authenticated=True,
3839
is_admin=True,
39-
has_notifications=current_user.NOTIFICATION != [],
40+
has_notifications=check_notitications(),
4041
)
4142

4243

app/profil/routes.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
from app.forms.edit_profil_form import Edit_profil_form
88
from flask_bcrypt import check_password_hash, generate_password_hash
99
from app.models.utilisateur import UTILISATEUR
10+
from app.utils import check_notitications
1011

1112

1213
@bp.route("/", methods=["GET", "POST"])
@@ -20,8 +21,8 @@ def profil():
2021
return render_template(
2122
"profil/index.html",
2223
is_authenticated=True,
23-
is_admin=current_user.id_Role == 1,
24-
has_notifications=current_user.NOTIFICATION != [],
24+
is_admin=current_user.is_admin(),
25+
has_notifications=check_notitications(),
2526
user=current_user,
2627
edit_mode=False,
2728
)
@@ -59,8 +60,8 @@ def edit():
5960
return render_template(
6061
"profil/index.html",
6162
is_authenticated=True,
62-
is_admin=current_user.id_Role == 1,
63-
has_notifications=current_user.NOTIFICATION != [],
63+
is_admin=current_user.is_admin(),
64+
has_notifications=check_notitications(),
6465
user=current_user,
6566
form=form,
6667
edit_mode=True,

app/search/routes.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
from app.forms.search_form import SearchForm
99
from app import socketio
1010
from fasteners import InterProcessLock
11+
from app.utils import check_notitications
1112

1213

1314
@bp.route("/", methods=["GET", "POST"])
@@ -27,8 +28,8 @@ def search():
2728
return render_template(
2829
"search/index.html",
2930
is_authenticated=True,
30-
is_admin=current_user.id_Role == 1,
31-
has_notifications=current_user.NOTIFICATION != [],
31+
is_admin=current_user.is_admin(),
32+
has_notifications=check_notitications(),
3233
folders=results,
3334
query=query,
3435
form=form,

app/static/js/administration.js

Lines changed: 80 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -252,22 +252,57 @@ document.addEventListener('DOMContentLoaded', function () {
252252
});
253253
});
254254

255-
const modalParentFolder = document.querySelector('#parentFolder');
255+
const modalParentFolders = document.querySelectorAll('#parentFolder');
256+
const modalExistingFolders = document.querySelector('#existingFolder');
256257
folders.forEach((folder) => {
257-
modalParentFolder.innerHTML += `<option value="${folder.dataset.folder}">${folder.dataset.name}</option>`;
258+
modalParentFolders.forEach((select) => {
259+
select.innerHTML += `<option value="${folder.dataset.folder}">${folder.dataset.name}</option>`;
260+
});
261+
modalExistingFolders.innerHTML += `<option value="${folder.dataset.folder}">${folder.dataset.name}</option>`;
262+
});
263+
264+
const modifyFolderModal = document.querySelector('#modifyFolderModal');
265+
modalExistingFolders.addEventListener('change', function (event) {
266+
let folderId = event.target.value;
267+
if (folderId == '0') {
268+
modifyFolderModal.querySelector('#folderName').value = '';
269+
modifyFolderModal.querySelector('#parentFolder').value = '0';
270+
modifyFolderModal.querySelectorAll('.role-checkbox:checked').forEach((cb) => {
271+
cb.checked = false;
272+
});
273+
modifyFolderModal.querySelector('#folderColor').value = '#000000';
274+
return;
275+
}
276+
let folderArray = Array.from(folders);
277+
let folder = folderArray.find(f => f.dataset.folder == folderId);
278+
modifyFolderModal.querySelector('#folderName').value = folder.dataset.name;
279+
modifyFolderModal.querySelector('#parentFolder').value = folder.dataset.parent;
280+
folder.dataset.roles.split(',').forEach((role) => {
281+
if (role !== '1') {
282+
modifyFolderModal.querySelector(`#role${role}`).checked = true;
283+
}
284+
});
285+
modifyFolderModal.querySelector('#folderColor').value = folder.dataset.color;
258286
});
259287

288+
const addFolderModal = document.querySelector('#addFolderModal');
260289
const createFolderButton = document.querySelector('#createFolderButton');
261290
createFolderButton.addEventListener('click', function (event) {
262291
if (fileTotal != fileUploadTotal) {
263292
return;
264293
}
265-
let folderName = document.querySelector('#folderName').value;
266-
let parentFolderId = document.querySelector('#parentFolder').value;
267-
let folderRoles = Array.from(document.querySelectorAll('.role-checkbox:checked')).map(cb => cb.value);
268-
let folderColor = document.querySelector('#folderColor').value;
294+
let folderName = addFolderModal.querySelector('#folderName').value;
295+
let parentFolderId = addFolderModal.querySelector('#parentFolder').value;
296+
let folderRoles = Array.from(addFolderModal.querySelectorAll('.role-checkbox:checked')).map(cb => cb.value);
297+
let folderColor = addFolderModal.querySelector('#folderColor').value;
269298
createFolderButton.disabled = true;
270-
socket.emit('create_folder', { folderName: folderName, parentFolderId: parentFolderId, folderRoles: folderRoles, folderColor: folderColor });
299+
if (folderName !== '') {
300+
socket.emit('create_folder', { folderName: folderName, parentFolderId: parentFolderId, folderRoles: folderRoles, folderColor: folderColor });
301+
}
302+
else {
303+
alert('Veuillez remplir tous les champs.');
304+
createFolderButton.disabled = false;
305+
}
271306
});
272307

273308
socket.on('folder_created', function (data) {
@@ -287,4 +322,42 @@ document.addEventListener('DOMContentLoaded', function () {
287322
return;
288323
}
289324
});
325+
326+
const modifyFolderButton = document.querySelector('#modifyFolderButton');
327+
modifyFolderButton.addEventListener('click', function (event) {
328+
if (fileTotal != fileUploadTotal) {
329+
return;
330+
}
331+
let folderId = modifyFolderModal.querySelector('#existingFolder').value;
332+
let folderName = modifyFolderModal.querySelector('#folderName').value;
333+
let parentFolderId = modifyFolderModal.querySelector('#parentFolder').value;
334+
let folderRoles = Array.from(modifyFolderModal.querySelectorAll('.role-checkbox:checked')).map(cb => cb.value);
335+
let folderColor = modifyFolderModal.querySelector('#folderColor').value;
336+
modifyFolderButton.disabled = true;
337+
if (folderName !== '' && folderId !== '0') {
338+
socket.emit('modify_folder', { folderId: folderId, folderName: folderName, parentFolderId: parentFolderId, folderRoles: folderRoles, folderColor: folderColor });
339+
}
340+
else {
341+
alert('Veuillez remplir tous les champs.');
342+
modifyFolderButton.disabled = false;
343+
}
344+
});
345+
346+
socket.on('folder_modified', function (data) {
347+
window.location.reload();
348+
});
349+
350+
socket.on('folder_not_modified', function (data) {
351+
alert(`La modification du dossier a échoué: ${data.error}`);
352+
modifyFolderButton.disabled = false;
353+
});
354+
355+
const formModifyFolder = document.querySelector('#modifyFolderModal').querySelector('form');
356+
formModifyFolder.addEventListener('submit', function (event) {
357+
if (fileTotal != fileUploadTotal) {
358+
event.preventDefault();
359+
alert('Veuillez attendre la fin du téléversement des fichiers avant de modifier un dossier.');
360+
return;
361+
}
362+
});
290363
});

0 commit comments

Comments
 (0)