damned-lies r1247 - in trunk: . languages stats teams



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]