You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
56 lines
1.8 KiB
56 lines
1.8 KiB
# -*- coding: UTF-8 -*- |
|
# Erik Stein <code@classlibrary.net>, 09/2010 |
|
|
|
from django.utils.translation import ugettext_lazy as _ |
|
from django.utils.html import linebreaks, urlize |
|
|
|
|
|
class Markup(object): |
|
def __init__(self, instance, field_name, rendered_field_name, |
|
markup_type_field_name): |
|
# instead of storing actual values store a reference to the instance |
|
# along with field names, this makes assignment possible |
|
self.instance = instance |
|
self.field_name = field_name |
|
self.rendered_field_name = rendered_field_name |
|
self.markup_type_field_name = markup_type_field_name |
|
|
|
# raw is read/write |
|
def _get_raw(self): |
|
return self.instance.__dict__[self.field_name] |
|
def _set_raw(self, value): |
|
setattr(self.instance, self.field_name, value) |
|
raw = property(_get_raw, _set_raw) |
|
|
|
# markup_type is read/write |
|
def _get_markup_type(self): |
|
return self.instance.__dict__[self.markup_type_field_name] |
|
def _set_markup_type(self, value): |
|
return setattr(self.instance, self.markup_type_field_name, value) |
|
markup_type = property(_get_markup_type, _set_markup_type) |
|
|
|
# rendered is a read only property |
|
def _get_rendered(self): |
|
return getattr(self.instance, self.rendered_field_name) |
|
rendered = property(_get_rendered) |
|
|
|
# allows display via templates to work without safe filter |
|
def __unicode__(self): |
|
return self.rendered |
|
__unicode__.is_safe = True |
|
|
|
def render(self, value): |
|
""" |
|
Must be implemented by subclasses and return the rendered self.raw |
|
""" |
|
raise NotImplementedError |
|
render.is_safe = True |
|
|
|
|
|
class PlaintextMarkup(object): |
|
def render(self, value): |
|
return urlize(linebreaks(markup)) |
|
render.is_safe = True |
|
|
|
|
|
PLAINTEXT_MARKUP_DESCRIPTION = ('text', PlaintextMarkup)
|
|
|