From e8784c0d1b75bb66739267e5f05161d210b3e199 Mon Sep 17 00:00:00 2001 From: etienne Date: Thu, 3 Dec 2009 11:33:27 +0000 Subject: Refactoring of the code - Using newforms - Change from ReST to markdown --- polls/forms.py | 53 ++++++++++++++++++++++++++++-------- polls/models.py | 22 ++++++++++----- polls/views.py | 53 ++++++++++++++++++++++-------------- templates/create.html | 51 ++++++++--------------------------- templates/edit.html | 75 +++++++++++++++++++++++++++++++++++++++++++++++++++ urls.py | 2 +- 6 files changed, 177 insertions(+), 79 deletions(-) create mode 100644 templates/edit.html diff --git a/polls/forms.py b/polls/forms.py index bd6b9b3..518e38d 100644 --- a/polls/forms.py +++ b/polls/forms.py @@ -23,29 +23,60 @@ Forms management from django import forms from django.utils.translation import gettext_lazy as _ +from django.utils.html import escape +from django.utils.safestring import mark_safe +from django.forms.util import flatatt from papillon.polls.models import Poll, Category -class CreateForm(forms.Form): - author_name = forms.CharField(label=_("Author name"), max_length=100, - help_text=_("Name, firstname or nickname of the author")) +class PollForm(forms.ModelForm): name = forms.CharField(label=_("Poll name"), max_length=200, help_text=_("Global name to present the poll")) description = forms.CharField(label=_("Poll description"), max_length=200, help_text=_("Precise description of the poll"), widget=forms.widgets.Textarea()) - public = forms.BooleanField(label=_("Display the poll on main page"), - required=False, help_text=_("Check this option to make the poll \ -public")) - poll_type = forms.ChoiceField(label=_("Type of the poll"), choices=Poll.TYPE, - help_text=_("""Type of the poll: + +class CreatePollForm(PollForm): + class Meta: + model = Poll + exclude = ['base_url', 'admin_url', 'open', 'author', 'enddate', + 'public', 'opened_admin', 'hide_choices'] + if not Category.objects.all(): + exclude.append('category') + type = forms.ChoiceField(label=_("Type of the poll"), + choices=Poll.TYPE, help_text=_("""Type of the poll: - "Yes/No poll" is the appropriate type for a simple multi-choice poll - "Yes/No/Maybe poll" allows voters to stay undecided - "One choice poll" gives only one option to choose from """)) - -class CreateWithCatForm(CreateForm): - category = forms.ChoiceField(label="", help_text="Category of the poll", + """ + dated_choices = forms.BooleanField( + required=False, help_text=_("Check this option to choose between \ +dates"))""" + if Category.objects.all(): + category = forms.ChoiceField(label="", help_text="Category of the poll", choices=[(cat.id, cat.name) for cat in Category.objects.all()]) +class AdminPollForm(PollForm): + class Meta: + model = Poll + exclude = ['author', 'author_name', 'base_url', 'admin_url', + 'dated_choices', 'type'] + if not Category.objects.all(): + exclude.append('category') + open = forms.BooleanField(label=_("State of the poll"), + required=False, help_text=_("Uncheck this option to close the \ +poll/check the poll to reopen it")) + public = forms.BooleanField(label=_("Display the poll on main page"), + required=False, help_text=_("Check this option to make the poll \ +public")) + opened_admin = forms.BooleanField(label=_("Allow users to add choices"), + required=False, help_text=_("Check this option to open the poll to\ + new choices submitted by users")) + hide_choices = forms.BooleanField(label=_("Hide votes to new voters"), + required=False, help_text=_("Check this option to hide poll \ +results to new users")) + enddate = forms.DateField(label=_("Closing date"), +required=False, help_text=_("Closing date for participating to the poll")) + diff --git a/polls/models.py b/polls/models.py index 8f41cec..c05d6eb 100644 --- a/polls/models.py +++ b/polls/models.py @@ -41,21 +41,29 @@ class PollUser(models.Model): modification_date = models.DateTimeField(auto_now=True) class Poll(models.Model): + base_url = models.CharField(max_length=100, help_text=_('Copy this \ +address and send it to voters who want to participate to this poll')) + admin_url = models.CharField(max_length=100, help_text=_("Address to \ +modify the current poll")) + author_name = models.CharField(verbose_name=_("Author name"), + max_length=100, help_text=_("Name, firstname or nickname of the author")) + author = models.ForeignKey(PollUser, null=True, blank=True) name = models.CharField(max_length=200) description = models.CharField(max_length=1000) - author = models.ForeignKey(PollUser) category = models.ForeignKey(Category, null=True, blank=True) - enddate = models.DateTimeField(null=True, blank=True) - base_url = models.CharField(max_length=100) - admin_url = models.CharField(max_length=100) - modification_date = models.DateTimeField(auto_now=True) - public = models.BooleanField(default=False) - open = models.BooleanField(default=True) TYPE = (('P', _('Yes/No poll')), ('B', _('Yes/No/Maybe poll')), ('O', _('One choice poll')),) # ('M', _('Meeting')),) type = models.CharField(max_length=1, choices=TYPE) + dated_choices = models.BooleanField(verbose_name=_("Choices are dates"), + default=False, help_text=_("Check this option to choose between dates")) + enddate = models.DateTimeField(null=True, blank=True) + modification_date = models.DateTimeField(auto_now=True) + public = models.BooleanField(default=False) + opened_admin = models.BooleanField(default=False) + hide_choices = models.BooleanField(default=False) + open = models.BooleanField(default=True) def getTypeLabel(self): idx = [type[0] for type in self.TYPE].index(self.type) diff --git a/polls/views.py b/polls/views.py index 8e04b12..8f5b2c1 100644 --- a/polls/views.py +++ b/polls/views.py @@ -30,10 +30,10 @@ from django.utils.translation import gettext_lazy as _ from django.shortcuts import render_to_response from django.http import HttpResponseRedirect -from papillon.settings import LANGUAGES +from papillon.settings import LANGUAGES, BASE_SITE from papillon.polls.models import Poll, PollUser, Choice, Voter, Vote, \ Category, Comment -from papillon.polls.forms import CreateForm, CreateWithCatForm +from papillon.polls.forms import CreatePollForm, AdminPollForm def getBaseResponse(request): """Manage basic fields for the template @@ -88,34 +88,47 @@ def create(request): url += random_choice(chars) url += str(int(time.time())) return url - + response_dct, redirect = getBaseResponse(request) - base_form = CreateForm - if Category.objects.all().count(): - base_form = CreateWithCatForm if request.method == 'POST': - form = base_form(request.POST) + form = CreatePollForm(request.POST) if form.is_valid(): - author = PollUser(name=form.cleaned_data['author_name']) - author.save() - base_url = genRandomURL() - admin_url = genRandomURL() - category = None - if 'category' in form.cleaned_data: - category = form.cleaned_data['category'] - poll = Poll(name=form.cleaned_data['name'], -description=form.cleaned_data['description'], author=author, base_url=base_url, -admin_url=admin_url, type=form.cleaned_data['poll_type'], category=category, -public=form.cleaned_data['public']) + poll = form.save() + poll.admin_url = genRandomURL() + poll.base_url = genRandomURL() poll.save() return HttpResponseRedirect('http://%sedit/%s/' % ( - response_dct['root_url'], admin_url)) + response_dct['root_url'], poll.admin_url)) else: - form = base_form() + form = CreatePollForm() response_dct['form'] = form return render_to_response('create.html', response_dct) +def edit(request, admin_url): + '''Edition of a poll. + ''' + response_dct, redirect = getBaseResponse(request) + try: + poll = Poll.objects.filter(admin_url=admin_url)[0] + except IndexError: + # if the poll don't exist redirect to the creation page + url = response_dct['admin_url'] + return response_dct, HttpResponseRedirect(url) + Form = AdminPollForm + + if request.method == 'POST': + form = Form(request.POST, instance=poll) + if form.is_valid(): + poll = form.save() + return HttpResponseRedirect('http://%sedit/%s/' % ( + response_dct['root_url'], poll.admin_url)) + else: + form = Form(instance=poll) + response_dct['form'] = form + response_dct['poll'] = poll + return render_to_response('edit.html', response_dct) + def createOrEdit(request, admin_url): '''Creation or edition of a poll. admin_url is given to identify a particular poll diff --git a/templates/create.html b/templates/create.html index c9c2b95..0b779db 100644 --- a/templates/create.html +++ b/templates/create.html @@ -4,49 +4,20 @@ {% block content %}

{% trans "New poll" %}

-
+ - + {% for field in form %} + {% if field.is_hidden %} + {{field}} + {% else %} + - - - - - - - - - - - - - - - - - - -{% if form.category %} - - - - - - -{% endif %} - - - - - - - - - - - - + + + + {% endif %} + {% endfor %} diff --git a/templates/edit.html b/templates/edit.html new file mode 100644 index 0000000..9ddf138 --- /dev/null +++ b/templates/edit.html @@ -0,0 +1,75 @@ +{% extends "base.html" %} +{% load markup %} +{% load i18n %} + +{% block content %} + {% if not choices %} +

{% blocktrans %}As long as no options were added to the poll, +it will not be made available.{% endblocktrans %}

+ {% endif %} + +

{% trans "Edit poll" %}

+ +
{{form.author_name.errors}}
{{field.errors}}
{{form.author_name}}{{form.author_name.help_text}}
{{form.name.errors}}
{{form.name}}{{form.name.help_text}}
{{form.description.errors}}
{{form.description}}{{form.description.help_text}}
{{form.category.errors}}
{{form.category}}{{form.category.help_text}}
{{form.public.errors}}
{{form.public}}{{form.public.help_text}}
{{form.poll_type.errors}}
{{form.poll_type}}{{form.poll_type.help_text|markdown}}{{field.label_tag}}{{field}}{{field.help_text|markdown}}
+ + + + + + + + + + {% for field in form %} + {% if field.is_hidden %} + {{field}} + {% else %} + + + + + {% if field.help_text %}{%endif%} + + {% endif %} + {% endfor %} + + + + +
+http://{{root_url}}edit/{{poll.base_url}} + +{% trans "Copy this address and send it to voters who want to participate to this poll" %} +
+http://{{root_url}}poll/{{poll.admin_url}} + {% trans "Address to modify the current poll" %}
{{field.errors}}
{{field.label_tag}}{{field}}{{field.help_text|markdown}}
+
+ +

{% trans "Choices" %}

+{% if choices %}
+ + + + + {% for choice in choices %} + + {% endfor %} + + + + +
{% trans "Up/down" %}{% trans "Label" %}{% trans "Limit" %}{% trans "Delete?"%}
+ / -{% trans "Limited to"%} {% trans "vote(s)" %}
+
+
{% endif %} + +
+ + + + + + +
{%trans "Limited to"%} {%trans "vote(s)"%}{% trans "Setting a new choice. Optionally you can set a limit of vote for this choice. This limit is usefull for limited resources allocation." %}
+
+ +{% endblock %} diff --git a/urls.py b/urls.py index 1cec99e..dad8608 100644 --- a/urls.py +++ b/urls.py @@ -32,7 +32,7 @@ urlpatterns = patterns('', (r'^papillon/$', 'papillon.polls.views.index'), (r'^papillon/create$', 'papillon.polls.views.create'), (r'^papillon/edit/(?P\w+)/$', - 'papillon.polls.views.createOrEdit'), + 'papillon.polls.views.edit'), (r'^papillon/category/(?P\w+)/$', 'papillon.polls.views.category'), (r'^papillon/poll/(?P\w+)/$', 'papillon.polls.views.poll'), -- cgit v1.2.3