GithubHelp home page GithubHelp logo

learningequality / studio Goto Github PK

View Code? Open in Web Editor NEW
91.0 91.0 154.0 217.55 MB

Content curation tools for Kolibri

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

License: MIT License

Python 34.20% CSS 5.09% JavaScript 29.21% HTML 5.11% Makefile 0.16% Shell 0.11% Vue 23.55% Dockerfile 0.05% Less 0.08% Nix 0.03% SCSS 0.12% Gherkin 2.13% Mustache 0.07% Jinja 0.08%

studio's Introduction

Kolibri Studio

Python tests Javascript Tests

Kolibri Studio is a web application designed to deliver educational materials to Kolibri. It supports:

  • Organizing and publishing content channels in the format suitable for import from Kolibri
  • Curating content and remixing of existing channels into custom channels aligned to various educational standards, country curricula, and special needs
  • Creating learning pathways and assessments
  • Uploading new content through the web interface or programatically using ricecooker-powered content import scripts

Kolibri Studio uses the Django framework for the backend and Vue.js for the frontend.

If you are looking for help setting up custom content channels, uploading and organizing resources using Kolibri Studio, please refer to the User Guide.

How can I contribute?

  1. ๐Ÿ“™ Skim through the Developer documentation to understand where to refer later on.
  2. ๐Ÿ’ป Follow the Local development instructions to set up your development server.
  3. ๐Ÿ” Search for issues tagged as help wanted or good first issue.
  4. ๐Ÿ—ฃ๏ธ Ask us for an assignment in the comments of an issue you've chosen. Please request assignment of a reasonable amount of issues at a time. Once you finish your current issue or two, you are welcome to ask for more.

โ“ Where to ask questions

  • For anything development related, refer to the Developer documentation at first. Some answers may already be there.
  • For questions related to a specific issue or assignment requests, use the corresponding issue's comments section.
  • Visit GitHub Discussions to ask about anything related to contributing or to troubleshoot development server issues.

๐Ÿ‘ฅ How to connect

  • We encourage you to visit GitHub Discussions to connect with the Learning Equality team as well as with other contributors.
  • If you'd like to contribute on a regular basis, we are happy to invite you to our open-source community Slack channel. Get in touch with us at [email protected] to receive an invitation.

๐Ÿ•– Please allow us a few days to reply to your comments. If you don't hear from us within a week, reach out via GitHub Discussions.

As soon as you open a pull request, it may take us a week or two to review it as we're a small team. We appreciate your contribution and will provide feedback.


Thank you for your interest in contributing! Learning Equality was founded by volunteers dedicated to helping make educational materials more accessible to those in need, and every contribution makes a difference.

studio's People

Contributors

66eli77 avatar akolson avatar allanoxdi avatar aronasorman avatar babyelias avatar bjester avatar dependabot[bot] avatar divad12 avatar dxcanas avatar indirectlylit avatar ivanistheone avatar jamalex avatar jayoshih avatar jonboiser avatar jtamiace avatar kollivier avatar lianaharris360 avatar lyw07 avatar marcellamaki avatar micahscopes avatar miraziz avatar misrob avatar nucleogenesis avatar ozer550 avatar pcenov avatar radinamatic avatar ralphiee22 avatar rtibbles avatar sairina avatar vkweb avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

studio's Issues

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.

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

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

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

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.

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}

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)

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.

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

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

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.

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.

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.

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.

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 &quot;C&quot; in the image?

On CC server:
image

In Kolibri:
image

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.

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

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

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

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

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

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.

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

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

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.