diff --git a/requirements.txt b/requirements.txt index 6fcd3b9..902d47f 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,3 +2,5 @@ Django==1.7 Pillow==2.4.0 psycopg2==2.5.3 pystache==0.5.4 +django-markdown==0.8.4 +django-mathjax==0.0.5 diff --git a/upe/settings.py b/upe/settings.py index cadd573..9731d4b 100644 --- a/upe/settings.py +++ b/upe/settings.py @@ -37,6 +37,8 @@ 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', + 'django_markdown', + 'django_mathjax', 'website', 'upe_calendar', 'users' @@ -105,3 +107,16 @@ EMAIL_USE_TLS = False DEFAULT_FROM_EMAIL = 'Do-Not-Reply ' +MATHJAX_ENABLED=True + +MATHJAX_CONFIG_DATA = { + "tex2jax": { + "inlineMath": + [ + ['\\(','\\)'] + ] + } +} + +MARKDOWN_EXTENSIONS = ['extra'] + diff --git a/upe/urls.py b/upe/urls.py index 597c46a..cd59d19 100644 --- a/upe/urls.py +++ b/upe/urls.py @@ -38,5 +38,5 @@ url(r'^static/(?P.*)$', 'django.views.static.serve', { 'document_root': settings.STATIC_ROOT, }), - + url('^markdown/', include( 'django_markdown.urls')), ) diff --git a/upe_calendar/migrations/0003_auto_20151007_2244.py b/upe_calendar/migrations/0003_auto_20151007_2244.py deleted file mode 100644 index e1af2fd..0000000 --- a/upe_calendar/migrations/0003_auto_20151007_2244.py +++ /dev/null @@ -1,33 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.db import models, migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('upe_calendar', '0002_auto_20150328_1856'), - ] - - operations = [ - migrations.RemoveField( - model_name='event', - name='end_time', - ), - migrations.RemoveField( - model_name='event', - name='thumbnail', - ), - migrations.AddField( - model_name='event', - name='facebookid', - field=models.BigIntegerField(default=0), - preserve_default=True, - ), - migrations.AlterField( - model_name='event', - name='banner', - field=models.CharField(max_length=4096), - ), - ] diff --git a/website/admin.py b/website/admin.py index 694323f..69aa5ff 100644 --- a/website/admin.py +++ b/website/admin.py @@ -1 +1,5 @@ from django.contrib import admin +from website.models import * + +admin.site.register(QuestionTag) +admin.site.register(Question) \ No newline at end of file diff --git a/website/models.py b/website/models.py index beeb308..d467244 100644 --- a/website/models.py +++ b/website/models.py @@ -1,2 +1,25 @@ from django.db import models +from django_markdown.models import MarkdownField + +class QuestionTag(models.Model): + tag = models.CharField(max_length=100) + def __str__(self): + return self.tag + +class Question(models.Model): + tags = models.ManyToManyField(QuestionTag) + title = models.CharField(max_length=100) + text = MarkdownField() + solution = MarkdownField() + difficulty = models.PositiveSmallIntegerField() + + def __str__(self): + return self.title + + + + + + + diff --git a/website/static/website/css/interview.css b/website/static/website/css/interview.css new file mode 100644 index 0000000..6b44210 --- /dev/null +++ b/website/static/website/css/interview.css @@ -0,0 +1,50 @@ +#questions-sidebar { + height: 700px; + overflow: auto; + padding: 0; + margin: 0; +} +#questions-table { + cursor: pointer; +} +#targ-question { + height: 700px; + padding: 0; + margin: 0; + position: relative; +} + +#targ-question iframe { + height: 700px; + width: 100%; + padding: 0; + margin: 0; +} + + +#question-soln { + margin-top: 10px; +} +#nav-questions { + margin-top: 10px; + margin-bottom: 20px; +} + +#question-wrapper { + padding-left: 16px; + padding-right: 16px; +} + +.tag { + display: inline; + padding: .2em .6em .3em; + font-size: 75%; + font-weight: bold; + line-height: 1; + color: #fff; + text-align: center; + white-space: nowrap; + vertical-align: baseline; + background: #43ACC5; + margin-right: .2em; +} \ No newline at end of file diff --git a/website/templates/website/header_footer.html b/website/templates/website/header_footer.html index 1c9144b..b07452a 100644 --- a/website/templates/website/header_footer.html +++ b/website/templates/website/header_footer.html @@ -45,6 +45,7 @@ Student Services
  • diff --git a/website/templates/website/interview.html b/website/templates/website/interview.html new file mode 100644 index 0000000..8f6c3c7 --- /dev/null +++ b/website/templates/website/interview.html @@ -0,0 +1,57 @@ +{% extends "website/header_footer.html" %} +{% load staticfiles %} +{% block javascript %} + + + + + + + + + + + + + + + +{% endblock %} +{% block content %} +
    +
    +
    + + {% for q in questions %} + + {% endfor %} +
    + {{q.title}}
    + {% for tag in q.tags.all %} + {{tag}} + {% endfor %} +
    +
    +
    + +
    +
    +
    + +{% endblock %} \ No newline at end of file diff --git a/website/templates/website/interview_question.html b/website/templates/website/interview_question.html new file mode 100644 index 0000000..77f202a --- /dev/null +++ b/website/templates/website/interview_question.html @@ -0,0 +1,37 @@ +{% load staticfiles %} +{% load mathjax %} +{% load django_markdown %} +{% block javascript %} + + + + + + + + + + + + + + {% mathjax_scripts %} +{% endblock %} +
    +

    {{question.title}}

    +

    {{question.text|markdown}}

    +
    + +
    +
    {{question.solution|markdown}}
    +
    +
    +
    + + \ No newline at end of file diff --git a/website/urls.py b/website/urls.py index 8662211..7d95b52 100644 --- a/website/urls.py +++ b/website/urls.py @@ -10,4 +10,7 @@ url(r'^$', 'website.views.index', name='index'), url(r'^oh/$', 'website.views.oh', name='oh'), + url(r'^interview/$', 'website.views.interview', name='interview'), + url(r'^interview/question/(?P\d+)/$', 'website.views.interview_question', name='interview_question'), + url(r'^interview/tagged/(?P.+)/$', 'website.views.interview_tagged', name='interview_tagged') ) diff --git a/website/views.py b/website/views.py index f59d48f..99e882b 100644 --- a/website/views.py +++ b/website/views.py @@ -8,6 +8,7 @@ from django.core.serializers.json import DjangoJSONEncoder import json, re from users.models import * +from website.models import * def index(request): template = loader.get_template('website/index.html') @@ -21,3 +22,16 @@ def index(request): def oh(request): return render(request, 'website/oh.html', {}) + +def interview(request): + questions = Question.objects.order_by('difficulty') + return render(request, 'website/interview.html', { 'questions': questions}) + +def interview_question(request, ident): + question = Question.objects.get(id=int(ident)) + return render(request, 'website/interview_question.html', {'question': question}) + +def interview_tagged(request, tag): + tagObj = QuestionTag.objects.get(tag=tag) + questions = Question.objects.filter(tags=tagObj).order_by('difficulty') + return render(request, 'website/interview.html', {'questions': questions})