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