learningequality / studio Goto Github PK
View Code? Open in Web Editor NEWContent curation tools for Kolibri
Home Page: https://studio.learningequality.org/
License: MIT License
Content curation tools for Kolibri
Home Page: https://studio.learningequality.org/
License: MIT License
Our models are complex and have complex relationships to each other. Let's use Django-MPTT to do our validation on the server side.
This will involve doing saves, doing the validation on the server, and then properly handling error callbacks from the save request.
(Automated and manually input) thumbnail view on CC server doesn't match view on Kolibri for PDF's
BUG
Please give details in how were you using the Content Curation Server.
INSERT TRACEBACK, LOG MESSAGES ETC. HERE
Truncated thumbnails offer poor user experience
On master
, if you edit & save a question under an exercise, but then fail to additionally save the exercise, then your changes to the question will not by synced. If you e.g. navigate away and then back to the exercise without saving after editing a question, your changes will be lost.
Expected behavior: clicking the save icon for a question should sync the changes to that question without having to click the save button for that exercises. Alternatively, we should cue to users that it's necessary to click the save button for the exercise after changes have been made to a question.
Happens after log in on /exercises on http://198.61.166.139/
branch: unicef_demo
reproduce: add new tag to a node, and don't refresh the page, click the edit icon, you will see the tag displays "untagged"
Counting small numbers subtopic size is reported to be 279Mb, when in fact it should only be around 15Mb.
Content curators cannot gauge the correct size of the topics they are importing.
An exercise pushed through the ricecooker had the following string in it:
What is the correct term for object "A" in the image?
After exporting and loading in Kolibri, the string (in the UI and in the API endpoint) shows up as:
What is the correct term for object "C" in the image?
See learningequality/kolibri#1309 and many referenced issues from there.
Some content nodes that are flagged as exercises do not have associated assessmentmetadata
. We need to ensure that all exercises have this info.
This is a critical issue for 0.4.x.
I just signed up to content curation (https://contentworkshop.learningequality.org) and received the following email:
Hello Ivan,
Here is your activation link for Kolibri Studio:
None/accounts/activate/Iml2Yzzxxxxmci:1dCtL0:KdzzzzzMJ-Tma0C8I/
This link is valid for 7 days.
Thanks for using our site!
The Learning Equality Team
Note the None
instead of domain.
BUG
When file models return from the server, the content_copy field is in a string format. When trying to save a file without a patch, it says content_copy is in an invalid format
Reproduce: Remove patch:true from create_file method under edit_channel/models.js and try uploading a new file
Branch: fileformatting
After importing magogenie content successfully onto content curation server. "MathML" not rendered the questions properly.
https://contentworkshop.learningequality.org/channels/ed8a74787e9f5bfaba57db5d81c8b099/edit
Channel ID: ed8a74787e9f5bfaba57db5d81c8b099
Users can now add subtitles to videos using the front-end interface, set the language of those subtitles, and preview them.
Users can create exercises with questions, answers, and hints. These questions can be numeric, multiple choice, check all that apply, or true or false. Users can also set the mastery criteria, set the question/answer/hint order, and indicate whether to randomize the order of questions/answers. In addition to this, users can add images and formulas to their questions, answers, and hints.
Users can select a Special Permissions
license that allows them to customize the description. This can be used in cases where the available licenses don't match the content's permissions.
Users can accept or reject invitations to view or edit channels on the channel home page. This eliminates the need for them to accept/reject invitations exclusively through email.
View-only users can now invite other users to view a channel. When users are view-only, they also now have the option to download the content from the channels. Given the way imported content needs to sync with the original content, Ricecooker channels are automatically displayed as view-only.
User can choose to generate thumbnails based on the content. Additionally, support for topic thumbnails has been added.
User can access deleted content through a modal rather than the queue. This eliminates confusion over deleted content being localized to the channel rather than the clipboard. Users can still restore/permanently delete content through this modal.
Users can set defaults through the Settings page. This includes metadata defaults, exercise defaults, and thumbnail generation preferences.
User can move individual or multiple items at once. This provides an alternative method for moving items between topics without having to rely on drag/drop.
It's possible for content nodes and/or files to be duplicated across a content channel. Under the hood, however, we only store a single copy of each duplicated file. This means that our current methods of calculating file sizes per topic are often an overestimate -- e.g. for KA (en), we show 78GB, when more like 50GB are actually downloaded.
Let's look at how we can adapt the queries to produce a better size estimate. Some examples below of how we might approach it.
In [50]: File.objects.filter(contentnode__in=topic.get_descendants()).values_list("checksum", "file_size").aggregate(Sum("file_size"))
Out[50]: {'file_size__sum': 25128604114}
In [51]: File.objects.filter(contentnode__in=topic.get_descendants()).values_list("checksum", "file_size").distinct().aggregate(Sum("file_size"))
Out[51]: {'file_size__sum': 11099811030}
No edit access to channel on content curation server. I am admin user while creating new channel, still not have the access of edit channel(questions,topics).
Select one: BUG
After creating channel we get the ricecooker line above the topic tree mentioned in below screenshot
##Summary
Increase the speed of topic trees loading while accessing channels with huge content.
Khan Academy channel especially takes more than 4 mins to load up.
A fix like on #224 will be great!
Currently the invitation to view a channel comes from
Kolibri Content Curation <[email protected]>
We should avoid using emails like this because potentially private information might be inadvertently shared if people reply to the automated email. Recommend looking into best practices.
My guess is that we should be using one of either:
[email protected]
which auto-deletes everything that comes to it(Note that this issue applies to all automated emails, not just channel sharing)
Every once in a while I overhear someone confused about the various buttons available and their behaviors.
some examples:
Longer term (e.g. for Kolibri Studio), I think we should take a step back and think about the desired editing flow independent of the current constraints on the server (e.g. the API) and the UI (e.g. modal editor popups). We may even want to consider alternative strategies like an 'undo' stack with automatic save-as-you-go.
In the short term, I wonder if there's a way to make the existing UI a bit easier to understand by using more consistent language?
In particular, I'd recommend paring it down to the following concepts, and framing all actions in these terms:
So, in the main editor we'd have:
The two save buttons would be disabled when there are no changes to save.
If there are unsaved changes and the user clicks Close or ×, they would be shown the unsaved changes prompt.
This might have the text:
You have unsaved changes. What would you like to do with them?
And the options:
Thoughts?
Currently the main page (empty relative url) does nothing. You can't enter the exercise creation screen. You can't log in or create an account.
Encapsulate all tags and functionality inside the ItemView, rather than creating list items in the list template.
To replicate error:
Branch: unicef_demo
Branch: fileformatting
To Reproduce: try to upload a video, save it, and click new node to preview
Description: content storage system currently saves content to base directory. This should be changed
The clipboard, topic tree, and trash views have a lot of behaviours in common. Our current BaseListViews and BaseListItemViews are generic enough to handle all model types.
To encapsulate the shared Node specific behaviour, this should be put into the two BaseNode views to allow for reuse of code.
The button to create a new channel isn't working - you cannot click on it.
Select one: BUG - This appears to be a bug as it was working previously.
Please give details in how were you using the Content Curation Server.
INSERT TRACEBACK, LOG MESSAGES ETC. HERE
Log-in to the content curation server. Try to create a new channel.
Many of our potential partners are starting to curate their own channels so this is fairly critical to progress our conversations.
In order to get the Django admin interface working, we'll need to adapt our custom user model, at least to add is_staff
and is_superuser
. That may be enough, for may need to add a couple of other fields as well.
To test, go to http://127.0.0.1:8000/admin/ and log in as a user with is_active
, is_staff
, and is_superuser
all set to True
.
See https://docs.djangoproject.com/en/1.11/topics/auth/customizing/#specifying-a-custom-user-model
We have have curated a channel which is 8GB and we are trying to publish it. Its not getting published and we are getting "Error with asynchronous call. Please refresh the page".
After refreshing the page we are still seeing the channel is not yet published.
Select one: BUG
When viewing a channel and adding topics, "apply changes" then "cancel" produces the same result as "save and finish." After clicking "apply changes," the new topic is created. Changes don't appear to be discarded when clicking "cancel."
var matching = /\(Copy\s*([0-9]*)\)/g;
if (matching.test(title)) {
title = title.replace(matching, function(match, p1) {
// Already has "(Copy)" or "(Copy <p1>)" in the title, so return either
// "(Copy 2)" or "(Copy <p1+1>)"
return "(Copy " + (p1==="" ? 2: Number(p1) + 1) + ")";
});
}
To replicate error:
Note: commenting out call to set_sort_orders (tree_edit: line 121) will fix issue, but takes away ability to sort
Summary:
KA Math is not loading at a usable speed, even with a strong net connection (neither through the "import from channel" functionality nor through the KA channel itself).
Link used:
https://contentworkshop.learningequality.org/channels/7769d932b2cc49efb18c5e665cda64ff/edit
Channel ID: 7769d932b2cc49efb18c5e665cda64ff
Screenshot:
When copy/pasting pre-writen exercises from a doc (including Google and word docs), unwanted markup is showing in the questions and answers editor boxes.
BUG
Please give details in how were you using the Content Curation Server.
INSERT TRACEBACK, LOG MESSAGES ETC. HERE
If applicable
Made an empty channel to start working on the new sharing modal, and I got a backend error that will no longer let me load the page. Can we handle for this?
Internal Server Error: /channels/
Traceback (most recent call last):
File "/usr/local/lib/python2.7/dist-packages/django/core/handlers/base.py", line 149, in get_response
response = self.process_exception_by_middleware(e, request)
File "/usr/local/lib/python2.7/dist-packages/django/core/handlers/base.py", line 147, in get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/usr/local/lib/python2.7/dist-packages/django/contrib/auth/decorators.py", line 23, in _wrapped_view
return view_func(request, *args, **kwargs)
File "/vagrant/contentcuration/contentcuration/views.py", line 108, in channel_list
return render(request, 'channel_list.html', {"channels" : JSONRenderer().render(channel_serializer.data),
File "/usr/local/lib/python2.7/dist-packages/rest_framework/serializers.py", line 674, in data
ret = super(ListSerializer, self).data
File "/usr/local/lib/python2.7/dist-packages/rest_framework/serializers.py", line 239, in data
self._data = self.to_representation(self.instance)
File "/usr/local/lib/python2.7/dist-packages/rest_framework/serializers.py", line 614, in to_representation
self.child.to_representation(item) for item in iterable
File "/usr/local/lib/python2.7/dist-packages/rest_framework/serializers.py", line 472, in to_representation
ret[field.field_name] = field.to_representation(attribute)
File "/usr/local/lib/python2.7/dist-packages/rest_framework/fields.py", line 1653, in to_representation
return method(value)
File "/vagrant/contentcuration/contentcuration/serializers.py", line 584, in get_resource_size
return channel.get_resource_size()
File "/vagrant/contentcuration/contentcuration/models.py", line 241, in get_resource_size
size = ChannelResourceSize.objects.filter(id=self.main_tree.tree_id).first()
File "/usr/local/lib/python2.7/dist-packages/django/db/models/query.py", line 550, in first
objects = list((self if self.ordered else self.order_by('pk'))[:1])
File "/usr/local/lib/python2.7/dist-packages/django/db/models/query.py", line 258, in __iter__
self._fetch_all()
File "/usr/local/lib/python2.7/dist-packages/django/db/models/query.py", line 1074, in _fetch_all
self._result_cache = list(self.iterator())
File "/usr/local/lib/python2.7/dist-packages/django/db/models/query.py", line 52, in __iter__
results = compiler.execute_sql()
File "/usr/local/lib/python2.7/dist-packages/django/db/models/sql/compiler.py", line 848, in execute_sql
cursor.execute(sql, params)
File "/usr/local/lib/python2.7/dist-packages/debug_toolbar/panels/sql/tracking.py", line 164, in execute
return self._record(self.cursor.execute, sql, params)
File "/usr/local/lib/python2.7/dist-packages/debug_toolbar/panels/sql/tracking.py", line 106, in _record
return method(sql, params)
File "/usr/local/lib/python2.7/dist-packages/django/db/backends/utils.py", line 79, in execute
return super(CursorDebugWrapper, self).execute(sql, params)
File "/usr/local/lib/python2.7/dist-packages/django/db/backends/utils.py", line 64, in execute
return self.cursor.execute(sql, params)
File "/usr/local/lib/python2.7/dist-packages/django/db/utils.py", line 95, in __exit__
six.reraise(dj_exc_type, dj_exc_value, traceback)
File "/usr/local/lib/python2.7/dist-packages/django/db/backends/utils.py", line 64, in execute
return self.cursor.execute(sql, params)
ProgrammingError: relation "contentcuration_channel_resource_sizes" does not exist
LINE 1: ...tion_channel_resource_sizes"."resource_size" FROM "contentcu...
^
See #135 for the partial changes (addition of new fields). Once we run a script to update the new fields from the old ones, we can remove the old ones.
Summary:
After importing the MagoGenie Questions onto CC, we see that a tag "< / P >" and/or
"< p >" appears on most of the questions.
Link used:
https://contentworkshop.learningequality.org/channels/f531b1ddf64755c9be5061a922317021/edit
Channel ID: f531b1ddf64755c9be5061a922317021
The Preview tab for the exercise editor doesn't show a preview of the questions inputted for the exercise.
Currently, the preview only shows a thumbnail. I expect a preview of the question-answering experience from a learner view.
Please give details in how were you using the Content Curation Server.
Suboptimal experience for content creators who are curious to know how their questions will look to the user/learner.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.