On Jun 24, 11:57 am, Wim Feijen <[email protected]> wrote:
>
> Looking at it again, I saw what was wrong and fixed it! For
> completeness, I moved the NewsItem query within the NewsItemBlockNode
FWIW, code at the module top-level is only executed when the module is
first imported. Now you'll know ;)
> 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.filter(Q(expires_at__gt =
> datetime.now()) | Q(expires_at_
> except:
Never use a bare except clause, unless you reraise the exception.
> 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
Never change a Node's attributes from within the render method - this
will screw you sooner or later. Use local variables instead (with the
added bonus of improved performances - local variables are way faster
than attribute lookups).
> if self.identifier in numbers:
> number = numbers[self.identifier]
>
> try:
> newsitem = getattr(newsitems[number], self.field)
>
> if type(newsitem).__name__ == 'datetime':
you may want to read about "isintance"
> if self.identifier in ['medium', 'large']:
use a tuple instead of a list - it's cheaper.
> 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')
You may want to have a read at Django's and Python's localisation
features...
> newsitem = newsitem.upper()
> else:
> newsitem = newsitem.strftime('%d-%m-%Y')
>
> if self.image:
> # Filter only image
> src = re.search('<img(.+)src="(.*?)"(.+)/>', newsitem)
regexps are not the safest way to parse html.
> if src and src.group(2):
> newsitem = src.group(2)
> else:
> newsitem = '/media/site/img/blank.gif'
Use named urls and reverse() instead - unless you are happy with
maintenance headache, of course ;)
> 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)
Proverbial SquaredWheel alert. Django (and Python) have safer ways to
strip a text from HTML tags and entities.
> except:
Same as above. Exceptions and traceback are here to HELP you fixing
your code, so don't shoot yourself in the foot by silently passing
them.
HTH
--
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.