Hello foo example code

from django import forms
from django.utils.html import escape
from django.http import HttpResponse, HttpResponseRedirect
from utils.object import Obj

__all__ = ['HelloFoo']


class EditFooForm(forms.Form):
  name = forms.CharField()


class HelloFoo(Obj):
  'Content type with storage and a simple edit form'
  is_container = 0
  # Set the fields for self.data, self.data is a Storage type
  # i.e. self.data.name works as well as self.data['name']
  # Foo is the default
  data_spec = {'name': 'Foo'}
  
  
  def view_item(self):
    # Shorten the request
    request = self.context.request
    # The user is always stored on the request
    user = request.user
    
    # Make a link to edit. Usually you only want to show when 
    # the user has 'edit' permissions, 
    # has_permissions() is provided by Obj
    html = ''
    if self.has_permissions(user, 'edit_item'):
      html = '<a href="%s">Edit</><br />'
      # It's a very good idea to use self.absolute_url to make a link
      # this way URL mapping will actuallly work
      html %= self.absolute_url('edit_item')
    
    # do an escape on user provided data
    content = '%s<h2>Hello %s!</h2>' % (html, escape(self.data.name))
    msg = 'The %s example:' % self.data.name
    return {'content': content, 'message': msg}
    
  def edit_item(self):
    request = self.context.request
    
    # make cancel go the view
    view_url = self.absolute_url('view_item')
    
    msg = ''
    if request.method == 'GET':
      # get the form guts to be rendered, including the initial value
      # this is a normal Django form
      form = EditFooForm(initial={'name': self.data.name})
    else:
      form = EditFooForm(request.POST)
      if form.is_valid():
        # if the form is valid, store the data
        self.data.name = form.cleaned_data['name']
        self.save_data()
        # redirect to the view
        return HttpResponseRedirect(view_url)
      else:
        # Oops, show the message and go to the form again
        msg = 'There are errrs in the form'
      
    return  {'form': form, 'message': msg, 'cancel_url' view_url}