Jelajahi Sumber

HUE-1190 [core] Consistent renaming

Romain Rigaux 12 tahun lalu
induk
melakukan
3345c80

+ 20 - 11
apps/about/src/about/templates/admin_wizard.mako

@@ -120,9 +120,9 @@ ${ commonheader(_('Quick Start'), "quick_start", user, "100px") | n,unicode }
 	      <a  href="${ url('useradmin.views.list_users') }" target="_blank">${ _('User Admin') } <img src="/useradmin/static/art/icon_useradmin_24.png"></a>
         </div>
       </div>
-      
+
       <br/>
-      
+
       <div class="widget-box">
         <div class="widget-title">
           <span class="icon">
@@ -132,11 +132,16 @@ ${ commonheader(_('Quick Start'), "quick_start", user, "100px") | n,unicode }
         </div>
         <div class="widget-content" style="padding-left: 14px">
           <label class="checkbox">
-          <input id="analyticsBtn" type="checkbox" name="analytics" style="margin-right: 10px" title="${ ('Check to enable usage analytics') }">
-              ${ ('Help improve Hue with anonymous usage analytics.') } <a href="javascript:void(0)" style="display: inline" data-trigger="hover" data-toggle="popover" data-placement="right" rel="popover" title="${_('How does it work?') }" data-content="${ ('We are using Google Analytics to track how many times an application or specific section of an application is used, nothing more.') }" ><i class="icon-question-sign"></i></a>
-            </label>
+            <input id="collectUsageBtn" type="checkbox" name="collect_usage" style="margin-right: 10px" title="${ ('Check to enable usage analytics') }" ${ collect_usage and "checked" }/>
+            ${ ('Help improve Hue with anonymous usage analytics.') }
+            <a href="javascript:void(0)" style="display: inline" data-trigger="hover" data-toggle="popover" data-placement="right" rel="popover"
+               title="${_('How does it work?') }"
+               data-content="${ ('We are using Google Analytics to see how many times an application or specific section of an application is used, nothing more.') }">
+               <i class="icon-question-sign"></i>
+            </a>
+          </label>
         </div>
-      </div>      
+      </div>
     </div>
 
     <div id="step4" class="stepDetails hide">
@@ -245,11 +250,15 @@ $(document).ready(function(){
       routie("step" + nextStep);
     }
   });
-  
-  $("#analyticsBtn").click(function () {
-    $.post("${ url('about:collect_usage') }", function(data) {
-      $.jHueNotify.info(data);
-    });    
+
+  $("#collectUsageBtn").click(function () {
+    $.post("${ url('about:collect_usage') }", $("input").serialize(), function(data) {
+      if (data.status == 0) {
+        $.jHueNotify.info('${ _("Configuration updated") }');
+      } else {
+        $.jHueNotify.error(data.data);
+      }
+    });
   });
 });
 </script>

+ 29 - 1
apps/about/src/about/tests.py

@@ -15,13 +15,19 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
+try:
+  import json
+except ImportError:
+  import simplejson as json
+
 from django.contrib.auth.models import User
 from django.core.urlresolvers import reverse
 
-from nose.tools import assert_true, assert_false
+from nose.tools import assert_true, assert_false, assert_equal
 
 from desktop.lib.django_test_util import make_logged_in_client
 from desktop.lib.test_utils import grant_access
+from desktop.models import Settings
 from oozie.tests import OozieBase
 
 
@@ -43,3 +49,25 @@ class TestAbout(TestAboutBase):
 
     response = self.client.get(reverse('about:index'))
     assert_false('Check Configuration' in response.content, response.content)
+
+
+def test_collect_usage():
+  client = make_logged_in_client(username="about", is_superuser=False)
+  grant_access("about", "about", "about")
+
+  collect_usage = Settings.get_settings().collect_usage
+
+  try:
+    response = client.post(reverse('about:collect_usage'), {'collect_usage': False})
+    data = json.loads(response.content)
+    assert_equal(data['status'], 0)
+    assert_false(data['collect_usage'] == True) # Weird but works
+
+    response = client.post(reverse('about:collect_usage'), {'collect_usage': True})
+    data = json.loads(response.content)
+    assert_equal(data['status'], 0)
+    assert_true(data['collect_usage'])
+  finally:
+    settings = Settings.get_settings()
+    settings.collect_usage = collect_usage
+    settings.save()

+ 1 - 1
apps/about/src/about/urls.py

@@ -20,6 +20,6 @@ from django.conf.urls.defaults import patterns, url
 urlpatterns = patterns('about.views',
   url(r'^$', 'admin_wizard', name='index'),
   url(r'^admin_wizard$', 'admin_wizard', name='admin_wizard'),
-  
+
   url(r'^collect_usage$', 'collect_usage', name='collect_usage'),
 )

+ 12 - 5
apps/about/src/about/views.py

@@ -34,11 +34,14 @@ def admin_wizard(request):
   apps = appmanager.get_apps(request.user)
   app_names = [app.name for app in sorted(apps, key=lambda app: app.menu_index)]
 
+  collect_usage = Settings.get_settings().collect_usage
+
   return render('admin_wizard.mako', request, {
       'version': settings.HUE_DESKTOP_VERSION,
       'check_config': check_config(request),
       'apps': dict([(app.name, app) for app in apps]),
       'app_names': app_names,
+      'collect_usage': collect_usage,
   })
 
 
@@ -46,11 +49,15 @@ def collect_usage(request):
   response = {'status': -1, 'data': ''}
 
   if request.method == 'POST':
-    settings, created = Settings.objects.get_or_create(id=1)
-    settings.usage_collection = request.POST.get('analytics')
-    settings.save()
-    response['status'] = 0
+    try:
+      settings = Settings.get_settings()
+      settings.collect_usage = request.POST.get('collect_usage', False)
+      settings.save()
+      response['status'] = 0
+      response['collect_usage'] = settings.collect_usage
+    except Exception, e:
+      response['data'] = str(e)
   else:
     response['data'] = _('POST request required.')
-      
+
   return HttpResponse(json.dumps(response), mimetype="application/json")

+ 74 - 0
desktop/core/src/desktop/migrations/0005_settings.py

@@ -0,0 +1,74 @@
+# encoding: utf-8
+import datetime
+from south.db import db
+from south.v2 import SchemaMigration
+from django.db import models
+
+class Migration(SchemaMigration):
+    
+    def forwards(self, orm):
+        # Adding model 'Settings'
+        db.create_table('desktop_settings', (
+            ('collect_usage', self.gf('django.db.models.fields.BooleanField')(default=True, db_index=True, blank=True)),
+            ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+        ))
+        db.send_create_signal('desktop', ['Settings'])
+    
+    
+    def backwards(self, orm):
+        # Deleting model 'Settings'
+        db.delete_table('desktop_settings')
+    
+    
+    models = {
+        'auth.group': {
+            'Meta': {'object_name': 'Group'},
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
+            'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
+        },
+        'auth.permission': {
+            'Meta': {'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'},
+            'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+            'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
+        },
+        'auth.user': {
+            'Meta': {'object_name': 'User'},
+            'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+            'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
+            'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
+            'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}),
+            'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
+            'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
+            'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+            'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
+            'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+            'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}),
+            'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
+        },
+        'contenttypes.contenttype': {
+            'Meta': {'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
+            'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
+        },
+        'desktop.settings': {
+            'Meta': {'object_name': 'Settings'},
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'collect_usage': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'db_index': 'True', 'blank': 'True'})
+        },
+        'desktop.userpreferences': {
+            'Meta': {'object_name': 'UserPreferences'},
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'key': ('django.db.models.fields.CharField', [], {'max_length': '20'}),
+            'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}),
+            'value': ('django.db.models.fields.TextField', [], {'max_length': '4096'})
+        }
+    }
+    
+    complete_apps = ['desktop']

+ 6 - 1
desktop/core/src/desktop/models.py

@@ -27,4 +27,9 @@ class UserPreferences(models.Model):
 
 
 class Settings(models.Model):
-  usage_collection = models.BooleanField(db_index=True, default=True)
+  collect_usage = models.BooleanField(db_index=True, default=True)
+
+  @classmethod
+  def get_settings(cls):
+    settings, created = Settings.objects.get_or_create(id=1)
+    return settings

+ 2 - 1
desktop/core/src/desktop/templates/common_footer.html

@@ -97,11 +97,12 @@ limitations under the License.
         $(".btn-primary:not(.disable-feedback), .btn-danger:not(.disable-feedback)").button("reset");
       }
 
-      {% if display_analytics %}
+      {% if collect_usage %}
 
       var _gaq = _gaq || [];
       _gaq.push(['_setAccount', 'UA-40351920-1']);
 
+      // We collect only 2 path levels: not hostname, no IDs, no anchors...
       var _pathName = location.pathname;
       var _splits = _pathName.substr(1).split("/");
       _pathName = _splits[0] + (_splits.length > 1 && $.trim(_splits[1]) != "" ? "/" + _splits[1] : "");

+ 15 - 6
desktop/core/src/desktop/templates/home.mako

@@ -22,7 +22,11 @@ ${ commonheader(_('Home'), "home", user) | n,unicode }
 
 
 <%def name="app_link(app, label=None, extra_path = '')">
-  <li><a href="/${ app }${ extra_path }"><i class="icon-double-angle-right"></i> ${ label is not None and label or apps[app].nice_name }</a></li>
+  <li>
+    <a href="/${ app }${ extra_path }"  title="${ apps[app].nice_name }" class="app-tooltips">
+      <i class="icon-double-angle-right"></i> ${ label }
+    </a>
+  </li>
 </%def>
 
 <div style="position: absolute;top:80px;right:30px"><img src="/static/art/hue-logo-subtle.png"/></div>
@@ -50,9 +54,9 @@ ${ commonheader(_('Home'), "home", user) | n,unicode }
         </div>
         <div class="widget-content">
           <ul>
-            ${ app_link("beeswax", _('Hive')) }
-            ${ app_link("impala", _('Impala')) }
-            ${ app_link("pig") }
+            ${ app_link("beeswax", "Hive") }
+            ${ app_link("impala", "Impala") }
+            ${ app_link("pig", "Pig") }
             ${ app_link("shell", _('Shell')) }
           </ul>
         </div>
@@ -71,7 +75,7 @@ ${ commonheader(_('Home'), "home", user) | n,unicode }
           <ul>
             ${ app_link("filebrowser", _('Files')) }
             ${ app_link("jobbrowser", _('Jobs')) }
-            ${ app_link("catalog", _('Tables')) }
+            ${ app_link("metastore", _('Tables')) }
             ${ app_link("jobsub", _('Designs')) }
           </ul>
         </div>
@@ -95,7 +99,12 @@ ${ commonheader(_('Home'), "home", user) | n,unicode }
       </div>
     </div>
   </div>
-
 </div>
 
+<script type="text/javascript" charset="utf-8">
+  $(document).ready(function(){
+    $(".app-tooltips").tooltip();
+  });
+</script>
+
 ${ commonfooter(messages) | n,unicode }

+ 5 - 2
desktop/core/src/desktop/views.py

@@ -37,7 +37,7 @@ from desktop.lib.conf import GLOBAL_CONFIG
 from desktop.lib.django_util import login_notrequired, render_json, render, render_to_string
 from desktop.lib.paths import get_desktop_root
 from desktop.log.access import access_log_level, access_warn
-from desktop.models import UserPreferences
+from desktop.models import UserPreferences, Settings
 from desktop import appmanager
 import desktop.conf
 import desktop.log.log_buffer
@@ -316,10 +316,13 @@ def commonfooter(messages=None):
   """
   if messages is None:
     messages = {}
+
+  hue_settings = Settings.get_settings()
+  print hue_settings.collect_usage
   return render_to_string("common_footer.html", {
     'messages': messages,
     'version': settings.HUE_DESKTOP_VERSION,
-    'display_analytics': True
+    'collect_usage': hue_settings.collect_usage
   })