Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 22 additions & 1 deletion backend/gn_module_monitoring/routes/monitoring.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@

from flask import request, url_for, g, current_app

from sqlalchemy import select
from sqlalchemy import select, func
from sqlalchemy.orm import joinedload

from utils_flask_sqla.response import json_resp, json_resp_accept_empty_list
Expand All @@ -31,6 +31,8 @@
from gn_module_monitoring.utils.utils import to_int
from gn_module_monitoring.config.repositories import get_config

from gn_module_monitoring.monitoring.models import TMonitoringVisits, TMonitoringSites


@blueprint.before_request
def set_current_module():
Expand Down Expand Up @@ -244,6 +246,25 @@ def create_object_api(module_code, object_type, id):
@json_resp
@permissions.check_cruved_scope("D", get_scope=True)
def delete_object_api(scope, module_code, object_type, id):
if object_type == "site":
visit_count = func.count().label("nb_visites")

query = (
DB.session.query(TModules.module_label, visit_count)
.join(TMonitoringVisits, TModules.id_module == TMonitoringVisits.id_module)
.join(
TMonitoringSites, TMonitoringSites.id_base_site == TMonitoringVisits.id_base_site
)
.filter(TMonitoringSites.id_base_site == id)
.group_by(TModules.module_label)
)

resultats = query.all()
if len(resultats) > 0:
raise Forbidden(
f"cannot delete {object_type} :{id} . Because {object_type} has children "
)

depth = to_int(request.args.get("depth", 1))

# ??? PLUS VALABLE
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
from pypnusershub.tests.utils import set_logged_user_cookie

from gn_module_monitoring.tests.fixtures.generic import *
from gn_module_monitoring.monitoring.models import TMonitoringModules
from gn_module_monitoring.monitoring.models import TMonitoringModules, TMonitoringSites


def add_user_permission(module_code, user, scope, type_code_object, code_action="CRUVED"):
Expand Down Expand Up @@ -89,3 +89,29 @@ def test_get_export_csv(self, install_module_test, monitorings_users):
assert response.status_code == 200
assert response.headers.get("content-type") == expected_headers_content_type
assert expected in response.text

def test_delete_site_with_visits(self, sites, visits, monitorings_users):
"""
Test de suppression interdite d'un site qui a des visites associées.
"""
set_logged_user_cookie(self.client, monitorings_users["admin_user"])
# Choisir un site qui a au moins une visite (fixture visits crée une visite pour chaque site)
site = list(sites.values())[0]
id_base_site = site.id_base_site

r = self.client.delete(
url_for(
"monitorings.delete_object_api",
module_code="MONITORINGS",
object_type="site",
id=id_base_site,
)
)

# Vérification que la suppression est interdite
assert r.status_code == 403
assert "cannot delete" in r.json.get("description", "").lower()

# Vérifier que le site est toujours présent en base
site_in_db = db.get_or_404(TMonitoringSites, id_base_site)
assert site_in_db is not None
Original file line number Diff line number Diff line change
Expand Up @@ -492,15 +492,21 @@ export class MonitoringFormComponent implements OnInit {

onDelete() {
this.bDeleteSpinner = true;
this.obj.delete().subscribe((objData) => {
this.bDeleteSpinner = this.bDeleteModal = false;
this.obj.deleted = true;
this.objChanged.emit(this.obj);
this._commonService.regularToaster('info', this.msgToaster('Suppression'));
setTimeout(() => {
this.navigateToParent();
}, 100);
});
this.obj.delete().subscribe(
(objData) => {
this.bDeleteSpinner = this.bDeleteModal = false;
this.obj.deleted = true;
this.objChanged.emit(this.obj);
this._commonService.regularToaster('info', this.msgToaster('Suppression'));
setTimeout(() => {
this.navigateToParent();
}, 100);
},
(_) => {
this.bDeleteSpinner = false;
this.bDeleteModal = false;
}
);
}

onObjFormValueChange(event) {
Expand Down