diff options
| -rw-r--r-- | polls/forms.py | 53 | ||||
| -rw-r--r-- | polls/models.py | 22 | ||||
| -rw-r--r-- | polls/views.py | 53 | ||||
| -rw-r--r-- | templates/create.html | 51 | ||||
| -rw-r--r-- | templates/edit.html | 75 | ||||
| -rw-r--r-- | urls.py | 2 | 
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 %} @@ -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'), | 
