Skip to content

Commit 20245ec

Browse files
fix: move common function to a new file
1 parent da7328e commit 20245ec

4 files changed

Lines changed: 45 additions & 31 deletions

File tree

cms/djangoapps/contentstore/git_export_utils.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ def export_library_v2_to_zip(library_key, root_dir, library_dir, user=None):
8585
Raises:
8686
Exception: If backup creation or extraction fails
8787
"""
88-
from openedx.core.djangoapps.content_libraries.tasks import create_library_v2_zip
88+
from openedx.core.djangoapps.content_libraries.api import create_library_v2_zip
8989

9090
# Get user object for backup API
9191
user_obj = User.objects.filter(username=user).first()

openedx/core/djangoapps/content_libraries/api/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
"""
22
Python API for working with content libraries
33
"""
4+
from .backup import *
45
from .block_metadata import *
56
from .collections import *
67
from .container_metadata import *
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
"""
2+
Public API for content library backup (zip export) utilities.
3+
"""
4+
from __future__ import annotations
5+
6+
import os
7+
from datetime import datetime
8+
from tempfile import mkdtemp
9+
10+
from django.conf import settings
11+
from django.utils.text import slugify
12+
from opaque_keys.edx.locator import LibraryLocatorV2
13+
from path import Path
14+
15+
from openedx_content.api import create_zip_file as create_lib_zip_file
16+
17+
__all__ = ["create_library_v2_zip"]
18+
19+
20+
def create_library_v2_zip(library_key: LibraryLocatorV2, user) -> tuple:
21+
"""
22+
Create a zip backup of a v2 library and return ``(temp_dir, zip_file_path)``.
23+
24+
The caller is responsible for cleaning up ``temp_dir`` when done.
25+
26+
Args:
27+
library_key: LibraryLocatorV2 identifying the library to export.
28+
user: User object passed to the backup API.
29+
30+
Returns:
31+
A tuple of ``(temp_dir as Path, zip_file_path as str)``.
32+
"""
33+
root_dir = Path(mkdtemp())
34+
sanitized_lib_key = str(library_key).replace(":", "-")
35+
sanitized_lib_key = slugify(sanitized_lib_key, allow_unicode=True)
36+
timestamp = datetime.now().strftime("%Y-%m-%d-%H%M%S")
37+
filename = f'{sanitized_lib_key}-{timestamp}.zip'
38+
file_path = os.path.join(root_dir, filename)
39+
origin_server = getattr(settings, 'CMS_BASE', None)
40+
create_lib_zip_file(lp_key=str(library_key), path=file_path, user=user, origin_server=origin_server)
41+
return root_dir, file_path

openedx/core/djangoapps/content_libraries/tasks.py

Lines changed: 2 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -19,20 +19,17 @@
1919
from io import StringIO
2020
import logging
2121
import os
22-
from datetime import datetime
23-
from tempfile import mkdtemp, NamedTemporaryFile
22+
from tempfile import NamedTemporaryFile
2423
import json
2524
import shutil
2625

2726
from django.core.files.base import ContentFile
2827
from django.contrib.auth import get_user_model
2928
from django.core.serializers.json import DjangoJSONEncoder
30-
from django.conf import settings
3129
from celery import shared_task
3230
from celery.utils.log import get_task_logger
3331
from celery_utils.logged_task import LoggedTask
3432
from django.core.files import File
35-
from django.utils.text import slugify
3633
from edx_django_utils.monitoring import (
3734
set_code_owner_attribute,
3835
set_code_owner_attribute_from_module,
@@ -58,9 +55,7 @@
5855
LIBRARY_CONTAINER_UPDATED
5956
)
6057
from openedx_content import api as content_api
61-
from openedx_content.api import create_zip_file as create_lib_zip_file
6258
from openedx_content.models_api import DraftChangeLog, PublishLog
63-
from path import Path
6459
from user_tasks.models import UserTaskArtifact
6560
from user_tasks.tasks import UserTask, UserTaskStatus
6661
from xblock.fields import Scope
@@ -76,6 +71,7 @@
7671
from cms.djangoapps.contentstore.storage import course_import_export_storage
7772

7873
from . import api
74+
from .api import create_library_v2_zip
7975
from .models import ContentLibraryBlockImportTask
8076

8177
log = logging.getLogger(__name__)
@@ -508,30 +504,6 @@ def _copy_overrides(
508504
store.update_item(dest_block, user_id)
509505

510506

511-
def create_library_v2_zip(library_key: LibraryLocatorV2, user: User) -> tuple:
512-
"""
513-
Create a zip backup of a v2 library and return ``(temp_dir, zip_file_path)``.
514-
515-
The caller is responsible for cleaning up ``temp_dir`` when done.
516-
517-
Args:
518-
library_key: LibraryLocatorV2 identifying the library to export.
519-
user: User object passed to the backup API.
520-
521-
Returns:
522-
A tuple of ``(temp_dir as Path, zip_file_path as str)``.
523-
"""
524-
root_dir = Path(mkdtemp())
525-
sanitized_lib_key = str(library_key).replace(":", "-")
526-
sanitized_lib_key = slugify(sanitized_lib_key, allow_unicode=True)
527-
timestamp = datetime.now().strftime("%Y-%m-%d-%H%M%S")
528-
filename = f'{sanitized_lib_key}-{timestamp}.zip'
529-
file_path = os.path.join(root_dir, filename)
530-
origin_server = getattr(settings, 'CMS_BASE', None)
531-
create_lib_zip_file(lp_key=str(library_key), path=file_path, user=user, origin_server=origin_server)
532-
return root_dir, file_path
533-
534-
535507
class LibraryBackupTask(UserTask): # pylint: disable=abstract-method
536508
"""
537509
Base class for tasks related with Library backup functionality.

0 commit comments

Comments
 (0)