diff options
-rw-r--r-- | polls/models.py | 2 | ||||
-rw-r--r-- | polls/views.py | 32 | ||||
-rw-r--r-- | static/styles.css | 22 | ||||
-rw-r--r-- | templates/createOrEdit.html | 29 | ||||
-rw-r--r-- | templates/vote.html | 31 |
5 files changed, 73 insertions, 43 deletions
diff --git a/polls/models.py b/polls/models.py index f4cf93a..7128e0d 100644 --- a/polls/models.py +++ b/polls/models.py @@ -90,4 +90,4 @@ class Vote(models.Model): VOTE = ((1, (_('Yes'), _('Yes'))), (0, (_('No'), _('Maybe')), ), (-1, (_('No'), _('No'))),) - value = models.IntegerField(choices=VOTE, blank=True) + value = models.IntegerField(choices=VOTE, blank=True, null=True) diff --git a/polls/views.py b/polls/views.py index 4c6499d..b81e393 100644 --- a/polls/views.py +++ b/polls/views.py @@ -202,9 +202,13 @@ public=public) Vote.objects.filter(choice=choice).delete() choice.delete() if key.startswith('modify_') and request.POST[key]: - choice = Choice.objects.get(id=int(key[len('modify_'):])) - choice.name = request.POST[key] - choice.save() + try: + choice = Choice.objects.get(id=int(key[len('modify_'):])) + choice.name = request.POST[key] + choice.save() + except Choice.DoesNotExist: + # throw when want to modify a deleted choice + pass return response_dct, None response_dct, redirect = getBaseResponse(request) @@ -394,7 +398,7 @@ def poll(request, poll_url): return HttpResponseRedirect(url) # a vote is submitted - if 'author_name' in request.POST: + if 'author_name' in request.POST and poll.open: if 'voter' in request.POST: # modification of an old vote modifyVote(request, choices) @@ -404,17 +408,14 @@ def poll(request, poll_url): poll.save() # 'voter' is in request.GET when the edit button is pushed - if 'voter' in request.GET: + if 'voter' in request.GET and poll.open: try: response_dct['current_voter_id'] = int(request.GET['voter']) except ValueError: pass response_dct.update({'poll_type_name':poll.getTypeLabel(), - 'poll_type':poll.type, - 'poll_name':poll.name, - 'poll_desc':poll.description, - 'poll_base_url':poll.base_url, + 'poll':poll, 'VOTE':Vote.VOTE,}) response_dct['base_url'] = "/".join(request.path.split('/')[:-2]) \ + '/%s/' % poll.base_url @@ -423,6 +424,8 @@ def poll(request, poll_url): voters = Voter.objects.filter(poll=poll) for choice in choices: choice.sum = 0 + max = -100 + max_ids = [] choice_ids = [choice.id for choice in choices] for voter in voters: # highlight a voter @@ -436,7 +439,13 @@ def poll(request, poll_url): for vote in voter.votes: if vote.choice.id in choice_ids: if vote.value: - choices[choice_ids.index(vote.choice.id)].sum += vote.value + c_id = choice_ids.index(vote.choice.id) + choices[c_id].sum += vote.value + if choices[c_id].sum > max: + max_ids = [c_id] + max = choices[c_id].sum + elif choices[c_id].sum == max: + max_ids.append(c_id) else: # the choice is probably not available anymore voter.votes.remove(vote) @@ -449,7 +458,8 @@ def poll(request, poll_url): vote.save() idx = choices.index(choice) voter.votes.insert(idx, vote) - + for max_id in max_ids: + choices[max_id].highlight = True # set non-available choices if the limit is reached for a choice response_dct['limit_set'] = None for choice in choices: diff --git a/static/styles.css b/static/styles.css index 0d44f63..e95cd1e 100644 --- a/static/styles.css +++ b/static/styles.css @@ -138,20 +138,24 @@ color:grey; text-decoration:none; } -.error{ -color:red; +.alert{ +color:blue; } -#new_poll input{ -width:100px; +.new_poll{ +width:600px; +} + +.new_poll input{ +width:160px; } -#new_poll input#limit{ +.new_poll input#limit{ width:20px; } -#new_poll textarea{ -width:130px; +.new_poll textarea{ +width:160px; height:100px; } @@ -221,7 +225,11 @@ text-align:center; #sum td{ border:None; +} + +.highlight{ font-weight:bold; +background-color:#ced3e1; } tr.highlighted_voter td{ diff --git a/templates/createOrEdit.html b/templates/createOrEdit.html index 417f7b7..3e88bfe 100644 --- a/templates/createOrEdit.html +++ b/templates/createOrEdit.html @@ -7,7 +7,7 @@ {% endif %} <h2>{% if new %}{% trans "New poll" %}{% else %}{% trans "Edit poll" %}{% endif %}</h2> {% if error %}<p class='error'>{{ error }}</p>{% endif %} -<table id='new_poll'> +<table class='new_poll'> <form action="{{admin_url}}" method="post"> {% if not new %}<tr> @@ -88,14 +88,6 @@ </td> </tr> - {% if choices %}<tr> - <th>{% trans "Choices" %}</th><th>{% trans "Label" %}</th><th>{% trans "Limit" %}</th><th>{% trans "Delete?"%}</th> - </tr> - {% for choice in choices %}<tr> - <td> </td><td><input type='text' name='modify_{{choice.id}}' value="{{choice.name}}"/></td><td>{%if choice.limit%}{% blocktrans with choice.limit as choice_limit%}Limited to {{choice_limit}} vote(s){% endblocktrans %}{%endif%}</td><td><input type='checkbox' name='delete_{{choice.id}}'/></td> - </tr> - {% endfor %}{% endif %} - <tr> <td></td> <td>{% if new %}<input type='hidden' name='new' value='1'/> @@ -106,9 +98,24 @@ </tr> </form> -{% if new %} </table> -{% else %} +{% if not new %} +<h2>{% trans "Choices" %}</h2> +<table class='new_poll'> + {% if choices %}<form action="{{admin_url}}" method="post"> + <tr> + <th>{% trans "Choices" %}</th><th>{% trans "Label" %}</th><th>{% trans "Limit" %}</th><th>{% trans "Delete?"%}</th> + </tr> + {% for choice in choices %}<tr> + <td> </td><td><input type='text' name='modify_{{choice.id}}' value="{{choice.name}}"/></td><td>{%if choice.limit%}{% blocktrans with choice.limit as choice_limit%}Limited to {{choice_limit}} vote(s){% endblocktrans %}{%endif%}</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" %}' /></td> + </tr> + </form>{% endif %} + <form action="{{admin_url}}" method="post"> <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' id='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> diff --git a/templates/vote.html b/templates/vote.html index e000bc9..803813e 100644 --- a/templates/vote.html +++ b/templates/vote.html @@ -2,9 +2,10 @@ {% load i18n %} {% block content %} - <h2>{{poll_type_name}} - {{poll_name}}</h2> -{% if error %}<p class='error'>{{ error }}</p>{% endif %} - <p>{{poll_desc}}</p> + <h2>{{poll_type_name}} - {{poll.name}}</h2> +{% if error %}<p class='alert'>{{ error }}</p>{% endif %} +{% if not poll.open %}<p class='alert'>{% trans "The current poll is closed."%}</p>{% endif %} + <p>{{ poll.description }}</p> <form method='post' action='{{base_url}}'> <div id='poll_table'> <table id='poll'> @@ -20,13 +21,13 @@ <td><input type='text' name='author_name' value='{{voter.user.name}}'/></td> {% for vote in voter.votes %}<td> {% if vote.choice.available or vote.value %} - {% ifequal poll_type 'P' %} + {% ifequal poll.type 'P' %} <input type='checkbox' name='vote_{{vote.id}}'{%ifequal vote.value 1%} checked='checked'{%endifequal%}/> {% endifequal %} - {% ifequal poll_type 'O' %} + {% ifequal poll.type 'O' %} <input type='radio' name='vote' value='{{vote.id}}' {%ifequal vote.value 1%} checked='checked'{%endifequal%}/> {% endifequal %} - {% ifequal poll_type 'B' %} + {% ifequal poll.type 'B' %} <select name='vote_{{vote.id}}'> {% for vote_choice in VOTE %} <option value='{{vote_choice.0}}'{%ifequal vote.value vote_choice.0%} selected='selected'{%endifequal%}>{{vote_choice.1.1}}</option> @@ -37,10 +38,10 @@ {% trans "Limit reached" %} {% endif %} </td>{%endfor%} - {%else%}<td class='simple'><a href='?voter={{voter.id}}'>{% trans "Edit" %}</a></td> + {%else%}<td class='simple'>{% if poll.open %}<a href='?voter={{voter.id}}'>{% trans "Edit" %}</a>{%else%} {%endif%}</td> <td>{{voter.user.name}}</td> {% for vote in voter.votes %}<td class='{%ifequal vote.value 1%}OK{%else%}{%ifequal vote.value 0%}OKO{%else%}KO{%endifequal%}{%endifequal%}'> - {%ifequal poll_type 'B'%} + {%ifequal poll.type 'B'%} {%for VOT in VOTE%} {%ifequal VOT.0 vote.value%}{{VOT.1.1}}{%endifequal%}{%endfor%} {%else%} @@ -52,16 +53,17 @@ {%endifequal%} </tr>{%endfor%} {%if not current_voter_id%} + {% if poll.open %} <tr> <td class='simple'></td> <td><input type='text' name='author_name'/></td> {%for choice in choices%}<td> {% if choice.available %} - {% ifequal poll_type 'P' %} + {% ifequal poll.type 'P' %} <input type='checkbox' name='choice_{{choice.id}}'/>{% endifequal %} - {% ifequal poll_type 'O' %} + {% ifequal poll.type 'O' %} <input type='radio' name='choice' value='{{choice.id}}'/>{% endifequal %} - {% ifequal poll_type 'B' %} + {% ifequal poll.type 'B' %} <select name='choice_{{choice.id}}'>{% for vote_choice in VOTE %} <option value='{{vote_choice.0}}'{%ifequal vote_choice.0 0%} selected='selected'{%endifequal%}>{{vote_choice.1.1}}</option>{% endfor %} </select> @@ -72,17 +74,20 @@ </td>{%endfor%} </tr> {%endif%} + {%endif%} <tr id='sum'> <td class='simple'></td><th>{% trans "Sum" %}</th> - {% for choice in choices %}<td>{{choice.sum}}</td> + {% for choice in choices %}<td{%if choice.highlight %} class='highlight'{%endif%}>{{choice.sum}}</td> {% endfor %} </tr> </table> + {% if poll.open %} <input type='submit' value='{%if current_voter_id%}{% trans "Edit" %}{%else%}{% trans "Participate" %}{%endif%}'/> + {% endif %} </div> <hr class='spacer'/> </form> <div id='syndication'> - {% trans "Remain informed of poll evolution:" %} <a href="/papillon/feeds/poll/{{poll_base_url}}/">{%trans "Syndication"%}</a> + {% trans "Remain informed of poll evolution:" %} <a href="/papillon/feeds/poll/{{poll.base_url}}/">{%trans "Syndication"%}</a> </div> {% endblock %} |