What's new in Django community blogs?

Problem with django feed

May 28 2007 [Archived Version] □ Published at orestis.gr

I fell into the obligatory problem where non-public items leak out to public feeds. Sorry to everyone, I've updated the feed.

The root of the problem was not using the custom public Manager I have created to deal with this problem in the django-tagging application. It accepts only Model classes. I'll probably hack it up to suit my needs...

Comments


One rule to bind them - part II

May 28 2007 [Archived Version] □ Published at Wad of Stuff under tags  dhcp django infrastructure jass jumpstart

In part I of this article I tried reducing the number of steps a user was required to perform to get a system installed via jumpstart and addressed a couple of the goals I mentioned in Building a manageable jumpstart infrastructure using the Solaris Security Toolkit.My ultimate goal was to reduce steps 1 through 5 and selecting from the build menu to a single interaction such as entering the


Beware: Python markdown limitations

May 28 2007 [Archived Version] □ Published at orestis.gr

I use markdown to edit the posts in this blog, using the python markdown library. However, I discovered a nagging problem that will cause to me switch away, to something like ReST.

This is an issue that dates back to 2006, and it's very annoying for blogs. You can't put images inside links! This means that the often-used thumbnail image that links to the full-sized original image, has to be done in plain old HTML, which sucks.

Here's an example:

This should render the google logo linking to google:

[![the google logo][logo]][google]
[logo]: http://www.google.com/images/logo.gif
[google]: http://www.google.com/ "click to visit Google.com"

But instead it renders (Actual output):

[the google logo][google]

Source

[<img src="http://www.google.com/images/logo.gif" alt="the google logo"/>][google]

(Taken from here)

Disclaimer: This is about the Python engine of markdown. Other implementations of markdown work fine, as far as I can tell.

So, should I just bite the bullet and switch to ReST ?

Comments


Django's newforms and model constraints

May 26 2007 [Archived Version] □ Published at zerokspot.com

Today I wanted to use one of Django SVN’s new features: A newforms’s forum for a model instance that only uses a subset of its fields (For example if a model has the fields a, b and c, you could easily create a form that only handles a and b). But I found a small problem: You can use such a form, to also write the data back to the database and in the process use the model’s data validation and integrity checks.


He shoots, he scores!

May 26 2007 [Archived Version] □ Published at Glenn Fanxman

Adrian Holovaty just scored big. Congrats, Adrian! Your work on Django and realted projects is definitly appreciated.
Post to Del.icio.us


Matplotlib rocks!

May 24 2007 [Archived Version] □ Published at orestis.gr

Today I discovered the excellent python module for plotting matlab style, matplotlib. It allowed me to quickly visualize some data I am crunching for my diploma thesis.

Here are some quick pics: Self organizing grid

Self organizing grid

For the curious, this is an experiment using Self-Organized Maps (or SOMs). You start with some random nodes, then as you feed them random data, they unravel to something resembling a grid.

I plan to use it for word clustering. I'll post more about my diploma thesis as I get more close to finishing it.

Comments


Django Newforms

May 19 2007 [Archived Version] □ Published at PyMan under tags  django

Eu estava escrevendo um post completo sobre o newforms do django, quando eu vejo que eles atualizaram a documentação no site oficial hoje. E vários assuntos que estava abordando e que não tinham na documentação agora estão lá. Por isso vou deixar este post engavetado quietinho, quem saiba ainda precise dele?

Mas para quem quer aprender ou saber mais sobre newforms ai vai umas dicas:

A documentação oficial pode ser acessada aqui -> http://www.djangoproject.com/documentation/newforms/

Na documentação oficial, aborda os seguintes temas:
  • arquitetura do newforms que é formada por fields, widgets e forms.
  • criação, validação e exibição dos formulários em html.
  • criação de formulários a partir de um existente usando herança.
  • documentação sobre os fields (novo)
  • geração de formulários através do model ou instância.

Há coisas que ainda não tem documentação como personalização de formulários gerados através de um modelo ou uma demonstração de como um model por interferir num form gerado pelo newforms, mas isso eu posso mostrar em outros posts.

Abaixo alguns links sobre newforms que valem a pena serem lidos.

http://pythonidae.blogspot.com/2007/03/django-e-o-quebra-cabea-com-newforms_27.html
http://weblog.bignerdranch.com/?p=31
http://eggdrop.ch/blog/2007/02/15/django-dynamicforms/
http://code.pui.ch/2007/01/07/using-djangos-newforms/
http://www.zoia.org/blog/2007/04/23/using-dynamic-choices-with-django-newforms-and-custom-widgets/
http://unpythonic.blogspot.com/2007/01/django-newforms-for-models.html
http://www.pkshiu.com/loft/archive/2007/04/custom-validation-in-django-newforms-library


Αργαλειός λέξεων

May 15 2007 [Archived Version] □ Published at orestis.gr

Διάβασα αυτές τις μέρες το μυθιστόρημα του Χρήστου Χωμενίδη "Το σπίτι και το κελλί", ένα πραγματικά εκπληκτικό διήγημα που αποτυπώνει την ιστορία της 17 Νοέμβρη, ή της "Εταιρείας", σε ένα παράλληλο σύμπαν. Ο τόπος, ο χρόνος και οι πολιτικές συνθήκες είναι οι ίδιες, ενώ τα πρόσωπα και οι λεπτομέρειες είναι διαφορετικά, όχι όμως τόσο διαφορετικά ώστε να μην μπορεί κάποιος να διακρίνει τους παραλληλισμούς.

Αυτό όμως που κάνει την πλοκή τόσο συναρπαστική δεν είναι τόσο η εξιστόρηση μιας (λίγο-πολύ) γνωστής πλέον ιστορίας μιας τρομοκρατικής οργάνωσης, όσο ο θαυμασιος τρόπος με τον οποίο ο Χωμενίδης πλέκει σίγα-σιγά τις σχέσεις μεταξύ των χαρακτήρων.

Ένας διπλωμάτης, ένας οινοποιός, ένας μποεμ τύπος, ένας ψαράς, ένας γεωπόνος, μια νηπιαγωγός είναι οι κλωστές που ξεκινούν χωριστά, πλέκονται, διασταυρώνονται, μπερδεύονται και χωρίζουν ξανά για να ενωθούν με νέο σχήμα κάποιες σελίδες αργότερα. Η σχέσεις διανθίζονται με οικογενειακά συμπλέγματα, έρωτες, απιστίες και αμφιβολίες, και ο αναγνώστης εύκολα ταυτίζεται με γνώριμες παρόμοιες καταστάσεις.

Ξύπνησα σήμερα το απόγευμα και το είδα σχηματικά, την ώρα που ούτε ξύπνιος ήμουν, ούτε όμως και κοιμισμένος:

Ένας αργαλειός, όπου κλωστές ταξιδεύουν πάνω κάτω, αραχνοΰφαντα νήματα τις φέρνουν κοντά και τις απομακρύνουν. Ένα ζευγάρι ενώνεται και ακολουθεί κοινή πορεία, μια επίσκεψη όμως μιας τρίτης κλωστής τους χωρίζει... Κλωστές που ήταν πολύ μακρυά, ξάφνου, με έναν απίθανο συνδυασμό ενώνονται και επηρρεάζουν την πορεία η μία της άλλης.

Στο μυαλό μου σχηματιζόταν καταπληκτικές εικόνες... Τι να σου κάνει ο κινηματογράφος.

Θα ήταν ενδιαφέρον βέβαια να προσπαθήσω να αποτυπώσω τις διαδρομές αυτές σε εικόνα. Ένα ενδιαφέρον project για ένα μεγάλο Σαββατοκύριακο...

Comments


Going International, pt. 3: Implementation of multilingual content

May 14 2007 [Archived Version] □ Published at orestis.gr

Introduction

As I wrote in the two previous posts, I wanted the URLs of this site to contain the language the content is in. To do this, I had to write some custom code, including models, managers, middleware and context processors.

Models

The first step on having multilingual content is to define a model that can support it. I thought long and hard and it boils down to these conclusions:

  • The same content in different languages shares some data, like the slug, the tags and the publication date
  • The different data are the title, the summary and the body.
  • Therefore, I have to find a way to "inherit" the shared data to the actual entries, while keeping the different data apart.

Model inheritance in Django is somewhat rough, and so I went with KISS: Keep it simple, stupid, and went with the simplest thing that might just work:

First, define a master entry:

 class MasterEntry(models.Model):
  slug = models.SlugField(
  unique_for_date='pub_date',
  prepopulate_from=('title',),
      help_text='Do not add language info here.'
  )
  pub_date = models.DateTimeField()
  tags = TagField()    
  enable_comments = models.BooleanField(default=True)    

  class Meta:
     ordering = ('-pub_date',)
     get_latest_by = 'pub_date'

  class Admin:
     list_display = ('pub_date', 'slug')
     list_filter = ('enable_comments', 'pub_date')
     search_fields = ['slug','tags']
     date_hierarchy = 'pub_date'

  def save(self):
     super(MasterEntry,self).save()
     for entry in self.entry_set.all():
         entry.save()
  def __str__(self):
     return self.slug

Pretty basic (although I removed some methods to help clarify things) except of the save method: it iterates over all the child entries and saves them.

Then, define the child entry:

class Entry(models.Model):
  title = models.CharField(maxlength=200) 
  summary = models.TextField(help_text="One paragraph. Don't add &lt;p&gt; tag.")
  body = models.TextField()

  master = models.ForeignKey(MasterEntry, 'id')
  language = models.CharField(maxlength=2, choices=settings.LANGUAGES)

  objects = models.Manager()
  public = EntriesManager()

  slug = models.SlugField(
    unique_for_date='pub_date',
    prepopulate_from=('title',),
    blank=True,
    editable=False

  )
  pub_date = models.DateTimeField(blank=True,editable=False)
  tags = TagField(editable=False)    
  enable_comments = models.BooleanField(blank=True,editable=False)    
  is_public = models.BooleanField(default=False)        

  def save(self):
     self.slug=self.master.slug
     self.pub_date=self.master.pub_date
     self.tags = self.master.tags
     self.enable_comments = self.master.enable_comments
     super(Entry, self).save()

  class Meta:
      ordering = ('-pub_date',)
      get_latest_by = 'pub_date'
      unique_together=(('master','language','slug'),)
      verbose_name = _('Entry')
      verbose_name_plural = _('Entries')

  class Admin:
      list_display = ('title','master', 'pub_date', 'is_public',)
      list_filter = ('enable_comments', 'pub_date')
      search_fields = ['title', 'summary', 'body']
      date_hierarchy = 'pub_date'
      fields = (
          (None, {
            'fields': ('master','language','title', 'summary','body','is_public')
          }),
      )

  def __str__(self):
      return self.title+" - ("+str(self.master)+")"

  def get_absolute_url(self):
      if self.is_public:
          return "/%s/blog/%s/%s/" % (self.language,self.pub_date.strftime(
           "%Y/%m/%d").lower(), self.slug)
      else:
          return "/%s/blog/preview/%d" %(self.language,self.id)

The child entry has a reference to a master entry. It also has a language field that defines the language it is in. It then goes on to define the same fields the master entry has, which are then overridden in the custom save method. I had to do this in order to be able to use generic views (which require a pub_date field) as I couldn't get them to use the master entry's pub_date directly. I also toyed with properties, but it didn't worked out for me, so I just went with what worked. Notice that the inherited fields are not editable, hence they are not visible in admin.

You can see now that changes in the MasterEntry propagate down to the Entry , via its custom save method.

I also add a custom manager named public. More on that in...

Managers and Views

Defining the models is half the job - custom managers allow you to access advanced functionality with less code, and also to plug into places like generic views and feeds easily. Here are my managers:

class PublicEntriesManager(models.Manager):
  def get_query_set(self):
      return super(PublicEntriesManager, self).get_query_set().filter(is_public=True)

class EntriesManager(PublicEntriesManager):
  def in_language(self, lang):     
      queryset_lang=super(EntriesManager, self).get_query_set().filter(language=lang)
      return queryset_lang

  def get_entries(self,pub_date,slug):
      qs = Entry.public.filter(pub_date__range=(
        datetime.combine(pub_date, time.min), 
        datetime.combine(pub_date, time.max)
        ),
        slug__exact=slug)
      entries = {}
      for e in qs: entries[e.language]=e
      return entries

  def archives(self):
      return Entry.public.all().dates('pub_date','month','DESC')

  def has_entries_missing(self,the_lang, entry_qs):
      if isinstance(entry_qs,models.Manager):entry_qs=entry_qs.all()
      master_entries = MasterEntry.objects.filter(entry__in=entry_qs)
      return _compare_entries_lang(the_lang,master_entries)

Plus the _compare_entries_lang function:

def _compare_entries_lang2(the_lang, master_entries=MasterEntry.objects): 
    if isinstance(master_entries,models.Manager):master_entries=master_entries.all()
    for me in master_entries:
        if me.entry_set.filter(is_public=True).count() < len(settings.LANGUAGES):
            #this master entry has entries in less than the supported languages
            #lets find out if they are missing in the requested lang
            if not me.entry_set.filter(language=the_lang,is_public=True).count():
                #yep, they do
                for lang,dummy in settings.LANGUAGES:
                    if lang!=the_lang:
                        return lang
    return None

This is quite big, so I'll break it down:

PublicEntriesManager is simply a manager that filters out the non-public entries. This way, in my view code I can use Entry.public.all() and I can be sure I get only the public entries. This saves some headaches and prevents silly mistakes (like, you show only the public objects on site, but display everything in your feeds).

EntriesManager is quite more complex. I have some complicated language-related functionality here, and it manages it all:

  • If you get to a page (like a month archive or the index page) that detects that there are more entries available, but not in the current language, it displays a notification.
  • Then, if you request an entry that is not available in your current language, it displays the available entry with a notification.
  • Lastly, if you request an entry in a language other than your own, it displays it, along with a notification that you might prefer viewing the content in your own language.

I begin with the simple ones: archives is used to make a listing of dates that have public Entries, so I can create the archive listing on the right. in_language filters the queryset to return only the entries in a language.

To explain has_entries_missing, here is some code that accesses the EntriesManager:

def entry_index(request):
  queryset= Entry.public
  entries_missing=Entry.public.has_entries_missing(request.url_lang, queryset)
  archive_blog_dict = {
    'queryset': queryset.in_language(request.url_lang),
    'date_field': 'pub_date',
    'template_name':'entry_archive.html',
    'extra_context':{'entries_missing':entries_missing}
    }   

  return archive_index(request, **archive_blog_dict)

def entry_month(request, year, month):
   date = datetime.date(*time.strptime(year+month, '%Y%m')[:3])
   first_day = date.replace(day=1)
   if first_day.month == 12:
       last_day = first_day.replace(year=first_day.year + 1, month=1)
   else:
       last_day = first_day.replace(month=first_day.month + 1)
   lookup_kwargs = {'pub_date__range' : (first_day, last_day)}   
   queryset= Entry.public
   entries_missing = Entry.public.has_entries_missing(request.url_lang,  
       queryset.filter(**lookup_kwargs) )
   archive_month_blog_dict = {
     'queryset': queryset.in_language(request.url_lang),
     'date_field': 'pub_date',
     'template_name':'entry_archive_month.html',
     'month_format':'%m',
     'allow_empty':True,
     'extra_context':{'entries_missing':entries_missing}
     }
  return archive_month(request, year, month, **archive_month_blog_dict)

The has_entries_missing method checks a QuerySet of Entries to see if they are available in both languages. If they are not, it returns the language code that has the extra entries. I use it in my templates to create a link to the page that displays the missing entries. I now have only two languages, but I think it will work with more than two. I'll let you know when I try it :)

Finally, the get_entries method returns a dictionary with languages as the keys and entries as the values, for a given pub_date and slug. This can be used to check if a single entry is available in one or both languages, and display the relevant information. The view that uses this is:

def entry_detail(request, year, month, day, slug):
   pub_date = datetime.date(*time.strptime(year+month+day, '%Y%m%d')[:3])
   entries = Entry.public.get_entries(pub_date,slug)
   entry_blog_dict = {
       'queryset': Entry.public.all(),
       'date_field': 'pub_date',
       'template_name':'entry_detail.html',
       'template_object_name':'entry',
       'month_format':'%m',
       'extra_context':{'available_languages':len(entries)-1} # so to be either 0 (False) or 1 (True)

       }
   try:
       entry = entries[request.url_lang]
       entry_blog_dict['object_id']=entry.id
   except KeyError:
       entry = entries.values()[0] # we assume only 2 languages active
       entry_blog_dict['extra_context']['language_not_found']=entry.language
       entry_blog_dict['object_id']=entry.id
   return object_detail(request, year=year, month=month, day=day, slug=slug, **entry_blog_dict)

Not the best looking code, but it works ;)

That's all for now

This post got bigger than I expected, and I still haven't covered the middleware and context processors. I'll cover these two in the next post. Until then, please leave a comment and let me know what you think about this!

UPDATE

I guess I should put my money where my mouth is :) I found out that the the _compare_entries_lang function didn't work as expected. I've replaced it with a better, but maybe slightly slower version.

Comments


Going international, pt. 2: URL design

May 13 2007 [Archived Version] □ Published at orestis.gr

To help myself developing the international part of this blog, I've made some usage scenarios, which I write down here, partly to not forget them but mostly to help find any mistakes and omissions. So here they are:

The users:

  • Giannis (Greek, computer savvy user, has his browser correctly set)
  • Takis (Greek, lives abroad, doesn't have access to the language settings)

I could also define two English users in similar situations, but there's no point as it turns out that they just mirror each other.

I have to point out a seemingly little-used preference of web browsers, the language selection preference. This sets the HTTP header 'Accept-Language' so that a server can know, erm, the language preference. This is basic stuff but not many users bother to change from the default setting.

URLs and design

The pages:

  • /el/1/ Direct link to a greek page, content isn't available in english.
  • /en/2/ Direct link to an english page, content isn't available in greek.
  • /el/3/ Direct link to a greek page, content is available in english.
  • /en/3/ Direct link to an english page, content is available in greek.

Also, there are two little flags on the top right of the site that allow a user to explicitly select the language of his choice. I think that this is the standard way to provide language selection. I don't quite like drop-downs, as you have to deal with how to provide the language name (in English? in the same language?). Flags are unobtrusive, universal (to those who care), and don't take up much space.

Expected results

The expected results:

Giannis, Takis having selected greek:

  • /el/1/ - Everything in greek.
  • /en/1/ - Menu in greek, content in greek, notification (greek) that the content isn't available in english.
  • /el/2/ - Menu in greek, content in english, notification (greek) that the content isn't available in greek.
  • /en/2/ - Menu in greek, content in english.
  • /en/3/ - Menu in greek, content in english, notification (greek) that the content is also available in greek.
  • /el/3/ - Everything in greek.

Takis, Giannis having selected greek:

  • /el/1/ - Menu in english, content in greek.
  • /en/1/ - Menu in english, content in greek, notification (english) that the content isn't available in english.
  • /el/2/ - Menu in english, content in english, notification (english) that the content isn't available in greek.
  • /en/2/ - Everything in english.
  • /en/3/ - Everything in english.
  • /el/3/ - Menu in english, content in greek, notification (english) that the content is also available in greek.

When Giannis selects greek and Takis selects english, there are no changes.

Algorithm

So a pattern emerges:

  • The language part of the url defines the language of the content and
  • The browser preference defines the language of interface (menu and messages)

Also, the browser preference determines the language of the root page ( ie. orestis.gr/, without a following language code). A visit to the root page actually returns a redirect.

Conclusion

I think that this is a sound approach: If we try to be RESTful and Google friendly, a unique resource is named with a unique URL: The URL part define the language of the content. There is a slight anomaly when the content isn't available in all languages, where I consider bad manners to give a 404, so I just display the alternate version.

Is there a better way to handle this ? Please leave your comments!

Comments


Captcha no django

May 09 2007 [Archived Version] □ Published at PyMan under tags  django

Você quer evitar spams em seus sistemas feitos em django?

Seus problemas acabaram! Existe um projeto opensource da verificação capctha para django. Este projeto utiliza os newforms o que é algo muito bom, já que a maneira antiga de tratar formulários no django tende a ser extinta.

Para saber mais sobre o projeto acesse: http://www.lostlogicx.com/captchasblow/


Lançado o Bingo!

May 09 2007 [Archived Version] □ Published at PyMan under tags  django


Depois do anúncio aqui está o lançamento. Este ainda não é o lançamento oficial, mas já está disponível no google code o código fonte do bingo.

Para quem não sabe o bingo é um CMS desenvolvido em django.

O blog, wiki, feeds RSS e atom já estão em funcionamento, mas há várias coisas a serem resolvidas, como os comentários e cadastro de usuários.

Para as tags usamos o django-tagging.

O marinho, meu parceiro no desenvolvimento do bingo colocou uma versão do bingo no ar para ver acesse http://marinho.webdoisonline.com/blog/.

Também foi criado um grupo de discussão para o grupo de desenvolvimento do bingo. Se quiser participar é só se inscrever. O e-mail do grupo é [email protected]

Só lembrando que ainda não foram lançadas nenhuma versão release, mas em breve lançaremos o 0.1.

Para acessar o código fonte do bingo via svn use:

svn checkout http://bingo.googlecode.com/svn/trunk/ bingo


Enfim o django 0.96

May 09 2007 [Archived Version] □ Published at PyMan under tags  django

Dia 23 de março foi anunciado no blog oficial do django o lançamento da versão 0.96 do django.

O objetivo principal dessa versão é deixar estável, algumas coisas que foram iniciadas na versão 0.95 e nisso haverá incompatibilidades na mudança de versão.

A principal incompatibilidade está relacionada ao driver para MySQL, o MySQLdb. Se a versão que você utiliza for anterior a 1.2.1p2, você terá que colocar no settings 'mysql_old' em vez de 'mysql', se a versão do driver for a 1.2.1p2 ou mais recente continua a mesma coisa.

Como muitos ja esperavam, o newsforms que é a nova biblioteca para geração e manipulação de formulários é a padrão. Se você quiser continuar usando os oldforms é só importar os oldforms como forms da seguinte maneira:

from django import oldforms as forms

Entre as outras novidades está:

Uuma ferramenta para testes.

Melhoria na parte de serialização, com novos formatos, suportando JSON, XML e Python ( gerando listas, dicionários, strings )

Melhorias também na configuraçã ode URLs, antes só era permitido strings com o caimnho inteiro indicando uma função duma view, agora é possível importar essa função com o import do Python e apenas chamá-la. Ex:

from django.conf.urls.defaults import *
from mysite.myapp.views import myview

urlpatterns = patterns('',
('^myview/$', myview)
)

E para finalizar foram adicionados mais dois contribs: formtools, localflavor.

Em breve, estarei trazendo mais novidades sobre essas novidades da versão 0.96.


Mais um site feito em django com o fonte liberado!!!

May 09 2007 [Archived Version] □ Published at PyMan under tags  django

Tá virando mania mesmo!

Tudo começou quando o JeffCroft resolveu liberar o código fonte de uma projeto que ele tinha feito em django o LOST-theories.com. Esse foi seu primeiro projeto em django. Mesmo com o grande crescimento da comunidade OpenSource e com a idéia de que algo assim poderá ajudar muitos a aprenderem a fazer o que você sabe, podendo ajudar a comunidade estarem bem difundidos, ainda é raro vermos algo assim.

Lógico que tem projetos opensource em várias linguagens são faceis de achar, como o Drupal por exemplo. Mas liberar o código fonte de um site comercial, só para mostrar como foi feito é algo que não se vê todo dia.

Muita gente viu e curtiu! E o resultado disso foi mais dois sites repetirem o ato: o CheeseRater e o DjangoSnnipets.org.

Vendo a ação feita pelo pessoal do DjangoSnnipets, o Chris McAvoy liberou através do google code, um projeto para podcasts em django.

Nisso já são 4 projetos, um vendo o outro e seguindo o exemplo. Isso me faz lembrar do filme: 'A corrente do bem'.

Agora falta só você também fazer parte dela ( e eu também né ).

A comunidade django agradece!

Ai estão o link para os fontes dos projetos:

http://code.google.com/p/tastebud/
http://code.google.com/p/cab/
http://code.google.com/p/django-registration/
http://www.cheeserater.com/ ( o link para o fonte fica no rodapé do site )
http://files.jeffcroft.com/code/lost-theories.zip


CMS em Django? bingo!

May 09 2007 [Archived Version] □ Published at PyMan under tags  django

Depois de um tempo de pesquisa concluí:

Ao contrário das outras tecnologias, não há nenhum CMS, Wiki ou algum sistema do tipo feito em django.

Se pensarmos em zope, pensamos em plone. Se pensarmos em php logo vem wordpress, phpnuke, phpbb. Se pensamos em java temos o JavaBB, JavaFreeCms entre outros.

Mas porque não há nada parecido em django?

Uma das razões é porque é tão facil criar um wiki no django que ninguem vai querer um pronto.

Foi ai que decidi: vou criar um CMS feito em django e seu nome será bingo.

O bingo integrará Wiki, Blog, Galeria de fotos, feeds entre outras coisas.

O grande barato do bingo é que o foco dele não serão somente os djangers, e sim pessoas comuns que querem ter seu wiki ou seu blog ou páginapessoal, sem precisar mexer nos códigos.

Mas, quando anuncei o bingo! na lista de e-mails do django-brasil, muitos djangers se interessaram, e ainda mais, se alistaram para ajudar o projeto. E ainda mais o site da comunidade django-brasil usará o bingo!.

O bingo! ainda é um projeto em nascimento, mas já nasceu com o pé direito.

Está querendo ajudar? Está ancioso para utilizar?

Aguarde.....


django-planet aggregates posts from Django-related blogs. It is not affiliated with or endorsed by the Django Project.

Social Sharing

Feeds

Tag cloud

admin administration adsense advanced ajax amazon angular angularjs apache api app appengine app engine apple application security aprendiendo python architecture argentina articles asides audrey australia authentication automation backup bash basics best practices binary bitbucket blog blog action day blogging book books buildout business c++ cache capoeira celery celerycam celerycrawler challenges chat cheatsheet cherokee choices christianity class-based-views cliff clojure cloud cms code codeship codeship news coding command community computer computers computing configuration consumernotebook consumer-notebook continuous deployment continuous integration cookiecutter couchdb coverage css custom d data database databases db debian debugging deploy deployment deployment academy design developers development devops digitalocean django django1.7 django admin django cms djangocon django framework django-nose django-readonly-site django-rest-framework django-tagging django templates django-twisted-chat django web framework tutorials documentation dojango dojo dotcloud dreamhost dughh easy_install eclipse education elasticsearch email encoding english error europe eventbrite events expressjs extensions fabric facebook family fashiolista fedora field file filter fix flash flask foreman form forms frameworks friends fun functional reactive programming gae gallery games geek general gentoo gis git github gmail gnome google google app engine guides gunicorn hack hackathon hacking hamburg haskell heroku holidays hosting howto how-to howtos how-tos html http i18n image imaging indifex install installation intermediate internet ios iphone java javascript jinja2 jobs journalism jquery json justmigrated kde la latex linear regression linkedin linode linux login mac machine learning mac os x markdown math memcached meme mercurial meta meteor migration mirror misc model models mod_wsgi mongodb months mozilla multi-language mvc mysql nasa nelenschuurmans newforms news nginx nodejs nosql oauth ogólne openshift opensource open source open-source openstack operations orm osx os x ottawa paas packages packaging patterns pedantics pelican penetration test performance personal personal and misc philippines philosophy php pi pil pinax pip piston planet plone plugin pony postgis postgres postgresql ppoftw presentation private programmieren programming programming &amp; internet project projects pycharm pycon pycon-2013-guide pydiversity pygrunn pyladies pypi pypy pyramid python python3 queryset quick tips quora rabbitmq rails rant ratnadeep debnath reactjs recipe redis refactor release request resolutions rest reusable app review rhel rtnpro ruby ruby on rails scala scaling science screencast script scripting security server setup shell simple smiley snaking software software collections software development south sphinx sprint sql ssh ssl static storage supervisor support svn sysadmin tag tag cloud talk nerdy to me tastypie tdd techblog technical technology template templates template tags test testing tests tip tips tools tornado training transifex travel travel tips for geeks tumbles tutorial tutorials twisted twitter twoscoops typo3 ubuntu uncategorized unicode unittest unix use user authentication usergroup uwsgi uxebu validation virtualenv virtualenvwrapper web web 2.0 web application web applications web design &amp; development webdev web development webfaction web framework websockets whoosh windows wordpress work workshop wsgi yada znc zope