GithubHelp home page GithubHelp logo

learningequality / studio Goto Github PK

View Code? Open in Web Editor NEW
91.0 20.0 157.0 216.86 MB

Content curation tools for Kolibri

Home Page: https://studio.learningequality.org/

License: MIT License

Python 34.28% CSS 0.23% JavaScript 29.21% HTML 5.11% Makefile 0.16% Shell 0.11% Vue 23.49% Dockerfile 0.05% Less 0.08% Nix 0.03% SCSS 4.98% Gherkin 2.13% Mustache 0.07% Jinja 0.07%

studio's Issues

Use server for model validation

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.

Thumbnail view on CC server doesn't match view on Kolibri

Summary

(Automated and manually input) thumbnail view on CC server doesn't match view on Kolibri for PDF's

Cateogry

BUG

Usage Details

Please give details in how were you using the Content Curation Server.

  • Browser: Chrome
  • Channel: BeStrong
  • Topic/Content Item: all pdfs

Traceback or relevant snippet from browser console

INSERT TRACEBACK, LOG MESSAGES ETC. HERE

How to reproduce

  1. Add pdf to content channel
  2. Thumbnail can be either automated or replaced by a manually created screenshot
  3. Publish
  4. Import channel to Kolibri
  5. Mismatched thumbnails appear

Screenshots

screen_shot_2017-05-03_at_9 47 12_am

Real-life consequences (anything community should be aware of, for instance how it affects end users)

Truncated thumbnails offer poor user experience

Suggestions for question editor

  • Use placeholder attribute rather than default text
  • When adding a new answer, auto-enable edit mode and focus the text entry area
  • Add a new exercise, then delete immediately. It pops to the top of the list instead of disappearing.
  • Next to the "Add New Question" text, put a colon. And perhaps make it less of a button (I clicked it).
  • Clearer icons on the undo/redo (and disabling them as appropriate, when there's nothing to undo/redo).
  • Add hover text/title to the various buttons to help explain what they're going to do.
  • White background on the Question editing area when editing is enabled (to make it look not disabled).

Saving questions doesn't save exercises

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.

Content size not reported correctly during import from other channels

Summary

Counting small numbers subtopic size is reported to be 279Mb, when in fact it should only be around 15Mb.

Cateogry

  • Bug
  • Enhancement
  • Question
  • Other (describe)

Usage Details

  • Browser: all
  • Channel: Khan Academy (en)
  • Topic/Content Item: Counting small numbers

How to reproduce

  1. Make a new channel or open an existing one.
  2. Try to import Counting small numbers from Khan Academy (en) > Math > Early math > Counting.
  3. Observe the total size at the bottom of the modal.

Screenshots

kolibri studio - google chrome_194

  • The other two topics in this sample channel are empty, and cannot account for the reported size error.

Real-life consequences

Content curators cannot gauge the correct size of the topics they are importing.

Avoid over-escaping Perseus text during rendering

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?

On CC server:
image

In Kolibri:
image

Content Copy Invalid Format

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

Update documentation with latest changes

Changes to Document

NEW: Subtitles

Users can now add subtitles to videos using the front-end interface, set the language of those subtitles, and preview them.

image


NEW: Exercise Editor

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.

image


ADDED: Special Permissions

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.

image


NEW: Pending Invitations

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.

image


UPDATED: View-only Modes

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.

image
image
image


ENHANCED: More thumbnail support

User can choose to generate thumbnails based on the content. Additionally, support for topic thumbnails has been added.

image


IMPROVED: Deleted Content

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.

image


NEW: Setting Defaults

Users can set defaults through the Settings page. This includes metadata defaults, exercise defaults, and thumbnail generation preferences.

image


NEW: Move Option

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.

image

Improve topic file size estimates by avoiding overcounting

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 while importing magogenie content through Sushi Chef

Summary

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).

Cateogry

Select one: BUG

Usage Details

  • Browser: Chrome
  • Channel: 955b0a695c015b6b8cd35f39482c43ea/a52e21d2f0ed59009a12d9af9e39b74a
  • Ricecooker:0.5.6

Screenshots

screen shot 2017-05-08 at 6 41 33 pm

After creating channel we get the ricecooker line above the topic tree mentioned in below screenshot

screen shot 2017-05-08 at 6 42 39 pm

change reply-to address of automatic emails

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
  • the email address of the user that initiated the action, so responses go to that person

(Note that this issue applies to all automated emails, not just channel sharing)

minor exercise thumbnail UI tweak

"formats (0)" is somewhat confusing:

image

If this is meant to show a thumbnail, could probably just say "Add thumbnail" and "Remove thumbnail" without support or hints at multiple files.

UX updates: 'save & close', 'cancel', '×', 'apply changes'...

image
...
image

image

Every once in a while I overhear someone confused about the various buttons available and their behaviors.

some examples:

  • 'apply changes' is not a super-common pattern on the web, and people don't know how it's different from 'save and close'
  • it's not obvious that 'cancel' only applies to changes since the last time 'apply' was pressed
  • it's not clear whether the 'x' is different from 'cancel'

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:

  • Close
  • Save
  • Discard

So, in the main editor we'd have:

  • Close instead of Cancel (behaves same as ×)
  • Save instead of Apply Changes
  • Save & Close remains the same, still default

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:

  • Discard instead of Don't save (phrased as a positive action rather than a negative)
  • Save instead of Save & Close ('close' is assumed and redundant)
  • Keep editing instead of Keep open (the default - safest - action)

Thoughts?

cc @jtamiace @jayoshih

Splash page non functional

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.

MEDIA_ROOT Retrieval

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

Subclass BaseNodeItemView and BaseNodeListView

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.

Unable to create a new channel

Summary

The button to create a new channel isn't working - you cannot click on it.

Cateogry

Select one: BUG - This appears to be a bug as it was working previously.

Usage Details

Please give details in how were you using the Content Curation Server.

  • Browser: Chrome
  • Channel: n/a
  • Topic/Content Item: n/a

Traceback or relevant snippet from browser console

INSERT TRACEBACK, LOG MESSAGES ETC. HERE

How to reproduce

Log-in to the content curation server. Try to create a new channel.

Screenshots

capture2

Real-life consequences (anything community should be aware of, for instance how it affects end users)

Many of our potential partners are starting to curate their own channels so this is fairly critical to progress our conversations.

We are getting "Error with asynchronous call. Please refresh the page" while publishing a new channel.

Summary

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.

Cateogry

Select one: BUG

Usage Details

  • Browser: Crome
  • Channel: Channel ID not getting generated since we can publish.
  • Topic/Content Item: -

How to reproduce

  1. Create a channel with content close to 8 GB .
  2. Publish the channel
  3. Wait for some time till you get the error message.

Screenshots

image
image-2

Multiple choice questions don't have save button

On master. Exercises and questions both have save icons. But multiple choice answer options do not. You have to click the same button to begin and finish editing them.
ss2

Suggested behavior: Use a save icon, as for the other objects.

Use regex to deal with new title duplication logic.

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) + ")";
    });
}

Child nodes not saving second time around

To replicate error:

  1. Create 2 nodes
  2. Open one node and drop other node into folder (api reflects change)
  3. Refresh once (api now loses children and parent data)
  4. Refresh one more time (child disappears from gui)

Note: commenting out call to set_sort_orders (tree_edit: line 121) will fix issue, but takes away ability to sort

confusing ricecooker message shown

image

This message might be helpful for internal debugging, but it's not clear to me as an end-user what it means or what action I can take.

Copy/paste into exercise editor shows unwanted markup

Summary

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.

Category

BUG

Usage Details

Please give details in how were you using the Content Curation Server.

  • Browser: Chrome
  • Channel: Art at NPA
  • Topic/Content Item: untitled

Traceback or relevant snippet from browser console

INSERT TRACEBACK, LOG MESSAGES ETC. HERE

How to reproduce

  1. copy pre-written exercise text from separate document
  2. paste into exercise editor

Screenshots

image

Real-life consequences (anything community should be aware of, for instance how it affects end users)

If applicable

Empty Channels break the server

Summary

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...
                                                             ^

No preview of questions showing for Exercise Editor

Summary

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.

Usage Details

Please give details in how were you using the Content Curation Server.

  • Browser: Chrome
  • Channel: BeStrong Module : d0ef6f71e4fe4e54bb87d7dab5eeaae2
  • Topic/Content Item: There is one exercise called "Quiz" under each Module
    Ex. Module 1: My Digital Life --> Quiz - My Digital Life

How to reproduce

  1. Log into content workshop
  2. Start editing the Be Strong channel
  3. Edit the exercise under each module
  4. Click 'Preview' while editing exercise

Screenshots

exercisepreview

Real-life consequences (anything community should be aware of, for instance how it affects end users)

Suboptimal experience for content creators who are curious to know how their questions will look to the user/learner.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.