remove django-markdown and handle preview manually

This commit is contained in:
Élie Bouttier 2014-09-06 00:39:50 -07:00
parent 4995c19560
commit 7e3173c7c0
32 changed files with 335 additions and 16478 deletions

View file

@ -10,3 +10,7 @@ register = template.Library()
@register.inclusion_tag('accounts/tags/delete_modal.html') @register.inclusion_tag('accounts/tags/delete_modal.html')
def delete_modal(): def delete_modal():
return {} return {}
@register.inclusion_tag('accounts/tags/delete_modal_js.html')
def delete_modal_js():
return {}

View file

@ -48,7 +48,6 @@ INSTALLED_APPS = (
'django.contrib.humanize', 'django.contrib.humanize',
'django.contrib.sites', 'django.contrib.sites',
'django_markdown',
'bootstrap3_datetime', 'bootstrap3_datetime',
'bootstrap3', 'bootstrap3',
'colorful', 'colorful',

View file

@ -4,8 +4,6 @@ from django.contrib import admin
urlpatterns = patterns('', urlpatterns = patterns('',
# django admin # django admin
url(r'^django-admin/', include(admin.site.urls)), url(r'^django-admin/', include(admin.site.urls)),
# markdown preview
url(r'^markdown/', include('django_markdown.urls')),
# tracker # tracker
url(r'^', include('tracker.urls')), url(r'^', include('tracker.urls')),
# permissions managment # permissions managment

View file

@ -1,5 +1,5 @@
django django
django-markdown
django-colorful django-colorful
django-bootstrap3 django-bootstrap3
django-bootstrap3-datetimepicker django-bootstrap3-datetimepicker
markdown

16375
static/js/jquery-ui.js vendored

File diff suppressed because it is too large Load diff

File diff suppressed because one or more lines are too long

117
static/js/jquery.cookie.js Normal file
View file

@ -0,0 +1,117 @@
/*!
* jQuery Cookie Plugin v1.4.1
* https://github.com/carhartl/jquery-cookie
*
* Copyright 2013 Klaus Hartl
* Released under the MIT license
*/
(function (factory) {
if (typeof define === 'function' && define.amd) {
// AMD
define(['jquery'], factory);
} else if (typeof exports === 'object') {
// CommonJS
factory(require('jquery'));
} else {
// Browser globals
factory(jQuery);
}
}(function ($) {
var pluses = /\+/g;
function encode(s) {
return config.raw ? s : encodeURIComponent(s);
}
function decode(s) {
return config.raw ? s : decodeURIComponent(s);
}
function stringifyCookieValue(value) {
return encode(config.json ? JSON.stringify(value) : String(value));
}
function parseCookieValue(s) {
if (s.indexOf('"') === 0) {
// This is a quoted cookie as according to RFC2068, unescape...
s = s.slice(1, -1).replace(/\\"/g, '"').replace(/\\\\/g, '\\');
}
try {
// Replace server-side written pluses with spaces.
// If we can't decode the cookie, ignore it, it's unusable.
// If we can't parse the cookie, ignore it, it's unusable.
s = decodeURIComponent(s.replace(pluses, ' '));
return config.json ? JSON.parse(s) : s;
} catch(e) {}
}
function read(s, converter) {
var value = config.raw ? s : parseCookieValue(s);
return $.isFunction(converter) ? converter(value) : value;
}
var config = $.cookie = function (key, value, options) {
// Write
if (value !== undefined && !$.isFunction(value)) {
options = $.extend({}, config.defaults, options);
if (typeof options.expires === 'number') {
var days = options.expires, t = options.expires = new Date();
t.setTime(+t + days * 864e+5);
}
return (document.cookie = [
encode(key), '=', stringifyCookieValue(value),
options.expires ? '; expires=' + options.expires.toUTCString() : '', // use expires attribute, max-age is not supported by IE
options.path ? '; path=' + options.path : '',
options.domain ? '; domain=' + options.domain : '',
options.secure ? '; secure' : ''
].join(''));
}
// Read
var result = key ? undefined : {};
// To prevent the for loop in the first place assign an empty array
// in case there are no cookies at all. Also prevents odd result when
// calling $.cookie().
var cookies = document.cookie ? document.cookie.split('; ') : [];
for (var i = 0, l = cookies.length; i < l; i++) {
var parts = cookies[i].split('=');
var name = decode(parts.shift());
var cookie = parts.join('=');
if (key && key === name) {
// If second argument (value) is a function it's a converter...
result = read(cookie, value);
break;
}
// Prevent storing a cookie that we couldn't decode.
if (!key && (cookie = read(cookie)) !== undefined) {
result[name] = cookie;
}
}
return result;
};
config.defaults = {};
$.removeCookie = function (key, options) {
if ($.cookie(key) === undefined) {
return false;
}
// Must not alter options, thus extending a fresh object...
$.cookie(key, '', $.extend({}, options, { expires: -1 }));
return !$.cookie(key);
};
}));

View file

@ -3,11 +3,6 @@
{% load staticfiles %} {% load staticfiles %}
{% load humanize %} {% load humanize %}
{% load bootstrap3 %} {% load bootstrap3 %}
{% load accounts_tags %}
{% block css %}
<link rel="stylesheet" href="{% static 'css/jquery-ui.css' %}">
{% endblock %}
{% block grouptab %} class="active"{% endblock %} {% block grouptab %} class="active"{% endblock %}
@ -69,14 +64,14 @@
</ul> </ul>
</div> </div>
{% delete_modal %} {% endblock %}
<script src="{% static 'js/jquery-ui.min.js' %}"></script> {% block js_end %}
{{ block.super }}
<script type="text/javascript"> <script type="text/javascript">
$('input[name="user"]').autocomplete({ $('input[name="user"]').autocomplete({
source: "{% url 'add-user-to-group' group.id %}" source: "{% url 'add-user-to-group' group.id %}"
}); });
</script> </script>
<script src="{% static 'js/accounts.js' %}"></script> <script src="{% static 'js/accounts.js' %}"></script>
{% endblock %} {% endblock %}

View file

@ -1,6 +1,5 @@
{% extends 'base.html' %} {% extends 'base.html' %}
{% load django_markdown %}
{% load bootstrap3 %} {% load bootstrap3 %}
{% block profiletab %} class="active"{% endblock %} {% block profiletab %} class="active"{% endblock %}

View file

@ -1,5 +1,3 @@
{% load staticfiles %}
<div class="modal" id="confirm-delete" tabindex="-1" role="dialog" aria-hidden="true"> <div class="modal" id="confirm-delete" tabindex="-1" role="dialog" aria-hidden="true">
<div class="modal-dialog modal-sm"> <div class="modal-dialog modal-sm">
<div class="panel panel-danger"> <div class="panel panel-danger">
@ -17,5 +15,3 @@
</div> </div>
</div> </div>
</div> </div>
<script src="{% static 'js/delete_modal.js' %}"></script>

View file

@ -0,0 +1,3 @@
{% load staticfiles %}
<script src="{% static 'js/delete_modal.js' %}"></script>

View file

@ -3,11 +3,6 @@
{% load staticfiles %} {% load staticfiles %}
{% load humanize %} {% load humanize %}
{% load bootstrap3 %} {% load bootstrap3 %}
{% load accounts_tags %}
{% block css %}
<link rel="stylesheet" href="{% static 'css/jquery-ui.css' %}">
{% endblock %}
{% block teamtab %} class="active"{% endblock %} {% block teamtab %} class="active"{% endblock %}
@ -94,9 +89,10 @@
</div> </div>
</div> </div>
{% delete_modal %} {% endblock %}
<script src="{% static 'js/jquery-ui.min.js' %}"></script> {% block js_end %}
{{ block.super }}
<script type="text/javascript"> <script type="text/javascript">
$('input[name="user"]').autocomplete({ $('input[name="user"]').autocomplete({
source: "{% url 'add-user-to-team' team.id %}" source: "{% url 'add-user-to-team' team.id %}"
@ -107,5 +103,4 @@ $('input[name="group"]').autocomplete({
</script> </script>
<script src="{% static 'js/accounts.js' %}"></script> <script src="{% static 'js/accounts.js' %}"></script>
<script src="{% static 'js/tabswitch.js' %}"></script> <script src="{% static 'js/tabswitch.js' %}"></script>
{% endblock %} {% endblock %}

View file

@ -3,11 +3,6 @@
{% load staticfiles %} {% load staticfiles %}
{% load humanize %} {% load humanize %}
{% load bootstrap3 %} {% load bootstrap3 %}
{% load accounts_tags %}
{% block css %}
<link rel="stylesheet" href="{% static 'css/jquery-ui.css' %}">
{% endblock %}
{% block usertab %} class="active"{% endblock %} {% block usertab %} class="active"{% endblock %}
@ -109,9 +104,10 @@
</div> </div>
</div> </div>
{% delete_modal %} {% endblock %}
<script src="{% static 'js/jquery-ui.min.js' %}"></script> {% block js_end %}
{{ block.super }}
<script type="text/javascript"> <script type="text/javascript">
$('input[name="group"]').autocomplete({ $('input[name="group"]').autocomplete({
source: "{% url 'add-group-to-user' user.id %}" source: "{% url 'add-group-to-user' user.id %}"
@ -122,5 +118,4 @@ $('input[name="team"]').autocomplete({
</script> </script>
<script src="{% static 'js/accounts.js' %}"></script> <script src="{% static 'js/accounts.js' %}"></script>
<script src="{% static 'js/tabswitch.js' %}"></script> <script src="{% static 'js/tabswitch.js' %}"></script>
{% endblock %} {% endblock %}

View file

@ -2,7 +2,6 @@
{% load staticfiles %} {% load staticfiles %}
{% load humanize %} {% load humanize %}
{% load accounts_tags %}
{% load bootstrap3 %} {% load bootstrap3 %}
{% block usertab %} class="active"{% endblock %} {% block usertab %} class="active"{% endblock %}
@ -38,6 +37,4 @@
{% endfor %} {% endfor %}
</ul> </ul>
{% delete_modal %}
{% endblock %} {% endblock %}

View file

@ -23,8 +23,6 @@
<link href="{% static 'css/ponytracker.css' %}" rel="stylesheet"> <link href="{% static 'css/ponytracker.css' %}" rel="stylesheet">
{% block css %}{% endblock %} {% block css %}{% endblock %}
<script src="{% bootstrap_jquery_url %}"></script>
{% bootstrap_javascript %}
{% block js %}{% endblock %} {% block js %}{% endblock %}
{% block media %}{% endblock %} {% block media %}{% endblock %}
@ -100,6 +98,8 @@
</div> <!-- /container --> </div> <!-- /container -->
<script src="{% bootstrap_jquery_url %}"></script>
{% bootstrap_javascript %}
<script src="{% static 'js/ponytracker.js' %}"></script> <script src="{% static 'js/ponytracker.js' %}"></script>
{% block js_end %}{% endblock %} {% block js_end %}{% endblock %}
</body> </body>

View file

@ -1,6 +1,6 @@
{% extends 'base.html' %} {% extends 'base.html' %}
{% load django_markdown %} {% load accounts_tags %}
{% block admintab %} class="active"{% endblock %} {% block admintab %} class="active"{% endblock %}
@ -24,4 +24,11 @@
{% block tabcontent %}{% endblock %} {% block tabcontent %}{% endblock %}
{% delete_modal %}
{% endblock %}
{% block js_end %}
{{ block.super }}
{% delete_modal_js %}
{% endblock %} {% endblock %}

View file

@ -61,3 +61,8 @@
{% delete_modal %} {% delete_modal %}
{% endblock %} {% endblock %}
{% block js_end %}
{{ block.super }}
{% delete_modal_js %}
{% endblock %}

View file

@ -1,6 +1,5 @@
{% extends 'base_admin.html' %} {% extends 'base_admin.html' %}
{% load django_markdown %}
{% load permissions_filters %} {% load permissions_filters %}
{% load bootstrap3 %} {% load bootstrap3 %}
{% load staticfiles %} {% load staticfiles %}
@ -50,5 +49,6 @@
{% endblock %} {% endblock %}
{% block js_end %} {% block js_end %}
{{ block.super }}
<script src="{% static 'js/perm.js' %}"></script> <script src="{% static 'js/perm.js' %}"></script>
{% endblock %} {% endblock %}

View file

@ -1,7 +1,5 @@
{% extends 'base_admin.html' %} {% extends 'base_admin.html' %}
{% load django_markdown %}
{% load accounts_tags %}
{% load permissions_filters %} {% load permissions_filters %}
{% load staticfiles %} {% load staticfiles %}
@ -67,10 +65,9 @@
</div> </div>
{% endif %} {% endif %}
{% delete_modal %}
{% endblock %} {% endblock %}
{% block js_end %} {% block js_end %}
{{ block.super }}
<script src="{% static 'js/perm.js' %}"></script> <script src="{% static 'js/perm.js' %}"></script>
{% endblock %} {% endblock %}

View file

@ -1,6 +1,5 @@
{% extends 'base_project.html' %} {% extends 'base_project.html' %}
{% load django_markdown %}
{% load permissions_filters %} {% load permissions_filters %}
{% load bootstrap3 %} {% load bootstrap3 %}
{% load staticfiles %} {% load staticfiles %}
@ -50,5 +49,6 @@
{% endblock %} {% endblock %}
{% block js_end %} {% block js_end %}
{{ block.super }}
<script src="{% static 'js/perm.js' %}"></script> <script src="{% static 'js/perm.js' %}"></script>
{% endblock %} {% endblock %}

View file

@ -1,7 +1,5 @@
{% extends 'base_project.html' %} {% extends 'base_project.html' %}
{% load django_markdown %}
{% load accounts_tags %}
{% load permissions_filters %} {% load permissions_filters %}
{% load staticfiles %} {% load staticfiles %}
@ -53,5 +51,6 @@
{% endblock %} {% endblock %}
{% block js_end %} {% block js_end %}
{{ block.super }}
<script src="{% static 'js/perm.js' %}"></script> <script src="{% static 'js/perm.js' %}"></script>
{% endblock %} {% endblock %}

View file

@ -1,10 +1,6 @@
{% extends 'tracker/issue_base.html' %} {% extends 'tracker/issue_base.html' %}
{% load bootstrap3 %} {% load staticfiles %}
{% block media %}
{{ form.media }}
{% endblock media %}
{% block tabcontent %} {% block tabcontent %}
@ -19,15 +15,37 @@
{% endif %} {% endif %}
</h1> </h1>
</div> </div>
<form action="" method="post" role="form"> <form method="post" role="form">
{% bootstrap_form form %}
{% csrf_token %} {% csrf_token %}
{% buttons %} <ul class="nav nav-tabs" role="tablist">
<button type="submit" class="btn btn-primary">Submit</button> <li class="active"><a href="#editor" role="tab" data-toggle="tab">Editor</a></li>
<li><a href="#preview" role="tab" data-toggle="tab">Preview</a></li>
</ul>
<div class="tab-content">
<div class="tab-pane active" id="editor" style="max-height: 220px;">
<div class="form-group">
<textarea style="width: 100%; height: 220px;" id="markdown-content" name="comment" required>{{ form.comment.value }}</textarea>
</div>
</div>
<div class="tab-pane well" id="preview" style="min-height: 200px; magin: 0;">
<div id="preview-content"></div>
</div>
<div class="form-group">
<button type="submit" class="btn btn-success"><span class="glyphicon glyphicon-pencil"></span> Submit</button>
<a href="{% url 'show-issue' project.name issue.id %}" class="btn btn-default">Cancel</a> <a href="{% url 'show-issue' project.name issue.id %}" class="btn btn-default">Cancel</a>
{% endbuttons %} </div>
</div>
</form> </form>
</div> </div>
</div> </div>
{% endblock %} {% endblock %}
{% block js_end %}
{{ block.super }}
<script type="text/javascript">
var markdown_preview_url = "{% url 'markdown' %}";
</script>
<script src="{% static 'js/jquery.cookie.js' %}"></script>
<script src="{% static 'js/markdown-preview.js' %}"></script>
{% endblock %}

View file

@ -1,8 +1,9 @@
{% extends 'tracker/issue_base.html' %} {% extends 'tracker/issue_base.html' %}
{% load humanize %} {% load humanize %}
{% load django_markdown %}
{% load tracker_tags %} {% load tracker_tags %}
{% load tracker_filters %}
{% load staticfiles %}
{% block media %} {% block media %}
{{ form.media }} {{ form.media }}
@ -76,8 +77,18 @@
{% if perm.create_comment %} {% if perm.create_comment %}
<form action="{% url 'add-comment' project.name issue.id %}" method="post" role="form"> <form action="{% url 'add-comment' project.name issue.id %}" method="post" role="form">
{% csrf_token %} {% csrf_token %}
<ul class="nav nav-tabs" role="tablist">
<li class="active"><a href="#editor" role="tab" data-toggle="tab">Editor</a></li>
<li><a href="#preview" role="tab" data-toggle="tab">Preview</a></li>
</ul>
<div class="tab-content">
<div class="tab-pane active" id="editor" style="max-height: 220px;">
<div class="form-group"> <div class="form-group">
{{ form.comment }} <textarea style="width: 100%; height: 220px;" id="markdown-content" name="comment" required></textarea>
</div>
</div>
<div class="tab-pane well" id="preview" style="min-height: 200px; magin: 0;">
<div id="preview-content"></div>
</div> </div>
<div class="text-center"> <div class="text-center">
{% if perm.manage_issue %} {% if perm.manage_issue %}
@ -86,10 +97,11 @@
{% else %} {% else %}
<a href="{% url 'close-issue' project.name issue.id %}" class="btn btn-default"><span class="glyphicon glyphicon-ok-circle"></span> Close this issue</a> <a href="{% url 'close-issue' project.name issue.id %}" class="btn btn-default"><span class="glyphicon glyphicon-ok-circle"></span> Close this issue</a>
{% endif %} {% endif %}
{% endif %}
<button type="submit" class="btn btn-success"><span class="glyphicon glyphicon-pencil"></span> Add a comment</button> <button type="submit" class="btn btn-success"><span class="glyphicon glyphicon-pencil"></span> Add a comment</button>
</div> </div>
</div>
</form> </form>
{% endif %}
{% elif request.user.is_authenticated %} {% elif request.user.is_authenticated %}
Sorry, you are not allowed to comment this issue. Sorry, you are not allowed to comment this issue.
{% else %} {% else %}
@ -207,3 +219,12 @@
</div> </div>
{% endblock %} {% endblock %}
{% block js_end %}
{{ block.super }}
<script type="text/javascript">
var markdown_preview_url = "{% url 'markdown' %}";
</script>
<script src="{% static 'js/jquery.cookie.js' %}"></script>
<script src="{% static 'js/markdown-preview.js' %}"></script>
{% endblock %}

View file

@ -1,10 +1,7 @@
{% extends 'tracker/issue_base.html' %} {% extends 'tracker/issue_base.html' %}
{% load bootstrap3 %} {% load bootstrap3 %}
{% load staticfiles %}
{% block media %}
{{ form.media }}
{% endblock media %}
{% block tabcontent %} {% block tabcontent %}
@ -19,19 +16,42 @@
{% endif %} {% endif %}
</h1> </h1>
</div> </div>
<form action="" method="post" role="form"> <form method="post" role="form">
{% bootstrap_form form %}
{% csrf_token %} {% csrf_token %}
{% buttons %} {% bootstrap_field form.title %}
<ul class="nav nav-tabs" role="tablist">
<li class="active"><a href="#editor" role="tab" data-toggle="tab">Editor</a></li>
<li><a href="#preview" role="tab" data-toggle="tab">Preview</a></li>
</ul>
<div class="tab-content">
<div class="tab-pane active" id="editor" style="max-height: 220px;">
<div class="form-group">
<textarea style="width: 100%; height: 220px;" id="markdown-content" name="description">{{ form.description.value }}</textarea>
</div>
</div>
<div class="tab-pane well" id="preview" style="min-height: 200px; magin: 0;">
<div id="preview-content"></div>
</div>
<div class="form-group">
<button type="submit" class="btn btn-primary">Submit</button> <button type="submit" class="btn btn-primary">Submit</button>
{% if issue %} {% if issue %}
<a href="{% url 'show-issue' project.name issue.id %}" class="btn btn-default">Cancel</a> <a href="{% url 'show-issue' project.name issue.id %}" class="btn btn-default">Cancel</a>
{% else %} {% else %}
<a href="{% url 'list-issue' project.name %}" class="btn btn-default">Cancel</a> <a href="{% url 'list-issue' project.name %}" class="btn btn-default">Cancel</a>
{% endif %} {% endif %}
{% endbuttons %} </div>
</div>
</form> </form>
</div> </div>
</div> </div>
{% endblock %} {% endblock %}
{% block js_end %}
{{ block.super }}
<script type="text/javascript">
var markdown_preview_url = "{% url 'markdown' %}";
</script>
<script src="{% static 'js/jquery.cookie.js' %}"></script>
<script src="{% static 'js/markdown-preview.js' %}"></script>
{% endblock %}

View file

@ -1,7 +1,5 @@
{% extends 'base.html' %} {% extends 'base.html' %}
{% load django_markdown %}
{% block content %} {% block content %}
<div class="page-header"> <div class="page-header">

View file

@ -0,0 +1,26 @@
<form action="{% url 'add-comment' project.name issue.id %}" method="post" role="form">
{% csrf_token %}
<ul class="nav nav-tabs" role="tablist">
<li class="active"><a href="#editor" role="tab" data-toggle="tab">Editor</a></li>
<li><a href="#preview" role="tab" data-toggle="tab">Preview</a></li>
</ul>
<div class="tab-content">
<div class="tab-pane active" id="editor" style="max-height: 220px;">
<div class="form-group">
<textarea style="width: 100%; height: 220px;" id="id_comment" name="comment" required></textarea>
</div>
</div>
<div class="tab-pane well" id="preview" style="min-height: 200px; magin: 0;">
<div id="preview-content"></div>
</div>
<div class="text-center">
{% if perm.manage_issue %}
{% if issue.closed %}
<a href="{% url 'reopen-issue' project.name issue.id %}" class="btn btn-default"><span class="glyphicon glyphicon-refresh"></span> Reopen this issue</a>
{% else %}
<a href="{% url 'close-issue' project.name issue.id %}" class="btn btn-default"><span class="glyphicon glyphicon-ok-circle"></span> Close this issue</a>
{% endif %}
<button type="submit" class="btn btn-success"><span class="glyphicon glyphicon-pencil"></span> Add a comment</button>
</div>
</div>
</form>

View file

@ -1,7 +1,6 @@
from django import forms from django import forms
from bootstrap3_datetime.widgets import DateTimePicker from bootstrap3_datetime.widgets import DateTimePicker
from django_markdown.widgets import MarkdownWidget
from tracker.models import * from tracker.models import *
@ -23,11 +22,11 @@ class ProjectForm(forms.ModelForm):
class IssueForm(forms.Form): class IssueForm(forms.Form):
title = forms.CharField(max_length=128) title = forms.CharField(max_length=128)
description = forms.CharField(widget=MarkdownWidget, required=False) description = forms.CharField(widget=forms.Textarea, required=False)
class CommentForm(forms.Form): class CommentForm(forms.Form):
comment = forms.CharField(widget=MarkdownWidget) comment = forms.CharField(widget=forms.Textarea)
class LabelForm(forms.ModelForm): class LabelForm(forms.ModelForm):

View file

@ -0,0 +1,25 @@
var csrftoken = $.cookie('csrftoken');
function csrfSafeMethod(method) {
// these HTTP methods do not require CSRF protection
return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
}
$.ajaxSetup({
beforeSend: function(xhr, settings) {
if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
xhr.setRequestHeader("X-CSRFToken", csrftoken);
}
}
});
$('a[href="#preview"]').on("show.bs.tab", function (e) {
$('#preview-content').html('Loading preview...');
var comment = $('#markdown-content').val();
$.post(markdown_preview_url, {'data': comment})
.done(function(data, textStatus) {
$('#preview-content').html(data);
})
.fail(function () {
$('#preview-content').html('Sorry, an error occured.');
});
})

View file

@ -0,0 +1,11 @@
from django import template
from tracker.utils import markdown_to_html
register = template.Library()
@register.filter
def markdown(value):
return markdown_to_html(value)

View file

@ -2,6 +2,7 @@ from django.conf.urls import url, include
urlpatterns = [ urlpatterns = [
url(r'^markdown/$', 'tracker.views.markdown_preview', name='markdown'),
# Administration: redirect on first available admin page # Administration: redirect on first available admin page
url(r'^admin/$', 'tracker.views.admin', name='admin'), url(r'^admin/$', 'tracker.views.admin', name='admin'),
# Settings # Settings

8
tracker/utils.py Normal file
View file

@ -0,0 +1,8 @@
from django.utils.safestring import mark_safe
from markdown import markdown
def markdown_to_html(value):
# set extensions here if needed
return mark_safe(markdown(value, safe_mode='escape'))

View file

@ -5,7 +5,9 @@ from django.contrib.auth.decorators import login_required
from django.views.decorators.http import require_http_methods from django.views.decorators.http import require_http_methods
from django.conf import settings from django.conf import settings
from django.core.urlresolvers import reverse from django.core.urlresolvers import reverse
from django.http import HttpResponse
from tracker.utils import markdown_to_html
from tracker.forms import * from tracker.forms import *
from tracker.models import * from tracker.models import *
from tracker.notifications import * from tracker.notifications import *
@ -16,6 +18,16 @@ from permissions.decorators import project_perm_required
import shlex import shlex
####################
# Markdown preview #
####################
@login_required
def markdown_preview(request):
content = request.POST.get('data', '')
return HttpResponse(markdown_to_html(content))
######### #########
# Admin # # Admin #
######### #########