summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--setup.py3
-rw-r--r--yaksh/demo_templates/demo_settings.py179
-rw-r--r--yaksh/demo_templates/demo_urls.py16
-rw-r--r--yaksh/scripts/cli.py173
4 files changed, 2 insertions, 369 deletions
diff --git a/setup.py b/setup.py
index e8e1394..feb56ed 100644
--- a/setup.py
+++ b/setup.py
@@ -14,6 +14,7 @@ def get_version():
exec(compile(open(fname).read(), fname, 'exec'), data)
return data.get('__version__')
+
install_requires = [
'django==1.10',
'django-taggit==0.18.1',
@@ -39,7 +40,7 @@ setup(
license='BSD License',
entry_points={
'console_scripts': [
- 'yaksh = yaksh.scripts.cli:main',
+ 'yaksh = yaksh.code_server:main',
],
},
description='A django app to conduct online programming tests.',
diff --git a/yaksh/demo_templates/demo_settings.py b/yaksh/demo_templates/demo_settings.py
deleted file mode 100644
index 6089be5..0000000
--- a/yaksh/demo_templates/demo_settings.py
+++ /dev/null
@@ -1,179 +0,0 @@
-"""
-Django settings for my_demo 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
-import tempfile
-from yaksh.pipeline.settings import AUTH_PIPELINE
-
-BASE_DIR = os.path.dirname(os.path.dirname(__file__))
-
-# The directory where user data can be saved.
-OUTPUT_DIR = os.path.join(tempfile.gettempdir(), 'output')
-
-# 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 = 'TH!S_!S_@_DUMMY_K3Y'
-
-# SECURITY WARNING: don't run with debug turned on in production!
-DEBUG = True
-
-ALLOWED_HOSTS = []
-
-URL_ROOT = ''
-
-# Application definition
-
-FIXTURE_DIRS = ('{{ fixture_dir }}')
-
-INSTALLED_APPS = (
- 'django.contrib.admin',
- 'django.contrib.auth',
- 'django.contrib.contenttypes',
- 'django.contrib.sessions',
- 'django.contrib.messages',
- 'django.contrib.staticfiles',
- 'yaksh',
- 'taggit',
- 'social.apps.django_app.default',
-)
-
-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',
- 'yaksh.middleware.one_session_per_user.OneSessionPerUserMiddleware',
- 'yaksh.middleware.user_time_zone.TimezoneMiddleware',
- 'social.apps.django_app.middleware.SocialAuthExceptionMiddleware',
-)
-
-ROOT_URLCONF = '{{ root_urlconf }}'
-
-WSGI_APPLICATION = '{{ project_name }}.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'),
- }
-}
-
-# Internationalization
-# https://docs.djangoproject.com/en/1.6/topics/i18n/
-
-LANGUAGE_CODE = 'en-us'
-
-TIME_ZONE = 'UTC'
-
-USE_I18N = True
-
-USE_L10N = True
-
-USE_TZ = True
-
-
-# Static files (CSS, JavaScript, Images)
-# https://docs.djangoproject.com/en/1.6/howto/static-files/
-
-STATIC_URL = '/static/'
-
-LOGIN_URL = '/exam/login/'
-
-LOGIN_REDIRECT_URL = '/exam/'
-
-MEDIA_URL = "/data/"
-
-MEDIA_ROOT = os.path.join(BASE_DIR, "yaksh", "data")
-
-SOCIAL_AUTH_LOGIN_ERROR_URL = '/exam/login/'
-
-EMAIL_USE_TLS = False
-
-EMAIL_HOST = 'your_email_host'
-
-EMAIL_PORT = 'your_email_port'
-
-EMAIL_HOST_USER = 'email_host_user'
-
-EMAIL_HOST_PASSWORD = 'email_host_password'
-
-# Set EMAIL_BACKEND to 'django.core.mail.backends.smtp.EmailBackend'
-# in production
-EMAIL_BACKEND = 'django.core.mail.backends.dummy.EmailBackend'
-
-# SENDER_EMAIL, REPLY_EMAIL, PRODUCTION_URL, IS_DEVELOPMENT are used in email
-# verification. Set the variables accordingly to avoid errors in production
-
-# This email id will be used as <from address> for sending emails.
-# For example no_reply@<your_organization>.in can be used.
-SENDER_EMAIL = 'your_email'
-
-# Organisation/Indivudual Name.
-SENDER_NAME = 'your_name'
-
-# This email id will be used by users to send their queries
-# For example queries@<your_organization>.in can be used.
-REPLY_EMAIL = 'your_reply_email'
-
-# This url will be used in email verification to create activation link.
-# Add your hosted url to this variable.
-# For example https://127.0.0.1:8000 or 127.0.0.1:8000
-PRODUCTION_URL = 'your_project_url'
-
-# Set this variable to <False> once the project is in production.
-# If this variable is kept <True> in production, email will not be verified.
-IS_DEVELOPMENT = True
-
-DEFAULT_FROM_EMAIL = EMAIL_HOST_USER
-
-TEMPLATES = [
- {
- 'BACKEND': 'django.template.backends.django.DjangoTemplates',
- 'APP_DIRS': True,
- 'DIRS': ['yaksh/templates'],
- 'OPTIONS': {
- 'context_processors': [
- 'django.contrib.auth.context_processors.auth',
- 'social.apps.django_app.context_processors.backends',
- 'social.apps.django_app.context_processors.login_redirect',
- ],
- 'debug': False,
- }
- },
-]
-
-SOCIAL_AUTH_GOOGLE_OAUTH2_KEY = 'GOOGLE_KEY_PROVIDED'
-SOCIAL_AUTH_GOOGLE_OAUTH2_SECRET = 'GOOGLE_SECRET_PROVIDED'
-
-SOCIAL_AUTH_FACEBOOK_KEY = 'FACEBOOK_KEY_PROVIDED'
-SOCIAL_AUTH_FACEBOOK_SECRET = 'FACEBOOK_SECRET_PROVIDED'
-
-AUTHENTICATION_BACKENDS = (
- 'social.backends.google.GoogleOAuth2',
- 'social.backends.facebook.FacebookOAuth2',
- 'django.contrib.auth.backends.ModelBackend',
-)
-
-SOCIAL_AUTH_PIPELINE = AUTH_PIPELINE
-
-SOCIAL_AUTH_FACEBOOK_SCOPE = ['email']
-SOCIAL_AUTH_FACEBOOK_PROFILE_EXTRA_PARAMS = {
- 'fields': 'id, name, email'
-
-}
diff --git a/yaksh/demo_templates/demo_urls.py b/yaksh/demo_templates/demo_urls.py
deleted file mode 100644
index 5abc121..0000000
--- a/yaksh/demo_templates/demo_urls.py
+++ /dev/null
@@ -1,16 +0,0 @@
-from django.conf.urls import patterns, include, url
-from django.conf import settings
-from django.conf.urls.static import static
-from django.contrib import admin
-admin.autodiscover()
-
-urlpatterns = patterns('',
- # Examples:
- # url(r'^$', 'my_demo.views.home', name='home'),
- # url(r'^blog/', include('blog.urls')),
-
- url(r'^admin/', include(admin.site.urls)),
- url(r'^exam/', include('yaksh.urls', namespace='yaksh', app_name='yaksh')),
- url(r'^', include('social.apps.django_app.urls', namespace='social')),
-)
-urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) \ No newline at end of file
diff --git a/yaksh/scripts/cli.py b/yaksh/scripts/cli.py
deleted file mode 100644
index a1a49ee..0000000
--- a/yaksh/scripts/cli.py
+++ /dev/null
@@ -1,173 +0,0 @@
-from __future__ import print_function
-
-import django
-import subprocess
-import contextlib
-import os
-from os import path
-import argparse
-from django.conf import settings
-from django.core import management
-from django.template import Template, Context
-
-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')
-
-settings.configure()
-django.setup()
-
-
-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(
- "path", type=str,
- default=path.join(CUR_DIR, "yaksh_demo"),
- nargs="?",
- help="Path to the demo Django project (defaults to 'yaksh_demo')"
- )
-
- # create parser for the "run_demo" subcommand
- run_parser = subparser.add_parser(
- "run",
- help="Initialise django server and run the demo project"
- )
- run_parser.add_argument(
- "path", type=str, nargs=1,
- help="full path to the demo yaksh 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":
- pth = path.abspath(args.path)
- name = path.basename(pth)
- create_demo(name, pth)
- elif args.subcommand == "run":
- pth = path.abspath(args.path[0])
- name = path.basename(pth)
- run_demo(name, pth)
- 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):
- if not path.exists(project_dir):
- os.makedirs(project_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 as 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')
- fixture_path = path.join(fixture_dir, 'demo_fixtures.json')
-
- 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')
- 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
- )
- # Create demo_urls file
- _render_demo_files(urls_template_path, urls_target_path)
- # Create database and load initial data
- command_path = path.join(top_dir, 'manage.py')
- _check_migrations(project_name, command_path)
- _migrate(project_name, command_path)
- subprocess.call(loaddata_command, shell=True)
-
-
-def run_demo(project_name, top_dir):
- with _chdir(top_dir):
- command_path = path.join(top_dir, 'manage.py')
- _check_migrations(project_name, command_path)
- _migrate(project_name, command_path)
- command = ("python manage.py runserver "
- "--settings={0}.demo_settings").format(project_name)
- subprocess.call(command, shell=True)
-
-
-def run_server(args=None):
- try:
- from yaksh import code_server
- code_server.main(args)
- except Exception as e:
- print("Error: {0}\nExiting yaksh code server".format(e))
-
-
-def _check_migrations(project_name, command_path):
- migrations = ("python {0} makemigrations --settings={1}.demo_settings"
- ).format(command_path, project_name)
- subprocess.call(migrations, shell=True)
-
-
-def _migrate(project_name, command_path):
- migrate = ("python {0} migrate --settings={1}.demo_settings"
- ).format(command_path, project_name)
- subprocess.call(migrate, shell=True)
-
-
-def _render_demo_files(template_path, output_path, context=None):
- with open(template_path, 'r') as template_file:
- content = template_file.read()
- if context:
- template = Template(content)
- content = template.render(context)
-
- 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()