Skip to content

Commit

Permalink
Merge branch 'master' of ssh://git.netcentrum.cz/projects/content/GIT…
Browse files Browse the repository at this point in the history
…/django-markup
  • Loading branch information
honzakral committed Jun 26, 2009
2 parents cd614dd + fce6e47 commit 5d8f8a3
Show file tree
Hide file tree
Showing 6 changed files with 80 additions and 8 deletions.
37 changes: 32 additions & 5 deletions djangomarkup/fields.py
Expand Up @@ -6,6 +6,7 @@
from django.utils.translation import ugettext_lazy as _
from django.conf import settings
from django.db.models import signals
from django.core import signals as core_signals

from django.contrib.contenttypes.models import ContentType
from djangomarkup.models import SourceText, TextProcessor
Expand Down Expand Up @@ -58,6 +59,8 @@ class RichTextField(fields.Field):
'link_error': _('Some links are broken: %s.'),
}

__inst_counter = 0

def __init__(self, model, field_name, instance=None, syntax_processor_name=None, **kwargs):
# TODO: inform widget about selected processor (JS editor..)

Expand All @@ -73,13 +76,34 @@ def __init__(self, model, field_name, instance=None, syntax_processor_name=None,
super(RichTextField, self).__init__(**kwargs)
self.widget._field = self

def get_instance_id(self, instance):
" Returns instance pk even if multiple instances were passed to RichTextField. "
if type(instance) in [list, tuple]:
core_signals.request_finished.connect(receiver=RichTextField.reset_instance_counter_listener)
if RichTextField.__inst_counter >= len(instance):
return None
else:
obj_id = self.instance[ RichTextField.__inst_counter ].pk
RichTextField.__inst_counter += 1
else:
obj_id = instance.pk
return obj_id

@staticmethod
def reset_instance_counter_listener(*args, **kwargs):
core_signals.request_finished.disconnect(receiver=RichTextField.reset_instance_counter_listener)
RichTextField.__inst_counter = 0

def get_source(self):
try:
if self.instance is None:
raise ValueError("Trying to retrieve source, but no object is available")
src_text = SourceText.objects.get(content_type=self.ct, object_id=self.instance.pk, field=self.field_name)
obj_id = self.get_instance_id(self.instance)
if not obj_id:
return SourceText(processor=self.processor)
src_text = SourceText.objects.get(content_type=self.ct, object_id=obj_id, field=self.field_name)
except SourceText.DoesNotExist:
log.warning('SourceText.DoesNotExist for ct=%s obj_id=%s field=%s' % (self.ct.pk, self.instance.pk, self.field_name))
log.warning('SourceText.DoesNotExist for ct=%s obj_id=%s field=%s' % (self.ct.pk, obj_id, self.field_name))
#raise NotFoundError(u'No SourceText defined for object [%s] , field [%s] ' % ( self.instance.__unicode__(), self.field_name))
src_text = SourceText(processor=self.processor)

Expand All @@ -104,13 +128,16 @@ def clean(self, value):
"""
super_value = super(RichTextField, self).clean(value)
text = smart_unicode(value)

if self.instance:
obj_id = self.get_instance_id(self.instance)
try:
src_text = SourceText.objects.get(content_type=self.ct, object_id=self.instance.pk, field=self.field_name)
if not obj_id:
src_text = SourceText(content_type=self.ct, object_id=obj_id, field=self.field_name, processor=self.processor)
else:
src_text = SourceText.objects.get(content_type=self.ct, object_id=obj_id, field=self.field_name)
assert src_text.processor == self.processor
except SourceText.DoesNotExist:
src_text = SourceText(content_type=self.ct, object_id=self.instance.pk, field=self.field_name, processor=self.processor)
src_text = SourceText(content_type=self.ct, object_id=obj_id, field=self.field_name, processor=self.processor)
src_text.content = text
try:
rendered = src_text.render()
Expand Down
6 changes: 6 additions & 0 deletions djangomarkup/urls.py
@@ -0,0 +1,6 @@
from django.conf.urls.defaults import patterns, url

urlpatterns = patterns('djangomarkup.views',
url(r'^transform/(?P<syntax_processor_name>[a-z\-]+)?/$', 'transform', name="markup-transform"),
)

12 changes: 9 additions & 3 deletions djangomarkup/views.py
Expand Up @@ -2,18 +2,21 @@

from django import template
from django.conf import settings
from django.http import HttpResponse
from django.http import HttpResponse, HttpResponseNotAllowed
from django.utils.translation import ugettext

from djangomarkup.models import TextProcessor

log = logging.getLogger('djangomarkup')

def preview(request, var_name="text", syntax_processor_name=None):
def transform(request, syntax_processor_name=None, var_name="text"):
"""
Returns rendered HTML for source text
"""
source = request.REQUEST.get(var_name)
if request.method != 'POST':
return HttpResponseNotAllowed("Only POST allowed")

source = request.POST.get(var_name)
if not source:
return HttpResponse('')

Expand All @@ -28,3 +31,6 @@ def preview(request, var_name="text", syntax_processor_name=None):
output = '<h3 style="color:red">%s</h3><p>%s</p>' % (ugettext('You have an errors in source text!'), e)

return HttpResponse(output)

# backward compatibility
preview = transform
26 changes: 26 additions & 0 deletions tests/unit_project/test_preview.py
@@ -0,0 +1,26 @@
# -*- coding: utf-8 -*-
from djangosanetesting import DatabaseTestCase
from django.core.urlresolvers import reverse

class TestPreview(DatabaseTestCase):
def setUp(self):
super(TestPreview, self).setUp()
self.processor_name = "markdown"
self.mock_text = u"beer - 啤酒"
self.czechtile_text = u"= Text =\n češťoučký texďýčšek"
self.czechtile_text_transformed = u"<h1>Text</h1><p>češťoučký texďýčšek</p>"

def test_success_default_markdown(self):
self.assert_equals(u"<p>%s</p>" % self.mock_text, self.client.post(reverse("markup-transform"), {'text' : self.mock_text}).content.strip().decode('utf-8'))

def test_get_returns_bad_method(self):
self.assert_equals(405, self.client.get(reverse("markup-transform")).status_code)

def test_empty_(self):
self.assert_equals(u"<p>%s</p>" % self.mock_text, self.client.post(reverse("markup-transform"), {'text' : self.mock_text}).content.strip().decode('utf-8'))

def test_success_czechtile(self):
self.assert_equals(self.czechtile_text_transformed,
self.client.post(reverse("markup-transform", kwargs={'syntax_processor_name' : "czechtile"}),
{'text' : self.czechtile_text}).content.decode('utf-8')
)
1 change: 1 addition & 0 deletions tests/unit_project/test_processing.py
@@ -1,3 +1,4 @@
# -*- coding: utf-8 -*-
from djangosanetesting.cases import UnitTestCase
from djangomarkup.models import TextProcessor
from djangomarkup.processors import ProcessorConfigurationError, ProcessorError
Expand Down
6 changes: 6 additions & 0 deletions tests/unit_project/urls.py
@@ -0,0 +1,6 @@
from django.conf.urls.defaults import patterns, url, include

urlpatterns = patterns('',
url(r'^', include('djangomarkup.urls')),
)

0 comments on commit 5d8f8a3

Please sign in to comment.