offline / django-annoying

This is django application that try to eliminate annoying things in Django framework.

Description

This is django application that try to eliminate annoying things in Django framework.

Features

  • render_to decorator - reduce typing in django views.
  • signals decorator - allow use signals as decorators.
  • ajax_request decorator - returns JsonResponse with dict as content.
  • autostrip decorator - strip form text fields before validation
  • get_object_or_None function - similar to get_object_or_404, but returns None if object not found.
  • get_config function - get settings from django.conf if exists, return default value otherwise.
  • AutoOneToOne field - creates related object on first call if it doesnt exists yet.
  • HttpResponseReload - reload and stay on same page from where request was made.
  • StaticServer middleware - instead of configuring urls.py, just add this middleware and it will serve your static files when you in debug mode

Installation instruction

  • Copy annoying directory to your django project or put in on PYTHONPATH
  • Also you can run sudo python setup.py install or sudo easy_install django-annoying

Examples

render_to decorator

from annoying.decorators import render_to

# 1. Template name in decorator parameters

@render_to('template.html')
def foo(request):          
    bar = Bar.object.all()  
    return {'bar': bar}     

# equals to 
def foo(request):
    bar = Bar.object.all()  
    return render_to_response('template.html', 
                                                  {'bar': bar},    
                                                   context_instance=RequestContext(request))


# 2. Template name as TEMPLATE item value in return dictionary

@render_to()
def foo(request, category):
    template_name = '%s.html' % category
    return {'bar': bar, 'TEMPLATE': template_name}
                                                      
#equals to                                        
def foo(request, category):                       
    template_name = '%s.html' % category          
    return render_to_response(template_name,      
                                                  {'bar': bar},       
                                                  context_instance=RequestContext(request))

signals decorator

from annoying.decorators import signals

# connect to registered signal
@signals.post_save(sender=YourModel)
def sighandler(instance, **kwargs): 
    pass                            

# connect to any signal
signals.register_signal(siginstance, signame) # and then as in example above

#or 
          
@signals(siginstance, sender=YourModel)
def sighandler(instance, **kwargs):    
    pass                               

#In any case defined function will remain as is, without any changes.

ajax_request decorator

1
2
3
4
5
6
7
from annoying.decorators import ajax_request

@ajax_request
def my_view(request):
    news = News.objects.all()
    news_titles = [entry.title for entry in news]
    return {'news_titles': news_titles}

autostrip decorator

from annoying.decorators import autostrip

class PersonForm(forms.Form):
    name = forms.CharField(min_length=2, max_length=10)
    email = forms.EmailField()

PersonForm = autostrip(PersonForm)

#or in python >= 2.6

@autostrip
class PersonForm(forms.Form):
    name = forms.CharField(min_length=2, max_length=10)
    email = forms.EmailField()

get_object_or_None function

1
2
3
4
5
6
from annoying.functions import get_object_or_None

def get_user(request, user_id):
    user = get_object_or_None(User, id=user_id)
    if not user:
        ...

AutoOneToOneField

1
2
3
4
5
6
7
from annoying.fields import AutoOneToOneField


class MyProfile(models.Model):
    user = AutoOneToOneField(User, primary_key=True)
    home_page = models.URLField(max_length=255)
    icq = models.CharField(max_length=255)

get_config function

1
2
3
from annoying.functions import get_config

ADMIN_EMAIL = get_config('ADMIN_EMAIL', 'default@email.com')

StaticServer middleware

Add this middleware as first item in MIDDLEWARE_CLASSES

example:

1
2
3
4
5
6
7
MIDDLEWARE_CLASSES = (
    'annoying.middlewares.StaticServe',
    'django.middleware.common.CommonMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',              
    'django.middleware.doc.XViewMiddleware',               
    'django.contrib.auth.middleware.AuthenticationMiddleware',                    
)

It will serve static files in debug mode. Also it helps when you debug one of you middlewares by responding to static requests before they get to debuged middleware and will save you from typing 100 times "continue".


This revision is from 2009-06-02 01:44