Browse Source

Code maintenance

* dropped utils for date/time formatting
* dropped old validation api for users
* checked misago.users tests  suite
Rafał Pitoń 10 years ago
parent
commit
6d6dd0318c

+ 0 - 19
misago/core/templatetags/misago_dates.py

@@ -1,19 +0,0 @@
-from django import template
-from django.conf import settings
-from django.template.defaultfilters import date as dj_date
-from django.utils import timezone
-
-
-register = template.Library()
-
-
-FORMAT_DAY_MONTH = settings.MISAGO_COMPACT_DATE_FORMAT_DAY_MONTH
-FORMAT_DAY_MONTH_YEAR = settings.MISAGO_COMPACT_DATE_FORMAT_DAY_MONTH_YEAR
-
-
-@register.filter
-def compact_date(value):
-    if value.year == timezone.now().year:
-        return dj_date(value, FORMAT_DAY_MONTH)
-    else:
-        return dj_date(value, FORMAT_DAY_MONTH_YEAR)

+ 7 - 62
misago/core/tests/test_utils.py

@@ -5,8 +5,8 @@ from django.test.client import RequestFactory
 from django.utils import timezone
 
 from misago.core.utils import (clean_return_path, is_request_to_misago,
-                               slugify, time_amount, is_referer_local,
-                               date_format, format_plaintext_for_html)
+                               slugify, is_referer_local,
+                               format_plaintext_for_html)
 
 
 VALID_PATHS = (
@@ -139,10 +139,10 @@ class CleanReturnPathTests(TestCase):
         self.assertEqual(clean_return_path(ok_request), '/')
 
         ok_request = MockRequest('GET', {
-            'HTTP_REFERER': 'http://misago-project.org/register/',
+            'HTTP_REFERER': 'http://misago-project.org/login/',
             'HTTP_HOST': 'misago-project.org/'
         })
-        self.assertEqual(clean_return_path(ok_request), '/register/')
+        self.assertEqual(clean_return_path(ok_request), '/login/')
 
     def test_post_request(self):
         """clean_return_path works for POST requests"""
@@ -155,8 +155,8 @@ class CleanReturnPathTests(TestCase):
         ok_request = MockRequest('POST', {
             'HTTP_REFERER': 'http://misago-project.org/',
             'HTTP_HOST': 'misago-project.org/'
-        }, {'return_path': '/register/'})
-        self.assertEqual(clean_return_path(ok_request), '/register/')
+        }, {'return_path': '/login/'})
+        self.assertEqual(clean_return_path(ok_request), '/login/')
 
 
 class IsRefererLocalTests(TestCase):
@@ -175,7 +175,7 @@ class IsRefererLocalTests(TestCase):
         self.assertTrue(is_referer_local(ok_request))
 
         ok_request = MockRequest('GET', {
-            'HTTP_REFERER': 'http://misago-project.org/register/',
+            'HTTP_REFERER': 'http://misago-project.org/login/',
             'HTTP_HOST': 'misago-project.org/'
         })
         self.assertTrue(is_referer_local(ok_request))
@@ -199,58 +199,3 @@ class IsRefererLocalTests(TestCase):
             'HTTP_HOST': 'misago-project.org/assadsa/'
         })
         self.assertFalse(is_referer_local(bad_request))
-
-
-class TimeAmountTests(TestCase):
-    def test_single_units(self):
-        """time_amount return correct amount of time for 1 precision"""
-        self.assertEqual(time_amount(1), "1 second")
-        self.assertEqual(time_amount(5), "5 seconds")
-        self.assertEqual(time_amount(35), "35 seconds")
-
-        self.assertEqual(time_amount(60), "1 minute")
-        self.assertEqual(time_amount(120), "2 minutes")
-        self.assertEqual(time_amount(240), "4 minutes")
-
-        self.assertEqual(time_amount(3600), "1 hour")
-        self.assertEqual(time_amount(7200), "2 hours")
-
-        self.assertEqual(time_amount(24 * 3600), "1 day")
-        self.assertEqual(time_amount(5 * 24 * 3600), "5 days")
-
-    def test_double_units(self):
-        """time_amount return correct amount of time for double precision"""
-        self.assertEqual(time_amount(61), "1 minute and 1 second")
-        self.assertEqual(time_amount(90), "1 minute and 30 seconds")
-
-        self.assertEqual(time_amount(121), "2 minutes and 1 second")
-        self.assertEqual(time_amount(150), "2 minutes and 30 seconds")
-
-        self.assertEqual(time_amount(3660), "1 hour and 1 minute")
-        self.assertEqual(time_amount(3720), "1 hour and 2 minutes")
-
-        self.assertEqual(time_amount(24 * 3600 + 1), "1 day and 1 second")
-        self.assertEqual(time_amount(2 * 24 * 3600 + 1), "2 days and 1 second")
-        self.assertEqual(time_amount(2 * 24 * 3600 + 5),
-                         "2 days and 5 seconds")
-
-        self.assertEqual(time_amount(2 * 24 * 3600 + 3 * 3600),
-                         "2 days and 3 hours")
-
-    def test_triple_units(self):
-        """time_amount return correct amount of time for triple precision"""
-        self.assertEqual(time_amount(3661), "1 hour, 1 minute and 1 second")
-        self.assertEqual(time_amount(2 * 3661),
-                         "2 hours, 2 minutes and 2 seconds")
-
-
-class DateFormatTests(TestCase):
-    def test_format_datetime(self):
-        """no crash on datetime format"""
-        date_format(timezone.now())
-        date_format(timezone.now(), "H:i")
-
-    def test_format_date(self):
-        """no crash on date format"""
-        date_format(timezone.now().date())
-        date_format(timezone.now().date(), 'm.Y')

+ 0 - 63
misago/core/utils.py

@@ -107,66 +107,3 @@ def is_referer_local(request):
         return False
 
     return True
-
-
-"""
-Utility that humanizes time amount.
-
-Expects number of seconds as first argument
-"""
-def time_amount(value):
-    delta = timedelta(seconds=value)
-
-    units_dict = {
-        'd': delta.days,
-        'h': 0,
-        'm': 0,
-        's': delta.seconds,
-    }
-
-    if units_dict['s'] >= 3600:
-        units_dict['h'] = units_dict['s'] / 3600
-        units_dict['s'] -= units_dict['h'] * 3600
-
-    if units_dict['s'] >= 60:
-        units_dict['m'] = units_dict['s'] / 60
-        units_dict['s'] -= units_dict['m'] * 60
-
-    precisions = []
-
-    if units_dict['d']:
-        string = ungettext_lazy(
-            '%(days)s day', '%(days)s days', units_dict['d'])
-        precisions.append(string % {'days': units_dict['d']})
-
-    if units_dict['h']:
-        string = ungettext_lazy(
-            '%(hours)s hour', '%(hours)s hours', units_dict['h'])
-        precisions.append(string % {'hours': units_dict['h']})
-
-    if units_dict['m']:
-        string = ungettext_lazy(
-            '%(minutes)s minute', '%(minutes)s minutes', units_dict['m'])
-        precisions.append(string % {'minutes': units_dict['m']})
-
-    if units_dict['s']:
-        string = ungettext_lazy(
-            '%(seconds)s second', '%(seconds)s seconds', units_dict['s'])
-        precisions.append(string % {'seconds': units_dict['s']})
-
-    if not precisions:
-        precisions.append(_("0 seconds"))
-
-    if len(precisions) == 1:
-        return precisions[0]
-    else:
-        formats = {
-            'first_part': ', '.join(precisions[:-1]),
-            'and_part': precisions[-1],
-        }
-
-        return _("%(first_part)s and %(and_part)s") % formats
-
-
-def date_format(date, format=None):
-    return dj_date_format(timezone.template_localtime(date), format)

+ 6 - 0
misago/static/misago/admin/js/misago-timestamps.js

@@ -28,6 +28,12 @@ $(function() {
         }
       }
     });
+
+    $('.moment-length').each(function() {
+      var minutes = $(this).data('minutes');
+      var obj = moment.duration(minutes, 'minutes');
+      $(this).text(obj.humanize());
+    });
   }
 
   // Run updates

+ 0 - 1
misago/templates/misago/admin/users/edit.html

@@ -73,7 +73,6 @@ class="form-horizontal"
 
     {% form_row form.is_hiding_presence label_class field_class %}
     {% form_row form.limits_private_thread_invites_to label_class field_class %}
-    {% form_row form.timezone label_class field_class %}
 
   </fieldset>
   <fieldset>

+ 7 - 1
misago/templates/misago/admin/warnings/list.html

@@ -31,7 +31,13 @@
 <td class="item-name">
   #{{ forloop.counter }} {{ item }}
 </td>
-<td>{{ item.length }}</td>
+<td>
+  {% if item.length %}
+    <abbr class="moment-length" data-minutes="{{ item.length }}"></abbr>
+  {% else %}
+    {% trans "Permanent" %}
+  {% endif %}
+</td>
 <td>
   {% if item.restricts_posting_replies == 0 %}
   <div class="text-success">

+ 0 - 1
misago/users/models/ban.py

@@ -6,7 +6,6 @@ from django.utils import timezone
 from django.utils.translation import ugettext_lazy as _
 
 from misago.core import cachebuster
-from misago.core.utils import date_format
 
 
 __all__ = [

+ 0 - 8
misago/users/models/warnings.py

@@ -8,7 +8,6 @@ from django.utils.translation import ugettext_lazy as _
 
 from misago.core import threadstore
 from misago.core.cache import cache
-from misago.core.utils import time_amount
 
 
 __all__ = [
@@ -82,13 +81,6 @@ class WarningLevel(models.Model):
         cache.delete(CACHE_NAME)
 
     @property
-    def length(self):
-        if self.length_in_minutes:
-            return time_amount(self.length_in_minutes * 60)
-        else:
-            return _("permanent")
-
-    @property
     def has_restrictions(self):
         return self.restricts_posting_replies or self.restricts_posting_threads
 

+ 0 - 106
misago/users/tests/test_api_views.py

@@ -1,106 +0,0 @@
-import json
-
-from django.contrib.auth import get_user_model
-from django.core.urlresolvers import reverse
-from django.test import TestCase
-
-
-class ValidationAPITests(TestCase):
-    ajax_header = {'HTTP_X_REQUESTED_WITH': 'XMLHttpRequest'}
-
-    def test_validate_username(self):
-        """test API for validating username"""
-        response = self.client.get(reverse('misago:api_validate_username'))
-        self.assertEqual(response.status_code, 405)
-
-        response = self.client.post(reverse('misago:api_validate_username'),
-                                    data={'username': 'Bob'},
-                                    **self.ajax_header)
-
-        self.assertEqual(response.status_code, 200)
-        data = json.loads(response.content)
-        self.assertEqual(data['has_error'], 0)
-        self.assertIn('username', data['message'])
-
-        User = get_user_model()
-        user = User.objects.create_user("Bob", "bob@bob.com", "pass123")
-
-        response = self.client.post(reverse('misago:api_validate_username'),
-                                    data={'username': 'Bob'},
-                                    **self.ajax_header)
-
-        self.assertEqual(response.status_code, 200)
-        data = json.loads(response.content)
-        self.assertEqual(data['has_error'], 1)
-        self.assertIn('not available', data['message'])
-
-        test_url = reverse('misago:api_validate_username',
-                           kwargs={'user_id': user.pk})
-
-        response = self.client.post(
-            test_url, data={'username': 'Bob'}, **self.ajax_header)
-
-        self.assertEqual(response.status_code, 200)
-        data = json.loads(response.content)
-        self.assertEqual(data['has_error'], 0)
-        self.assertIn('username', data['message'])
-
-    def test_validate_email(self):
-        """test API for validating email"""
-        response = self.client.get(reverse('misago:api_validate_email'))
-        self.assertEqual(response.status_code, 405)
-
-        response = self.client.post(reverse('misago:api_validate_email'),
-                                    data={'email': 'bob@bob.com'},
-                                    **self.ajax_header)
-
-        self.assertEqual(response.status_code, 200)
-        data = json.loads(response.content)
-        self.assertEqual(data['has_error'], 0)
-        self.assertIn('e-mail', data['message'])
-
-        User = get_user_model()
-        user = User.objects.create_user("Bob", "bob@bob.com", "pass123")
-
-        response = self.client.post(reverse('misago:api_validate_email'),
-                                    data={'email': 'bob@bob.com'},
-                                    **self.ajax_header)
-
-        self.assertEqual(response.status_code, 200)
-        data = json.loads(response.content)
-        self.assertEqual(data['has_error'], 1)
-        self.assertIn('not available', data['message'])
-
-        test_url = reverse('misago:api_validate_email',
-                           kwargs={'user_id': user.pk})
-
-        response = self.client.post(
-            test_url, data={'email': 'bob@bob.com'}, **self.ajax_header)
-
-        self.assertEqual(response.status_code, 200)
-        data = json.loads(response.content)
-        self.assertEqual(data['has_error'], 0)
-        self.assertIn('e-mail', data['message'])
-
-    def test_validate_password(self):
-        """test API for validating password"""
-        response = self.client.get(reverse('misago:api_validate_password'))
-        self.assertEqual(response.status_code, 405)
-
-        response = self.client.post(reverse('misago:api_validate_password'),
-                                    data={'password': 'pass123'},
-                                    **self.ajax_header)
-
-        self.assertEqual(response.status_code, 200)
-        data = json.loads(response.content)
-        self.assertEqual(data['has_error'], 0)
-        self.assertIn('password', data['message'])
-
-        response = self.client.post(reverse('misago:api_validate_password'),
-                                    data={'password': 'p'},
-                                    **self.ajax_header)
-
-        self.assertEqual(response.status_code, 200)
-        data = json.loads(response.content)
-        self.assertEqual(data['has_error'], 1)
-        self.assertIn('characters long', data['message'])

+ 4 - 4
misago/users/tests/test_decorators.py

@@ -5,28 +5,28 @@ from misago.users.testutils import UserTestCase
 class DenyAuthenticatedTests(UserTestCase):
     def test_success(self):
         """deny_authenticated decorator allowed guest request"""
-        response = self.client.post(reverse('misago:api:login'))
+        response = self.client.post('/api/auth/')
         self.assertEqual(response.status_code, 400)
 
     def test_fail(self):
         """deny_authenticated decorator denied authenticated request"""
         self.login_user(self.get_authenticated_user())
 
-        response = self.client.post(reverse('misago:api:login'))
+        response = self.client.post('/api/auth/')
         self.assertEqual(response.status_code, 403)
 
 
 class DeflectAuthenticatedTests(UserTestCase):
     def test_success(self):
         """deflect_authenticated decorator allowed guest request"""
-        response = self.client.get(reverse('misago:request_password_reset'))
+        response = self.client.get(reverse('misago:forgotten_password'))
         self.assertEqual(response.status_code, 200)
 
     def test_fail(self):
         """deflect_authenticated decorator deflected authenticated request"""
         self.login_user(self.get_authenticated_user())
 
-        response = self.client.get(reverse('misago:request_password_reset'))
+        response = self.client.get(reverse('misago:forgotten_password'))
         self.assertEqual(response.status_code, 302)
 
 

+ 5 - 5
misago/users/tests/test_testutils.py

@@ -33,7 +33,7 @@ class UserTestCaseTests(UserTestCase):
         user = self.get_authenticated_user()
         self.login_user(user)
 
-        response = self.client.get(reverse('misago:api:auth_user'))
+        response = self.client.get('/api/auth/')
         self.assertEqual(response.status_code, 200)
 
         user_json = json.loads(response.content)
@@ -44,7 +44,7 @@ class UserTestCaseTests(UserTestCase):
         user = self.get_superuser()
         self.login_user(user)
 
-        response = self.client.get(reverse('misago:api:auth_user'))
+        response = self.client.get('/api/auth/')
         self.assertEqual(response.status_code, 200)
 
         user_json = json.loads(response.content)
@@ -56,7 +56,7 @@ class UserTestCaseTests(UserTestCase):
         self.login_user(user)
         self.logout_user()
 
-        response = self.client.get(reverse('misago:api:auth_user'))
+        response = self.client.get('/api/auth/')
         self.assertEqual(response.status_code, 200)
 
         user_json = json.loads(response.content)
@@ -68,7 +68,7 @@ class UserTestCaseTests(UserTestCase):
         self.login_user(user)
         self.logout_user()
 
-        response = self.client.get(reverse('misago:api:auth_user'))
+        response = self.client.get('/api/auth/')
         self.assertEqual(response.status_code, 200)
 
         user_json = json.loads(response.content)
@@ -95,7 +95,7 @@ class SuperUserTestCaseTests(SuperUserTestCase):
         self.assertTrue(self.user.is_staff)
         self.assertTrue(self.user.is_superuser)
 
-        response = self.client.get(reverse('misago:api:auth_user'))
+        response = self.client.get('/api/auth/')
         self.assertEqual(response.status_code, 200)
 
         user_json = json.loads(response.content)

+ 0 - 1
misago/users/tests/test_useradmin_views.py

@@ -194,7 +194,6 @@ class UserAdminViewsTests(AdminTestCase):
                 'staff_level': '0',
                 'signature': 'Hello world!',
                 'is_signature_locked': '1',
-                'timezone': 'utc',
                 'is_hiding_presence': '0',
                 'limits_private_thread_invites_to': '0',
                 'signature_lock_staff_message': 'Staff message',

+ 0 - 1
misago/users/tests/test_warningadmin_views.py

@@ -80,7 +80,6 @@ class WarningsAdminViewsTests(AdminTestCase):
         self.assertEqual(response.status_code, 200)
         self.assertIn(test_level.name, response.content)
         self.assertTrue('Test Level' not in response.content)
-        self.assertIn("5 minutes", response.content)
 
     def test_move_up_view(self):
         """move warning level up view has no showstoppers"""

+ 1 - 1
misago/users/testutils.py

@@ -25,7 +25,7 @@ class UserTestCase(TestCase):
             "TestSuperUser", "test@superuser.com", self.USER_PASSWORD)
 
     def login_user(self, user):
-        self.client.post(reverse('misago:api:login'), data={
+        self.client.post('/api/auth/', data={
             'username': user.email,
             'password': self.USER_PASSWORD,
         })

+ 0 - 10
misago/users/urls/__init__.py

@@ -19,16 +19,6 @@ urlpatterns += patterns('misago.users.views.forgottenpassword',
 )
 
 
-urlpatterns += patterns('misago.users.views.api',
-    url(r'^api/validate/username/$', 'validate_username', name='api_validate_username'),
-    url(r'^api/validate/username/(?P<user_id>\d+)/$', 'validate_username', name='api_validate_username'),
-    url(r'^api/validate/email/$', 'validate_email', name='api_validate_email'),
-    url(r'^api/validate/email/(?P<user_id>\d+)/$', 'validate_email', name='api_validate_email'),
-    url(r'^api/validate/password/$', 'validate_password', name='api_validate_password'),
-    url(r'^api/suggestion-engine/$', 'suggestion_engine', name='api_suggestion_engine'),
-)
-
-
 urlpatterns += patterns('misago.users.views.usercp',
     url(r'^usercp/forum-options/$', 'change_forum_options', name="usercp_change_forum_options"),
     url(r'^usercp/change-avatar/$', 'change_avatar', name="usercp_change_avatar"),

+ 0 - 93
misago/users/views/api.py

@@ -1,93 +0,0 @@
-from django.conf import settings
-from django.contrib.auth import get_user_model
-from django.core.exceptions import ValidationError
-from django.core.urlresolvers import reverse
-from django.http import JsonResponse
-from django.shortcuts import get_object_or_404
-from django.utils.translation import ugettext as _
-from django.views.decorators.debug import sensitive_post_parameters
-
-from misago.core.decorators import ajax_only, require_POST
-
-from misago.users import validators
-from misago.users.decorators import deny_guests
-
-
-def api(f):
-    @sensitive_post_parameters("email", "password")
-    @ajax_only
-    @require_POST
-    def decorator(request, *args, **kwargs):
-        if kwargs.get('user_id'):
-            User = get_user_model()
-            kwargs['user'] = get_object_or_404(User, pk=kwargs.pop('user_id'))
-
-        try:
-            return JsonResponse({
-                'has_error': 0,
-                'message': f(request, *args, **kwargs),
-            })
-        except ValidationError as e:
-            return JsonResponse({
-                'has_error': 1,
-                'message': unicode(e.message)
-            })
-    return decorator
-
-
-@api
-def validate_username(request, user=None):
-    try:
-        validators.validate_username(request.POST['username'],
-                                     exclude=user)
-        return _("Entered username is valid.")
-    except KeyError:
-        raise ValidationError(_('Enter username.'))
-
-
-@api
-def validate_email(request, user=None):
-    try:
-        validators.validate_email(request.POST['email'],
-                                  exclude=user)
-        return _("Entered e-mail is valid.")
-    except KeyError:
-        raise ValidationError(_('Enter e-mail address.'))
-
-
-@api
-def validate_password(request):
-    try:
-        validators.validate_password(request.POST['password'])
-        return _("Entered password is valid.")
-    except KeyError:
-        raise ValidationError(_('Enter password.'))
-
-
-@ajax_only
-@require_POST
-@deny_guests
-def suggestion_engine(request):
-    suggestions = []
-
-    username = request.POST.get('username', '').lower()
-    if len(username) > 1:
-        User = get_user_model()
-        queryset = User.objects.filter(slug__startswith=username)
-
-        for user in queryset.order_by('slug')[:5]:
-            avatars = {}
-            for size in settings.MISAGO_AVATARS_SIZES:
-                avatars[size] = reverse('misago:user_avatar', kwargs={
-                    'size': size, 'user_id': user.pk
-                })
-
-            suggestions.append({
-                'avatar': avatars,
-                'username': user.username,
-                'url': user.get_absolute_url()
-            })
-
-    return JsonResponse({
-        'profiles': suggestions
-    })