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 <[email protected]> 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
> > different formats on the homepage.
>
> > However, when a new NewsItem is added, it does not appear at once.
>
> > Might this have to do with the fact that we use a template tag to get
> > the NewsItems out of the db?
>
> > Our query is:
>
> > 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')
>
> > Or is datetime.now() fixed to the past?
>
> > What would be a proper way to solve this then? Maybe add a post-save
> > signal but how could we use this then to refresh the tag?
>
> > If something else is the matter, or just if you're interested: we host
> > our site using a virtual apache + mod_wsgi + nginx.
>
> > Thanks for your help!
>
> > Wim
>
> Please show the full code for the templatetag.
> --
> DR.
--
You received this message because you are subscribed to the Google Groups
"Django users" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/django-users?hl=en.