From dcc3d5e8f89cd83c53a81b0f3725ac198e19f638 Mon Sep 17 00:00:00 2001 From: Carey P Gumaer Date: Thu, 27 Oct 2022 17:48:28 -0400 Subject: [PATCH 1/6] name offline site zip with short_id instead of name (#1546) --- .../pipelines/definitions/concourse/mass-build-sites.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/content_sync/pipelines/definitions/concourse/mass-build-sites.yml b/content_sync/pipelines/definitions/concourse/mass-build-sites.yml index be326850f..52bbb9419 100644 --- a/content_sync/pipelines/definitions/concourse/mass-build-sites.yml +++ b/content_sync/pipelines/definitions/concourse/mass-build-sites.yml @@ -207,14 +207,14 @@ jobs: echo "STARTING S3 SYNC FOR $NAME" > /dev/tty # START OFFLINE-ONLY cd $CURDIR/$SHORT_ID/public - zip $NAME.zip -r ./ - PUBLISH_S3_RESULT=$(aws s3((cli-endpoint-url)) sync ./ s3://((ocw-bucket))$PREFIX/$BASE_URL --exclude="*" --include="$NAME.zip" --metadata site-id=$NAME --only-show-errors) || PUBLISH_S3_RESULT=1 + zip $SHORT_ID.zip -r ./ + PUBLISH_S3_RESULT=$(aws s3((cli-endpoint-url)) sync ./ s3://((ocw-bucket))$PREFIX/$BASE_URL --exclude="*" --include="$SHORT_ID.zip" --metadata site-id=$NAME --only-show-errors) || PUBLISH_S3_RESULT=1 if [[ $PUBLISH_S3_RESULT == 1 ]] then - echo "SYNCING $NAME.zip to s3://((ocw-bucket))$PREFIX/$SITE_URL failed for $NAME" > /dev/tty + echo "SYNCING $SHORT_ID.zip to s3://((ocw-bucket))$PREFIX/$SITE_URL failed for $NAME" > /dev/tty return 1 fi - rm $NAME.zip + rm $SHORT_ID.zip cd $CURDIR # END OFFLINE-ONLY # START ONLINE-ONLY From 4167fb24ee1e690bc0ff2fbf32061e195910fe6e Mon Sep 17 00:00:00 2001 From: pt2302 Date: Mon, 31 Oct 2022 12:44:13 -0400 Subject: [PATCH 2/6] Use registry-image in concourse pipelines (#1553) * name offline site zip with short_id instead of name * Updating pipeline definitions for concourse with registry-image Co-authored-by: Carey P Gumaer --- .../concourse/mass-build-sites.yml | 18 ++++++++--------- .../concourse/remove-unpublished-sites.yml | 14 ++++++------- .../definitions/concourse/site-pipeline.yml | 20 +++++++++---------- .../concourse/theme-assets-pipeline.yml | 10 +++++----- 4 files changed, 31 insertions(+), 31 deletions(-) diff --git a/content_sync/pipelines/definitions/concourse/mass-build-sites.yml b/content_sync/pipelines/definitions/concourse/mass-build-sites.yml index 52bbb9419..62c92580b 100644 --- a/content_sync/pipelines/definitions/concourse/mass-build-sites.yml +++ b/content_sync/pipelines/definitions/concourse/mass-build-sites.yml @@ -1,12 +1,12 @@ --- resource_types: - name: http-resource - type: docker-image + type: registry-image source: repository: jgriff/http-resource tag: latest - name: s3-resource-iam - type: docker-image + type: registry-image source: repository: governmentpaas/s3-resource tag: latest @@ -37,7 +37,7 @@ resources: task-config: &webhook-config platform: linux image_resource: - type: docker-image + type: registry-image source: {repository: curlimages/curl} # END ONLINE-ONLY jobs: @@ -65,7 +65,7 @@ jobs: config: platform: linux image_resource: - type: docker-image + type: registry-image source: {repository: mitodl/ocw-course-publisher, tag: 0.3} inputs: - name: ocw-hugo-themes @@ -91,7 +91,7 @@ jobs: config: platform: linux image_resource: - type: docker-image + type: registry-image source: {repository: bash, tag: latest} outputs: - name: publishable_sites @@ -121,7 +121,7 @@ jobs: config: platform: linux image_resource: - type: docker-image + type: registry-image source: {repository: mitodl/ocw-course-publisher, tag: 0.3} inputs: - name: publishable_sites @@ -140,7 +140,7 @@ jobs: if [[ "$GIT_KEY" != "" ]] then echo $GIT_KEY > $CURDIR/git.key - sed -i -E "s/(-----BEGIN[^-]+-----)(.+)(-----END[^-]+-----)/-----BEGINSSHKEY-----\2\-----ENDSSHKEY-----/" git.key + sed -i -E "s/(-----BEGIN[^-]+-----)(.+)(-----END[^-]+-----)/-----BEGINSSHKEY-----\2\-----ENDSSHKEY-----/" git.key sed -i -E "s/\s/\n/g" git.key sed -i -E "s/SSHKEY/ OPENSSH PRIVATE KEY/g" git.key chmod 400 $CURDIR/git.key @@ -271,7 +271,7 @@ jobs: config: platform: linux image_resource: - type: docker-image + type: registry-image source: {repository: curlimages/curl} run: path: curl @@ -285,4 +285,4 @@ jobs: - 'Fastly-Soft-Purge: 1' - https://api.fastly.com/service/((fastly_((version)).service_id))/purge_all # END NON-DEV - # END ONLINE-ONLY \ No newline at end of file + # END ONLINE-ONLY diff --git a/content_sync/pipelines/definitions/concourse/remove-unpublished-sites.yml b/content_sync/pipelines/definitions/concourse/remove-unpublished-sites.yml index 47d3a2039..aa9847b2e 100644 --- a/content_sync/pipelines/definitions/concourse/remove-unpublished-sites.yml +++ b/content_sync/pipelines/definitions/concourse/remove-unpublished-sites.yml @@ -1,19 +1,19 @@ --- resource_types: - name: http-resource - type: docker-image + type: registry-image source: repository: jgriff/http-resource tag: latest - name: s3-resource-iam - type: docker-image + type: registry-image source: repository: governmentpaas/s3-resource tag: latest task-config: &webhook-config platform: linux image_resource: - type: docker-image + type: registry-image source: {repository: curlimages/curl} jobs: - name: remove-unpublished-sites @@ -25,7 +25,7 @@ jobs: config: platform: linux image_resource: - type: docker-image + type: registry-image source: {repository: bash, tag: latest} outputs: - name: unpublishable_sites @@ -51,7 +51,7 @@ jobs: config: platform: linux image_resource: - type: docker-image + type: registry-image source: {repository: curlimages/curl} run: path: curl @@ -96,7 +96,7 @@ jobs: config: platform: linux image_resource: - type: docker-image + type: registry-image source: {repository: amazon/aws-cli, tag: latest} run: path: sh @@ -131,7 +131,7 @@ jobs: config: platform: linux image_resource: - type: docker-image + type: registry-image source: {repository: curlimages/curl} run: path: curl diff --git a/content_sync/pipelines/definitions/concourse/site-pipeline.yml b/content_sync/pipelines/definitions/concourse/site-pipeline.yml index 6ec811574..740ec98a7 100644 --- a/content_sync/pipelines/definitions/concourse/site-pipeline.yml +++ b/content_sync/pipelines/definitions/concourse/site-pipeline.yml @@ -1,18 +1,18 @@ --- resource_types: - name: http-resource - type: docker-image + type: registry-image source: repository: jgriff/http-resource tag: latest - name: s3-resource-iam - type: docker-image + type: registry-image source: repository: governmentpaas/s3-resource tag: latest # START NON-DEV - name: slack-alert - type: docker-image + type: registry-image source: repository: arbourd/concourse-slack-alert-resource tag: v0.15.0 @@ -101,7 +101,7 @@ jobs: "version": "((pipeline_name))", "status": "errored" } - # START NON-DEV + # START NON-DEV - put: slack-webhook timeout: 1m params: @@ -119,7 +119,7 @@ jobs: "version": "((pipeline_name))", "status": "errored" } - # START NON-DEV + # START NON-DEV - put: slack-webhook timeout: 1m params: @@ -137,7 +137,7 @@ jobs: "version": "((pipeline_name))", "status": "aborted" } - # START NON-DEV + # START NON-DEV - put: slack-webhook timeout: 1m params: @@ -333,7 +333,7 @@ jobs: config: platform: linux image_resource: - type: docker-image + type: registry-image source: {repository: mitodl/ocw-course-publisher, tag: 0.3} inputs: - name: ocw-hugo-themes @@ -419,14 +419,14 @@ jobs: - name: course-markdown platform: linux image_resource: - type: docker-image + type: registry-image source: {repository: amazon/aws-cli, tag: latest} run: path: sh args: - -exc - | - aws s3((cli-endpoint-url)) sync s3://((ocw-studio-bucket))/((s3-path)) s3://((ocw-bucket))/((site-url)) --metadata site-id=((site-name)) + aws s3((cli-endpoint-url)) sync s3://((ocw-studio-bucket))/((s3-path)) s3://((ocw-bucket))/((site-url)) --metadata site-id=((site-name)) aws s3((cli-endpoint-url)) sync course-markdown/public s3://((ocw-bucket))/((base-url)) --metadata site-id=((site-name)) # START DEV-ONLY on_success: @@ -506,7 +506,7 @@ jobs: config: platform: linux image_resource: - type: docker-image + type: registry-image source: {repository: curlimages/curl} run: path: curl diff --git a/content_sync/pipelines/definitions/concourse/theme-assets-pipeline.yml b/content_sync/pipelines/definitions/concourse/theme-assets-pipeline.yml index ea560c520..85ce3c289 100644 --- a/content_sync/pipelines/definitions/concourse/theme-assets-pipeline.yml +++ b/content_sync/pipelines/definitions/concourse/theme-assets-pipeline.yml @@ -17,7 +17,7 @@ jobs: config: platform: linux image_resource: - type: docker-image + type: registry-image source: {repository: mitodl/ocw-course-publisher, tag: 0.3} inputs: - name: ocw-hugo-themes @@ -47,7 +47,7 @@ jobs: AWS_SECRET_ACCESS_KEY: ((minio-root-password)) # END DEV-ONLY image_resource: - type: docker-image + type: registry-image source: {repository: amazon/aws-cli, tag: latest} run: path: sh @@ -64,7 +64,7 @@ jobs: config: platform: linux image_resource: - type: docker-image + type: registry-image source: {repository: curlimages/curl} run: path: curl @@ -81,7 +81,7 @@ jobs: config: platform: linux image_resource: - type: docker-image + type: registry-image source: {repository: curlimages/curl} run: path: curl @@ -92,4 +92,4 @@ jobs: - -H - 'Fastly-Key: ((fastly_live.api_token))'((purge_header)) - https://api.fastly.com/service/((fastly_live.service_id))/purge/ocw-hugo-themes - # END NON-DEV \ No newline at end of file + # END NON-DEV From 168779415e6cda414fb3abff56c28ad981416b04 Mon Sep 17 00:00:00 2001 From: Abdurrehman <93309234+MAbdurrehman12@users.noreply.github.com> Date: Mon, 31 Oct 2022 23:32:49 +0500 Subject: [PATCH 3/6] ocw hugo themes sentry dsn added (#1548) * added ocw hugo themes sentry dsn * fix: formatting etc * check added * fix: formatting :/ * pipeline param renamed --- app.json | 4 ++++ content_sync/pipelines/concourse.py | 8 ++++++++ .../pipelines/definitions/concourse/mass-build-sites.yml | 1 + .../pipelines/definitions/concourse/site-pipeline.yml | 1 + main/settings.py | 5 +++++ 5 files changed, 19 insertions(+) diff --git a/app.json b/app.json index 58950be01..e0fe0a7bd 100644 --- a/app.json +++ b/app.json @@ -612,6 +612,10 @@ "YT_UPLOAD_LIMIT": { "description": "Max Youtube uploads allowed per day", "required": false + }, + "OCW_HUGO_THEMES_SENTRY_DSN": { + "description": "The sentry DSN that will be used in ocw-hugo-themes", + "required": false } }, "keywords": [ diff --git a/content_sync/pipelines/concourse.py b/content_sync/pipelines/concourse.py index c12ef3c00..c6d8d6b31 100644 --- a/content_sync/pipelines/concourse.py +++ b/content_sync/pipelines/concourse.py @@ -467,6 +467,10 @@ def upsert_pipeline(self): # pylint:disable=too-many-locals f" --endpoint-url {DEV_ENDPOINT_URL}" if is_dev() else "", ) .replace("((resource-base-url))", resource_base_url or "") + .replace( + "((ocw-hugo-themes-sentry-dsn))", + settings.OCW_HUGO_THEMES_SENTRY_DSN or "", + ) ) self.upsert_config(config_str, pipeline_name) @@ -669,6 +673,10 @@ def upsert_pipeline(self): # pylint:disable=too-many-locals and self.PROJECTS_BRANCH == settings.GITHUB_WEBHOOK_BRANCH ), ) + .replace( + "((ocw-hugo-themes-sentry-dsn))", + settings.OCW_HUGO_THEMES_SENTRY_DSN or "", + ) ) self.upsert_config(config_str, self.PIPELINE_NAME) diff --git a/content_sync/pipelines/definitions/concourse/mass-build-sites.yml b/content_sync/pipelines/definitions/concourse/mass-build-sites.yml index 62c92580b..772c8d561 100644 --- a/content_sync/pipelines/definitions/concourse/mass-build-sites.yml +++ b/content_sync/pipelines/definitions/concourse/mass-build-sites.yml @@ -113,6 +113,7 @@ jobs: GIT_KEY: ((git-private-key-var)) SITEMAP_DOMAIN: ((sitemap-domain)) PREFIX: ((prefix)) + SENTRY_DSN: ((ocw-hugo-themes-sentry-dsn)) # START DEV-ONLY AWS_ACCESS_KEY_ID: ((minio-root-user)) AWS_SECRET_ACCESS_KEY: ((minio-root-password)) diff --git a/content_sync/pipelines/definitions/concourse/site-pipeline.yml b/content_sync/pipelines/definitions/concourse/site-pipeline.yml index 740ec98a7..a43ede6bf 100644 --- a/content_sync/pipelines/definitions/concourse/site-pipeline.yml +++ b/content_sync/pipelines/definitions/concourse/site-pipeline.yml @@ -327,6 +327,7 @@ jobs: STATIC_API_BASE_URL: ((static-api-base-url)) OCW_IMPORT_STARTER_SLUG: ((ocw-import-starter-slug)) SITEMAP_DOMAIN: ((sitemap-domain)) + SENTRY_DSN: ((ocw-hugo-themes-sentry-dsn)) # START DEV-ONLY RESOURCE_BASE_URL: ((resource-base-url)) # END DEV-ONLY diff --git a/main/settings.py b/main/settings.py index 73ab8d77e..835a2ab56 100644 --- a/main/settings.py +++ b/main/settings.py @@ -1132,3 +1132,8 @@ default="ocw.mit.edu", description="The domain to be used in Hugo builds for fully qualified URLs in the sitemap", ) +OCW_HUGO_THEMES_SENTRY_DSN = get_string( + name="OCW_HUGO_THEMES_SENTRY_DSN", + required=False, + description="The sentry DSN that will be used in ocw-hugo-themes", +) From 27f122eeadf8e5b54c75c2c076196ca630740d16 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 1 Nov 2022 11:58:47 -0400 Subject: [PATCH 4/6] Bump nokogiri from 1.13.6 to 1.13.9 in /docs (#1537) --- docs/Gemfile.lock | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/docs/Gemfile.lock b/docs/Gemfile.lock index e58f77362..5dbca7e72 100644 --- a/docs/Gemfile.lock +++ b/docs/Gemfile.lock @@ -1,7 +1,7 @@ GEM remote: https://rubygems.org/ specs: - activesupport (6.0.3.2) + activesupport (6.0.6) concurrent-ruby (~> 1.0, >= 1.0.2) i18n (>= 0.7, < 2) minitest (~> 5.1) @@ -80,7 +80,7 @@ GEM octokit (~> 4.0) public_suffix (~> 3.0) typhoeus (~> 1.3) - html-pipeline (2.13.0) + html-pipeline (2.14.3) activesupport (>= 2) nokogiri (>= 1.4) http_parser.rb (0.6.0) @@ -193,7 +193,7 @@ GEM jekyll (>= 3.0, < 5.0) kramdown (1.17.0) liquid (4.0.3) - listen (3.2.1) + listen (3.7.1) rb-fsevent (~> 0.10, >= 0.10.3) rb-inotify (~> 0.9, >= 0.9.10) mercenary (0.3.6) @@ -202,9 +202,9 @@ GEM jekyll (>= 3.5, < 5.0) jekyll-feed (~> 0.9) jekyll-seo-tag (~> 2.1) - minitest (5.14.1) + minitest (5.16.3) multipart-post (2.1.1) - nokogiri (1.13.6) + nokogiri (1.13.9) mini_portile2 (~> 2.8.0) racc (~> 1.4) octokit (4.18.0) @@ -220,7 +220,7 @@ GEM rouge (3.19.0) ruby-enum (0.8.0) i18n - rubyzip (2.3.0) + rubyzip (2.3.2) safe_yaml (1.0.5) sass (3.7.4) sass-listen (~> 4.0.0) @@ -243,7 +243,7 @@ GEM unf_ext unf_ext (0.0.7.7) unicode-display_width (1.7.0) - zeitwerk (2.4.0) + zeitwerk (2.6.1) PLATFORMS ruby From 48b2e5e0a6bfe286e107aecc5bdb7dc8e347ac5b Mon Sep 17 00:00:00 2001 From: pt2302 Date: Tue, 1 Nov 2022 15:58:03 -0400 Subject: [PATCH 5/6] Management Command for Renaming Files on S3 (#1538) * Starting management command to rename files on S3 * Updating AWS bucket name * Slugify new filename * Updating WebsiteContent filename * Properly slugify filename and handle multiple extensions * Removing unnecessary cast to string * Replacing call to boto.resource with get_boto3_resource for minio compatibility * Moving rename_file function to GDrive API * Removing unused imports * Only rename file if there are no dependencies * Fixing linting error * Debugging Django database updates * Updating deletion for old object * Sync backend after delete * Refactoring to first perform Django operations before S3 * Updating location of success message * Fixing linting issue with too many local variables * Raising exceptions instead of logging errors * Added unit test for file renaming * Resolving missing bucket name in test --- gdrive_sync/api.py | 55 +++++++++++++++++++ gdrive_sync/api_test.py | 18 ++++++ .../management/commands/rename_by_text_id.py | 31 +++++++++++ 3 files changed, 104 insertions(+) create mode 100644 websites/management/commands/rename_by_text_id.py diff --git a/gdrive_sync/api.py b/gdrive_sync/api.py index c27962da0..120973f81 100644 --- a/gdrive_sync/api.py +++ b/gdrive_sync/api.py @@ -4,12 +4,14 @@ import logging import os from datetime import datetime +from pathlib import Path from typing import Dict, Iterable, Optional import PyPDF2 from botocore.exceptions import ClientError from django.conf import settings from django.db import transaction +from django.db.models import Q from django.utils.text import slugify from google.oauth2.service_account import ( # pylint:disable=no-name-in-module Credentials as ServiceAccountCredentials, @@ -17,6 +19,7 @@ from googleapiclient.discovery import Resource, build from googleapiclient.http import MediaIoBaseDownload +from content_sync.api import get_sync_backend from content_sync.decorators import retry_on_failure from gdrive_sync.constants import ( DRIVE_FOLDER_FILES, @@ -29,11 +32,13 @@ ) from gdrive_sync.models import DriveFile from main.s3_utils import get_boto3_resource +from main.utils import get_dirpath_and_filename from videos.api import create_media_convert_job from videos.constants import VideoJobStatus, VideoStatus from videos.models import Video, VideoJob from websites.api import get_valid_new_filename from websites.constants import ( + CONTENT_TYPE_PAGE, CONTENT_TYPE_RESOURCE, RESOURCE_TYPE_DOCUMENT, RESOURCE_TYPE_IMAGE, @@ -485,3 +490,53 @@ def update_sync_status(website: Website, sync_datetime: datetime): website.sync_status = new_status website.sync_errors = (website.sync_errors or []) + errors website.save() + + +@transaction.atomic +def rename_file(obj_text_id, obj_new_filename): + """Rename the file on S3 associated with the WebsiteContent object to a new filename.""" + obj = WebsiteContent.objects.get(text_id=obj_text_id) + site = obj.website + df = DriveFile.objects.get(resource=obj) + s3 = get_boto3_resource("s3") + # slugify just the provided name and then make the extensions lowercase + filepath = Path(obj_new_filename) + new_filename = slugify(obj_new_filename.rstrip("".join(filepath.suffixes))) + if filepath.suffixes: + new_filename += "".join(filepath.suffixes).lower() + df_path = df.s3_key.split("/") + df_path[-1] = new_filename + new_key = "/".join(df_path) + # check if an object with the new filename already exists in this course + existing_obj = WebsiteContent.objects.filter(Q(website=site) & Q(file=new_key)) + if existing_obj: + old_obj = existing_obj.first() + if old_obj == obj: + raise Exception("New filename is the same as the existing filename.") + dependencies = WebsiteContent.objects.filter( + Q(website=site) + & Q(type=CONTENT_TYPE_PAGE) + & Q(markdown__icontains=old_obj.text_id), + ) + if dependencies: + raise Exception( + "Not renaming file due to dependencies in existing content: " + + str(dependencies) + ) + + log.info("Found existing file with same name. Overwriting it.") + old_obj.delete() + backend = get_sync_backend(site) + backend.sync_all_content_to_backend() + + old_key = df.s3_key + df.s3_key = new_key + obj.file = new_key + obj.filename = get_dirpath_and_filename(new_filename)[1] + df.save() + obj.save() + + s3.Object(settings.AWS_STORAGE_BUCKET_NAME, new_key).copy_from( + CopySource=settings.AWS_STORAGE_BUCKET_NAME + "/" + old_key + ) + s3.Object(settings.AWS_STORAGE_BUCKET_NAME, old_key).delete() diff --git a/gdrive_sync/api_test.py b/gdrive_sync/api_test.py index 2fa8fa33d..f4e37fb82 100644 --- a/gdrive_sync/api_test.py +++ b/gdrive_sync/api_test.py @@ -16,6 +16,7 @@ gdrive_root_url, get_resource_type, process_file_result, + rename_file, transcode_gdrive_video, update_sync_status, walk_gdrive_folder, @@ -778,3 +779,20 @@ def mock_next_chunk(): bytes_idx += chunk_size assert reader.downloader._chunksize == chunk_size assert bytes_read == b"".join(expected_bytes[i : i + chunk_size]) + + +def test_rename_file(mocker, settings): + """rename_file should update the WebsiteContent and DriveFile objects with a new file path""" + content = WebsiteContentFactory.create( + file="test/path/old_name.pdf", text_id="abc-123" + ) + drive_file = DriveFileFactory.create( + website=content.website, s3_key="test/path/old_name.pdf", resource=content + ) + mocker.patch("main.s3_utils.boto3") + settings.AWS_STORAGE_BUCKET_NAME = "test-bucket" + rename_file("abc-123", "new_name.pdf") + content.refresh_from_db() + drive_file.refresh_from_db() + assert content.file == "test/path/new_name.pdf" + assert drive_file.s3_key == "test/path/new_name.pdf" diff --git a/websites/management/commands/rename_by_text_id.py b/websites/management/commands/rename_by_text_id.py new file mode 100644 index 000000000..512f5933b --- /dev/null +++ b/websites/management/commands/rename_by_text_id.py @@ -0,0 +1,31 @@ +from django.conf import settings +from django.core.management import BaseCommand +from django.utils.text import slugify + +from gdrive_sync.api import rename_file + + +class Command(BaseCommand): + """Rename the file on S3 associated with the WebsiteContent object to a new filename, and update the object and corresponding DriveFile.""" + + help = __doc__ + + def add_arguments(self, parser): + + parser.add_argument( + "--text_id", + dest="text_id", + help="text_id of WebsiteContent object to be updated", + required=True, + ) + + parser.add_argument( + "--new_filename", + dest="new_filename", + help="New filename to be associated with the WebsiteContent object", + required=True, + ) + + def handle(self, *args, **options): + rename_file(options["text_id"], options["new_filename"]) + self.stdout.write("File successfully renamed.\n") From ab13fea4caa54b455438e69a52fa2e651905f0cb Mon Sep 17 00:00:00 2001 From: Doof Date: Tue, 1 Nov 2022 20:40:48 +0000 Subject: [PATCH 6/6] Release 0.79.0 --- RELEASE.rst | 9 +++++++++ main/settings.py | 2 +- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/RELEASE.rst b/RELEASE.rst index 8692bca6f..9eedde097 100644 --- a/RELEASE.rst +++ b/RELEASE.rst @@ -1,6 +1,15 @@ Release Notes ============= +Version 0.79.0 +-------------- + +- Management Command for Renaming Files on S3 (#1538) +- Bump nokogiri from 1.13.6 to 1.13.9 in /docs (#1537) +- ocw hugo themes sentry dsn added (#1548) +- Use registry-image in concourse pipelines (#1553) +- name offline site zip with short_id instead of name (#1546) + Version 0.78.3 (Released November 01, 2022) -------------- diff --git a/main/settings.py b/main/settings.py index 302e6db24..b36e665f4 100644 --- a/main/settings.py +++ b/main/settings.py @@ -24,7 +24,7 @@ # pylint: disable=too-many-lines -VERSION = "0.78.3" +VERSION = "0.79.0" SITE_ID = get_int( name="OCW_STUDIO_SITE_ID",