Coder Social home page Coder Social logo

inducer / relate Goto Github PK

View Code? Open in Web Editor NEW
363.0 21.0 115.0 10.18 MB

RELATE is an Environment for Learning And TEaching

Home Page: http://documen.tician.de/relate

License: Other

Python 93.71% Shell 0.32% HTML 5.38% CSS 0.01% JavaScript 0.31% Smarty 0.01% Dockerfile 0.04% SCSS 0.22%
web web-application course-management python django multiple-choice code-question code-homework grading homework

relate's Introduction

RELATE

Relate is an Environment for Learning And TEaching

Gitlab Build Status

Github Build Status

Python Package Index Release Page

image . image:: https://raw.githubusercontent.com/inducer/relate/main/doc/images/screenshot-2.png

RELATE is a web-based courseware package. It is set apart by the following features:

  • Focus on easy content creation

    • Simple, text-based format for reusable course content
    • Based on standard YAML, Markdown

    See example content.

  • Flexible rules for participation, access, and grading
  • Versioning of content through deep integration with git. Instructors can preview newly-authored content while students work with prior versions, all from the same instance of RELATE.
  • Multiple courses can be hosted on the same installation
  • Code questions:
    • Allow students to write code into a text box (with syntax highlighting)
    • Sandboxed execution
    • Automatic grading
    • Plotting support
    • Optional second-stage grading by a human
  • Class calendar and grade book functionality.
  • Statistics/analytics of student answers.
  • Facilitates live quizzes in the classroom.
  • In-class instant messaging via XMPP. Works well with xmpp-popup.

More information around the web:

Installation

See the installation guide.

License

Copyright (C) 2014-15 Andreas Kloeckner

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

relate's People

Contributors

a-alveyblanc avatar adamjstewart avatar bowmanat avatar davis68 avatar dependabot[bot] avatar dfrdmn avatar dzhuang avatar frankfreykamp avatar inducer avatar ishitatsuyuki avatar isuruf avatar joshuata avatar lukeolson avatar mattwala avatar orsenthil avatar proelbtn avatar zwang180 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  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  avatar  avatar

relate's Issues

Flow title not changeable

I found this problem because I typed Chinese character in the title of flow, and my attempt to rename flow title failed as the database only use the title the first time I set. And since Chinese characters are not allowed in flow title, that will raise error in some operations like view grading opportunities.

closed because it seems I can manually change the flow name in admin.

Sandbox failed.

It worked without problems 2 weeks before.

It gives Page failed to load/validate: ValidationError: sandbox: flow page has no ID when I test the following part:

    -
        type: Page
        id: welcome
        content: |

            # Welcome to the test quiz for RELATE!

            Don't be scared.

Improve structure of main page

For example, available, in progress, ended,only avaiable courses are shown on main page, and only participants and see in progress and ended course.

Is there a method to auto regrade a specific flow?

For example, after I change the settings of an auto grade python code question, some answers, which are previously graded as not correct, are actually correct. It there a way to auto regrade, or batch regrade the specific question or flow? For a huge amount of answers submitted, it will cost huge amount of time to navigate to the grade of each of the students and regrade by hand.

After installation, cannot add the example course.

It says:

Course creation failed: ValidationError: flows/quiz-test.yml, group 3 ('quiz_tail'), page 12 ('excelbasictry3'): could not instantiate flow page: ValueError: Extension "__builtin__.NoneType" must be of type: "markdown.Extension".

Traceback (most recent call last):
  File "/mnt/src/git/relate/course/validation.py", line 349, in validate_flow_page
    class_(ctx, location, page_desc)
  File "/mnt/src/git/relate/course/page/inline.py", line 691, in __init__
    text=page_desc.question,
  File "/mnt/src/git/relate/course/content.py", line 577, in markup_to_html
    output_format="html5")
  File "/usr/lib/python2.7/dist-packages/markdown/__init__.py", line 395, in markdown
    md = Markdown(*args, **kwargs)
  File "/usr/lib/python2.7/dist-packages/markdown/__init__.py", line 134, in __init__
    configs=kwargs.get('extension_configs', {}))
  File "/usr/lib/python2.7/dist-packages/markdown/__init__.py", line 166, in registerExtensions
    % (ext.__class__.__module__, ext.__class__.__name__))
ValueError: Extension "__builtin__.NoneType" must be of type: "markdown.Extension".

Issue about time rule

When I set the "if_before" rule for a flow using absolute time(iso format, e.g. "2015-5-10 14:13"), the rule never functioned and students were able to start new session after the due time. However, If I set fake time, the rule works. Another thing I noticed is the time displayed when I tried to regrade or recompute the grade, for example:

Session grade recomputed at 2015-05-05 15:29:09.570974+08:00.
Session regraded at 2015-05-05 15:29:31.564501+08:00.

I think the substring +08:00 is the result of the TIME_ZONE = 'Hongkong' setting in local_settings.py. However, are there something wrong which make time not comparable so that the expiration rule will not be activated? are there any connection with the weird format of time string?

bug report on latest commit (bbc546102b95ea49a3cdfa18f84e17e558d0f990)

With recent commit bbc5461, there appear some errors which don't exist in the past commits:

(1). Unable to start a quiz, with the following debug message:

ValueError at /course/relate-sample/flow/quiz-test/start/
list.remove(x): x not in list
Request Method: POST
Request URL:    http://127.0.0.1:8000/course/relate-sample/flow/quiz-test/start/
Django Version: 1.8
Exception Type: ValueError
Exception Value:    
list.remove(x): x not in list
Exception Location: \path\to\relate\course\content.py in add_page, line 842

(2). Time zone error, which doesn't exist in commits before under the same environment (Windows 7, django 1.8, mysql 5.6).

ValueError at /admin/course/flowpagevisit/
Database returned an invalid value in QuerySet.datetimes(). Are time zone definitions for your database and pytz installed?
Request Method: GET
Request URL:    http://127.0.0.1:8000/admin/course/flowpagevisit/
Django Version: 1.8
Exception Type: ValueError
Exception Value:    
Database returned an invalid value in QuerySet.datetimes(). Are time zone definitions for your database and pytz installed?

That error disappears when USE_TZ = False, however, that will cause the following error like grant exception which require 'USE_TZ = True.

ValueError at /course/relate-sample/grant-exception/31/quiz-test/
astimezone() cannot be applied to a naive datetime

fix typo in local settings example

diff --git a/local_settings.py.example b/local_settings.py.example
index ef3a482..49138e2 100644
--- a/local_settings.py.example
+++ b/local_settings.py.example
@@ -63,7 +63,7 @@ TIME_ZONE = "America/Chicago"

Uncomment one of these to choose the default sign-in method for students

STUDENT_SIGN_IN_VIEW = "relate-sign_in_by_email"
-#STUDENT_SIGN_IN_VIEW = "relate-sign_in_by_user_bw"
+#STUDENT_SIGN_IN_VIEW = "relate-sign_in_by_user_pw"
#STUDENT_SIGN_IN_VIEW = "relate-sign_in_by_sso" # not yet implemented

Issues creating a new course site

Hello,

I wanted to know if it was possible to help me. I followed the instructions from the install page (http://documen.tician.de/relate/misc.html?highlight=css). I keep getting an error (WindowsError: [Error 32] The process cannot access the file because it is being used by another process: u'.....pack....idx'). I have been googling how to rectify this issue but I have been unsuccessful. I am working on a Windows machine. I have python 2.7.6 installed. I look forward to hearing from you soon thank you!

Allow more mimetype in FileUploadQuestion

It's better to allow more mimetypes of upload files, and sometimes we ask student to upload application/pdf, in other case we ask them to upload application/msword. Thanks.

'NoneType' object has no attribute 'add_warning' when start a (fresh new) sample quiz

Request Method: POST
Request URL: http://127.0.0.1:8000/course/demo/flow/quiz-test/start/

Django Version: 1.8
Python Version: 2.7.6
Installed Applications:
('django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'course',
 'crispy_forms',
 'jsonfield',
 'bootstrap3_datetime',
 'djangobower')
Installed Middleware:
('django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware',
 'course.auth.ImpersonateMiddleware')


Traceback:
File "d:\Python27\lib\site-packages\django\core\handlers\base.py" in get_response
  132.                     response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "d:\Python27\lib\site-packages\django\utils\decorators.py" in inner
  145.                     return func(*args, **kwargs)
File "F:\tempgit\course\relate\course\utils.py" in wrapper
  434.         return f(pctx, *args, **kwargs)
File "F:\tempgit\course\relate\course\flow.py" in view_start_flow
  763.                     now_datetime=now_datetime)
File "F:\tempgit\course\relate\course\flow.py" in start_flow
  181.             course.identifier, flow_desc, course_commit_sha)
File "F:\tempgit\course\relate\course\content.py" in adjust_flow_session_page_data
  905.                 repo, flow_session, course_identifier, flow_desc, commit_sha)
File "F:\tempgit\course\relate\course\content.py" in _adjust_flow_session_page_data_inner
  868.                     new_page_fpd = create_fpd(page_desc)
File "F:\tempgit\course\relate\course\content.py" in create_fpd
  806.                     repo, new_page_desc, commit_sha)
File "F:\tempgit\course\relate\course\content.py" in instantiate_flow_page
  768.     return class_(None, location, page_desc)
File "F:\tempgit\course\relate\course\page\text.py" in __init__
  661.                 for i, answer in enumerate(page_desc.answers)]
File "F:\tempgit\course\relate\course\page\text.py" in parse_matcher
  428.         return parse_matcher_string(vctx, location, matcher_desc)
File "F:\tempgit\course\relate\course\page\text.py" in parse_matcher_string
  423.             (vctx, location, pattern))
File "F:\tempgit\course\relate\course\page\text.py" in __init__
  291.             vctx.add_warning(location, "%s: unable to check "

Exception Type: AttributeError at /course/demo/flow/quiz-test/start/
Exception Value: 'NoneType' object has no attribute 'add_warning'

How to enable input other than English?

I am trying to construct an e-learning website using you project, however, being not able to submit contents using characters other than English letters. For example,

  1. Students can't use Chinese characters as their user names.
  2. Can not input Chinese characters in calendar.

Issue for sandbox when code changed

I used sandbox to test a page of type multiTextQuestion, and after the class is rename to InlineMultiQuestion, I failed to open the sandbox, ClassNotFoundError was raised, I will have to logout and then log in again to used sandbox.

Error on failing to create new course on Windows

[03/May/2015 14:18:48]"POST /new-course/ HTTP/1.1" 200 10638
Traceback (most recent call last):
  File "F:\tempgit\forLocale\relate\course\versioning.py", line 192, in set_up_new_course
    shutil.rmtree(repo_path)
  File "d:\Python27\lib\shutil.py", line 247, in rmtree
    rmtree(fullname, ignore_errors, onerror)
  File "d:\Python27\lib\shutil.py", line 247, in rmtree
    rmtree(fullname, ignore_errors, onerror)
  File "d:\Python27\lib\shutil.py", line 247, in rmtree
    rmtree(fullname, ignore_errors, onerror)
  File "d:\Python27\lib\shutil.py", line 252, in rmtree
    onerror(os.remove, fullname, sys.exc_info())
  File "d:\Python27\lib\shutil.py", line 250, in rmtree
    os.remove(fullname)
WindowsError: [Error 32] : u'..\\demo\\.git\\objects\\pack\\pack-2e0d43fe4bf649ad323e3734efc2f3cd7ae7c71c.idx'

I see this http://stackoverflow.com/questions/1889597/deleting-directory-in-python/1889686#1889686.

Be more explicit about consequences of completing a session

Just same as starting a session, rules need to warn student before they submit the final result. For example:

  • When only one session is allowed, warn that if they do not submit, they will graded when the session is due and be grade according to the saved answers. And, if they press submit, warn that they won't have chance to start a new session, then give a chance for them to confirm.
  • When they have chance to start new sessions, display how many times they can restart, and display the grade strategy message.

Thanks!

Bug report on deadline permission

Although students are not allowed to "Start" a new session which is due, they can "Resume" an unsubmitted (empty) session which started before due time.

And for late submission, perhaps they can "Resume" a session which started in week 1 and submit in week 2 (late), and will not be punished for late submission? I have not tested.

Result page doesn't show result.

For a submitted past session in sessions start page, there is a result button, however, its link http://127.0.0.1:8000/course/sample/flow-session/10/finish/ show nothing related to result but a finishing comment like see you in class.

RemovedInDjango18Warning

When I run "python manage.py runserver", it display the following error although it can run without problem.

\path\to\relate\course\admin.py:226: RemovedInDjango18Warning: Creating a ModelForm without either the 'fields' attribute or the 'exclude' attribute is deprecated - form ParticipationFrom needs updating class ParticipationFrom(forms.ModelForm):

Issue when a tutor is sending emails

If the tutor's email address (in the course configuration page) is different with SERVER_EMAIL in settings.py, sending an email by the tutor (e.g., sending enrollment decision) will give an error mail from address must be same as authorization user.

I have no idea whether this is the problem with my email service, or should there be some settings that the tutor should configure his email service.

username, firstname and lastname need rules.

when I turn on the option STUDENT_SIGN_IN_VIEW = "course.auth.sign_in_by_user_pw", many of the error comes from my students who are signing up using non-roman characters or have space in their usernames. Maybe you can:

  • add form validation to ensure that they must use english letters (or numbers, underscore) without space in their username
  • add form validation to ensure that first name and last name accept english letters only (it's alright for me).

Thanks.

On reopening an ended session

A participant start several sessions, with one ended, other in progress. If I reopen the ended session, it raises Can't open multiple sessions at once error. However, if end and regrade other sessions which are in progress, reopening the ended session can be done without problem.

Environment:


Request Method: POST
Request URL: http://127.0.0.1:8000/course/sample/grading/reopen-session/3513/8/

Django Version: 1.8.2
Python Version: 2.7.10
Installed Applications:
('django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'course',
 'crispy_forms',
 'jsonfield',
 'bootstrap3_datetime',
 'djangobower')
Installed Middleware:
('django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.locale.LocaleMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware',
 'course.auth.ImpersonateMiddleware')


Traceback:
File "D:\Python27\lib\site-packages\django\core\handlers\base.py" in get_response
  132.                     response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "E:\git-trial\course\relate\course\utils.py" in wrapper
  435.         return f(pctx, *args, **kwargs)
File "D:\Python27\lib\site-packages\django\utils\decorators.py" in inner
  145.                     return func(*args, **kwargs)
File "E:\git-trial\course\relate\course\grades.py" in view_reopen_session
  715.             reopen_session(session, suppress_log=True)
File "E:\git-trial\course\relate\course\flow.py" in reopen_session
  659.             raise RuntimeError(_("Can't open multiple sessions at once"))

Exception Type: RuntimeError at /course/sample/grading/reopen-session/3513/8/
Exception Value: Can't open multiple sessions at once


KeyError at /course/relate-sample/grant-exception/171/exam-1/3516/

'set_access_rules_tag'

Request Method: POST
Request URL:    http://127.0.0.1:8000/course/relate-sample/grant-exception/171/exam-1/3516/
Django Version: 1.8.1
Exception Type: KeyError
Exception Value:    
'set_access_rules_tag'
Exception Location: E:\git-trial\course\relate\course\views.py in grant_exception_stage_3, line 786
Python Executable:  d:\Python27\python.exe
Python Version: 2.7.9

git SHA: 316742d

Environment:


Request Method: POST
Request URL: http://127.0.0.1:8000/course/relate-sample/grant-exception/171/exam-1/3516/

Django Version: 1.8.1
Python Version: 2.7.9
Installed Applications:
('django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'course',
 'crispy_forms',
 'jsonfield',
 'bootstrap3_datetime',
 'djangobower')
Installed Middleware:
('django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware',
 'course.auth.ImpersonateMiddleware')


Traceback:
File "d:\Python27\lib\site-packages\django\core\handlers\base.py" in get_response
  132.                     response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "E:\git-trial\course\relate\course\utils.py" in wrapper
  434.         return f(pctx, *args, **kwargs)
File "d:\Python27\lib\site-packages\django\utils\decorators.py" in inner
  145.                     return func(*args, **kwargs)
File "E:\git-trial\course\relate\course\views.py" in grant_exception_stage_3
  786.             new_access_rules_tag = form.cleaned_data["set_access_rules_tag"]

Exception Type: KeyError at /course/relate-sample/grant-exception/171/exam-1/3516/
Exception Value: 'set_access_rules_tag'

missing dependencies?

hi, so after following the installation guide instructions, I'm missing a bunch of the static deps, there is probably some simple command to install these, but its not in the installation guide I don't think. Probably something to do with conf.py? If I figure it out I will post it here...

image

On "grade_aggregation_strategy"

The flow property grade_aggregation_strategy is not show in flow introduction page and grade page, and is there a way to warn student of the grade strategy of use_latest or use_earliest or min_grade, before they tried to start a (permitted) new session on the same flow. If they confirmed, then they can restart the new session.

The function is needed since I can't figure out how to show the grade_aggregation_strategy to students without modifying your code, and have to type the warning information in the description while most of the time they will just neglect it.

Feature request: Tabular form to grade HumanGradedTextQuestion submissions in bulk

Maybe also obscuring student names for objectivity. May also be shuffled.

Instructor should see the table of submitted ungraded answers and be able to quickly fill in grades with keyboard (typing grades interleaved with Tab or Enter).

A page should correspond to individual question.

Grading page for question idquest1 from flow idflow1

---
What is a foo?

---
like bar                     | 30%
foo, bar, widget             | 40%
generic name                 | 50%
A metasyntactic variable.    | 100%
don't know                   | 0%
something                    | <typing here>
whatever                     |

---
[Submit]

How to determine the offset (date or week) of a course?

If I am not wrong, using if_before: end_week N is easy to run a course by adding further modifiers without manual adjust the date/time rule in ISO-formatted dates/time format. So, if the offset (starting date/time) of the course is set, then other time is determined. However, I can't find in documentations about the setting the offset variable in course.yaml.

Confused with expiration mode of a flow

I see there's a permission set_roll_over_expiration_mode in access_rules of a flow. If granted, student can select the expiration mode of a session when expired. The two choices are End session and grade and Keep session and apply new rules. I can see when the latter choice is chosen, the grade rule change accordingly. However, if the former (End session and grade) is chosen, the session is still in-progress and not graded when expired (using fake time), and it act just like the roll-over mode. Am I misunderstood your purpose, or is there any wrong with my configuration?

rules:
  start:
    -
      if_before: homework_due 11
      if_has_role: [student, ta, instructor]
      if_has_fewer_sessions_than: 100
      may_start_new_session: True
      may_list_existing_sessions: True

    -
      may_start_new_session: True
      may_list_existing_sessions: True

  access:
     -
       if_before: homework_due 8
       permissions: [view, submit_answer, end_session, see_correctness, set_roll_over_expiration_mode]

     -
       if_before: homework_due 9
       permissions: [view, submit_answer, end_session, see_correctness, set_roll_over_expiration_mode]

     -
       if_before: homework_due 10
       permissions: [view, submit_answer, end_session, see_correctness, set_roll_over_expiration_mode]

     -
       if_before: homework_due 11
       permissions: [view, submit_answer, end_session, see_correctness, set_roll_over_expiration_mode]

     -
       permissions: [view, see_correctness]

  grading:
    -
      if_completed_before: homework_due 8
      due: homework_due 8
      grade_identifier: word4test
      grade_aggregation_strategy: use_latest
      credit_percent: 110

    -
      if_completed_before: homework_due 9
      due: homework_due 9
      grade_identifier: word4test
      grade_aggregation_strategy: use_latest
      credit_percent: 100

    -
      if_completed_before: homework_due 10
      due: homework_due 10
      grade_identifier: word4test
      grade_aggregation_strategy: use_latest
      credit_percent: 70

    -
      if_completed_before: homework_due 11
      due: homework_due 11
      grade_identifier: word4test
      grade_aggregation_strategy: use_latest
      credit_percent: 30

    -
      grade_identifier: null



Add batch jobs

  • Grading/expiring can take long, it should be outside of the HTTP request cycle
  • repack should also be automated

KeyError at /course/demo/grant-exception/7/quiz-test/9/ when save exception granted

Exception Value: 'restrict_to_same_tag'

Exception Location: E:\git-trial\course\relate-upstream\course\views.py in grant_exception_stage_3, line 767

Environment:


Request Method: POST
Request URL: http://127.0.0.1:8000/course/demo/grant-exception/7/quiz-test/9/

Django Version: 1.8.1
Python Version: 2.7.6
Installed Applications:
('django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'course',
 'crispy_forms',
 'jsonfield',
 'bootstrap3_datetime',
 'djangobower')
Installed Middleware:
('django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware',
 'course.auth.ImpersonateMiddleware')


Traceback:
File "d:\Python27\lib\site-packages\django\core\handlers\base.py" in get_response
  132.                     response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "E:\git-trial\course\relate-upstream\course\utils.py" in wrapper
  434.         return f(pctx, *args, **kwargs)
File "d:\Python27\lib\site-packages\django\utils\decorators.py" in inner
  145.                     return func(*args, **kwargs)
File "E:\git-trial\course\relate-upstream\course\views.py" in grant_exception_stage_3
  767.             if (form.cleaned_data["restrict_to_same_tag"]

Exception Type: KeyError at /course/demo/grant-exception/7/quiz-test/9/
Exception Value: 'restrict_to_same_tag'

Implement exam tickets

The idea would be that when a student checks in for an exam, he is given a one-time password that (A) logs him into relate, and (B) directs them to the flow containing the exam.

@lukeolson

IDE-like interface

I know it's a time-consuming job to realize that, but using git/dulwich to validate/test a flow is cumbersome. I hope this can be a Todo in your plan.

Calendar seems not working properly

With the example your provided, alternative title, color and expected hyperlink are not rendered.

What's more, are students permitted to view the full calendar and the expected links although there's time rule for those content?

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.