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('&nbsp;', '', 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('&nbsp;', '', 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
> > 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 django-users@googlegroups.com.
To unsubscribe from this group, send email to 
django-users+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/django-users?hl=en.

Reply via email to