fix #10: Implement award deletion
This commit is contained in:
Родитель
32b3fe0b8c
Коммит
b085b870c9
|
@ -676,6 +676,17 @@ class Award(models.Model):
|
|||
# TODO: Need some logic here, someday.
|
||||
return True
|
||||
|
||||
def allows_delete_by(self, user):
|
||||
if user.is_anonymous():
|
||||
return False
|
||||
if user == self.user:
|
||||
return True
|
||||
if user == self.creator:
|
||||
return True
|
||||
if user.has_perm('badger.change_award'):
|
||||
return True
|
||||
return False
|
||||
|
||||
def save(self, *args, **kwargs):
|
||||
|
||||
# Signals and some bits of logic only happen on a new award.
|
||||
|
|
|
@ -0,0 +1,40 @@
|
|||
{% extends "badger/base.html" %}
|
||||
|
||||
{% set user = award.user %}
|
||||
{% set award_url = request.build_absolute_uri(url('badger.views.award_detail', award.badge.slug, award.id)) %}
|
||||
{% if award.image %}
|
||||
{% set image_url = award.image.url %}
|
||||
{% elif badge.image %}
|
||||
{% set image_url = badge.image.url %}
|
||||
{% else %}
|
||||
{# TODO: Put the URL for default badge image in settings #}
|
||||
{% set image_url = "/media/img/default-badge.png" %}
|
||||
{% endif %}
|
||||
|
||||
{% block pageid %}award_delete{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<header class="page-header">
|
||||
<h2>{{ _("Delete Award") }}</h2>
|
||||
</header>
|
||||
<section class="row-fluid">
|
||||
|
||||
<section class="badge span4">
|
||||
{% include "badger/includes/badge_full.html" %}
|
||||
</section>
|
||||
|
||||
<section class="award span8">
|
||||
|
||||
<form id="delete_award" method="POST" action="" enctype="multipart/form-data">
|
||||
{{ csrf() }}
|
||||
<p><strong>{{ _("Delete this award, are you sure?") }}</strong></p>
|
||||
<ul>
|
||||
<li><input type="submit" class="btn btn-large btn-danger submit" value="{{ _("Yes, delete award") }}"></li>
|
||||
</ul>
|
||||
</form>
|
||||
|
||||
{% include "badger/includes/award_full.html" %}
|
||||
</section>
|
||||
|
||||
</section>
|
||||
{% endblock %}
|
|
@ -24,6 +24,8 @@ urlpatterns = patterns('badger.views',
|
|||
name='badger.award_detail_json'),
|
||||
url(r'^badge/(?P<slug>[^/]+)/awards/(?P<id>[^/]+)/?$', 'award_detail',
|
||||
name='badger.award_detail'),
|
||||
url(r'^badge/(?P<slug>[^/]+)/awards/(?P<id>[^/]+)/delete$', 'award_delete',
|
||||
name='badger.award_delete'),
|
||||
url(r'^badge/(?P<slug>[^/]+)/claims/(?P<claim_group>.+)\.pdf$', 'claims_list',
|
||||
kwargs=dict(format='pdf'),
|
||||
name='badger.claims_list_pdf'),
|
||||
|
|
|
@ -284,6 +284,27 @@ def award_detail(request, slug, id, format="html"):
|
|||
), context_instance=RequestContext(request))
|
||||
|
||||
|
||||
@require_http_methods(['GET', 'POST'])
|
||||
@login_required
|
||||
def award_delete(request, slug, id):
|
||||
"""Delete an award"""
|
||||
badge = get_object_or_404(Badge, slug=slug)
|
||||
award = get_object_or_404(Award, badge=badge, pk=id)
|
||||
if not award.allows_delete_by(request.user):
|
||||
return HttpResponseForbidden('Award delete forbidden')
|
||||
|
||||
if request.method == "POST":
|
||||
messages.info(request, _('Award for badge "%s" deleted.') %
|
||||
badge.title)
|
||||
award.delete()
|
||||
url = reverse('badger.views.detail', kwargs=dict(slug=slug))
|
||||
return HttpResponseRedirect(url)
|
||||
|
||||
return render_to_response('badger/award_delete.html', dict(
|
||||
badge=badge, award=award
|
||||
), context_instance=RequestContext(request))
|
||||
|
||||
|
||||
@login_required
|
||||
def _do_claim(request, deferred_award):
|
||||
"""Perform claim of a deferred award"""
|
||||
|
|
Загрузка…
Ссылка в новой задаче