Election list deletion and ux improvements

This commit is contained in:
2017-12-01 19:45:28 +01:00
parent 23d86464c8
commit 625b5132c4
5 changed files with 70 additions and 5 deletions

View File

@ -128,6 +128,14 @@ class ElectionList(models.Model):
title = models.CharField(_('title'), max_length=255)
election = models.ForeignKey(Election, related_name='election_lists', verbose_name=_("election"))
def can_be_edited_by(self, user):
return user.can_edit(self.election)
def delete(self):
for candidature in self.candidatures.all():
candidature.delete()
super(ElectionList, self).delete()
def __str__(self):
return self.title

View File

@ -265,7 +265,12 @@ th {
<thead>
<th>{% trans %}Blank vote{% endtrans %}</th>
{%- for election_list in election_lists %}
<th>{{ election_list.title }}</th>
<th>
{{ election_list.title }}
{% if user.can_edit(election_list) and election.is_vote_editable -%}
- <a href="{{ url('election:delete_list', list_id=election_list.id) }}">{% trans %}Delete{% endtrans %}</a>
{% endif %}
</th>
{%- endfor %}
</thead>
{%- for role in election.roles.all() %}
@ -279,8 +284,9 @@ th {
<a href="{{url('election:update_role', role_id=role.id)}}">{% trans %}Edit{% endtrans %}</a>
<a href="{{url('election:delete_role', role_id=role.id)}}">{% trans %}Delete{% endtrans %}</a>
{%- endif -%}
<br><span>{{ role.description }}</span>
<br><span class='role__description'><p>{{ role.description }}</p></span>
{%- if role.max_choice > 1 and not election.has_voted(user) and election.can_vote(user) %}
<br>
<strong class="role__multiple-choices-label">{% trans %}You may choose up to{% endtrans %} {{ role.max_choice }} {% trans %}people.{% endtrans %}</strong>
{%- endif %}
{%- if election_form.errors[role.title] is defined %}
@ -319,9 +325,6 @@ th {
</div>
<figcaption class="candidate__details">
<cite class="candidate__full-name">{{ candidature.user.first_name }} <em class="candidate__nick-name">{{candidature.user.nick_name or ''}} </em>{{ candidature.user.last_name }}</cite>
{%- if not election.is_vote_finished %}
<q class="candidate__program">{{ candidature.program or '' }}</q>
{%- endif %}
{%- if user.can_edit(candidature) -%}
{% if election.is_vote_editable %}
<a href="{{url('election:update_candidate', candidature_id=candidature.id)}}">{% trans %}Edit{% endtrans %}</a>
@ -330,6 +333,9 @@ th {
<a href="{{url('election:delete_candidate', candidature_id=candidature.id)}}">{% trans %}Delete{% endtrans %}</a>
{%- endif -%}
{%- endif -%}
{%- if not election.is_vote_finished %}
<q class="candidate__program">{{ candidature.program | markdown or '' }}</q>
{%- endif %}
</figcaption>
</figure>
{%- if election.can_vote(user) %}
@ -382,6 +388,18 @@ th {
{% block script %}
{{ super() }}
<script src="{{ static('core/js/shorten.min.js') }}"></script>
<script type="text/javascript">
$('.role__description').shorten({
moreText: "{% trans %}Show more{% endtrans %}",
lessText: "{% trans %}Show less{% endtrans %}"
});
$('.candidate__program').shorten({
moreText: "{% trans %}Show more{% endtrans %}",
lessText: "{% trans %}Show less{% endtrans %}",
showChars: 200
});
</script>
<script type="text/javascript">
document.querySelectorAll('.role__multiple-choices').forEach(setupRestrictions);

View File

@ -9,6 +9,7 @@ urlpatterns = [
url(r'^(?P<election_id>[0-9]+)/edit$', ElectionUpdateView.as_view(), name='update'),
url(r'^(?P<election_id>[0-9]+)/delete$', ElectionDeleteView.as_view(), name='delete'),
url(r'^(?P<election_id>[0-9]+)/list/add$', ElectionListCreateView.as_view(), name='create_list'),
url(r'^(?P<list_id>[0-9]+)/list/delete$', ElectionListDeleteView.as_view(), name='delete_list'),
url(r'^(?P<election_id>[0-9]+)/role/create$', RoleCreateView.as_view(), name='create_role'),
url(r'^(?P<role_id>[0-9]+)/role/edit$', RoleUpdateView.as_view(), name='update_role'),
url(r'^(?P<role_id>[0-9]+)/role/delete$', RoleDeleteView.as_view(), name='delete_role'),

View File

@ -538,3 +538,19 @@ class RoleDeleteView(CanEditMixin, DeleteView):
def get_success_url(self, **kwargs):
return reverse_lazy('election:detail', kwargs={'election_id': self.election.id})
class ElectionListDeleteView(CanEditMixin, DeleteView):
model = ElectionList
template_name = 'core/delete_confirm.jinja'
pk_url_kwarg = 'list_id'
def dispatch(self, request, *args, **kwargs):
self.object = self.get_object()
self.election = self.object.election
if not self.election.is_vote_editable:
raise PermissionDenied
return super(ElectionListDeleteView, self).dispatch(request, *args, **kwargs)
def get_success_url(self, **kwargs):
return reverse_lazy('election:detail', kwargs={'election_id': self.election.id})