Override upload file max size in mb#2370
Conversation
|
Thanks for the pull request, @MuPp3t33r! This repository is currently maintained by Once you've gone through the following steps feel free to tag them in a comment and let them know that your changes are ready for engineering review. 🔘 Get product approvalIf you haven't already, check this list to see if your contribution needs to go through the product review process.
🔘 Provide contextTo help your reviewers and other members of the community understand the purpose and larger context of your changes, feel free to add as much of the following information to the PR description as you can:
🔘 Get a green buildIf one or more checks are failing, continue working on your changes until this is no longer the case and your build turns green. DetailsWhere can I find more information?If you'd like to get more details on all aspects of the review process for open source pull requests (OSPRs), check out the following resources: When can I expect my changes to be merged?Our goal is to get community contributions seen and reviewed as efficiently as possible. However, the amount of time that it takes to review and merge a PR can vary significantly based on factors such as:
💡 As a result it may take up to several weeks or months to complete a review and merge your PR. |
|
@MuPp3t33r Thanks for your detailed PR description. I've approved the tests to run here and will await @bradenmacdonald 's review. |
|
@MuPp3t33r I notice there are some commit-lint failures. Please note that we use conventional commits across Open edX projects. You can read about the details here. Can you please amend your commit messages to follow our standard? |
|
@MuPp3t33r Thanks for the revised version here, and especially for the nice testing instructions! I will try to review this shortly. In the meantime, would you mind addressing these minor lint issues? And as @e0d mentioned, we need the commits to start with |
694830e to
6b60d91
Compare
|
@e0d @bradenmacdonald |
|
I've run them. |
Original configuration had a hard-coded limit of 20MB per file supplied to the platform. This change will retain the existing 20MB limit as default, but provide the admin with the ability to override the value via the MFE_CONFIG API (getConfig) The new function includes validation to check that the override value supplied is in fact a valid and positive integer and reverts to default 20MB in case of validation failure
Originally the constant 'maxFileSize' was hardcoded to 20MB and was not configured to use the pre-existing value defined in constants.js This fix removes the hardcoded value and calls the function getUploadFileMaxSize() to determine the value of maxFileSize
This change allows the TextbookForm to fetch the maximum allowed size via a call to getUploadFileMaxSize() defined in constants. Additionally fixes the conversion factor (maxSize/(1024*1024) vs (1000*1000) for consistency with upstream code
This change allows the ModalDropzone to fetch the maximum allowed size via a call to getUploadFileMaxSize() defined in constants. Additionally fixes the conversion factor (maxSize/(1024*1024) vs (1000*1000) for consistency with upstream code
9105deb to
02e4da3
Compare
|
@e0d I'm so sorry to keep wasting your time, my experience (or lack thereof) with github clearly shows. with any luck i've done it right this time... Sincerely appreciate your patience with me :) |
bradenmacdonald
left a comment
There was a problem hiding this comment.
This looks great! Just need one fix to get the tests passing again:
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## master #2370 +/- ##
==========================================
+ Coverage 94.50% 94.55% +0.05%
==========================================
Files 1171 1174 +3
Lines 25149 25372 +223
Branches 5374 5557 +183
==========================================
+ Hits 23766 23991 +225
+ Misses 1320 1312 -8
- Partials 63 69 +6 ☔ View full report in Codecov by Sentry. 🚀 New features to boost your workflow:
|
|
@MuPp3t33r This is almost ready to merge! We just need to add a test to get the coverage check passing. Would you mind adding something like this? I think that would do it. // src/constants.test.ts
import { mergeConfig } from '@edx/frontend-platform';
import { getUploadFileMaxSize } from './constants';
describe('getUploadFileMaxSize()', () => {
it('returns the global default when no config value is set', () => {
expect(getUploadFileMaxSize()).toEqual(20 * 1024 * 1024);
});
it('returns OVERRIDE_UPLOAD_FILE_MAX_SIZE_IN_MB from the config when set', () => {
mergeConfig({ OVERRIDE_UPLOAD_FILE_MAX_SIZE_IN_MB: 7 })
expect(getUploadFileMaxSize()).toEqual(7 * 1024 * 1024);
});
}); |
|
Thanks @bradenmacdonald! |
|
I just realised I should probably also update the README.rst to document the new optional configuration, is this the ideal place to document it or is there also another documentation that this would be relevant for? |
|
@MuPp3t33r Yes, that would be even better - thanks! As for docs I'm not aware of the MFE config being properly documented anywhere :/ I think adding it to the README makes sense for now. |
documentation of new config option and it's usage
add information about new config option affecting files uploads
add test coverage for new config option
|
Thanks @bradenmacdonald |
|
its been brought to my attention that there is actually still an issue with this, so it's not yet ready for merge! |
|
Hi @bradenmacdonald hoping to just get your thoughts\opinion on this: I see in views.py#L97 there is code to get legacy configs which I'm guessing we could use to import the legacy config But based on what I've seen around other places (and in that same file,) these "will eventually be deprecated" Does this mean that eventually all legacy configs will be deprecated in favour of the MFE configs? for example like the asset_storage_handlers.py code here which if I'm not mistaken is still used in conjunction with the MFE's as well? To clarify: even with the authoring mfe's default I mean I could simply update my patch plugin to modify all the relevant values, but having to patch so many things in so many places doesn't sit right with me for what I'd hope to be a simple config, especially if old stuff will be deprecated anyway. Appreciate your input, still trying to wrap my head around everything to be honest :) |
|
@MuPp3t33r Configuration in our MFEs is a bit of a mess right now. You're asking good questions, but I don't actually know the answer. @arbrandes or @brian-smith-tcril would one of you mind clarifying these questions about which configuration systems will be used in the future, and where a config value for maximum upload sizes in Studio / Authoring MFE should live? I would assume that we should either (A) specify the config only in edx-platform (where it would be enforced by the API) and pull platform's value into the MFE using (some mechanism - runtime config? studio home data?); or (B) have very simple, separate settings in edx-platform and Authoring MFE and make sure the defaults are in sync. |
Friendly ping on this @brian-smith-tcril @arbrandes |
For the Catalog MFE we are DEPRing some legacy config, and for the expand/contract process we're exposing the legacy values as fallbacks for new If there is a file size limit set on the backend, then we should be reading that in the MFE. I think possibly following a similar pattern (expose the existing value via MFE config, not as a fallback, but as the source of truth for that config value) then the MFE could:
|
|
Thanks for the feedback @brian-smith-tcril If you can confirm I'm not misinterpreting anything then I'll close this off and try work up something more appropriate before opening a new PR... Thanks :) |
That sounds good to me, but I'd want to check with someone with |
|
I see :) thanks. I'll wait for a platform expert like @feanil to weigh in on this before proceeding with anything... |
feanil
left a comment
There was a problem hiding this comment.
I added a couple of other notes while I was looking at this.
The existing _get_legacy_config code is meant to be temporary to expose settings that are specific to MFE behavior that were previously being referenced by legacy templates served from the backend, but aren't something we plan on keeping in the backend forever. I don't think that's the right spot to expose this setting from the backend. Though I do agree that this setting should be exposed and the frontend and backend should be aligned on the correct shared value of this backend limit.
Unfortunately there is not currently a backend API for serving metadata related to asset management that is relevant to expose to the frontend yet, based on looking at the currently defined views: https://github.com/openedx/edx-platform/blob/master/cms/djangoapps/contentstore/views/assets.py#L31 and under https://github.com/openedx/edx-platform/tree/master/cms/djangoapps/contentstore/rest_api
I think the correct thing to do is to build a new DRF endpoint that exposes the max filesize data to the frontend. It feels a bit silly since this page doesn't need any other info that we could bundle together into a single call so the call seems kind of large for the small amount of data we're fetching but I think it's architecturally correct and if we do have more metadata we want to provide to this page in the future, we'd expand this call to expose that metadata.
So I think you want an edx-platform PR that adds a new endpoint to contentstore api, probably here: https://github.com/openedx/edx-platform/blob/master/cms/djangoapps/contentstore/rest_api/v2/urls.py
Then in this PR you'd use that endpoint to fetch the data to set the frontend limits.
| @@ -0,0 +1,65 @@ | |||
| #################### | |||
There was a problem hiding this comment.
We don't use the overheading in this project.
Docs if you want to know more about our style guide: https://docs.openedx.org/en/latest/documentors/references/quick_reference.html#documentation-syntax-reference
| // FilesUpload page - Default max size: 20MB else use env override if exists and valid number | ||
| const DEFAULT_UPLOAD_FILE_MAX_SIZE = 20 * 1024 * 1024; // 20 MB | ||
|
|
||
| export const getUploadFileMaxSize = () => { |
There was a problem hiding this comment.
Should this function should live in utils.tsx and not in constants.js?
|
|
||
| export const getUploadFileMaxSize = () => { | ||
| const config = getConfig(); | ||
| const overrideMaxFileSizeMB = parseInt(config.OVERRIDE_UPLOAD_FILE_MAX_SIZE_IN_MB, 10); |
There was a problem hiding this comment.
Putting OVERRIDE in the name is redundant for a config setting. I think MAX_ASSET_UPLOAD_FILE_SIZE_IN_MB is a clear name. Is there a reason not to use the same name we use in the backend as the name of the setting in the mfe config and as the name of the constant in the frontend? Unless there is a change in the meaning of the constant, keeping the name the same should reduce cognitive load for future readers of the code.
|
Thank you @feanil, with that I think I've got enough information to give this another try in my spare time. For now I'm going to close this PR since my implementation was so far off the mark... |
For attention to @bradenmacdonald to review if this PR meets requirements.
Description
This update makes the following changes:
constants.js:FilePage.jsx:maxFileSizevalue and instead import it from constants.jsModalDropzone.jsx:UPLOAD_FILE_MAX_SIZEconstants that were defined and replaced with a call to the new function inconstants.jsTextbookForm.jsx:UPLOAD_FILE_MAX_SIZEconstants that were defined and replaced with a call to the new function inconstants.jsImports from constants now use the updated new format
'@src/constants'instead of the old'../../constants'Supporting information
this is an improvement to my previous attempt before i really knew what i was doing, now I only know a little bit of what I'm doing :)
Testing instructions
Note that this must be done in MFE_CONFIG and in the CaddyFile to allow Caddy to process your larger requests
Here is a sample plugin allowing user to provide one input for the value and it applies in both locations
tutor plugins enable override_max_asset_upload_sizetutor local stop && tutor local start -dNow, under the following menus:
You will find that you can upload files up to whatever maximum defined in the
override_max_asset_upload_sizeplugin