Thanks!
That helped. :)
The code for the tag was as follows:
import re
from django.template import Variable, VariableDoesNotExist, Node,
Library, Template, TemplateSyntaxError, Context, loader
from django.conf import settings
from django.utils.safestring import mark_safe
from django.utils.html import escape
from django.utils.translation import ugettext as _
register = Library()
from cms.news.models import NewsItem
from django.db.models import Q
from datetime import datetime
try:
# newsitems = NewsItem.objects.all().order_by('-created_at')
# newsitems = NewsItem.objects.visible().order_by('-
news_timestamp')
newsitems = NewsItem.objects.filter(Q(expires_at__gt =
datetime.now()) | Q(expires_at__isnull = True), effective_at__lte =
datetime.now(), is_active=True).order_by('-news_timestamp')
except:
newsitems = None
class NewsItemBlockNode(Node):
def __init__(self, identifier, field):
self.identifier = str(identifier)
self.field = str(field)
self.image = False
def render(self, context):
global newsitems
number = -1
numbers = {
'large': 0,
'large-small': 0,
'small1': 1,
'small2': 2,
'small3': 3,
'small4': 4,
'medium': 5,
}
# Only image
if self.field == 'teaser-image':
self.field = 'teaser'
self.image = True
if self.identifier in numbers:
number = numbers[self.identifier]
try:
newsitem = getattr(newsitems[number], self.field)
if type(newsitem).__name__ == 'datetime':
if self.identifier in ['medium', 'large']:
newsitem = newsitem.strftime('%d [%m] %Y')
newsitem = newsitem.replace('[01]', 'januari')
newsitem = newsitem.replace('[02]', 'februari')
newsitem = newsitem.replace('[03]', 'maart')
newsitem = newsitem.replace('[04]', 'april')
newsitem = newsitem.replace('[05]', 'mei')
newsitem = newsitem.replace('[06]', 'juni')
newsitem = newsitem.replace('[07]', 'juli')
newsitem = newsitem.replace('[08]', 'augustus')
newsitem = newsitem.replace('[09]', 'september')
newsitem = newsitem.replace('[10]', 'oktober')
newsitem = newsitem.replace('[11]', 'november')
newsitem = newsitem.replace('[12]', 'december')
newsitem = newsitem.upper()
else:
newsitem = newsitem.strftime('%d-%m-%Y')
if self.image:
# Filter only image
src = re.search('<img(.+)src="(.*?)"(.+)/>', newsitem)
if src and src.group(2):
newsitem = src.group(2)
else:
newsitem = '/media/site/img/blank.gif'
elif self.field == 'teaser':
# Filter image
newsitem = re.sub('<img (.+) />', '', newsitem)
newsitem = re.sub('<a.*?>', '', newsitem)
newsitem = re.sub('</a>', '', newsitem)
newsitem = re.sub(' ', '', newsitem)
except:
newsitem = ''
return mark_safe(newsitem)
@register.tag()
def show_newsitem(parser, token):
try:
tag, identifier, field = token.split_contents()
except ValueError:
raise TemplateSyntaxError('%s needs newsitem number (x latest
newsitem) as an argument.' % tag)
return NewsItemBlockNode(identifier, field)
------
Looking at it again, I saw what was wrong and fixed it! For
completeness, I moved the NewsItem query within the NewsItemBlockNode
and everything works fine! The current code is:
import re
from django.template import Variable, VariableDoesNotExist, Node,
Library, Template, TemplateSynta
from django.conf import settings
from django.utils.safestring import mark_safe
from django.utils.html import escape
from django.utils.translation import ugettext as _
register = Library()
from cms.news.models import NewsItem
from django.db.models import Q
from datetime import datetime
class NewsItemBlockNode(Node):
def __init__(self, identifier, field):
self.identifier = str(identifier)
self.field = str(field)
self.image = False
def render(self, context):
try:
# newsitems = NewsItem.objects.all().order_by('-
created_at')
# newsitems = NewsItem.objects.visible().order_by('-
news_timestamp')
newsitems = NewsItem.objects.filter(Q(expires_at__gt =
datetime.now()) | Q(expires_at_
except:
newsitems = None
number = -1
numbers = {
'large': 0,
'large-small': 0,
'small1': 1,
'small2': 2,
'small3': 3,
'small4': 4,
'medium': 5,
}
# Only image
if self.field == 'teaser-image':
self.field = 'teaser'
self.image = True
if self.identifier in numbers:
number = numbers[self.identifier]
try:
newsitem = getattr(newsitems[number], self.field)
if type(newsitem).__name__ == 'datetime':
if self.identifier in ['medium', 'large']:
newsitem = newsitem.strftime('%d [%m] %Y')
newsitem = newsitem.replace('[01]', 'januari')
newsitem = newsitem.replace('[02]', 'februari')
newsitem = newsitem.replace('[03]', 'maart')
newsitem = newsitem.replace('[04]', 'april')
newsitem = newsitem.replace('[05]', 'mei')
newsitem = newsitem.replace('[06]', 'juni')
newsitem = newsitem.replace('[07]', 'juli')
newsitem = newsitem.replace('[08]', 'augustus')
newsitem = newsitem.replace('[09]', 'september')
newsitem = newsitem.replace('[10]', 'oktober')
newsitem = newsitem.replace('[11]', 'november')
newsitem = newsitem.replace('[12]', 'december')
newsitem = newsitem.upper()
else:
newsitem = newsitem.strftime('%d-%m-%Y')
if self.image:
# Filter only image
src = re.search('<img(.+)src="(.*?)"(.+)/>', newsitem)
if src and src.group(2):
newsitem = src.group(2)
else:
newsitem = '/media/site/img/blank.gif'
elif self.field == 'teaser':
# Filter image
newsitem = re.sub('<img (.+) />', '', newsitem)
newsitem = re.sub('<a.*?>', '', newsitem)
newsitem = re.sub('</a>', '', newsitem)
newsitem = re.sub(' ', '', newsitem)
except:
newsitem = ''
return mark_safe(newsitem)
@register.tag()
def show_newsitem(parser, token):
try:
tag, identifier, field = token.split_contents()
except ValueError:
raise TemplateSyntaxError('%s needs newsitem number (x latest
newsitem) as an argument.' %
return NewsItemBlockNode(identifier, field)
Thanks Michal and Daniel for your help!
Wim
On Jun 22, 8:24 pm, Daniel Roseman <
dan...@roseman.org.uk> wrote:
> On Wednesday, 22 June 2011 14:32:10 UTC+1, Wim Feijen wrote:
>
> > Hello,
>
> > Atwww.mkb-rotterdam.nlwe use a template tag to display NewsItems in