damned-lies r1247 - in trunk: . languages stats teams
- From: claudep svn gnome org
- To: svn-commits-list gnome org
- Subject: damned-lies r1247 - in trunk: . languages stats teams
- Date: Sat, 27 Dec 2008 19:50:17 +0000 (UTC)
Author: claudep
Date: Sat Dec 27 19:50:17 2008
New Revision: 1247
URL: http://svn.gnome.org/viewvc/damned-lies?rev=1247&view=rev
Log:
2008-12-27 Claude Paroz <claude 2xlibre net>
* languages/views.py: Add select_related to reduce db access.
* stats/models.py: Name related table unless 'language' is not fetched as
it is a null=True relation.
* teams/models.py: Add custom manager and add a method to fetch teams with
roles prefilled. This dramatically reduces db access.
* teams/views.py: Use new TeamManager function to fetch teams.
Modified:
trunk/ChangeLog
trunk/languages/views.py
trunk/stats/models.py
trunk/teams/models.py
trunk/teams/views.py
Modified: trunk/languages/views.py
==============================================================================
--- trunk/languages/views.py (original)
+++ trunk/languages/views.py Sat Dec 27 19:50:17 2008
@@ -32,7 +32,7 @@
from stats.models import Release
def languages(request):
- languages = Language.objects.all()
+ languages = Language.objects.select_related("team").all()
context = {
'pageSection': "languages",
'languages': utils.trans_sort_object_list(languages, 'name')
Modified: trunk/stats/models.py
==============================================================================
--- trunk/stats/models.py (original)
+++ trunk/stats/models.py Sat Dec 27 19:50:17 2008
@@ -212,10 +212,10 @@
def get_stats(self, typ):
""" Get statistics list of type typ ('ui' or 'doc'), in a dict of lists, key is domain.name (POT in 1st position)"""
stats = {}
- pot_stats = Statistics.objects.select_related(depth=1).filter(branch=self, language__isnull=True, domain__dtype=typ)
+ pot_stats = Statistics.objects.select_related("language", "domain", "branch").filter(branch=self, language__isnull=True, domain__dtype=typ)
for stat in pot_stats.all():
stats[stat.domain.name] = [stat,]
- tr_stats = Statistics.objects.select_related(depth=1).filter(branch=self, language__isnull=False, domain__dtype=typ)
+ tr_stats = Statistics.objects.select_related("language", "domain", "branch").filter(branch=self, language__isnull=False, domain__dtype=typ)
for stat in tr_stats.all():
stats[stat.domain.name].append(stat)
# Sort
Modified: trunk/teams/models.py
==============================================================================
--- trunk/teams/models.py (original)
+++ trunk/teams/models.py Sat Dec 27 19:50:17 2008
@@ -23,6 +23,24 @@
from django.utils.translation import ugettext as _
from people.models import Person
+class TeamManager(models.Manager):
+ def all_with_roles(self):
+ """ This method prefills team.coordinator/committers/reviewers/translators to reduce subsequent database access"""
+ teams = self.all()
+ roles = Role.objects.select_related("person").all()
+ role_dict = {}
+ for role in roles:
+ if not role_dict.has_key(role.team_id):
+ role_dict[role.team_id] = [role]
+ else:
+ role_dict[role.team_id].append(role)
+ for team in teams:
+ if role_dict.has_key(team.id):
+ for role in role_dict[team.id]:
+ team.fill_role(role.role, role.person)
+ return teams
+
+
class Team(Group):
"""The name of the team is stored in Group.name.
The lang_code is generally used."""
@@ -32,11 +50,16 @@
webpage_url = models.URLField(null=True, blank=True)
mailing_list = models.EmailField(null=True, blank=True)
mailing_list_subscribe = models.URLField(null=True, blank=True)
+ objects = TeamManager()
class Meta:
db_table = 'team'
ordering = ('description',)
+ def __init__(self, *args, **kwargs):
+ models.Model.__init__(self, *args, **kwargs)
+ self.roles = None
+
def __unicode__(self):
return self.description
@@ -44,6 +67,12 @@
def get_absolute_url(self):
return ('team_slug', [self.name])
+ def fill_role(self, role, person):
+ """ Used by TeamManager to prefill roles in team """
+ if not self.roles:
+ self.roles = {'coordinator':[], 'committer':[], 'reviewer':[], 'translator':[]}
+ self.roles[role].append(person)
+
def get_description(self):
return _(self.description)
@@ -51,13 +80,19 @@
return self.language_set.all()
def get_coordinator(self):
- # The join by role__team__id generates only one query and
- # the same one by role__team=self two queries!
- return Person.objects.get(role__team__id=self.id, role__role='coordinator')
+ try:
+ return self.roles['coordinator'][0]
+ except:
+ # The join by role__team__id generates only one query and
+ # the same one by role__team=self two queries!
+ return Person.objects.get(role__team__id=self.id, role__role='coordinator')
def get_members_by_role(self, role):
- members = Person.objects.filter(role__team__id=self.id, role__role=role)
- return members
+ try:
+ return self.roles[role]
+ except:
+ members = Person.objects.filter(role__team__id=self.id, role__role=role)
+ return members
def get_committers(self):
return self.get_members_by_role('committer')
Modified: trunk/teams/views.py
==============================================================================
--- trunk/teams/views.py (original)
+++ trunk/teams/views.py Sat Dec 27 19:50:17 2008
@@ -28,7 +28,7 @@
from languages.models import Language
def teams(request):
- teams = Team.objects.all()
+ teams = Team.objects.all_with_roles()
context = {
'pageSection': 'teams',
@@ -92,4 +92,4 @@
'mem_groups': mem_groups
}
return render_to_response('teams/team_detail.html', context, context_instance=RequestContext(request))
-
+
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]