Skip to content

Commit 3de457a

Browse files
authored
Merge pull request #14343 from rtibblesbot/issue-9251-8074cb
Consolidate deprovision to reuse facility deletion utilities
2 parents 02e0bca + 1aff72c commit 3de457a

File tree

3 files changed

+52
-63
lines changed

3 files changed

+52
-63
lines changed

kolibri/core/auth/management/commands/deprovision.py

Lines changed: 0 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,44 +1,14 @@
11
import logging
22
import sys
33

4-
from morango.models import Certificate
5-
from morango.models import DatabaseIDModel
6-
from morango.models import DatabaseMaxCounter
7-
from morango.models import DeletedModels
8-
from morango.models import HardDeletedModels
9-
from morango.models import Store
10-
114
from kolibri.core.auth.management.utils import confirm_or_exit
12-
from kolibri.core.auth.models import FacilityDataset
13-
from kolibri.core.auth.models import FacilityUser
145
from kolibri.core.auth.utils.deprovision import deprovision
156
from kolibri.core.auth.utils.deprovision import get_deprovision_progress_total
16-
from kolibri.core.device.models import DevicePermissions
17-
from kolibri.core.device.models import DeviceSettings
18-
from kolibri.core.logger.models import AttemptLog
19-
from kolibri.core.logger.models import ContentSessionLog
20-
from kolibri.core.logger.models import ContentSummaryLog
217
from kolibri.core.tasks.management.commands.base import AsyncCommand
228
from kolibri.utils.cli import server
239

2410
logger = logging.getLogger(__name__)
2511

26-
MODELS_TO_DELETE = [
27-
AttemptLog,
28-
ContentSessionLog,
29-
ContentSummaryLog,
30-
FacilityUser,
31-
FacilityDataset,
32-
HardDeletedModels,
33-
Certificate,
34-
DatabaseIDModel,
35-
Store,
36-
DevicePermissions,
37-
DeletedModels,
38-
DeviceSettings,
39-
DatabaseMaxCounter,
40-
]
41-
4212

4313
class Command(AsyncCommand):
4414
help = "Delete all facility user data from the local database, and put it back to a clean state (but leaving content as-is)."

kolibri/core/auth/test/test_deprovisioning.py

Lines changed: 32 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,20 +4,46 @@
44
from django.test import override_settings
55
from django.test import TestCase
66
from mock import patch
7+
from morango.models import Certificate
8+
from morango.models import DatabaseIDModel
9+
from morango.models import DatabaseMaxCounter
10+
from morango.models import DeletedModels
11+
from morango.models import HardDeletedModels
12+
from morango.models import Store
713
from morango.sync.controller import MorangoProfileController
814

915
from .. import models as auth_models
10-
from ..management.commands import deprovision
1116
from .helpers import setup_device
1217
from .test_api import ClassroomFactory
1318
from .test_api import LearnerGroupFactory
1419
from kolibri.core.auth.constants.morango_sync import PROFILE_FACILITY_DATA
1520
from kolibri.core.content import models as content_models
21+
from kolibri.core.device.models import DevicePermissions
22+
from kolibri.core.device.models import DeviceSettings
23+
from kolibri.core.logger.models import AttemptLog
24+
from kolibri.core.logger.models import ContentSessionLog
25+
from kolibri.core.logger.models import ContentSummaryLog
1626
from kolibri.core.logger.test.factory_logger import ContentSessionLogFactory
1727
from kolibri.core.logger.test.factory_logger import ContentSummaryLogFactory
1828
from kolibri.core.logger.test.factory_logger import FacilityUserFactory
1929
from kolibri.core.logger.test.factory_logger import UserSessionLogFactory
2030

31+
MODELS_DELETED_BY_DEPROVISION = [
32+
AttemptLog,
33+
ContentSessionLog,
34+
ContentSummaryLog,
35+
auth_models.FacilityUser,
36+
auth_models.FacilityDataset,
37+
HardDeletedModels,
38+
Certificate,
39+
DatabaseIDModel,
40+
Store,
41+
DevicePermissions,
42+
DeletedModels,
43+
DeviceSettings,
44+
DatabaseMaxCounter,
45+
]
46+
2147

2248
def count_instances(models):
2349
return sum([model.objects.count() for model in models])
@@ -54,16 +80,18 @@ def setUp(self):
5480
MorangoProfileController(PROFILE_FACILITY_DATA).serialize_into_store()
5581

5682
@patch("kolibri.core.auth.management.commands.deprovision.confirm_or_exit")
57-
def test_setup_no_headers_bad_user_good_user(self, confirm_or_exit_mock):
83+
def test_deprovision_deletes_user_data_preserves_content(
84+
self, confirm_or_exit_mock
85+
):
5886
models_that_should_remain = [
5987
content_models.LocalFile,
6088
content_models.ContentNode,
6189
content_models.File,
6290
content_models.AssessmentMetaData,
6391
]
64-
assert count_instances(deprovision.MODELS_TO_DELETE) > 0
92+
assert count_instances(MODELS_DELETED_BY_DEPROVISION) > 0
6593
initial_model_count = count_instances(models_that_should_remain)
6694
assert initial_model_count > 0
6795
call_command("deprovision")
68-
assert count_instances(deprovision.MODELS_TO_DELETE) == 0
96+
assert count_instances(MODELS_DELETED_BY_DEPROVISION) == 0
6997
assert count_instances(models_that_should_remain) == initial_model_count
Lines changed: 20 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,47 +1,38 @@
1-
from morango.models import Certificate
21
from morango.models import DatabaseIDModel
3-
from morango.models import DatabaseMaxCounter
4-
from morango.models import DeletedModels
52
from morango.models import HardDeletedModels
6-
from morango.models import Store
73

8-
from kolibri.core.auth.models import FacilityDataset
9-
from kolibri.core.auth.models import FacilityUser
4+
from kolibri.core.auth.models import dataset_cache
5+
from kolibri.core.auth.models import Facility
6+
from kolibri.core.auth.utils.delete import clean_up_legacy_counters
107
from kolibri.core.auth.utils.delete import DisablePostDeleteSignal
11-
from kolibri.core.device.models import DevicePermissions
8+
from kolibri.core.auth.utils.delete import get_delete_group_for_facility
129
from kolibri.core.device.models import DeviceSettings
13-
from kolibri.core.logger.models import AttemptLog
14-
from kolibri.core.logger.models import ContentSessionLog
15-
from kolibri.core.logger.models import ContentSummaryLog
1610
from kolibri.core.tasks.main import job_storage
1711

18-
MODELS_TO_DELETE = [
19-
AttemptLog,
20-
ContentSessionLog,
21-
ContentSummaryLog,
22-
FacilityUser,
23-
FacilityDataset,
24-
HardDeletedModels,
25-
Certificate,
26-
DatabaseIDModel,
27-
Store,
28-
DevicePermissions,
29-
DeletedModels,
30-
DeviceSettings,
31-
DatabaseMaxCounter,
32-
]
33-
3412

3513
def deprovision(progress_update=None):
3614
with DisablePostDeleteSignal():
37-
for Model in MODELS_TO_DELETE:
38-
Model.objects.all().delete()
15+
facilities = Facility.objects.all()
16+
for facility in facilities:
17+
delete_group = get_delete_group_for_facility(facility)
18+
delete_group.delete()
3919
if progress_update:
4020
progress_update(1)
4121

22+
clean_up_legacy_counters()
23+
dataset_cache.clear()
24+
25+
# Delete device-level models not covered by facility deletion
26+
HardDeletedModels.objects.all().delete()
27+
DatabaseIDModel.objects.all().delete()
28+
DeviceSettings.objects.all().delete()
29+
4230
# Clear all completed, failed or cancelled jobs
4331
job_storage.clear()
4432

33+
if progress_update:
34+
progress_update(1)
35+
4536

4637
def get_deprovision_progress_total():
47-
return len(MODELS_TO_DELETE)
38+
return Facility.objects.count() + 1 # +1 for cleanup step

0 commit comments

Comments
 (0)