From a026ccc62edff3531b8ce0ea2a613ccde69c1642 Mon Sep 17 00:00:00 2001
From: hardythe1
Date: Wed, 27 May 2015 15:03:08 +0530
Subject: Removed Buildout and related files & made a standard Django project

---
 .gitignore                                       |   2 +-
 bootstrap.py                                     |  77 ---------
 buildout.cfg                                     |  20 ---
 manage.py                                        |  10 ++
 online_test/__init__.py                          |   0
 online_test/settings.py                          |  96 +++++++++++
 online_test/urls.py                              |  15 ++
 online_test/wsgi.py                              |  14 ++
 production.cfg                                   |  20 ---
 testapp/README.rst                               |  48 ------
 testapp/exam/bash_code_evaluator.py              | 122 --------------
 testapp/exam/code_evaluator.py                   | 206 -----------------------
 testapp/exam/code_server.py                      |   2 +-
 testapp/exam/cpp_code_evaluator.py               | 125 --------------
 testapp/exam/evaluators/__init__.py              |   0
 testapp/exam/evaluators/bash_code_evaluator.py   | 122 ++++++++++++++
 testapp/exam/evaluators/code_evaluator.py        | 206 +++++++++++++++++++++++
 testapp/exam/evaluators/cpp_code_evaluator.py    | 125 ++++++++++++++
 testapp/exam/evaluators/java_code_evaluator.py   | 128 ++++++++++++++
 testapp/exam/evaluators/language_registry.py     |  36 ++++
 testapp/exam/evaluators/python_code_evaluator.py |  61 +++++++
 testapp/exam/evaluators/scilab_code_evaluator.py | 105 ++++++++++++
 testapp/exam/java_code_evaluator.py              | 128 --------------
 testapp/exam/language_registry.py                |  36 ----
 testapp/exam/python_code_evaluator.py            |  61 -------
 testapp/exam/scilab_code_evaluator.py            | 105 ------------
 testapp/exam/settings.py                         |  12 +-
 testapp/manage.py                                |  14 --
 testapp/production.py                            |  11 --
 testapp/settings.py                              | 193 ---------------------
 30 files changed, 926 insertions(+), 1174 deletions(-)
 delete mode 100644 bootstrap.py
 delete mode 100644 buildout.cfg
 create mode 100755 manage.py
 create mode 100644 online_test/__init__.py
 create mode 100644 online_test/settings.py
 create mode 100644 online_test/urls.py
 create mode 100644 online_test/wsgi.py
 delete mode 100644 production.cfg
 delete mode 100644 testapp/README.rst
 delete mode 100644 testapp/exam/bash_code_evaluator.py
 delete mode 100644 testapp/exam/code_evaluator.py
 delete mode 100644 testapp/exam/cpp_code_evaluator.py
 create mode 100644 testapp/exam/evaluators/__init__.py
 create mode 100644 testapp/exam/evaluators/bash_code_evaluator.py
 create mode 100644 testapp/exam/evaluators/code_evaluator.py
 create mode 100644 testapp/exam/evaluators/cpp_code_evaluator.py
 create mode 100644 testapp/exam/evaluators/java_code_evaluator.py
 create mode 100644 testapp/exam/evaluators/language_registry.py
 create mode 100644 testapp/exam/evaluators/python_code_evaluator.py
 create mode 100644 testapp/exam/evaluators/scilab_code_evaluator.py
 delete mode 100644 testapp/exam/java_code_evaluator.py
 delete mode 100644 testapp/exam/language_registry.py
 delete mode 100644 testapp/exam/python_code_evaluator.py
 delete mode 100644 testapp/exam/scilab_code_evaluator.py
 delete mode 100755 testapp/manage.py
 delete mode 100644 testapp/production.py
 delete mode 100644 testapp/settings.py

diff --git a/.gitignore b/.gitignore
index 3e88586..b85f182 100644
--- a/.gitignore
+++ b/.gitignore
@@ -40,4 +40,4 @@ apache/*
 *.db
 migrations
 wsgi.log
-
+*.sqlite3
diff --git a/bootstrap.py b/bootstrap.py
deleted file mode 100644
index 7728587..0000000
--- a/bootstrap.py
+++ /dev/null
@@ -1,77 +0,0 @@
-##############################################################################
-#
-# Copyright (c) 2006 Zope Corporation and Contributors.
-# All Rights Reserved.
-#
-# This software is subject to the provisions of the Zope Public License,
-# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
-# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
-# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
-# FOR A PARTICULAR PURPOSE.
-#
-##############################################################################
-"""Bootstrap a buildout-based project
-
-Simply run this script in a directory containing a buildout.cfg.
-The script accepts buildout command-line options, so you can
-use the -c option to specify an alternate configuration file.
-
-$Id$
-"""
-
-import os, shutil, sys, tempfile, urllib2
-
-tmpeggs = tempfile.mkdtemp()
-
-is_jython = sys.platform.startswith('java')
-
-try:
-    import pkg_resources
-except ImportError:
-    ez = {}
-    exec urllib2.urlopen('http://peak.telecommunity.com/dist/ez_setup.py'
-                         ).read() in ez
-    ez['use_setuptools'](to_dir=tmpeggs, download_delay=0)
-
-    import pkg_resources
-
-if sys.platform == 'win32':
-    def quote(c):
-        if ' ' in c:
-            return '"%s"' % c # work around spawn lamosity on windows
-        else:
-            return c
-else:
-    def quote (c):
-        return c
-
-cmd = 'from setuptools.command.easy_install import main; main()'
-ws  = pkg_resources.working_set
-
-if is_jython:
-    import subprocess
-    
-    assert subprocess.Popen([sys.executable] + ['-c', quote(cmd), '-mqNxd', 
-           quote(tmpeggs), 'zc.buildout'], 
-           env=dict(os.environ,
-               PYTHONPATH=
-               ws.find(pkg_resources.Requirement.parse('setuptools')).location
-               ),
-           ).wait() == 0
-
-else:
-    assert os.spawnle(
-        os.P_WAIT, sys.executable, quote (sys.executable),
-        '-c', quote (cmd), '-mqNxd', quote (tmpeggs), 'zc.buildout',
-        dict(os.environ,
-            PYTHONPATH=
-            ws.find(pkg_resources.Requirement.parse('setuptools')).location
-            ),
-        ) == 0
-
-ws.add_entry(tmpeggs)
-ws.require('zc.buildout')
-import zc.buildout.buildout
-zc.buildout.buildout.main(sys.argv[1:] + ['bootstrap'])
-shutil.rmtree(tmpeggs)
diff --git a/buildout.cfg b/buildout.cfg
deleted file mode 100644
index 9ffc6d8..0000000
--- a/buildout.cfg
+++ /dev/null
@@ -1,20 +0,0 @@
-[buildout]
-parts = 
-    django
-eggs = 
-    South
-    django-taggit
-    django-taggit-autocomplete-modified
-    django-debug-toolbar
-
-[django]
-recipe = djangorecipe
-project = testapp 
-settings = settings
-wsgi = true
-wsgilog=wsgi.log
-eggs =
-    ${buildout:eggs}
-extra-paths = 
-    testapp
-
diff --git a/manage.py b/manage.py
new file mode 100755
index 0000000..1addc41
--- /dev/null
+++ b/manage.py
@@ -0,0 +1,10 @@
+#!/usr/bin/env python
+import os
+import sys
+
+if __name__ == "__main__":
+    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "online_test.settings")
+
+    from django.core.management import execute_from_command_line
+
+    execute_from_command_line(sys.argv)
diff --git a/online_test/__init__.py b/online_test/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/online_test/settings.py b/online_test/settings.py
new file mode 100644
index 0000000..9168b08
--- /dev/null
+++ b/online_test/settings.py
@@ -0,0 +1,96 @@
+"""
+Django settings for online_test project.
+
+For more information on this file, see
+https://docs.djangoproject.com/en/1.6/topics/settings/
+
+For the full list of settings and their values, see
+https://docs.djangoproject.com/en/1.6/ref/settings/
+"""
+
+# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
+import os
+BASE_DIR = os.path.dirname(os.path.dirname(__file__))
+
+
+# Quick-start development settings - unsuitable for production
+# See https://docs.djangoproject.com/en/1.6/howto/deployment/checklist/
+
+# SECURITY WARNING: keep the secret key used in production secret!
+SECRET_KEY = '0=fsi3g5dw*7ze1cyh441_e^5^$2ay@&z(5(n7mhir0xb267=6'
+
+# SECURITY WARNING: don't run with debug turned on in production!
+DEBUG = True
+
+TEMPLATE_DEBUG = True
+
+ALLOWED_HOSTS = []
+
+URL_ROOT = ''
+
+# Application definition
+
+INSTALLED_APPS = (
+    'django.contrib.admin',
+    'django.contrib.auth',
+    'django.contrib.contenttypes',
+    'django.contrib.sessions',
+    'django.contrib.messages',
+    'django.contrib.staticfiles',
+    'testapp.exam',
+    'taggit',
+    'taggit_autocomplete_modified',
+)
+
+MIDDLEWARE_CLASSES = (
+    'django.contrib.sessions.middleware.SessionMiddleware',
+    'django.middleware.common.CommonMiddleware',
+    'django.middleware.csrf.CsrfViewMiddleware',
+    'django.contrib.auth.middleware.AuthenticationMiddleware',
+    'django.contrib.messages.middleware.MessageMiddleware',
+    'django.middleware.clickjacking.XFrameOptionsMiddleware',
+)
+
+ROOT_URLCONF = 'online_test.urls'
+
+WSGI_APPLICATION = 'online_test.wsgi.application'
+
+
+# Database
+# https://docs.djangoproject.com/en/1.6/ref/settings/#databases
+
+DATABASES = {
+    'default': {
+        'ENGINE': 'django.db.backends.sqlite3',
+        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
+    },
+    'spoken_tutorial' : {
+        'ENGINE' : 'django.db.backends.mysql',
+        'NAME'   : 'YOUR DATABASE',
+        'USER'   : 'YOUR USERNAME',
+        'PASSWORD': 'YOUR PASSWORD',
+        'HOST'    :'',
+        'PORT'    :'',
+    }
+}
+
+# Internationalization
+# https://docs.djangoproject.com/en/1.6/topics/i18n/
+
+AUTH_PROFILE_MODULE = 'exam.Profile'
+
+LANGUAGE_CODE = 'en-us'
+
+TIME_ZONE = 'UTC'
+
+USE_I18N = True
+
+USE_L10N = True
+
+USE_TZ = False
+
+
+# Static files (CSS, JavaScript, Images)
+# https://docs.djangoproject.com/en/1.6/howto/static-files/
+
+STATIC_URL = '/static/'
diff --git a/online_test/urls.py b/online_test/urls.py
new file mode 100644
index 0000000..871b357
--- /dev/null
+++ b/online_test/urls.py
@@ -0,0 +1,15 @@
+from django.conf.urls import patterns, include, url
+
+from django.contrib import admin
+admin.autodiscover()
+
+urlpatterns = patterns('',
+    # Examples:
+    # url(r'^$', 'online_test.views.home', name='home'),
+    # url(r'^blog/', include('blog.urls')),
+
+    url(r'^admin/', include(admin.site.urls)),
+    url(r'^exam/', include('testapp.exam.urls')),
+    url(r'^taggit_autocomplete_modified/', include\
+                                    ('taggit_autocomplete_modified.urls'))
+)
diff --git a/online_test/wsgi.py b/online_test/wsgi.py
new file mode 100644
index 0000000..2dd7ae3
--- /dev/null
+++ b/online_test/wsgi.py
@@ -0,0 +1,14 @@
+"""
+WSGI config for online_test project.
+
+It exposes the WSGI callable as a module-level variable named ``application``.
+
+For more information on this file, see
+https://docs.djangoproject.com/en/1.6/howto/deployment/wsgi/
+"""
+
+import os
+os.environ.setdefault("DJANGO_SETTINGS_MODULE", "online_test.settings")
+
+from django.core.wsgi import get_wsgi_application
+application = get_wsgi_application()
diff --git a/production.cfg b/production.cfg
deleted file mode 100644
index c5ec49e..0000000
--- a/production.cfg
+++ /dev/null
@@ -1,20 +0,0 @@
-[buildout]
-parts = 
-    django
-eggs =
-    South
-    psycopg2
-    django-taggit
-    django-taggit-autocomplete-modified
-    django-debug-toolbar
-
-[django]
-recipe = djangorecipe
-project = testapp 
-settings = production
-wsgi = true
-wsgilog=wsgi.log
-eggs =
-    ${buildout:eggs}
-extra-paths = 
-    testapp
diff --git a/testapp/README.rst b/testapp/README.rst
deleted file mode 100644
index e6f8380..0000000
--- a/testapp/README.rst
+++ /dev/null
@@ -1,48 +0,0 @@
-===============
-Online Exam
-===============
-
-Online test application lets user(student) take an online programming test.
-A special user called moderator can add questions, create question paper, 
-conduct online test and monitor the test.
-
-
-Quick start
-------------
-
-1. In your terminal run the following command::
-    $ easy_install git+https://github.com/FOSSEE/online_test.git#egg=django_exam-0.1
-
-2. Add "testapp.exam", "taggit" and "taggit_autocomplete_modified" apps 
-   to your INSTALLED_APPS setting as follows::
-
-    INSTALLED_APPS =(
-        'testapp.exam',
-        'taggit',
-        'taggit_autocomplete_modified',
-    )
-
-3. In project settings, add AUTH_PROFILE_MODULE = 'testapp.exam.Profile'
-   You can change the testapp.exam.Profile to your desired app user profile.
-
-4. Include the "testapp.exam" and taggit_autocomplete_modified URL configuration
-   in your project urls.py as follows::
-
-    url(r'^exam/', include('testapp.exam.urls')),
-    url(r'^taggit_autocomplete_modified/', include\
-                                        ('taggit_autocomplete_modified.urls'))
-
-
-5. Run 'python manage.py syncdb' to create models for the new installed apps.
-
-6. Run 'python manage.py runserver' to start the development server
-   and visit http://localhost:8000/exam/
-
-7. Run code_server command as superuser as follows::
-
-       $ sudo code_server
-
-   Note: If you are using virtual python environment, then activate the environment
-         using sudo. Then simply run the code_server command as follows::
-
-         $ code_server
diff --git a/testapp/exam/bash_code_evaluator.py b/testapp/exam/bash_code_evaluator.py
deleted file mode 100644
index a468fd7..0000000
--- a/testapp/exam/bash_code_evaluator.py
+++ /dev/null
@@ -1,122 +0,0 @@
-#!/usr/bin/env python
-import traceback
-import pwd
-import os
-from os.path import join, isfile
-import subprocess
-import importlib
-
-# local imports
-from code_evaluator import CodeEvaluator
-
-
-class BashCodeEvaluator(CodeEvaluator):
-    """Tests the Bash code obtained from Code Server"""
-    def __init__(self, test_case_data, test, language, user_answer,
-                     ref_code_path=None, in_dir=None):
-        super(BashCodeEvaluator, self).__init__(test_case_data, test, language, user_answer, 
-                                                 ref_code_path, in_dir)
-        self.test_case_args = self._setup()
-
-    # Private Protocol ##########
-    def _setup(self):
-        super(BashCodeEvaluator, self)._setup()
-
-        self.submit_path = self.create_submit_code_file('submit.sh')
-        self._set_file_as_executable(self.submit_path)
-        get_ref_path, get_test_case_path = self.ref_code_path.strip().split(',')
-        get_ref_path = get_ref_path.strip()
-        get_test_case_path = get_test_case_path.strip()
-        ref_path, test_case_path = self._set_test_code_file_path(get_ref_path,
-                                                             get_test_case_path)
-
-        return ref_path, self.submit_path, test_case_path
-
-    def _teardown(self):
-        # Delete the created file.
-        super(BashCodeEvaluator, self)._teardown()
-        os.remove(self.submit_path)
-
-    def _check_code(self, ref_path, submit_path,
-                          test_case_path=None):
-        """ Function validates student script using instructor script as
-        reference. Test cases can optionally be provided.  The first argument
-        ref_path, is the path to instructor script, it is assumed to
-        have executable permission.  The second argument submit_path, is
-        the path to the student script, it is assumed to have executable
-        permission.  The Third optional argument is the path to test the
-        scripts.  Each line in this file is a test case and each test case is
-        passed to the script as standard arguments.
-
-        Returns
-        --------
-
-        returns (True, "Correct answer") : If the student script passes all
-        test cases/have same output, when compared to the instructor script
-
-        returns (False, error_msg): If the student script fails a single
-        test/have dissimilar output, when compared to the instructor script.
-
-        Returns (False, error_msg): If mandatory arguments are not files or if
-        the required permissions are not given to the file(s).
-
-        """
-        if not isfile(ref_path):
-            return False, "No file at %s or Incorrect path" % ref_path
-        if not isfile(submit_path):
-            return False, "No file at %s or Incorrect path" % submit_path
-        if not os.access(ref_path, os.X_OK):
-            return False, "Script %s is not executable" % ref_path
-        if not os.access(submit_path, os.X_OK):
-            return False, "Script %s is not executable" % submit_path
-
-        success = False
-
-        if test_case_path is None or "":
-            ret = self._run_command(ref_path, stdin=None,
-                                    stdout=subprocess.PIPE,
-                                    stderr=subprocess.PIPE)
-            proc, inst_stdout, inst_stderr = ret
-            ret = self._run_command(submit_path, stdin=None,
-                                    stdout=subprocess.PIPE,
-                                    stderr=subprocess.PIPE)
-            proc, stdnt_stdout, stdnt_stderr = ret
-            if inst_stdout == stdnt_stdout:
-                return True, "Correct answer"
-            else:
-                err = "Error: expected %s, got %s" % (inst_stderr,
-                                                      stdnt_stderr)
-                return False, err
-        else:
-            if not isfile(test_case_path):
-                return False, "No test case at %s" % test_case_path
-            if not os.access(ref_path, os.R_OK):
-                return False, "Test script %s, not readable" % test_case_path
-            # valid_answer is True, so that we can stop once a test case fails
-            valid_answer = True
-            # loop_count has to be greater than or equal to one.
-            # Useful for caching things like empty test files,etc.
-            loop_count = 0
-            test_cases = open(test_case_path).readlines()
-            num_lines = len(test_cases)
-            for test_case in test_cases:
-                loop_count += 1
-                if valid_answer:
-                    args = [ref_path] + [x for x in test_case.split()]
-                    ret = self._run_command(args, stdin=None,
-                                            stdout=subprocess.PIPE,
-                                            stderr=subprocess.PIPE)
-                    proc, inst_stdout, inst_stderr = ret
-                    args = [submit_path]+[x for x in test_case.split()]
-                    ret = self._run_command(args, stdin=None,
-                                            stdout=subprocess.PIPE,
-                                            stderr=subprocess.PIPE)
-                    proc, stdnt_stdout, stdnt_stderr = ret
-                    valid_answer = inst_stdout == stdnt_stdout
-            if valid_answer and (num_lines == loop_count):
-                return True, "Correct answer"
-            else:
-                err = "Error:expected %s, got %s" % (inst_stdout+inst_stderr,
-                                                     stdnt_stdout+stdnt_stderr)
-                return False, err
-
diff --git a/testapp/exam/code_evaluator.py b/testapp/exam/code_evaluator.py
deleted file mode 100644
index 381b2e8..0000000
--- a/testapp/exam/code_evaluator.py
+++ /dev/null
@@ -1,206 +0,0 @@
-import sys
-from SimpleXMLRPCServer import SimpleXMLRPCServer
-import pwd
-import os
-import stat
-from os.path import isdir, dirname, abspath, join, isfile
-import signal
-from multiprocessing import Process, Queue
-import subprocess
-import re
-import json
-# Local imports.
-from settings import SERVER_TIMEOUT
-
-
-MY_DIR = abspath(dirname(__file__))
-
-
-# Raised when the code times-out.
-# c.f. http://pguides.net/python/timeout-a-function
-class TimeoutException(Exception):
-    pass
-
-
-def timeout_handler(signum, frame):
-    """A handler for the ALARM signal."""
-    raise TimeoutException('Code took too long to run.')
-
-
-def create_signal_handler():
-    """Add a new signal handler for the execution of this code."""
-    prev_handler = signal.signal(signal.SIGALRM, timeout_handler)
-    signal.alarm(SERVER_TIMEOUT)
-    return prev_handler
-
-
-def set_original_signal_handler(old_handler=None):
-    """Set back any original signal handler."""
-    if old_handler is not None:
-        signal.signal(signal.SIGALRM, old_handler)
-        return
-    else:
-        raise Exception("Signal Handler: object cannot be NoneType")
-
-
-def delete_signal_handler():
-    signal.alarm(0)
-    return
-
-
-class CodeEvaluator(object):
-    """Tests the code obtained from Code Server"""
-    def __init__(self, test_case_data, test, language, user_answer, 
-                     ref_code_path=None, in_dir=None):
-        msg = 'Code took more than %s seconds to run. You probably '\
-              'have an infinite loop in your code.' % SERVER_TIMEOUT
-        self.timeout_msg = msg
-        self.test_case_data = test_case_data
-        self.language = language.lower()
-        self.user_answer = user_answer
-        self.ref_code_path = ref_code_path
-        self.test = test
-        self.in_dir = in_dir
-        self.test_case_args = None
-
-    # Public Protocol ##########
-    @classmethod
-    def from_json(cls, language, json_data, in_dir):
-        json_data = json.loads(json_data)
-        test_case_data = json_data.get("test_case_data")
-        user_answer = json_data.get("user_answer")
-        ref_code_path = json_data.get("ref_code_path")
-        test = json_data.get("test") 
-
-        instance = cls(test_case_data, test, language, user_answer, ref_code_path,
-                         in_dir)
-        return instance
-
-    def evaluate(self):
-        """Evaluates given code with the test cases based on
-        given arguments in test_case_data.
-
-        The ref_code_path is a path to the reference code.
-        The reference code will call the function submitted by the student.
-        The reference code will check for the expected output.
-
-        If the path's start with a "/" then we assume they are absolute paths.
-        If not, we assume they are relative paths w.r.t. the location of this
-        code_server script.
-
-        If the optional `in_dir` keyword argument is supplied it changes the
-        directory to that directory (it does not change it back to the original
-        when done).
-
-        Returns
-        -------
-
-        A tuple: (success, error message).
-        """
-
-        self._setup()
-        success, err = self._evaluate(self.test_case_args)
-        self._teardown()
-
-        result = {'success': success, 'error': err}
-        return result
-
-    # Private Protocol ##########
-    def _setup(self):
-        self._change_dir(self.in_dir)
-
-    def _evaluate(self, args):
-        # Add a new signal handler for the execution of this code.
-        prev_handler = create_signal_handler()
-        success = False
-        args = args or []
-
-        # Do whatever testing needed.
-        try:
-            success, err = self._check_code(*args)
-
-        except TimeoutException:
-            err = self.timeout_msg
-        except:
-            _type, value = sys.exc_info()[:2]
-            err = "Error: {0}".format(repr(value))
-        finally:
-            # Set back any original signal handler.
-            set_original_signal_handler(prev_handler)
-
-        return success, err
-
-    def _teardown(self):
-        # Cancel the signal
-        delete_signal_handler()
-
-    def _check_code(self):
-        raise NotImplementedError("check_code method not implemented")
-
-    def create_submit_code_file(self, file_name):
-        """ Write the code (`answer`) to a file and set the file path"""
-        submit_f = open(file_name, 'w')
-        submit_f.write(self.user_answer.lstrip())
-        submit_f.close()
-        submit_path = abspath(submit_f.name)
-
-        return submit_path
-
-    def _set_file_as_executable(self, fname):
-        os.chmod(fname,  stat.S_IRUSR | stat.S_IWUSR | stat.S_IXUSR
-                 | stat.S_IRGRP | stat.S_IWGRP | stat.S_IXGRP
-                 | stat.S_IROTH | stat.S_IWOTH | stat.S_IXOTH)
-
-    def _set_test_code_file_path(self, ref_path=None, test_case_path=None):
-        if ref_path and not ref_path.startswith('/'):
-            ref_path = join(MY_DIR, ref_path)
-
-        if test_case_path and not test_case_path.startswith('/'):
-            test_case_path = join(MY_DIR, test_case_path)
-
-        return ref_path, test_case_path
-
-    def _run_command(self, cmd_args, *args, **kw):
-        """Run a command in a subprocess while blocking, the process is killed
-        if it takes more than 2 seconds to run.  Return the Popen object, the
-        stdout and stderr.
-        """
-        try:
-            proc = subprocess.Popen(cmd_args, *args, **kw)
-            stdout, stderr = proc.communicate()
-        except TimeoutException:
-            # Runaway code, so kill it.
-            proc.kill()
-            # Re-raise exception.
-            raise
-        return proc, stdout, stderr
-
-    def _compile_command(self, cmd, *args, **kw):
-        """Compiles C/C++/java code and returns errors if any.
-        Run a command in a subprocess while blocking, the process is killed
-        if it takes more than 2 seconds to run.  Return the Popen object, the
-        stderr.
-        """
-        try:
-            proc_compile = subprocess.Popen(cmd, shell=True, stdin=None,
-                                            stdout=subprocess.PIPE,
-                                            stderr=subprocess.PIPE)
-            out, err = proc_compile.communicate()
-        except TimeoutException:
-            # Runaway code, so kill it.
-            proc_compile.kill()
-            # Re-raise exception.
-            raise
-        return proc_compile, err
-
-    def _change_dir(self, in_dir):
-        if in_dir is not None and isdir(in_dir):
-            os.chdir(in_dir)
-
-    def _remove_null_substitute_char(self, string):
-        """Returns a string without any null and substitute characters"""
-        stripped = ""
-        for c in string:
-            if ord(c) is not 26 and ord(c) is not 0:
-                stripped = stripped + c
-        return ''.join(stripped)
diff --git a/testapp/exam/code_server.py b/testapp/exam/code_server.py
index 1411ded..7c675cb 100755
--- a/testapp/exam/code_server.py
+++ b/testapp/exam/code_server.py
@@ -31,7 +31,7 @@ import re
 import json
 # Local imports.
 from settings import SERVER_PORTS, SERVER_POOL_PORT
-from language_registry import get_registry, set_registry
+from evaluators.language_registry import get_registry, set_registry
 
 
 MY_DIR = abspath(dirname(__file__))
diff --git a/testapp/exam/cpp_code_evaluator.py b/testapp/exam/cpp_code_evaluator.py
deleted file mode 100644
index 7242884..0000000
--- a/testapp/exam/cpp_code_evaluator.py
+++ /dev/null
@@ -1,125 +0,0 @@
-#!/usr/bin/env python
-import traceback
-import pwd
-import os
-from os.path import join, isfile
-import subprocess
-import importlib
-
-# local imports
-from code_evaluator import CodeEvaluator
-
-
-class CppCodeEvaluator(CodeEvaluator):
-    """Tests the C code obtained from Code Server"""
-    def __init__(self, test_case_data, test, language, user_answer,
-                     ref_code_path=None, in_dir=None):
-        super(CppCodeEvaluator, self).__init__(test_case_data, test, language,
-                                                 user_answer, ref_code_path,
-                                                 in_dir)
-        self.test_case_args = self._setup()
-
-    # Private Protocol ##########
-    def _setup(self):
-        super(CppCodeEvaluator, self)._setup()
-
-        get_ref_path = self.ref_code_path
-        ref_path, test_case_path = self._set_test_code_file_path(get_ref_path)
-        self.submit_path = self.create_submit_code_file('submit.c')
-
-        # Set file paths
-        c_user_output_path = os.getcwd() + '/output'
-        c_ref_output_path = os.getcwd() + '/executable'
-
-        # Set command variables
-        compile_command = 'g++  {0} -c -o {1}'.format(self.submit_path,
-                                                 c_user_output_path)
-        compile_main = 'g++ {0} {1} -o {2}'.format(ref_path,
-                                                c_user_output_path,
-                                                c_ref_output_path)
-        run_command_args = [c_ref_output_path]
-        remove_user_output = c_user_output_path
-        remove_ref_output = c_ref_output_path
-
-        return (ref_path, self.submit_path, compile_command, compile_main,
-                 run_command_args, remove_user_output, remove_ref_output)
-
-    def _teardown(self):
-        # Delete the created file.
-        super(CppCodeEvaluator, self)._teardown()
-        os.remove(self.submit_path)
-
-    def _check_code(self, ref_code_path, submit_code_path, compile_command,
-                     compile_main, run_command_args, remove_user_output,
-                     remove_ref_output):
-        """ Function validates student code using instructor code as
-        reference.The first argument ref_code_path, is the path to
-        instructor code, it is assumed to have executable permission.
-        The second argument submit_code_path, is the path to the student
-        code, it is assumed to have executable permission.
-
-        Returns
-        --------
-
-        returns (True, "Correct answer") : If the student function returns
-        expected output when called by reference code.
-
-        returns (False, error_msg): If the student function fails to return
-        expected output when called by reference code.
-
-        Returns (False, error_msg): If mandatory arguments are not files or
-        if the required permissions are not given to the file(s).
-
-        """
-        if not isfile(ref_code_path):
-            return False, "No file at %s or Incorrect path" % ref_code_path
-        if not isfile(submit_code_path):
-            return False, 'No file at %s or Incorrect path' % submit_code_path
-
-        success = False
-        ret = self._compile_command(compile_command)
-        proc, stdnt_stderr = ret
-        stdnt_stderr = self._remove_null_substitute_char(stdnt_stderr)
-
-        # Only if compilation is successful, the program is executed
-        # And tested with testcases
-        if stdnt_stderr == '':
-            ret = self._compile_command(compile_main)
-            proc, main_err = ret
-            main_err = self._remove_null_substitute_char(main_err)
-
-            if main_err == '':
-                ret = self._run_command(run_command_args, stdin=None,
-                                        stdout=subprocess.PIPE,
-                                        stderr=subprocess.PIPE)
-                proc, stdout, stderr = ret
-                if proc.returncode == 0:
-                    success, err = True, "Correct answer"
-                else:
-                    err = stdout + "\n" + stderr
-                os.remove(remove_ref_output)
-            else:
-                err = "Error:"
-                try:
-                    error_lines = main_err.splitlines()
-                    for e in error_lines:
-                        if ':' in e:
-                            err = err + "\n" + e.split(":", 1)[1]
-                        else:
-                            err = err + "\n" + e
-                except:
-                        err = err + "\n" + main_err
-            os.remove(remove_user_output)
-        else:
-            err = "Compilation Error:"
-            try:
-                error_lines = stdnt_stderr.splitlines()
-                for e in error_lines:
-                    if ':' in e:
-                        err = err + "\n" + e.split(":", 1)[1]
-                    else:
-                        err = err + "\n" + e
-            except:
-                err = err + "\n" + stdnt_stderr
-
-        return success, err
diff --git a/testapp/exam/evaluators/__init__.py b/testapp/exam/evaluators/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/testapp/exam/evaluators/bash_code_evaluator.py b/testapp/exam/evaluators/bash_code_evaluator.py
new file mode 100644
index 0000000..a468fd7
--- /dev/null
+++ b/testapp/exam/evaluators/bash_code_evaluator.py
@@ -0,0 +1,122 @@
+#!/usr/bin/env python
+import traceback
+import pwd
+import os
+from os.path import join, isfile
+import subprocess
+import importlib
+
+# local imports
+from code_evaluator import CodeEvaluator
+
+
+class BashCodeEvaluator(CodeEvaluator):
+    """Tests the Bash code obtained from Code Server"""
+    def __init__(self, test_case_data, test, language, user_answer,
+                     ref_code_path=None, in_dir=None):
+        super(BashCodeEvaluator, self).__init__(test_case_data, test, language, user_answer, 
+                                                 ref_code_path, in_dir)
+        self.test_case_args = self._setup()
+
+    # Private Protocol ##########
+    def _setup(self):
+        super(BashCodeEvaluator, self)._setup()
+
+        self.submit_path = self.create_submit_code_file('submit.sh')
+        self._set_file_as_executable(self.submit_path)
+        get_ref_path, get_test_case_path = self.ref_code_path.strip().split(',')
+        get_ref_path = get_ref_path.strip()
+        get_test_case_path = get_test_case_path.strip()
+        ref_path, test_case_path = self._set_test_code_file_path(get_ref_path,
+                                                             get_test_case_path)
+
+        return ref_path, self.submit_path, test_case_path
+
+    def _teardown(self):
+        # Delete the created file.
+        super(BashCodeEvaluator, self)._teardown()
+        os.remove(self.submit_path)
+
+    def _check_code(self, ref_path, submit_path,
+                          test_case_path=None):
+        """ Function validates student script using instructor script as
+        reference. Test cases can optionally be provided.  The first argument
+        ref_path, is the path to instructor script, it is assumed to
+        have executable permission.  The second argument submit_path, is
+        the path to the student script, it is assumed to have executable
+        permission.  The Third optional argument is the path to test the
+        scripts.  Each line in this file is a test case and each test case is
+        passed to the script as standard arguments.
+
+        Returns
+        --------
+
+        returns (True, "Correct answer") : If the student script passes all
+        test cases/have same output, when compared to the instructor script
+
+        returns (False, error_msg): If the student script fails a single
+        test/have dissimilar output, when compared to the instructor script.
+
+        Returns (False, error_msg): If mandatory arguments are not files or if
+        the required permissions are not given to the file(s).
+
+        """
+        if not isfile(ref_path):
+            return False, "No file at %s or Incorrect path" % ref_path
+        if not isfile(submit_path):
+            return False, "No file at %s or Incorrect path" % submit_path
+        if not os.access(ref_path, os.X_OK):
+            return False, "Script %s is not executable" % ref_path
+        if not os.access(submit_path, os.X_OK):
+            return False, "Script %s is not executable" % submit_path
+
+        success = False
+
+        if test_case_path is None or "":
+            ret = self._run_command(ref_path, stdin=None,
+                                    stdout=subprocess.PIPE,
+                                    stderr=subprocess.PIPE)
+            proc, inst_stdout, inst_stderr = ret
+            ret = self._run_command(submit_path, stdin=None,
+                                    stdout=subprocess.PIPE,
+                                    stderr=subprocess.PIPE)
+            proc, stdnt_stdout, stdnt_stderr = ret
+            if inst_stdout == stdnt_stdout:
+                return True, "Correct answer"
+            else:
+                err = "Error: expected %s, got %s" % (inst_stderr,
+                                                      stdnt_stderr)
+                return False, err
+        else:
+            if not isfile(test_case_path):
+                return False, "No test case at %s" % test_case_path
+            if not os.access(ref_path, os.R_OK):
+                return False, "Test script %s, not readable" % test_case_path
+            # valid_answer is True, so that we can stop once a test case fails
+            valid_answer = True
+            # loop_count has to be greater than or equal to one.
+            # Useful for caching things like empty test files,etc.
+            loop_count = 0
+            test_cases = open(test_case_path).readlines()
+            num_lines = len(test_cases)
+            for test_case in test_cases:
+                loop_count += 1
+                if valid_answer:
+                    args = [ref_path] + [x for x in test_case.split()]
+                    ret = self._run_command(args, stdin=None,
+                                            stdout=subprocess.PIPE,
+                                            stderr=subprocess.PIPE)
+                    proc, inst_stdout, inst_stderr = ret
+                    args = [submit_path]+[x for x in test_case.split()]
+                    ret = self._run_command(args, stdin=None,
+                                            stdout=subprocess.PIPE,
+                                            stderr=subprocess.PIPE)
+                    proc, stdnt_stdout, stdnt_stderr = ret
+                    valid_answer = inst_stdout == stdnt_stdout
+            if valid_answer and (num_lines == loop_count):
+                return True, "Correct answer"
+            else:
+                err = "Error:expected %s, got %s" % (inst_stdout+inst_stderr,
+                                                     stdnt_stdout+stdnt_stderr)
+                return False, err
+
diff --git a/testapp/exam/evaluators/code_evaluator.py b/testapp/exam/evaluators/code_evaluator.py
new file mode 100644
index 0000000..381b2e8
--- /dev/null
+++ b/testapp/exam/evaluators/code_evaluator.py
@@ -0,0 +1,206 @@
+import sys
+from SimpleXMLRPCServer import SimpleXMLRPCServer
+import pwd
+import os
+import stat
+from os.path import isdir, dirname, abspath, join, isfile
+import signal
+from multiprocessing import Process, Queue
+import subprocess
+import re
+import json
+# Local imports.
+from settings import SERVER_TIMEOUT
+
+
+MY_DIR = abspath(dirname(__file__))
+
+
+# Raised when the code times-out.
+# c.f. http://pguides.net/python/timeout-a-function
+class TimeoutException(Exception):
+    pass
+
+
+def timeout_handler(signum, frame):
+    """A handler for the ALARM signal."""
+    raise TimeoutException('Code took too long to run.')
+
+
+def create_signal_handler():
+    """Add a new signal handler for the execution of this code."""
+    prev_handler = signal.signal(signal.SIGALRM, timeout_handler)
+    signal.alarm(SERVER_TIMEOUT)
+    return prev_handler
+
+
+def set_original_signal_handler(old_handler=None):
+    """Set back any original signal handler."""
+    if old_handler is not None:
+        signal.signal(signal.SIGALRM, old_handler)
+        return
+    else:
+        raise Exception("Signal Handler: object cannot be NoneType")
+
+
+def delete_signal_handler():
+    signal.alarm(0)
+    return
+
+
+class CodeEvaluator(object):
+    """Tests the code obtained from Code Server"""
+    def __init__(self, test_case_data, test, language, user_answer, 
+                     ref_code_path=None, in_dir=None):
+        msg = 'Code took more than %s seconds to run. You probably '\
+              'have an infinite loop in your code.' % SERVER_TIMEOUT
+        self.timeout_msg = msg
+        self.test_case_data = test_case_data
+        self.language = language.lower()
+        self.user_answer = user_answer
+        self.ref_code_path = ref_code_path
+        self.test = test
+        self.in_dir = in_dir
+        self.test_case_args = None
+
+    # Public Protocol ##########
+    @classmethod
+    def from_json(cls, language, json_data, in_dir):
+        json_data = json.loads(json_data)
+        test_case_data = json_data.get("test_case_data")
+        user_answer = json_data.get("user_answer")
+        ref_code_path = json_data.get("ref_code_path")
+        test = json_data.get("test") 
+
+        instance = cls(test_case_data, test, language, user_answer, ref_code_path,
+                         in_dir)
+        return instance
+
+    def evaluate(self):
+        """Evaluates given code with the test cases based on
+        given arguments in test_case_data.
+
+        The ref_code_path is a path to the reference code.
+        The reference code will call the function submitted by the student.
+        The reference code will check for the expected output.
+
+        If the path's start with a "/" then we assume they are absolute paths.
+        If not, we assume they are relative paths w.r.t. the location of this
+        code_server script.
+
+        If the optional `in_dir` keyword argument is supplied it changes the
+        directory to that directory (it does not change it back to the original
+        when done).
+
+        Returns
+        -------
+
+        A tuple: (success, error message).
+        """
+
+        self._setup()
+        success, err = self._evaluate(self.test_case_args)
+        self._teardown()
+
+        result = {'success': success, 'error': err}
+        return result
+
+    # Private Protocol ##########
+    def _setup(self):
+        self._change_dir(self.in_dir)
+
+    def _evaluate(self, args):
+        # Add a new signal handler for the execution of this code.
+        prev_handler = create_signal_handler()
+        success = False
+        args = args or []
+
+        # Do whatever testing needed.
+        try:
+            success, err = self._check_code(*args)
+
+        except TimeoutException:
+            err = self.timeout_msg
+        except:
+            _type, value = sys.exc_info()[:2]
+            err = "Error: {0}".format(repr(value))
+        finally:
+            # Set back any original signal handler.
+            set_original_signal_handler(prev_handler)
+
+        return success, err
+
+    def _teardown(self):
+        # Cancel the signal
+        delete_signal_handler()
+
+    def _check_code(self):
+        raise NotImplementedError("check_code method not implemented")
+
+    def create_submit_code_file(self, file_name):
+        """ Write the code (`answer`) to a file and set the file path"""
+        submit_f = open(file_name, 'w')
+        submit_f.write(self.user_answer.lstrip())
+        submit_f.close()
+        submit_path = abspath(submit_f.name)
+
+        return submit_path
+
+    def _set_file_as_executable(self, fname):
+        os.chmod(fname,  stat.S_IRUSR | stat.S_IWUSR | stat.S_IXUSR
+                 | stat.S_IRGRP | stat.S_IWGRP | stat.S_IXGRP
+                 | stat.S_IROTH | stat.S_IWOTH | stat.S_IXOTH)
+
+    def _set_test_code_file_path(self, ref_path=None, test_case_path=None):
+        if ref_path and not ref_path.startswith('/'):
+            ref_path = join(MY_DIR, ref_path)
+
+        if test_case_path and not test_case_path.startswith('/'):
+            test_case_path = join(MY_DIR, test_case_path)
+
+        return ref_path, test_case_path
+
+    def _run_command(self, cmd_args, *args, **kw):
+        """Run a command in a subprocess while blocking, the process is killed
+        if it takes more than 2 seconds to run.  Return the Popen object, the
+        stdout and stderr.
+        """
+        try:
+            proc = subprocess.Popen(cmd_args, *args, **kw)
+            stdout, stderr = proc.communicate()
+        except TimeoutException:
+            # Runaway code, so kill it.
+            proc.kill()
+            # Re-raise exception.
+            raise
+        return proc, stdout, stderr
+
+    def _compile_command(self, cmd, *args, **kw):
+        """Compiles C/C++/java code and returns errors if any.
+        Run a command in a subprocess while blocking, the process is killed
+        if it takes more than 2 seconds to run.  Return the Popen object, the
+        stderr.
+        """
+        try:
+            proc_compile = subprocess.Popen(cmd, shell=True, stdin=None,
+                                            stdout=subprocess.PIPE,
+                                            stderr=subprocess.PIPE)
+            out, err = proc_compile.communicate()
+        except TimeoutException:
+            # Runaway code, so kill it.
+            proc_compile.kill()
+            # Re-raise exception.
+            raise
+        return proc_compile, err
+
+    def _change_dir(self, in_dir):
+        if in_dir is not None and isdir(in_dir):
+            os.chdir(in_dir)
+
+    def _remove_null_substitute_char(self, string):
+        """Returns a string without any null and substitute characters"""
+        stripped = ""
+        for c in string:
+            if ord(c) is not 26 and ord(c) is not 0:
+                stripped = stripped + c
+        return ''.join(stripped)
diff --git a/testapp/exam/evaluators/cpp_code_evaluator.py b/testapp/exam/evaluators/cpp_code_evaluator.py
new file mode 100644
index 0000000..7242884
--- /dev/null
+++ b/testapp/exam/evaluators/cpp_code_evaluator.py
@@ -0,0 +1,125 @@
+#!/usr/bin/env python
+import traceback
+import pwd
+import os
+from os.path import join, isfile
+import subprocess
+import importlib
+
+# local imports
+from code_evaluator import CodeEvaluator
+
+
+class CppCodeEvaluator(CodeEvaluator):
+    """Tests the C code obtained from Code Server"""
+    def __init__(self, test_case_data, test, language, user_answer,
+                     ref_code_path=None, in_dir=None):
+        super(CppCodeEvaluator, self).__init__(test_case_data, test, language,
+                                                 user_answer, ref_code_path,
+                                                 in_dir)
+        self.test_case_args = self._setup()
+
+    # Private Protocol ##########
+    def _setup(self):
+        super(CppCodeEvaluator, self)._setup()
+
+        get_ref_path = self.ref_code_path
+        ref_path, test_case_path = self._set_test_code_file_path(get_ref_path)
+        self.submit_path = self.create_submit_code_file('submit.c')
+
+        # Set file paths
+        c_user_output_path = os.getcwd() + '/output'
+        c_ref_output_path = os.getcwd() + '/executable'
+
+        # Set command variables
+        compile_command = 'g++  {0} -c -o {1}'.format(self.submit_path,
+                                                 c_user_output_path)
+        compile_main = 'g++ {0} {1} -o {2}'.format(ref_path,
+                                                c_user_output_path,
+                                                c_ref_output_path)
+        run_command_args = [c_ref_output_path]
+        remove_user_output = c_user_output_path
+        remove_ref_output = c_ref_output_path
+
+        return (ref_path, self.submit_path, compile_command, compile_main,
+                 run_command_args, remove_user_output, remove_ref_output)
+
+    def _teardown(self):
+        # Delete the created file.
+        super(CppCodeEvaluator, self)._teardown()
+        os.remove(self.submit_path)
+
+    def _check_code(self, ref_code_path, submit_code_path, compile_command,
+                     compile_main, run_command_args, remove_user_output,
+                     remove_ref_output):
+        """ Function validates student code using instructor code as
+        reference.The first argument ref_code_path, is the path to
+        instructor code, it is assumed to have executable permission.
+        The second argument submit_code_path, is the path to the student
+        code, it is assumed to have executable permission.
+
+        Returns
+        --------
+
+        returns (True, "Correct answer") : If the student function returns
+        expected output when called by reference code.
+
+        returns (False, error_msg): If the student function fails to return
+        expected output when called by reference code.
+
+        Returns (False, error_msg): If mandatory arguments are not files or
+        if the required permissions are not given to the file(s).
+
+        """
+        if not isfile(ref_code_path):
+            return False, "No file at %s or Incorrect path" % ref_code_path
+        if not isfile(submit_code_path):
+            return False, 'No file at %s or Incorrect path' % submit_code_path
+
+        success = False
+        ret = self._compile_command(compile_command)
+        proc, stdnt_stderr = ret
+        stdnt_stderr = self._remove_null_substitute_char(stdnt_stderr)
+
+        # Only if compilation is successful, the program is executed
+        # And tested with testcases
+        if stdnt_stderr == '':
+            ret = self._compile_command(compile_main)
+            proc, main_err = ret
+            main_err = self._remove_null_substitute_char(main_err)
+
+            if main_err == '':
+                ret = self._run_command(run_command_args, stdin=None,
+                                        stdout=subprocess.PIPE,
+                                        stderr=subprocess.PIPE)
+                proc, stdout, stderr = ret
+                if proc.returncode == 0:
+                    success, err = True, "Correct answer"
+                else:
+                    err = stdout + "\n" + stderr
+                os.remove(remove_ref_output)
+            else:
+                err = "Error:"
+                try:
+                    error_lines = main_err.splitlines()
+                    for e in error_lines:
+                        if ':' in e:
+                            err = err + "\n" + e.split(":", 1)[1]
+                        else:
+                            err = err + "\n" + e
+                except:
+                        err = err + "\n" + main_err
+            os.remove(remove_user_output)
+        else:
+            err = "Compilation Error:"
+            try:
+                error_lines = stdnt_stderr.splitlines()
+                for e in error_lines:
+                    if ':' in e:
+                        err = err + "\n" + e.split(":", 1)[1]
+                    else:
+                        err = err + "\n" + e
+            except:
+                err = err + "\n" + stdnt_stderr
+
+        return success, err
diff --git a/testapp/exam/evaluators/java_code_evaluator.py b/testapp/exam/evaluators/java_code_evaluator.py
new file mode 100644
index 0000000..4367259
--- /dev/null
+++ b/testapp/exam/evaluators/java_code_evaluator.py
@@ -0,0 +1,128 @@
+#!/usr/bin/env python
+import traceback
+import pwd
+import os
+from os.path import join, isfile
+import subprocess
+import importlib
+
+# local imports
+from code_evaluator import CodeEvaluator
+
+
+class JavaCodeEvaluator(CodeEvaluator):
+    """Tests the Java code obtained from Code Server"""
+    def __init__(self, test_case_data, test, language, user_answer,
+                     ref_code_path=None, in_dir=None):
+        super(JavaCodeEvaluator, self).__init__(test_case_data, test,
+                                                 language, user_answer,
+                                                 ref_code_path, in_dir)
+        self.test_case_args = self._setup()
+
+    # Private Protocol ##########
+    def _setup(self):
+        super(JavaCodeEvaluator, self)._setup()
+
+        ref_path, test_case_path = self._set_test_code_file_path(self.ref_code_path)
+        self.submit_path = self.create_submit_code_file('Test.java')
+
+        # Set file paths
+        java_student_directory = os.getcwd() + '/'
+        java_ref_file_name = (ref_path.split('/')[-1]).split('.')[0]
+
+        # Set command variables
+        compile_command = 'javac  {0}'.format(self.submit_path),
+        compile_main = ('javac {0} -classpath '
+                        '{1} -d {2}').format(ref_path,
+                                             java_student_directory,
+                                             java_student_directory)
+        run_command_args = "java -cp {0} {1}".format(java_student_directory,
+                                                     java_ref_file_name)
+        remove_user_output = "{0}{1}.class".format(java_student_directory,
+                                                     'Test')
+        remove_ref_output = "{0}{1}.class".format(java_student_directory,
+                                                     java_ref_file_name)
+
+        return (ref_path, self.submit_path, compile_command, compile_main,
+                     run_command_args, remove_user_output, remove_ref_output)
+
+    def _teardown(self):
+        # Delete the created file.
+        super(JavaCodeEvaluator, self)._teardown()
+        os.remove(self.submit_path)
+
+    def _check_code(self, ref_code_path, submit_code_path, compile_command,
+                     compile_main, run_command_args, remove_user_output,
+                     remove_ref_output):
+        """ Function validates student code using instructor code as
+        reference.The first argument ref_code_path, is the path to
+        instructor code, it is assumed to have executable permission.
+        The second argument submit_code_path, is the path to the student
+        code, it is assumed to have executable permission.
+
+        Returns
+        --------
+
+        returns (True, "Correct answer") : If the student function returns
+        expected output when called by reference code.
+
+        returns (False, error_msg): If the student function fails to return
+        expected output when called by reference code.
+
+        Returns (False, error_msg): If mandatory arguments are not files or
+        if the required permissions are not given to the file(s).
+
+        """
+        if not isfile(ref_code_path):
+            return False, "No file at %s or Incorrect path" % ref_code_path
+        if not isfile(submit_code_path):
+            return False, 'No file at %s or Incorrect path' % submit_code_path
+
+        success = False
+        ret = self._compile_command(compile_command)
+        proc, stdnt_stderr = ret
+        stdnt_stderr = self._remove_null_substitute_char(stdnt_stderr)
+
+        # Only if compilation is successful, the program is executed
+        # And tested with testcases
+        if stdnt_stderr == '':
+            ret = self._compile_command(compile_main)
+            proc, main_err = ret
+            main_err = self._remove_null_substitute_char(main_err)
+
+            if main_err == '':
+                ret = self._run_command(run_command_args, shell=True,
+                                         stdin=None,
+                                         stdout=subprocess.PIPE,
+                                         stderr=subprocess.PIPE)
+                proc, stdout, stderr = ret
+                if proc.returncode == 0:
+                    success, err = True, "Correct answer"
+                else:
+                    err = stdout + "\n" + stderr
+                os.remove(remove_ref_output)
+            else:
+                err = "Error:"
+                try:
+                    error_lines = main_err.splitlines()
+                    for e in error_lines:
+                        if ':' in e:
+                            err = err + "\n" + e.split(":", 1)[1]
+                        else:
+                            err = err + "\n" + e
+                except:
+                        err = err + "\n" + main_err
+            os.remove(remove_user_output)
+        else:
+            err = "Compilation Error:"
+            try:
+                error_lines = stdnt_stderr.splitlines()
+                for e in error_lines:
+                    if ':' in e:
+                        err = err + "\n" + e.split(":", 1)[1]
+                    else:
+                        err = err + "\n" + e
+            except:
+                err = err + "\n" + stdnt_stderr
+
+        return success, err
diff --git a/testapp/exam/evaluators/language_registry.py b/testapp/exam/evaluators/language_registry.py
new file mode 100644
index 0000000..76a23d7
--- /dev/null
+++ b/testapp/exam/evaluators/language_registry.py
@@ -0,0 +1,36 @@
+from settings import code_evaluators
+import importlib
+
+registry = None
+
+def set_registry():
+    global registry
+    registry = _LanguageRegistry()
+    
+def get_registry():
+    return registry
+
+class _LanguageRegistry(object):
+    def __init__(self):
+        self._register = {}
+        for language, module in code_evaluators.iteritems():
+            self._register[language] = None
+
+    # Public Protocol ##########
+    def get_class(self, language):
+        """ Get the code evaluator class for the given language """
+        if not self._register.get(language):
+            self._register[language] = code_evaluators.get(language)
+
+        cls = self._register[language]
+        module_name, class_name = cls.rsplit(".", 1)
+        # load the module, will raise ImportError if module cannot be loaded
+        get_module = importlib.import_module(module_name)
+        # get the class, will raise AttributeError if class cannot be found
+        get_class = getattr(get_module, class_name)
+        return get_class
+
+    def register(self, language, class_name):
+        """ Register a new code evaluator class for language"""
+        self._register[language] = class_name
+
diff --git a/testapp/exam/evaluators/python_code_evaluator.py b/testapp/exam/evaluators/python_code_evaluator.py
new file mode 100644
index 0000000..0c473cf
--- /dev/null
+++ b/testapp/exam/evaluators/python_code_evaluator.py
@@ -0,0 +1,61 @@
+#!/usr/bin/env python
+import sys
+import traceback
+import os
+from os.path import join
+import importlib
+
+# local imports
+from code_evaluator import CodeEvaluator
+
+
+class PythonCodeEvaluator(CodeEvaluator):
+    """Tests the Python code obtained from Code Server"""
+    # Private Protocol ##########
+    def _check_code(self):
+        success = False
+
+        try:
+            tb = None
+            test_code = self._create_test_case()
+            submitted = compile(self.user_answer, '<string>', mode='exec')
+            g = {}
+            exec submitted in g
+            _tests = compile(test_code, '<string>', mode='exec')
+            exec _tests in g
+        except AssertionError:
+            type, value, tb = sys.exc_info()
+            info = traceback.extract_tb(tb)
+            fname, lineno, func, text = info[-1]
+            text = str(test_code).splitlines()[lineno-1]
+            err = "{0} {1} in: {2}".format(type.__name__, str(value), text)
+        else:
+            success = True
+            err = 'Correct answer'
+
+        del tb
+        return success, err
+
+    def _create_test_case(self):
+        """
+            Create assert based test cases in python
+        """
+        test_code = ""
+        if self.test:
+            return self.test
+        elif self.test_case_data:
+            for test_case in self.test_case_data:
+                pos_args = ", ".join(str(i) for i in test_case.get('pos_args')) \
+                                    if test_case.get('pos_args') else ""
+                kw_args = ", ".join(str(k+"="+a) for k, a
+                                 in test_case.get('kw_args').iteritems()) \
+                                if test_case.get('kw_args') else ""
+                args = pos_args + ", " + kw_args if pos_args and kw_args \
+                                                    else pos_args or kw_args
+                function_name = test_case.get('func_name')
+                expected_answer = test_case.get('expected_answer')
+
+                tcode = "assert {0}({1}) == {2}".format(function_name, args,
+                                             expected_answer)
+                test_code += tcode + "\n"
+            return test_code
diff --git a/testapp/exam/evaluators/scilab_code_evaluator.py b/testapp/exam/evaluators/scilab_code_evaluator.py
new file mode 100644
index 0000000..392cd45
--- /dev/null
+++ b/testapp/exam/evaluators/scilab_code_evaluator.py
@@ -0,0 +1,105 @@
+#!/usr/bin/env python
+import traceback
+import os
+from os.path import join, isfile
+import subprocess
+import re
+import importlib
+
+# local imports
+from code_evaluator import CodeEvaluator
+
+
+class ScilabCodeEvaluator(CodeEvaluator):
+    """Tests the Scilab code obtained from Code Server"""
+    def __init__(self, test_case_data, test, language, user_answer,
+                     ref_code_path=None, in_dir=None):
+        super(ScilabCodeEvaluator, self).__init__(test_case_data, test,
+                                                 language, user_answer,
+                                                 ref_code_path, in_dir)
+
+        # Removes all the commands that terminates scilab
+        self.user_answer, self.terminate_commands = self._remove_scilab_exit(user_answer.lstrip())
+        self.test_case_args = self._setup()
+
+    # Private Protocol ##########
+    def _setup(self):
+        super(ScilabCodeEvaluator, self)._setup()
+
+        ref_path, test_case_path = self._set_test_code_file_path(self.ref_code_path)
+        self.submit_path = self.create_submit_code_file('function.sci')
+
+        return ref_path, # Return as a tuple
+
+    def _teardown(self):
+        # Delete the created file.
+        super(ScilabCodeEvaluator, self)._teardown()
+        os.remove(self.submit_path)
+
+    def _check_code(self, ref_path):
+        success = False
+
+        # Throw message if there are commmands that terminates scilab
+        add_err=""
+        if self.terminate_commands:
+            add_err = "Please do not use exit, quit and abort commands in your\
+                        code.\n Otherwise your code will not be evaluated\
+                        correctly.\n"
+
+        cmd = 'printf "lines(0)\nexec(\'{0}\',2);\nquit();"'.format(ref_path)
+        cmd += ' | timeout 8 scilab-cli -nb'
+        ret = self._run_command(cmd,
+                                shell=True,
+                                stdout=subprocess.PIPE,
+                                stderr=subprocess.PIPE)
+        proc, stdout, stderr = ret
+
+        # Get only the error.
+        stderr = self._get_error(stdout)
+        if stderr is None:
+            # Clean output
+            stdout = self._strip_output(stdout)
+            if proc.returncode == 5:
+                success, err = True, "Correct answer"
+            else:
+                err = add_err + stdout
+        else:
+            err = add_err + stderr
+
+        return success, err
+
+    def _remove_scilab_exit(self, string):
+        """
+            Removes exit, quit and abort from the scilab code
+        """
+        new_string = ""
+        terminate_commands = False
+        for line in string.splitlines():
+            new_line = re.sub(r"exit.*$", "", line)
+            new_line = re.sub(r"quit.*$", "", new_line)
+            new_line = re.sub(r"abort.*$", "", new_line)
+            if line != new_line:
+                terminate_commands = True
+            new_string = new_string + '\n' + new_line
+        return new_string, terminate_commands
+
+    def _get_error(self, string):
+        """
+            Fetches only the error from the string.
+            Returns None if no error.
+        """
+        obj = re.search("!.+\n.+", string)
+        if obj:
+            return obj.group()
+        return None
+
+    def _strip_output(self, out):
+        """
+            Cleans whitespace from the output
+        """
+        strip_out = "Message"
+        for l in out.split('\n'):
+            if l.strip():
+                strip_out = strip_out+"\n"+l.strip()
+        return strip_out
+
diff --git a/testapp/exam/java_code_evaluator.py b/testapp/exam/java_code_evaluator.py
deleted file mode 100644
index 4367259..0000000
--- a/testapp/exam/java_code_evaluator.py
+++ /dev/null
@@ -1,128 +0,0 @@
-#!/usr/bin/env python
-import traceback
-import pwd
-import os
-from os.path import join, isfile
-import subprocess
-import importlib
-
-# local imports
-from code_evaluator import CodeEvaluator
-
-
-class JavaCodeEvaluator(CodeEvaluator):
-    """Tests the Java code obtained from Code Server"""
-    def __init__(self, test_case_data, test, language, user_answer,
-                     ref_code_path=None, in_dir=None):
-        super(JavaCodeEvaluator, self).__init__(test_case_data, test,
-                                                 language, user_answer,
-                                                 ref_code_path, in_dir)
-        self.test_case_args = self._setup()
-
-    # Private Protocol ##########
-    def _setup(self):
-        super(JavaCodeEvaluator, self)._setup()
-
-        ref_path, test_case_path = self._set_test_code_file_path(self.ref_code_path)
-        self.submit_path = self.create_submit_code_file('Test.java')
-
-        # Set file paths
-        java_student_directory = os.getcwd() + '/'
-        java_ref_file_name = (ref_path.split('/')[-1]).split('.')[0]
-
-        # Set command variables
-        compile_command = 'javac  {0}'.format(self.submit_path),
-        compile_main = ('javac {0} -classpath '
-                        '{1} -d {2}').format(ref_path,
-                                             java_student_directory,
-                                             java_student_directory)
-        run_command_args = "java -cp {0} {1}".format(java_student_directory,
-                                                     java_ref_file_name)
-        remove_user_output = "{0}{1}.class".format(java_student_directory,
-                                                     'Test')
-        remove_ref_output = "{0}{1}.class".format(java_student_directory,
-                                                     java_ref_file_name)
-
-        return (ref_path, self.submit_path, compile_command, compile_main,
-                     run_command_args, remove_user_output, remove_ref_output)
-
-    def _teardown(self):
-        # Delete the created file.
-        super(JavaCodeEvaluator, self)._teardown()
-        os.remove(self.submit_path)
-
-    def _check_code(self, ref_code_path, submit_code_path, compile_command,
-                     compile_main, run_command_args, remove_user_output,
-                     remove_ref_output):
-        """ Function validates student code using instructor code as
-        reference.The first argument ref_code_path, is the path to
-        instructor code, it is assumed to have executable permission.
-        The second argument submit_code_path, is the path to the student
-        code, it is assumed to have executable permission.
-
-        Returns
-        --------
-
-        returns (True, "Correct answer") : If the student function returns
-        expected output when called by reference code.
-
-        returns (False, error_msg): If the student function fails to return
-        expected output when called by reference code.
-
-        Returns (False, error_msg): If mandatory arguments are not files or
-        if the required permissions are not given to the file(s).
-
-        """
-        if not isfile(ref_code_path):
-            return False, "No file at %s or Incorrect path" % ref_code_path
-        if not isfile(submit_code_path):
-            return False, 'No file at %s or Incorrect path' % submit_code_path
-
-        success = False
-        ret = self._compile_command(compile_command)
-        proc, stdnt_stderr = ret
-        stdnt_stderr = self._remove_null_substitute_char(stdnt_stderr)
-
-        # Only if compilation is successful, the program is executed
-        # And tested with testcases
-        if stdnt_stderr == '':
-            ret = self._compile_command(compile_main)
-            proc, main_err = ret
-            main_err = self._remove_null_substitute_char(main_err)
-
-            if main_err == '':
-                ret = self._run_command(run_command_args, shell=True,
-                                         stdin=None,
-                                         stdout=subprocess.PIPE,
-                                         stderr=subprocess.PIPE)
-                proc, stdout, stderr = ret
-                if proc.returncode == 0:
-                    success, err = True, "Correct answer"
-                else:
-                    err = stdout + "\n" + stderr
-                os.remove(remove_ref_output)
-            else:
-                err = "Error:"
-                try:
-                    error_lines = main_err.splitlines()
-                    for e in error_lines:
-                        if ':' in e:
-                            err = err + "\n" + e.split(":", 1)[1]
-                        else:
-                            err = err + "\n" + e
-                except:
-                        err = err + "\n" + main_err
-            os.remove(remove_user_output)
-        else:
-            err = "Compilation Error:"
-            try:
-                error_lines = stdnt_stderr.splitlines()
-                for e in error_lines:
-                    if ':' in e:
-                        err = err + "\n" + e.split(":", 1)[1]
-                    else:
-                        err = err + "\n" + e
-            except:
-                err = err + "\n" + stdnt_stderr
-
-        return success, err
diff --git a/testapp/exam/language_registry.py b/testapp/exam/language_registry.py
deleted file mode 100644
index 76a23d7..0000000
--- a/testapp/exam/language_registry.py
+++ /dev/null
@@ -1,36 +0,0 @@
-from settings import code_evaluators
-import importlib
-
-registry = None
-
-def set_registry():
-    global registry
-    registry = _LanguageRegistry()
-    
-def get_registry():
-    return registry
-
-class _LanguageRegistry(object):
-    def __init__(self):
-        self._register = {}
-        for language, module in code_evaluators.iteritems():
-            self._register[language] = None
-
-    # Public Protocol ##########
-    def get_class(self, language):
-        """ Get the code evaluator class for the given language """
-        if not self._register.get(language):
-            self._register[language] = code_evaluators.get(language)
-
-        cls = self._register[language]
-        module_name, class_name = cls.rsplit(".", 1)
-        # load the module, will raise ImportError if module cannot be loaded
-        get_module = importlib.import_module(module_name)
-        # get the class, will raise AttributeError if class cannot be found
-        get_class = getattr(get_module, class_name)
-        return get_class
-
-    def register(self, language, class_name):
-        """ Register a new code evaluator class for language"""
-        self._register[language] = class_name
-
diff --git a/testapp/exam/python_code_evaluator.py b/testapp/exam/python_code_evaluator.py
deleted file mode 100644
index 0c473cf..0000000
--- a/testapp/exam/python_code_evaluator.py
+++ /dev/null
@@ -1,61 +0,0 @@
-#!/usr/bin/env python
-import sys
-import traceback
-import os
-from os.path import join
-import importlib
-
-# local imports
-from code_evaluator import CodeEvaluator
-
-
-class PythonCodeEvaluator(CodeEvaluator):
-    """Tests the Python code obtained from Code Server"""
-    # Private Protocol ##########
-    def _check_code(self):
-        success = False
-
-        try:
-            tb = None
-            test_code = self._create_test_case()
-            submitted = compile(self.user_answer, '<string>', mode='exec')
-            g = {}
-            exec submitted in g
-            _tests = compile(test_code, '<string>', mode='exec')
-            exec _tests in g
-        except AssertionError:
-            type, value, tb = sys.exc_info()
-            info = traceback.extract_tb(tb)
-            fname, lineno, func, text = info[-1]
-            text = str(test_code).splitlines()[lineno-1]
-            err = "{0} {1} in: {2}".format(type.__name__, str(value), text)
-        else:
-            success = True
-            err = 'Correct answer'
-
-        del tb
-        return success, err
-
-    def _create_test_case(self):
-        """
-            Create assert based test cases in python
-        """
-        test_code = ""
-        if self.test:
-            return self.test
-        elif self.test_case_data:
-            for test_case in self.test_case_data:
-                pos_args = ", ".join(str(i) for i in test_case.get('pos_args')) \
-                                    if test_case.get('pos_args') else ""
-                kw_args = ", ".join(str(k+"="+a) for k, a
-                                 in test_case.get('kw_args').iteritems()) \
-                                if test_case.get('kw_args') else ""
-                args = pos_args + ", " + kw_args if pos_args and kw_args \
-                                                    else pos_args or kw_args
-                function_name = test_case.get('func_name')
-                expected_answer = test_case.get('expected_answer')
-
-                tcode = "assert {0}({1}) == {2}".format(function_name, args,
-                                             expected_answer)
-                test_code += tcode + "\n"
-            return test_code
diff --git a/testapp/exam/scilab_code_evaluator.py b/testapp/exam/scilab_code_evaluator.py
deleted file mode 100644
index 392cd45..0000000
--- a/testapp/exam/scilab_code_evaluator.py
+++ /dev/null
@@ -1,105 +0,0 @@
-#!/usr/bin/env python
-import traceback
-import os
-from os.path import join, isfile
-import subprocess
-import re
-import importlib
-
-# local imports
-from code_evaluator import CodeEvaluator
-
-
-class ScilabCodeEvaluator(CodeEvaluator):
-    """Tests the Scilab code obtained from Code Server"""
-    def __init__(self, test_case_data, test, language, user_answer,
-                     ref_code_path=None, in_dir=None):
-        super(ScilabCodeEvaluator, self).__init__(test_case_data, test,
-                                                 language, user_answer,
-                                                 ref_code_path, in_dir)
-
-        # Removes all the commands that terminates scilab
-        self.user_answer, self.terminate_commands = self._remove_scilab_exit(user_answer.lstrip())
-        self.test_case_args = self._setup()
-
-    # Private Protocol ##########
-    def _setup(self):
-        super(ScilabCodeEvaluator, self)._setup()
-
-        ref_path, test_case_path = self._set_test_code_file_path(self.ref_code_path)
-        self.submit_path = self.create_submit_code_file('function.sci')
-
-        return ref_path, # Return as a tuple
-
-    def _teardown(self):
-        # Delete the created file.
-        super(ScilabCodeEvaluator, self)._teardown()
-        os.remove(self.submit_path)
-
-    def _check_code(self, ref_path):
-        success = False
-
-        # Throw message if there are commmands that terminates scilab
-        add_err=""
-        if self.terminate_commands:
-            add_err = "Please do not use exit, quit and abort commands in your\
-                        code.\n Otherwise your code will not be evaluated\
-                        correctly.\n"
-
-        cmd = 'printf "lines(0)\nexec(\'{0}\',2);\nquit();"'.format(ref_path)
-        cmd += ' | timeout 8 scilab-cli -nb'
-        ret = self._run_command(cmd,
-                                shell=True,
-                                stdout=subprocess.PIPE,
-                                stderr=subprocess.PIPE)
-        proc, stdout, stderr = ret
-
-        # Get only the error.
-        stderr = self._get_error(stdout)
-        if stderr is None:
-            # Clean output
-            stdout = self._strip_output(stdout)
-            if proc.returncode == 5:
-                success, err = True, "Correct answer"
-            else:
-                err = add_err + stdout
-        else:
-            err = add_err + stderr
-
-        return success, err
-
-    def _remove_scilab_exit(self, string):
-        """
-            Removes exit, quit and abort from the scilab code
-        """
-        new_string = ""
-        terminate_commands = False
-        for line in string.splitlines():
-            new_line = re.sub(r"exit.*$", "", line)
-            new_line = re.sub(r"quit.*$", "", new_line)
-            new_line = re.sub(r"abort.*$", "", new_line)
-            if line != new_line:
-                terminate_commands = True
-            new_string = new_string + '\n' + new_line
-        return new_string, terminate_commands
-
-    def _get_error(self, string):
-        """
-            Fetches only the error from the string.
-            Returns None if no error.
-        """
-        obj = re.search("!.+\n.+", string)
-        if obj:
-            return obj.group()
-        return None
-
-    def _strip_output(self, out):
-        """
-            Cleans whitespace from the output
-        """
-        strip_out = "Message"
-        for l in out.split('\n'):
-            if l.strip():
-                strip_out = strip_out+"\n"+l.strip()
-        return strip_out
-
diff --git a/testapp/exam/settings.py b/testapp/exam/settings.py
index 93f90a9..abbc275 100644
--- a/testapp/exam/settings.py
+++ b/testapp/exam/settings.py
@@ -19,10 +19,10 @@ SERVER_TIMEOUT = 2
 # host.org/foo/exam set URL_ROOT='/foo'
 URL_ROOT = ''
 
-code_evaluators = {"python": "python_code_evaluator.PythonCodeEvaluator",
-					 "c": "c_cpp_code_evaluator.CCPPCodeEvaluator",
-					 "cpp": "c_cpp_code_evaluator.CCPPCodeEvaluator",
-					 "java": "java_evaluator.JavaCodeEvaluator",
-					 "bash": "bash_evaluator.BashCodeEvaluator",
-					 "scilab": "scilab_evaluator.ScilabCodeEvaluator",
+code_evaluators = {"python": "evaluators.python_code_evaluator.PythonCodeEvaluator",
+					 "c": "evaluators.c_cpp_code_evaluator.CCPPCodeEvaluator",
+					 "cpp": "evaluators.c_cpp_code_evaluator.CCPPCodeEvaluator",
+					 "java": "evaluators.java_evaluator.JavaCodeEvaluator",
+					 "bash": "evaluators.bash_evaluator.BashCodeEvaluator",
+					 "scilab": "evaluators.scilab_evaluator.ScilabCodeEvaluator",
 					}
diff --git a/testapp/manage.py b/testapp/manage.py
deleted file mode 100755
index 3e4eedc..0000000
--- a/testapp/manage.py
+++ /dev/null
@@ -1,14 +0,0 @@
-#!/usr/bin/env python
-from django.core.management import execute_manager
-import imp
-try:
-    imp.find_module('settings') # Assumed to be in the same directory.
-except ImportError:
-    import sys
-    sys.stderr.write("Error: Can't find the file 'settings.py' in the directory containing %r. It appears you've customized things.\nYou'll have to run django-admin.py, passing it your settings module.\n" % __file__)
-    sys.exit(1)
-
-import settings
-
-if __name__ == "__main__":
-    execute_manager(settings)
diff --git a/testapp/production.py b/testapp/production.py
deleted file mode 100644
index 8a1da98..0000000
--- a/testapp/production.py
+++ /dev/null
@@ -1,11 +0,0 @@
-from testapp.settings import *
-
-DEBUG = False
-TEMPLATE_DEBUG = DEBUG
-from testapp.local import *
-
-DATABASE_ENGINE = 'django.db.backends.mysql'
-DATABASE_NAME = 'online_test'
-DATABASE_USER = 'online_test_user'
-# Imports DATABASE_PASSWORD from testapp/local.py that is not part of git repo
-from testapp.local import DATABASE_PASSWORD
diff --git a/testapp/settings.py b/testapp/settings.py
deleted file mode 100644
index 88d4a5a..0000000
--- a/testapp/settings.py
+++ /dev/null
@@ -1,193 +0,0 @@
-# Django settings for tester project.
-
-from os.path import dirname, join, basename, abspath
-
-DEBUG = True
-TEMPLATE_DEBUG = DEBUG
-
-# The root of the URL, for example you might be in the situation where you
-# are not hosted as host.org/exam/  but as host.org/foo/exam/ for whatever
-# reason set this to the root you have to serve at.  In the above example
-# host.org/foo/exam set URL_ROOT='/foo'
-URL_ROOT = ''
-
-# Authentication using other database table.
-# Comment the line below if you want the authentication to be done
-# using django user table.
-#AUTHENTICATION_BACKENDS = ('myauthentication.backend.MyBackend',)
-
-# Router for database
-#DATABASE_ROUTERS = ['myauthentication.router.MyDatabaseRouter',]
-
-ADMINS = (
-    # ('Your Name', 'your_email@example.com'),
-)
-
-MANAGERS = ADMINS
-
-CURDIR = abspath(dirname(__file__))
-DB_FILE = join(CURDIR, 'exam.db')
-
-DATABASES = {
-    'default': {
-        'ENGINE': 'django.db.backends.sqlite3',  # Add 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'.
-        'NAME': DB_FILE,                      # Or path to database file if using sqlite3.
-        'USER': '',                      # Not used with sqlite3.
-        'PASSWORD': '',                  # Not used with sqlite3.
-        'HOST': '',                      # Set to empty string for localhost. Not used with sqlite3.
-        'PORT': '',                      # Set to empty string for default. Not used with sqlite3.
-    },
-    'spoken_tutorial' : {
-        'ENGINE' : 'django.db.backends.mysql',
-        'NAME'   : 'YOUR DATABASE',
-        'USER'   : 'YOUR USERNAME',
-        'PASSWORD': 'YOUR PASSWORD',
-        'HOST'    :'',
-        'PORT'    :'',
-    }
-}
-
-# Local time zone for this installation. Choices can be found here:
-# http://en.wikipedia.org/wiki/List_of_tz_zones_by_name
-# although not all choices may be available on all operating systems.
-# On Unix systems, a value of None will cause Django to use the same
-# timezone as the operating system.
-# If running in a Windows environment this must be set to the same as your
-# system time zone.
-TIME_ZONE = 'Asia/Kolkata'
-
-# Language code for this installation. All choices can be found here:
-# http://www.i18nguy.com/unicode/language-identifiers.html
-LANGUAGE_CODE = 'en-us'
-
-SITE_ID = 1
-
-# If you set this to False, Django will make some optimizations so as not
-# to load the internationalization machinery.
-USE_I18N = True
-
-# If you set this to False, Django will not format dates, numbers and
-# calendars according to the current locale
-USE_L10N = True
-
-# Absolute filesystem path to the directory that will hold user-uploaded files.
-# Example: "/home/media/media.lawrence.com/media/"
-MEDIA_ROOT = ''
-
-# URL that handles the media served from MEDIA_ROOT. Make sure to use a
-# trailing slash.
-# Examples: "http://media.lawrence.com/media/", "http://example.com/media/"
-MEDIA_URL = ''
-
-# Absolute path to the directory static files should be collected to.
-# Don't put anything in this directory yourself; store your static files
-# in apps' "static/" subdirectories and in STATICFILES_DIRS.
-# Example: "/home/media/media.lawrence.com/static/"
-STATIC_ROOT = '/tmp/static/'
-
-# URL prefix for static files.
-# Example: "http://media.lawrence.com/static/"
-STATIC_URL = '/static/'
-
-# URL prefix for admin static files -- CSS, JavaScript and images.
-# Make sure to use a trailing slash.
-# Examples: "http://foo.com/static/admin/", "/static/admin/".
-ADMIN_MEDIA_PREFIX = '/static/admin/'
-
-# Additional locations of static files
-STATICFILES_DIRS = (
-    # Put strings here, like "/home/html/static" or "C:/www/django/static".
-    # Always use forward slashes, even on Windows.
-    # Don't forget to use absolute paths, not relative paths.
-)
-
-# List of finder classes that know how to find static files in
-# various locations.
-STATICFILES_FINDERS = (
-    'django.contrib.staticfiles.finders.FileSystemFinder',
-    'django.contrib.staticfiles.finders.AppDirectoriesFinder',
-    #'django.contrib.staticfiles.finders.DefaultStorageFinder',
-)
-
-# Make this unique, and don't share it with anybody.
-SECRET_KEY = '9h*01@*#3ok+lbj5k=ym^eb)e=rf-g70&n0^nb_q6mtk!r(qr)'
-
-# List of callables that know how to import templates from various sources.
-TEMPLATE_LOADERS = (
-    'django.template.loaders.filesystem.Loader',
-    'django.template.loaders.app_directories.Loader',
-    #'django.template.loaders.eggs.Loader',
-)
-
-MIDDLEWARE_CLASSES = (
-    'django.middleware.common.CommonMiddleware',
-    'django.contrib.sessions.middleware.SessionMiddleware',
-    'django.middleware.csrf.CsrfViewMiddleware',
-    'django.contrib.auth.middleware.AuthenticationMiddleware',
-    'django.contrib.messages.middleware.MessageMiddleware',
-    'debug_toolbar.middleware.DebugToolbarMiddleware',
-
-)
-
-ROOT_URLCONF = '%s.urls' % (basename(CURDIR))
-
-TEMPLATE_DIRS = (
-    # Put strings here, like "/home/html/django_templates" or "C:/www/django/templates".
-    # Always use forward slashes, even on Windows.
-    # Don't forget to use absolute paths, not relative paths.
-)
-
-INSTALLED_APPS = (
-    'django.contrib.auth',
-    'django.contrib.contenttypes',
-    'django.contrib.sessions',
-    'django.contrib.sites',
-    'django.contrib.messages',
-    'django.contrib.staticfiles',
-    # Uncomment the next line to enable the admin:
-    'django.contrib.admin',
-    'taggit',
-    # Uncomment the next line to enable admin documentation:
-    # 'django.contrib.admindocs',
-    'exam',
-    'taggit_autocomplete_modified',
-    'debug_toolbar',
-)
-
-# A sample logging configuration. The only tangible logging
-# performed by this configuration is to send an email to
-# the site admins on every HTTP 500 error.
-# See http://docs.djangoproject.com/en/dev/topics/logging for
-# more details on how to customize your logging configuration.
-LOGGING = {
-    'version': 1,
-    'disable_existing_loggers': False,
-    'formatters': {
-        'verbose': {
-            'format': '%(levelname)s %(asctime)s %(module)s %(process)d %(thread)d %(message)s'
-        },
-        'simple': {
-            'format': '%(levelname)s %(message)s'
-        },
-    },
-    'handlers': {
-        'console': {
-            'level': 'DEBUG',
-            'class': 'logging.StreamHandler',
-            'formatter': 'simple'
-        },
-        'mail_admins': {
-            'level': 'ERROR',
-            'class': 'django.utils.log.AdminEmailHandler'
-        }
-    },
-    'loggers': {
-        'django.request': {
-            'handlers': ['mail_admins', 'console'],
-            'level': 'ERROR',
-            'propagate': True,
-        },
-    }
-}
-
-AUTH_PROFILE_MODULE = 'exam.Profile'
-- 
cgit 


From 6f04127b10fad666a689b18db6a5a9aa1270d739 Mon Sep 17 00:00:00 2001
From: hardythe1
Date: Wed, 27 May 2015 22:17:58 +0530
Subject: Fixed indentation

---
 testapp/exam/settings.py | 15 ++++++++-------
 1 file changed, 8 insertions(+), 7 deletions(-)

diff --git a/testapp/exam/settings.py b/testapp/exam/settings.py
index abbc275..5d3fb15 100644
--- a/testapp/exam/settings.py
+++ b/testapp/exam/settings.py
@@ -19,10 +19,11 @@ SERVER_TIMEOUT = 2
 # host.org/foo/exam set URL_ROOT='/foo'
 URL_ROOT = ''
 
-code_evaluators = {"python": "evaluators.python_code_evaluator.PythonCodeEvaluator",
-					 "c": "evaluators.c_cpp_code_evaluator.CCPPCodeEvaluator",
-					 "cpp": "evaluators.c_cpp_code_evaluator.CCPPCodeEvaluator",
-					 "java": "evaluators.java_evaluator.JavaCodeEvaluator",
-					 "bash": "evaluators.bash_evaluator.BashCodeEvaluator",
-					 "scilab": "evaluators.scilab_evaluator.ScilabCodeEvaluator",
-					}
+code_evaluators = {
+            "python": "evaluators.python_code_evaluator.PythonCodeEvaluator",
+            "c": "evaluators.c_cpp_code_evaluator.CCPPCodeEvaluator",
+            "cpp": "evaluators.c_cpp_code_evaluator.CCPPCodeEvaluator",
+            "java": "evaluators.java_evaluator.JavaCodeEvaluator",
+            "bash": "evaluators.bash_evaluator.BashCodeEvaluator",
+            "scilab": "evaluators.scilab_evaluator.ScilabCodeEvaluator",
+            }
-- 
cgit