Browse Source

#388: Made hide presence binary setting

Rafał Pitoń 11 years ago
parent
commit
7e7ae4edd7

+ 2 - 1
misago/conf/defaults.py

@@ -58,6 +58,7 @@ PIPELINE_JS = {
             'misago/js/misago-alerts.js',
             'misago/js/misago-alerts.js',
             'misago/js/misago-timestamps.js',
             'misago/js/misago-timestamps.js',
             'misago/js/misago-tooltips.js',
             'misago/js/misago-tooltips.js',
+            'misago/js/misago-yesnoswitch.js',
         ),
         ),
         'output_filename': 'misago.js',
         'output_filename': 'misago.js',
     },
     },
@@ -70,7 +71,7 @@ PIPELINE_JS = {
             'misago/admin/js/misago-timestamps.js',
             'misago/admin/js/misago-timestamps.js',
             'misago/admin/js/misago-tooltips.js',
             'misago/admin/js/misago-tooltips.js',
             'misago/admin/js/misago-tables.js',
             'misago/admin/js/misago-tables.js',
-            'misago/admin/js/misago-yesnoswitch.js',
+            #'misago/admin/js/misago-yesnoswitch.js',
         ),
         ),
         'output_filename': 'misago_admin.js',
         'output_filename': 'misago_admin.js',
     },
     },

+ 1 - 0
misago/static/misago/css/misago/misago.less

@@ -5,6 +5,7 @@
 @import "navs.less";
 @import "navs.less";
 @import "modals.less";
 @import "modals.less";
 @import "markup.less";
 @import "markup.less";
+@import "yesnoswitch.less";
 
 
 // Layout elements
 // Layout elements
 @import "navbar.less";
 @import "navbar.less";

+ 37 - 0
misago/static/misago/css/misago/yesnoswitch.less

@@ -0,0 +1,37 @@
+//
+// Custom yes-no switch
+// --------------------------------------------------
+
+
+.ninja-switch {
+  position: absolute;
+  top: -9999px;
+  left: -9999px;
+}
+
+.yes-no-switch {
+  .btn-yes {
+    margin-right: 1px;
+  }
+
+  .btn-yes, .btn-no {
+    width: 56px;
+
+    font-weight: bold;
+    text-align: center;
+
+    &.active {
+      &.btn-yes {
+        background: @btn-success-border;
+
+        color: @btn-success-color;
+      }
+
+      &.btn-no {
+        background: @btn-danger-border;
+
+        color: @btn-danger-color;
+      }
+    }
+  }
+}

+ 69 - 0
misago/static/misago/js/misago-yesnoswitch.js

@@ -0,0 +1,69 @@
+// Define extension
+function enableYesNoSwitch(selector, yes, no) {
+  function realYesNoSwitch(control) {
+    var name = control.find('.yesno-switch').first().attr('name');
+    var value = control.find('.yesno-switch').filter(":checked").val() * 1;
+
+    var buttons = $('<div class="btn-group yes-no-switch">' +
+      '<button type="button" class="btn btn-yes btn-default">' + yes + '</button>' +
+      '<button type="button" class="btn btn-no btn-default">' + no + '</button>' +
+    '</div>');
+
+    var button_yes = buttons.find('.btn-yes');
+    var button_no = buttons.find('.btn-no');
+
+    control.find('.yesno-switch').first().parent().before(buttons);
+    control.find('.yesno-switch').parent().addClass('ninja-switch');
+
+    function switchState(newstate) {
+      function switchToYes() {
+        button_yes.addClass('active');
+        button_yes.addClass('btn-success');
+        button_yes.removeClass('btn-default');
+        button_no.removeClass('active');
+        button_no.addClass('btn-default');
+        button_no.removeClass('btn-danger');
+      }
+
+      function switchToNo() {
+        button_yes.removeClass('active');
+        button_yes.removeClass('btn-success');
+        button_yes.addClass('btn-default');
+        button_no.addClass('active');
+        button_no.removeClass('btn-default');
+        button_no.addClass('btn-danger');
+      }
+
+      if (newstate == 1) {
+        switchToYes();
+      } else {
+        switchToNo();
+      }
+
+      control.find('.yesno-switch').first().prop('checked', newstate == 1);
+      control.find('.yesno-switch').last().prop('checked', newstate == 0);
+    }
+
+    switchState(value);
+
+    button_yes.click(function() {
+      switchState(1);
+    });
+
+    button_no.click(function() {
+      switchState(0);
+    });
+  }
+
+  $(selector).each(function() {
+    if ($(this).find('.yesno-switch').length == 2) {
+      realYesNoSwitch($(this));
+    }
+  });
+}
+
+
+// Enable switch
+$(function() {
+  enableYesNoSwitch('.control-radioselect', lang_yes, lang_no);
+});

+ 1 - 1
misago/templates/misago/admin/base.html

@@ -19,7 +19,7 @@
 
 
 {% include "misago/admin/logout.html" %}
 {% include "misago/admin/logout.html" %}
 
 
-{# We include JavaScript at the end of page body so it loads faster #}
+{# We include JavaScript at the end of page body so it renders faster #}
 <script lang="JavaScript">
 <script lang="JavaScript">
   var lang_yes = "{% trans "Yes" %}";
   var lang_yes = "{% trans "Yes" %}";
   var lang_no = "{% trans "No" %}";
   var lang_no = "{% trans "No" %}";

+ 6 - 2
misago/templates/misago/base.html

@@ -1,4 +1,4 @@
-{% load compressed staticfiles %}
+{% load compressed i18n staticfiles %}
 <!DOCTYPE html>
 <!DOCTYPE html>
 <html lang="{{ LANGUAGE_CODE }}">
 <html lang="{{ LANGUAGE_CODE }}">
   <head>
   <head>
@@ -29,7 +29,11 @@
 
 
     {% include "misago/footer.html" %}
     {% include "misago/footer.html" %}
 
 
-    {# We include JavaScript at the end of page body so it loads faster #}
+    {# We include JavaScript at the end of page body so it renders faster #}
+    <script lang="JavaScript">
+      var lang_yes = "{% trans "Yes" %}";
+      var lang_no = "{% trans "No" %}";
+    </script>
     {% compressed_js 'misago' %}
     {% compressed_js 'misago' %}
     {% block javascripts %}{% endblock javascripts %}
     {% block javascripts %}{% endblock javascripts %}
 
 

+ 1 - 1
misago/templates/misago/usercp/change_forum_options.html

@@ -21,7 +21,7 @@
       <fieldset>
       <fieldset>
         <legend>{% trans "Forum options" %}</legend>
         <legend>{% trans "Forum options" %}</legend>
 
 
-        {% form_row form.presence_visibility label_class field_class %}
+        {% form_row form.is_hiding_presence label_class field_class %}
         {% form_row form.timezone label_class field_class %}
         {% form_row form.timezone label_class field_class %}
 
 
       </fieldset>
       </fieldset>

+ 6 - 8
misago/users/forms/usercp.py

@@ -2,8 +2,7 @@ from django.contrib.auth import get_user_model
 from django.utils.translation import ugettext_lazy as _
 from django.utils.translation import ugettext_lazy as _
 
 
 from misago.core import forms, timezones
 from misago.core import forms, timezones
-from misago.users.models import (PRESENCE_VISIBILITY_CHOICES,
-                                 AUTO_SUBSCRIBE_CHOICES)
+from misago.users.models import AUTO_SUBSCRIBE_CHOICES
 from misago.users.validators import validate_username
 from misago.users.validators import validate_username
 
 
 
 
@@ -13,11 +12,10 @@ class ChangeForumOptionsBaseForm(forms.ModelForm):
         help_text=_("If dates and hours displayed by forums are inaccurate, "
         help_text=_("If dates and hours displayed by forums are inaccurate, "
                     "you can fix it by adjusting timezone setting."))
                     "you can fix it by adjusting timezone setting."))
 
 
-    presence_visibility = forms.TypedChoiceField(
-        label=_("Show my presence to"),
-        choices=PRESENCE_VISIBILITY_CHOICES, coerce=int,
-        help_text=_("If you want to, you can limit other members ability to "
-                    "track your presence on forums."))
+    is_hiding_presence = forms.YesNoSwitch(
+        label=_("Hide my presence"),
+        help_text=_("If you hide your presence, only members with permission "
+                    "to see hidden will see when you are online."))
 
 
     subscribe_to_started_threads = forms.TypedChoiceField(
     subscribe_to_started_threads = forms.TypedChoiceField(
         label=_("Threads I start"), coerce=int, choices=AUTO_SUBSCRIBE_CHOICES)
         label=_("Threads I start"), coerce=int, choices=AUTO_SUBSCRIBE_CHOICES)
@@ -28,7 +26,7 @@ class ChangeForumOptionsBaseForm(forms.ModelForm):
 
 
     class Meta:
     class Meta:
         model = get_user_model()
         model = get_user_model()
-        fields = ['timezone', 'presence_visibility',
+        fields = ['timezone', 'is_hiding_presence',
                   'subscribe_to_started_threads',
                   'subscribe_to_started_threads',
                   'subscribe_to_replied_threads']
                   'subscribe_to_replied_threads']
 
 

+ 1 - 1
misago/users/migrations/0001_initial.py

@@ -30,7 +30,7 @@ class Migration(migrations.Migration):
                 ('joined_on', models.DateTimeField(default=django.utils.timezone.now, verbose_name='joined on')),
                 ('joined_on', models.DateTimeField(default=django.utils.timezone.now, verbose_name='joined on')),
                 ('joined_from_ip', models.GenericIPAddressField()),
                 ('joined_from_ip', models.GenericIPAddressField()),
                 ('last_ip', models.GenericIPAddressField(null=True, blank=True)),
                 ('last_ip', models.GenericIPAddressField(null=True, blank=True)),
-                ('presence_visibility', models.PositiveIntegerField(default=0)),
+                ('is_hiding_presence', models.BooleanField(default=False)),
                 ('timezone', models.CharField(max_length=255, default='utc')),
                 ('timezone', models.CharField(max_length=255, default='utc')),
                 ('title', models.CharField(max_length=255, null=True, blank=True)),
                 ('title', models.CharField(max_length=255, null=True, blank=True)),
                 ('requires_activation', models.PositiveIntegerField(default=0)),
                 ('requires_activation', models.PositiveIntegerField(default=0)),

+ 2 - 16
misago/users/models/user.py

@@ -20,9 +20,7 @@ from misago.users.utils import hash_email
 
 
 __all__ = [
 __all__ = [
     'ACTIVATION_REQUIRED_NONE', 'ACTIVATION_REQUIRED_USER',
     'ACTIVATION_REQUIRED_NONE', 'ACTIVATION_REQUIRED_USER',
-    'ACTIVATION_REQUIRED_ADMIN', 'PRESENCE_VISIBILITY_ALL',
-    'PRESENCE_VISIBILITY_FOLLOWED', 'PRESENCE_VISIBILITY_ALLOWED',
-    'PRESENCE_VISIBILITY_CHOICES', 'AUTO_SUBSCRIBE_NONE',
+    'ACTIVATION_REQUIRED_ADMIN', 'AUTO_SUBSCRIBE_NONE',
     'AUTO_SUBSCRIBE_WATCH', 'AUTO_SUBSCRIBE_WATCH_AND_EMAIL',
     'AUTO_SUBSCRIBE_WATCH', 'AUTO_SUBSCRIBE_WATCH_AND_EMAIL',
     'AUTO_SUBSCRIBE_CHOICES', 'AnonymousUser', 'User', 'UsernameChange',
     'AUTO_SUBSCRIBE_CHOICES', 'AnonymousUser', 'User', 'UsernameChange',
     'Online',
     'Online',
@@ -34,17 +32,6 @@ ACTIVATION_REQUIRED_USER = 1
 ACTIVATION_REQUIRED_ADMIN = 2
 ACTIVATION_REQUIRED_ADMIN = 2
 
 
 
 
-PRESENCE_VISIBILITY_ALL = 0
-PRESENCE_VISIBILITY_FOLLOWED = 1
-PRESENCE_VISIBILITY_ALLOWED = 2
-
-PRESENCE_VISIBILITY_CHOICES = (
-    (PRESENCE_VISIBILITY_ALL, _("Everyone")),
-    (PRESENCE_VISIBILITY_FOLLOWED, _("Users I follow")),
-    (PRESENCE_VISIBILITY_ALLOWED, _("Noone"))
-)
-
-
 AUTO_SUBSCRIBE_NONE = 0
 AUTO_SUBSCRIBE_NONE = 0
 AUTO_SUBSCRIBE_WATCH = 1
 AUTO_SUBSCRIBE_WATCH = 1
 AUTO_SUBSCRIBE_WATCH_AND_EMAIL = 2
 AUTO_SUBSCRIBE_WATCH_AND_EMAIL = 2
@@ -162,8 +149,7 @@ class User(AbstractBaseUser, PermissionsMixin):
     joined_on = models.DateTimeField(_('joined on'), default=timezone.now)
     joined_on = models.DateTimeField(_('joined on'), default=timezone.now)
     joined_from_ip = models.GenericIPAddressField()
     joined_from_ip = models.GenericIPAddressField()
     last_ip = models.GenericIPAddressField(null=True, blank=True)
     last_ip = models.GenericIPAddressField(null=True, blank=True)
-    presence_visibility = models.PositiveIntegerField(
-        default=PRESENCE_VISIBILITY_ALL)
+    is_hiding_presence = models.BooleanField(default=False)
 
 
     timezone = models.CharField(max_length=255, default='utc')
     timezone = models.CharField(max_length=255, default='utc')
 
 

+ 2 - 2
misago/users/tests/test_usercp_views.py

@@ -19,7 +19,7 @@ class ChangeForumOptionsTests(AdminTestCase):
         """POST to usercp change options view returns 302"""
         """POST to usercp change options view returns 302"""
         response = self.client.post(self.view_link, data={
         response = self.client.post(self.view_link, data={
             'timezone': 'Asia/Qatar',
             'timezone': 'Asia/Qatar',
-            'presence_visibility': '2',
+            'is_hiding_presence': '1',
             'subscribe_to_started_threads': '0',
             'subscribe_to_started_threads': '0',
             'subscribe_to_replied_threads': '1',
             'subscribe_to_replied_threads': '1',
             })
             })
@@ -28,7 +28,7 @@ class ChangeForumOptionsTests(AdminTestCase):
 
 
         test_user = get_user_model().objects.get(pk=self.test_admin.pk)
         test_user = get_user_model().objects.get(pk=self.test_admin.pk)
         self.assertEqual(test_user.timezone, 'Asia/Qatar')
         self.assertEqual(test_user.timezone, 'Asia/Qatar')
-        self.assertEqual(test_user.presence_visibility, 2)
+        self.assertEqual(test_user.is_hiding_presence, 1)
         self.assertEqual(test_user.subscribe_to_started_threads, 0)
         self.assertEqual(test_user.subscribe_to_started_threads, 0)
         self.assertEqual(test_user.subscribe_to_replied_threads, 1)
         self.assertEqual(test_user.subscribe_to_replied_threads, 1)