summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoretienne2009-12-03 11:33:27 +0000
committeretienne2009-12-03 11:33:27 +0000
commite8784c0d1b75bb66739267e5f05161d210b3e199 (patch)
treef3d1a77b08c5dcffd13665058d44142fdb38bc15
parent7789bff7cb978d475157e815a636f351c9955837 (diff)
Refactoring of the code - Using newforms - Change from ReST to markdown
-rw-r--r--polls/forms.py53
-rw-r--r--polls/models.py22
-rw-r--r--polls/views.py53
-rw-r--r--templates/create.html51
-rw-r--r--templates/edit.html75
-rw-r--r--urls.py2
6 files changed, 177 insertions, 79 deletions
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 %}
<h2>{% trans "New poll" %}</h2>
-<form action="http://{{root_url}}create" method="post">
+<form action="" method="post">
<table class='new_poll'>
- <tr><td colspan='3'>{{form.author_name.errors}}</td></tr>
+ {% for field in form %}
+ {% if field.is_hidden %}
+ {{field}}
+ {% else %}
+ <tr><td colspan='3'>{{field.errors}}</td></tr>
<tr>
- <td><label for='author_name'>{{form.author_name.label}}</label></td>
- <td>{{form.author_name}}</td>
- <td class='form_description'>{{form.author_name.help_text}}</td>
- </tr>
-
- <tr><td colspan='3'>{{form.name.errors}}</td></tr>
- <tr>
- <td><label for='name'>{{form.name.label}}</label></td>
- <td>{{form.name}}</td>
- <td class='form_description'>{{form.name.help_text}}</td>
- </tr>
-
- <tr><td colspan='3'>{{form.description.errors}}</td></tr>
- <tr>
- <td><label for='description'>{{form.description.label}}</label></td>
- <td>{{form.description}}</td>
- <td class='form_description'>{{form.description.help_text}}</td>
- </tr>
-{% if form.category %}
- <tr><td colspan='3'>{{form.category.errors}}</td></tr>
- <tr>
- <td><label for='category'>{{form.category.label}}</label></td>
- <td>{{form.category}}</td>
- <td class='form_description'>{{form.category.help_text}}</td>
- </tr>
-{% endif %}
- <tr><td colspan='3'>{{form.public.errors}}</td></tr>
- <tr>
- <td><label for='public'>{{form.public.label}}</label></td>
- <td>{{form.public}}</td>
- <td class='form_description'>{{form.public.help_text}}</td>
- </tr>
-
- <tr><td colspan='3'>{{form.poll_type.errors}}</td></tr>
- <tr>
- <td><label for='poll_type'>{{form.poll_type.label}}</label></td>
- <td>{{form.poll_type}}</td>
- <td class='form_description'>{{form.poll_type.help_text|markdown}}</td>
+ <td>{{field.label_tag}}</td>
+ <td>{{field}}</td>
+ <td class='form_description'>{{field.help_text|markdown}}</td>
</tr>
+ {% endif %}
+ {% endfor %}
<tr>
<td></td>
<td><input type='submit' value='{% trans "Create" %}' class='submit'/></td>
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 %}
+ <p class='error'>{% blocktrans %}As long as no options were added to the poll,
+it will not be made available.{% endblocktrans %}</p>
+ {% endif %}
+
+ <h2>{% trans "Edit poll" %}</h2>
+<form action="" method="post">
+<table class='new_poll'>
+ <tr>
+ <td><label>{% trans "Poll url" %}</label></td>
+ <td>
+<a href='http://{{root_url}}edit/{{poll.base_url}}'>http://{{root_url}}edit/{{poll.base_url}}</a>
+ </td>
+ <td class='form_description'>
+{% trans "Copy this address and send it to voters who want to participate to this poll" %}
+ </td>
+ </tr>
+ <tr>
+ <td><label>{% trans "Administration url" %}</label></td>
+ <td>
+<a href='http://{{root_url}}poll/{{poll.admin_url}}'>http://{{root_url}}poll/{{poll.admin_url}}</a>
+ <td class='form_description'>{% trans "Address to modify the current poll" %}</td>
+ </tr>
+ {% for field in form %}
+ {% if field.is_hidden %}
+ {{field}}
+ {% else %}
+ <tr><td colspan='3'>{{field.errors}}</td></tr>
+ <tr>
+ <td>{{field.label_tag}}</td>
+ <td>{{field}}</td>
+ {% if field.help_text %}<td class='form_description'>{{field.help_text|markdown}}</td>{%endif%}
+ </tr>
+ {% endif %}
+ {% endfor %}
+ <tr>
+ <td></td>
+ <td><input type='submit' value='{% trans "Edit" %}' class='submit'/></td>
+ </tr>
+</table>
+</form>
+
+<h2>{% trans "Choices" %}</h2>
+{% if choices %}<form action="{{admin_url}}" method="post">
+<table class='new_poll'>
+ <tr>
+ <th>{% trans "Up/down" %}</th><th>{% trans "Label" %}</th><th>{% trans "Limit" %}</th><th>{% trans "Delete?"%}</th>
+ </tr>
+ {% for choice in choices %}<tr>
+ <td><a href='?up_choice={{choice.id}}' class='arrow'>+</a> / <a href='?down_choice={{choice.id}}' class='arrow'>-</a></td><td><input type='text' name='modify_{{choice.id}}' value="{{choice.name}}"/></td><td>{% trans "Limited to"%} <input type='text' name='limit_{{choice.id}}' class='limit'{%if choice.limit%} value='{{choice.limit}}'{%endif%}/> {% trans "vote(s)" %}</td><td><input type='checkbox' name='delete_{{choice.id}}'/></td>
+ </tr>{% endfor %}
+ <tr>
+ <td></td>
+ <td><input type='hidden' name='edit' value='1'/>
+ <input type='submit' value='{% trans "Edit" %}' class='submit'/></td>
+ </tr>
+</table>
+</form>{% endif %}
+
+<form action="{{admin_url}}" method="post">
+<table class='new_poll'>
+ <tr><td><label>{% trans "New choice" %}</label></td><td><input type='text' name='new_choice'/></td><td>{%trans "Limited to"%} <input type='text' name='limit' class='limit'/> {%trans "vote(s)"%}</td><td class='form_description'>{% trans "Setting a new choice. Optionally you can set a limit of vote for this choice. This limit is usefull for limited resources allocation." %}</td></tr>
+ <tr>
+ <td></td>
+ <td><input type='hidden' name='add' value='1'/> <input type='submit' value='{% trans "Add" %}' class='submit'/></td>
+ </tr>
+</table>
+</form>
+
+{% 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<admin_url>\w+)/$',
- 'papillon.polls.views.createOrEdit'),
+ 'papillon.polls.views.edit'),
(r'^papillon/category/(?P<category_id>\w+)/$',
'papillon.polls.views.category'),
(r'^papillon/poll/(?P<poll_url>\w+)/$', 'papillon.polls.views.poll'),