Skip to content

Commit ff63d7f

Browse files
committed
fixing import/export tests
1 parent 8aa9e57 commit ff63d7f

File tree

7 files changed

+72
-81
lines changed

7 files changed

+72
-81
lines changed

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

+2-2
Original file line numberDiff line numberDiff line change
@@ -246,8 +246,8 @@ def get_facility(self, options):
246246

247247
def get_filename(self, options, facility):
248248
if options["output_file"] is None:
249-
filename = CSV_EXPORT_FILENAMES["user"].format(
250-
facility.name, facility.id[:4]
249+
filename = default_storage.get_available_name(
250+
CSV_EXPORT_FILENAMES["user"].format(facility.name, facility.id[:4])
251251
)
252252
else:
253253
filename = options["output_file"]

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

+2-4
Original file line numberDiff line numberDiff line change
@@ -197,8 +197,7 @@ def handle(self, *args, **options):
197197

198198
fieldnames = input_fields + tuple(val for val in labels.values())
199199

200-
csv_file = open_csv_for_reading(options["filepath"])
201-
with csv_file as f:
200+
with open_csv_for_reading(options["filepath"]) as f:
202201
header = next(csv.reader(f, strict=True))
203202
has_header = False
204203
if all(col in fieldnames for col in header):
@@ -213,8 +212,7 @@ def handle(self, *args, **options):
213212
"Mix of valid and invalid header labels found in first row"
214213
)
215214

216-
csv_file = open_csv_for_reading(options["filepath"])
217-
with csv_file as f:
215+
with open_csv_for_reading(options["filepath"]) as f:
218216
if has_header:
219217
reader = csv.DictReader(f, strict=True)
220218
else:

kolibri/core/auth/test/test_user_import.py

+30-29
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import csv
2-
import os
3-
import tempfile
42

3+
from django.core.files.storage import default_storage
54
from django.core.management import call_command
65
from django.core.management.base import CommandError
76
from django.test import TestCase
@@ -137,11 +136,8 @@ def test_create_user_not_exist_bad_username(self):
137136

138137
class DeviceNotSetup(TestCase):
139138
def test_device_not_setup(self):
140-
csvfile, csvpath = tempfile.mkstemp(suffix="csv")
141139
with self.assertRaisesRegex(CommandError, "No default facility exists"):
142-
call_command("importusers", csvpath)
143-
os.close(csvfile)
144-
os.remove(csvpath)
140+
call_command("importusers", "you_cannot_import_yet.csv")
145141

146142

147143
class UserImportCommandTestCase(TestCase):
@@ -157,34 +153,32 @@ def setUpClass(self):
157153
self.facility, self.superuser = setup_device()
158154

159155
def setUp(self):
160-
self.csvfile, self.csvpath = tempfile.mkstemp(suffix="csv")
156+
self.csvfilename = default_storage.get_available_name("test.csv")
161157

162158
def tearDown(self):
163159
FacilityUser.objects.exclude(username=self.superuser.username).delete()
164-
os.close(self.csvfile)
165-
os.remove(self.csvpath)
160+
default_storage.delete(self.csvfilename)
166161

167162
def importFromRows(self, *args):
168-
csv_file = open_csv_for_writing(self.csvpath)
169-
with csv_file as f:
163+
with open_csv_for_writing(self.csvfilename) as f:
170164
writer = csv.writer(f)
171165
writer.writerows([a for a in args])
172166

173-
call_command("importusers", self.csvpath)
167+
call_command("importusers", self.csvfilename)
174168

175169
def test_setup_headers_no_username(self):
176170
with self.assertRaisesRegex(CommandError, "No usernames specified"):
177171
self.importFromRows(["class", "facility"])
178-
call_command("importusers", self.csvpath)
172+
call_command("importusers", self.csvfilename)
179173

180174
def test_setup_headers_invalid_header(self):
181175
with self.assertRaisesRegex(CommandError, "Mix of valid and invalid header"):
182176
self.importFromRows(["class", "facility", "dogfood"])
183-
call_command("importusers", self.csvpath)
177+
call_command("importusers", self.csvfilename)
184178

185179
def test_setup_headers_make_user(self):
186180
self.importFromRows(["username"], ["testuser"])
187-
call_command("importusers", self.csvpath)
181+
call_command("importusers", self.csvfilename)
188182
self.assertTrue(FacilityUser.objects.filter(username="testuser").exists())
189183

190184
def test_setup_no_headers_make_user(self):
@@ -271,10 +265,13 @@ def test_import_from_export_csv(self):
271265
for user in users:
272266
FacilityUser.objects.create(facility=self.facility, **user)
273267
call_command(
274-
"exportusers", output_file=self.csvpath, overwrite=True, demographic=True
268+
"exportusers",
269+
output_file=self.csvfilename,
270+
overwrite=True,
271+
demographic=True,
275272
)
276273
FacilityUser.objects.all().delete()
277-
call_command("importusers", self.csvpath)
274+
call_command("importusers", self.csvfilename)
278275
for user in users:
279276
user_model = FacilityUser.objects.get(username=user["username"])
280277
self.assertEqual(user_model.gender, user["gender"])
@@ -284,16 +281,18 @@ def test_import_from_export_csv(self):
284281
def test_import_from_export_missing_headers(self):
285282
for user in users:
286283
FacilityUser.objects.create(facility=self.facility, **user)
284+
287285
call_command(
288-
"exportusers", output_file=self.csvpath, overwrite=True, demographic=True
286+
"exportusers",
287+
output_file=self.csvfilename,
288+
overwrite=True,
289+
demographic=True,
289290
)
290291
cols_to_remove = ["Facility id", "Gender"]
291-
csv_file = open_csv_for_reading(self.csvpath)
292-
with csv_file as source:
292+
with open_csv_for_reading(self.csvfilename) as source:
293293
reader = csv.DictReader(source)
294294
rows = [row for row in reader]
295-
csv_file = open_csv_for_writing(self.csvpath)
296-
with csv_file as result:
295+
with open_csv_for_writing("new" + self.csvfilename) as result:
297296
writer = csv.DictWriter(
298297
result,
299298
tuple(
@@ -305,8 +304,9 @@ def test_import_from_export_missing_headers(self):
305304
for col in cols_to_remove:
306305
del row[col]
307306
writer.writerow(row)
307+
308308
FacilityUser.objects.all().delete()
309-
call_command("importusers", self.csvpath)
309+
call_command("importusers", "new" + self.csvfilename)
310310
for user in users:
311311
user_model = FacilityUser.objects.get(username=user["username"])
312312
self.assertEqual(user_model.birth_year, user["birth_year"])
@@ -316,15 +316,16 @@ def test_import_from_export_mixed_headers(self):
316316
for user in users:
317317
FacilityUser.objects.create(facility=self.facility, **user)
318318
call_command(
319-
"exportusers", output_file=self.csvpath, overwrite=True, demographic=True
319+
"exportusers",
320+
output_file=self.csvfilename,
321+
overwrite=True,
322+
demographic=True,
320323
)
321324
cols_to_replace = {"Facility id": "facility", "Gender": "gender"}
322-
csv_file = open_csv_for_reading(self.csvpath)
323-
with csv_file as source:
325+
with open_csv_for_reading(self.csvfilename) as source:
324326
reader = csv.DictReader(source)
325327
rows = [row for row in reader]
326-
csv_file = open_csv_for_writing(self.csvpath)
327-
with csv_file as result:
328+
with open_csv_for_writing("new" + self.csvfilename) as result:
328329
writer = csv.DictWriter(
329330
result,
330331
tuple(
@@ -339,7 +340,7 @@ def test_import_from_export_mixed_headers(self):
339340
del row[col]
340341
writer.writerow(row)
341342
FacilityUser.objects.all().delete()
342-
call_command("importusers", self.csvpath)
343+
call_command("importusers", "new" + self.csvfilename)
343344
for user in users:
344345
user_model = FacilityUser.objects.get(username=user["username"])
345346
self.assertEqual(user_model.birth_year, user["birth_year"])

kolibri/core/logger/csv_export.py

+3-5
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
import datetime
33
import logging
44
import math
5-
import os
65
from collections import OrderedDict
76

87
from dateutil import parser
@@ -11,6 +10,7 @@
1110
from django.db.models import Max
1211
from django.db.models import OuterRef
1312
from django.db.models import Subquery
13+
from django.core.files.storage import default_storage
1414
from django.utils.translation import gettext_lazy as _
1515
from django.utils.translation import pgettext_lazy
1616
from le_utils.constants import content_kinds
@@ -256,7 +256,7 @@ def csv_file_generator(
256256
else parser.parse(end_date) + datetime.timedelta(days=1)
257257
)
258258

259-
if not overwrite and os.path.exists(filepath):
259+
if not overwrite and default_storage.exists(filepath):
260260
raise ValueError("{} already exists".format(filepath))
261261
queryset = log_info["queryset"].filter(
262262
dataset_id=facility.dataset_id,
@@ -285,9 +285,7 @@ def csv_file_generator(
285285
label for _, label in topic_headers
286286
]
287287

288-
csv_file = open_csv_for_writing(filepath)
289-
290-
with csv_file as f:
288+
with open_csv_for_writing(filepath) as f:
291289
writer = csv.DictWriter(f, header_labels)
292290
logger.info("Creating csv file {filename}".format(filename=filepath))
293291
writer.writeheader()

kolibri/core/logger/tasks.py

+5-11
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import os
22

3+
from django.core.files.storage import default_storage
34
from django.core.management import call_command
45
from rest_framework import serializers
56

@@ -12,18 +13,13 @@
1213
from kolibri.core.tasks.decorators import register_task
1314
from kolibri.core.tasks.permissions import IsAdminForJob
1415
from kolibri.core.tasks.validation import JobValidator
15-
from kolibri.utils import conf
1616

1717
LOGS_CLEANUP_JOB_ID = "18"
1818

1919

2020
def get_filepath(log_type, facility_id, start_date, end_date):
2121
facility = Facility.objects.get(id=facility_id)
22-
logs_dir = os.path.join(conf.KOLIBRI_HOME, "log_export")
23-
if not os.path.isdir(logs_dir):
24-
os.mkdir(logs_dir)
25-
filepath = os.path.join(
26-
logs_dir,
22+
filepath = default_storage.path(
2723
CSV_EXPORT_FILENAMES[log_type].format(
2824
facility.name, facility.id[:4], start_date[:10], end_date[:10]
2925
),
@@ -177,10 +173,8 @@ def log_exports_cleanup():
177173
Cleanup log_exports csv files that does not have
178174
related reocord in GenerateCSVLogRequest model
179175
"""
180-
logs_dir = os.path.join(conf.KOLIBRI_HOME, "log_export")
181-
if not os.path.isdir(logs_dir):
182-
return
183176
valid_filenames_set = get_valid_filenames()
184-
for filename in os.listdir(logs_dir):
177+
_, files_in_storage = default_storage.listdir("")
178+
for filename in files_in_storage:
185179
if filename not in valid_filenames_set:
186-
os.remove(os.path.join(logs_dir, filename))
180+
default_storage.delete(filename)

0 commit comments

Comments
 (0)