diff --git a/weblate/trans/forms.py b/weblate/trans/forms.py index d857e7c7e7c9772289c48034c0f03bc2c1964c61..f9680fa4524bc60df9dd35b44c9650fc9fb53c14 100644 --- a/weblate/trans/forms.py +++ b/weblate/trans/forms.py @@ -33,6 +33,9 @@ from weblate.lang.models import Language from weblate.trans.models.unit import Unit, SEARCH_FILTERS from weblate.trans.models.source import PRIORITY_CHOICES from weblate.trans.checks import CHECKS +from weblate.trans.permissions import ( + can_author_translation, can_overwrite_translation +) from weblate.trans.specialchars import get_special_chars from weblate.trans.validators import validate_check_flags from weblate.accounts.forms import sort_choices @@ -398,13 +401,13 @@ class ExtraUploadForm(UploadForm): ) -def get_upload_form(request): +def get_upload_form(user, project): ''' Returns correct upload form based on user permissions. ''' - if request.user.has_perm('trans.author_translation'): + if can_author_translation(user, project): return ExtraUploadForm - elif request.user.has_perm('trans.overwrite_translation'): + elif can_overwrite_translation(user, project): return UploadForm else: return SimpleUploadForm diff --git a/weblate/trans/permissions.py b/weblate/trans/permissions.py index 6077eb201e8a9bf9a7bb89034c342916b0f2d9b3..71eb8e2d72d41b85166092198dc188e1df4bbbba 100644 --- a/weblate/trans/permissions.py +++ b/weblate/trans/permissions.py @@ -281,3 +281,19 @@ def can_view_reports(user, project): Checks whether user can view reports on given project. """ return check_permission(user, project, 'trans.view_reports') + + +@cache_permission +def can_author_translation(user, project): + """ + Checks whether user can author translation on given project. + """ + return check_permission(user, project, 'trans.author_translation') + + +@cache_permission +def can_overwrite_translation(user, project): + """ + Checks whether user can overwrite translation on given project. + """ + return check_permission(user, project, 'trans.overwrite_translation') diff --git a/weblate/trans/views/basic.py b/weblate/trans/views/basic.py index 87fd1c8340c0e836e8448181354342b1dee40351..8f4b94f853c2e8ad12659d3005949505efb215c8 100644 --- a/weblate/trans/views/basic.py +++ b/weblate/trans/views/basic.py @@ -284,7 +284,7 @@ def show_translation(request, project, subproject, lang): obj.is_locked(request.user) # Get form - form = get_upload_form(request)() + form = get_upload_form(request.user, obj.subproject.project)() # Is user allowed to do automatic translation? if can_automatic_translation(request.user, obj.subproject.project): diff --git a/weblate/trans/views/files.py b/weblate/trans/views/files.py index 9edd755ace114c477828aa45ba47b048cfc5cdcf..16f34fcfed2d19619d0586416de1f2caad9761ce 100644 --- a/weblate/trans/views/files.py +++ b/weblate/trans/views/files.py @@ -30,6 +30,9 @@ import sys from weblate.trans.util import report_error from weblate.trans.forms import get_upload_form from weblate.trans.views.helper import get_translation +from weblate.trans.permissions import ( + can_author_translation, can_overwrite_translation +) def download_translation(request, project, subproject, lang): @@ -87,7 +90,9 @@ def upload_translation(request, project, subproject, lang): return redirect(obj) # Get correct form handler based on permissions - form = get_upload_form(request)(request.POST, request.FILES) + form = get_upload_form(request.user, obj.subproject.project)( + request.POST, request.FILES + ) # Check form validity if not form.is_valid(): @@ -96,7 +101,7 @@ def upload_translation(request, project, subproject, lang): # Create author name author = None - if (request.user.has_perm('trans.author_translation') and + if (can_author_translation(request.user, obj.subproject.project) and form.cleaned_data['author_name'] != '' and form.cleaned_data['author_email'] != ''): author = '%s <%s>' % ( @@ -106,7 +111,7 @@ def upload_translation(request, project, subproject, lang): # Check for overwriting overwrite = False - if request.user.has_perm('trans.overwrite_translation'): + if can_overwrite_translation(request.user, obj.subproject.project): overwrite = form.cleaned_data['overwrite'] # Do actual import