savannah-cvs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Savannah-cvs] [SCM] Savane-cleanup framework branch, master, updated. 8


From: Sylvain Beucler
Subject: [Savannah-cvs] [SCM] Savane-cleanup framework branch, master, updated. 8a11e3b65eb89b50ce86c9cb3a2fad96620d6656
Date: Sat, 01 Aug 2009 09:03:24 +0000

This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "Savane-cleanup framework".

The branch, master has been updated
       via  8a11e3b65eb89b50ce86c9cb3a2fad96620d6656 (commit)
       via  9d7936f9965e9e098213c350e84b1ebd39d494e3 (commit)
       via  4d8a4bd4db79ce42ba41f571a488238f68faa281 (commit)
       via  6f77d082aee87749ae9808e206fd79da84c04a36 (commit)
       via  48366da6a231edfa2614798ad6f45e3b20a2ceae (commit)
      from  0029af0725984195f888e264332fe6d875b5c193 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
http://git.savannah.gnu.org/cgit/savane-cleanup/framework.git/commit/?id=8a11e3b65eb89b50ce86c9cb3a2fad96620d6656

commit 8a11e3b65eb89b50ce86c9cb3a2fad96620d6656
Author: Sylvain Beucler <address@hidden>
Date:   Sat Aug 1 11:02:54 2009 +0200

    Reference interesting python+ldap URLs

diff --git a/doc/LDAP b/doc/LDAP
new file mode 100644
index 0000000..32a2005
--- /dev/null
+++ b/doc/LDAP
@@ -0,0 +1,4 @@
+Backend:
+http://code.djangoproject.com/ticket/11526
+Synchro:
+http://www.djangosnippets.org/snippets/893/

http://git.savannah.gnu.org/cgit/savane-cleanup/framework.git/commit/?id=9d7936f9965e9e098213c350e84b1ebd39d494e3

commit 9d7936f9965e9e098213c350e84b1ebd39d494e3
Author: Sylvain Beucler <address@hidden>
Date:   Sat Aug 1 11:02:21 2009 +0200

    Mention convenient IPython trick: auto-import django models

diff --git a/doc/HACKING b/doc/HACKING
new file mode 100644
index 0000000..b2bb483
--- /dev/null
+++ b/doc/HACKING
@@ -0,0 +1,8 @@
+Debugging
+=========
+
+To autoload Django models when running './manage.py shell', check:
+http://www.djangosnippets.org/snippets/549/
+
+This requires IPython, which adds completion and other niceties to the
+Python shell.

http://git.savannah.gnu.org/cgit/savane-cleanup/framework.git/commit/?id=4d8a4bd4db79ce42ba41f571a488238f68faa281

commit 4d8a4bd4db79ce42ba41f571a488238f68faa281
Author: Sylvain Beucler <address@hidden>
Date:   Sat Aug 1 11:01:51 2009 +0200

    Display user's real name to check for UTF-8 issues (none to report)

diff --git a/template/svmain/extendeduser_detail.html 
b/template/svmain/extendeduser_detail.html
index f1fbad5..ca02608 100644
--- a/template/svmain/extendeduser_detail.html
+++ b/template/svmain/extendeduser_detail.html
@@ -2,7 +2,8 @@
 
 {% block content %}
 
-<p>Name: {{object.username}}</p>
+<p>Name: {{object.username}}<br />
+Real name: {{object.first_name}} {{object.last_name}}</p>
 
 <p>Is a member of (using Django user.groups):</p>
 

http://git.savannah.gnu.org/cgit/savane-cleanup/framework.git/commit/?id=6f77d082aee87749ae9808e206fd79da84c04a36

commit 6f77d082aee87749ae9808e206fd79da84c04a36
Author: Sylvain Beucler <address@hidden>
Date:   Sat Aug 1 11:01:19 2009 +0200

    Leverage on new Django 1.1 to implement efficient license->groups query

diff --git a/INSTALL b/INSTALL
index aaf7c6d..08f2e66 100644
--- a/INSTALL
+++ b/INSTALL
@@ -9,7 +9,11 @@
 
 * Dependencies as Debian packages
 
-apt-get install mysql-server python-django python-mysqldb
+- Django >= 1.1
+- MySQLdb (mysql-python)
+- MySQL
+
+apt-get install python-django python-mysqldb mysql-server
 
 
 * Install process
diff --git a/src/savane/svmain/models.py b/src/savane/svmain/models.py
index 18fd7a4..a733c90 100644
--- a/src/savane/svmain/models.py
+++ b/src/savane/svmain/models.py
@@ -136,6 +136,14 @@ class License(models.Model):
     name = models.CharField(max_length=255)
     url = models.CharField(max_length=255, blank=True)
 
+    def get_group_names(self):
+        """
+        Return a list of groups with only the 'name' attribute
+        retrieved for efficiency (retrieving all informations, namely
+        long_description, is quite long).  Used by the license template.
+        """
+        return self.extendedgroup_set.only("name")
+
     def __unicode__(self):
         return self.slug + ": " + self.name
 
diff --git a/template/svmain/license_detail.html 
b/template/svmain/license_detail.html
index 6ff59b4..1a839eb 100644
--- a/template/svmain/license_detail.html
+++ b/template/svmain/license_detail.html
@@ -13,7 +13,7 @@ URL: <a href="{{object.license.url}}">{{object.url}}</a><br />
 
 {{ object.extendedgroup_set.count }} project(s) use this license<br />
 
-{% for eg in object.extendedgroup_set.all %}
+{% for eg in object.get_group_names %}
 <a href="{{eg.get_absolute_url}}">{{eg.name}}</a>{% if forloop.last 
%}{%else%},{% endif %}
 {% endfor %}
 

http://git.savannah.gnu.org/cgit/savane-cleanup/framework.git/commit/?id=48366da6a231edfa2614798ad6f45e3b20a2ceae

commit 48366da6a231edfa2614798ad6f45e3b20a2ceae
Author: Sylvain Beucler <address@hidden>
Date:   Sat Aug 1 11:00:18 2009 +0200

    Add debug footer with SQL stats

diff --git a/src/savane/middleware/__init__.py 
b/src/savane/middleware/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/src/savane/middleware/debug.py b/src/savane/middleware/debug.py
new file mode 100644
index 0000000..1c3dcdb
--- /dev/null
+++ b/src/savane/middleware/debug.py
@@ -0,0 +1,175 @@
+# http://www.djangosnippets.org/snippets/766/
+# http://www.djangosnippets.org/snippets/1033/
+# Author: simon (May 21, 2008)
+# Author: crucialfelix (September 7, 2008)
+# Copyright (C) 2009  Sylvain Beucler
+# 
+# I hate legal-speak as much as anybody, but on a site which is geared
+# toward sharing code there has to be at least a little bit of it, so
+# here goes:
+# 
+# By creating an account here you agree to three things:
+# 
+#   1. That you will only post code which you wrote yourself and that
+#   you have the legal right to release under these terms.
+# 
+#   2. That you grant any third party who sees the code you post a
+#   royalty-free, non-exclusive license to copy and distribute that
+#   code and to make and distribute derivative works based on that
+#   code. You may include license terms in snippets you post, if you
+#   wish to use a particular license (such as the BSD license or GNU
+#   GPL), but that license must permit royalty-free copying,
+#   distribution and modification of the code to which it is applied.
+# 
+#   3. That if you post code of which you are not the author or for
+#   which you do not have the legal right to distribute according to
+#   these terms, you will indemnify and hold harmless the operators of
+#   this site and any third parties who are exposed to liability as a
+#   result of your actions.
+#
+# If you can't legally agree to these terms, or don't want to, you
+# cannot create an account here.
+
+import time
+from django.dispatch import dispatcher
+from django.core.signals import request_started
+from django.test.signals import template_rendered
+from django.conf import settings
+from django.db import connection
+from django.utils.encoding import force_unicode
+from django.utils.safestring import mark_safe
+
+TEMPLATE = """
+<div id="debug" style="clear:both;">
+<a href="#debugbox"
+    onclick="this.style.display = 'none';
+        document.getElementById('debugbox').style.display = 'block';
+        return false;"
+    style="font-size: small; color: red; text-decoration: none; display: 
block; margin: 12px;"
+>+</a>
+
+<div style="display: none;clear: both; border: 1px solid red; padding: 12px; 
margin: 12px; overflow: scroll" id="debugbox">
+
+<p>Server-time taken: {{ server_time|floatformat:"5" }} seconds</p>
+<p>View: <strong>{{view}}</strong></p>
+<p>Templates used:</p>
+{% if templates %}
+<ol>
+    {% for template in templates %}
+        <li><strong>{{ template.0 }}</strong> loaded from <samp>{{ template.1 
}}</samp></li>
+    {% endfor %}
+</ol>
+{% else %}
+    None
+{% endif %}
+<p>Template path:</p>
+{% if template_dirs %}
+    <ol>
+    {% for template in template_dirs %}
+        <li>{{ template }}</li>
+    {% endfor %}
+    </ol>
+{% else %}
+    None
+{% endif %}
+<p>SQL executed:</p>
+{% if sql %}
+<ol>
+{% for query in sql %}
+    <li><pre>{{ query.sql|linebreaksbr }}</pre><p>took {{ 
query.time|floatformat:"3" }} seconds</p></li>
+{% endfor %}
+</ol>
+<p>Total SQL time: {{ sql_total }}</p>
+{% else %}
+    None
+{% endif %}
+</div>
+</div>
+</body>
+"""
+
+# Monkeypatch instrumented test renderer from django.test.utils - we could use
+# django.test.utils.setup_test_environment for this but that would also set up
+# e-mail interception, which we don't want
+from django.test.utils import instrumented_test_render
+from django.template import Template, Context
+if Template.render != instrumented_test_render:
+    Template.original_render = Template.render
+    Template.render = instrumented_test_render
+# MONSTER monkey-patch
+old_template_init = Template.__init__
+def new_template_init(self, template_string, origin=None, name='<Unknown 
Template>'):
+    old_template_init(self, template_string, origin, name)
+    self.origin = origin
+Template.__init__ = new_template_init
+
+class DebugFooter:
+    def process_request(self, request):
+        self.time_started = time.time()
+        self.templates_used = []
+        self.contexts_used = []
+        self.sql_offset_start = len(connection.queries)
+        template_rendered.connect(self._storeRenderedTemplates)
+
+    def process_response(self, request, response):
+        # Only include debug info for text/html pages not accessed via Ajax
+        if 'text/html' not in response['Content-Type']:
+            return response
+        if request.is_ajax():
+            return response
+        if not settings.DEBUG:
+            return response
+        if response.status_code != 200:
+            return response
+
+        templates = [
+            (t.name, t.origin and t.origin.name or 'No origin')
+            for t in self.templates_used
+        ]
+
+        sql_queries = connection.queries[self.sql_offset_start:]
+        # Reformat sql queries a bit
+        sql_total = 0.0
+        for query in sql_queries:
+            query['sql'] = reformat_sql(query['sql'])
+            sql_total += float(query['time'])
+
+        from django.core.urlresolvers import resolve
+        view_func, args, kwargs = resolve(request.META['PATH_INFO'])
+
+        if hasattr(view_func,'view_func'):
+            # it the view_func has a view_func then its a decorator
+            co = view_func.view_func.func_code
+        else:
+            co = view_func.func_code
+            
+        view =  '%s.%s' % (view_func.__module__, view_func.__name__)
+        debug_content = Template(TEMPLATE).render(Context({
+            'server_time': time.time() - self.time_started,
+            'templates': templates,
+            'sql': sql_queries,
+            'sql_total': sql_total,
+            'template_dirs': settings.TEMPLATE_DIRS,
+            'view': view
+        }))
+
+        content = response.content
+        response.content = force_unicode(content).replace('</body>', 
debug_content)
+
+        return response
+
+    def _storeRenderedTemplates(self, **kwargs):
+        #signal=signal, sender=sender, template=template, context=context):
+        template = kwargs.get('template')
+        if(template):
+            self.templates_used.append(template)
+        context = kwargs.get('context')
+        if(context):
+            self.contexts_used.append(context)
+
+def reformat_sql(sql):
+    sql = sql.replace('`,`', '`, `')
+    sql = sql.replace('` FROM `', '` \n  FROM `')
+    sql = sql.replace('` WHERE ', '` \n  WHERE ')
+    sql = sql.replace(' ORDER BY ', ' \n  ORDER BY ')
+    return sql
diff --git a/src/settings.py b/src/settings.py
index f67bc57..3d8c010 100644
--- a/src/settings.py
+++ b/src/settings.py
@@ -56,6 +56,7 @@ MIDDLEWARE_CLASSES = (
     'django.middleware.common.CommonMiddleware',
     'django.contrib.sessions.middleware.SessionMiddleware',
     'django.contrib.auth.middleware.AuthenticationMiddleware',
+    'savane.middleware.debug.DebugFooter',
 )
 
 ROOT_URLCONF = 'urls'

-----------------------------------------------------------------------

Summary of changes:
 INSTALL                                  |    6 +-
 doc/HACKING                              |    8 ++
 doc/LDAP                                 |    4 +
 src/{ => savane/middleware}/__init__.py  |    0
 src/savane/middleware/debug.py           |  175 ++++++++++++++++++++++++++++++
 src/savane/svmain/models.py              |    8 ++
 src/settings.py                          |    1 +
 template/svmain/extendeduser_detail.html |    3 +-
 template/svmain/license_detail.html      |    2 +-
 9 files changed, 204 insertions(+), 3 deletions(-)
 create mode 100644 doc/HACKING
 create mode 100644 doc/LDAP
 copy src/{ => savane/middleware}/__init__.py (100%)
 create mode 100644 src/savane/middleware/debug.py


hooks/post-receive
-- 
Savane-cleanup framework




reply via email to

[Prev in Thread] Current Thread [Next in Thread]