Commit 55706363 authored by Michal Čihař's avatar Michal Čihař

Add permission for changes CSV download

Fixes #817
Signed-off-by: default avatarMichal Čihař <michal@cihar.com>
parent 6824014b
...@@ -85,6 +85,8 @@ Can edit priority [Managers, Owners] ...@@ -85,6 +85,8 @@ Can edit priority [Managers, Owners]
Can adjust source string priority Can adjust source string priority
Can edit check flags [Managers, Owners] Can edit check flags [Managers, Owners]
Can adjust source string check flags Can adjust source string check flags
Can download changes [Managers, Owners]
Can download changes in a CSV format.
.. _acl: .. _acl:
......
...@@ -779,6 +779,7 @@ def create_groups(update): ...@@ -779,6 +779,7 @@ def create_groups(update):
Permission.objects.get(codename='edit_priority'), Permission.objects.get(codename='edit_priority'),
Permission.objects.get(codename='edit_flags'), Permission.objects.get(codename='edit_flags'),
Permission.objects.get(codename='manage_acl'), Permission.objects.get(codename='manage_acl'),
Permission.objects.get(codename='download_changes'),
) )
group, created = Group.objects.get_or_create(name='Managers') group, created = Group.objects.get_or_create(name='Managers')
......
{% extends "base.html" %} {% extends "base.html" %}
{% load i18n %} {% load i18n %}
{% load translations %} {% load translations %}
{% load permissions %}
{% block breadcrumbs %} {% block breadcrumbs %}
<li><a href="{% url 'changes' %}">{% trans "Changes" %}</a></li> <li><a href="{% url 'changes' %}">{% trans "Changes" %}</a></li>
...@@ -8,16 +9,22 @@ ...@@ -8,16 +9,22 @@
{% block content %} {% block content %}
{% can_download_changes user project as user_can_download_changes %}
{% if user_can_download_changes or changes_rss %}
<ul class="pagination pull-right flip"> <ul class="pagination pull-right flip">
{% if user_can_download_changes %}
<li> <li>
<a href="{% url 'changes-csv' %}?{{ query_string }}" title="{% trans "Download all changes as CSV" %}"><i class="fa fa-download"></i></a> <a href="{% url 'changes-csv' %}?{{ query_string }}" title="{% trans "Download all changes as CSV" %}"><i class="fa fa-download"></i></a>
</li> </li>
{% endif %}
{% if changes_rss %} {% if changes_rss %}
<li> <li>
<a href="{{ changes_rss }}" title="{% trans "Follow using RSS" %}"><i class="fa fa-rss"></i></a> <a href="{{ changes_rss }}" title="{% trans "Follow using RSS" %}"><i class="fa fa-rss"></i></a>
</li> </li>
{% endif %} {% endif %}
</ul> </ul>
{% endif %}
{% include "paginator.html" %} {% include "paginator.html" %}
......
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models, migrations
class Migration(migrations.Migration):
dependencies = [
('trans', '0044_auto_20150916_0952'),
]
operations = [
migrations.AlterModelOptions(
name='change',
options={'ordering': ['-timestamp'], 'permissions': (('download_changes', 'Can download changes'),)},
),
]
...@@ -239,6 +239,9 @@ class Change(models.Model): ...@@ -239,6 +239,9 @@ class Change(models.Model):
class Meta(object): class Meta(object):
ordering = ['-timestamp'] ordering = ['-timestamp']
app_label = 'trans' app_label = 'trans'
permissions = (
('download_changes', "Can download changes"),
)
def __unicode__(self): def __unicode__(self):
return _('%(action)s at %(time)s on %(translation)s by %(user)s') % { return _('%(action)s at %(time)s on %(translation)s by %(user)s') % {
......
...@@ -253,3 +253,11 @@ def can_manage_acl(user, project): ...@@ -253,3 +253,11 @@ def can_manage_acl(user, project):
Checks whether user can manage ACL on given project. Checks whether user can manage ACL on given project.
""" """
return check_permission(user, project, 'trans.manage_acl') return check_permission(user, project, 'trans.manage_acl')
@cache_permission
def can_download_changes(user, project):
"""
Checks whether user can download CSV for changes on given project.
"""
return check_permission(user, project, 'trans.download_changes')
...@@ -116,3 +116,8 @@ def can_delete_comment(user, project): ...@@ -116,3 +116,8 @@ def can_delete_comment(user, project):
@register.assignment_tag @register.assignment_tag
def can_manage_acl(user, project): def can_manage_acl(user, project):
return weblate.trans.permissions.can_manage_acl(user, project) return weblate.trans.permissions.can_manage_acl(user, project)
@register.assignment_tag
def can_download_changes(user, project):
return weblate.trans.permissions.can_download_changes(user, project)
...@@ -25,9 +25,12 @@ from django.contrib.auth.models import User ...@@ -25,9 +25,12 @@ from django.contrib.auth.models import User
from django.utils.translation import ugettext as _, activate from django.utils.translation import ugettext as _, activate
from django.core.urlresolvers import reverse from django.core.urlresolvers import reverse
from django.db.models import Q from django.db.models import Q
from django.core.exceptions import PermissionDenied
from weblate.trans.models.changes import Change from weblate.trans.models.changes import Change
from weblate.trans.views.helper import get_project_translation from weblate.trans.views.helper import get_project_translation
from weblate.lang.models import Language from weblate.lang.models import Language
from weblate.trans.permissions import can_download_changes
from urllib import urlencode from urllib import urlencode
import csv import csv
...@@ -55,6 +58,7 @@ class ChangesView(ListView): ...@@ -55,6 +58,7 @@ class ChangesView(ListView):
**kwargs **kwargs
) )
context['title'] = _('Changes') context['title'] = _('Changes')
context['project'] = self.project
url = {} url = {}
...@@ -205,6 +209,9 @@ class ChangesCSVView(ChangesView): ...@@ -205,6 +209,9 @@ class ChangesCSVView(ChangesView):
def get(self, request, *args, **kwargs): def get(self, request, *args, **kwargs):
object_list = self.get_queryset() object_list = self.get_queryset()
if not can_download_changes(request.user, self.project):
raise PermissionDenied()
# Always output in english # Always output in english
activate('en') activate('en')
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment