What's new in Django community blogs?

Ticket #3882 (closed: fixed)

Apr 03 2007 [Archived Version] □ Published at Pythonidae under tags  django newforms news

Já está disponível na versão de desenvolvimento do Django o localflavor BR.

Ticket: #3882
Changeset 4874 e 4908


django.contrib.localflavor.br

Apr 03 2007 [Archived Version] □ Published at Pythonidae under tags  django newforms

Primeira versão implementada, agora vem os teste.

"""
BR-specific Form helpers
"""

from django.newforms import ValidationError
from django.newforms.fields import Field, RegexField, Select, EMPTY_VALUES
from django.newforms.util import smart_unicode
from django.utils.translation import gettext
import re

phone_digits_re = re.compile(r'^(\d{2})[-\.]?(\d{4})[-\.]?(\d{4})$')

class BRZipCodeField(RegexField):
..def __init__(self, *args, **kwargs):
....super(BRZipCodeField, self).__init__(r'^\d{5}-\d{3}$',
....max_length=None, min_length=None,
....error_message=gettext(u'Enter a zip code in the format XXXXX-XXX.'),
....*args, **kwargs)

class BRPhoneNumberField(Field):
..def clean(self, value):
....super(BRPhoneNumberField, self).clean(value)
....if value in EMPTY_VALUES:
......return u''
....value = re.sub('(\(|\)|\s+)', '', smart_unicode(value))
....m = phone_digits_re.search(value)
....if m:
......return u'%s-%s-%s' % (m.group(1), m.group(2), m.group(3))
....raise ValidationError(u'Phone numbers must be in XX-XXXX-XXXX format.')

class BRStateSelect(Select):
.."""
..A Select widget that uses a list of brazilian states/territories
..as its choices.
.."""
..def __init__(self, attrs=None):
....from br_states import STATE_CHOICES # relative import
....super(BRStateSelect, self).__init__(attrs, choices=STATE_CHOICES)

Coisas pra resolver:

>>> from django.contrib.localflavor.br.forms import BRZipCodeField, BRPhoneNumberField, BRStateField, BRStateSelect
>>> from django import newforms as forms
>>> class BRForms(forms.Form):
... zipcode = BRZipCodeField()
... phone = BRPhoneNumberField()
... statef = BRStateField()
... statec = forms.ChoiceField(widget=BRStateSelect)
...
>>> brf = BRForms()
>>> print brf.as_table()
...
>>>>

O widget BRStateSelect ainda não é renderizado corretamente, isso acontece com os fields que tem Select como classe base. A solução que vem sendo adotada usa o método __init__, que nesse caso não fica elegante pois teríamos que importa STATE_CHOICES de br_states.py. Bom o tempo está apertado, tenho que ir, aqui tem um exemplo de como usar o __init__, a única diferença e que os dados vem da banco de dados.


Displaying High Resolution Images on the Web with Zoomifyer.

Mar 30 2007 [Archived Version] □ Published at stonemind consulting under tags  django lame intentions zoomify

I recently wrote an article, due to be published in this month's Information Technologies and Libraries (ITAL) journal, about a project I started a few years ago called Zoomify Image. Basically, Zoomifyer is a Flash based image viewer that allows you to quickly view high resolution images over the Web. And I mean really high resolution images--files Gigabytes in size. It can do this because of a second piece of software that pre-processes images on the server, splitting them into tiles at various scales that the Zoomifyer viewer can then asynchronously request as needed to render the image in the browser. Zoomify Image is written in Python and makes Zoomifyer available across platforms.


[email protected]: The syndication framework

Mar 30 2007 [Archived Version] □ Published at zerokspot.com

Welcome to the 2nd installment of my little series where I write about what I learnt today when trying to implement zerokspot.com using Django. This time it will be all about Django’s contributed syndication framework First of all: What is it? django.contrib.syndication is a framework consisting of a single view as well as a couple of helper classes and functions that allow developers to easily extend their websites with RSS and Atom feeds.


My Dreamhost + Django + Subversion Setup

Mar 29 2007 [Archived Version] □ Published at Ryan Kanno: The diary of an Enginerd in Hawaii under tags  development-setup django dreamhost fastcgi howto

Since I haven’t put out a technical article in a while, this blog will explain how I’ve setup Dreamhost + Django + Subversion to play nicely together in a seamless development environment via a shared hosting provider. Hopefully – someone, somewhere can find this information useful and insightful in their own development environment. The very […]


zerokspot+Django: contenttypes and permalinks

Mar 29 2007 [Archived Version] □ Published at zerokspot.com

As some kind of project for the next couple of months I’ve now started to work on a new implementation of zerokspot.com no longer using a pre-built CMS like WordPress or Drupal but trying to do it completely on my own using Django and several generic apps for it. While I’m not sure yet, if this system will really succeed the current Drupal site, it will at least do a couple of things for me:


Ajuste inteligente do settings.py

Mar 28 2007 [Archived Version] □ Published at Pythonidae under tags  django settings

Com essa dica, teremos dois arquivos de configuração que revezam entre versão de desenvolvimento e produção, o arquivo local_settings.py contém nossa configuração de desenvolvimento, assim não precisamos nos preocupar com settings.py na hora da distribuição, pois settings.py sabe quando deve dar passagem as configurações do arquivo local_settings.py.


Convertendo a documentação do Django em HTML

Mar 28 2007 [Archived Version] □ Published at Pythonidae under tags  django

A documentação do Django é escrita em formato reST (ReStructured Text). Então podemos gerar páginas HTML para uma leitura mais divertida, o script build_documentation.py é quem faz isso em djangoproject.com e pode fazer para você também, você só precisa criar um arquivo settings.py na mesma pasta do script contendo as variáveis DJANGO_DOCUMENT_ROOT_PATH e DJANGO_TESTS_PATH que indica onde estão seus arquivos reST e o diretório de testes do Django respectivamente .

Conteúdo de settings.py:
DJANGO_TESTS_PATH='/home/wiliam/dev/django/tests'
DJANGO_DOCUMENT_ROOT_PATH='/home/wiliam/dev/django/docs'

Dicas:
Rode o comando svn update antes para atualizar seu código.
Mantenha separados os arquivo .txt dos arquivos .html, crie uma pasta html dentro da pasta doc do Django e modifique build_documentation.py nas linhas 50 e 51 para fiquem com um + 'html' apos DJANGO_DOCUMENT_ROOT_PATH:

50 - out_file = os.path.join(settings.DJANGO_DOCUMENT_ROOT_PATH + 'html', os.path.splitext(fname)[0] + ".html")
51 - toc_file = os.path.join(settings.DJANGO_DOCUMENT_ROOT_PATH + 'html', os.path.splitext(fname)[0] + "_toc.html")


Django e o quebra cabeça com newforms

Mar 27 2007 [Archived Version] □ Published at Pythonidae under tags  django newforms

Basicamente temos duas formas para usar o newforms a primeira consiste em usar as funções form_for_model() e form_for_instance(), para a primeira função você deve passar a classe que define seu modelo e para segunda você passa a instância desta classe e o newforms encarrega-se de gerar o formulário para você. Na segunda forma você define seu formulário como uma classe que herda de Form. Considere a definição do modelo abaixo:

class Product(models.Model):
..description = models.CharField(maxlength=200)
..category = models.ForeignKey(Category)
..quantity = models.IntegerField()
..cost = models.FloatField(max_digits=10, decimal_places=2)
..detail = models.TextField(maxlength=400, blank=True)

Usando form_for_model:

>>> from django import newforms as form
>>> from warehouse.models import Product
>>> ProductForm = form.form_for_model(Product)
>>> pf = ProductForm()
>>> print pf.as_table() # retorna nosso formulário como tabela, em branco.

Usando form_for_instance:

>>> from django import newforms as form
>>> from warehouse.models import Product
>>> p = Product.objects.get(pk=1)
>>> ProductForm = form.form_for_instance(p)
>>> pf = ProductForm()
>>> pf.as_table() # retorna nosso formulário como tabela, com valores.

Acompanhe agora a segunda forma de uso do newforms. O método __init__ serve para carrega todas as categorias disponíveis no banco. Considere a definição do formulário abaixo:

class ProductForm(forms.Form):
..def __init__(self, *args, **kwargs):
....super(ProductForm, self).__init__(*args, **kwargs)
....self.fields['category'].choices = [('', '----------')] + [
.......(c.id, c.name) for c in Category.objects.all()]

..description = forms.CharField(max_length=200)
..detail = forms.CharField(max_length=400)
..category = forms.ChoiceField(choices=())
..quantity = forms.IntegerField()

Testando 123:

Mesmo conceito usado com form_for_model:
>>> from warehouse.forms import ProductForm
>>> pf = ProductForm()
>>> pf.as_table()# retorna nosso formulário como tabela, em branco.

Mesmo conceito usado com form_for_instance:
>>> p = Product.objects.get(pk=1)
>>> pf = ProductForm(p.__dict__)
>>> pf.as_table() # retorna nosso formulário como tabela, com valores.

Agora vamos usar nossa imaginação, imagine que o produto retornado por Product.objects.get(pk=1) faça parte do categoria "Keyboards", e que naturalmente essa opção deveria estar selecionada no campo category, infelizmente não é isso que acontece. Mas espere com form_for_model() e form_for_instance() funciona! Aqui está o código do newforms de uma olhada tente achar o erro:) Brincadeira! é uma boa leitura, eu li varias vezes. Essa falha acontece pela diferença entre o nome do campo category definido em nossa classe ProductForm e o dicionário retornado por p.__dict__ que retorna uma chave de nome category_id representando a categoria em vez de category, o que gera uma ValidationError.

>>> p.__dict__
{'description': 'Turtle', 'detail': 'ABNT2', 'cost': 46.73, 'category_id': 2, 'id': 1, 'quantity': 1}
>>>

Temos duas soluções, a primeira e renomear todos os campos foreignkey para uma nomenclatura nome + _id e a segunda foi passada pelo Daniel Vaz (sniper_cool) que consiste em passar a categoria que deve ser selecionada usando a propriedade initial.

>>> p = Product.objects.get(pk=1)
>>> pf.fields['category'].initial= p.id
>>> pf.as_table() # retorna nosso formulário como tabela, com valores corretos.

Qual das soluções escolher?
Isso vai depender de você. Qual você preferer?


Django permissões

Mar 26 2007 [Archived Version] □ Published at Pythonidae under tags  django

O Django tem um esquema de autenticação onde podemos definir diferentes permissões, todos os modelos definidos em models.py por padrão tem três add, change e delete. No exemplo abaixo temos um modelo Pessoa como um único campo nome e através do uso do atributo permissions da classe Meta definimos duas novas permissões dirrigir_carro e dirrigir_moto.

models.py:

class Pessoa(models.Model):
..nome = models.charField(maxlength=30)
..class Meta:
....permissions = (
......("dirigir_carro", "Pode dirigir caro"),
......("dirigir_moto", "Pode dirigir moto"),
......)

Quando definir novas permissões não esqueça de atualizar a base de dados usando o comando python manage.py syncdb. Podemos checar por permissões de duas maneiras diferentes, veja abaixo:

views.py:

def moto(request):
..if request.user.has_perm('empresa.dirigir_moto'):
....return HttpResponse("Você pode dirigir moto.")
..else:
....return HttpResponse("Tire sua carteira de moto antes")


@permission_required('empresa.dirigir_carro')
def carro(request):
..return HttpResponse("Voce pode dirigir carro.")

A função moto usa request.user.has_perm() para checar se o usuário tem permissão, a parte antes do .dirigir_moto é o nome da aplicação e não o nome da classe "Pessoa". Usando uma função como essa você pode redirecionar o usuário para uma página de mais erro explicativa.
A função carro usa o decorator @permission_required() para checar por permissão e em casso negativo redireciona para página de login normalmente /accounts/login/.


Evolving a RESTful Django Contribution

Mar 22 2007 [Archived Version] □ Published at stonemind consulting under tags  django rest talk nerdy to me

I posted an announcement to the django-users list about the django-restful-model-views contribution to get some feedback on the approach. The main responder, Malcolm Tredinnick, gave me a lot to think about and along with more research into how Ruby on Rails (RoR) implements REST, I have new ideas about how to improve the contribution.


Portuguese translation of Django in the trunk

Mar 21 2007 [Archived Version] □ Published at Nuno Mariz

The Portuguese(pt_PT) translation of Django is now in the trunk.
svn co http://code.djangoproject.com/svn/django/trunk/


Portuguese translation of Django

Mar 16 2007 [Archived Version] □ Published at Nuno Mariz

Django Project
I've submitted the Portuguese(pt_PT) translation of Django, meanwhile you can download the unofficial version in the downloads section.


Test Driving a RESTful Django Contribution

Mar 16 2007 [Archived Version] □ Published at stonemind consulting under tags  django python rest roa tagging

This time around, I will try to take the logical next step with my exploration of REST and Django, and begin creating a Django contribution to implement the ideas I have been working on and to do so in a way that fits with Django's philosophy.


Local settings in Django

Mar 15 2007 [Archived Version] □ Published at Occasionally sane under tags  django

We had a small problem with Django at work: my co-worker and I each use our own VMware machines to develop our Django applications. As such, we don’t have the same pathnames and/or database settings. We dealt with this situation … Continue reading


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 & 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 & development webdev web development webfaction web framework websockets whoosh windows wordpress work workshop wsgi yada znc zope