Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions admin/base/settings/defaults.py
Original file line number Diff line number Diff line change
Expand Up @@ -394,3 +394,10 @@ def parent_dir(path):

# Project limit number value
PROJECT_LIMIT_NUMBER = 10

# Providers that does not support viewing setting information
UNSUPPORTED_VIEW_SETTING_INFO_PROVIDERS = [
'osfstorage',
'onedrivebusiness',
'swift'
]
108 changes: 108 additions & 0 deletions admin/rdm_custom_storage_location/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -1147,3 +1147,111 @@ def save_usermap_from_tmp(provider_name, institution):
rdm_addon_option.extended[KEYNAME_USERMAP] = new_usermap
del rdm_addon_option.extended[KEYNAME_USERMAP_TMP]
rdm_addon_option.save()


def create_storage_info_template(field_name, value):
"""Create a standard storage information template."""
return {'field_name': field_name, 'value': value}


def get_institution_addon_info(institution_id, provider_name):
"""Get institution addon option and external account."""
rdm_addon_option = get_rdm_addon_option(institution_id, provider_name, create=False)
external_account = rdm_addon_option.external_accounts.first()
return rdm_addon_option, external_account


def get_osfstorage_info(waterbutler_settings_storage):
"""Get storage information for OSF storage."""
return {
'folder': create_storage_info_template('Folder', waterbutler_settings_storage.get('folder'))
}


def get_s3_info(waterbutler_credentials_storage, waterbutler_settings_storage):
"""Get storage information for Amazon S3."""
return {
'access_key': create_storage_info_template('Access Key', waterbutler_credentials_storage.get('access_key')),
'bucket': create_storage_info_template('Bucket', waterbutler_settings_storage.get('bucket')),
'encrypt_uploads': create_storage_info_template(
'Enable Server Side Encryption',
waterbutler_settings_storage.get('encrypt_uploads', False)
)
}


def get_s3compat_info(waterbutler_credentials_storage, waterbutler_settings_storage):
"""Get storage information for S3 Compatible Storage."""
return {
'host': create_storage_info_template('Endpoint URL', waterbutler_credentials_storage.get('host')),
'access_key': create_storage_info_template('Access Key', waterbutler_credentials_storage.get('access_key')),
'bucket': create_storage_info_template('Bucket', waterbutler_settings_storage.get('bucket')),
'encrypt_uploads': create_storage_info_template(
'Enable Server Side Encryption',
waterbutler_settings_storage.get('encrypt_uploads', False)
)
}


def get_s3compatinstitutions_info(institution, provider_name, region):
"""Get storage information for S3 Compatible Storage for Institutions."""
rdm_addon_option, external_account = get_institution_addon_info(institution.id, provider_name)
return {
'host': create_storage_info_template('Endpoint URL', external_account.profile_url),
'access_key': create_storage_info_template('Access Key', external_account.display_name),
'bucket': create_storage_info_template('Bucket', rdm_addon_option.extended.get(KEYNAME_BASE_FOLDER)),
'encrypt_uploads': create_storage_info_template(
'Enable Server Side Encryption',
region.waterbutler_settings.get('encrypt_uploads', False)
)
}


def get_ociinstitutions_info(institution, provider_name):
"""Get storage information for Oracle Cloud Infrastructure for Institutions."""
rdm_addon_option, external_account = get_institution_addon_info(institution.id, provider_name)
return {
'host': create_storage_info_template('Endpoint URL', external_account.profile_url),
'access_key': create_storage_info_template('Access Key', external_account.display_name),
'bucket': create_storage_info_template('Bucket', rdm_addon_option.extended.get(KEYNAME_BASE_FOLDER))
}


def get_nextcloudinstitutions_info(institution, provider_name):
"""Get storage information for Nextcloud for Institutions."""
rdm_addon_option, external_account = get_institution_addon_info(institution.id, provider_name)
return {
'host': create_storage_info_template('Host URL', external_account.profile_url),
'username': create_storage_info_template('Username', external_account.display_name),
'folder': create_storage_info_template('Folder', rdm_addon_option.extended.get(KEYNAME_BASE_FOLDER)),
'notification_secret': create_storage_info_template(
'Connection common key from File Upload Notification App',
rdm_addon_option.extended.get(KEYNAME_NOTIFICATION_SECRET)
)
}


def get_dropboxbusiness_info(institution, provider_name):
"""Get storage information for Dropbox Business."""
rdm_addon_option, external_account = get_institution_addon_info(institution.id, provider_name)
return {
'authorized_by': create_storage_info_template('authorized_by', external_account.display_name)
}


def get_institutional_storage_information(provider_name, region, institution):
"""Get current institutional storage information."""
waterbutler_credentials_storage = region.waterbutler_credentials.get('storage', {})
waterbutler_settings_storage = region.waterbutler_settings.get('storage', {})

provider_handlers = {
'osfstorage': lambda: get_osfstorage_info(waterbutler_settings_storage),
's3': lambda: get_s3_info(waterbutler_credentials_storage, waterbutler_settings_storage),
's3compat': lambda: get_s3compat_info(waterbutler_credentials_storage, waterbutler_settings_storage),
's3compatinstitutions': lambda: get_s3compatinstitutions_info(institution, provider_name, region),
'ociinstitutions': lambda: get_ociinstitutions_info(institution, provider_name),
'nextcloudinstitutions': lambda: get_nextcloudinstitutions_info(institution, provider_name),
'dropboxbusiness': lambda: get_dropboxbusiness_info(institution, provider_name)
}

return provider_handlers.get(provider_name, lambda: {})()
18 changes: 17 additions & 1 deletion admin/rdm_custom_storage_location/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -71,21 +71,37 @@ def get_context_data(self, *args, **kwargs):
raise Http404

region = None
disable_view_setting_info = False
if Region.objects.filter(_id=institution._id).exists():
region = Region.objects.get(_id=institution._id)
else:
region = Region.objects.first()
region.name = ''
# Disable view setting info button if institution have not set institution storage yet
disable_view_setting_info = True

institution_storage_type = region.waterbutler_settings.get('storage', {}).get('type')
provider_name = region.waterbutler_settings['storage']['provider']
provider_name = provider_name if provider_name != 'filesystem' else 'osfstorage'
provider_name = provider_name if provider_name != 'filesystem' and institution_storage_type != Region.NII_STORAGE else 'osfstorage'

# Also disable view setting info button if institution's storage provider is not supported
disable_view_setting_info = disable_view_setting_info or provider_name in settings.UNSUPPORTED_VIEW_SETTING_INFO_PROVIDERS

# Get storage information
try:
storage_information = utils.get_institutional_storage_information(provider_name, region, institution)
except Exception:
storage_information = {}

kwargs['institution'] = institution
kwargs['region'] = region
kwargs['providers'] = utils.get_providers()
kwargs['selected_provider_short_name'] = provider_name
kwargs['have_storage_name'] = utils.have_storage_name(provider_name)
kwargs['osf_domain'] = osf_settings.DOMAIN
kwargs['selected_provider_full_name'] = region.provider_full_name
kwargs['disable_view_setting_info'] = disable_view_setting_info
kwargs['storage'] = storage_information
return kwargs


Expand Down
8 changes: 7 additions & 1 deletion admin/static/css/rdm_institutional_storage.css
Original file line number Diff line number Diff line change
Expand Up @@ -30,4 +30,10 @@

.csv-upload-button div {
margin-left: 10px;
}
}

.wrap-cell {
word-wrap: break-word;
word-break: break-word;
white-space: normal !important;
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,16 @@
{% endblock title %}

{% block content %}
<h2>{% trans "Institutional Storage " %}<small>({{ institution.name }})</small></h2>
<h2>
{% trans "Institutional Storage " %}
<small style="word-wrap: break-word">
({{ institution.name }})
<button data-toggle="modal" data-target="#settingInfoModal" class="btn btn-primary" type="button" style="margin-top: -2px"
{% if disable_view_setting_info %}disabled{% endif %}>
{% trans "View Setting Info" %}
</button>
</small>
</h2>

<div id="content-main">
<form role="form" id="institutional_storage_form">
Expand Down Expand Up @@ -71,6 +80,7 @@ <h4 class="addon-title">
{% for provider_item in providers %}
{% include provider_item.modal_path %}
{% endfor %}
{% include "rdm_custom_storage_location/setting_info_modal.html" %}

</div>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ <h3 id="s3_modal_label">{% trans "Connect an Amazon S3 Account" %}</h3>
<div class="form-group">
<label data-toggle="tooltip" title="{% trans '*The storage API must support Server Side Encryption' %}" for="s3_server_side_encryption">{% trans "Enable Server Side Encryption" %}</label><br>
<label for="s3_server_side_encryption" style="font-size: 15px; font-weight: normal; margin-left: 5px;">
<input type="checkbox" class="s3-params" id="s3_server_side_encryption" style="margin-right: 10px; transform: scale(1.2);" value="false" onchange="setValue()">
<input type="checkbox" class="s3-params" id="s3_server_side_encryption" style="margin-right: 10px; transform: scale(1.2);" value="false" onchange="setValueS3()">
{% trans "Yes@institutional_storage" %}
</label>
</div>
Expand All @@ -49,7 +49,7 @@ <h3 id="s3_modal_label">{% trans "Connect an Amazon S3 Account" %}</h3>
</div>

<script>
function setValue(value) {
function setValueS3() {
var element = document.getElementById("s3_server_side_encryption");
element.value = element.checked;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ <h3 id="s3compat_modal_label">{% trans "Connect a S3 Compatible Storage Account"
<div class="form-group">
<label data-toggle="tooltip" title="{% trans '*The storage API must support Server Side Encryption' %}" for="s3compat_server_side_encryption">{% trans "Enable Server Side Encryption" %}</label><br>
<label for="s3compat_server_side_encryption" style="font-size: 15px; font-weight: normal; margin-left: 5px;">
<input type="checkbox" class="s3compat-params" id="s3compat_server_side_encryption" style="margin-right: 10px; transform: scale(1.2);" value="false" onchange="setValue()">
<input type="checkbox" class="s3compat-params" id="s3compat_server_side_encryption" style="margin-right: 10px; transform: scale(1.2);" value="false" onchange="setValueS3Compat()">
{% trans "Yes@institutional_storage" %}
</label>
</div>
Expand All @@ -53,7 +53,7 @@ <h3 id="s3compat_modal_label">{% trans "Connect a S3 Compatible Storage Account"
</div>

<script>
function setValue(value) {
function setValueS3Compat() {
var element = document.getElementById("s3compat_server_side_encryption");
element.value = element.checked;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ <h3 id="s3compatinstitutions_modal_label">{% trans "Connect a S3 Compatible Stor
<div class="form-group">
<label data-toggle="tooltip" title="{% trans '*The storage API must support Server Side Encryption' %}" for="s3compatinstitutions_server_side_encryption">{% trans "Enable Server Side Encryption" %}</label><br>
<label for="s3compatinstitutions_server_side_encryption" style="font-size: 15px; font-weight: normal; margin-left: 5px;">
<input type="checkbox" class="s3compatinstitutions-params" id="s3compatinstitutions_server_side_encryption" style="margin-right: 10px; transform: scale(1.2);" value="false" onchange="setValue()">
<input type="checkbox" class="s3compatinstitutions-params" id="s3compatinstitutions_server_side_encryption" style="margin-right: 10px; transform: scale(1.2);" value="false" onchange="setValueS3CompatInstitutions()">
{% trans "Yes@institutional_storage" %}
</label>
</div>
Expand All @@ -53,7 +53,7 @@ <h3 id="s3compatinstitutions_modal_label">{% trans "Connect a S3 Compatible Stor
</div>

<script>
function setValue(value) {
function setValueS3CompatInstitutions() {
var element = document.getElementById("s3compatinstitutions_server_side_encryption");
element.value = element.checked;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
{% load i18n %}
<div class="modal fade" id="settingInfoModal" tabindex="-1" role="dialog" aria-labelledby="setting_info_modal_label">
<div class="modal-dialog modal-md" role="document">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">&times;</span>
</button>
<h3 id="setting_info_modal_label">
{% blocktrans with providerName=selected_provider_full_name %}{{ providerName }} Setting Information{% endblocktrans %}
</h3>
</div>
<div class="modal-body">
<div class='row'>
<div class='col-sm-12'>
<table class="table table-striped table-hover table-responsive" style="margin-bottom: 0">
<thead>
<tr>
<th class="wrap-cell" style="width: 35%">{% trans "Field" %}</th>
<th class="wrap-cell">{% trans "Value" %}</th>
</tr>
</thead>
<tbody>
{% for key, value in storage.items %}
<tr id="setting_info_modal_{{ key }}">
<td class="wrap-cell">{% trans value.field_name %}</td>
{% if key == "encrypt_uploads" %}
<td class="wrap-cell">
{% if value.value %}
{% trans "Yes@encrypt_uploads" %}
{% else %}
{% trans "No@encrypt_uploads" %}
{% endif %}
</td>
{% else %}
<td class="wrap-cell">{{ value.value }}</td>
{% endif %}
</tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">{% trans "OK" %}</button>
</div>
</div>
</div>
</div>
15 changes: 15 additions & 0 deletions admin/translations/django.pot
Original file line number Diff line number Diff line change
Expand Up @@ -3913,3 +3913,18 @@ msgstr ""

msgid "attribute_value is required."
msgstr ""

msgid "View Setting Info"
msgstr ""

msgid "%(providerName)s Setting Information"
msgstr ""

msgid "authorized_by"
msgstr ""

msgid "Yes@encrypt_uploads"
msgstr ""

msgid "No@encrypt_uploads"
msgstr ""
15 changes: 15 additions & 0 deletions admin/translations/en/LC_MESSAGES/django.po
Original file line number Diff line number Diff line change
Expand Up @@ -3965,3 +3965,18 @@ msgstr ""

msgid "attribute_value is required."
msgstr ""

msgid "View Setting Info"
msgstr ""

msgid "%(providerName)s Setting Information"
msgstr ""

msgid "authorized_by"
msgstr "Authorized by"

msgid "Yes@encrypt_uploads"
msgstr "Yes"

msgid "No@encrypt_uploads"
msgstr "No"
15 changes: 15 additions & 0 deletions admin/translations/ja/LC_MESSAGES/django.po
Original file line number Diff line number Diff line change
Expand Up @@ -4005,3 +4005,18 @@ msgstr "作成したプロジェクト数が作成可能なプロジェクトの

msgid "attribute_value is required."
msgstr "プロジェクト制限数が不正です。"

msgid "View Setting Info"
msgstr "設定情報を表示"

msgid "%(providerName)s Setting Information"
msgstr "%(providerName)s設定情報"

msgid "authorized_by"
msgstr "承認者"

msgid "Yes@encrypt_uploads"
msgstr "有効化する"

msgid "No@encrypt_uploads"
msgstr "有効化しない"
Loading