From 5203ce57f2a08fe9aef8b97b569855fa9cd50ba4 Mon Sep 17 00:00:00 2001 From: ankitjavalkar Date: Tue, 6 Oct 2015 16:29:45 +0530 Subject: Clean setup procedure - Make corresponding app name changes in script - Change app name in setup.py - Minor changes in Readme, it is now split into quickstart & production - rename install script --- README.md | 220 +++++-------------------------------------------- README_production.md | 189 ++++++++++++++++++++++++++++++++++++++++++ setup.py | 6 +- yaksh/scripts/cli.py | 149 +++++++++++++++++++++++++++++++++ yaksh/scripts/yaksh.py | 147 --------------------------------- 5 files changed, 361 insertions(+), 350 deletions(-) create mode 100644 README_production.md create mode 100644 yaksh/scripts/cli.py delete mode 100644 yaksh/scripts/yaksh.py diff --git a/README.md b/README.md index 45c3e4f..edc4d33 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,8 @@ Yaksh ======== [![Build Status](https://travis-ci.org/FOSSEE/online_test.svg?branch=master)](https://travis-ci.org/FOSSEE/online_test) +This is a Quickstart guide to help users setup a trial instance. If you wish to deploy Yaksh in a production environment here is a [Production Deployment Guide] (https://github.com/FOSSEE/online_test/blob/master/README_production.md) + #### Introduction This project provides an "exam" app that lets users take an online @@ -29,22 +31,28 @@ Quick Start #### Installation 1. Install the yaksh + - For latest stable release - pip install yaksh + pip install yaksh + + - For the development version + + pip install git+https://github.com/FOSSEE/online_test.git 1. In the terminal run - yaksh create_demo [-p PATH] project_name - - ```project_name``` is the desired name of the django project - - PATH is an optional argument to specify where the django project will be installed + yaksh create_demo [-p PATH] [project_name] + - ```project_name``` is the desired name of the django project. + - In case a ```project_name``` is not specified, the project is initialised with the name ```yaksh_demo``` + - PATH is an optional flag to specify where the django project will be installed - If PATH is not provided, the project is created in the current directory 1. The script does the following; - 1. Creates a new django project called `projectname` - 1. Creates a new demo database - 1. Creates two users, test moderator and test examinee - 1. Loads demo questions - 1. Loads demo quiz + 1. Creates a new django project called `project_name` + 1. Creates a new demo database + 1. Creates two users, test moderator and test examinee + 1. Loads demo questions + 1. Loads demo quiz 1. Run: @@ -57,197 +65,9 @@ Quick Start 1. Open your browser and open the URL ```http://localhost:8000/exam``` 1. Login as a teacher to edit the quiz or as a student to take the quiz - Credentials: - - Student - Username: student | Password: student - - Teacher - Username: teacher | Password: teacher - -Production Deployment -====================== - -#### Pre-Requisite - - 1. Install dependencies using - pip install -r requirements.txt - 1. Install MySql Server - 1. Install Python MySql support - 1. Install Apache Server for deployment - -#### Configure MySql server - - 1. Create a database named ``yaksh`` by following the steps below - - $> mysql -u root -p - mysql> create database yaksh - - 1. Add a user named ```yaksh_user``` and give access to it on the database ```yaksh``` by following the steps below - - 1. mysql> grant usage on yaksh.* to yaksh_user@localhost identified by 'mysecretpassword'; - - 1. mysql> grant all privileges on yaksh.* to yaksh_user@localhost; - - 1. Add `DATABASE_PASSWORD = 'mysecretpassword'` and `DATABASE_USER = 'yaksh_user'` to online_test/settings.py - -To deploy this app follow the steps below: - - 1. Clone this repository and cd to the cloned repo. - git clone https://github.com/FOSSEE/online_test.git - - 1. Run: - python manage.py syncdb - - 1. Add questions by editing the "docs/sample_questions.py" or any other file in the same format and then run the following: - - python manage.py load_exam docs/sample_questions.py - - Note that you can supply multiple Python files as arguments and all of - those will be added to the database. - - 1. First run the python server provided. This ensures that the code is executed in a safe environment. Do this like so: - - $ sudo python yaksh/code_server.py - - Put this in the background once it has started since this will not - return back the prompt. It is important that the server be running - *before* students start attempting the exam. Using sudo is - necessary since the server is run as the user "nobody". This runs - on the ports configured in the settings.py file in the variable - "SERVER_PORTS". The "SERVER_TIMEOUT" also can be changed there. - This is the maximum time allowed to execute the submitted code. - Note that this will likely spawn multiple processes as "nobody" - depending on the number of server ports specified. - - 1. The ```wsgi.py``` script should make it - easy to deploy this using mod_wsgi. You will need to add a line of the form: - - WSGIScriptAlias / "/online_test/wsgi.py" - - to your apache.conf. For more details see the Django docs here: - - https://docs.djangoproject.com/en/1.6/howto/deployment/wsgi/ - - 1. Go to http://desired_host_or_ip:desired_port/admin - - 1. Login with your credentials and look at the questions and modify if - needed. Create a new Quiz, set the date and duration or - activate/deactivate the quiz. - - 1. Now ask users to login at: - - http://host:port/exam - - And you should be all set. - - 1. Note that the directory "output" will contain directories, one for each - user. Users can potentially write output into these that can be used - for checking later. - - 1. As Moderator user you can visit http://host/exam/monitor to view - results and user data interactively. You could also "grade" the - papers manually if needed. - - 1. You may dump the results and user data using the results2csv and - dump_user_data commands. - - 1. The file docs/sample_questions.py is a template that you can use for your own questions. - - 1. Sometimes you might be in the situation where you are not hosted as - "host.org/exam/" but as "host.org/foo/exam/" for whatever reason. In - this case edit "settings.py" and set the "URL_ROOT" to the root you - have to serve at. In the above example for "host.org/foo/exam" set - URL_ROOT='/foo'. - -Development Settings -==================== - -To install this app follow the steps below: - - 1. Clone this repository and cd to the cloned repo. - ```git clone https://github.com/FOSSEE/online_test.git``` - - 1. Run: - - python manage.py syncdb - - 1. Add questions by editing the "docs/sample_questions.py" or any other file in the same format and then run the following: - - python manage.py load_exam docs/sample_questions.py - - Note that you can supply multiple Python files as arguments and all of - those will be added to the database. - - 1. First run the python server provided. This ensures that the code is executed in a safe environment. Do this like so: - - $ sudo python yaksh/code_server.py - - Put this in the background once it has started since this will not - return back the prompt. It is important that the server be running - *before* students start attempting the exam. Using sudo is - necessary since the server is run as the user "nobody". This runs - on the ports configured in the settings.py file in the variable - "SERVER_PORTS". The "SERVER_TIMEOUT" also can be changed there. - This is the maximum time allowed to execute the submitted code. - Note that this will likely spawn multiple processes as "nobody" - depending on the number of server ports specified. - - 1. Now, Run: - - python manage.py runserver : - - 1. Go to http://desired_host_or_ip:desired_port/admin - - 1. Login with your credentials and look at the questions and modify if - needed. Create a new Quiz, set the date and duration or - activate/deactivate the quiz. - - 1. Now ask users to login at: - - http://host:port/exam - - And you should be all set. - - 1. Note that the directory "output" will contain directories, one for each - user. Users can potentially write output into these that can be used - for checking later. - - 1. As admin user you can visit http://host/exam/monitor to view - results and user data interactively. You could also "grade" the - papers manually if needed. - - 1. You may dump the results and user data using the results2csv and - dump_user_data commands. - - 1. The file docs/sample_questions.py is a template that you can use for your own questions. - - 1. Sometimes you might be in the situation where you are not hosted as - "host.org/exam/" but as "host.org/foo/exam/" for whatever reason. In - this case edit "settings.py" and set the "URL_ROOT" to the root you - have to serve at. In the above example for "host.org/foo/exam" set - URL_ROOT='/foo'. - -Additional commands available -============================== - -We provide several convenient commands for you to use: - - - load_exam : load questions and a quiz from a python file. See - docs/sample_questions.py - - - load_questions_xml : load questions from XML file, see - docs/sample_questions.xml use of this is deprecated in favor of - load_exam. - - - results2csv : Dump the quiz results into a CSV file for further - processing. - - - dump_user_data : Dump out relevalt user data for either all users or - specified users. - -For more information on these do this: - - $ python manage.py help [command] - -where [command] is one of the above. - + Credentials: + - Student - Username: student | Password: student + - Teacher - Username: teacher | Password: teacher Inspiration =========== diff --git a/README_production.md b/README_production.md new file mode 100644 index 0000000..e7b99e1 --- /dev/null +++ b/README_production.md @@ -0,0 +1,189 @@ +Production Deployment +====================== + +This README provides documentation to help deploy Yaksh in a production environment. If you wish to take Yaksh on a trial run, here is a [Quickstart Guide] (https://github.com/FOSSEE/online_test/blob/master/README.md) + +#### Pre-Requisite + + 1. Ensure [pip](https://pip.pypa.io/en/latest/installing.html) is installed + 1. Install dependencies using + pip install -r requirements.txt + 1. Install MySql Server + 1. Install Python MySql support + 1. Install Apache Server for deployment + +#### Configure MySql server + + 1. Create a database named ``yaksh`` by following the steps below + + $> mysql -u root -p + mysql> create database yaksh + + 1. Add a user named ```yaksh_user``` and give access to it on the database ```yaksh``` by following the steps below + + 1. mysql> grant usage on yaksh.* to yaksh_user@localhost identified by 'mysecretpassword'; + + 1. mysql> grant all privileges on yaksh.* to yaksh_user@localhost; + + 1. Add `DATABASE_PASSWORD = 'mysecretpassword'` and `DATABASE_USER = 'yaksh_user'` to online_test/settings.py + +To deploy this app follow the steps below: + + 1. Clone this repository and cd to the cloned repo. + git clone https://github.com/FOSSEE/online_test.git + + 1. Run: + python manage.py syncdb + + 1. Add questions by editing the "docs/sample_questions.py" or any other file in the same format and then run the following: + + python manage.py load_exam docs/sample_questions.py + + Note that you can supply multiple Python files as arguments and all of + those will be added to the database. + + 1. First run the python server provided. This ensures that the code is executed in a safe environment. Do this like so: + + $ sudo python yaksh/code_server.py + + Put this in the background once it has started since this will not + return back the prompt. It is important that the server be running + *before* students start attempting the exam. Using sudo is + necessary since the server is run as the user "nobody". This runs + on the ports configured in the settings.py file in the variable + "SERVER_PORTS". The "SERVER_TIMEOUT" also can be changed there. + This is the maximum time allowed to execute the submitted code. + Note that this will likely spawn multiple processes as "nobody" + depending on the number of server ports specified. + + 1. The ```wsgi.py``` script should make it + easy to deploy this using mod_wsgi. You will need to add a line of the form: + + WSGIScriptAlias / "/online_test/wsgi.py" + + to your apache.conf. For more details see the Django docs here: + + https://docs.djangoproject.com/en/1.6/howto/deployment/wsgi/ + + 1. Go to http://desired_host_or_ip:desired_port/admin + + 1. Login with your credentials and look at the questions and modify if + needed. Create a new Quiz, set the date and duration or + activate/deactivate the quiz. + + 1. Now ask users to login at: + + http://host:port/exam + + And you should be all set. + + 1. Note that the directory "output" will contain directories, one for each + user. Users can potentially write output into these that can be used + for checking later. + + 1. As Moderator user you can visit http://host/exam/monitor to view + results and user data interactively. You could also "grade" the + papers manually if needed. + + 1. You may dump the results and user data using the results2csv and + dump_user_data commands. + + 1. The file docs/sample_questions.py is a template that you can use for your own questions. + + 1. Sometimes you might be in the situation where you are not hosted as + "host.org/exam/" but as "host.org/foo/exam/" for whatever reason. In + this case edit "settings.py" and set the "URL_ROOT" to the root you + have to serve at. In the above example for "host.org/foo/exam" set + URL_ROOT='/foo'. + +Development Settings +==================== + +To install this app follow the steps below: + + 1. Clone this repository and cd to the cloned repo. + ```git clone https://github.com/FOSSEE/online_test.git``` + + 1. Run: + + python manage.py syncdb + + 1. Add questions by editing the "docs/sample_questions.py" or any other file in the same format and then run the following: + + python manage.py load_exam docs/sample_questions.py + + Note that you can supply multiple Python files as arguments and all of + those will be added to the database. + + 1. First run the python server provided. This ensures that the code is executed in a safe environment. Do this like so: + + $ sudo python yaksh/code_server.py + + Put this in the background once it has started since this will not + return back the prompt. It is important that the server be running + *before* students start attempting the exam. Using sudo is + necessary since the server is run as the user "nobody". This runs + on the ports configured in the settings.py file in the variable + "SERVER_PORTS". The "SERVER_TIMEOUT" also can be changed there. + This is the maximum time allowed to execute the submitted code. + Note that this will likely spawn multiple processes as "nobody" + depending on the number of server ports specified. + + 1. Now, Run: + + python manage.py runserver : + + 1. Go to http://desired_host_or_ip:desired_port/admin + + 1. Login with your credentials and look at the questions and modify if + needed. Create a new Quiz, set the date and duration or + activate/deactivate the quiz. + + 1. Now ask users to login at: + + http://host:port/exam + + And you should be all set. + + 1. Note that the directory "output" will contain directories, one for each + user. Users can potentially write output into these that can be used + for checking later. + + 1. As admin user you can visit http://host/exam/monitor to view + results and user data interactively. You could also "grade" the + papers manually if needed. + + 1. You may dump the results and user data using the results2csv and + dump_user_data commands. + + 1. The file docs/sample_questions.py is a template that you can use for your own questions. + + 1. Sometimes you might be in the situation where you are not hosted as + "host.org/exam/" but as "host.org/foo/exam/" for whatever reason. In + this case edit "settings.py" and set the "URL_ROOT" to the root you + have to serve at. In the above example for "host.org/foo/exam" set + URL_ROOT='/foo'. + +Additional commands available +============================== + +We provide several convenient commands for you to use: + + - load_exam : load questions and a quiz from a python file. See + docs/sample_questions.py + + - load_questions_xml : load questions from XML file, see + docs/sample_questions.xml use of this is deprecated in favor of + load_exam. + + - results2csv : Dump the quiz results into a CSV file for further + processing. + + - dump_user_data : Dump out relevalt user data for either all users or + specified users. + +For more information on these do this: + + $ python manage.py help [command] + +where [command] is one of the above. diff --git a/setup.py b/setup.py index 839607e..45227d1 100644 --- a/setup.py +++ b/setup.py @@ -7,8 +7,8 @@ README = open(os.path.join(os.path.dirname(__file__), 'README.md')).read() os.chdir(os.path.normpath(os.path.join(os.path.abspath(__file__), os.pardir))) setup( - name='django-exam', - author='python team at IIT Bombay', + name='yaksh', + author='Python Team, IIT Bombay', author_email='python@fossee.in', version='0.1', packages=find_packages(), @@ -16,7 +16,7 @@ setup( license='BSD License', entry_points = { 'console_scripts': [ - 'yaksh = yaksh.scripts.yaksh:main', + 'yaksh = yaksh.scripts.cli:main', ], }, description='A django app to conduct online tests.', diff --git a/yaksh/scripts/cli.py b/yaksh/scripts/cli.py new file mode 100644 index 0000000..5ad5ad6 --- /dev/null +++ b/yaksh/scripts/cli.py @@ -0,0 +1,149 @@ +from __future__ import print_function + +import subprocess +import contextlib +import os +from os import path +import argparse +from importlib import import_module +from django.conf import settings +from django.core import management +from django.template import Template, Context, loader + +from project_detail import NAME, PATH + +CUR_DIR = os.getcwd() +SCRIPT_DIR = os.path.abspath(os.path.dirname(__file__)) +PARENT_DIR = os.path.abspath(os.path.join(SCRIPT_DIR, os.pardir)) +TEMPLATE_DIR = path.join(PARENT_DIR, 'demo_templates') + +def main(): + #Parse command-line to obtain the arguments and/or options + # create top-level parser object + parser = argparse.ArgumentParser(prog="yaksh") + subparser = parser.add_subparsers(dest="subcommand") + + # create parser for the "create_demo" subcommand + create_demo_parser = subparser.add_parser("create_demo", + help="Create a new demo Django project") + create_demo_parser.add_argument("project_name", type=str, + default="yaksh_demo", + nargs="?", + help="name of demo Django project") + create_demo_parser.add_argument("-p", "--path", type=str, + help="path of demo Django project") + + # create parser for the "run_demo" subcommand + run_demo_parser = subparser.add_parser("run_demo", + help="Initialise django server and run the demo project") + + # create parser for the "run_code_server" subcommand + code_server_parser = subparser.add_parser("run_code_server", + help="Initialise yaksh code server") + code_server_parser.add_argument("-P", "--ports", type=int, nargs='+', + help="code server ports") + + args = parser.parse_args() + + if args.subcommand == "create_demo": + if args.path: + create_demo(args.project_name, args.path) + else: + create_demo(args.project_name) + + elif args.subcommand == "run_demo": + try: + run_demo(NAME, PATH) + except Exception as e: + if not NAME or not PATH: + print("Error: Unable to find Project Name or Path variables\n") + else: + print("Error: {0}\n".format(e)) + subparser.print_help() + + elif args.subcommand == "run_code_server": + if args.ports: + run_server(args.ports) + else: + run_server() + +def create_demo(project_name='yaksh_demo', project_dir=CUR_DIR): + try: + management.call_command('startproject', project_name, project_dir) + print("Demo Django project '{0}' created at '{1}'".format(project_name, + project_dir)) + except Exception, e: + print("Error: {0}\nExiting yaksh Installer".format(e)) + + if project_dir is None: + top_dir = path.join(os.getcwd(), project_name) + else: + top_dir = project_dir + + project_path = path.join(top_dir, project_name) + fixture_dir = path.join(PARENT_DIR, 'fixtures') + # Store project details + _set_project_details(project_name, top_dir) + + with _chdir(project_path): + root_urlconf = "{0}.{1}".format(project_name, 'demo_urls') + settings_template_path = path.join(TEMPLATE_DIR, 'demo_settings.py') + settings_target_path = path.join(project_path, 'demo_settings.py') + settings_context = Context({'project_name': project_name, + 'root_urlconf': root_urlconf, + 'fixture_dir': fixture_dir}) + urls_template_path = path.join(TEMPLATE_DIR, 'demo_urls.py') + urls_target_path = path.join(project_path, 'demo_urls.py') + command = ("python ../manage.py syncdb " + "--noinput --settings={0}.demo_settings").format(project_name) + + # Create demo_settings file + _render_demo_files(settings_template_path, settings_target_path, settings_context) + # Create demo_urls file + _render_demo_files(urls_template_path, urls_target_path) + # Run syncdb + subprocess.call(command, shell=True) + +def run_demo(project_name, top_dir): + with _chdir(top_dir): + project_path = path.join(top_dir, 'manage.py') + command = ("python manage.py runserver " + "--settings={0}.demo_settings").format(project_name) + subprocess.call(command, shell=True) + +def run_server(): + # try: + from yaksh import code_server + code_server.main() + # except Exception as e: + print("Error: {0}\nExiting yaksh code server".format(e)) + +def _set_project_details(project_name, top_dir): + file_path = path.join(SCRIPT_DIR, 'project_detail.py') + detail = "NAME ='{0}'\nPATH ='{1}'".format(project_name, top_dir) + with open(file_path, 'w') as data_store: + data_store.write(detail) + +def _render_demo_files(template_path, output_path, context=None): + with open(template_path, 'r') as template_file: + content = template_file.read() + if context: + content = content.decode('utf-8') + template = Template(content) + content = template.render(context) + content = content.encode('utf-8') + + with open(output_path, 'w') as new_file: + new_file.write(content) + +@contextlib.contextmanager +def _chdir(path): + starting_directory = os.getcwd() + try: + os.chdir(path) + yield + finally: + os.chdir(starting_directory) + +if __name__ == '__main__': + main() diff --git a/yaksh/scripts/yaksh.py b/yaksh/scripts/yaksh.py deleted file mode 100644 index 4360d1b..0000000 --- a/yaksh/scripts/yaksh.py +++ /dev/null @@ -1,147 +0,0 @@ -from __future__ import print_function - -import subprocess -import contextlib -import os -from os import path -import argparse -from importlib import import_module -from django.conf import settings -from django.core import management -from django.template import Template, Context, loader - -from project_detail import NAME, PATH - -CUR_DIR = os.getcwd() -SCRIPT_DIR = os.path.abspath(os.path.dirname(__file__)) -PARENT_DIR = os.path.abspath(os.path.join(SCRIPT_DIR, os.pardir)) -TEMPLATE_DIR = path.join(PARENT_DIR, 'demo_templates') - -def main(): - #Parse command-line to obtain the arguments and/or options - # create top-level parser object - parser = argparse.ArgumentParser(prog="vimarsh") - subparser = parser.add_subparsers(dest="subcommand") - - # create parser for the "create_demo" subcommand - create_demo_parser = subparser.add_parser("create_demo", - help="Create a new demo Django project") - create_demo_parser.add_argument("project_name", type=str, - help="name of demo Django project") - create_demo_parser.add_argument("-p", "--path", type=str, - help="path of demo Django project") - - # create parser for the "run_demo" subcommand - run_demo_parser = subparser.add_parser("run_demo", - help="Initialise django server and run the demo project") - - # create parser for the "run_code_server" subcommand - code_server_parser = subparser.add_parser("run_code_server", - help="Initialise Vimarsh code server") - code_server_parser.add_argument("-P", "--ports", type=int, nargs='+', - help="code server ports") - - args = parser.parse_args() - - if args.subcommand == "create_demo": - if args.path: - create_demo(args.project_name, args.path) - else: - create_demo(args.project_name) - - elif args.subcommand == "run_demo": - try: - run_demo(NAME, PATH) - except Exception as e: - if not NAME or not PATH: - print("Error: Unable to find Project Name or Path variables\n") - else: - print("Error: {0}\n".format(e)) - subparser.print_help() - - elif args.subcommand == "run_code_server": - if args.ports: - run_server(args.ports) - else: - run_server() - -def create_demo(project_name='vimarsh_demo', project_dir=CUR_DIR): - try: - management.call_command('startproject', project_name, project_dir) - print("Demo Django project '{0}' created at '{1}'".format(project_name, - project_dir)) - except Exception, e: - print("Error: {0}\nExiting Vimarsh Installer".format(e)) - - if project_dir is None: - top_dir = path.join(os.getcwd(), project_name) - else: - top_dir = project_dir - - project_path = path.join(top_dir, project_name) - fixture_dir = path.join(PARENT_DIR, 'fixtures') - # Store project details - _set_project_details(project_name, top_dir) - - with _chdir(project_path): - root_urlconf = "{0}.{1}".format(project_name, 'demo_urls') - settings_template_path = path.join(TEMPLATE_DIR, 'demo_settings.py') - settings_target_path = path.join(project_path, 'demo_settings.py') - settings_context = Context({'project_name': project_name, - 'root_urlconf': root_urlconf, - 'fixture_dir': fixture_dir}) - urls_template_path = path.join(TEMPLATE_DIR, 'demo_urls.py') - urls_target_path = path.join(project_path, 'demo_urls.py') - command = ("python ../manage.py syncdb " - "--noinput --settings={0}.demo_settings").format(project_name) - - # Create demo_settings file - _render_demo_files(settings_template_path, settings_target_path, settings_context) - # Create demo_urls file - _render_demo_files(urls_template_path, urls_target_path) - # Run syncdb - subprocess.call(command, shell=True) - -def run_demo(project_name, top_dir): - with _chdir(top_dir): - project_path = path.join(top_dir, 'manage.py') - command = ("python manage.py runserver " - "--settings={0}.demo_settings").format(project_name) - subprocess.call(command, shell=True) - -def run_server(): - try: - from yaksh import code_server - code_server.main() - except Exception as e: - print("Error: {0}\nExiting Vimarsh code server".format(e)) - -def _set_project_details(project_name, top_dir): - file_path = path.join(SCRIPT_DIR, 'project_detail.py') - detail = "NAME ='{0}'\nPATH ='{1}'".format(project_name, top_dir) - with open(file_path, 'w') as data_store: - data_store.write(detail) - -def _render_demo_files(template_path, output_path, context=None): - with open(template_path, 'r') as template_file: - content = template_file.read() - if context: - content = content.decode('utf-8') - template = Template(content) - content = template.render(context) - content = content.encode('utf-8') - - with open(output_path, 'w') as new_file: - new_file.write(content) - -@contextlib.contextmanager -def _chdir(path): - starting_directory = os.getcwd() - try: - os.chdir(path) - yield - finally: - os.chdir(starting_directory) - -if __name__ == '__main__': - main() -- cgit From 81393bfd4581b3f2217a979aaffec999c89d6755 Mon Sep 17 00:00:00 2001 From: ankitjavalkar Date: Wed, 7 Oct 2015 17:21:25 +0530 Subject: Modify fixtures and load them on quickstart --- README.md | 11 +++++++---- README_production.md | 4 ++-- yaksh/docs/sample_questions.py | 6 +++--- yaksh/fixtures/initial_fixtures.json | 2 +- yaksh/scripts/cli.py | 5 ++++- 5 files changed, 17 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index edc4d33..ed19e16 100644 --- a/README.md +++ b/README.md @@ -33,11 +33,11 @@ Quick Start 1. Install the yaksh - For latest stable release - pip install yaksh + $ pip install yaksh - For the development version - pip install git+https://github.com/FOSSEE/online_test.git + $ pip install git+https://github.com/FOSSEE/online_test.git 1. In the terminal run @@ -56,11 +56,11 @@ Quick Start 1. Run: - yaksh run_demo + $ yaksh run_demo 1. In a new terminal run: - sudo yaksh run_code_server + $ sudo yaksh run_code_server 1. Open your browser and open the URL ```http://localhost:8000/exam``` @@ -69,6 +69,9 @@ Quick Start - Student - Username: student | Password: student - Teacher - Username: teacher | Password: teacher +1. User can also login to the Default Django admin using; + - Admin - Username: admin | Password: admin + Inspiration =========== diff --git a/README_production.md b/README_production.md index e7b99e1..c693282 100644 --- a/README_production.md +++ b/README_production.md @@ -30,7 +30,7 @@ This README provides documentation to help deploy Yaksh in a production environm To deploy this app follow the steps below: 1. Clone this repository and cd to the cloned repo. - git clone https://github.com/FOSSEE/online_test.git + $ git clone https://github.com/FOSSEE/online_test.git 1. Run: python manage.py syncdb @@ -102,7 +102,7 @@ Development Settings To install this app follow the steps below: 1. Clone this repository and cd to the cloned repo. - ```git clone https://github.com/FOSSEE/online_test.git``` + ```$ git clone https://github.com/FOSSEE/online_test.git``` 1. Run: diff --git a/yaksh/docs/sample_questions.py b/yaksh/docs/sample_questions.py index 60f32cb..3f0c36e 100644 --- a/yaksh/docs/sample_questions.py +++ b/yaksh/docs/sample_questions.py @@ -78,7 +78,7 @@ None of the above ] #list of questions ends here -quiz = Quiz(start_date=date.today(), - duration=10, - description='Basic Python Quiz 1' +quiz = Quiz(duration=10, + description='Basic Python Quiz 1', + time_between_attempts=0 ) diff --git a/yaksh/fixtures/initial_fixtures.json b/yaksh/fixtures/initial_fixtures.json index e16b09f..6c4de83 100644 --- a/yaksh/fixtures/initial_fixtures.json +++ b/yaksh/fixtures/initial_fixtures.json @@ -1 +1 @@ -[{"pk": 1, "model": "contenttypes.contenttype", "fields": {"model": "logentry", "name": "log entry", "app_label": "admin"}}, {"pk": 2, "model": "contenttypes.contenttype", "fields": {"model": "permission", "name": "permission", "app_label": "auth"}}, {"pk": 3, "model": "contenttypes.contenttype", "fields": {"model": "group", "name": "group", "app_label": "auth"}}, {"pk": 4, "model": "contenttypes.contenttype", "fields": {"model": "user", "name": "user", "app_label": "auth"}}, {"pk": 5, "model": "contenttypes.contenttype", "fields": {"model": "contenttype", "name": "content type", "app_label": "contenttypes"}}, {"pk": 6, "model": "contenttypes.contenttype", "fields": {"model": "session", "name": "session", "app_label": "sessions"}}, {"pk": 7, "model": "contenttypes.contenttype", "fields": {"model": "profile", "name": "profile", "app_label": "exam"}}, {"pk": 8, "model": "contenttypes.contenttype", "fields": {"model": "question", "name": "question", "app_label": "exam"}}, {"pk": 9, "model": "contenttypes.contenttype", "fields": {"model": "answer", "name": "answer", "app_label": "exam"}}, {"pk": 10, "model": "contenttypes.contenttype", "fields": {"model": "quiz", "name": "quiz", "app_label": "exam"}}, {"pk": 11, "model": "contenttypes.contenttype", "fields": {"model": "questionpaper", "name": "question paper", "app_label": "exam"}}, {"pk": 12, "model": "contenttypes.contenttype", "fields": {"model": "questionset", "name": "question set", "app_label": "exam"}}, {"pk": 13, "model": "contenttypes.contenttype", "fields": {"model": "answerpaper", "name": "answer paper", "app_label": "exam"}}, {"pk": 14, "model": "contenttypes.contenttype", "fields": {"model": "assignmentupload", "name": "assignment upload", "app_label": "exam"}}, {"pk": 15, "model": "contenttypes.contenttype", "fields": {"model": "testcase", "name": "test case", "app_label": "exam"}}, {"pk": 16, "model": "contenttypes.contenttype", "fields": {"model": "tag", "name": "Tag", "app_label": "taggit"}}, {"pk": 17, "model": "contenttypes.contenttype", "fields": {"model": "taggeditem", "name": "Tagged Item", "app_label": "taggit"}}, {"pk": "3tcbtzy1umsaf1zesqbsprjm2bw7w1gi", "model": "sessions.session", "fields": {"expire_date": "2015-07-08T12:52:42.395", "session_data": "ZjM0OGNlZmQxYzgzM2U4ZGJlNGZkYzE3MDdmYzY5NDMzMmVlMzdmYjp7Il9hdXRoX3VzZXJfYmFja2VuZCI6ImRqYW5nby5jb250cmliLmF1dGguYmFja2VuZHMuTW9kZWxCYWNrZW5kIiwiX2F1dGhfdXNlcl9pZCI6MX0="}}, {"pk": 1, "model": "exam.question", "fields": {"ref_code_path": "", "description": "\r\nWrite a function called fact which takes a single integer argument\r\n(say n) and returns the factorial of the number. \r\nFor example:
\r\nfact(3) -> 6\r\n", "language": "python", "summary": "Factorial", "snippet": "def fact(num):", "active": true, "points": 2.0, "test": "assert fact(0) == 1\r\nassert fact(5) == 120", "type": "code", "options": ""}}, {"pk": 2, "model": "exam.question", "fields": {"ref_code_path": "", "description": "Create a simple function called sqr which takes a single \r\nargument and returns the square of the argument. For example:
\r\nsqr(3) -> 9.", "language": "python", "summary": "Simple function", "snippet": "def sqr(num):", "active": true, "points": 1.0, "test": "import math\r\nassert sqr(3) == 9\r\nassert abs(sqr(math.sqrt(2)) - 2.0) < 1e-14", "type": "code", "options": ""}}, {"pk": 3, "model": "exam.question", "fields": {"ref_code_path": "docs/sample.sh, docs/sample.args", "description": "Write a shell script which takes two arguments on the\r\n command line and prints the sum of the two on the output.", "language": "bash", "summary": "Bash addition", "snippet": "#!/bin/bash", "active": true, "points": 2.0, "test": "", "type": "code", "options": ""}}, {"pk": 4, "model": "exam.question", "fields": {"ref_code_path": "", "description": "What is the largest integer value that can be represented\r\nin Python?", "language": "python", "summary": "Size of integer in Python", "snippet": "", "active": true, "points": 0.5, "test": "No Limit", "type": "mcq", "options": "No Limit\r\n2**32\r\n2**32 - 1\r\nNone of the above\r\n"}}, {"pk": 1, "model": "exam.quiz", "fields": {"description": "Demo Quiz", "language": "C", "time_between_attempts": 0, "pass_criteria": 2.0, "active": true, "attempts_allowed": -1, "duration": 30, "start_date": "2015-06-24", "prerequisite": null}}, {"pk": 1, "model": "exam.questionpaper", "fields": {"shuffle_questions": true, "total_marks": 5.5, "fixed_questions": [1, 2, 3, 4], "random_questions": [], "quiz": 1}}, {"pk": 1, "model": "taggit.tag", "fields": {"name": "Python", "slug": "python"}}, {"pk": 2, "model": "taggit.tag", "fields": {"name": "function", "slug": "function"}}, {"pk": 3, "model": "taggit.tag", "fields": {"name": "factorial", "slug": "factorial"}}, {"pk": 4, "model": "taggit.tag", "fields": {"name": "", "slug": ""}}, {"pk": 5, "model": "taggit.tag", "fields": {"name": "mcq", "slug": "mcq"}}, {"pk": 8, "model": "taggit.taggeditem", "fields": {"tag": 1, "content_type": 8, "object_id": 1}}, {"pk": 9, "model": "taggit.taggeditem", "fields": {"tag": 2, "content_type": 8, "object_id": 1}}, {"pk": 10, "model": "taggit.taggeditem", "fields": {"tag": 3, "content_type": 8, "object_id": 1}}, {"pk": 11, "model": "taggit.taggeditem", "fields": {"tag": 1, "content_type": 8, "object_id": 2}}, {"pk": 12, "model": "taggit.taggeditem", "fields": {"tag": 2, "content_type": 8, "object_id": 2}}, {"pk": 13, "model": "taggit.taggeditem", "fields": {"tag": 5, "content_type": 8, "object_id": 4}}, {"pk": 1, "model": "auth.permission", "fields": {"codename": "add_logentry", "name": "Can add log entry", "content_type": 1}}, {"pk": 2, "model": "auth.permission", "fields": {"codename": "change_logentry", "name": "Can change log entry", "content_type": 1}}, {"pk": 3, "model": "auth.permission", "fields": {"codename": "delete_logentry", "name": "Can delete log entry", "content_type": 1}}, {"pk": 4, "model": "auth.permission", "fields": {"codename": "add_permission", "name": "Can add permission", "content_type": 2}}, {"pk": 5, "model": "auth.permission", "fields": {"codename": "change_permission", "name": "Can change permission", "content_type": 2}}, {"pk": 6, "model": "auth.permission", "fields": {"codename": "delete_permission", "name": "Can delete permission", "content_type": 2}}, {"pk": 7, "model": "auth.permission", "fields": {"codename": "add_group", "name": "Can add group", "content_type": 3}}, {"pk": 8, "model": "auth.permission", "fields": {"codename": "change_group", "name": "Can change group", "content_type": 3}}, {"pk": 9, "model": "auth.permission", "fields": {"codename": "delete_group", "name": "Can delete group", "content_type": 3}}, {"pk": 10, "model": "auth.permission", "fields": {"codename": "add_user", "name": "Can add user", "content_type": 4}}, {"pk": 11, "model": "auth.permission", "fields": {"codename": "change_user", "name": "Can change user", "content_type": 4}}, {"pk": 12, "model": "auth.permission", "fields": {"codename": "delete_user", "name": "Can delete user", "content_type": 4}}, {"pk": 13, "model": "auth.permission", "fields": {"codename": "add_contenttype", "name": "Can add content type", "content_type": 5}}, {"pk": 14, "model": "auth.permission", "fields": {"codename": "change_contenttype", "name": "Can change content type", "content_type": 5}}, {"pk": 15, "model": "auth.permission", "fields": {"codename": "delete_contenttype", "name": "Can delete content type", "content_type": 5}}, {"pk": 16, "model": "auth.permission", "fields": {"codename": "add_session", "name": "Can add session", "content_type": 6}}, {"pk": 17, "model": "auth.permission", "fields": {"codename": "change_session", "name": "Can change session", "content_type": 6}}, {"pk": 18, "model": "auth.permission", "fields": {"codename": "delete_session", "name": "Can delete session", "content_type": 6}}, {"pk": 19, "model": "auth.permission", "fields": {"codename": "add_profile", "name": "Can add profile", "content_type": 7}}, {"pk": 20, "model": "auth.permission", "fields": {"codename": "change_profile", "name": "Can change profile", "content_type": 7}}, {"pk": 21, "model": "auth.permission", "fields": {"codename": "delete_profile", "name": "Can delete profile", "content_type": 7}}, {"pk": 22, "model": "auth.permission", "fields": {"codename": "add_question", "name": "Can add question", "content_type": 8}}, {"pk": 23, "model": "auth.permission", "fields": {"codename": "change_question", "name": "Can change question", "content_type": 8}}, {"pk": 24, "model": "auth.permission", "fields": {"codename": "delete_question", "name": "Can delete question", "content_type": 8}}, {"pk": 25, "model": "auth.permission", "fields": {"codename": "add_answer", "name": "Can add answer", "content_type": 9}}, {"pk": 26, "model": "auth.permission", "fields": {"codename": "change_answer", "name": "Can change answer", "content_type": 9}}, {"pk": 27, "model": "auth.permission", "fields": {"codename": "delete_answer", "name": "Can delete answer", "content_type": 9}}, {"pk": 28, "model": "auth.permission", "fields": {"codename": "add_quiz", "name": "Can add quiz", "content_type": 10}}, {"pk": 29, "model": "auth.permission", "fields": {"codename": "change_quiz", "name": "Can change quiz", "content_type": 10}}, {"pk": 30, "model": "auth.permission", "fields": {"codename": "delete_quiz", "name": "Can delete quiz", "content_type": 10}}, {"pk": 31, "model": "auth.permission", "fields": {"codename": "add_questionpaper", "name": "Can add question paper", "content_type": 11}}, {"pk": 32, "model": "auth.permission", "fields": {"codename": "change_questionpaper", "name": "Can change question paper", "content_type": 11}}, {"pk": 33, "model": "auth.permission", "fields": {"codename": "delete_questionpaper", "name": "Can delete question paper", "content_type": 11}}, {"pk": 34, "model": "auth.permission", "fields": {"codename": "add_questionset", "name": "Can add question set", "content_type": 12}}, {"pk": 35, "model": "auth.permission", "fields": {"codename": "change_questionset", "name": "Can change question set", "content_type": 12}}, {"pk": 36, "model": "auth.permission", "fields": {"codename": "delete_questionset", "name": "Can delete question set", "content_type": 12}}, {"pk": 37, "model": "auth.permission", "fields": {"codename": "add_answerpaper", "name": "Can add answer paper", "content_type": 13}}, {"pk": 38, "model": "auth.permission", "fields": {"codename": "change_answerpaper", "name": "Can change answer paper", "content_type": 13}}, {"pk": 39, "model": "auth.permission", "fields": {"codename": "delete_answerpaper", "name": "Can delete answer paper", "content_type": 13}}, {"pk": 40, "model": "auth.permission", "fields": {"codename": "add_assignmentupload", "name": "Can add assignment upload", "content_type": 14}}, {"pk": 41, "model": "auth.permission", "fields": {"codename": "change_assignmentupload", "name": "Can change assignment upload", "content_type": 14}}, {"pk": 42, "model": "auth.permission", "fields": {"codename": "delete_assignmentupload", "name": "Can delete assignment upload", "content_type": 14}}, {"pk": 43, "model": "auth.permission", "fields": {"codename": "add_testcase", "name": "Can add test case", "content_type": 15}}, {"pk": 44, "model": "auth.permission", "fields": {"codename": "change_testcase", "name": "Can change test case", "content_type": 15}}, {"pk": 45, "model": "auth.permission", "fields": {"codename": "delete_testcase", "name": "Can delete test case", "content_type": 15}}, {"pk": 46, "model": "auth.permission", "fields": {"codename": "add_tag", "name": "Can add Tag", "content_type": 16}}, {"pk": 47, "model": "auth.permission", "fields": {"codename": "change_tag", "name": "Can change Tag", "content_type": 16}}, {"pk": 48, "model": "auth.permission", "fields": {"codename": "delete_tag", "name": "Can delete Tag", "content_type": 16}}, {"pk": 49, "model": "auth.permission", "fields": {"codename": "add_taggeditem", "name": "Can add Tagged Item", "content_type": 17}}, {"pk": 50, "model": "auth.permission", "fields": {"codename": "change_taggeditem", "name": "Can change Tagged Item", "content_type": 17}}, {"pk": 51, "model": "auth.permission", "fields": {"codename": "delete_taggeditem", "name": "Can delete Tagged Item", "content_type": 17}}, {"pk": 1, "model": "auth.group", "fields": {"name": "moderator", "permissions": [25, 26, 27, 37, 38, 39, 40, 41, 42, 19, 20, 21, 22, 23, 24, 31, 32, 33, 34, 35, 36, 28, 29, 30, 43, 44, 45]}}, {"pk": 1, "model": "auth.user", "fields": {"username": "admin", "first_name": "", "last_name": "", "is_active": true, "is_superuser": true, "is_staff": true, "last_login": "2015-06-24T12:52:42.246", "groups": [1], "user_permissions": [], "password": "pbkdf2_sha256$12000$cm9G5GLAN5TA$hmAKSYEUGjgicK/JJPYlB3BiROfv6FLJqhw/slAQIqU=", "email": "admin@admin.com", "date_joined": "2015-06-24T12:47:31"}}, {"pk": 2, "model": "auth.user", "fields": {"username": "teacher", "first_name": "Teacher", "last_name": "Demo", "is_active": true, "is_superuser": false, "is_staff": false, "last_login": "2015-06-24T12:50:42", "groups": [1], "user_permissions": [], "password": "pbkdf2_sha256$12000$RVSJsXu5jmkK$TfcRzV2LPFpEpv/shnlPG1CxWK6D6HovprqE+1neuqk=", "email": "teacher@teacher.com", "date_joined": "2015-06-24T12:50:40"}}, {"pk": 3, "model": "auth.user", "fields": {"username": "student", "first_name": "Student", "last_name": "Demo", "is_active": true, "is_superuser": false, "is_staff": false, "last_login": "2015-06-24T12:51:41.470", "groups": [], "user_permissions": [], "password": "pbkdf2_sha256$12000$jdwsvOoiB4UH$G+iAJR0nse50jxyNd+V/IATLrTra/FtaL+R1Uat0ewE=", "email": "student@student.com", "date_joined": "2015-06-24T12:51:40.477"}}, {"pk": 1, "model": "exam.profile", "fields": {"institute": "Teacher Institute", "department": "Teacher Department", "roll_number": "12345", "user": 2, "position": "Teacher"}}, {"pk": 2, "model": "exam.profile", "fields": {"institute": "Student Institute", "department": "Student Department", "roll_number": "54321", "user": 3, "position": "Student"}}, {"pk": 1, "model": "admin.logentry", "fields": {"action_flag": 1, "action_time": "2015-06-24T12:49:40.282", "object_repr": "moderator", "object_id": "1", "change_message": "", "user": 1, "content_type": 3}}, {"pk": 2, "model": "admin.logentry", "fields": {"action_flag": 2, "action_time": "2015-06-24T12:52:08.691", "object_repr": "admin", "object_id": "1", "change_message": "Changed groups.", "user": 1, "content_type": 4}}, {"pk": 3, "model": "admin.logentry", "fields": {"action_flag": 2, "action_time": "2015-06-24T12:52:17.144", "object_repr": "teacher", "object_id": "2", "change_message": "Changed groups.", "user": 1, "content_type": 4}}] \ No newline at end of file +[{"pk": 1, "model": "contenttypes.contenttype", "fields": {"model": "logentry", "name": "log entry", "app_label": "admin"}}, {"pk": 2, "model": "contenttypes.contenttype", "fields": {"model": "permission", "name": "permission", "app_label": "auth"}}, {"pk": 3, "model": "contenttypes.contenttype", "fields": {"model": "group", "name": "group", "app_label": "auth"}}, {"pk": 4, "model": "contenttypes.contenttype", "fields": {"model": "user", "name": "user", "app_label": "auth"}}, {"pk": 5, "model": "contenttypes.contenttype", "fields": {"model": "contenttype", "name": "content type", "app_label": "contenttypes"}}, {"pk": 6, "model": "contenttypes.contenttype", "fields": {"model": "session", "name": "session", "app_label": "sessions"}}, {"pk": 7, "model": "contenttypes.contenttype", "fields": {"model": "profile", "name": "profile", "app_label": "yaksh"}}, {"pk": 8, "model": "contenttypes.contenttype", "fields": {"model": "question", "name": "question", "app_label": "yaksh"}}, {"pk": 9, "model": "contenttypes.contenttype", "fields": {"model": "answer", "name": "answer", "app_label": "yaksh"}}, {"pk": 10, "model": "contenttypes.contenttype", "fields": {"model": "quiz", "name": "quiz", "app_label": "yaksh"}}, {"pk": 11, "model": "contenttypes.contenttype", "fields": {"model": "questionpaper", "name": "question paper", "app_label": "yaksh"}}, {"pk": 12, "model": "contenttypes.contenttype", "fields": {"model": "questionset", "name": "question set", "app_label": "yaksh"}}, {"pk": 13, "model": "contenttypes.contenttype", "fields": {"model": "answerpaper", "name": "answer paper", "app_label": "yaksh"}}, {"pk": 14, "model": "contenttypes.contenttype", "fields": {"model": "assignmentupload", "name": "assignment upload", "app_label": "yaksh"}}, {"pk": 15, "model": "contenttypes.contenttype", "fields": {"model": "testcase", "name": "test case", "app_label": "yaksh"}}, {"pk": 16, "model": "contenttypes.contenttype", "fields": {"model": "tag", "name": "Tag", "app_label": "taggit"}}, {"pk": 17, "model": "contenttypes.contenttype", "fields": {"model": "taggeditem", "name": "Tagged Item", "app_label": "taggit"}}, {"pk": "29hbrtmu40x48hmq1t4eihyu7dik6dvu", "model": "sessions.session", "fields": {"expire_date": "2015-10-21T11:14:15.908Z", "session_data": "YjY4Mjg0Yjg4ZGI3OTIxYjc5NTY5NmNkMTgyMTQ4MGRmOTViNDRmOTp7fQ=="}}, {"pk": "vfru0csbahmeg4tye0xk005rl79hrilt", "model": "sessions.session", "fields": {"expire_date": "2015-10-21T11:24:04.918Z", "session_data": "YjY4Mjg0Yjg4ZGI3OTIxYjc5NTY5NmNkMTgyMTQ4MGRmOTViNDRmOTp7fQ=="}}, {"pk": 1, "model": "auth.permission", "fields": {"codename": "add_logentry", "name": "Can add log entry", "content_type": 1}}, {"pk": 2, "model": "auth.permission", "fields": {"codename": "change_logentry", "name": "Can change log entry", "content_type": 1}}, {"pk": 3, "model": "auth.permission", "fields": {"codename": "delete_logentry", "name": "Can delete log entry", "content_type": 1}}, {"pk": 4, "model": "auth.permission", "fields": {"codename": "add_permission", "name": "Can add permission", "content_type": 2}}, {"pk": 5, "model": "auth.permission", "fields": {"codename": "change_permission", "name": "Can change permission", "content_type": 2}}, {"pk": 6, "model": "auth.permission", "fields": {"codename": "delete_permission", "name": "Can delete permission", "content_type": 2}}, {"pk": 7, "model": "auth.permission", "fields": {"codename": "add_group", "name": "Can add group", "content_type": 3}}, {"pk": 8, "model": "auth.permission", "fields": {"codename": "change_group", "name": "Can change group", "content_type": 3}}, {"pk": 9, "model": "auth.permission", "fields": {"codename": "delete_group", "name": "Can delete group", "content_type": 3}}, {"pk": 10, "model": "auth.permission", "fields": {"codename": "add_user", "name": "Can add user", "content_type": 4}}, {"pk": 11, "model": "auth.permission", "fields": {"codename": "change_user", "name": "Can change user", "content_type": 4}}, {"pk": 12, "model": "auth.permission", "fields": {"codename": "delete_user", "name": "Can delete user", "content_type": 4}}, {"pk": 13, "model": "auth.permission", "fields": {"codename": "add_contenttype", "name": "Can add content type", "content_type": 5}}, {"pk": 14, "model": "auth.permission", "fields": {"codename": "change_contenttype", "name": "Can change content type", "content_type": 5}}, {"pk": 15, "model": "auth.permission", "fields": {"codename": "delete_contenttype", "name": "Can delete content type", "content_type": 5}}, {"pk": 16, "model": "auth.permission", "fields": {"codename": "add_session", "name": "Can add session", "content_type": 6}}, {"pk": 17, "model": "auth.permission", "fields": {"codename": "change_session", "name": "Can change session", "content_type": 6}}, {"pk": 18, "model": "auth.permission", "fields": {"codename": "delete_session", "name": "Can delete session", "content_type": 6}}, {"pk": 19, "model": "auth.permission", "fields": {"codename": "add_profile", "name": "Can add profile", "content_type": 7}}, {"pk": 20, "model": "auth.permission", "fields": {"codename": "change_profile", "name": "Can change profile", "content_type": 7}}, {"pk": 21, "model": "auth.permission", "fields": {"codename": "delete_profile", "name": "Can delete profile", "content_type": 7}}, {"pk": 22, "model": "auth.permission", "fields": {"codename": "add_question", "name": "Can add question", "content_type": 8}}, {"pk": 23, "model": "auth.permission", "fields": {"codename": "change_question", "name": "Can change question", "content_type": 8}}, {"pk": 24, "model": "auth.permission", "fields": {"codename": "delete_question", "name": "Can delete question", "content_type": 8}}, {"pk": 25, "model": "auth.permission", "fields": {"codename": "add_answer", "name": "Can add answer", "content_type": 9}}, {"pk": 26, "model": "auth.permission", "fields": {"codename": "change_answer", "name": "Can change answer", "content_type": 9}}, {"pk": 27, "model": "auth.permission", "fields": {"codename": "delete_answer", "name": "Can delete answer", "content_type": 9}}, {"pk": 28, "model": "auth.permission", "fields": {"codename": "add_quiz", "name": "Can add quiz", "content_type": 10}}, {"pk": 29, "model": "auth.permission", "fields": {"codename": "change_quiz", "name": "Can change quiz", "content_type": 10}}, {"pk": 30, "model": "auth.permission", "fields": {"codename": "delete_quiz", "name": "Can delete quiz", "content_type": 10}}, {"pk": 31, "model": "auth.permission", "fields": {"codename": "add_questionpaper", "name": "Can add question paper", "content_type": 11}}, {"pk": 32, "model": "auth.permission", "fields": {"codename": "change_questionpaper", "name": "Can change question paper", "content_type": 11}}, {"pk": 33, "model": "auth.permission", "fields": {"codename": "delete_questionpaper", "name": "Can delete question paper", "content_type": 11}}, {"pk": 34, "model": "auth.permission", "fields": {"codename": "add_questionset", "name": "Can add question set", "content_type": 12}}, {"pk": 35, "model": "auth.permission", "fields": {"codename": "change_questionset", "name": "Can change question set", "content_type": 12}}, {"pk": 36, "model": "auth.permission", "fields": {"codename": "delete_questionset", "name": "Can delete question set", "content_type": 12}}, {"pk": 37, "model": "auth.permission", "fields": {"codename": "add_answerpaper", "name": "Can add answer paper", "content_type": 13}}, {"pk": 38, "model": "auth.permission", "fields": {"codename": "change_answerpaper", "name": "Can change answer paper", "content_type": 13}}, {"pk": 39, "model": "auth.permission", "fields": {"codename": "delete_answerpaper", "name": "Can delete answer paper", "content_type": 13}}, {"pk": 40, "model": "auth.permission", "fields": {"codename": "add_assignmentupload", "name": "Can add assignment upload", "content_type": 14}}, {"pk": 41, "model": "auth.permission", "fields": {"codename": "change_assignmentupload", "name": "Can change assignment upload", "content_type": 14}}, {"pk": 42, "model": "auth.permission", "fields": {"codename": "delete_assignmentupload", "name": "Can delete assignment upload", "content_type": 14}}, {"pk": 43, "model": "auth.permission", "fields": {"codename": "add_testcase", "name": "Can add test case", "content_type": 15}}, {"pk": 44, "model": "auth.permission", "fields": {"codename": "change_testcase", "name": "Can change test case", "content_type": 15}}, {"pk": 45, "model": "auth.permission", "fields": {"codename": "delete_testcase", "name": "Can delete test case", "content_type": 15}}, {"pk": 46, "model": "auth.permission", "fields": {"codename": "add_tag", "name": "Can add Tag", "content_type": 16}}, {"pk": 47, "model": "auth.permission", "fields": {"codename": "change_tag", "name": "Can change Tag", "content_type": 16}}, {"pk": 48, "model": "auth.permission", "fields": {"codename": "delete_tag", "name": "Can delete Tag", "content_type": 16}}, {"pk": 49, "model": "auth.permission", "fields": {"codename": "add_taggeditem", "name": "Can add Tagged Item", "content_type": 17}}, {"pk": 50, "model": "auth.permission", "fields": {"codename": "change_taggeditem", "name": "Can change Tagged Item", "content_type": 17}}, {"pk": 51, "model": "auth.permission", "fields": {"codename": "delete_taggeditem", "name": "Can delete Tagged Item", "content_type": 17}}, {"pk": 1, "model": "auth.group", "fields": {"name": "moderator", "permissions": [25, 26, 27, 37, 38, 39, 40, 41, 42, 19, 20, 21, 22, 23, 24, 31, 32, 33, 34, 35, 36, 28, 29, 30, 43, 44, 45]}}, {"pk": 1, "model": "auth.user", "fields": {"username": "admin", "first_name": "", "last_name": "", "is_active": true, "is_superuser": true, "is_staff": true, "last_login": "2015-10-07T11:19:03.122Z", "groups": [1], "user_permissions": [], "password": "pbkdf2_sha256$12000$ND54CY7Qx8S8$MVQhTt4bZIXmx5f3pIn8xH9BlVBrzUlznghT96wDkeQ=", "email": "admin@admin.xyz", "date_joined": "2015-10-07T11:11:52Z"}}, {"pk": 2, "model": "auth.user", "fields": {"username": "teacher", "first_name": "Teacher", "last_name": "Yaksh", "is_active": true, "is_superuser": false, "is_staff": false, "last_login": "2015-10-07T11:18:46.987Z", "groups": [1], "user_permissions": [], "password": "pbkdf2_sha256$12000$YxwWrXARBF8G$q3s41JrVpOZzqlj/Ds1cUUqOD/I179mFLCCajM4KlOg=", "email": "teacher@yaksh.xyz", "date_joined": "2015-10-07T11:15:17Z"}}, {"pk": 3, "model": "auth.user", "fields": {"username": "student", "first_name": "Student", "last_name": "Yaksh", "is_active": true, "is_superuser": false, "is_staff": false, "last_login": "2015-10-07T11:24:01.490Z", "groups": [], "user_permissions": [], "password": "pbkdf2_sha256$12000$eOkqQDZGGg0K$Q/sPrc9HD3QAmajpnQqfbPAwk66NQ/W+7hiNKMCBnIg=", "email": "student@yaksh.xyz", "date_joined": "2015-10-07T11:16:21.074Z"}}, {"pk": 1, "model": "admin.logentry", "fields": {"action_flag": 1, "action_time": "2015-10-07T11:17:09.533Z", "object_repr": "moderators", "object_id": "1", "change_message": "", "user": 1, "content_type": 3}}, {"pk": 2, "model": "admin.logentry", "fields": {"action_flag": 2, "action_time": "2015-10-07T11:18:09.352Z", "object_repr": "teacher", "object_id": "2", "change_message": "Changed groups.", "user": 1, "content_type": 4}}, {"pk": 3, "model": "admin.logentry", "fields": {"action_flag": 2, "action_time": "2015-10-07T11:18:17.993Z", "object_repr": "admin", "object_id": "1", "change_message": "Changed groups.", "user": 1, "content_type": 4}}, {"pk": 4, "model": "admin.logentry", "fields": {"action_flag": 2, "action_time": "2015-10-07T11:19:16.779Z", "object_repr": "moderator", "object_id": "1", "change_message": "Changed name.", "user": 1, "content_type": 3}}] \ No newline at end of file diff --git a/yaksh/scripts/cli.py b/yaksh/scripts/cli.py index 5ad5ad6..ecccada 100644 --- a/yaksh/scripts/cli.py +++ b/yaksh/scripts/cli.py @@ -82,6 +82,7 @@ def create_demo(project_name='yaksh_demo', project_dir=CUR_DIR): project_path = path.join(top_dir, project_name) fixture_dir = path.join(PARENT_DIR, 'fixtures') + fixture_path = path.join(fixture_dir, 'initial_fixtures.json') # Store project details _set_project_details(project_name, top_dir) @@ -97,12 +98,14 @@ def create_demo(project_name='yaksh_demo', project_dir=CUR_DIR): command = ("python ../manage.py syncdb " "--noinput --settings={0}.demo_settings").format(project_name) + loaddata_command = "python ../manage.py loaddata {0} ".format(fixture_path) + # Create demo_settings file _render_demo_files(settings_template_path, settings_target_path, settings_context) # Create demo_urls file _render_demo_files(urls_template_path, urls_target_path) # Run syncdb - subprocess.call(command, shell=True) + subprocess.call("{0}; {1}".format(command, loaddata_command), shell=True) def run_demo(project_name, top_dir): with _chdir(top_dir): -- cgit From d56bd4e6fc72fc03438280db184e2ab2e9137c61 Mon Sep 17 00:00:00 2001 From: ankitjavalkar Date: Thu, 8 Oct 2015 12:12:24 +0530 Subject: - Modify initial fixtures - Add load data command with settings.py path - Modify Manifest --- MANIFEST.in | 1 + yaksh/fixtures/demo_fixtures.json | 1 + yaksh/fixtures/initial_fixtures.json | 1 - yaksh/scripts/cli.py | 5 +++-- 4 files changed, 5 insertions(+), 3 deletions(-) create mode 100644 yaksh/fixtures/demo_fixtures.json delete mode 100644 yaksh/fixtures/initial_fixtures.json diff --git a/MANIFEST.in b/MANIFEST.in index dbaf299..c9a162b 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -6,3 +6,4 @@ recursive-include yaksh/demo_templates * recursive-include yaksh/management * recursive-include yaksh/output * recursive-include yaksh/fixtures * +recursive-include yaksh/docs * \ No newline at end of file diff --git a/yaksh/fixtures/demo_fixtures.json b/yaksh/fixtures/demo_fixtures.json new file mode 100644 index 0000000..517c2b2 --- /dev/null +++ b/yaksh/fixtures/demo_fixtures.json @@ -0,0 +1 @@ +[{"pk": 1, "model": "contenttypes.contenttype", "fields": {"model": "logentry", "name": "log entry", "app_label": "admin"}}, {"pk": 2, "model": "contenttypes.contenttype", "fields": {"model": "permission", "name": "permission", "app_label": "auth"}}, {"pk": 3, "model": "contenttypes.contenttype", "fields": {"model": "group", "name": "group", "app_label": "auth"}}, {"pk": 4, "model": "contenttypes.contenttype", "fields": {"model": "user", "name": "user", "app_label": "auth"}}, {"pk": 5, "model": "contenttypes.contenttype", "fields": {"model": "contenttype", "name": "content type", "app_label": "contenttypes"}}, {"pk": 6, "model": "contenttypes.contenttype", "fields": {"model": "session", "name": "session", "app_label": "sessions"}}, {"pk": 7, "model": "contenttypes.contenttype", "fields": {"model": "profile", "name": "profile", "app_label": "yaksh"}}, {"pk": 8, "model": "contenttypes.contenttype", "fields": {"model": "question", "name": "question", "app_label": "yaksh"}}, {"pk": 9, "model": "contenttypes.contenttype", "fields": {"model": "answer", "name": "answer", "app_label": "yaksh"}}, {"pk": 10, "model": "contenttypes.contenttype", "fields": {"model": "quiz", "name": "quiz", "app_label": "yaksh"}}, {"pk": 11, "model": "contenttypes.contenttype", "fields": {"model": "questionpaper", "name": "question paper", "app_label": "yaksh"}}, {"pk": 12, "model": "contenttypes.contenttype", "fields": {"model": "questionset", "name": "question set", "app_label": "yaksh"}}, {"pk": 13, "model": "contenttypes.contenttype", "fields": {"model": "answerpaper", "name": "answer paper", "app_label": "yaksh"}}, {"pk": 14, "model": "contenttypes.contenttype", "fields": {"model": "assignmentupload", "name": "assignment upload", "app_label": "yaksh"}}, {"pk": 15, "model": "contenttypes.contenttype", "fields": {"model": "testcase", "name": "test case", "app_label": "yaksh"}}, {"pk": 16, "model": "contenttypes.contenttype", "fields": {"model": "tag", "name": "Tag", "app_label": "taggit"}}, {"pk": 17, "model": "contenttypes.contenttype", "fields": {"model": "taggeditem", "name": "Tagged Item", "app_label": "taggit"}}, {"pk": "kib1c35u44b8wleb8nltl5rkqwcsyrhr", "model": "sessions.session", "fields": {"expire_date": "2015-10-22T06:05:31.984", "session_data": "YjY4Mjg0Yjg4ZGI3OTIxYjc5NTY5NmNkMTgyMTQ4MGRmOTViNDRmOTp7fQ=="}}, {"pk": 1, "model": "yaksh.question", "fields": {"ref_code_path": "", "description": "\nWrite a function called fact which takes a single integer argument\n(say n) and returns the factorial of the number. \nFor example:
\nfact(3) -> 6\n", "language": "python", "summary": "Factorial", "snippet": "def fact(num):", "active": true, "points": 2.0, "test": "\nassert fact(0) == 1\nassert fact(5) == 120\n", "type": "code", "options": ""}}, {"pk": 2, "model": "yaksh.question", "fields": {"ref_code_path": "", "description": "Create a simple function called sqr which takes a single \nargument and returns the square of the argument. For example:
\nsqr(3) -> 9.", "language": "python", "summary": "Simple function", "snippet": "def sqr(num):", "active": true, "points": 1.0, "test": "\nimport math\nassert sqr(3) == 9\nassert abs(sqr(math.sqrt(2)) - 2.0) < 1e-14 \n ", "type": "code", "options": ""}}, {"pk": 3, "model": "yaksh.question", "fields": {"ref_code_path": "", "description": "Write a shell script which takes two arguments on the\n command line and prints the sum of the two on the output.", "language": "bash", "summary": "Bash addition", "snippet": "#!/bin/bash", "active": true, "points": 2.0, "test": "docs/sample.sh\ndocs/sample.args\n", "type": "code", "options": ""}}, {"pk": 4, "model": "yaksh.question", "fields": {"ref_code_path": "", "description": "What is the largest integer value that can be represented\nin Python?", "language": "python", "summary": "Size of integer in Python", "snippet": "", "active": true, "points": 0.5, "test": "No Limit", "type": "mcq", "options": "No Limit\n2**32\n2**32 - 1\nNone of the above\n"}}, {"pk": 1, "model": "yaksh.quiz", "fields": {"start_date_time": "2015-10-08T05:54:38", "description": "Demo Quiz", "language": "python", "time_between_attempts": 0, "attempts_allowed": -1, "pass_criteria": 40.0, "active": true, "end_date_time": "2199-01-01T00:00:00", "duration": 20, "prerequisite": null}}, {"pk": 1, "model": "yaksh.questionpaper", "fields": {"shuffle_questions": false, "total_marks": 5.5, "fixed_questions": [1, 2, 3, 4], "random_questions": [], "quiz": 1}}, {"pk": 1, "model": "taggit.tag", "fields": {"name": "Python", "slug": "python"}}, {"pk": 2, "model": "taggit.tag", "fields": {"name": "function", "slug": "function"}}, {"pk": 3, "model": "taggit.tag", "fields": {"name": "factorial", "slug": "factorial"}}, {"pk": 4, "model": "taggit.tag", "fields": {"name": "", "slug": ""}}, {"pk": 5, "model": "taggit.tag", "fields": {"name": "mcq", "slug": "mcq"}}, {"pk": 1, "model": "taggit.taggeditem", "fields": {"tag": 1, "content_type": 8, "object_id": 1}}, {"pk": 2, "model": "taggit.taggeditem", "fields": {"tag": 2, "content_type": 8, "object_id": 1}}, {"pk": 3, "model": "taggit.taggeditem", "fields": {"tag": 3, "content_type": 8, "object_id": 1}}, {"pk": 4, "model": "taggit.taggeditem", "fields": {"tag": 1, "content_type": 8, "object_id": 2}}, {"pk": 5, "model": "taggit.taggeditem", "fields": {"tag": 2, "content_type": 8, "object_id": 2}}, {"pk": 6, "model": "taggit.taggeditem", "fields": {"tag": 4, "content_type": 8, "object_id": 3}}, {"pk": 7, "model": "taggit.taggeditem", "fields": {"tag": 5, "content_type": 8, "object_id": 4}}, {"pk": 1, "model": "auth.permission", "fields": {"codename": "add_logentry", "name": "Can add log entry", "content_type": 1}}, {"pk": 2, "model": "auth.permission", "fields": {"codename": "change_logentry", "name": "Can change log entry", "content_type": 1}}, {"pk": 3, "model": "auth.permission", "fields": {"codename": "delete_logentry", "name": "Can delete log entry", "content_type": 1}}, {"pk": 4, "model": "auth.permission", "fields": {"codename": "add_permission", "name": "Can add permission", "content_type": 2}}, {"pk": 5, "model": "auth.permission", "fields": {"codename": "change_permission", "name": "Can change permission", "content_type": 2}}, {"pk": 6, "model": "auth.permission", "fields": {"codename": "delete_permission", "name": "Can delete permission", "content_type": 2}}, {"pk": 7, "model": "auth.permission", "fields": {"codename": "add_group", "name": "Can add group", "content_type": 3}}, {"pk": 8, "model": "auth.permission", "fields": {"codename": "change_group", "name": "Can change group", "content_type": 3}}, {"pk": 9, "model": "auth.permission", "fields": {"codename": "delete_group", "name": "Can delete group", "content_type": 3}}, {"pk": 10, "model": "auth.permission", "fields": {"codename": "add_user", "name": "Can add user", "content_type": 4}}, {"pk": 11, "model": "auth.permission", "fields": {"codename": "change_user", "name": "Can change user", "content_type": 4}}, {"pk": 12, "model": "auth.permission", "fields": {"codename": "delete_user", "name": "Can delete user", "content_type": 4}}, {"pk": 13, "model": "auth.permission", "fields": {"codename": "add_contenttype", "name": "Can add content type", "content_type": 5}}, {"pk": 14, "model": "auth.permission", "fields": {"codename": "change_contenttype", "name": "Can change content type", "content_type": 5}}, {"pk": 15, "model": "auth.permission", "fields": {"codename": "delete_contenttype", "name": "Can delete content type", "content_type": 5}}, {"pk": 16, "model": "auth.permission", "fields": {"codename": "add_session", "name": "Can add session", "content_type": 6}}, {"pk": 17, "model": "auth.permission", "fields": {"codename": "change_session", "name": "Can change session", "content_type": 6}}, {"pk": 18, "model": "auth.permission", "fields": {"codename": "delete_session", "name": "Can delete session", "content_type": 6}}, {"pk": 19, "model": "auth.permission", "fields": {"codename": "add_profile", "name": "Can add profile", "content_type": 7}}, {"pk": 20, "model": "auth.permission", "fields": {"codename": "change_profile", "name": "Can change profile", "content_type": 7}}, {"pk": 21, "model": "auth.permission", "fields": {"codename": "delete_profile", "name": "Can delete profile", "content_type": 7}}, {"pk": 22, "model": "auth.permission", "fields": {"codename": "add_question", "name": "Can add question", "content_type": 8}}, {"pk": 23, "model": "auth.permission", "fields": {"codename": "change_question", "name": "Can change question", "content_type": 8}}, {"pk": 24, "model": "auth.permission", "fields": {"codename": "delete_question", "name": "Can delete question", "content_type": 8}}, {"pk": 25, "model": "auth.permission", "fields": {"codename": "add_answer", "name": "Can add answer", "content_type": 9}}, {"pk": 26, "model": "auth.permission", "fields": {"codename": "change_answer", "name": "Can change answer", "content_type": 9}}, {"pk": 27, "model": "auth.permission", "fields": {"codename": "delete_answer", "name": "Can delete answer", "content_type": 9}}, {"pk": 28, "model": "auth.permission", "fields": {"codename": "add_quiz", "name": "Can add quiz", "content_type": 10}}, {"pk": 29, "model": "auth.permission", "fields": {"codename": "change_quiz", "name": "Can change quiz", "content_type": 10}}, {"pk": 30, "model": "auth.permission", "fields": {"codename": "delete_quiz", "name": "Can delete quiz", "content_type": 10}}, {"pk": 31, "model": "auth.permission", "fields": {"codename": "add_questionpaper", "name": "Can add question paper", "content_type": 11}}, {"pk": 32, "model": "auth.permission", "fields": {"codename": "change_questionpaper", "name": "Can change question paper", "content_type": 11}}, {"pk": 33, "model": "auth.permission", "fields": {"codename": "delete_questionpaper", "name": "Can delete question paper", "content_type": 11}}, {"pk": 34, "model": "auth.permission", "fields": {"codename": "add_questionset", "name": "Can add question set", "content_type": 12}}, {"pk": 35, "model": "auth.permission", "fields": {"codename": "change_questionset", "name": "Can change question set", "content_type": 12}}, {"pk": 36, "model": "auth.permission", "fields": {"codename": "delete_questionset", "name": "Can delete question set", "content_type": 12}}, {"pk": 37, "model": "auth.permission", "fields": {"codename": "add_answerpaper", "name": "Can add answer paper", "content_type": 13}}, {"pk": 38, "model": "auth.permission", "fields": {"codename": "change_answerpaper", "name": "Can change answer paper", "content_type": 13}}, {"pk": 39, "model": "auth.permission", "fields": {"codename": "delete_answerpaper", "name": "Can delete answer paper", "content_type": 13}}, {"pk": 40, "model": "auth.permission", "fields": {"codename": "add_assignmentupload", "name": "Can add assignment upload", "content_type": 14}}, {"pk": 41, "model": "auth.permission", "fields": {"codename": "change_assignmentupload", "name": "Can change assignment upload", "content_type": 14}}, {"pk": 42, "model": "auth.permission", "fields": {"codename": "delete_assignmentupload", "name": "Can delete assignment upload", "content_type": 14}}, {"pk": 43, "model": "auth.permission", "fields": {"codename": "add_testcase", "name": "Can add test case", "content_type": 15}}, {"pk": 44, "model": "auth.permission", "fields": {"codename": "change_testcase", "name": "Can change test case", "content_type": 15}}, {"pk": 45, "model": "auth.permission", "fields": {"codename": "delete_testcase", "name": "Can delete test case", "content_type": 15}}, {"pk": 46, "model": "auth.permission", "fields": {"codename": "add_tag", "name": "Can add Tag", "content_type": 16}}, {"pk": 47, "model": "auth.permission", "fields": {"codename": "change_tag", "name": "Can change Tag", "content_type": 16}}, {"pk": 48, "model": "auth.permission", "fields": {"codename": "delete_tag", "name": "Can delete Tag", "content_type": 16}}, {"pk": 49, "model": "auth.permission", "fields": {"codename": "add_taggeditem", "name": "Can add Tagged Item", "content_type": 17}}, {"pk": 50, "model": "auth.permission", "fields": {"codename": "change_taggeditem", "name": "Can change Tagged Item", "content_type": 17}}, {"pk": 51, "model": "auth.permission", "fields": {"codename": "delete_taggeditem", "name": "Can delete Tagged Item", "content_type": 17}}, {"pk": 1, "model": "auth.group", "fields": {"name": "moderator", "permissions": [25, 26, 27, 37, 38, 39, 40, 41, 42, 19, 20, 21, 22, 23, 24, 31, 32, 33, 34, 35, 36, 28, 29, 30, 43, 44, 45]}}, {"pk": 1, "model": "auth.user", "fields": {"username": "admin", "first_name": "", "last_name": "", "is_active": true, "is_superuser": true, "is_staff": true, "last_login": "2015-10-08T06:01:15.263", "groups": [1], "user_permissions": [], "password": "pbkdf2_sha256$12000$qartiEZkS5K0$wP0uhbdYEcuvRXAveA2geMUcknL11UzwL+TS2r2pL2I=", "email": "admin@admin.com", "date_joined": "2015-10-08T05:51:13"}}, {"pk": 2, "model": "auth.user", "fields": {"username": "student", "first_name": "Student", "last_name": "Yaksh", "is_active": true, "is_superuser": false, "is_staff": false, "last_login": "2015-10-08T06:05:29.551", "groups": [], "user_permissions": [], "password": "pbkdf2_sha256$12000$iRBPv5gvit8o$xKheYrWGGL4c3WN/F7j5UlRkmjAy9hx1BWWhdhd9uh0=", "email": "student@yaksh.xyz", "date_joined": "2015-10-08T05:55:56.956"}}, {"pk": 3, "model": "auth.user", "fields": {"username": "teacher", "first_name": "Teacher", "last_name": "Yaksh", "is_active": true, "is_superuser": false, "is_staff": false, "last_login": "2015-10-08T06:01:51.536", "groups": [1], "user_permissions": [], "password": "pbkdf2_sha256$12000$J6BkGV3t0Ajz$Q0LPr2588cYNBjWsw+PyY+Kzc4FcrWojtZek5iZ4LA8=", "email": "teacher@yaksh.xyz", "date_joined": "2015-10-08T05:57:52"}}, {"pk": 1, "model": "yaksh.profile", "fields": {"institute": "Demo Institute", "department": "Demo Department", "roll_number": "1", "user": 2, "position": "Student"}}, {"pk": 2, "model": "yaksh.profile", "fields": {"institute": "Demo Institute", "department": "Demo Department", "roll_number": "2", "user": 3, "position": "Teacher"}}, {"pk": 1, "model": "admin.logentry", "fields": {"action_flag": 1, "action_time": "2015-10-08T05:58:41.912", "object_repr": "moderators", "object_id": "1", "change_message": "", "user": 1, "content_type": 3}}, {"pk": 2, "model": "admin.logentry", "fields": {"action_flag": 2, "action_time": "2015-10-08T05:59:22.724", "object_repr": "admin", "object_id": "1", "change_message": "Changed groups.", "user": 1, "content_type": 4}}, {"pk": 3, "model": "admin.logentry", "fields": {"action_flag": 2, "action_time": "2015-10-08T05:59:30.335", "object_repr": "teacher", "object_id": "3", "change_message": "Changed groups.", "user": 1, "content_type": 4}}, {"pk": 4, "model": "admin.logentry", "fields": {"action_flag": 2, "action_time": "2015-10-08T06:01:24.134", "object_repr": "moderator", "object_id": "1", "change_message": "Changed name.", "user": 1, "content_type": 3}}] \ No newline at end of file diff --git a/yaksh/fixtures/initial_fixtures.json b/yaksh/fixtures/initial_fixtures.json deleted file mode 100644 index 6c4de83..0000000 --- a/yaksh/fixtures/initial_fixtures.json +++ /dev/null @@ -1 +0,0 @@ -[{"pk": 1, "model": "contenttypes.contenttype", "fields": {"model": "logentry", "name": "log entry", "app_label": "admin"}}, {"pk": 2, "model": "contenttypes.contenttype", "fields": {"model": "permission", "name": "permission", "app_label": "auth"}}, {"pk": 3, "model": "contenttypes.contenttype", "fields": {"model": "group", "name": "group", "app_label": "auth"}}, {"pk": 4, "model": "contenttypes.contenttype", "fields": {"model": "user", "name": "user", "app_label": "auth"}}, {"pk": 5, "model": "contenttypes.contenttype", "fields": {"model": "contenttype", "name": "content type", "app_label": "contenttypes"}}, {"pk": 6, "model": "contenttypes.contenttype", "fields": {"model": "session", "name": "session", "app_label": "sessions"}}, {"pk": 7, "model": "contenttypes.contenttype", "fields": {"model": "profile", "name": "profile", "app_label": "yaksh"}}, {"pk": 8, "model": "contenttypes.contenttype", "fields": {"model": "question", "name": "question", "app_label": "yaksh"}}, {"pk": 9, "model": "contenttypes.contenttype", "fields": {"model": "answer", "name": "answer", "app_label": "yaksh"}}, {"pk": 10, "model": "contenttypes.contenttype", "fields": {"model": "quiz", "name": "quiz", "app_label": "yaksh"}}, {"pk": 11, "model": "contenttypes.contenttype", "fields": {"model": "questionpaper", "name": "question paper", "app_label": "yaksh"}}, {"pk": 12, "model": "contenttypes.contenttype", "fields": {"model": "questionset", "name": "question set", "app_label": "yaksh"}}, {"pk": 13, "model": "contenttypes.contenttype", "fields": {"model": "answerpaper", "name": "answer paper", "app_label": "yaksh"}}, {"pk": 14, "model": "contenttypes.contenttype", "fields": {"model": "assignmentupload", "name": "assignment upload", "app_label": "yaksh"}}, {"pk": 15, "model": "contenttypes.contenttype", "fields": {"model": "testcase", "name": "test case", "app_label": "yaksh"}}, {"pk": 16, "model": "contenttypes.contenttype", "fields": {"model": "tag", "name": "Tag", "app_label": "taggit"}}, {"pk": 17, "model": "contenttypes.contenttype", "fields": {"model": "taggeditem", "name": "Tagged Item", "app_label": "taggit"}}, {"pk": "29hbrtmu40x48hmq1t4eihyu7dik6dvu", "model": "sessions.session", "fields": {"expire_date": "2015-10-21T11:14:15.908Z", "session_data": "YjY4Mjg0Yjg4ZGI3OTIxYjc5NTY5NmNkMTgyMTQ4MGRmOTViNDRmOTp7fQ=="}}, {"pk": "vfru0csbahmeg4tye0xk005rl79hrilt", "model": "sessions.session", "fields": {"expire_date": "2015-10-21T11:24:04.918Z", "session_data": "YjY4Mjg0Yjg4ZGI3OTIxYjc5NTY5NmNkMTgyMTQ4MGRmOTViNDRmOTp7fQ=="}}, {"pk": 1, "model": "auth.permission", "fields": {"codename": "add_logentry", "name": "Can add log entry", "content_type": 1}}, {"pk": 2, "model": "auth.permission", "fields": {"codename": "change_logentry", "name": "Can change log entry", "content_type": 1}}, {"pk": 3, "model": "auth.permission", "fields": {"codename": "delete_logentry", "name": "Can delete log entry", "content_type": 1}}, {"pk": 4, "model": "auth.permission", "fields": {"codename": "add_permission", "name": "Can add permission", "content_type": 2}}, {"pk": 5, "model": "auth.permission", "fields": {"codename": "change_permission", "name": "Can change permission", "content_type": 2}}, {"pk": 6, "model": "auth.permission", "fields": {"codename": "delete_permission", "name": "Can delete permission", "content_type": 2}}, {"pk": 7, "model": "auth.permission", "fields": {"codename": "add_group", "name": "Can add group", "content_type": 3}}, {"pk": 8, "model": "auth.permission", "fields": {"codename": "change_group", "name": "Can change group", "content_type": 3}}, {"pk": 9, "model": "auth.permission", "fields": {"codename": "delete_group", "name": "Can delete group", "content_type": 3}}, {"pk": 10, "model": "auth.permission", "fields": {"codename": "add_user", "name": "Can add user", "content_type": 4}}, {"pk": 11, "model": "auth.permission", "fields": {"codename": "change_user", "name": "Can change user", "content_type": 4}}, {"pk": 12, "model": "auth.permission", "fields": {"codename": "delete_user", "name": "Can delete user", "content_type": 4}}, {"pk": 13, "model": "auth.permission", "fields": {"codename": "add_contenttype", "name": "Can add content type", "content_type": 5}}, {"pk": 14, "model": "auth.permission", "fields": {"codename": "change_contenttype", "name": "Can change content type", "content_type": 5}}, {"pk": 15, "model": "auth.permission", "fields": {"codename": "delete_contenttype", "name": "Can delete content type", "content_type": 5}}, {"pk": 16, "model": "auth.permission", "fields": {"codename": "add_session", "name": "Can add session", "content_type": 6}}, {"pk": 17, "model": "auth.permission", "fields": {"codename": "change_session", "name": "Can change session", "content_type": 6}}, {"pk": 18, "model": "auth.permission", "fields": {"codename": "delete_session", "name": "Can delete session", "content_type": 6}}, {"pk": 19, "model": "auth.permission", "fields": {"codename": "add_profile", "name": "Can add profile", "content_type": 7}}, {"pk": 20, "model": "auth.permission", "fields": {"codename": "change_profile", "name": "Can change profile", "content_type": 7}}, {"pk": 21, "model": "auth.permission", "fields": {"codename": "delete_profile", "name": "Can delete profile", "content_type": 7}}, {"pk": 22, "model": "auth.permission", "fields": {"codename": "add_question", "name": "Can add question", "content_type": 8}}, {"pk": 23, "model": "auth.permission", "fields": {"codename": "change_question", "name": "Can change question", "content_type": 8}}, {"pk": 24, "model": "auth.permission", "fields": {"codename": "delete_question", "name": "Can delete question", "content_type": 8}}, {"pk": 25, "model": "auth.permission", "fields": {"codename": "add_answer", "name": "Can add answer", "content_type": 9}}, {"pk": 26, "model": "auth.permission", "fields": {"codename": "change_answer", "name": "Can change answer", "content_type": 9}}, {"pk": 27, "model": "auth.permission", "fields": {"codename": "delete_answer", "name": "Can delete answer", "content_type": 9}}, {"pk": 28, "model": "auth.permission", "fields": {"codename": "add_quiz", "name": "Can add quiz", "content_type": 10}}, {"pk": 29, "model": "auth.permission", "fields": {"codename": "change_quiz", "name": "Can change quiz", "content_type": 10}}, {"pk": 30, "model": "auth.permission", "fields": {"codename": "delete_quiz", "name": "Can delete quiz", "content_type": 10}}, {"pk": 31, "model": "auth.permission", "fields": {"codename": "add_questionpaper", "name": "Can add question paper", "content_type": 11}}, {"pk": 32, "model": "auth.permission", "fields": {"codename": "change_questionpaper", "name": "Can change question paper", "content_type": 11}}, {"pk": 33, "model": "auth.permission", "fields": {"codename": "delete_questionpaper", "name": "Can delete question paper", "content_type": 11}}, {"pk": 34, "model": "auth.permission", "fields": {"codename": "add_questionset", "name": "Can add question set", "content_type": 12}}, {"pk": 35, "model": "auth.permission", "fields": {"codename": "change_questionset", "name": "Can change question set", "content_type": 12}}, {"pk": 36, "model": "auth.permission", "fields": {"codename": "delete_questionset", "name": "Can delete question set", "content_type": 12}}, {"pk": 37, "model": "auth.permission", "fields": {"codename": "add_answerpaper", "name": "Can add answer paper", "content_type": 13}}, {"pk": 38, "model": "auth.permission", "fields": {"codename": "change_answerpaper", "name": "Can change answer paper", "content_type": 13}}, {"pk": 39, "model": "auth.permission", "fields": {"codename": "delete_answerpaper", "name": "Can delete answer paper", "content_type": 13}}, {"pk": 40, "model": "auth.permission", "fields": {"codename": "add_assignmentupload", "name": "Can add assignment upload", "content_type": 14}}, {"pk": 41, "model": "auth.permission", "fields": {"codename": "change_assignmentupload", "name": "Can change assignment upload", "content_type": 14}}, {"pk": 42, "model": "auth.permission", "fields": {"codename": "delete_assignmentupload", "name": "Can delete assignment upload", "content_type": 14}}, {"pk": 43, "model": "auth.permission", "fields": {"codename": "add_testcase", "name": "Can add test case", "content_type": 15}}, {"pk": 44, "model": "auth.permission", "fields": {"codename": "change_testcase", "name": "Can change test case", "content_type": 15}}, {"pk": 45, "model": "auth.permission", "fields": {"codename": "delete_testcase", "name": "Can delete test case", "content_type": 15}}, {"pk": 46, "model": "auth.permission", "fields": {"codename": "add_tag", "name": "Can add Tag", "content_type": 16}}, {"pk": 47, "model": "auth.permission", "fields": {"codename": "change_tag", "name": "Can change Tag", "content_type": 16}}, {"pk": 48, "model": "auth.permission", "fields": {"codename": "delete_tag", "name": "Can delete Tag", "content_type": 16}}, {"pk": 49, "model": "auth.permission", "fields": {"codename": "add_taggeditem", "name": "Can add Tagged Item", "content_type": 17}}, {"pk": 50, "model": "auth.permission", "fields": {"codename": "change_taggeditem", "name": "Can change Tagged Item", "content_type": 17}}, {"pk": 51, "model": "auth.permission", "fields": {"codename": "delete_taggeditem", "name": "Can delete Tagged Item", "content_type": 17}}, {"pk": 1, "model": "auth.group", "fields": {"name": "moderator", "permissions": [25, 26, 27, 37, 38, 39, 40, 41, 42, 19, 20, 21, 22, 23, 24, 31, 32, 33, 34, 35, 36, 28, 29, 30, 43, 44, 45]}}, {"pk": 1, "model": "auth.user", "fields": {"username": "admin", "first_name": "", "last_name": "", "is_active": true, "is_superuser": true, "is_staff": true, "last_login": "2015-10-07T11:19:03.122Z", "groups": [1], "user_permissions": [], "password": "pbkdf2_sha256$12000$ND54CY7Qx8S8$MVQhTt4bZIXmx5f3pIn8xH9BlVBrzUlznghT96wDkeQ=", "email": "admin@admin.xyz", "date_joined": "2015-10-07T11:11:52Z"}}, {"pk": 2, "model": "auth.user", "fields": {"username": "teacher", "first_name": "Teacher", "last_name": "Yaksh", "is_active": true, "is_superuser": false, "is_staff": false, "last_login": "2015-10-07T11:18:46.987Z", "groups": [1], "user_permissions": [], "password": "pbkdf2_sha256$12000$YxwWrXARBF8G$q3s41JrVpOZzqlj/Ds1cUUqOD/I179mFLCCajM4KlOg=", "email": "teacher@yaksh.xyz", "date_joined": "2015-10-07T11:15:17Z"}}, {"pk": 3, "model": "auth.user", "fields": {"username": "student", "first_name": "Student", "last_name": "Yaksh", "is_active": true, "is_superuser": false, "is_staff": false, "last_login": "2015-10-07T11:24:01.490Z", "groups": [], "user_permissions": [], "password": "pbkdf2_sha256$12000$eOkqQDZGGg0K$Q/sPrc9HD3QAmajpnQqfbPAwk66NQ/W+7hiNKMCBnIg=", "email": "student@yaksh.xyz", "date_joined": "2015-10-07T11:16:21.074Z"}}, {"pk": 1, "model": "admin.logentry", "fields": {"action_flag": 1, "action_time": "2015-10-07T11:17:09.533Z", "object_repr": "moderators", "object_id": "1", "change_message": "", "user": 1, "content_type": 3}}, {"pk": 2, "model": "admin.logentry", "fields": {"action_flag": 2, "action_time": "2015-10-07T11:18:09.352Z", "object_repr": "teacher", "object_id": "2", "change_message": "Changed groups.", "user": 1, "content_type": 4}}, {"pk": 3, "model": "admin.logentry", "fields": {"action_flag": 2, "action_time": "2015-10-07T11:18:17.993Z", "object_repr": "admin", "object_id": "1", "change_message": "Changed groups.", "user": 1, "content_type": 4}}, {"pk": 4, "model": "admin.logentry", "fields": {"action_flag": 2, "action_time": "2015-10-07T11:19:16.779Z", "object_repr": "moderator", "object_id": "1", "change_message": "Changed name.", "user": 1, "content_type": 3}}] \ No newline at end of file diff --git a/yaksh/scripts/cli.py b/yaksh/scripts/cli.py index ecccada..1787fda 100644 --- a/yaksh/scripts/cli.py +++ b/yaksh/scripts/cli.py @@ -82,7 +82,7 @@ def create_demo(project_name='yaksh_demo', project_dir=CUR_DIR): project_path = path.join(top_dir, project_name) fixture_dir = path.join(PARENT_DIR, 'fixtures') - fixture_path = path.join(fixture_dir, 'initial_fixtures.json') + fixture_path = path.join(fixture_dir, 'demo_fixtures.json') # Store project details _set_project_details(project_name, top_dir) @@ -98,7 +98,8 @@ def create_demo(project_name='yaksh_demo', project_dir=CUR_DIR): command = ("python ../manage.py syncdb " "--noinput --settings={0}.demo_settings").format(project_name) - loaddata_command = "python ../manage.py loaddata {0} ".format(fixture_path) + loaddata_command = ("python ../manage.py loaddata " + "--settings={0}.demo_settings {1}").format(project_name, fixture_path) # Create demo_settings file _render_demo_files(settings_template_path, settings_target_path, settings_context) -- cgit From d84aa639765096078763fe2caab24e4751a339aa Mon Sep 17 00:00:00 2001 From: ankitjavalkar Date: Thu, 8 Oct 2015 12:37:56 +0530 Subject: Minor changes to setup.py and README.md --- README.md | 23 +++++++++++++---------- setup.py | 2 +- 2 files changed, 14 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index ed19e16..79e4766 100644 --- a/README.md +++ b/README.md @@ -72,21 +72,22 @@ Quick Start 1. User can also login to the Default Django admin using; - Admin - Username: admin | Password: admin -Inspiration -=========== +History +======= At FOSSEE, Nishanth had implemented a nice django based app to -test for multiple-choice questions. I was inspired by a -programming contest that I saw at PyCon APAC 2011. Chris Boesch, who +test for multiple-choice questions. Prabhu Ramchandran was inspired by a +programming contest that he saw at PyCon APAC 2011. Chris Boesch, who administered the contest, used a nice web application [Singpath](http://singpath.com) that he had built on top of GAE that basically checked your Python code, live. This made it fun and interesting. -I wanted an implementation that was not tied to GAE and decided to write -one myself and the result is the "exam" app. The idea being that I can -use this to test students programming skills and not have to worry about -grading their answers myself and I can do so on my machines. +Prabhu wanted an implementation that was not tied to GAE and hence wrote +the initial cut of what is now 'Yaksh'. The idea being that +anyone can use this to test students programming skills and not have to worry +about grading their answers manually and instead do so on their machines. +The application has since been refactored and maintained by FOSSEE Developers. Contact ======= @@ -107,7 +108,7 @@ Authors Main author: Prabhu Ramachandran -I gratefully acknowledge help from the following: +Help from the following is gratefully acknowledged: - Nishanth Amuluru originally from FOSSEE who wrote bulk of the login/registration code. He wrote an initial first cut of a quiz app @@ -121,5 +122,7 @@ I gratefully acknowledge help from the following: - Srikant Patnaik and Thomas Stephen Lee, who helped deploy and test the code. + - [FOSSEE Developers](http://singpath.com) + -Copyright (c) 2011 Prabhu Ramachandran and FOSSEE (fossee.in) +Copyright (c) 2011 FOSSEE (fossee.in) diff --git a/setup.py b/setup.py index 45227d1..2cff24f 100644 --- a/setup.py +++ b/setup.py @@ -8,7 +8,7 @@ os.chdir(os.path.normpath(os.path.join(os.path.abspath(__file__), os.pardir))) setup( name='yaksh', - author='Python Team, IIT Bombay', + author='Python Team at FOSSEE, IIT Bombay', author_email='python@fossee.in', version='0.1', packages=find_packages(), -- cgit From f39f8e1b2b487426a38d2c69372a1f58dcaeee79 Mon Sep 17 00:00:00 2001 From: ankitjavalkar Date: Fri, 9 Oct 2015 11:07:38 +0530 Subject: minor changes to README post review --- README.md | 23 +++-------------------- yaksh/scripts/cli.py | 10 +++++----- 2 files changed, 8 insertions(+), 25 deletions(-) diff --git a/README.md b/README.md index 79e4766..b7c6fc4 100644 --- a/README.md +++ b/README.md @@ -76,7 +76,7 @@ History ======= At FOSSEE, Nishanth had implemented a nice django based app to -test for multiple-choice questions. Prabhu Ramchandran was inspired by a +test for multiple-choice questions. Prabhu Ramachandran was inspired by a programming contest that he saw at PyCon APAC 2011. Chris Boesch, who administered the contest, used a nice web application [Singpath](http://singpath.com) that he had built on top of GAE that @@ -94,8 +94,7 @@ Contact For further information and support you can contact -* Forum Link -* Email Address +Python Team at FOSSEE: pythonsupport@fossee.in License ======= @@ -106,23 +105,7 @@ information is at the bottom of this file. Authors ======= -Main author: Prabhu Ramachandran - -Help from the following is gratefully acknowledged: - - - Nishanth Amuluru originally from FOSSEE who wrote bulk of the - login/registration code. He wrote an initial first cut of a quiz app - which supported only simple questions which provided motivation for - this app. The current codebase does not share too much from his - implementation although there are plenty of similarities. - - - Harish Badrinath (FOSSEE) -- who provided a first cut of the bash - related scripts. - - - Srikant Patnaik and Thomas Stephen Lee, who helped deploy and test - the code. - - - [FOSSEE Developers](http://singpath.com) + [FOSSEE Developers] (https://github.com/FOSSEE/online_test/graphs/contributors) Copyright (c) 2011 FOSSEE (fossee.in) diff --git a/yaksh/scripts/cli.py b/yaksh/scripts/cli.py index 1787fda..79523f9 100644 --- a/yaksh/scripts/cli.py +++ b/yaksh/scripts/cli.py @@ -116,11 +116,11 @@ def run_demo(project_name, top_dir): subprocess.call(command, shell=True) def run_server(): - # try: - from yaksh import code_server - code_server.main() - # except Exception as e: - print("Error: {0}\nExiting yaksh code server".format(e)) + try: + from yaksh import code_server + code_server.main() + except Exception as e: + print("Error: {0}\nExiting yaksh code server".format(e)) def _set_project_details(project_name, top_dir): file_path = path.join(SCRIPT_DIR, 'project_detail.py') -- cgit