Skip to content

Commit

Permalink
Merge branch 'release/v2.10' into main
Browse files Browse the repository at this point in the history
  • Loading branch information
Chris Thornton committed Sep 22, 2023
2 parents e4f1d4b + 5b43051 commit cf3d305
Show file tree
Hide file tree
Showing 15 changed files with 66 additions and 48 deletions.
8 changes: 4 additions & 4 deletions lti_emailer/canvas_api_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,20 +16,20 @@
from canvas_sdk.utils import get_all_list_data
from canvas_sdk.exceptions import CanvasAPIError

from icommons_common.canvas_utils import SessionInactivityExpirationRC
from icommons_common.canvas_api.helpers import (
from canvas_sdk.client import RequestContext
from canvas_api.helpers import (
courses as canvas_api_helper_courses,
sections as canvas_api_helper_sections)

from lti_permissions.verification import is_allowed
from lti_school_permissions.verification import is_allowed


cache = caches['shared']
logger = logging.getLogger(__name__)

CACHE_KEY_COMM_CHANNELS_BY_CANVAS_USER_ID = "comm-channels-by-canvas-user-id_%s"
CACHE_KEY_USER_IN_ACCOUNT_BY_SEARCH_TERM = "user-in-account-{}-by-search-term-{}"
SDK_CONTEXT = SessionInactivityExpirationRC(**settings.CANVAS_SDK_SETTINGS)
SDK_CONTEXT = RequestContext(**settings.CANVAS_SDK_SETTINGS)
TEACHING_STAFF_ENROLLMENT_TYPES = ['TeacherEnrollment', 'TaEnrollment', 'DesignerEnrollment']
USER_ATTRIBUTES_TO_COPY = ['email', 'name', 'sortable_name']

Expand Down
8 changes: 4 additions & 4 deletions lti_emailer/management/commands/report_user_primary_email.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,17 +5,17 @@
from django.conf import settings
from django.core.management.base import BaseCommand, CommandError

from icommons_common.models import Term, CourseInstance
from coursemanager.models import Term, CourseInstance

from canvas_sdk.utils import get_all_list_data
from canvas_sdk.methods.courses import list_users_in_course_users
from canvas_sdk.exceptions import CanvasAPIError

from icommons_common.canvas_utils import SessionInactivityExpirationRC
from icommons_common.models import Person
from canvas_sdk.client import RequestContext
from coursemanager.people_models import Person


SDK_CONTEXT = SessionInactivityExpirationRC(**settings.CANVAS_SDK_SETTINGS)
SDK_CONTEXT = RequestContext(**settings.CANVAS_SDK_SETTINGS)
logger = logging.getLogger(__name__)


Expand Down
7 changes: 5 additions & 2 deletions lti_emailer/requirements/base.txt
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
Django==3.2.15
Django==3.2.16
django-cached-authentication-middleware==0.2.2
django-redis-cache==3.0.1
flanker==0.9.11
Expand All @@ -14,8 +14,11 @@ django-allow-cidr==0.5.0
django-watchman==1.3.0

git+ssh://[email protected]/Harvard-University-iCommons/[email protected]#egg=django-angular==2.3
git+ssh://[email protected]/penzance/canvas_python_sdk.git@v1.2.0#egg=canvas-python-sdk==1.2.0
git+ssh://[email protected]/Harvard-University-iCommons/canvas_python_sdk.git@v1.3#egg=canvas-python-sdk==1.3
git+ssh://[email protected]/Harvard-University-iCommons/[email protected]#egg=django-icommons-common==3.0
git+ssh://[email protected]/Harvard-University-iCommons/[email protected]#egg=django-icommons-ui==2.1
git+ssh://[email protected]/Harvard-University-iCommons/[email protected]#egg=django-auth-lti==2.1.0
git+https://github.com/Harvard-University-iCommons/[email protected]#egg=django-ssm-parameter-store==0.6
git+ssh://[email protected]/Harvard-University-iCommons/[email protected]#harvard-django-utils==0.1
git+ssh://[email protected]/Harvard-University-iCommons/[email protected]#egg=django-coursemanager==0.6
git+ssh://[email protected]/Harvard-University-iCommons/[email protected]#egg=django-canvas-lti-school-permissions==3.2
7 changes: 0 additions & 7 deletions lti_emailer/requirements/local.txt
Original file line number Diff line number Diff line change
Expand Up @@ -20,10 +20,3 @@ ddt==1.5.0
selenium==4.3.0
xlrd==2.0.1
git+ssh://[email protected]/Harvard-University-iCommons/[email protected]#egg=selenium-common==1.4.3


# icommons_common unit tests depend on ccsw, and ccsw depends on icommons_common.
# until ccsw gets its own proper project, and we move the delete command out of
# icommons_common and into ccsw, work around the circular dependency by calling
# out the ccsw dependency here.
git+ssh://[email protected]/Harvard-University-iCommons/[email protected]#egg=django-canvas-course-site-wizard==3.0
19 changes: 13 additions & 6 deletions lti_emailer/settings/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,12 @@
Django settings for lti_emailer project.
"""

import logging
import os
import re
import logging
from django.urls import reverse_lazy

from dj_secure_settings.loader import load_secure_settings
from django.urls import reverse_lazy

SECURE_SETTINGS = load_secure_settings()

Expand All @@ -30,11 +31,12 @@
'django.contrib.messages',
'django.contrib.staticfiles',
'django_auth_lti',
'icommons_common',
'coursemanager',
'lti_permissions',
'icommons_ui',
'djng',
'lti_emailer',
'lti_school_permissions',
'mailing_list',
'mailgun',
'watchman'
Expand Down Expand Up @@ -85,7 +87,7 @@
# Database
# https://docs.djangoproject.com/en/2.2/ref/settings/#databases

DATABASE_ROUTERS = ['icommons_common.routers.CourseSchemaDatabaseRouter']
DATABASE_ROUTERS = ['coursemanager.routers.CourseSchemaDatabaseRouter']

DATABASES = {
'default': {
Expand All @@ -110,6 +112,7 @@
}
}

DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
COURSE_SCHEMA_DB_NAME = 'coursemanager'

# Cache
Expand Down Expand Up @@ -297,7 +300,7 @@ def filter(self, record):
'handlers': ['default'],
'propagate': False,
},
'icommons_common': {
'coursemanager': {
'handlers': ['default'],
'level': _DEFAULT_LOG_LEVEL,
'propagate': False,
Expand Down Expand Up @@ -326,7 +329,6 @@ def filter(self, record):
'base_api_url': CANVAS_URL + '/api',
'max_retries': 3,
'per_page': 40,
'session_inactivity_expiration_time_secs': 50,
}

ICOMMONS_COMMON = {
Expand Down Expand Up @@ -355,6 +357,11 @@ def filter(self, record):
PERMISSION_LTI_EMAILER_VIEW = 'lti_emailer_view'
PERMISSION_LTI_EMAILER_SEND_ALL = 'lti_emailer_send_all'

LTI_SCHOOL_PERMISSIONS_TOOL_PERMISSIONS = (
PERMISSION_LTI_EMAILER_VIEW,
PERMISSION_LTI_EMAILER_SEND_ALL,
)

MAILGUN_CALLBACK_TIMEOUT = 30 * 1000 # 30 seconds

IGNORE_WHITELIST = SECURE_SETTINGS.get('ignore_whitelist', False)
Expand Down
2 changes: 1 addition & 1 deletion lti_emailer/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@

from django_auth_lti import const
from django_auth_lti.decorators import lti_role_required
from lti_permissions.decorators import lti_permission_required
from lti_school_permissions.decorators import lti_permission_required

logger = logging.getLogger(__name__)

Expand Down
2 changes: 1 addition & 1 deletion mailgun/listserv_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

from django.conf import settings

from icommons_common.utils import ApiRequestTimer
from harvard_django_utils.utils import ApiRequestTimer

from lti_emailer.exceptions import ListservApiError
from mailgun.utils import replace_non_ascii
Expand Down
2 changes: 1 addition & 1 deletion mailgun/route_handlers.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
from django.views.decorators.csrf import csrf_exempt
from django.views.decorators.http import require_http_methods
from flanker.addresslib import address as addresslib_address
from icommons_common.models import CourseInstance
from coursemanager.models import CourseInstance

from lti_emailer.canvas_api_client import (get_alternate_emails_for_user_email,
get_name_for_email)
Expand Down
2 changes: 1 addition & 1 deletion mailgun/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
from django.test.utils import override_settings
from mock import MagicMock, call, patch

from icommons_common.utils import Bunch
from harvard_django_utils.utils import Bunch

from mailing_list.models import MailingList
from mailgun.decorators import authenticate
Expand Down
27 changes: 12 additions & 15 deletions mailing_list/api.py
Original file line number Diff line number Diff line change
@@ -1,20 +1,17 @@
import logging
import json
import logging

from django.conf import settings
from django.views.decorators.http import require_http_methods
from django.contrib.auth.decorators import login_required
from django.core.cache import cache
from django.core.exceptions import PermissionDenied

from django_auth_lti.decorators import lti_role_required
from django.http import JsonResponse
from django.views.decorators.http import require_http_methods
from django_auth_lti import const
from django_auth_lti.decorators import lti_role_required
from lti_school_permissions.decorators import lti_permission_required

from icommons_common.view_utils import create_json_200_response, create_json_500_response
from lti_permissions.decorators import lti_permission_required

from .models import MailingList, CourseSettings

from .models import CourseSettings, MailingList

logger = logging.getLogger(__name__)

Expand Down Expand Up @@ -45,9 +42,9 @@ def lists(request):
except Exception:
message = "Failed to get_or_create MailingLists with LTI params %s" % json.dumps(request.LTI)
logger.exception(message)
return create_json_500_response(message)
return JsonResponse({'error': message}, status=500)

return create_json_200_response(mailing_lists)
return JsonResponse(mailing_lists, safe=False, status=200)


@login_required
Expand Down Expand Up @@ -87,9 +84,9 @@ def set_access_level(request, mailing_list_id):
except Exception:
message = "Failed to activate MailingList %s with LTI params %s" % (mailing_list_id, json.dumps(request.LTI))
logger.exception(message)
return create_json_500_response(message)
return JsonResponse({'error': message}, status=500)

return create_json_200_response(result)
return JsonResponse(result, status=200)


@login_required
Expand Down Expand Up @@ -125,11 +122,11 @@ def get_or_create_course_settings(request):
except Exception:
message = "Failed to get_or_create CourseSettings for course %s" % canvas_course_id
logger.exception(message)
return create_json_500_response(message)
return JsonResponse({'error': message}, status=500)

result = {
'canvas_course_id': course_settings.canvas_course_id,
'always_mail_staff': course_settings.always_mail_staff,
}

return create_json_200_response(result)
return JsonResponse(result, status=200)
18 changes: 18 additions & 0 deletions mailing_list/migrations/0015_alter_mailinglist_access_level.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# Generated by Django 3.2.16 on 2023-02-03 04:32

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('mailing_list', '0014_add_new_permissions_for_roles'),
]

operations = [
migrations.AlterField(
model_name='mailinglist',
name='access_level',
field=models.CharField(default='members', max_length=32),
),
]
2 changes: 1 addition & 1 deletion mailing_list/tests/test_util_methods.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
from mock import patch

from mailing_list.utils import get_section_sis_enrollment_status, is_course_crosslisted
from icommons_common.models import CourseInstance, XlistMap
from coursemanager.models import CourseInstance, XlistMap


class CourseInstanceStub:
Expand Down
2 changes: 1 addition & 1 deletion mailing_list/utils.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import logging

from icommons_common.models import CourseInstance, XlistMap
from coursemanager.models import CourseInstance, XlistMap

logger = logging.getLogger(__name__)

Expand Down
4 changes: 2 additions & 2 deletions mailing_list/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,12 @@
from django_auth_lti import const
from django_auth_lti.decorators import lti_role_required

from lti_permissions.decorators import lti_permission_required
from lti_school_permissions.decorators import lti_permission_required

from lti_emailer.canvas_api_client import get_enrollments, get_section, get_course
from mailing_list.models import MailingList

from icommons_common.canvas_api.helpers import enrollments as canvas_api_helpers_enrollments
from canvas_api.helpers import enrollments as canvas_api_helpers_enrollments

logger = logging.getLogger(__name__)

Expand Down
4 changes: 2 additions & 2 deletions selenium_tests/lti_emailer/emailer_base_test_case.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,9 @@
create_external_tool_courses,
delete_external_tool_courses)
from canvas_sdk.exceptions import CanvasAPIError
from icommons_common.canvas_utils import SessionInactivityExpirationRC
from canvas_sdk.client import RequestContext

SDK_CONTEXT = SessionInactivityExpirationRC(**settings.CANVAS_SDK_SETTINGS)
SDK_CONTEXT = RequestContext(**settings.CANVAS_SDK_SETTINGS)

logger = logging.getLogger(__name__)
logging.basicConfig()
Expand Down

0 comments on commit cf3d305

Please sign in to comment.