From 9855ff4769de50e496ca6a69ca954322ecdf36d7 Mon Sep 17 00:00:00 2001 From: Kyrylo Kholodenko Date: Wed, 15 Jan 2025 11:35:27 +0200 Subject: [PATCH] feat: add Accredible integration --- .annotation_safe_list.yml | 2 + .../apps/badges/accredible/api_client.py | 127 +++++++++++ credentials/apps/badges/accredible/data.py | 64 ++++++ .../apps/badges/accredible/exceptions.py | 11 + credentials/apps/badges/accredible/utils.py | 45 ++++ credentials/apps/badges/admin.py | 204 +++++++++++++++++- credentials/apps/badges/base_api_client.py | 105 +++++++++ credentials/apps/badges/credly/api_client.py | 55 +---- credentials/apps/badges/exceptions.py | 6 + credentials/apps/badges/issuers.py | 134 +++++++++++- .../commands/sync_accredible_groups.py | 54 +++++ ...dibleapiconfig_accrediblebadge_and_more.py | 65 ++++++ .../0003_alter_accredibleapiconfig_name.py | 18 ++ credentials/apps/badges/models.py | 124 ++++++++++- credentials/apps/badges/signals/handlers.py | 18 +- credentials/apps/badges/signals/signals.py | 6 +- .../apps/badges/tests/accredible/__init__.py | 0 .../tests/accredible/test_api_client.py | 96 +++++++++ .../badges/tests/accredible/test_utils.py | 27 +++ .../apps/badges/tests/test_admin_forms.py | 10 +- credentials/apps/badges/tests/test_issuers.py | 165 +++++++++++++- .../badges/tests/test_management_commands.py | 23 +- credentials/apps/badges/tests/test_models.py | 84 ++++++++ credentials/apps/badges/tests/test_signals.py | 2 + ..._usercredential_credential_content_type.py | 20 ++ credentials/apps/credentials/models.py | 4 +- .../apps/credentials/tests/test_api.py | 12 +- .../conf/locale/eo/LC_MESSAGES/django.mo | Bin 39502 -> 40735 bytes .../conf/locale/eo/LC_MESSAGES/django.po | 38 +++- .../conf/locale/eo/LC_MESSAGES/djangojs.po | 4 +- .../conf/locale/rtl/LC_MESSAGES/django.mo | Bin 26509 -> 27299 bytes .../conf/locale/rtl/LC_MESSAGES/django.po | 32 ++- .../conf/locale/rtl/LC_MESSAGES/djangojs.po | 4 +- credentials/settings/base.py | 7 + .../badges/badges-admin-groups-sync.png | Bin 0 -> 136772 bytes docs/_static/images/badges/badges-admin.png | Bin 30533 -> 50135 bytes docs/badges/configuration/accredible.rst | 173 +++++++++++++++ .../credly.rst} | 22 +- docs/badges/configuration/index.rst | 10 + docs/badges/index.rst | 4 +- docs/badges/processing.rst | 4 +- docs/badges/quickstart.rst | 60 ++++-- docs/badges/settings.rst | 19 ++ 43 files changed, 1735 insertions(+), 123 deletions(-) create mode 100644 credentials/apps/badges/accredible/api_client.py create mode 100644 credentials/apps/badges/accredible/data.py create mode 100644 credentials/apps/badges/accredible/exceptions.py create mode 100644 credentials/apps/badges/accredible/utils.py create mode 100644 credentials/apps/badges/base_api_client.py create mode 100644 credentials/apps/badges/management/commands/sync_accredible_groups.py create mode 100644 credentials/apps/badges/migrations/0002_accredibleapiconfig_accrediblebadge_and_more.py create mode 100644 credentials/apps/badges/migrations/0003_alter_accredibleapiconfig_name.py create mode 100644 credentials/apps/badges/tests/accredible/__init__.py create mode 100644 credentials/apps/badges/tests/accredible/test_api_client.py create mode 100644 credentials/apps/badges/tests/accredible/test_utils.py create mode 100644 credentials/apps/credentials/migrations/0031_alter_usercredential_credential_content_type.py create mode 100644 docs/_static/images/badges/badges-admin-groups-sync.png create mode 100644 docs/badges/configuration/accredible.rst rename docs/badges/{configuration.rst => configuration/credly.rst} (90%) create mode 100644 docs/badges/configuration/index.rst diff --git a/.annotation_safe_list.yml b/.annotation_safe_list.yml index c8f4520f9..34619a42e 100644 --- a/.annotation_safe_list.yml +++ b/.annotation_safe_list.yml @@ -29,6 +29,8 @@ badges.Fulfillment: ".. no_pii:": "This model has no PII" badges.PenaltyDataRule: ".. no_pii:": "This model has no PII" +badges.AccredibleAPIConfig: + ".. no_pii:": "This model has no PII" credentials.HistoricalProgramCompletionEmailConfiguration: ".. no_pii:": "This model has no PII" contenttypes.ContentType: diff --git a/credentials/apps/badges/accredible/api_client.py b/credentials/apps/badges/accredible/api_client.py new file mode 100644 index 000000000..92df3e0b7 --- /dev/null +++ b/credentials/apps/badges/accredible/api_client.py @@ -0,0 +1,127 @@ +import logging + +from attrs import asdict +from django.conf import settings +from django.contrib.sites.models import Site + +from credentials.apps.badges.accredible.data import AccredibleBadgeData, AccredibleExpireBadgeData +from credentials.apps.badges.accredible.exceptions import AccredibleError +from credentials.apps.badges.accredible.utils import get_accredible_api_base_url +from credentials.apps.badges.base_api_client import BaseBadgeProviderClient +from credentials.apps.badges.models import AccredibleAPIConfig, AccredibleGroup + + +logger = logging.getLogger(__name__) + + +class AccredibleAPIClient(BaseBadgeProviderClient): + """ + A client for interacting with the Accredible API. + + This class provides methods for performing various operations on the Accredible API. + """ + + PROVIDER_NAME = "Accredible" + + def __init__(self, api_config_id: int): + """ + Initializes a AccredibleAPIClient object. + + Args: + api_config (AccredibleAPIConfig): Configuration object for the Accredible API. + """ + + self.api_config_id = api_config_id + self.api_config = self.get_api_config() + + def get_api_config(self) -> AccredibleAPIConfig: + """ + Returns the API configuration object for the Accredible API. + """ + try: + return AccredibleAPIConfig.objects.get(id=self.api_config_id) + except AccredibleAPIConfig.DoesNotExist: + raise AccredibleError(f"AccredibleAPIConfig with the id {self.api_config_id} does not exist!") + + def _get_base_api_url(self) -> str: + return get_accredible_api_base_url(settings) + + def _get_headers(self) -> dict: + """ + Returns the headers for making API requests to Accredible. + """ + return { + "Accept": "application/json", + "Content-Type": "application/json", + "Authorization": f"Bearer {self.api_config.api_key}", + } + + def fetch_all_groups(self) -> dict: + """ + Fetch all groups. + """ + return self.perform_request("get", "issuer/all_groups") + + def fetch_design_image(self, design_id: int) -> str: + """ + Fetches the design and return the URL of image. + """ + design_raw = self.perform_request("get", f"designs/{design_id}") + return design_raw.get("design", {}).get("rasterized_content_url") + + def issue_badge(self, issue_badge_data: AccredibleBadgeData) -> dict: + """ + Issues a badge using the Accredible REST API. + + Args: + issue_badge_data (IssueBadgeData): Data required to issue the badge. + """ + return self.perform_request("post", "credentials", asdict(issue_badge_data)) + + def revoke_badge(self, badge_id, data: AccredibleExpireBadgeData) -> dict: + """ + Revoke a badge with the given badge ID. + + Args: + badge_id (str): ID of the badge to revoke. + data (dict): Additional data for the revocation. + """ + return self.perform_request("patch", f"credentials/{badge_id}", asdict(data)) + + def sync_groups(self, site_id: int) -> int: + """ + Pull all groups for a given Accredible API config. + + Args: + site_id (int): ID of the site. + + Returns: + int | None: processed items. + """ + try: + site = Site.objects.get(id=site_id) + except Site.DoesNotExist: + logger.error(f"Site with the id {site_id} does not exist!") + raise + + groups_data = self.fetch_all_groups() + raw_groups = groups_data.get("groups", []) + + all_group_ids = [group.get("id") for group in raw_groups] + AccredibleGroup.objects.exclude(id__in=all_group_ids).delete() + + for raw_group in raw_groups: + AccredibleGroup.objects.update_or_create( + id=raw_group.get("id"), + api_config=self.api_config, + defaults={ + "site": site, + "name": raw_group.get("course_name"), + "description": raw_group.get("course_description"), + "icon": self.fetch_design_image(raw_group.get("primary_design_id")), + "created": raw_group.get("created_at"), + "state": AccredibleGroup.STATES.active, + }, + ) + + return len(raw_groups) diff --git a/credentials/apps/badges/accredible/data.py b/credentials/apps/badges/accredible/data.py new file mode 100644 index 000000000..16787ff40 --- /dev/null +++ b/credentials/apps/badges/accredible/data.py @@ -0,0 +1,64 @@ +from datetime import datetime + +import attr + + +@attr.s(auto_attribs=True, frozen=True) +class AccredibleRecipient: + """ + Represents the recipient data in the credential. + + Attributes: + name (str): The recipient's name. + email (str): The recipient's email address. + """ + + name: str + email: str + + +@attr.s(auto_attribs=True, frozen=True) +class AccredibleCredential: + """ + Represents the credential data. + + Attributes: + recipient (RecipientData): Information about the recipient. + group_id (int): ID of the credential group. + name (str): Title of the credential. + issued_on (datetime): Date when the credential was issued. + complete (bool): Whether the credential process is complete. + """ + + recipient: AccredibleRecipient + group_id: int + name: str + issued_on: datetime + complete: bool + + +@attr.s(auto_attribs=True, frozen=True) +class AccredibleExpiredCredential: + """ + Represents the data required to expire a credential. + """ + + expired_on: datetime + + +@attr.s(auto_attribs=True, frozen=True) +class AccredibleBadgeData: + """ + Represents the data required to issue a badge. + """ + + credential: AccredibleCredential + + +@attr.s(auto_attribs=True, frozen=True) +class AccredibleExpireBadgeData: + """ + Represents the data required to expire a badge. + """ + + credential: AccredibleExpiredCredential diff --git a/credentials/apps/badges/accredible/exceptions.py b/credentials/apps/badges/accredible/exceptions.py new file mode 100644 index 000000000..a224fad5d --- /dev/null +++ b/credentials/apps/badges/accredible/exceptions.py @@ -0,0 +1,11 @@ +""" +Specific for Accredible exceptions. +""" + +from credentials.apps.badges.exceptions import BadgesError + + +class AccredibleError(BadgesError): + """ + Accredible backend generic error. + """ diff --git a/credentials/apps/badges/accredible/utils.py b/credentials/apps/badges/accredible/utils.py new file mode 100644 index 000000000..40b07ccb6 --- /dev/null +++ b/credentials/apps/badges/accredible/utils.py @@ -0,0 +1,45 @@ +""" +Accredible utility functions. +""" + + +def get_accredible_api_base_url(settings) -> str: + """ + Determines the base URL for the Accredible service based on application settings. + + Parameters: + - settings: A configuration object containing the application's settings. + + Returns: + - str: The base URL for the Accredible service (web site). + This will be the URL for the sandbox environment if `USE_SANDBOX` is + set to a truthy value in the configuration; + otherwise, it will be the production environment's URL. + """ + accredible_config = settings.BADGES_CONFIG["accredible"] + + if accredible_config.get("USE_SANDBOX"): + return accredible_config["ACCREDIBLE_SANDBOX_API_BASE_URL"] + + return accredible_config["ACCREDIBLE_API_BASE_URL"] + + +def get_accredible_base_url(settings) -> str: + """ + Determines the base URL for the Accredible service based on application settings. + + Parameters: + - settings: A configuration object containing the application's settings. + + Returns: + - str: The base URL for the Accredible service (web site). + This will be the URL for the sandbox environment if `USE_SANDBOX` is + set to a truthy value in the configuration; + otherwise, it will be the production environment's URL. + """ + accredible_config = settings.BADGES_CONFIG["accredible"] + + if accredible_config.get("USE_SANDBOX"): + return accredible_config["ACCREDIBLE_SANDBOX_BASE_URL"] + + return accredible_config["ACCREDIBLE_BASE_URL"] diff --git a/credentials/apps/badges/admin.py b/credentials/apps/badges/admin.py index bdf43756b..3ee41a2fc 100644 --- a/credentials/apps/badges/admin.py +++ b/credentials/apps/badges/admin.py @@ -21,7 +21,11 @@ PenaltyDataRuleForm, PenaltyDataRuleFormSet, ) +from credentials.apps.badges.exceptions import BadgeProviderError from credentials.apps.badges.models import ( + AccredibleAPIConfig, + AccredibleBadge, + AccredibleGroup, BadgePenalty, BadgeProgress, BadgeRequirement, @@ -35,6 +39,12 @@ from credentials.apps.badges.toggles import is_badges_enabled +ADMIN_CHANGE_VIEW_REVERSE_NAMES = { + CredlyBadgeTemplate.ORIGIN: "admin:badges_credlybadgetemplate_change", + AccredibleGroup.ORIGIN: "admin:badges_accrediblegroup_change", +} + + class BadgeRequirementInline(admin.TabularInline): """ Badge template requirement inline setup. @@ -385,14 +395,19 @@ def template_link(self, instance): """ Interactive link to parent (badge template). """ - url = reverse("admin:badges_credlybadgetemplate_change", args=[instance.template.pk]) + reverse_name = ADMIN_CHANGE_VIEW_REVERSE_NAMES.get(instance.template.origin, "admin:index") + reverse_args = [] if reverse_name == "admin:index" else [instance.template.pk] + + url = reverse(reverse_name, args=reverse_args) return format_html('{}', url, instance.template) template_link.short_description = _("badge template") def response_change(self, request, obj): if "_save" in request.POST: - return HttpResponseRedirect(reverse("admin:badges_credlybadgetemplate_change", args=[obj.template.pk])) + reverse_name = ADMIN_CHANGE_VIEW_REVERSE_NAMES.get(obj.template.origin, "admin:index") + reverse_args = [] if reverse_name == "admin:index" else [obj.template.pk] + return HttpResponseRedirect(reverse(reverse_name, args=reverse_args)) return super().response_change(request, obj) @@ -442,7 +457,9 @@ def template_link(self, instance): """ Interactive link to parent (badge template). """ - url = reverse("admin:badges_credlybadgetemplate_change", args=[instance.template.pk]) + reverse_name = ADMIN_CHANGE_VIEW_REVERSE_NAMES.get(instance.template.origin, "admin:index") + reverse_args = [] if reverse_name == "admin:index" else [instance.template.pk] + url = reverse(reverse_name, args=reverse_args) return format_html('{}', url, instance.template) template_link.short_description = _("badge template") @@ -457,7 +474,9 @@ def formfield_for_manytomany(self, db_field, request, **kwargs): def response_change(self, request, obj): if "_save" in request.POST: - return HttpResponseRedirect(reverse("admin:badges_credlybadgetemplate_change", args=[obj.template.pk])) + reverse_name = ADMIN_CHANGE_VIEW_REVERSE_NAMES.get(obj.template.origin, "admin:index") + reverse_args = [] if reverse_name == "admin:index" else [obj.template.pk] + return HttpResponseRedirect(reverse(reverse_name, args=reverse_args)) return super().response_change(request, obj) @@ -541,6 +560,180 @@ def has_add_permission(self, request): return False +class AccredibleAPIConfigAdmin(admin.ModelAdmin): + """ + Accredible API configuration admin setup. + """ + + list_display = ( + "id", + "name", + ) + actions = ("sync_groups",) + + @admin.action(description="Sync groups") + def sync_groups(self, request, queryset): + """ + Sync groups for selected api configs. + """ + site = get_current_site(request) + for api_config in queryset: + try: + call_command( + "sync_accredible_groups", + api_config_id=api_config.id, + site_id=site.id, + ) + except BadgeProviderError as exc: + messages.set_level(request, messages.ERROR) + messages.error(request, _("Failed to sync groups for API config: {}. {}").format(api_config.name, exc)) + + messages.success(request, _("Accredible groups were successfully updated.")) + + +class AccredibleBadgeAdmin(admin.ModelAdmin): + """ + Accredible badge admin setup. + """ + + list_display = ( + "uuid", + "username", + "credential", + "status", + "state", + "external_id", + ) + list_filter = ( + "status", + "state", + ) + search_fields = ( + "username", + "external_id", + ) + readonly_fields = ( + "credential_id", + "credential_content_type", + "username", + "download_url", + "state", + "uuid", + "external_id", + ) + + def has_add_permission(self, request): + return False + + +class AccredibleGroupAdmin(admin.ModelAdmin): + """ + Accredible group admin setup. + """ + + list_display = ( + "id", + "api_config", + "name", + "state", + "is_active", + "image", + ) + list_filter = ( + "api_config", + "is_active", + "state", + ) + search_fields = ( + "name", + "id", + ) + readonly_fields = [ + "state", + "origin", + "dashboard_link", + "image", + ] + fieldsets = ( + ( + "Generic", + { + "fields": ( + "site", + "is_active", + ), + "description": _( + """ + WARNING: avoid configuration updates on activated badges. + Active badge templates are continuously processed and learners may already have progress on them. + Any changes in badge template requirements (including data rules) will affect learners' experience! + """ + ), + }, + ), + ( + "Badge template", + { + "fields": ( + "name", + "description", + "image", + "origin", + ) + }, + ), + ( + "Accredible", + { + "fields": ( + "api_config", + "state", + "dashboard_link", + ), + }, + ), + ) + inlines = [ + BadgeRequirementInline, + BadgePenaltyInline, + ] + + def has_add_permission(self, request): + return False + + def dashboard_link(self, obj): + url = obj.management_url + return format_html("{url}", url=url) + + def delete_model(self, request, obj): + """ + Prevent deletion of active badge templates. + """ + if obj.is_active: + messages.set_level(request, messages.ERROR) + messages.error(request, _("Active badge template cannot be deleted.")) + return + super().delete_model(request, obj) + + def delete_queryset(self, request, queryset): + """ + Prevent deletion of active badge templates. + """ + if queryset.filter(is_active=True).exists(): + messages.set_level(request, messages.ERROR) + messages.error(request, _("Active badge templates cannot be deleted.")) + return + super().delete_queryset(request, queryset) + + def image(self, obj): + """ + Badge template preview image. + """ + if obj.icon: + return format_html('', obj.icon) + return None + + # register admin configurations with respect to the feature flag if is_badges_enabled(): admin.site.register(CredlyOrganization, CredlyOrganizationAdmin) @@ -549,3 +742,6 @@ def has_add_permission(self, request): admin.site.register(BadgeRequirement, BadgeRequirementAdmin) admin.site.register(BadgePenalty, BadgePenaltyAdmin) admin.site.register(BadgeProgress, BadgeProgressAdmin) + admin.site.register(AccredibleAPIConfig, AccredibleAPIConfigAdmin) + admin.site.register(AccredibleBadge, AccredibleBadgeAdmin) + admin.site.register(AccredibleGroup, AccredibleGroupAdmin) diff --git a/credentials/apps/badges/base_api_client.py b/credentials/apps/badges/base_api_client.py new file mode 100644 index 000000000..082bdaf07 --- /dev/null +++ b/credentials/apps/badges/base_api_client.py @@ -0,0 +1,105 @@ +import logging +from abc import ABC, abstractmethod +from urllib.parse import urljoin + +import requests +from requests.exceptions import HTTPError + +from .exceptions import BadgeProviderError + + +logger = logging.getLogger(__name__) + + +class BaseBadgeProviderClient(ABC): + """ + Base class for interacting with a generic badge provider API. + + This class provides common functionality such as performing requests + and error handling. Methods specific to badge providers must be implemented + by subclasses. + """ + + PROVIDER_NAME = None + REQUESTS_TIMEOUT = 10 + + def __init__(self): + self.base_api_url = None + + def perform_request(self, method, url_suffix, data=None): + """ + Perform an HTTP request to the specified URL suffix. + + Args: + method (str): HTTP method to use for the request. + url_suffix (str): URL suffix to append to the base Credly API URL. + data (dict, optional): Data to send with the request. + + Returns: + dict: JSON response from the API. + + Raises: + requests.HTTPError: If the API returns an error response. + """ + url = urljoin(self.base_api_url, url_suffix) + logger.debug(f"{self.PROVIDER_NAME} API: {method.upper()} {url}") + response = requests.request( + method.upper(), url, headers=self._get_headers(), json=data, timeout=self.REQUESTS_TIMEOUT + ) + self._raise_for_error(response) + return response.json() + + def _raise_for_error(self, response): + """ + Raises a CredlyAPIError if the response status code indicates an error. + + Args: + response (requests.Response): Response object from the Credly API request. + + Raises: + CredlyAPIError: If the response status code indicates an error. + """ + try: + response.raise_for_status() + except HTTPError: + logger.error( + f"Error while processing {self.PROVIDER_NAME} request: {response.status_code} - {response.text}" + ) + raise BadgeProviderError(f"{response.text} Status({response.status_code})") + + @property + def base_api_url(self): + return self._get_base_api_url() + + @abstractmethod + def _get_headers(self): + """ + Returns the headers for making API requests. + """ + + @abstractmethod + def _get_base_api_url(self): + """ + Returns the base URL for the badge provider API. + """ + + @abstractmethod + def issue_badge(self, issue_badge_data): + """ + Issues a badge using the badge provider API. + + Args: + issue_badge_data (dict): Data required to issue the badge. + """ + + @abstractmethod + def revoke_badge(self, badge_id, data=None): + """ + Revoke a badge with the given badge ID. + + Must be implemented by subclasses. + + Args: + badge_id (str): ID of the badge to revoke. + data (dict): Additional data for the revocation. + """ diff --git a/credentials/apps/badges/credly/api_client.py b/credentials/apps/badges/credly/api_client.py index 793f4c85e..3b587045d 100644 --- a/credentials/apps/badges/credly/api_client.py +++ b/credentials/apps/badges/credly/api_client.py @@ -3,13 +3,13 @@ from functools import lru_cache from urllib.parse import urljoin -import requests +import requests # pylint: disable=unused-import from attrs import asdict from django.conf import settings from django.contrib.sites.models import Site -from requests.exceptions import HTTPError -from credentials.apps.badges.credly.exceptions import CredlyAPIError, CredlyError +from credentials.apps.badges.base_api_client import BaseBadgeProviderClient +from credentials.apps.badges.credly.exceptions import CredlyError from credentials.apps.badges.credly.utils import get_credly_api_base_url from credentials.apps.badges.models import CredlyBadgeTemplate, CredlyOrganization @@ -17,7 +17,7 @@ logger = logging.getLogger(__name__) -class CredlyAPIClient: +class CredlyAPIClient(BaseBadgeProviderClient): """ A client for interacting with the Credly API. @@ -26,7 +26,9 @@ class CredlyAPIClient: and revoking badges. """ - def __init__(self, organization_id, api_key=None): + PROVIDER_NAME = "Credly" + + def __init__(self, organization_id, api_key=None): # pylint: disable=super-init-not-called """ Initializes a CredlyRestAPI object. @@ -41,7 +43,8 @@ def __init__(self, organization_id, api_key=None): self.api_key = api_key self.organization_id = organization_id - self.base_api_url = urljoin(get_credly_api_base_url(settings), f"organizations/{self.organization_id}/") + def _get_base_api_url(self): + return urljoin(get_credly_api_base_url(settings), f"organizations/{self.organization_id}/") def _get_organization(self, organization_id): """ @@ -53,43 +56,6 @@ def _get_organization(self, organization_id): except CredlyOrganization.DoesNotExist: raise CredlyError(f"CredlyOrganization with the uuid {organization_id} does not exist!") - def perform_request(self, method, url_suffix, data=None): - """ - Perform an HTTP request to the specified URL suffix. - - Args: - method (str): HTTP method to use for the request. - url_suffix (str): URL suffix to append to the base Credly API URL. - data (dict, optional): Data to send with the request. - - Returns: - dict: JSON response from the API. - - Raises: - requests.HTTPError: If the API returns an error response. - """ - url = urljoin(self.base_api_url, url_suffix) - logger.debug(f"Credly API: {method.upper()} {url}") - response = requests.request(method.upper(), url, headers=self._get_headers(), json=data, timeout=10) - self._raise_for_error(response) - return response.json() - - def _raise_for_error(self, response): - """ - Raises a CredlyAPIError if the response status code indicates an error. - - Args: - response (requests.Response): Response object from the Credly API request. - - Raises: - CredlyAPIError: If the response status code indicates an error. - """ - try: - response.raise_for_status() - except HTTPError: - logger.error(f"Error while processing Credly API request: {response.status_code} - {response.text}") - raise CredlyAPIError(f"Credly API:{response.text}({response.status_code})") - def _get_headers(self): """ Returns the headers for making API requests to Credly. @@ -140,12 +106,13 @@ def issue_badge(self, issue_badge_data): """ return self.perform_request("post", "badges/", asdict(issue_badge_data)) - def revoke_badge(self, badge_id, data): + def revoke_badge(self, badge_id, data=None): """ Revoke a badge with the given badge ID. Args: badge_id (str): ID of the badge to revoke. + data (dict): Additional data for the revocation. """ return self.perform_request("put", f"badges/{badge_id}/revoke/", data=data) diff --git a/credentials/apps/badges/exceptions.py b/credentials/apps/badges/exceptions.py index e2719006f..5d908d671 100644 --- a/credentials/apps/badges/exceptions.py +++ b/credentials/apps/badges/exceptions.py @@ -13,3 +13,9 @@ class BadgesProcessingError(BadgesError): """ Exception raised for errors that occur during badge processing. """ + + +class BadgeProviderError(BadgesError): + """ + Exception raised for errors that occur during badge API client processing. + """ diff --git a/credentials/apps/badges/issuers.py b/credentials/apps/badges/issuers.py index 9d03e154c..b56510361 100644 --- a/credentials/apps/badges/issuers.py +++ b/credentials/apps/badges/issuers.py @@ -2,20 +2,43 @@ This module provides classes for issuing badge credentials to users. """ +from datetime import datetime + from django.contrib.contenttypes.models import ContentType from django.db import transaction from django.utils.translation import gettext as _ +from credentials.apps.badges.accredible.api_client import AccredibleAPIClient +from credentials.apps.badges.accredible.data import ( + AccredibleBadgeData, + AccredibleCredential, + AccredibleExpireBadgeData, + AccredibleExpiredCredential, + AccredibleRecipient, +) from credentials.apps.badges.credly.api_client import CredlyAPIClient from credentials.apps.badges.credly.data import CredlyBadgeData -from credentials.apps.badges.credly.exceptions import CredlyAPIError -from credentials.apps.badges.models import BadgeTemplate, CredlyBadge, CredlyBadgeTemplate, UserCredential +from credentials.apps.badges.exceptions import BadgeProviderError +from credentials.apps.badges.models import ( + AccredibleBadge, + AccredibleGroup, + BadgeTemplate, + CredlyBadge, + CredlyBadgeTemplate, + UserCredential, +) from credentials.apps.badges.signals.signals import notify_badge_awarded, notify_badge_revoked from credentials.apps.core.api import get_user_by_username from credentials.apps.credentials.constants import UserCredentialStatus from credentials.apps.credentials.issuers import AbstractCredentialIssuer +REVOCATION_STATES = { + CredlyBadge: CredlyBadge.STATES.revoked, + AccredibleBadge: AccredibleBadge.STATES.expired, +} + + class BadgeTemplateIssuer(AbstractCredentialIssuer): """ Issues BadgeTemplate credentials to users. @@ -59,7 +82,7 @@ def issue_credential( UserCredential """ - user_credential, __ = self.issued_user_credential_type.objects.update_or_create( + user_credential, __ = self.issued_user_credential_type.objects.get_or_create( username=username, credential_content_type=ContentType.objects.get_for_model(credential), credential_id=credential.id, @@ -67,6 +90,9 @@ def issue_credential( "status": status, }, ) + if not user_credential.state == REVOCATION_STATES.get(self.issued_user_credential_type): + user_credential.status = status + user_credential.save() self.set_credential_attributes(user_credential, attributes) self.set_credential_date_override(user_credential, date_override) @@ -133,7 +159,7 @@ def issue_credly_badge(self, *, user_credential): try: credly_api = CredlyAPIClient(badge_template.organization.uuid) response = credly_api.issue_badge(credly_badge_data) - except CredlyAPIError: + except BadgeProviderError: user_credential.state = "error" user_credential.save() raise @@ -154,7 +180,7 @@ def revoke_credly_badge(self, credential_id, user_credential): } try: response = credly_api.revoke_badge(user_credential.external_uuid, revoke_data) - except CredlyAPIError: + except BadgeProviderError: user_credential.state = "error" user_credential.save() raise @@ -196,3 +222,101 @@ def revoke(self, credential_id, username): if user_credential.propagated: self.revoke_credly_badge(credential_id, user_credential) return user_credential + + +class AccredibleBadgeTemplateIssuer(BadgeTemplateIssuer): + """ + Issues AccredibleGroup credentials to users. + """ + + issued_credential_type = AccredibleGroup + issued_user_credential_type = AccredibleBadge + + def issue_accredible_badge(self, *, user_credential): + """ + Requests Accredible service for external badge issuing based on internal user credential (AccredibleBadge). + """ + + user = get_user_by_username(user_credential.username) + group = user_credential.credential + + accredible_badge_data = AccredibleBadgeData( + credential=AccredibleCredential( + recipient=AccredibleRecipient( + name=user.get_full_name() or user.username, + email=user.email, + ), + group_id=group.id, + name=group.name, + issued_on=user_credential.created.strftime("%Y-%m-%d %H:%M:%S %z"), + complete=True, + ) + ) + + try: + accredible_api = AccredibleAPIClient(group.api_config.id) + response = accredible_api.issue_badge(accredible_badge_data) + except BadgeProviderError: + user_credential.state = "error" + user_credential.save() + raise + + user_credential.external_id = response.get("credential").get("id") + user_credential.state = AccredibleBadge.STATES.accepted + user_credential.save() + + def revoke_accredible_badge(self, credential_id, user_credential): + """ + Requests Accredible service for external badge expiring based on internal user credential (AccredibleBadge). + """ + + credential = self.get_credential(credential_id) + accredible_api_client = AccredibleAPIClient(credential.api_config.id) + revoke_badge_data = AccredibleExpireBadgeData( + credential=AccredibleExpiredCredential(expired_on=datetime.now().strftime("%Y-%m-%d %H:%M:%S %z")) + ) + + try: + accredible_api_client.revoke_badge(user_credential.external_id, revoke_badge_data) + except BadgeProviderError: + user_credential.state = "error" + user_credential.save() + raise + + user_credential.state = AccredibleBadge.STATES.expired + user_credential.save() + + def award(self, *, username, credential_id): + """ + Awards a Accredible badge. + + - Creates user credential record for the group, for a given user; + - Notifies about the awarded badge (public signal); + - Issues external Accredible badge (Accredible API); + + Returns: (AccredibleBadge) user credential + """ + + accredible_badge = super().award(username=username, credential_id=credential_id) + + # do not issue new badges if the badge was issued already + if not accredible_badge.propagated: + self.issue_accredible_badge(user_credential=accredible_badge) + + return accredible_badge + + def revoke(self, credential_id, username): + """ + Revokes a Accredible badge. + + - Changes user credential status to REVOKED, for a given user; + - Notifies about the revoked badge (public signal); + - Expire external Accredible badge (Accredible API); + + Returns: (AccredibleBadge) user credential + """ + + user_credential = super().revoke(credential_id, username) + if user_credential.propagated: + self.revoke_accredible_badge(credential_id, user_credential) + return user_credential diff --git a/credentials/apps/badges/management/commands/sync_accredible_groups.py b/credentials/apps/badges/management/commands/sync_accredible_groups.py new file mode 100644 index 000000000..11c3b694e --- /dev/null +++ b/credentials/apps/badges/management/commands/sync_accredible_groups.py @@ -0,0 +1,54 @@ +from django.core.management.base import BaseCommand + +from credentials.apps.badges.accredible.api_client import AccredibleAPIClient +from credentials.apps.badges.models import AccredibleAPIConfig + + +class Command(BaseCommand): + """ + Sync groups for a specific accredible api config or all configs. + + Usage: + site_id=1 + api_config_id=1 + + ./manage.py sync_accredible_groups --site_id $site_id + ./manage.py sync_accredible_groups --site_id $site_id --api_config_id $api_config_id + """ + + help = "Sync accredible groups for a specific api config or all api configs" + + def add_arguments(self, parser): + parser.add_argument("--site_id", type=int, help="Site ID.") + parser.add_argument("--api_config_id", type=str, help="ID of the API config.") + + def handle(self, *args, **options): + """ + Handle the command. + """ + DEFAULT_SITE_ID = 1 + api_configs_to_sync = [] + + site_id = options.get("site_id") + api_config_id = options.get("api_config_id") + + if site_id is None: + self.stdout.write(f"Side ID wasn't provided: assuming site_id = {DEFAULT_SITE_ID}") + site_id = DEFAULT_SITE_ID + + if api_config_id: + api_configs_to_sync.append(api_config_id) + self.stdout.write(f"Syncing groups for the single config: {api_config_id}") + else: + api_configs_to_sync = AccredibleAPIConfig.get_all_api_config_ids() + self.stdout.write( + "API Config ID wasn't provided: syncing groups for all configs - " f"{api_configs_to_sync}", + ) + + for api_config in AccredibleAPIConfig.objects.filter(id__in=api_configs_to_sync): + accredible_api_client = AccredibleAPIClient(api_config.id) + processed_items = accredible_api_client.sync_groups(site_id) + + self.stdout.write(f"API Config {api_config_id}: got {processed_items} groups.") + + self.stdout.write("...completed!") diff --git a/credentials/apps/badges/migrations/0002_accredibleapiconfig_accrediblebadge_and_more.py b/credentials/apps/badges/migrations/0002_accredibleapiconfig_accrediblebadge_and_more.py new file mode 100644 index 000000000..848e757fb --- /dev/null +++ b/credentials/apps/badges/migrations/0002_accredibleapiconfig_accrediblebadge_and_more.py @@ -0,0 +1,65 @@ +# Generated by Django 4.2.17 on 2024-12-20 10:13 + +from django.db import migrations, models +import django.db.models.deletion +import django_extensions.db.fields +import model_utils.fields + + +class Migration(migrations.Migration): + + dependencies = [ + ('credentials', '0030_revoke_certificates_management_command'), + ('badges', '0001_initial'), + ] + + operations = [ + migrations.CreateModel( + name='AccredibleAPIConfig', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), + ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), + ('name', models.CharField(blank=True, help_text='Accredible API configuration name.', max_length=255, null=True)), + ('api_key', models.CharField(help_text='Accredible API key.', max_length=255)), + ], + options={ + 'get_latest_by': 'modified', + 'abstract': False, + }, + ), + migrations.CreateModel( + name='AccredibleBadge', + fields=[ + ('usercredential_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='credentials.usercredential')), + ('state', model_utils.fields.StatusField(choices=[('created', 'created'), ('no_response', 'no_response'), ('error', 'error'), ('accepted', 'accepted'), ('expired', 'expired')], default='created', help_text='Accredible badge issuing state', max_length=100, no_check_for_status=True)), + ('external_id', models.IntegerField(blank=True, help_text='Accredible service badge identifier', null=True, unique=True)), + ], + options={ + 'get_latest_by': 'modified', + 'abstract': False, + }, + bases=('credentials.usercredential',), + ), + migrations.AlterField( + model_name='badgetemplate', + name='icon', + field=models.ImageField(blank=True, max_length=255, null=True, upload_to='badge_templates/icons'), + ), + migrations.AlterField( + model_name='badgetemplate', + name='state', + field=model_utils.fields.StatusField(choices=[('draft', 'draft'), ('active', 'active'), ('archived', 'archived')], default='draft', help_text='Credly badge template state (auto-managed).', max_length=100, no_check_for_status=True, null=True), + ), + migrations.CreateModel( + name='AccredibleGroup', + fields=[ + ('badgetemplate_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='badges.badgetemplate')), + ('api_config', models.ForeignKey(help_text='Accredible API configuration.', on_delete=django.db.models.deletion.CASCADE, to='badges.accredibleapiconfig')), + ], + options={ + 'abstract': False, + }, + bases=('badges.badgetemplate',), + ), + ] diff --git a/credentials/apps/badges/migrations/0003_alter_accredibleapiconfig_name.py b/credentials/apps/badges/migrations/0003_alter_accredibleapiconfig_name.py new file mode 100644 index 000000000..fa87b0218 --- /dev/null +++ b/credentials/apps/badges/migrations/0003_alter_accredibleapiconfig_name.py @@ -0,0 +1,18 @@ +# Generated by Django 4.2.17 on 2024-12-23 15:08 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("badges", "0002_accredibleapiconfig_accrediblebadge_and_more"), + ] + + operations = [ + migrations.AlterField( + model_name="accredibleapiconfig", + name="name", + field=models.CharField(help_text="Accredible API configuration name.", max_length=255, null=True), + ), + ] diff --git a/credentials/apps/badges/models.py b/credentials/apps/badges/models.py index 84ad3a3e9..a16fced95 100644 --- a/credentials/apps/badges/models.py +++ b/credentials/apps/badges/models.py @@ -15,6 +15,7 @@ from model_utils.fields import StatusField from openedx_events.learning.data import BadgeData, BadgeTemplateData, UserData, UserPersonalData +from credentials.apps.badges.accredible.utils import get_accredible_base_url from credentials.apps.badges.credly.utils import get_credly_base_url from credentials.apps.badges.signals.signals import ( notify_progress_complete, @@ -88,11 +89,12 @@ class BadgeTemplate(AbstractCredential): uuid = models.UUIDField(unique=True, default=uuid.uuid4, help_text=_("Unique badge template ID.")) name = models.CharField(max_length=255, help_text=_("Badge template name.")) description = models.TextField(null=True, blank=True, help_text=_("Badge template description.")) - icon = models.ImageField(upload_to="badge_templates/icons", null=True, blank=True) + icon = models.ImageField(upload_to="badge_templates/icons", null=True, blank=True, max_length=255) origin = models.CharField(max_length=128, null=True, blank=True, help_text=_("Badge template type.")) state = StatusField( choices_name="STATES", help_text=_("Credly badge template state (auto-managed)."), + null=True, ) def __str__(self): @@ -536,7 +538,7 @@ def groups(self): return { group: BadgeRequirement.is_group_fulfilled(group=group, template=self.template, username=self.username) - for group in self.template.groups + for group in getattr(self.template, "groups", []) } @property @@ -551,15 +553,14 @@ def progress(self): """ Notify about the progress. """ - - notify_progress_complete(self, self.username, self.template.id) + notify_progress_complete(self, self.username, self.template.id, self.template.origin) def regress(self): """ Notify about the regression. """ - notify_progress_incomplete(self, self.username, self.template.id) + notify_progress_incomplete(self, self.username, self.template.id, self.template.origin) def reset(self): """ @@ -623,6 +624,7 @@ class CredlyBadge(UserCredential): STATES.pending, STATES.accepted, STATES.rejected, + STATES.revoked, } state = StatusField( @@ -675,3 +677,115 @@ def propagated(self): """ return self.external_uuid and (self.state in self.ISSUING_STATES) + + +class AccredibleAPIConfig(TimeStampedModel): + """ + Accredible API configuration. + """ + + name = models.CharField(max_length=255, help_text=_("Accredible API configuration name."), null=True, blank=False) + api_key = models.CharField(max_length=255, help_text=_("Accredible API key.")) + + @classmethod + def get_all_api_config_ids(cls): + """ + Get all api config IDs. + """ + return list(cls.objects.values_list("id", flat=True)) + + +class AccredibleGroup(BadgeTemplate): + """ + Accredible badge group credential type. + + Accredible groups should not be created manually, instead they are pulled from the Accredible service. + """ + + ORIGIN = "accredible" + uuid = None + + api_config = models.ForeignKey( + AccredibleAPIConfig, + on_delete=models.CASCADE, + help_text=_("Accredible API configuration."), + ) + + @property + def management_url(self): + """ + Build external Credly dashboard URL. + """ + accredible_host_base_url = get_accredible_base_url(settings) + return urljoin(accredible_host_base_url, f"issuer/dashboard/group/{self.id}/information-and-appearance") + + +class AccredibleBadge(UserCredential): + """ + Earned Accredible badge (Badge template credential) for user. + + - tracks distributed (external Accredible service) state for Accredible badge. + """ + + STATES = Choices( + "created", + "no_response", + "error", + "accepted", + "expired", + ) + ISSUING_STATES = { + STATES.accepted, + STATES.expired, + } + + state = StatusField( + choices_name="STATES", + help_text=_("Accredible badge issuing state"), + default=STATES.created, + ) + + external_id = models.IntegerField( + blank=True, + null=True, + unique=True, + help_text=_("Accredible service badge identifier"), + ) + + def as_badge_data(self) -> BadgeData: + """ + Represents itself as a BadgeData instance. + """ + + user = get_user_by_username(self.username) + group = self.credential + + badge_data = BadgeData( + uuid=str(self.uuid), + user=UserData( + pii=UserPersonalData( + username=self.username, + email=user.email, + name=user.get_full_name(), + ), + id=user.lms_user_id, + is_active=user.is_active, + ), + template=BadgeTemplateData( + uuid=str(group.uuid), + origin=group.origin, + name=group.name, + description=group.description, + image_url=str(group.icon), + ), + ) + + return badge_data + + @property + def propagated(self): + """ + Checks if this user credential already has issued (external) Accredible badge. + """ + + return self.external_id and (self.state in self.ISSUING_STATES) diff --git a/credentials/apps/badges/signals/handlers.py b/credentials/apps/badges/signals/handlers.py index 2044e0849..6af0665d9 100644 --- a/credentials/apps/badges/signals/handlers.py +++ b/credentials/apps/badges/signals/handlers.py @@ -9,8 +9,8 @@ from django.dispatch import receiver from openedx_events.tooling import OpenEdxPublicSignal, load_all_signals -from credentials.apps.badges.issuers import CredlyBadgeTemplateIssuer -from credentials.apps.badges.models import BadgeProgress +from credentials.apps.badges.issuers import AccredibleBadgeTemplateIssuer, CredlyBadgeTemplateIssuer +from credentials.apps.badges.models import AccredibleGroup, BadgeProgress, CredlyBadgeTemplate from credentials.apps.badges.processing.generic import process_event from credentials.apps.badges.signals import ( BADGE_PROGRESS_COMPLETE, @@ -63,7 +63,7 @@ def handle_requirement_regressed(sender, username, **kwargs): @receiver(BADGE_PROGRESS_COMPLETE) -def handle_badge_completion(sender, username, badge_template_id, **kwargs): # pylint: disable=unused-argument +def handle_badge_completion(sender, username, badge_template_id, origin, **kwargs): # pylint: disable=unused-argument """ Fires once ALL requirements for a badge template were marked as "done". @@ -73,11 +73,14 @@ def handle_badge_completion(sender, username, badge_template_id, **kwargs): # p logger.debug("BADGES: progress is complete for %s on the %s", username, badge_template_id) - CredlyBadgeTemplateIssuer().award(username=username, credential_id=badge_template_id) + if origin == CredlyBadgeTemplate.ORIGIN: + CredlyBadgeTemplateIssuer().award(username=username, credential_id=badge_template_id) + elif origin == AccredibleGroup.ORIGIN: + AccredibleBadgeTemplateIssuer().award(username=username, credential_id=badge_template_id) @receiver(BADGE_PROGRESS_INCOMPLETE) -def handle_badge_regression(sender, username, badge_template_id, **kwargs): # pylint: disable=unused-argument +def handle_badge_regression(sender, username, badge_template_id, origin, **kwargs): # pylint: disable=unused-argument """ On user's Badge regression (incompletion). @@ -85,4 +88,7 @@ def handle_badge_regression(sender, username, badge_template_id, **kwargs): # p - badge template ID """ - CredlyBadgeTemplateIssuer().revoke(badge_template_id, username) + if origin == CredlyBadgeTemplate.ORIGIN: + CredlyBadgeTemplateIssuer().revoke(badge_template_id, username) + elif origin == AccredibleGroup.ORIGIN: + AccredibleBadgeTemplateIssuer().revoke(badge_template_id, username) diff --git a/credentials/apps/badges/signals/signals.py b/credentials/apps/badges/signals/signals.py index db224ff54..a02dec413 100644 --- a/credentials/apps/badges/signals/signals.py +++ b/credentials/apps/badges/signals/signals.py @@ -48,7 +48,7 @@ def notify_requirement_regressed(*, sender, username, badge_template_id): ) -def notify_progress_complete(sender, username, badge_template_id): +def notify_progress_complete(sender, username, badge_template_id, origin): """ Notifies about user's completion on the badge template. """ @@ -57,10 +57,11 @@ def notify_progress_complete(sender, username, badge_template_id): sender=sender, username=username, badge_template_id=badge_template_id, + origin=origin, ) -def notify_progress_incomplete(sender, username, badge_template_id): +def notify_progress_incomplete(sender, username, badge_template_id, origin): """ Notifies about user's regression on the badge template. """ @@ -68,6 +69,7 @@ def notify_progress_incomplete(sender, username, badge_template_id): sender=sender, username=username, badge_template_id=badge_template_id, + origin=origin, ) diff --git a/credentials/apps/badges/tests/accredible/__init__.py b/credentials/apps/badges/tests/accredible/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/credentials/apps/badges/tests/accredible/test_api_client.py b/credentials/apps/badges/tests/accredible/test_api_client.py new file mode 100644 index 000000000..4779b7f85 --- /dev/null +++ b/credentials/apps/badges/tests/accredible/test_api_client.py @@ -0,0 +1,96 @@ +from unittest import mock + +from attrs import asdict +from django.test import TestCase + +from credentials.apps.badges.accredible.api_client import AccredibleAPIClient +from credentials.apps.badges.accredible.data import ( + AccredibleBadgeData, + AccredibleCredential, + AccredibleExpireBadgeData, + AccredibleExpiredCredential, + AccredibleRecipient, +) +from credentials.apps.badges.models import AccredibleAPIConfig, AccredibleGroup + + +class AccredibleAPIClientTestCase(TestCase): + def setUp(self): + self.api_config = AccredibleAPIConfig.objects.create( + api_key="test-api-key", + name="test_config", + ) + self.api_client = AccredibleAPIClient(self.api_config.id) + self.badge_data = AccredibleBadgeData( + credential=AccredibleCredential( + recipient=AccredibleRecipient(name="Test name", email="test_name@test.com"), + group_id=123, + name="Test Badge", + issued_on="2021-01-01 00:00:00 +0000", + complete=True, + ) + ) + self.expire_badge_data = AccredibleExpireBadgeData( + credential=AccredibleExpiredCredential(expired_on="2021-01-01 00:00:00 +0000") + ) + + def test_fetch_all_groups(self): + with mock.patch.object(AccredibleAPIClient, "perform_request") as mock_perform_request: + mock_perform_request.return_value = {"groups": ["group1", "group2"]} + result = self.api_client.fetch_all_groups() + mock_perform_request.assert_called_once_with("get", "issuer/all_groups") + self.assertEqual(result, {"groups": ["group1", "group2"]}) + + def test_fetch_design_image(self): + design_id = 123 + with mock.patch.object(AccredibleAPIClient, "perform_request") as mock_perform_request: + mock_perform_request.return_value = {"design": {"rasterized_content_url": "url"}} + result = self.api_client.fetch_design_image(design_id) + mock_perform_request.assert_called_once_with("get", f"designs/{design_id}") + self.assertEqual(result, "url") + + def test_issue_badge(self): + with mock.patch.object(AccredibleAPIClient, "perform_request") as mock_perform_request: + mock_perform_request.return_value = {"badge": "issued"} + result = self.api_client.issue_badge(self.badge_data) + mock_perform_request.assert_called_once_with("post", "credentials", asdict(self.badge_data)) + self.assertEqual(result, {"badge": "issued"}) + + def test_revoke_badge(self): + badge_id = 123 + with mock.patch.object(AccredibleAPIClient, "perform_request") as mock_perform_request: + mock_perform_request.return_value = {"badge": "revoked"} + result = self.api_client.revoke_badge(badge_id, self.expire_badge_data) + mock_perform_request.assert_called_once_with( + "patch", f"credentials/{badge_id}", asdict(self.expire_badge_data) + ) + self.assertEqual(result, {"badge": "revoked"}) + + def test_sync_groups(self): + AccredibleGroup.objects.create( + id=777, + api_config=self.api_config, + name="old_name", + description="old_desc", + icon="old_icon", + site_id=1, + ) + with mock.patch.object(AccredibleAPIClient, "fetch_all_groups") as mock_fetch_all_groups, mock.patch.object( + AccredibleAPIClient, "fetch_design_image" + ) as mock_fetch_design_image: + mock_fetch_all_groups.return_value = { + "groups": [{"id": 1, "course_name": "name", "course_description": "desc", "primary_design_id": 123}] + } + mock_fetch_design_image.return_value = "url" + + self.assertEqual(AccredibleGroup.objects.filter(id=777).exists(), True) + result = self.api_client.sync_groups(1) + mock_fetch_all_groups.assert_called_once() + mock_fetch_design_image.assert_called_once_with(123) + self.assertEqual(result, 1) + self.assertEqual(AccredibleGroup.objects.count(), 1) + self.assertEqual(AccredibleGroup.objects.first().name, "name") + self.assertEqual(AccredibleGroup.objects.first().description, "desc") + self.assertEqual(AccredibleGroup.objects.first().icon, "url") + self.assertEqual(AccredibleGroup.objects.first().api_config, self.api_config) + self.assertEqual(AccredibleGroup.objects.filter(id=777).exists(), False) diff --git a/credentials/apps/badges/tests/accredible/test_utils.py b/credentials/apps/badges/tests/accredible/test_utils.py new file mode 100644 index 000000000..1a64bfd9a --- /dev/null +++ b/credentials/apps/badges/tests/accredible/test_utils.py @@ -0,0 +1,27 @@ +from django.conf import settings +from django.test import TestCase + +from credentials.apps.badges.accredible.utils import get_accredible_base_url + + +class TestGetAccredibleBaseUrl(TestCase): + def test_get_accredible_base_url_sandbox(self): + settings.BADGES_CONFIG["accredible"] = { + "ACCREDIBLE_BASE_URL": "https://accredible.com", + "ACCREDIBLE_SANDBOX_BASE_URL": "https://sandbox.accredible.com", + "ACCREDIBLE_SANDBOX_API_BASE_URL": "https://sandbox.api.accredible.com/v1/", + "USE_SANDBOX": True, + } + + result = get_accredible_base_url(settings) + self.assertEqual(result, "https://sandbox.accredible.com") + + def test_get_accredible_base_url_production(self): + settings.BADGES_CONFIG["accredible"] = { + "ACCREDIBLE_BASE_URL": "https://accredible.com", + "ACCREDIBLE_SANDBOX_BASE_URL": "https://sandbox.accredible.com", + "ACCREDIBLE_SANDBOX_API_BASE_URL": "https://sandbox.api.accredible.com/v1/", + "USE_SANDBOX": False, + } + result = get_accredible_base_url(settings) + self.assertEqual(result, "https://accredible.com") diff --git a/credentials/apps/badges/tests/test_admin_forms.py b/credentials/apps/badges/tests/test_admin_forms.py index 6a5914e93..1c41d4013 100644 --- a/credentials/apps/badges/tests/test_admin_forms.py +++ b/credentials/apps/badges/tests/test_admin_forms.py @@ -11,7 +11,7 @@ DataRuleExtensionsMixin, ParentMixin, ) -from credentials.apps.badges.credly.exceptions import CredlyAPIError +from credentials.apps.badges.exceptions import BadgeProviderError from credentials.apps.badges.models import BadgeRequirement, BadgeTemplate @@ -132,7 +132,7 @@ def test_clean_with_invalid_organization(self): ) as mock_get_orgs: mock_get_orgs.return_value = {"test_uuid": "test_org"} - with self.assertRaises(forms.ValidationError) as cm: + with self.assertRaises(BadgeProviderError) as cm: form.clean() self.assertIn("You specified an invalid authorization token.", str(cm.exception)) @@ -170,13 +170,13 @@ def test_ensure_organization_exists(self): def test_ensure_organization_exists_with_error(self): form = CredlyOrganizationAdminForm() api_client = MagicMock() - api_client.fetch_organization.side_effect = CredlyAPIError("API Error") + api_client.fetch_organization.side_effect = BadgeProviderError("API Error") - with self.assertRaises(forms.ValidationError) as cm: + with self.assertRaises(BadgeProviderError) as cm: form.ensure_organization_exists(api_client) api_client.fetch_organization.assert_called_once() - self.assertEqual(str(cm.exception), "['API Error']") + self.assertEqual(str(cm.exception), "API Error") class TestParentMixin(ParentMixin): diff --git a/credentials/apps/badges/tests/test_issuers.py b/credentials/apps/badges/tests/test_issuers.py index 787f2ba27..5f9e3a427 100644 --- a/credentials/apps/badges/tests/test_issuers.py +++ b/credentials/apps/badges/tests/test_issuers.py @@ -6,10 +6,18 @@ from django.contrib.contenttypes.models import ContentType from django.test import TestCase +from credentials.apps.badges.accredible.api_client import AccredibleAPIClient from credentials.apps.badges.credly.api_client import CredlyAPIClient -from credentials.apps.badges.credly.exceptions import CredlyAPIError -from credentials.apps.badges.issuers import CredlyBadgeTemplateIssuer -from credentials.apps.badges.models import CredlyBadge, CredlyBadgeTemplate, CredlyOrganization +from credentials.apps.badges.exceptions import BadgeProviderError +from credentials.apps.badges.issuers import AccredibleBadgeTemplateIssuer, CredlyBadgeTemplateIssuer +from credentials.apps.badges.models import ( + AccredibleAPIConfig, + AccredibleBadge, + AccredibleGroup, + CredlyBadge, + CredlyBadgeTemplate, + CredlyOrganization, +) from credentials.apps.credentials.constants import UserCredentialStatus @@ -126,10 +134,10 @@ def test_issue_credly_badge_with_error(self): # Mock the CredlyAPIClient and its issue_badge method to raise CredlyAPIError with mock.patch("credentials.apps.badges.credly.api_client.CredlyAPIClient") as mock_credly_api_client: mock_issue_badge = mock_credly_api_client.return_value.issue_badge - mock_issue_badge.side_effect = CredlyAPIError + mock_issue_badge.side_effect = BadgeProviderError # Call the issue_credly_badge method and expect CredlyAPIError to be raised - with self.assertRaises(CredlyAPIError): + with self.assertRaises(BadgeProviderError): self.issuer().issue_credly_badge(user_credential=user_credential) # Check if the user credential state is updated to "error" @@ -154,7 +162,7 @@ def test_revoke_credly_badge_success(self, mock_revoke_badge): user_credential.refresh_from_db() self.assertEqual(user_credential.state, "revoked") - @patch.object(CredlyAPIClient, "revoke_badge", side_effect=CredlyAPIError("Revocation failed")) + @patch.object(CredlyAPIClient, "revoke_badge", side_effect=BadgeProviderError("Revocation failed")) def test_revoke_credly_badge_failure(self, mock_revoke_badge): # pylint: disable=unused-argument user_credential = self.issued_user_credential_type.objects.create( username="test_user", @@ -165,8 +173,151 @@ def test_revoke_credly_badge_failure(self, mock_revoke_badge): # pylint: disabl external_uuid=self.fake.uuid4(), ) - with self.assertRaises(CredlyAPIError): + with self.assertRaises(BadgeProviderError): self.issuer().revoke_credly_badge(self.badge_template.id, user_credential) user_credential.refresh_from_db() self.assertEqual(user_credential.state, "error") + + +class AccredibleBadgeTemplateIssuerTestCase(TestCase): + issued_credential_type = AccredibleGroup + issued_user_credential_type = AccredibleBadge + issuer = AccredibleBadgeTemplateIssuer + + def setUp(self): + self.fake = faker.Faker() + self.accredible_api_config = AccredibleAPIConfig.objects.create( + api_key=self.fake.uuid4(), name=self.fake.word() + ) + self.group = self.issued_credential_type.objects.create( + origin=self.issued_credential_type.ORIGIN, + site_id=1, + uuid=self.fake.uuid4(), + name=self.fake.word(), + state="active", + api_config=self.accredible_api_config, + ) + User.objects.create_user(username="test_user", email="test_email@example.com", password="test_password") + + def _perform_request(self, method, endpoint, data=None): # pylint: disable=unused-argument + return {"credential": {"id": 123}} + + def test_create_user_credential_awarded(self): + with mock.patch("credentials.apps.badges.issuers.notify_badge_awarded") as mock_notify_badge_awarded: + with mock.patch.object(self.issuer, "issue_accredible_badge") as mock_issue_accredible_badge: + self.issuer().award(credential_id=self.group.id, username="test_user") + + mock_notify_badge_awarded.assert_called_once() + mock_issue_accredible_badge.assert_called_once() + + self.assertTrue( + self.issued_user_credential_type.objects.filter( + username="test_user", + credential_content_type=ContentType.objects.get_for_model(self.group), + credential_id=self.group.id, + ).exists() + ) + + def test_create_user_credential_revoked(self): + self.issued_user_credential_type.objects.create( + username="test_user", + credential_content_type=ContentType.objects.get_for_model(self.group), + credential_id=self.group.id, + state=AccredibleBadge.STATES.accepted, + uuid=self.fake.uuid4(), + external_id=123, + ) + + with mock.patch("credentials.apps.badges.issuers.notify_badge_revoked") as mock_notify_badge_revoked: + with mock.patch.object(self.issuer, "revoke_accredible_badge") as mock_revoke_accredible_badge: + self.issuer().revoke(self.group.id, "test_user") + + mock_revoke_accredible_badge.assert_called_once() + mock_notify_badge_revoked.assert_called_once() + + self.assertTrue( + self.issued_user_credential_type.objects.filter( + username="test_user", + credential_content_type=ContentType.objects.get_for_model(self.group), + credential_id=self.group.id, + status=UserCredentialStatus.REVOKED, + ).exists() + ) + + @patch.object(AccredibleAPIClient, "perform_request", _perform_request) + def test_issue_accredible_badge(self): + user_credential = self.issued_user_credential_type.objects.create( + username="test_user", + credential_content_type=ContentType.objects.get_for_model(self.group), + credential_id=self.group.id, + state=AccredibleBadge.STATES.accepted, + uuid=self.fake.uuid4(), + external_id=123, + ) + + self.issuer().issue_accredible_badge(user_credential=user_credential) + + self.assertIsNotNone(user_credential.external_id) + self.assertEqual(user_credential.state, AccredibleBadge.STATES.accepted) + + user_credential.refresh_from_db() + self.assertIsNotNone(user_credential.external_id) + self.assertEqual(user_credential.state, AccredibleBadge.STATES.accepted) + + def test_issue_accredible_badge_with_error(self): + user_credential = self.issued_user_credential_type.objects.create( + username="test_user", + credential_content_type=ContentType.objects.get_for_model(self.group), + credential_id=self.group.id, + state=AccredibleBadge.STATES.accepted, + uuid=self.fake.uuid4(), + external_id=123, + ) + + with mock.patch( + "credentials.apps.badges.accredible.api_client.AccredibleAPIClient" + ) as mock_accredible_api_client: + mock_issue_badge = mock_accredible_api_client.return_value.issue_badge + mock_issue_badge.side_effect = BadgeProviderError + + with self.assertRaises(BadgeProviderError): + self.issuer().issue_accredible_badge(user_credential=user_credential) + + user_credential.refresh_from_db() + self.assertEqual(user_credential.state, "error") + + @patch.object(AccredibleAPIClient, "revoke_badge") + def test_revoke_accredible_badge_success(self, mock_revoke_badge): + user_credential = self.issued_user_credential_type.objects.create( + username="test_user", + credential_content_type=ContentType.objects.get_for_model(self.group), + credential_id=self.group.id, + state=AccredibleBadge.STATES.accepted, + uuid=self.fake.uuid4(), + external_id=123, + ) + + mock_revoke_badge.return_value = {"credential": {"id": 123}} + + self.issuer().revoke_accredible_badge(self.group.id, user_credential) + + user_credential.refresh_from_db() + self.assertEqual(user_credential.state, "expired") + + @patch.object(AccredibleAPIClient, "revoke_badge", side_effect=BadgeProviderError("Revocation failed")) + def test_revoke_accredible_badge_failure(self, mock_revoke_badge): # pylint: disable=unused-argument + user_credential = self.issued_user_credential_type.objects.create( + username="test_user", + credential_content_type=ContentType.objects.get_for_model(self.group), + credential_id=self.group.id, + state=AccredibleBadge.STATES.accepted, + uuid=self.fake.uuid4(), + external_id=123, + ) + + with self.assertRaises(BadgeProviderError): + self.issuer().revoke_accredible_badge(self.group.id, user_credential) + + user_credential.refresh_from_db() + self.assertEqual(user_credential.state, "error") diff --git a/credentials/apps/badges/tests/test_management_commands.py b/credentials/apps/badges/tests/test_management_commands.py index 2209bdbd3..963819498 100644 --- a/credentials/apps/badges/tests/test_management_commands.py +++ b/credentials/apps/badges/tests/test_management_commands.py @@ -4,7 +4,7 @@ from django.core.management import call_command from django.test import TestCase -from credentials.apps.badges.models import CredlyOrganization +from credentials.apps.badges.models import AccredibleAPIConfig, CredlyOrganization class TestSyncOrganizationBadgeTemplatesCommand(TestCase): @@ -26,3 +26,24 @@ def test_handle_with_organization_id(self, mock_credly_api_client): call_command("sync_organization_badge_templates", "--organization_id", self.credly_organization.uuid) mock_credly_api_client.assert_called_once_with(self.credly_organization.uuid) mock_credly_api_client.return_value.sync_organization_badge_templates.assert_called_once_with(1) + + +class TestSyncAccredibleGroupsCommand(TestCase): + def setUp(self): + self.faker = faker.Faker() + self.api_config = AccredibleAPIConfig.objects.create(api_key=self.faker.uuid4(), name=self.faker.word()) + AccredibleAPIConfig.objects.bulk_create([AccredibleAPIConfig(api_key=self.faker.uuid4()) for _ in range(5)]) + + @mock.patch("credentials.apps.badges.management.commands.sync_accredible_groups.AccredibleAPIClient") + def test_handle_no_arguments(self, mock_accredible_api_client): + call_command("sync_accredible_groups") + self.assertEqual(mock_accredible_api_client.call_count, AccredibleAPIConfig.objects.all().count()) + self.assertEqual( + mock_accredible_api_client.return_value.sync_groups.call_count, AccredibleAPIConfig.objects.all().count() + ) + + @mock.patch("credentials.apps.badges.management.commands.sync_accredible_groups.AccredibleAPIClient") + def test_handle_with_api_config_id(self, mock_accredible_api_client): + call_command("sync_accredible_groups", "--api_config_id", self.api_config.id) + mock_accredible_api_client.assert_called_once_with(1) + mock_accredible_api_client.return_value.sync_groups.assert_called_once_with(1) diff --git a/credentials/apps/badges/tests/test_models.py b/credentials/apps/badges/tests/test_models.py index cd123b921..879192f01 100644 --- a/credentials/apps/badges/tests/test_models.py +++ b/credentials/apps/badges/tests/test_models.py @@ -9,6 +9,9 @@ from openedx_events.learning.data import BadgeData, BadgeTemplateData, UserData, UserPersonalData from credentials.apps.badges.models import ( + AccredibleAPIConfig, + AccredibleBadge, + AccredibleGroup, BadgePenalty, BadgeProgress, BadgeRequirement, @@ -734,3 +737,84 @@ def test_is_active(self): self.requirement.template.is_active = False self.assertFalse(self.rule.is_active) + + +class AccredibleGroupTestCase(TestCase): + def setUp(self): + self.api_config = AccredibleAPIConfig.objects.create(api_key="test-api-key", name="test_config") + self.site = Site.objects.create(domain="test_domain", name="test_name") + self.group = AccredibleGroup.objects.create( + api_config=self.api_config, + id=55, + name="test_group", + site=self.site, + ) + + def test_management_url(self): + credly_host_base_url = "https://example.com/" + with patch("credentials.apps.badges.models.get_accredible_base_url") as mock_get_accredible_base_url: + mock_get_accredible_base_url.return_value = credly_host_base_url + expected_url = f"{credly_host_base_url}issuer/dashboard/group/{self.group.id}/information-and-appearance" + self.assertEqual(self.group.management_url, expected_url) + mock_get_accredible_base_url.assert_called_with(settings) + + +class AccredibleAPIConfigTestCase(TestCase): + def setUp(self): + self.api_config = AccredibleAPIConfig.objects.create( + api_key="test-api-key", + name="test_config", + ) + + def test_get_all_api_config_ids(self): + organization_ids = list(AccredibleAPIConfig.get_all_api_config_ids()) + self.assertEqual(organization_ids, [self.api_config.id]) + + +class AccredibleBadgeAsBadgeDataTestCase(TestCase): + def setUp(self): + self.user = User.objects.create_user( + username="test_user", + email="test@example.com", + full_name="Test User", + lms_user_id=1, + ) + self.site = Site.objects.create(domain="test_domain", name="test_name") + self.credential = BadgeTemplate.objects.create( + uuid=uuid.uuid4(), + origin="test_origin", + name="test_template", + description="test_description", + icon="test_icon", + site=self.site, + ) + self.badge = AccredibleBadge.objects.create( + username="test_user", + credential_content_type=ContentType.objects.get_for_model(self.credential), + credential_id=self.credential.id, + state=AccredibleBadge.STATES.created, + uuid=uuid.uuid4(), + ) + + def test_as_badge_data(self): + expected_badge_data = BadgeData( + uuid=str(self.badge.uuid), + user=UserData( + pii=UserPersonalData( + username=self.user.username, + email=self.user.email, + name=self.user.get_full_name(), + ), + id=self.user.lms_user_id, + is_active=self.user.is_active, + ), + template=BadgeTemplateData( + uuid=str(self.credential.uuid), + origin=self.credential.origin, + name=self.credential.name, + description=self.credential.description, + image_url=str(self.credential.icon), + ), + ) + actual_badge_data = self.badge.as_badge_data() + self.assertEqual(actual_badge_data, expected_badge_data) diff --git a/credentials/apps/badges/tests/test_signals.py b/credentials/apps/badges/tests/test_signals.py index 0a79663b4..ed3d2b3d8 100644 --- a/credentials/apps/badges/tests/test_signals.py +++ b/credentials/apps/badges/tests/test_signals.py @@ -28,6 +28,7 @@ def test_progression_signal_emission_and_receiver_execution(self): sender=self, username="test_user", badge_template_id=self.badge_template.id, + origin=self.badge_template.origin, ) # UserCredential object @@ -51,6 +52,7 @@ def test_regression_signal_emission_and_receiver_execution(self): sender=self, username="test_user", badge_template_id=self.badge_template.id, + origin=self.badge_template.origin, ) # UserCredential object diff --git a/credentials/apps/credentials/migrations/0031_alter_usercredential_credential_content_type.py b/credentials/apps/credentials/migrations/0031_alter_usercredential_credential_content_type.py new file mode 100644 index 000000000..1e039ecbd --- /dev/null +++ b/credentials/apps/credentials/migrations/0031_alter_usercredential_credential_content_type.py @@ -0,0 +1,20 @@ +# Generated by Django 4.2.17 on 2024-12-19 11:38 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('contenttypes', '0002_remove_content_type_name'), + ('credentials', '0030_revoke_certificates_management_command'), + ] + + operations = [ + migrations.AlterField( + model_name='usercredential', + name='credential_content_type', + field=models.ForeignKey(limit_choices_to={'model__in': ('coursecertificate', 'programcertificate', 'credlybadgetemplate', 'accrediblegroup')}, on_delete=django.db.models.deletion.CASCADE, to='contenttypes.contenttype'), + ), + ] diff --git a/credentials/apps/credentials/models.py b/credentials/apps/credentials/models.py index 85e1dac9e..313932d30 100644 --- a/credentials/apps/credentials/models.py +++ b/credentials/apps/credentials/models.py @@ -169,7 +169,9 @@ class UserCredential(TimeStampedModel): credential_content_type = models.ForeignKey( ContentType, - limit_choices_to={"model__in": ("coursecertificate", "programcertificate", "credlybadgetemplate")}, + limit_choices_to={ + "model__in": ("coursecertificate", "programcertificate", "credlybadgetemplate", "accrediblegroup") + }, on_delete=models.CASCADE, ) credential_id = models.PositiveIntegerField() diff --git a/credentials/apps/credentials/tests/test_api.py b/credentials/apps/credentials/tests/test_api.py index ddb8de1c0..34a6efedd 100644 --- a/credentials/apps/credentials/tests/test_api.py +++ b/credentials/apps/credentials/tests/test_api.py @@ -474,8 +474,8 @@ def test_award_course_credential(self): assert credential.username == self.user.username assert credential.credential_id == course_cert_config.id assert credential.status == "awarded" - # 22 is the content type for "Course Certificate" - assert credential.credential_content_type_id == 22 + # 25 is the content type for "Course Certificate" + assert credential.credential_content_type_id == 25 def test_revoke_course_credential(self): """ @@ -498,8 +498,8 @@ def test_revoke_course_credential(self): assert credential.username == self.user.username assert credential.credential_id == course_cert_config.id assert credential.status == "revoked" - # 22 is the content type for "Course Certificate" - assert credential.credential_content_type_id == 22 + # 25 is the content type for "Course Certificate" + assert credential.credential_content_type_id == 25 def test_update_existing_cert(self): """ @@ -565,8 +565,8 @@ def test_award_course_cert_no_course_certificate(self): assert credential.username == self.user.username assert credential.credential_id == course_cert_config.id assert credential.status == "awarded" - # 22 is the content type for "Course Certificate" - assert credential.credential_content_type_id == 22 + # 25 is the content type for "Course Certificate" + assert credential.credential_content_type_id == 25 def test_award_course_cert_no_course_certificate_exception_occurs(self): """ diff --git a/credentials/conf/locale/eo/LC_MESSAGES/django.mo b/credentials/conf/locale/eo/LC_MESSAGES/django.mo index 13fa51d521eddfca71fef424411f21a24c17fcc7..230449428381e2841e8feb1d8d24d2aa9c89c8d4 100644 GIT binary patch delta 4957 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 ZlMN^D?bB*`tG&wy);W7`qp5Yv{|`q^5C8xG diff --git a/credentials/conf/locale/eo/LC_MESSAGES/django.po b/credentials/conf/locale/eo/LC_MESSAGES/django.po index b87bed099..a074ad03c 100644 --- a/credentials/conf/locale/eo/LC_MESSAGES/django.po +++ b/credentials/conf/locale/eo/LC_MESSAGES/django.po @@ -1,7 +1,7 @@ # edX translation file. -# Copyright (C) 2024 EdX +# Copyright (C) 2025 EdX # This file is distributed under the GNU AFFERO GENERAL PUBLIC LICENSE. -# EdX Team , 2024. +# EdX Team , 2025. # msgid "" msgstr "" @@ -77,6 +77,18 @@ msgstr "" msgid "badge template" msgstr "ßädgé témpläté Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт#" +#: apps/badges/admin.py +msgid "Failed to sync groups for API config: {}. {}" +msgstr "" +"Fäïléd tö sýnç gröüps för ÀPÌ çönfïg: {}. {} Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, " +"¢σηѕє¢тєтυя #" + +#: apps/badges/admin.py +msgid "Accredible groups were successfully updated." +msgstr "" +"Àççrédïßlé gröüps wéré süççéssfüllý üpdätéd. Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, " +"¢σηѕє¢тєтυя #" + #: apps/badges/admin_forms.py msgid "You can't provide an API key for a configured organization." msgstr "" @@ -264,6 +276,28 @@ msgstr "Çrédlý ßädgé ïssüïng stäté Ⱡ'σяєм ιρѕυм ∂σłσ msgid "Credly service badge identifier" msgstr "Çrédlý sérvïçé ßädgé ïdéntïfïér Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, ¢σηѕє¢т#" +#: apps/badges/models.py +msgid "Accredible API configuration name." +msgstr "" +"Àççrédïßlé ÀPÌ çönfïgürätïön nämé. Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, ¢σηѕє¢тєт#" + +#: apps/badges/models.py +msgid "Accredible API key." +msgstr "Àççrédïßlé ÀPÌ kéý. Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт,#" + +#: apps/badges/models.py +msgid "Accredible API configuration." +msgstr "Àççrédïßlé ÀPÌ çönfïgürätïön. Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, ¢σηѕє¢#" + +#: apps/badges/models.py +msgid "Accredible badge issuing state" +msgstr "Àççrédïßlé ßädgé ïssüïng stäté Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, ¢σηѕє¢т#" + +#: apps/badges/models.py +msgid "Accredible service badge identifier" +msgstr "" +"Àççrédïßlé sérvïçé ßädgé ïdéntïfïér Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, ¢σηѕє¢тєт#" + #: apps/core/admin.py msgid "Activate selected entries" msgstr "Àçtïväté séléçtéd éntrïés Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, ¢σηѕ#" diff --git a/credentials/conf/locale/eo/LC_MESSAGES/djangojs.po b/credentials/conf/locale/eo/LC_MESSAGES/djangojs.po index 69b8ed15c..a076364d7 100644 --- a/credentials/conf/locale/eo/LC_MESSAGES/djangojs.po +++ b/credentials/conf/locale/eo/LC_MESSAGES/djangojs.po @@ -1,7 +1,7 @@ # edX translation file. -# Copyright (C) 2024 EdX +# Copyright (C) 2025 EdX # This file is distributed under the GNU AFFERO GENERAL PUBLIC LICENSE. -# EdX Team , 2024. +# EdX Team , 2025. # msgid "" msgstr "" diff --git a/credentials/conf/locale/rtl/LC_MESSAGES/django.mo b/credentials/conf/locale/rtl/LC_MESSAGES/django.mo index 24b820aaeaf5f5805e87a0d5ddbb16dbdfffb83d..281448727be56ef07e8e8a95490d81b97a9319e3 100644 GIT binary patch delta 4965 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 delta 4354 zcmYk<32;@_9S7hOMFR+eAR)4beFwu97J-N?B4PnUEh-?$R&hbCR}QeP%U<<)tPoi$A15JFEifB?|tXo_ujo{y-6N_uVn2X zN(vt}t9M^=ye@5|=H!$bm!!0&QJhWb<)$f3QGbP9)tfgLaZDNo_IjKMrbuiQJ8^8)tcB==8C725Mn4&X74U`4Bx{G^#)D!GJR zxH~`p4x=Z>7~e0~`slzAFEPY5T*wtPIO!P8ZaTp{>sxBTLbRwueqsotKAAq77UZs= zd!#KK#{ImIU-2wXXq)wXB`ehL=MwH?16HwU%HEhT`7&lnYSbPt%ivOgxrA`&uTB@d5NEb7v?0UxaZ>uO|AK2)` ziB3Gp^SOuGkiKCwppE9oB0H1yIg|1J0#&s}sSjKgx zay)NjOw~(_>%Bp{q>#Q)h@O;oPsuYTm9aOw(NC)JVnd``89mv|*j~>u7Ul04i|u2^ z_hz|zjNlqZk2fm$7(S8kYD% z6=Pdn%i-L`cla@5o9**p{}bP31$TH_P2(F}RAL1Br}PhY#(I&zvqLW zI5C?;2d8v3A7YG5LwB9S)m+5SIEK@$ycps~Ii4T#Qg+eWQ+XQ=TH3&~d4RK6;^`HO zcs2)e+c0>v&#vIR>UVP#FB_4qk*&N~eLoFeYN2%< zIEK}n&k5X-pZ`2R-@M=|<=&`awCpOj;T}dq-eN4aFLN7IXXo2-vGZejCHFEGTPNL( z)qMfyaU;!A`Y&tP-A&v(-OBiU;YEcQ(xZ%#=i%vlma{m9(DIP3*&GS%{V$ zQRu>wDOroVF)nx!?ZmX0ws6|P6+FyioH;e6$2jrAly2a^Sk1Xs+7NDM)IXx-k=jqo zw((qEuKveq#@~0+!0%_Pd=+DeA7L3^<7j@!7^#YjvS;{KR;kyrBR^rxbtCiEl3f`i zHIniDWjvDyS;;RMi?-`@SM8uMae7L>UcxKYZ>DKa zM`^awfJ?Jovz(>sZ!l-Me#7WV z)vT-s3pr1HEzcE1(AFDuy3w!1 zFBW!)4=zaQhwMbBi$`2AdKb@!-^l$E!ycbIK^~Ev@}hkAsK_gAxL9nE;vcTJ#HxBF zfAcu*S3I`nS`x*PXw6mmIh{+t%*)$ygU2O$+eDs{Ur9_?95Je~hCF}LL()n{xqo^| zM#^Z}BR`cm&dw-4Ode3~C?lj=PLmxnLri(HEQ<3S``l(IK4@yWP~s@hC{E3N%46j& zDR{^g|A?5)IAS~6*2SZz*O>d`$9RPk#Uf6>IDV2pm+oSU(=KT$tL31?@kB=Pb(z;q zQYF?)A^lpRkNixom)KUXiY;2)(y2q6DRVc5u3|)iA5O4#*E~VQ9LZK;$uB3 zu>+1Dw<#=&`F~#FTv;wF&UY1B_St@aO92Eb@yS-S; z9=jfb=`~p=`{Zef`xhUrQEn?Mqu}TukI6OCO%BN2aD8BZ~%Vpm=_d;I2F85islN)4jer{s!9h@vz)lE9BrrxFv dZOZGGmaVH_H>~}Kt?TBWb)<3K+VjdP{tqKc*MR^4 diff --git a/credentials/conf/locale/rtl/LC_MESSAGES/django.po b/credentials/conf/locale/rtl/LC_MESSAGES/django.po index 5a64fdeda..ddc422f24 100644 --- a/credentials/conf/locale/rtl/LC_MESSAGES/django.po +++ b/credentials/conf/locale/rtl/LC_MESSAGES/django.po @@ -1,7 +1,7 @@ # edX translation file. -# Copyright (C) 2024 EdX +# Copyright (C) 2025 EdX # This file is distributed under the GNU AFFERO GENERAL PUBLIC LICENSE. -# EdX Team , 2024. +# EdX Team , 2025. # msgid "" msgstr "" @@ -67,6 +67,14 @@ msgstr "Ⱥɔʇᴉʌǝ bɐdƃǝ ʇǝɯdlɐʇǝ ɯnsʇ ɥɐʌǝ ɐʇ lǝɐsʇ øn msgid "badge template" msgstr "bɐdƃǝ ʇǝɯdlɐʇǝ" +#: apps/badges/admin.py +msgid "Failed to sync groups for API config: {}. {}" +msgstr "Fɐᴉlǝd ʇø sʎnɔ ƃɹønds ɟøɹ ȺⱣƗ ɔønɟᴉƃ: {}. {}" + +#: apps/badges/admin.py +msgid "Accredible groups were successfully updated." +msgstr "Ⱥɔɔɹǝdᴉblǝ ƃɹønds ʍǝɹǝ snɔɔǝssɟnllʎ nddɐʇǝd." + #: apps/badges/admin_forms.py msgid "You can't provide an API key for a configured organization." msgstr "Ɏøn ɔɐn'ʇ dɹøʌᴉdǝ ɐn ȺⱣƗ ʞǝʎ ɟøɹ ɐ ɔønɟᴉƃnɹǝd øɹƃɐnᴉzɐʇᴉøn." @@ -219,6 +227,26 @@ msgstr "Ȼɹǝdlʎ bɐdƃǝ ᴉssnᴉnƃ sʇɐʇǝ" msgid "Credly service badge identifier" msgstr "Ȼɹǝdlʎ sǝɹʌᴉɔǝ bɐdƃǝ ᴉdǝnʇᴉɟᴉǝɹ" +#: apps/badges/models.py +msgid "Accredible API configuration name." +msgstr "Ⱥɔɔɹǝdᴉblǝ ȺⱣƗ ɔønɟᴉƃnɹɐʇᴉøn nɐɯǝ." + +#: apps/badges/models.py +msgid "Accredible API key." +msgstr "Ⱥɔɔɹǝdᴉblǝ ȺⱣƗ ʞǝʎ." + +#: apps/badges/models.py +msgid "Accredible API configuration." +msgstr "Ⱥɔɔɹǝdᴉblǝ ȺⱣƗ ɔønɟᴉƃnɹɐʇᴉøn." + +#: apps/badges/models.py +msgid "Accredible badge issuing state" +msgstr "Ⱥɔɔɹǝdᴉblǝ bɐdƃǝ ᴉssnᴉnƃ sʇɐʇǝ" + +#: apps/badges/models.py +msgid "Accredible service badge identifier" +msgstr "Ⱥɔɔɹǝdᴉblǝ sǝɹʌᴉɔǝ bɐdƃǝ ᴉdǝnʇᴉɟᴉǝɹ" + #: apps/core/admin.py msgid "Activate selected entries" msgstr "Ⱥɔʇᴉʌɐʇǝ sǝlǝɔʇǝd ǝnʇɹᴉǝs" diff --git a/credentials/conf/locale/rtl/LC_MESSAGES/djangojs.po b/credentials/conf/locale/rtl/LC_MESSAGES/djangojs.po index 011e6c391..5b58270f4 100644 --- a/credentials/conf/locale/rtl/LC_MESSAGES/djangojs.po +++ b/credentials/conf/locale/rtl/LC_MESSAGES/djangojs.po @@ -1,7 +1,7 @@ # edX translation file. -# Copyright (C) 2024 EdX +# Copyright (C) 2025 EdX # This file is distributed under the GNU AFFERO GENERAL PUBLIC LICENSE. -# EdX Team , 2024. +# EdX Team , 2025. # msgid "" msgstr "" diff --git a/credentials/settings/base.py b/credentials/settings/base.py index 6fdbbde9e..ec20a3bba 100644 --- a/credentials/settings/base.py +++ b/credentials/settings/base.py @@ -567,6 +567,13 @@ "CREDLY_SANDBOX_API_BASE_URL": "https://sandbox-api.credly.com/v1/", "USE_SANDBOX": False, }, + "accredible": { + "ACCREDIBLE_BASE_URL": "https://dashboard.accredible.com/", + "ACCREDIBLE_API_BASE_URL": "https://api.accredible.com/v1/", + "ACCREDIBLE_SANDBOX_BASE_URL": "https://sandbox.dashboard.accredible.com/", + "ACCREDIBLE_SANDBOX_API_BASE_URL": "https://sandbox.api.accredible.com/v1/", + "USE_SANDBOX": False, + }, "rules": { "ignored_keypaths": [ "user.id", diff --git a/docs/_static/images/badges/badges-admin-groups-sync.png b/docs/_static/images/badges/badges-admin-groups-sync.png new file mode 100644 index 0000000000000000000000000000000000000000..e6642517ebdcf35b129454753fb6264417f0d63d GIT binary patch literal 136772 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д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 bEDlJ;hxThLdP-a%{GKbQJt==|_U3;9L?v8* literal 0 HcmV?d00001 diff --git a/docs/_static/images/badges/badges-admin.png b/docs/_static/images/badges/badges-admin.png index e05d8e9c5487ae93d00754041fcc1baf2b4fca22..f37a2531ce78193bf38742a8986a5e452802780e 100644 GIT binary patch literal 50135 zcmZVl1yo$Iw>}Kd41?PM#cj|6#oZZPin|ndcM4^2_fiVQowitU3KaJicP|uL+}(MH z-@X5P@A|&8)|uoaTaxT^lAR}eV$@aTu`$Rn0002CqJoSj004vm03a4L6hw&*aSA2? zfc4s5T3TIES{kbE;c8>=WDNi)#H8w>>TCTZ$~DrY0i(&ll(tnMrNH9wagYK>=+|(1 z7!wyGm{6qU>)N6$_*Dx=;k+)4h5hnatZ?7{p}SQymFJ^j?y+6;tP z2hB*9UW}bQ8PHUj|kWb0l9Z{DMxBmve&K&7nIfWjB2n>?o_O075+l%!sebq9t~ z?LRgQs(OEhkoZq(-b7O)!F0FItTO<1=Tf;k(7|wFFA_Gl4`_Y((GN72BSTq?;l99L z{&AFVih8?sQymjO@3U-fs~Pk1gyMB-uwHoN>$8vi8@rX5I_Y?A^3B2y+fjd}&Z?m1 zSGxIcsx4(qJqz#XRmDlVBIqm%ps%kR=+9td!z@Lhefc#3HX0#>q#Qjk?PL;@aza-XAh z`YnJp%Jk^y>N}R!q_u1Fl6PW$rv>vhDFzlMf1&Lk@(8KRei2^kcTyiy_lI7@(r1U$ zP$t7IdevE_G|b+!_++zwpzkg9eWR914JprzTT=8aLOnPEXt+dw5C{`AF@Xs1euq-K zsHTdWu#O}p>fOZXS)KJ1>O8KY!oX{xuuc$${!|z5d+c6kF>JBpJO_G`;}9$>5S|-} zRiq6)cD#ZaIVwh19wa6h?rYN7`4#O2?C}gu_h(F$kj@@}8)e`li_jW+uOF1+Z}(Fy zkl|-FYRnp!RqxYrG;TSd|2<~8$NlP=^uAssQbx3-99KPUoVb-D7A*?CbWE3w(K6tw zuk8eF{Ea7G zM4Bn!9__^rMmofp`?D74W-T!2f%>3p6Tv5S=ZXjSj6gYHQho7}J9b^IhEzzaN43XU zUp8aU^{nWWFF54o@d9;cF5%)I<}gUdGmb=AB-Qte3sb35jmY?HM;xh__#++ z14tq+b`A5uAdmdfL9w%oUo1S#Z_B)QeQt}%hKNUo^?t`M+fN#ByW8lB$04nf&=RT9 zx>59a_;~mr!)_im#D1IfVYTW(Z1(hACXN8t+1p1)Pdl%OeL%rsRL99~=dWygBCCk_ z0Hf4|OjgJ&IC}ix>%aLuKh&s6kUY(hHr!DTJISxZpb(Ton5Y7ZR{oWNTi#G77AGnz zxG(=j1!zwac^<!y=1Lwyk&xauSIO<0c60gbX7NW%nkuwq?(S7emCQ?>K`?&6S5= zcy`W{5XW_ER%0ngj`S#1b5~%L_hhblx5s*$iOu_GNAtK59Rl9EG35qh9`9U>!i7vi z^foT8N$*)60Y`lu5IeARs90BAC!I3A6}}B57Tr4BIGirL?$~6PzLf?)M!Ar00_k_$ z&t9i>r*)5YoAtnTMGKJ=yqY8#+MSerMe$-L{Jf89ER4?d2Mjq-V;b)dzmsPM8LezR zIE5luX^4}D2K@&Ie(DXX{iJ5jeDOM#m?4(7c(|~lc)yregIz-g zSb^=!tj3t;k)~;BX=z5OUs>PRm>Ht4spXXFB2|~LgSM8&mK*GX;MR9D)VQ?Ri_T8e%o{MQtG9@HF?+ohjuMYBQQ#<| z{%l%!Wv9to$=jR>AMwjf&6MYJb-1+Ws_(a#wf|?&Hn&*hEm{6LtJt}OvY2h!q@qpw zuKtn^rJvK*jTF>R+ppShAom4FW56)#OG>3yS)JM!l`ndFMsqp>8gDr zTb!mh52p@G50ek$7RAfC%f-mCk?RQT{`&g;UD3t;h0HsKcXt=x_5#LjcTjh>wyS1c z$2)9;$>&LXNrpM+E!<}FZRaNc9!DU2^*r%>+0IQp)ic#&gY!(i3J&!X z+w~erTvPL_f=j+RC+-_A1d%aSG4obAKhaYp^jlbQUVYLT74F&PnDZ75i{UQqsCTH9>%y54$ebKa$~%_(ZJdBJ)?XVJJ;{$S;x?=tIP zX#mpio0uG5O6EBwxe~IWzNWr++?l*X@<;#g{Mt3VqHq3VP5D4B`CZ@75#~AjFH<@0 ziyPhjgb9vhSCb2)25WD2;3E;6`1{#{gqDxg)tpZOd(^Z8&}p{|?r2HrfV$IJRE+PF&|~ zP~W8A90xSsd0p4Sr{Ldje6BNYPaewdscy6GFdyFDNc@}ks1@=T8bitkSpnrizdhQT zJeyx4)pWk^{LtA5J;)EwkIld9vgyj`YUpaCaiOV`R*l4$>XFuq`u&&m1l&qy;+if$ zzg*4pXZMf$AHqMlbo;bccq#-DcHRx7I0*V9iDXc0K#uQDPtRx0kM3;L`t#}KDr zf9U&}z+C*X_oFd$KuRcMW!`kgZkl2CJImUOzZoeU%3SFmME=cd-)cWj_t=Nm7uSo~ z=Ur>uvjmz7a|CF;s|tQK5A|g{C;mp@69<=Zlu_e>bI)3NS>IZH8`&Q{9by^U#q;bV zTqj;ASTL$v-IV#aKe{uf@@pkee)RQ_2+Ks;UxiU+o?L!U!ynTohO7tahkOAK=OzYC zPM;`})zSnu_d0PObR!bhMf$=(tD(O_-}2zwQskEMX>r$ir>#_2*X0tS5I=H~=dq=) za1VHmb_?NddThGnMGe2so8w-EKd#^8U`i2ba}=`=8(cdkYfWSp&c%Ho;$!1CY&AP6 zI+AKHXPae8BV2v6-e$F@2`}}vU*i5`P5vo>887W#b649?_tw7I?1p1C>8}0$?var6 z)uL`o)pBiYlTz(&zeC5&jAQ-mi*J7QKHZDA-WA>qdnQ$REss(ejtjHc)7Y`tl>hMl zC6Kf6e_OmRr7d57XAS%Js1li#=KSu5LDS7Iq9-&_N7#4aATmHKlWVJ^?< zZ>fI|knjxJ0lLB5*OJ2QQC%r8B&I#m1DX!yho}W8%_*2m<#%mouK2C^ym%P}8mX~G z7AOC%c>R4jkmn$~cbehPQm$~gejGM|! z3&(X^K{$^$=R%{+1X}^40;b0;Zs)|89N5Gw9JAkB8mMk&4(8~b51lVQiL&#VT(&Mx zi?=^q6L!4%@(so0;fCyJv2QPVZpoE?xyhU7!e)T&Pvy6z=I^HWy2nccBAAExhiS`G zt$IGI$AL3PjU7ivZbyQb&|}HHo~Ed`ROnP<{;WawrJg4Qiz&5V7}XqGvVUa$2>ZeD z#I=(&YCCC5?H~Ized{^pnYAVH`0q*2@u>IrC~+2XWB{!3}~PtsC2=F%{G9j^%@~y`xX3*7qT5KrE&teo{c|GB$vX z6o4Wsp!u?NGztk>BgY;Ua;>KC9ZA7-2$=42y-laO_Vy$QMiK#5hu)rR0}AZ{z5bx- zKIT5cypO9_J!)OluRDBS;i&$%Y zMH>|r01G0I1^@%e0LX|O5OIqG$^R!W2V?>u{ihrR07TgX!2eC7ib$WY_lWzM=f6^< z50L;=#1lT^_RRAL;+)LC^XCl3LP=iilLp(!<)?#naB!EA#E^XD)O%1p`k2 zfQaGw1}bXOA0y8mIUTe>>4n_IbBShM>&yFJSRi24d6vd-3C=1^Z}Cl^m) zUoqPMPzWRP&&3?H(EpHlIf~KhtEfYzT|KO!{Op|UoV4N?P$*Q?!^%cjQ%3H;*%41- zw02%zZo(WKZ{NOUf6K$}>S4>lB_t%o!O6|R&CQ0OVDt2I@iO;ibMd76FCqU=j*PXZ zrH8$nm%XbC^jWUCg{!xh7%lCyqW`)6tDV-q_W!HN#q+rs+xuEO8OYc>BgPD&LmaV!ivEZG|F7nMHU1w?{r~0U;pY6mod2ih|Cdw8)7nGY z)fu7EOZJ3 zq==X7`2rFmewh9%ea;*4{J7*_0svqDMHxwLU*NtmDqL&kN}?nst?gH2tw8N3EIc3{ zm_krpCcDY)Y31%^ldO!42Ka@5G)!{A|ETTlYf`q7u*0XD-)=p7boME{1&W?H)S0bU zhxfnzJFeoh=*{+KD;Ml{cIau*&_JQV9W;mkVdaV01|sg6SRyI01NY87%1u4Tk39 zK|s?AgXIXyYf2DMdexkI4fzCkyE6DX3K=K~&@e*}9Ta`m^dtjA8!JEGL8oylNe41ez6C%Vey zZ!V(IQLVGtI;&c`w+f1ZANSkQAl`Yd`40~K5k|fO#-DX$16K2*f)ka}kpj6$$ zM>1xWttFHL!xI5VJ6^fpT(gS@`$VA`1~Q)CiHb~hQ+Xv?cIQ%}@}R5>{sTJAyWUIX z$9?U#rHT!4=Ua>Tyq;l>y>Q1RFxmJnh*F3^x$42B%S7j>aojH|OTsCf0XR z+QT=8AXFWHD7rp|I9X5arF0BwrbQf82rf^EhqySnOWK=c;Y3Y*dHUEO{$tS@jq3ERZ%z1 zjGnW3>g$cz584@&YdtM}rDi{~NBZnxdte6>vDAiQ+Vg(uPY?PkRI9C^?((saaw@U6fr1ZH81A`xF?V9}dGwc5vhs>YaLuW}JRj=*j*n zOGqOnX5FoB4ylOo`?eEcE|Q^X{-P*xY=m`b&2pbhyu`dfS!Mo9|6Dq|!g*Gxf1&jB zUMM9I)_BJr8AEBpU#mBq7moJKt_LB7yzchQsYIT>kR+O4Ok>^_*c8#&G!=B$aGIMO z+ric5z*@tx#B^_5Z|IOb}s&!*cTSZ`Btu)8Ve*f6X)=kvPQch z{vZ!Er*qU(29hw@0E9cc_Z#hs4da5%^CLn(k4QpncW>^0lQg6gA4ccz`6e$G2D}Fo zS@AJ`yFxXnxAH6!&o?%L{GFZwPZn-&n@43`amNRSvZdMIr~ zgJ8a}wsg-#ZeL8=`q+TqaMOH4_7}Swl$caajhVG_g_}oz{eA7S^RpEZYccL&yiT}H zV5EXK;U#WX81!9Os13RYCno>s`Z9HTqm7~hv(%VcrJZp#bTC9&y}$E4kL8!4?|kBw zjwRy+`;X|Y!{3F4`d*?=?sa_9t0JHlQj}EQwvil1?UiVir|5D;mFl4w_e6g@{l1_V z&v&NuH06+!F%-;qF>}vdpQ&3E((#1#s&_@d5Ys+Xu(FI)S7z=@-`M~Wk8i`2m z%Z{t0_)j$o`+m@U{2bOUy(dSVu=#}z1P_3svXZ>Clbz4MuQ~oNg1} z0@efm3B>s%j$m4TB`$Z^FOe8GY$w4l;^#91J6kiPkny6N7kGsu)5S+=AWg?%_Q5>w zJdNEk{?#5H;aAm*4M)%_3vW+pGxn@Z6jX%JGpk@(SBmI=Y){uiSxAkvO9GrMC)Y>| z8*LN`1ijze_OsprrEqL6I8!75MMc8U`UlG4#UK?}zxv?6y#Z!S%5mI2Pr*Srz>KD18^|XOaW_Yy| z4$B|1B)>8zWO6}$c3%^d`hJ<= za84~A3syX=qK$rg@t!_53*OpaGMm}TR9 z4Exa+e~NtXE5ml2|DIa8$nd;T^d#)a(1AciV?rzxn{IA6|axd6CCB;Xp54ULY;UFHQ{F z&m_Zb`#gT18bs^X?6Bdn{jCzB9#R?f^VZIk?NqaTCO1avX^b$v-3c%nHnL5Hfr*VL z$R%`$cCAu&A{!%f$Kj zc|2ofVB(!`B0mnL>xtr~-1ER?02)L9-W@0Me!^bDTPPq?Zy2mmcs86j5dy8RvdvJA z53O+=jD<-lLFe2v?!CyGbYUOVDe61M7yK@fvbN{z3uegCb?1O*6!bZRWZTC_Y-Bl% zunn89QyV&Ww*!y1Tw@7i6ahyUTY!uFLg_>YyvQoKN6qp={-{7iuRJyM`xo#;55$xYbl>)>NxW2v{s!T6@|dBb588%T!iJ#^T5 zV?pftaklp7`Bbc?p53RGHxCZISXXAkWDM{5D2@4fN#2*694owCWqA6?l@y3e@QsAv z6B}syVbcEOmVy8ZkCt2g5_rf86z1_kEP;j`@QV5D_|Of>@xgfNhH2lwa>19NnBza< zBkZ`4Tru}lz#sWx$B}&110}zs4;{u;{zjJJ=hSru*wmf{FJWz%WW>UN>X&GCoxIC% zdTpU5PdeDaSQt8%)?`|z01%ZeSI<1<5P9~{t^F8yDZhZ9ZZ(ci^X@pi5|!W{;W6@G zjq6S~M^H|2?ro&RF@4Z`)aV&?P68xTf7TxR95ekPrke5Y0MZ;`Ru_!>^83c?+kNWE zEI#h#u+H#Mk{Cq}d~oP^piyCij43^Ag_^=$(hc*B%mulPl%&C04;}LPy!`$rxs%ZK zFdw|ZC@HdRo11ndOr+0~UaZF&8!`}XvhUA0#}^j3TLbsdl-2p(KI^DpSz!7Q2{^LN zGkh!F117xvXX=R?ZkDXPwg%wEprk;&PYpMbbqbb`4Kf$JosA|5nHXr}vyywi_q8a7 z+hwDvL~ZvZP1FdWXuBe_+FU2@`$%}&MV)+rsTI2x#0dAd`X-rmwNf7*>Yy42wXz1b@fn-?d6J&h|{FSToRWwc)iF2lSmo9cF<~RH` zE%<0Hw*0|??4E=fHT)kO0tLO65Ouh55*25$8zPQhqX{L0nq3Fc=*0lqp5&9);<`0Z z_um1IO5fl}Z#YqnZg+*h3l5R_%On5_@Ao)r*wVRvLjUczw!wqJNJv{U4l=zh2^A(P zpi4a#fj#hJEJpXm7a>7Zg1=3tP=k6$6LO}RYzQzH!64@G^7_@jbQ5`fg!L(g11koE z8Z7BT?TFfZXOB_NN^-FKxAzCWz}MvK8RWVnsWBf}?Y^RU$#~`xJHw?E?%LIJtMH(M z?XReZqjVD+vt&_;+$d0IV;Et@Q)jAM6N2;HAq|YyuhBart0dCwhQK~nxdqsZ*fqf; zm(=W(t+UQOuW-cZ&}=B=X<$fFg70JN)F6W061iIJ1IZ**~zOMp5tve}zB2p{x={fPoQiN#p=8TrP^#lZWUmho}kGMakOD3!J7y)nZc7u~gp{0Y#L2@0V@e8gk#iSwq8 zhR8(0mfog7s6RE%H3tbt-Xdupa8lOZ#lQeD301b^Yq0{!LpW4 z>7wr?eMM0$=Z{!5bLuXdq=M5c1g9~&3UnzPuhVLRgNBuZ6^h1$*2U@_;o(?O4h1S} z6|A~f*c!z__yy^gTR2gm%^<({@I6fs znN%E3V;4xccXc5e7iVohmx|7a44QapMrGD+@onHV25s2i$&5r|*tv-`9=yFTDt(vx zCjsNp9Br1kzm&C#^Z`Asd3iQZ*W{7qN4ZpR`{j>LG`HnGY98tH0Va|r@GSK6H`ang z4wAebOXg;K5(Q5IM^UD^>l!);$cOb|LCKh%h&b^z^c@PD0w&|%t=2o$&hHt=Ds({F z1fC1K4w6KRP5~PtxC1cHk}r?1XW;nu_>)wAVDuwXHjeL_j95DXBozHIXg|OIggA%l z${p&>>gbFHBTa&DuiQd|ig#5WqqEbpj7-$2QNtR)Ak#;vspkj!o7%-nZ|cJbBhF0w z$L4oEhO2}PqrZw4{)0FrQeLxWaK*+baEY@-RF!vcTE!1;Ha4A0%}~?v%vL2il8gZz z_P|*Qk50|6ENva(YZB7_W>jQb3}`ODXQN-W-{EJ8;V3w2P6Uh}V!_=xH@_H|2^CN| z!40c3y86OYP%p^Gp1XIZ{OQK+N|4Z8Adz79Uu>IfYM%a=9!D3;@U2^{uNscM0k*v_ z6T9YjA&j)N3IF^osBNb%f|2sLt9249{l}-J!s@P#lBAtbgogbfG-1ub+Zp_MBlb?l zB1TD--1{p?%+g3EfxyK`dp*>w*Bf>EwrhwPBZO4;2r|f(naF+k@}5^KnS607$B+O zZ~2UVV4!5aI&_W4G{%%^JWcf(KGdUulI81RNAb!bV7hON2tqvq=hD}RhgJ+ABkbsj zDO-<*F#!(@4v`8AhL{zQD(yrgbO^=;XCrwLaVc^ju)YWs1gM8OqOK&5(9mfB4hQ7O zDo-MG!wMu}Xw~CbC0;TJiP^FUtk9sBz74_uf($|Re^@}`d3Ed}Cl;A?H~*!j80@DLJ)3+EnNQ_l>g7SjTOyNd^@#{WP)(xIh+skQZYy`)Nt zLvD@-z&D0olkhQpnC9VA%`djmpMhcSIL{{0iJ`OTdbB854 z17m-EH!F!5x}|r1{;u@k<#_cf%fhc##kjraA9{fC#_n`Ypw7FXTcuM#-d{V{Kz4_Z z9EuIJueH>ZX=g3mAVED{c1mNzwZDgsvZBY$`isa8*8SY?-+;Uw)Du7%fKP|QnX84E zq7ujDBTrXyc_nmT#02hU);rqx5I)p2$eK)Vy!>QHA*lh!r+9j z2{-&p2yfUH{CZ2;mwsudqeC9p$ngK3+SvD&TWd40XtBm`x{6q}QT|%=Gn9+eb1k0j z-#klDy9VUYbY>aOevZ`n#ca_9JR-W>=S5q;A@lrlZL%C6gnG)m4 z_Zteal+Fis#~FaR2~K+>UMd@v>cYM2Qu37c7fpL%FP2;z6YdnxJ@Q4rv4(_FZJBh3 zu?5VZ7{t@oMDn)@qH}zurMI6jiu3jsZe1yYGq2&@{5pX-0BhxbsHgD`_(p3>R3ePb-Ika*vD8* zv>aB7r83Rh-%@AL)?dR_JTzQuS1~7$P{>o!g%kyKd9q+U{Sa?T$A=pxXxzx%=IHL< zNG+nmwJZ>CH1sw0#pnagtn$<(k3G_rM9h+UyG&E}+WZ2zO!G4sndr}!sGa~-tVR~f zuHn(gk)*@a=L$nZ5#=lz1`X$80Y(oCroi7nbK^6*=? zyB2|%Ld*Eo_H@r(Qnv&v6}$jx5uDsux_azT+i_YhDuuAy;El|HmmeL&IGQU{r$wb6 z20Ky*u*p6PM61b!NCqFvr>mIR;e-kER%dn!@WvH3db6B>Uu%W~)>(*%lshUHRqhJM zCZ+@$G{QliXX;L(4c~MWRoK%_$Z`9>B5M^`368A5-@o+5vaj3)bEMhLj%Ln%g~`r) z-FY0M@C|MPo!(T6>aZKXQQ>5T85N?tF%a;eK?v%Q)i%@iJB;d%=#P5S6z_tTw^&Wg zvTz2CDt=e;_AfQBLg~^UHJo(QHe`_|7>~6A47J=DCG9dxTbnYqIjU~o zy+=RZA{05>UpmfZTj0egvHp=%D!cgEhXI7M$py+WIIv@_U3g&^u9C40 zg{Jz77bo@2mY8E7htsmZM^OL-vars-&xh?USGW8MLts;m2~imUa}XVyg7pbbTt9lP z!;qEPP%)O=0(Mz>iv~X$8K!tfjcLtRdf8c|O~bS!$g%#~0x!M9O}?`Zy)Z%!SuGiZO2 z1{xVYw3(%99jDw=OJVX;5>6vP`M$rh|-Gi zay1zTf0LO<$iinVlj3w7`aucA-QydnU7uWVWKi)H@J1hvS36(J{7a^|;5f zvxP7W%PnVZMROBzPc0+izDMcwG-xM;eXFNq_Uo2dmOLKOW!0;;HHPU(6X9;{#?MNtdTryTuvm zr{_amS?TwW-{S==el^bQXp4&UaV#Smw)LEykj>pr+p5%QgTm|r#(m~$Ht&vzhGfFz z`~)1mG6841ORtd@&n#4nsvaB63>uu=Wm!?vVa|#s4=Cmh>(~QCKS_qB;;6}|A77K9 z5qTN=5Rh;=>wS;iJp%Es)T?2U{awH$Iv`Jk+tFvb#fx_?wz^Agn2!F<{gCzzP2dCZ zr4;)R#rv*MWW`|LdYdZZi_;bPR8ov?fMkVDC2HvTpsf=JZwZTatkDt@KC8}?>l^V;Z}mMoNw_f~PgSfkFH z0B{-bQ?)pq0_r@J6`&aJ33){!48!3;{FL=l7_>~fyy4;*4Z3(xpMok5Ji~!o9esi_ z$-Ge$$BQqmqWMT_ErOXfE*z4WVcRiDSNeldmSa249GItOY0`vnDh5U`dy4+5O2d zn)Ki5atr$>4HNrdXFt4iJHwQAOQ{I{ihut?D7BY@Y}vT0+E@CzN(?K!yH(smmoN@q zWQB|UEML`c%@Je@`O4b=D|Z{&fj)_d?-fe|j^QUFYvEJm;SHM^y42S_+XE~ESpZ%~ zBXG1VoH8q6oE1+o0v(+;e8Gn3qej}mvc3;GBMF4_v=9pt$&PtrH21Bd-qw;T-juw( zY6+=z4Yx0#9<>WKIvIc$KK|K4I(JKFfui5jAN)0-Vmvkh9EK*yk7QRj&ZzNSHH92_ zXw8NL_RYSt^CE`%N9bbiO9qeAZ+ZTx*XPfot)Qo%$yT-NG|cy)|CJEz~@{ z`p0~BZlg_7gX%_B>uo~4SUS@>dxkp#&Y&LrhMays-fIR5i#OAh$``WO;Bt}C4~E)0 z(T>dX0V}%|1PwQ)!!4%)8jQ5PoaB<+zMs*7WAULaBi21$$mqd?lG{*Nx zWAMdhi2xMcE+~C)DE%I$Z&M>5EZ|X%90*I_n3-P&$8@ivtfGSrsY6NgY9i4zqjW)9 zR3fjypM~n>AW$E_;;0=7^AKcA<97a#vt4p{0p}Q}K|ul5(L(6M7n+KYZ<-gRPlA)K z#Yf%k-ytqbEc|2fT`$_2{!Gg+jeyZq&@s`{9a5oak2@(+i z1z}eQavps>U3%K)2!?aNJ3;#VD{SY;8!Vo8gjoUe*~8$kL;MaupvZQWc4`!Ne3JQc zBN#H_C!P_25D7HG%{$FY8nQc}=L`DshtzS}0+mfD?AzSeE>ab zA>e2LCed6PT@6cma86s`Kkj<7J3Pa-Dw)Azx;7mCPV>O{qFHxE z=KUd7)l?J0_~Iv7n73QQSw0`*9I<-UScgX}Zo`}eo z|EcQwW51V#=2LMCF} zTJ{77>qE}RCBZUe7wi3=c0Np)nAC>6XfF`I#Y8I0$K)F%QDPxuBlxo4r?E$9u)H=fcHDmC_ikANpfdgh!Dy&y#nU4 z8(cv`USfh#C3w6z1iK#z{5__I6CWC@9YV-Ip@Fo?atwBtHk<9~<thxha3*s-Q3y zv<2oHAD8!f{)i8~lWyVF5#g=ZQ9zo76!iVs#=cK7Jl!=y$ASKV7nd1+QVqYm9)xm+`E5wJ`!IMwWtkbuKlI0H zsLPxcejSk@Z@p}g_wk=F=(H~Vo8{JpkUJB_BMYlI#gDEp7WtGnKcL$o0Cb$*C6Ve} z(|9wNIr9$@{AeQ>h@H5OUf|O1*iFFt5aix3xcKN9ArJ!hf-fl=HER(&dtV_0GGZbQ zn-qNp9w-nGxjni{M2P)Ahdd1ae{0~7ca%?@@BRp*ZVNRPTOr7qlo2saM4u-|bm#h;S-|M04<8Xgw}&F0U~HEI5q<1ks(}I>8gZKSM2uSgJ@E zAgF0|bRh2xwXam`3lldtcTj|a%YWbwl91wJ`q=1bHxVM>JzML-ZMny?K?@{bWa48j zB0fv5QwvTD-d;UZddGow4F*xs!MH*KEbdE^LxWA}py2Jf9*!Jh@I5&&2`~Q|@ZfKu zc!Ufzg&~5kj;~KP+Jh_WH4trTr3fk0DS!7@J4POXbaXPRWcmu#|JP{PfE!&`RS|O4 zP$a_vZGMJ|OJLwC41x6s^eY-NBic^|>nsANCnqOU`tHcrtt|KmvdJQOy(~naRcm=@ zz8?X7;L9;ZhBhKF92uB|pZ_wc>u(8A>b0ovF|?$(nCYeMN{e@8huP7qu%acu?Qxn+ z9$Or-<4z>)dOMAPrB^0b2TSs=Ke3m5V0b;5An;p(;H7GD;KQv(0vX?SUeIF!1|f@j zxo%}^VdW&6WM_P^JbHCLZzrGQ?D+md-3)4WPfyRz`OcJfosCM%)8kz!+SB{<-);W( zC+mIZ$33`NCvMm8CJJS}PS#}`ww% zy{eDd*%b;ix-^Ghdvu!*+XX!SD(o&d^BDUdG^i3|Ym)OhybwDbq*EH=CpM$+Jlh(Z z8lVnRPLg;O)Tz*)$kzUb90HQeAIF0#|Gruc%5&*>@Nt-}$RM2ViNe(?)hzjViR$^` zXGV8-_gB3tlj#<3N5g6}V5Lc$p}qINU#VI*uk^kt+uPfpPsmd<^WYRm`d{y6J1;es z)@q>e{yhCRWVC1a!>5wlAi*0dMkHQOqwwyXaKP!$mr6z$I5?jr9mTKcR)ZrBbNiinKV97v=rMVOd{dhzb=sG~d(1sQn) zTVOf=7Uh80S>RU`b)W(<`x|xd7aS(pxj~P9zlMjkvwB8zL}J49waazcS}tad&@<~b zRI>#Oc!j5<-c{EuyAM!;rP_|#?_SV2fSeX;83N8m1TbC~J1;kJt@tcCe|-NQ7W8=Y zvLL80mas@QN4T^-pUO#}Gp|6gDB)(IBK{!lDl`}`L`pt*dwI?@NM&MTV!F}U$YDGm zs8eN<1LKC+IV0XX&A{>jD*t$;k4%y;)pCmw2-8$B5DD!s>M9{`8nKD5B-`TK)d0O@ zDrFG}<*!VB=SyNZn%`yl>mWE#g7vgL;I6FCX-qVtAEo2>=13MHdiTf3&nWB7cZWYp z&3hts?{oM<8kz;2<~d_yV>PV+2M41fNA({TQ`E#u>#4LuJ3-OdVEZ^g0k+huDMkri z1Bf`>L+*e$lT2Zh2v|r}gdSfDGlRafbAF$mPC_Q)Q;}*mGx9nJpMYQ|3|Bn=Wv;JO zz(=&jA~sO?tRsI&jby;Zj9xh6zhPl!1OP@ionXM;bg8Ac<(o216EN^QtvX^&iiQkV zq`uOdj3s>a_3hE`U&Gu4(8>GLAr2)^?oB>?=|Pl zh(93LW}d_B&_dJsV1MU8t7N=_?}>&DEsY8iLjO|Gz}5hsPl)eFhm7*qT(J+rUg{6G z7v8D6d=lU$`zgi}Sxe8!P;9gbtMqj!>>SnbTQqcy87!(4jEsjIX@D9UwqVWsx~957 zqqE9}5tbg~f4N_PN)1=fC=l`4R}bHI0fn1lGcpb@H+ybPzUF8vMneRA){Tk3E_wY) z*AknD^05=~=B|83v5N!z@Hr@hTOXHPY)?q1BC(M?3?%^Y0FqD{M8Lt=&e!7%9$UNf z?Flde$sw=^aiZoXqFtsPlSn0|v>JHF*2Ms*9AlLVwvqX}NPzZ27&I*j0mI&1?w5in zx9Q;qi@d!HeAmAqB*CUwV~{r_;_xPJzXInRk+-U{DbJp487JhJAoPtJb#FeOfSAIj zFyhY}kx1)OZou%cOGyM^&;!2deDnAxin<~Mxe}YUO4Tt5;l5`GxaOV)6sn$M+O&y* zD0pn*xl2&7$%^kiI+4XSz}zt9j)%)E4Bgi2^|%(tSv^}chzoi>DSbk_rDv!O##_J} zf=*KJuD56%c^QB|JhG!(z+&1^3ndL(?xv?`kA!lD`anZnh*W|X-2K}31odaqT z4>IoV?qzo8q+4M3`8$NYwd6DE(c@JxoFn?9Ph`peNWqSgWnzQz&@^NqZYUvAios-n z>v~Nsty089$Z}n9w5MlhF)mYoi4sIwPgS&2F}3(E;%BrhuF6nu`d()!>O}Y0XIVtt z08S?47xGCnt>9=_D-@2Fc)2z|_NuDY;tIkyNajs;mk{`;qx_(H&gUa~YeKt3Jl^3y z9pc5(vjuY(}K`7{Ru3`su+=lP!N{Slp5lj6#pd=8a&!$5dSP-W1p!6Rn zZXbGV_GPi17>oz1=gIUiLNqU1s?!p@tw@~@$=9-EefASOaS#%Hf|Hk?wO!*KlK^9J ztB=*Fb_$-4xX^&Nw`fXt&ve#^V<_WDRc;J~zgb1M#s&HajjmF|w(odmgMe7?Em_50 zAbeL5G~al@%@t>DLI;oem%uNsLy~r1Xi~5c^3716{lWB3AIMer(m$neEej7o)(r~9XSx70rv(WC0j%1ZKT;W8UTfME549Gb_!O6fQ@3wF^V$DB z*O@NUmE8?cVcX-`$l_a`y)nX_%E!TGs?`Q3+-!LS-8NQ8tCWA*GBv_fH~64AWqRx|m54)qVKbLiq;tmiAsvBvat9lc8^7VB=R|tzAwRkpOe zKfNkuT@v{6d1D3x9gY^vggbdhbBT;>3vvTvCe_RJC*R#0Jb3d}#Hh09>OIC{D40*X zAu%BuD@xWCH`O%RqMsC=4;AbjT|VfobbMQuy|ZMM0LFT>@RzAl?&@s%)h_-!krv`u zUQTSJ6jSjOpzdWzWg?T3{=rwYevbi+e7V8Sw9lKn8EDa7==^+2aJq(j+eY|NLfSeLp1v~gnI&dI*+?V4ORLLv$FB}sYJyt$@v zgl#l#@MS$AC{z}IsuqYVi41D0As85}QnF!TcKTN~yp}5_!d;js5=-fwWT}WL76h`I zq`az%0Oai~MHX)0`{A21hSr}eE2+NLJLs|sH={X>6aVs?93A2eGlG7vFPHyA(-r;* z`;aj`$<1xAJ`ky0V+9U48GGmbw1}cJLkpHm#cnFgV8+1efT9;>Mm^UzJJy(QFbpe*uC8L@-vV2>ip`lV{zWI?)?9e z_Eu4GG*Q1dGYlSFfPS5kcXPv9> z>bqgBqN}T`tGjFe_pf&CSqY}J(aw8UyWQ4HlUFz@iyO)^eV3xO+E*nmbk+Kg2JCA7 z=diOxE=JAhC?O@0S>AVZN<58OD^HYln9hm@rh2wG>(^&b>5_T=u96?EF zTP8@1zr>)5Gw(u?A|tLCQ5}988FWxH0j?TW*gECjMM?kFP?HKrj24}^jACdvoX5C9?pdM~e@ZBsRXouf?AESgI zi9~W>zRkh>U@e!nRame9(f;Jo{+L9$Y(VvDu(X!1h9Sme@Ju=HJWBw}814l=ANRGr z`7w=(H2_|L*eR3XUsSL5jtgWm;Xx|gy`;jLDF>~1btEn4L6-NoIa=?q z=9-o#B4$km?9-wp7w{eZc!++2x{15gfkqjKOhvUakWNuf_ceKQSIFo^^)RBJ z+7FIHBn`;m;(hN4bSZdt#g8Y)(Rw=u8)UDU2pq?lkO3rxrQZ9K8>&CNd zo^;$^W6D`s5J3J$RZol0W!#9K~Oj*Cs*~ykr{>OOB`ExTTh(M$@1RG zue1BiKLrXf*;sM4ZL!#hhA*j&#+tcE_mKk#Y3dQou0U-9mGEU-BAr`lQjv?FTgK7e zQoF~&QJ4qFT2BAtzu_lB@ZHmH538j}fwL@MmRfR6ZSq0NV!n|#R@kEqxg31G*iJ0g zdGxwh+eH3N3Y@6e4O@*Aw8Mt$kskZ*eRz(Wt$)hcdMmJ&!AFH`f+y9lw9B5-(V8N~ zkWt(yf80MSN`1vq>?5-@tljYs?xL&DIiL)K*#i8ob3c6p-MasLI;e_0{O#x7Nw=-R zMiU3%_9+nwCo5JHIWw2=rN>!)Kda&bL*u==CP@IgHzW{M3 zI)4v2$m@y5L0LeH-gBu6AVr@Ciyb z3J`?){KNu-hBw|t*E@d(T&X^khEAF+_PM{?v$6ku?|<~!>xfQ)32}`Sp}af4hpYvS zO0{r2dq2&GoMKShpE8Bw-sD)U-1U$xS2O1Z|vxe@V4rKz;NCq)RDLmS=CX`hREOPIwB`znq$OA)%( zKZMJms9dDC3{nn256k2=u{c0f6w+8G(Qp|@t6`&!uK1iPDEF8IUR**=Uo+8qq@fLS z|9DJ71vG~6)cPZh38+vbj4{CM$O8*FQU`qk#meu0SybLfZ_|eQtWUfPg9<8Q5Yh-k zLeb9$N%V@;P(E{$Wd^dJ&lI~$;KOxFMh~#T+B{KjXLPgG7Yre=q85QDXGU%pqE}92 z?-u6#@0*dmTyFI52izu8Q3tltU0OuIw}d_m;;|~xjg^y0PT6}MC-g{c%bbYaMkgcN z;2i{;s30n4V5dVDl2u%_4~B9EE+?yD?sWK&Je1cI`Tg{>gh9U7)V2_3pskIjvLB_s zI7e!eT|pS)hcFd>e1vjm1nlJl{s9M()F#HluMbc;!$_sy73>6 z7e>eLU0lm~s}%*w`yI{eLrD37!qPL;le9wNB=8EqgqaY4dy zm*8p){c*6~?BI-r?YLEbXm1et+283AlaXw8sdqCwa=PD01@YvPQab>`1V9yH0K_Z_ z7AJlSxDHylpf?>Q-|J>*fP&#SAUN&+D{StKNCh#5bp+r-=qmt9yn=Q~H4(;;@nJrI z(cOo46~rk2bJz_c0KDK&Dh(x3zt!ns?ZS4=YGH(P$^srhIU-m{1`1$PEqIb5ahS)# z2fmA!Q96@>()mKut(@LaSnj6-Eib@eDEKw1M~{5R0G7j4$a;IeTqs$TKSOh1SRvV|=7Y1r zM0+-=W@){>_BL*)y<4y1i-e6~Gci6xS33bSYy&gPo3pj9wK<;(w+vg~jQLdYNlPGW zi`Btwxplb=$9snG?pY_+7#rQ+|vF__tgejaJ2(7mhWm*Cp>wpXN(8Zoq-w|H^@RUqaM-~`!7#v+HbJp83`Qfqtu`O z9f(#$=c#l%76fxK8pS%SmIq#~4xf6WegT30u%@8Qr4v4{Vb&sYnMtIOyi~YA-{5U;K+lwqA2>o!(C+tju~_ zXno6jNzl{mXYoRl#UBU0VydWu*Y`?8kmr-UPc=4=eh)SeVh3x**kvnq(Ja(Pxkl?= z5o5H}Q%UPDIb?pAsjy7%C&Xt-Fh{iF2^v800m?ZI1e=HvEOl>VB@3^Xq&@Lb&z*)ndh^ z)oQso9x0x5ptpPGsRe7T4OCk^3+nBPyfEOBh~aI%Jm1XUCM$^tClMH?0DFOW48P@3 zh+n#tQ>yH6|DD~w|MFZ;f&vc$Ee4SKdtQr5*fq(&ayK@{=BoVkrjs)^qrz16DGsSw z<6nyWm)iXTe=W6@Z@B`aV2#)(z!`@F0nA@+#yC|J+wQ@mg*_p7#gn;qgX{c`?x*!t zXs3F$D&K5steVBNg}a8Jx1}R03P$#%yt_6o+t@3(r2Gv;;N>r?RR5M;~XS`&Y>)lMH zb|X%7;#QS{%5$Si&sW_INQzb4IL*y0R6MOhA(o{%Zyj4uzP@$Vv)*3_@C-rhO=j$gaL*aH-T{=i1Qs>hbsLakHyRce#)2v1Z{J6hCWdd0xN{z{~ zpKM!_?0WkXGz>#r&pX$j=U_Ukk10HA>!P72?^#V^;m_FU%|#pr<2yIa!cP*-e8h+-e?TX*;r^0!ht)Jeu=R{Mq2Oema6rOZ*xsLO1$5&@ln>Z^fzC@U^OgtEa#SMvX`4udVvHjc!9MR@~ zA6jX2;$+rKeSOhyNvFNkd2_esu)id0t@}ASNQCv zGI)x-yIX8uiah8zBx;%jH(%}ijE%VCuicWz$78EdZoor_M^Kf(GQSBME%v*E^Vh2k zwy0PU<1tzeSmG&H`1zufRU^8M5!yl(0IjFmcm?WuNM^G|QSd!fsU>jBFwXik3Wa<+ zArFttsb7@98xiV={b^a%%&3TMTsDNimtNnVAIw!Ufm?s0EY!h6E6?Ofky#IH?Ly;7 zbX14HhZGTDjVrtNQSq|-|HJsJ%w+>ei6rrxQ>A2yf-#yxJB>x9+lPr~#*~qNn$Nwn z{1}CnXV;yH+F@xmY$aSp?v43vVPNq?h>lSA5+#@dxjf?6`;fOLbQ*q19f3{tdHmir zYV#LTSZD4KEWEEX^s_4tGg`MGDWjot8Kh&(`P)y}o$tGf!d)>q17?hA#er8-Vmi?w z6Ehey8!M#x8_)uR0G#T7q4%)m zYlM*2nRkHwMTmd`U?{a6Js--RcmRWka#(;>{qjgB+5+*nhK0i8QNrpYx2eNYd?18F zm2iwZ#b|3`;r*Y)DBr)II$lM=qR3okj|aofA4T?*hsOiEUP{Y2!#eK{(>Oq^{iC+b zS6JBskVLDm3h`iaqAd`(y0X0SdNO26RkXthfRk7Av59^_+i)nLA?p9l17ZrH7sYB% zQ=4)Y?XbiG>Lh3V2!_GUW*7vuFf%hly1-0o&=Z(7_NZ4I0(1@NR0>%4#-XIGyv1y* zQN}v+fc3)VRo{9+!j%!$nIEi}4f^u3A%}(l@|OZs4LxyYyAtz$JLSedVC25M5Xt~Y zL_5S`1!QdoO~AspP=MZuoKn2C&VtD~WT1cvV(Nu;YekJMAC-o9Pc_*F|9{Y?J@D-+++3#M-GMgA{sHWrf9{|&n* ze4txQc)-dBAS%)SpQv2sjDH41C9tt$f}=sU2-YtA|B6cZ999K9$P+1WqHqS>l&@$< z2JC)zCllMyzA`h+_G8I3zDe9n2nqm zE0e5K9{;8h;Qi2n|EDVFdm6nJ8>zzX4s@8KHs51%Jx) zc7Y4!tEg;NEZLloc@sXR!PnQIMS@yZGH9jo8z_<>N{nBB-CKkC$u&Gr z4U|fZ8Xt5MfBGQ&5;HC8YJf{XJzaE}NT@7W_2hM(U~(`T!hy>m__NRpu@?67FR=rMRZbHYvu~CtzcYMt7hsAWTzS5nK%VUTeg1|TCF{id4H3yzL zc6Yi;1WR%(kb`XOU1rxfbsGdD4av15!q}Rll2dzn5){On2=c=6SRSQ>lj92mh*IDp zj|2Fg?n%Rg7cyP2(Eo6E9?b^SDeC_+nU%fv^}+`nrxxrpZ!jr8YjT&4-r=G^P;nee zF7EF8eI#1EP+Dp${j+6j;Z5F~K~Xt?42@SJhQ6=uD;Q25>O{4&gI@}AHjq%KetjKb z#z871oaVrVyX!UgL`gZ)YPV(cm7>Zk()e#;sm@nls1N#9@Zvj|t2FjzV;*941#Gn@ z8=)pF9vN1$pi#+FwR?8i0B6JF=w2?3Se%h^2ijvBhtuC2*CK1&3+=dMW(j)w^1i_` zq1LiDBw5ZxnMlB_H1ousdlqA0VOS>q} z1I4mR5O3Crni9$3&-jsdBI+Hegq1?|5ts4_*gq)texdi4+16v?$A*fD6tfF2YbXs4 z+VnjYZq~iP8=oK~lRMIlhvD7FnAa-nYo%q@%s97E?2C#9vDwlX^C@uWYxEDK#_&Q> z@Rvl#6D}!(PE$XI{p5U&41pP*(h)X`0+eZtgkU_6zF*2d?6R>NclY-UHj$Q10PAn{ zk5DRQ(hzLei#88fA6ImqK^O!01_uBEF}Bbt1lXz|Ixy+YJN?uL=0jyG`AiV+1 ze*OPH1@Py2{K+)m5c2E?0FR~t^xtGGjQX00Xg|1I4jVQFpCWJY1PgT1fnXM<7G_~? zVHW0}DK#@}r4REBU>dG+F(+^tOG3`#O<4W$3ti-@rRCh{P_Fj1h_xoQB9%7uy&l7x%d2qOi;uoX+dQs0he z=fGbIMo z`adnqET&4fUvlXj4?lf&IOQi0|G871c}w2JHScmZ@xLZ&Abfsx>jbg=dewEQ=Csge zr{*@}&-x12(_VQq$*Gx_N6R_>%b6GDzq`J-HUBo8zubnj?=A9st2Im3?rmbyO%;7c z0q6sAYMvjL@0(G*>PR8KCyZjfvg}dL^ahlvi zMmy&Me}C@ygY>CFin)h9AxA^1lIx<-xsGv?lt(L{Vtuk9(Uekb__ZXcogF8$kzq|1 zy5nwGcG!S6$a&?zu6p@lb}tRdu~BzcR*)OZ=^I?uKS99%t4}kAyGtCxe*nDcibVhPZp2biqO98ldVId(Zx0;bwdy(_1 zu~eYA^jH}q1tXC|ce3n1;nwPczh6Z*w9-jvuqZLrA8%WtX?$sEkMW81^W9}%`u#$v z@Lk@1j`>0MkzP}s>QeX|-29OMkPhK4ntX5hTe5#kLUZnRkc!>`+TrtlS7OM4tf@_7*>@8bRYrqJ<*#=j0%rhZ^rp&iqaMB_d(8@*I4 z)~?INm-~m9e=l58Pk&tNQ?%u(R1q~(CINr#Nm6gWwLZMZ#u|)+Em4GfyDNHPBq9RE zpC(!6$@!~y>->Ca({ge;oqVp4#nYDBxgAsd5cnKP&YtwF+r}WJXG|QK(Wo6s*H_}! zt;^|gt;wC|piDwRu=%?EMNZ0O%!Lm$(BLYSfOFsQ=J>KGw=crvfqh)G+02ip{nOMtq2x{VV4x$q{dlMAk6a4c-yyR5pwPFf2*-n3p=kezIgNH-Wz<@M#cJcM?K!|YRZoR>L@K}0#M_bjZO}2pld}QCf z$nH;7tAXbA!Y_|*Hll|f6xprvq?E}y+t%^nS&w7=Nf$oT(LJd*AytZ`c6x@jCI)JnUJE^09@qSe{DY-l+pdS`=~7)#S3ox?0Q6Et}f0@%-8sjM_ga(aP8>9xh-PZUv}so zJK;k+N?gZ3{|0}a4_^-6WeFIxS5aID(Sf6Ij1vnxxdW*HzUSIcVrq@d^qM&dj^f4a z_fp43VhG?6r*c=PqMl^LY)}%9nicFS0Fac^?$51yzGuTlbblYsnWV5$qZsNBI27Vc zI%-2s8W2f_l;N5uAjwM~YVeg#byWs(NMSDm*9Uv6Wq+{iMLO3P2ZPxagc z-Iu^_ql$lz${wSOZcm@t)Mg_e7DKX6lKa1tjVuZ@{!aFpWwPy@YoRAR7H#&N*SOAX zZSdQgW;l2NV4BK&VfQ;Fznh#d!F6Jazk~|d#L0*$)&yp%BO*qQ_}57j1<(Gn&eZnd z5sIs-POIzOwmn8R34MMJXxfRCG1!i-VlMq&vMZlGx0{ncqInBt?!$Ily*Ws-s{z@Y zjT+3Fj#4_>Q90eMBpeNr7*#&|dx%!p{ag3+AM70DzPyyo?c03H^Xg1>yP4-8D6aXU z|EyQPnv%$j5bw9UiMyDzp5*^!l@eRe{ve%8oW*gamu`m<+_DOhtZ{muT95V7Kl(Q@ zI!Bf0wd_@=Y2aQY%Jia{pzO90;g@d=NVxWpMIZg6U3gD%;J%o1b z`QK=-FZH6Qm@6Vw4g@)snH!Kkv+$rh^$lR#QR%w8GDS!7?HIG1f%702l3A~|wvlV| zI`_+q-M3`psSKpb4ub|HXkOb+k=)*D5mUkP z9o!Yn=&N?cMge6In7id%hpXfM&|~6`C_FA9bT@uDKED9zI`?6=!VnAP`k{&U5I#r` z!GTs=F6J0Xsc`;34k$QcYs!YnLK7kQF63vy_II8~(o1ZXAJO^G29=^%j&vOW9nbaA zKO>4`{`6hbq)L>wTIPv_6=UvZCcA$tBpRciUzUJLHZrHUa_AXfgV`vhPl)H^Ul79y zKY2G=Wx{(B=J4walSlVC9F4V*=v7g-VohbQ&|zv?){p6K-hN*$RsMdSLi@mq>-jD< zg?9(M)$~|aQ5IxP-2q8wV_Q6J%YsiWO8hlkm`cOOW;sJ5WyzMcVHs3`U~#9G@$yj; z+yj9y#4})vet+^~Q<97!7#NoR;Dk2@aK(95O2(!|p>e>{pEHJc@J43}SR5m%Xk23fT6Xn+B!aLKm<1>+k0+fRn3*rVEY zlS{0o!hd{Eka@+SAFy-;f0w%OWSWthrVK8avecAn{X}fLKoIoMay*!7X)7jdTiNY@ zE=I=U`Hw^T{reP<3ZK0ygJ2Ezu0;%$2<;91Y{OfTZ;omU@6UGLnH4SZ{j(<}3cLk{HGTk9TkMj zO*4DQx?%_+su}s4!{H>|UB6guuXa;brX@-OEZBwywsj|ZUdWRox#||e0oimypP!qI z(K{XC*U5YW0IOK|IV$VO7C~r_HLB9ilo<|0O_tPDs$sOI{_9Ogn7J$?#oIn|H@I+h za#pKG%8og78y7sU0Ms@C=fmrv3Y7jYZ`Y0_g zDHb0!+;*+#?HnHk7>rT2pqa7`09>Y z(926Ebxa6VQC^E$kp}YNW=IS2N<%OGuwv$H#UD#L(4}9Q=4DU`da*M2%s)-8Lt$5g_NEIUAW; z6|*p2OiRyc1W^?6#Ja*J0ddL;GzS~tvN|^+M=W%y*Y{e1ZM!~t?bL~+{;GH2KQ>8( zBT&Sue~o=*d9s&BHEDrMNGud3sj;br-H$Dz3{lNd|J0QpeYXa;B*Q<>-q>wo(#=)6rO-+{jmHWHQZiKN#4;}6Kr+MU(m#HL*SSwON=iMyVU${?y z68#I`ryg|QSt-ccH0i1@Ty6BhEn0Wp8E-pVymB@4x+VoDHH$uNqLO~AqFLZ&cZ?v2 zEOYJiPT#`K;6=8Fh^_GlLu28{hBpO^oPL>b`5#Tvvu&TpGGf2{Px|H6zlPhUfuVO@ zbbH~ycda5Wti`I!^q5r}`F*M=rYvp&*0x7ZnuiBCs%N4AfAw{m$Q^{ajpQ&G8<-OZ z;|oHefM17+kpjfiV?kDcWG|WCPI0QROeRP$Pq9<Pm751?Kf~UF`E*Wyn1`cIIb91vCTJLJD za%PP(Y8-(qgMF5;<_bKXhX?ve=c>%a1_b9~oamu0wGx8-xU_n*a%$?4vGTZ+{=^qt-9@I1H-P&4I68YvX6GewszZ2PJ+KL7AWlG2kx)P7~?i1kVs= zt{I0xsW$eI=|LYJkc)hQf-x~TA3L)TPJx8OUK?8(aufu`$xMUJSm1#qI_|NQ!LDuW zYT>|zIuwzUB%vvgs%d0vj{iAP7Md?=`x2ZXfSH>_esbfet)~vr#{*3xv(eMj_l%B? zo>VS*Q`Nk*hSc2tk&un22K`mcm^!)flMnn?z>-rK@o9Z$*7|X>n$u=e(ng~UqQU$t z@R`Sh?0(%}y4}6h_7Z2A{g1*lIs?Rw}54` zAy2Q+>#xaFxhRym7%!(W_2#=muZvk`-BDdvTP5n*NjDv*!yv&2_wx_EXQ8wo*H5NZ z9qA3lLHU-mNi!TQ#~<9&xB8<*x#a$Q`sISm&2s{oxHH$=ADNwh;nE4l`@TQ?1%Hr3 zam3>W9^FpJGmOAd_+vdhxr$KV%3EDL@LYGBm58&6WWkx8@6{Dw)3qLFl_lDN;HNjMUT4~&LvMA}Ka5k)dOwN1$z*)m z$Y}6U8!OYQgPUbigCdUWON5LWX8qd#p@te&RkrLQ=9Dp4z;%C@j{CbS%Fg-+Hu+c> z!f%xdXS5)n;@6`Rl$`n`xjG+|EOZ;Lp;$zrb#NsUg7Vpvns(g?YhUg-BMn=Ubv2n4 zXT$!~G;~zfTHRd9Q)=x!=M-GYROyTTn1h5KdXSwLkXC5CufQ6qduv(fIreI%%;B5z zZMZ0O0p-V7$_Juj0e3~|MvrNmI380*2V3s@Rd34NyR*U1OFnye8HsU-HRbnXeo(0Y zuR47viS}{*>l~)%+n(Ta!4!6(lg*`v{%i%vvTgj3R8@}m02%^BaHk|c>miFItmBb# z<2MBP_a57f9$rt(_#w(YG)U;B^i}+5>NkthWeI6&*9s#QWLo;W_`=SQ=O$|RPdY_| z9pB^F9NrPHwlZuAw}Obscl?1H{NYJ9Lrm_3MLJY^?QOLmCH_mBUUYGq_O%%3jfL#K zgm7({#H!S2)?sOB-$mfj;IU!5Z${G#`)wM8x6pujD5)!)T*yn(-anPa#@;7-CkxMb zBRr84DuaYtFOx@QqC`RavfJYC@Pc9Yvi@QlEee%9!iJ#zCV%f8nJ0{Sr>nxNIg}lr zUfFcq^(XAo^4j)x%umEw+{=G969<1VAu51q{zd>p*_~3PaQMuww+fdO(_TNTGD2=e zdy?U9mT5F_Don4~{a(B4jW7zFw0lv5YZwu-azU z;2Sz=&+npZqQ1DmY{zYdL!(3(9qeXJ?OoP{dX)B7 zwxh&hh*5sm7URWzl>A`N6h^d~cH%rz{uXzsS>L#4lx>veOaiNxRG?QZX%2!64jf*~ z)E9k-Ffbmjy$?y%+bgXXg(~}1BJ{_8CGSvk*?2GRVy7>YCihSp}Q5CyuzGrNJSbv3DPtjui`@Q-8zb8vc@{omfz7=B=R+vP5P_BmyYF zv%C752?Gs|pV~=ayD#_C7u zZ(=uF-4kO_>SB4JXy`x0-`VZ`s&$1{57E=On8$rYUh+K#XKYdr&<=mJGW&WeabV$Q!&-PBohvL&Ut}xEFYw65 zEDD_p9;2&Nle3^9h1YVZn5@QPoc#&!M@!$iEIluM2QUh5SnDf2xn7rJ@Pm@uy#b{s zLFuCmhNXmf>1DgT&R6`~LGtXV`Wq~@!{HYRWDi-$K5$?b87Kub`d3({|GP28V7J%K zSc9Ttg%pBGk&_yw7b2{;gk4N?I%JJ9;G^s}@H6GQio<aXEH)|)+kV(iEYV0?PbJnx7k?M{k1_2K!u?KexN9j7kD7J(Xi zFt&sU3S0Jobu024II-hS#${zE$+wa>s|$0E5*ryJA}D7WB03e=sGx>HDZcKgkBB(R z$)3c~v7xAL*$(tz+P9eytM@>DBC1SeUKX${G>V_wCK)IsMF1LW5YF}zCdL|IV(et0 z&>W_z-UGF0;Y&xEz+upBs!YgUgK16z15g6WftH9$Z=zsDNBN|RKnKMv{DwznL zv)ed?f`LmJruw3Q9<9EC$wr9|9V|dY%_6ub=!qNyg6=hlMr5AM`?!&6;{w(TVtChk zZ#j@Mgp?dO5<)@sUkf8*fZBX#R%-y$uAUHiAWKXD@6$rb*D&ZXFb;bc^-ypoasvzS zP8%yLD~G10rmn_v4I4L;*oXxxr6UYw@6&RYDKLUrzC(3qomh`rwy7MXf*| z9>+grFyYY!4jW>PeYUrm)HIa3_5VDt+DvTj>3p+tby%wL$AbqN>}GE_{ihe00GnF- z3mq?&=q0uw+~bpJVbGGd#>Aix!<j?R;2Z3PyVV12V36dh+ zN&Om|c@@SaE@t2P>|li6KuebC2rePl%|81uvhKj4zvGh3B?*}Wv2Q1bGmVL>J>MSl zd&Q;;`HL2{;3(IBiKn;!{jp~H_8rAC_3rj}8k(${-S?krtPVlp;FZr?;7Hxd^d%qFFkq^*QGqU`*E+mj#!Hsn z8ImRwW}>_KrUCV!5J-5C8aK)zB%dslzPY;cDs$n+KV2;GyFc5-(tz_=+{Q9ke7*#QBFabN2Yj`n9eF5~{S=@7fYP6VJ*lV5py(hV zBdbK-=O<(T(Z_5FXVZWYg??7U#Lpxe^i-HT(Q1iPU#Ao4J%Z!newf;ocs!y$S0ni- zE@Ncm3lliR9Fy+<;NYXpW&HM8`8Kxtn~zPxfE*=f43c!U{&Oj(b*ZMzfJnLA&mo`{#G~{}dA6v6roQeH0}W{bv`&x9bJH72s@ z{r7AiVQcnwtnwI-_M59M^O(F*yzg6R*5K|9t%|*Q#cKw+;@laR3F-j*W7~u*re}}5 ze_;sK)34mP(29L+xSd_0aER)=jB_0)>5nYj_E=V_kNZu3P^1 zL84B{pp5}|wi!e2;Tg0;H+vE!=8q%ssc)pl4dT~)p69nmwUQWFci)3= zzXZtLxE6dJYLaFbOXly}bLLdA_>W)pSSY7w^;?M@-cevPaXMK4eFKR^*j1CHt){~s zJkHxWmb342JXS+P$CA}qZFD}&DchOoB!9gj{RrdBp{y#ZZ$U@{3t3(NWx}Uc> z{RS;m@_FA7HLn=WReVfVvks7gn~p|)W1IkX^#u2He+zl1(z5V}h%N!@aWJHCe`As8 zNiKX~lul8;PIxyFfuvTDil3WR!&*Rr>shOE^j)@2zH_Kla8t z^?T=gP3zNoMRa=cupZTr1_hG~m+iZ>PvfN&A7u3pPrCbO9(D&$UB62C&&uaF3Rv<~ zJHI#+bk)#ygpdMzZ`K-2REqWLI@afRj2s+djT~RDQR?yjU~1hKxVvc&hB(n1*Y&`c z85rCC?ymicByDXMJ?}}#;yo=ZQH0e_-{i6~k+Oj$6~ttF4DOF6`2j95I?7oh?onPe zI9w=HBCjSwD3p8P$~0zBqTbw)w~NeZPRsTN`Ml`2>kZ&j^LzDjo7`$j=i0TsdmnHJs{dvkRd|ah)L810YZ%5wBojxSY z;sR|!V$2d|2CW!yNe|#tBN$q!5eexmT%+#e6LY7|ybkF}+CvdN3Ym@%0R4&$IqIaV zD?gmT&1%(poaichEJCn!Jr^NH2!jk!$0yQ79;~Ualn*l1eb(eqR{Xjgk_*DYyeoM% zGR*IFA57ZamL6Fm>yC4>REUrT$XHQ)1)W9(a$~z~&`CE-4VJ-y+7-3{F~{#VMb#9GJ>ZX6^$!8@Jr7 zSsY3UXTDdDAme6=R4M!$M(?lPW^3%qC;A0Jd168dFzes89RKDM>m$~cFM8jlDqM>8 z>N?U|j#7&`Oa#cqB?Ep^t|S-m8*(V>Cpn>7LP5pIrxQS@Whway$l393LE=WK$O}n) zdbUDltb<1aEab4Vo36Uf@9nIE^wAziT*`*`=Moq1eUeRcH zq)b0UT|y)ZnCT`U^}f3z60OyJO>bb9fL>1wA^llUug#>k?PDC0*cGy2Iy37iLHQ2Q zo1d^J?KQ)g%w)s4@SLujXSghfWVFFGZRO9JkP#R|ly^;Qus3sN|3p&!{;iUqq;^MX z0AC0auX9jP9CPAI>7h+?7$6_l;9+w1Hy~%5jwWpT0VOGdqI?Sc#dgwx#K9T3@6~Pt zH8LTEx4>V(afP`z98VtFEc^#c&OkLRm}-=IR^uh}21?2hD6CPW|7nz$258mF8rEvZ z39_eG>;3H+g*Ud^3xBES`Ic{~udWer1|A3%8JUtsq!k-RFKJ*ba8y2^5bQeWtpQ-r z1u{UeHj5XdGXjdbni9~1DSVj9_?gu!hBgIM8w)Tcesfpo22%Dl#y6Np62uXCr z!h}1S0ch^!(+bJ<1_9rDbSs0O@6Q>nD0CfGP%>EoR%609HJy0P=x5~?BIrLp7~Z0I zrfZ{IPC2_N@#psZz@B67BwrFARb{fBK#*df=OyWN*h{UcLCA3kaXygP0>H?wt_W6G z8<@<(dAqCuR7ML~#H~jNDraHP!tn=T4ff(Hu1uNHC_ZG|Ua9qlVIeGE9VZkEV=nTZEy0-<%BjsvHeuTrj<3r_Z zG{gWE!-Byn>(#bx*Oy5(;t@=r2ea>m>wjp1db?p*WTwUHZp?HShQ821V`~kG1djaD z=cfIXGyUgMN*QReick3n_P~$*Nh9@W@#=lh9W_H%C0i;Yr%}Qap7CX~d;YT2d%c<6 z-P?BLuZ2vlmtr>4u7Q4!{sTTMF!K{X0oSR1NomjV($fcpa&(vRAB+sQ*AWY-7ty0; z3vNAj7tOa&KpTr=W(X9FhA67c&B)M@0@0LwQ#1u$sW&K!4creJWzvc^x67_?{_6Z& zYMmzNL356rE2XShYm>6QAY(l=l@&9wAUES;%pr&o+ zEhW#oXd@IF7K0i^r%P!$uKsKwnwdEd=drpNI-aTYd86`W&YcJnYOD3B9`|GTjpzVn znpf)Ww5n!_eQ_cd0?Ic;v5)UA3+ieIC`ACwPCdwBdd#BRb{YDOGRrB4t?{>29-Vxb zf#eedDyF?2E~N>yPT$xT{HxY)T+g0pA)kQj**So|T`?m*@0WZbr5jKE0Jfr#&US7) z{#Q(i4s(==B?P}~#vni~%E6XK3dW6)tp!al;LkhqYFI*j%}w2AJ|FooCebio+o|hd z7`1pwN%uPAF&gv2T+U7fW@|+Y>*&0+U{N3CfNp+r+Iu>x(}s z8JYBIXZ*xz-W#|t>Dy0mq!%-@5QS1obSI1=DNSmR9R;v4y&e*Ut+@PB@cv6GXa3CY zDAJEf+abEf)Ln}(pWgEk(_1-HwtXW}u@8?T-SY?Hl{oet@_*CzI9Lxi^Q+PN_wc== zTD`4@H$wHhJqR{0)(p z7)=o1%(DF_jd%lm>9OE%_~ale#CflUci(q?bt=F#QLjUm(34phIRp?EvSr!j1ZH$W zRE9+9%$4Y@ztDIb!}Ty}Y$9_O$|?TiC$JB&1EBjXHjr}xdPXcnY4f`$^!I!C6(NE$K|=C1^-1wsmive7W~3f zM!*8v8H|zDH|$~5Q)f_=8Z(F|q%1cFvV(DEU5Myj4-sVkXnY?W1`4)Bi!*$Dvqp+@ z7NdRmHmWtsuw@X(vF4;2Fx}565dCyG^cYbeCszKsccZx3xUxPc{no=Y@DZk7?{jnE zb65(bzuK7|b7|SAWK@mYFbUzsRea2NOEx(rFjSZqY@%3)JV?)L=zZfE`+24=} z=STLaajV_R2LBCe|37uTWmp^ww{DATaCZsr?(R{_R6(fl7WsKO(2^&rKDFDR$;z$Q_@(53| z5f{gVuHyPa?4%P!y#zaMbM%n2((v&d9{Tx{0gywXM>JZlBv5o%Z8Ig9*s*K19Mr4MnUg# zzsjv*vs-*@`(@^~(7I1LV*BYU=cG)}r;MOMRVp>8f(EU3P+@I3bjA)D+7?QIh`u72 zgrw62Uwmij%+SKy;%zyCSxxjy=E8hA$Y3xEx~&2Y5GQeoL*r|-Vkys^C;*0sc?pt( zE@A#zCTIwUCiwarM#Ds;NEeITP?Z@R707^ea}ruOuAN8v*`&4SqH8dP(#3Big%VNP z^Ub+GG<~BoNH!(%O#ybs6`+bSLH{DS)7%!e?Vw2RvAW2Lj5|W?3cp zSy*8H7ZzGV1CAj6|8DIsUA=W^e*gJ7PH?&?e523iM9W;R0*K(PIFQvu`0Nb}av-2gbSv7*kY%Sxq`xE5qx|=~V(iY`Nbs@{s$n^sBso(5swuz0cUwiW z;LU!a(&eiWZJ1GJz0i?Nj&2 z`loJT3E6ED-kc>dQ$)syY^zVlqAnoBb5ZuVe1WYx7~Qr>x|l7D@k^eryK}^bM{i7O zMf}`>TN@P$3Mu5K<3cNu$iF>1rP#dM?|vARK+Mr4=|K36*}tM@H6sm2A<_NZ&a426=eU_ z2qPqSP%`XHZ6p+R`!eF^=(+sY_v--Dy42pKb@GPpXD=`{ z1d3}eyH_89fC~ZX5ALyzZS$3KKw~z|-eEB?8`oi7wdqu}C`51OGP76h@8(}cuE(SO zKBRB0@3Q0{_@p)i?;vwJ_EmdZxl43OPr2-Rd<1-6GdFdpe0?6*_yg;W+ zph1)5=4e#yGrh`X+i$;W0tc&c^83MddL9}V7HGC|680|$`t5VTx^>N*o8L7XGq9@K zYKUe-L#9!S^}@bZNu&5YAM-l`pU#Z4sr6W(;{8LH4gQ4RB{<;Ln59pX$`?+*T zPTrhO^+zU)qD3b4n+zs$CSHVHZ;?7qbcF``TDe|a+D&mnhjIJfJ4|xz?s8DkprL7|$RV2ABw!5V3s!EmjJBn=i06oi z7KyettaI=9sq?b-)Fw+7GWxVgPH7R_jWh(J~!|D16zQ)rYoC%v9 zV#6UW#MV*0q}E@SH4L>4LEa~US#}g+W#s_s{2ORQs8(O5Hk5`l=cP@r%!pI$qr^4e zPcCNI=2N>Wq2dUqis72^HiIW2MBeTC@KYVY??nvDPan4>7);2s%0!NzZ67(7JufNa z|ICMJp9o0UXM_P+UZ&sm19s{xuy>FG185)8B>OacfF+Q3kjf%2#??|Ba`$;=mqoB1 z-mHq74$uw~L<~a>QTj&LN!Nm3;e+Ss|HNMJX!K4ZbH0hhf;e;qp+vy{EwPqu_U9cT z+43ms_k1O1RqyQ1-1>AA!=(pUZSl;I)(8d%<6``|mycZeWaOiANtB3?Dx0--S{+pW z+8nvz5b;O(!4t%j9Rn_F!$O^iI|C*5O{Z!HZ{s!SKElWjCs4iap#_JWW)y95!4mqD>DK`kd+x7~m7v0<1bI5&<=yMOC_R|FYJh6) z-iH%4Ay%d2LrjZ6?K?}yhxpg(GK)bHBF*xB@H1$#J?2Dk=EKs__hN2zy9BS7wYErU(z7`C6OVPA|KKtHY8Vy6mqnzef>T zVGxzok;&^k0Wym)cd(Dp)ex|D4LIc==|JGOq#n!=JC|EbZf>p-Vbz?krCc)PjzmMh z9nC*V4*X7$AFKwD9y&gJc9QGf0X}Ge&XQC0tXuhR_E4ezNa#Zy35gTig?uVhD$ zV#}xVrO~=IhfSEJQ?5@w2o7Es9CTqg6GwsKJros`Opb)2z_Zm4KMFYiTEzK%x3_-Ao<943Db_=sf&}8$4l(>=pcw9p+*d?&uJa_ZdIU zNoLZ2r}g;~iT&7I%lf<9<~4Os_*~oU37=)_UOKz>70+pszgcx;4!(h5@|qogWGVl! z$D;54?RIjFu*ZED3_G^&imD>k`fJpIxSDvwnAzOz)A1Z8 z?+-18+`iews33tbsOPXXP;Yp+ghCb<2J@1K*tSCilvMXiS_b2uR#fv!PSD_XDDIr!I<(Kl>uM62QLuZahq35&O#*&7PIY zWT<&f7M=L@xbyu4Vj4CJXN|N3)L?uo0z5e!U+9{3A0h^l*yXSJ8=C4xnNbhoFGadb zetJ|NkjLWi$qje2vWX?2=qPpuSw-YM#>o~lR#z#BjHaF7WxJVR|8T+B#Gyr@p-JK; zP!#VWPDf4p56VMX2Dvbq?9XC~aw3eR-}~)M_}fAiMZvFB`B^KTUtZdy%U{B*_K z>Ekg*lG6_^0wp&8-FW2u%Xo;oeNSudLFa|oV+1E(xY$a%?Hy`emB>EG@0{j&rHGQ@ zN+q61MKH$7r#;HY#QL?GP;>jfRu!6>-~5R0Sfb}sVGZo9d3)aWdQ-P?nYsOO#ZdvUU6I03e_>(c4Qvk3 zY@sbwlhJBzekFiKo1P>&#N5yKm#d`_qa*T7p`C>KK6;*k3u{py?H%Hb(*T5dFguMd zj2o`Y2IUJL(-iM|X##oIfg#y51LAJtZ5?_fi~hzSb*OE*#+`U%k4<&AvxlXIw!C3X zXkjv4*Wt)-trX#T0Z94J)$wJwvOpGJCxWEzzKc*$)r7$gej^0V>a77|?iDB}x_$q3 zwjTo{Z`Kk1Mgt|sd9E}-3j4-vI6<7FrkoCQJm5N^798}611Re)&|>vVfu#Qi1AY~l z5g!yVC6)t&gm_4SU9WOAaM=)$7U?_^vs{m z-0PkT)F{oUP>_(2MKFH^b}EInfI@>2{7OK<^8=z%1{4U;Ua>F?5L6u7Cw(>GwX(q& z*qThd0gQ|(F44HWAVm{_S2gc09!T)z$L*)Niwb+<%7chvm^@0g9;3@no zh!odVmu;oHzk~0Q?u2m~Yw&gzl$&3`{h%KZId1{Kkn9_^b=+RR*`i?wFMz+CPzB-d zH#t3hwcwSXuNfjGWX#B;j5&$GDiC&K7MR_c9dj@ycH>R2WX)QL=TuM`IXN|@a^oF* z0W+~q0-SVBG?=5lkPUP|BH&(+-j>#ZV1c2<5+86TDqI^NsHreT5)GNf%=m zDwy6iX11yU+7l8a5fgbu-&|~^7G%QSrUHi(B*CVGPxsN&Ks-T?2xCSX;9622i0+5? zzvWJP~GU28&F^S=)pU|y0KWHH8LLjE8xc_P9r4f@@t zYM3a1=!P)%l zVN5kqn%Ehg=Uobw@z`%?LLT4FAqZjke0PjPhzLYI-bwfq2VP&dp#SZ2(w`cDrnP;p ztNa}Rcn&t)$rMpmHl;o(LTb;Trrnx{BU`)$_}bmcY<)QnUw|6huR>9fCUP7L0}_gR zmDbm22F@2YEBc&vzblj{Q^n5_skY>UjN*A-kU_*O|M4yrjq2H5w`3^R-u$P7CJb*% zfsRL%^3r`PJr-?VNoove0V5EJrs2LHf@9TVH?B{tZLU%*3-#LSEf&Y#&9So zxu7UJyzheR4N@fG*7z;aNr5*`fqLoNc*;?zRAIAp3AEC>v-_amoaXVfTQ8|CnMK-X zyu`^wA@;7R_PuPlJ*40JlBIw9iiv>Rm^4GCa7TSHSqxaU`lDwW3Q_3eDAL(rH{jB&zCK*Joo%nvlMcWL(RHe^KJj&_s z)E<>|sq8!fxmJRYd_0r-GNwSNpB0&IOo%{TJ@>;LtcfXtC(cKEFRzr59C?H(&_OdU z_7>2X;Odm+JhfIrI)ciz)&gon3AJlSQF`jIp=kaXT<)07cpd;^u_y)s=0Uj*#izY_ zqeD@50>Dj|kUJtsCX0eUEp`unN@sRgKjili!5RDV)raQ?QzYwp`+FEmIk|FUUf57Y`U2<)yTTioZQz)r-%Wqem8lGLgux@p!Sb&JX^FE)(|92^{EM5OHKkN$9o z$|o$`u*pTFTF!ws|&`qy%nxiI++o&^4`wDNJ ziOYot>%|B~jzc82f+0q0Fzqg`EET?xv&0|IBWQV#4B1AP6TsNeVfR|egjj7}s)Q%OpJOD8-QJ_mwiO{Jz`(S_)g4bWzB^97$)ZaEmR{43QRSKO))HJmd{y z;=vH)lfNP~&6A6Tisg%81j1yP=jLBJv~nv{D0>`G>>=;o5M02+Gg8?`>ob`&zACj6OpqfJ z-z0Zsj)6c2|8>BIpM^z$zG#0bWsMd@p5yU*g-a+mDgqp(5>4VOs4X!PV56lCn;}mb zCd_WyMG8i}1^OoGgxu>yhCDVE-KmHdCA&l!8eKQ60qRuy_!E_}7L5~Nbv?KDJ;dD> zZ<~-sECZ>e?+*Pyas_1+2a`kE7eHhM>&oSN$GtoVziTGRy9tgwrd@O2r(_<8e4WV2 z_iQDNE-sWeAb@eXSp}= zp{P>Ih}a_awcig^l5uR|mFS_|^N%YH=+53yToFWQEJJw~sAKPJ+e_pU`l&zRnhh_pLl*gFF;EUa~(8&r?pnt=Bi ztj#T(`QcEI?I_bB>H@U<7OOJ4+fykr_7`TT=hBm@BYLO=@R(6_A>@r$_QAIv66GX5 z5i5nHT@$x1w#oxw6efkw_&6{;NI6U|OBT z&T1&*(zXBP(s%!b#a9DAz%;!7&vQ~B-oMKMe;d+T7GUH{vY-3y*W*gIGQTM687Hg~nZ|Jk+^V0cad za#R5)Q~3XxHs#X)HzOyE`~PF)0C7(cxwZqR;eWyNW?vn+Tv=H_g+y0mGj8?HLcR3q z>Kmmqe;8qEZ>$m?&4K@1w$azG$>B+3XIP5>m~V;mC&DuRS%JThsj0or6iK?ga$YwZ ze2!9?xv8K=M)2uiyJzzD1dNGA2wk`=yDDg@CD znXC{_%>LVTxRLYol#B?l;_Or;4^^^6EttvnyU8danGe12Ml@L32|F?fn@uEkqEKzrNFoc;!o^7 zrCf<+uQ3<_hjjq~pHrm%xKnXJ&81GPWQJ`{)>;D$!0(D{F`DUf@FS`-Y17|Fd2KcC zO0Y#el$IjVBq6l{z`J%U2$q8ta{7{&1N1Xb6j%;O`23@3SXLBx&)|kAj{(@2r_wMI zJ0h7&Tj{lynG8&a3C8|CTqOvw1t-}#qFO*VUd*Msm?G}o+dO2D$H>%1s~ zJ^K6S!5+K!Jt5BUw{IfVS_!L^vW<(;WR>u$U)?SQJ>H=m8ny`m#6CFTytS`;8yLg_ z=4MbWl0S>kev+ld#7PH$TW2wV z+kR)12h7&HvPTn5tkkD{s9d2QM7CCBb-$R}364beyMETHg;i(tApEBj|S$-@pPFToq+=rH zv&U&N`l@a%?g{w`$PO+c&DT5*4A?_7ja6GUFzvyYN(Em04hJs2D}2zgUqflsD2**U zUHS{^FS=a>JhlY0ho&tDc#KkMTP#)1U@Uwvf@DeK5g$cH1u%P>v+_p z$GF!H^!4>7p0)!yEjL>1Unz8+&mt-SC%N&!aTV+GxnJ>NZM!s@LcFI(J#wz#_{nje zVQD{7p>fi%h2Zi~OHQtrY#?IxM38}s?_O(YKa_TFaoZ7|X@N7~_*$58u#-S|VG)Pp z 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/admin/badges/credly_organization to add Credly Organization. a. Add UUID (unique identifier) for the Credly organization @@ -45,6 +57,14 @@ Please note that UUID and authorization token will be given to you during the cr Check: the system pulls the Organization's data and updates its name. +Accredible +----------- + +1. Retrieve API Key from Accredible account settings. Go to the Accredible account settings -> Manage API Keys and create a new API Key. +2. In the admin panel go to ``/admin/badges/accredibleapiconfig`` to add Accredible Group. + a. Add API Key + b. Add name for configuration + .. _Configuration: configuration.html @@ -52,10 +72,19 @@ Check: the system pulls the Organization's data and updates its name. ------------------------------ Note: For detailed information, go to the `Configuration`_ section. +Credly +------ + From the “Credly Organizations” list, select the Organization(s) you want to use and select ``Sync organization badge templates`` action. The system pulls the list of badge templates from the Credly Organization. Navigate to the “Credly badge templates” list and check newly created templates. +Accredible +---------- +From the Accredible API Configurations list, select the Configuration(s) you want to use and select ``Sync groups`` action. + +The system pulls the list of groups from the Accredible account. Navigate to the “Accredible groups” list and check newly created groups. + .. _Configuration: configuration.html 4. Setup badge requirements @@ -67,7 +96,7 @@ The system pulls the list of badge templates from the Credly Organization. Navig The crucial part of the badge template configuration is the requirements specification. At least one requirement must be associated with a badge template. -Go to the first badge template details page (admin/badges/credly_badge_templates) and add requirements for it: +Go to the first badge template details page (admin/badges/credly_badge_templates or admin/badges/accrediblegroup) and add requirements for it: 1. find the “Badge Requirements” section; 2. add a new item and select an event type (what is expected to happen); @@ -120,29 +149,30 @@ Since badge templates can have more than one requirement, there can be partially 7. See awarded user credentials ------------------------------- -Already earned badges are listed in the "Credly badges" section of the admin panel. +Already earned badges are listed in the "Credly badges" or "Accredible badges" section of the admin panel. .. note:: - The Credly Badge is an extended version of a user credential record. + This badge is an extended version of a user credential record. Once badge progress is complete (all requirements were *fulfilled*), the system: -1. creates internal user credentials (CredlyBadge); +1. creates internal user credentials (CredlyBadge or AccredibleBadge); 2. notifies about the badge awarding (public signal); -3. requests Credly service to issue the badge (API request). +3. requests Credly or Accredible service to issue the badge (API request). -8. See issued Credly badges +8. See issued badges --------------------------- -Earned internal badges (user credentials) spread to the Credly service. +Earned internal badges (user credentials) spread to the badge service. -On a successful Credly badge issuing, the CredlyBadge user credential is updated with its requisites: +On a successful badge issuing, the CredlyBadge or AccredibleBadge user credential is updated with its requisites: 1. external UUID; 2. external state; The Credly badge is visible in the Credly service. +The Accredible badge is visible in the Accredible service. 9. Badge template withdrawal diff --git a/docs/badges/settings.rst b/docs/badges/settings.rst index 093dd8ad4..c8a6d2d7f 100644 --- a/docs/badges/settings.rst +++ b/docs/badges/settings.rst @@ -11,6 +11,10 @@ Badges feature settings allow configuration: 2. event bus public signals subset for badges; 3. the Credly service integration details (URLs, sandbox usage, etc.); +You can use tutor plugin to setup all needed configurations: + +https://github.com/raccoongang/tutor-contrib-badges + Feature switch -------------- @@ -50,6 +54,15 @@ The feature has its configuration: "CREDLY_SANDBOX_API_BASE_URL": "https://sandbox-api.credly.com/v1/", "USE_SANDBOX": False, }, + # Accredible integration: + "accredible": { + "ACCREDIBLE_BASE_URL": "https://dashboard.accredible.com/", + "ACCREDIBLE_API_BASE_URL": "https://api.accredible.com/v1/", + "ACCREDIBLE_SANDBOX_BASE_URL": "https://sandbox.dashboard.accredible.com/", + "ACCREDIBLE_SANDBOX_API_BASE_URL": "https://sandbox.api.accredible.com/v1/", + "USE_SANDBOX": False, + }, + # requirements data rules: "rules": { "ignored_keypaths": [ @@ -75,6 +88,12 @@ Credly integration - CREDLY_SANDBOX_BASE_URL - Credly sandbox host URL; - CREDLY_SANDBOX_API_BASE_URL - Credly sandbox API host URL; +Accredible integration +~~~~~~~~~~~~~~~~~~~~~~ +- USE_SANDBOX - enables Accredible sandbox usage (development, testing); +- ACCREDIBLE_BASE_URL - Accredible service host URL; +- ACCREDIBLE_API_BASE_URL - Accredible API host URL; +- ACCREDIBLE_SANDBOX_BASE_URL - Accredible sandbox host URL; Event bus settings ------------------