Commit 18b1ae85 authored by Michal Čihař's avatar Michal Čihař

Create mixin class for some standard URLS

Those are mostly required by Git status page and need to be accessed by
attribute ({% url %} can not be used as we need different kwargs every
time).
parent 7daf98d8
......@@ -18,6 +18,8 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
from django.core.urlresolvers import reverse
class PercentMixin(object):
'''
......@@ -47,3 +49,57 @@ class PercentMixin(object):
Returns percentage of failed checks.
'''
return self._get_percents()[2]
class URLMixin(object):
'''
Mixin providing standard shortcut API for few standard URLs
'''
def _reverse_url_name(self):
'''
Returns base name for URL reversing.
'''
raise NotImplemented
def _reverse_url_kwargs(self):
'''
Returns kwargs for URL reversing.
'''
raise NotImplemented
def reverse_url(self, name=None):
'''
Generic reverser for URL.
'''
if name is None:
urlname = self._reverse_url_name()
else:
urlname = '%s_%s' % (
name,
self._reverse_url_name()
)
return reverse(
urlname,
kwargs=self._reverse_url_kwargs()
)
def get_absolute_url(self):
return self.reverse_url()
def get_commit_url(self):
return self.reverse_url('commit')
def get_update_url(self):
return self.reverse_url('update')
def get_push_url(self):
return self.reverse_url('push')
def get_reset_url(self):
return self.reverse_url('reset')
def get_lock_url(self):
return self.reverse_url('lock')
def get_unlock_url(self):
return self.reverse_url('unlock')
......@@ -30,7 +30,7 @@ import os
import os.path
from lang.models import Language
from trans.validators import validate_commit_message
from trans.models.mixins import PercentMixin
from trans.models.mixins import PercentMixin, URLMixin
from trans.util import get_site_url
......@@ -72,7 +72,7 @@ class ProjectManager(models.Manager):
return self.filter(id__in=project_ids), True
class Project(models.Model, PercentMixin):
class Project(models.Model, PercentMixin, URLMixin):
name = models.CharField(max_length=100, unique=True)
slug = models.SlugField(db_index=True, unique=True)
web = models.URLField(
......@@ -190,11 +190,19 @@ class Project(models.Model, PercentMixin):
'or use different option for adding new language.'
))
@models.permalink
def get_absolute_url(self):
return ('project', (), {
def _reverse_url_name(self):
'''
Returns base name for URL reversing.
'''
return 'project'
def _reverse_url_kwargs(self):
'''
Returns kwargs for URL reversing.
'''
return {
'project': self.slug
})
}
def get_share_url(self):
'''
......@@ -204,30 +212,6 @@ class Project(models.Model, PercentMixin):
reverse('engage', kwargs={'project': self.slug})
)
@models.permalink
def get_commit_url(self):
return ('commit_project', (), {
'project': self.slug
})
@models.permalink
def get_update_url(self):
return ('update_project', (), {
'project': self.slug
})
@models.permalink
def get_push_url(self):
return ('push_project', (), {
'project': self.slug
})
@models.permalink
def get_reset_url(self):
return ('reset_project', (), {
'project': self.slug
})
def is_git_lockable(self):
return True
......@@ -236,18 +220,6 @@ class Project(models.Model, PercentMixin):
[subproject.locked for subproject in self.subproject_set.all()]
)
@models.permalink
def get_lock_url(self):
return ('lock_project', (), {
'project': self.slug
})
@models.permalink
def get_unlock_url(self):
return ('unlock_project', (), {
'project': self.slug
})
def get_path(self):
return os.path.join(appsettings.GIT_ROOT, self.slug)
......
......@@ -32,7 +32,7 @@ import weblate
import git
from trans.formats import FILE_FORMAT_CHOICES, FILE_FORMATS
from trans.models.project import Project
from trans.models.mixins import PercentMixin
from trans.models.mixins import PercentMixin, URLMixin
from trans.filelock import FileLock
from trans.util import is_repo_link
from trans.util import get_site_url
......@@ -60,7 +60,7 @@ class SubProjectManager(models.Manager):
return self.get(slug=subproject, project__slug=project)
class SubProject(models.Model, PercentMixin):
class SubProject(models.Model, PercentMixin, URLMixin):
name = models.CharField(
max_length=100,
help_text=ugettext_lazy('Name to display')
......@@ -180,12 +180,20 @@ class SubProject(models.Model, PercentMixin):
'''
self.project.check_acl(request)
@models.permalink
def get_absolute_url(self):
return ('subproject', (), {
def _reverse_url_name(self):
'''
Returns base name for URL reversing.
'''
return 'subproject'
def _reverse_url_kwargs(self):
'''
Returns kwargs for URL reversing.
'''
return {
'project': self.project.slug,
'subproject': self.slug
})
}
def get_share_url(self):
'''
......@@ -195,54 +203,12 @@ class SubProject(models.Model, PercentMixin):
reverse('engage', kwargs={'project': self.project.slug})
)
@models.permalink
def get_commit_url(self):
return ('commit_subproject', (), {
'project': self.project.slug,
'subproject': self.slug
})
@models.permalink
def get_update_url(self):
return ('update_subproject', (), {
'project': self.project.slug,
'subproject': self.slug
})
@models.permalink
def get_push_url(self):
return ('push_subproject', (), {
'project': self.project.slug,
'subproject': self.slug
})
@models.permalink
def get_reset_url(self):
return ('reset_subproject', (), {
'project': self.project.slug,
'subproject': self.slug
})
def is_git_lockable(self):
return True
def is_git_locked(self):
return self.locked
@models.permalink
def get_lock_url(self):
return ('lock_subproject', (), {
'project': self.project.slug,
'subproject': self.slug
})
@models.permalink
def get_unlock_url(self):
return ('unlock_subproject', (), {
'project': self.project.slug,
'subproject': self.slug
})
def __unicode__(self):
return '%s/%s' % (self.project.__unicode__(), self.name)
......
......@@ -40,6 +40,7 @@ from trans.checks import CHECKS
from trans.models.subproject import SubProject
from trans.models.project import Project
from trans.util import get_user_display, get_site_url, sleep_while_git_locked
from trans.models.mixins import URLMixin
class TranslationManager(models.Manager):
......@@ -114,7 +115,7 @@ class TranslationManager(models.Manager):
return tuple([round(value * 100.0 / total, 1) for value in result])
class Translation(models.Model):
class Translation(models.Model, URLMixin):
subproject = models.ForeignKey(SubProject)
language = models.ForeignKey(Language)
revision = models.CharField(max_length=100, default='', blank=True)
......@@ -312,13 +313,21 @@ class Translation(models.Model):
def get_non_translated(self):
return self.total - self.translated
@models.permalink
def get_absolute_url(self):
return ('translation', (), {
def _reverse_url_name(self):
'''
Returns base name for URL reversing.
'''
return 'translation'
def _reverse_url_kwargs(self):
'''
Returns kwargs for URL reversing.
'''
return {
'project': self.subproject.project.slug,
'subproject': self.subproject.slug,
'lang': self.language.code
})
}
def get_share_url(self):
'''
......@@ -334,57 +343,9 @@ class Translation(models.Model):
)
)
@models.permalink
def get_commit_url(self):
return ('commit_translation', (), {
'project': self.subproject.project.slug,
'subproject': self.subproject.slug,
'lang': self.language.code
})
@models.permalink
def get_update_url(self):
return ('update_translation', (), {
'project': self.subproject.project.slug,
'subproject': self.subproject.slug,
'lang': self.language.code
})
@models.permalink
def get_push_url(self):
return ('push_translation', (), {
'project': self.subproject.project.slug,
'subproject': self.subproject.slug,
'lang': self.language.code
})
@models.permalink
def get_reset_url(self):
return ('reset_translation', (), {
'project': self.subproject.project.slug,
'subproject': self.subproject.slug,
'lang': self.language.code
})
def is_git_lockable(self):
return False
@models.permalink
def get_lock_url(self):
return ('lock_translation', (), {
'project': self.subproject.project.slug,
'subproject': self.subproject.slug,
'lang': self.language.code
})
@models.permalink
def get_unlock_url(self):
return ('unlock_translation', (), {
'project': self.subproject.project.slug,
'subproject': self.subproject.slug,
'lang': self.language.code
})
@models.permalink
def get_download_url(self):
return ('download_translation', (), {
......
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