Skip to content

Commit

Permalink
fix zero-none values
Browse files Browse the repository at this point in the history
fix admin loading time
fix group/event name length and get_or_create
  • Loading branch information
zhebrak committed Nov 11, 2015
1 parent 91ae84a commit 6098f65
Show file tree
Hide file tree
Showing 9 changed files with 91 additions and 18 deletions.
2 changes: 1 addition & 1 deletion setup.py
Expand Up @@ -3,7 +3,7 @@
from distutils.core import setup


__version__ = '0.1.5'
__version__ = '0.1.8'

short_description = 'Statistics for Django projects'

Expand Down
18 changes: 17 additions & 1 deletion statsy/admin.py
Expand Up @@ -4,6 +4,8 @@

from statsy.models import StatsyGroup, StatsyEvent, StatsyObject

from django.contrib.admin.views.main import ChangeList


class StatsyGroupAdmin(admin.ModelAdmin):
list_display = ('name', 'is_active')
Expand All @@ -17,11 +19,22 @@ class StatsyEventAdmin(admin.ModelAdmin):
list_filter = ('is_active',)


class ChangeListWithoutPkOrdering(ChangeList):
"""
Django adds -pk sort key by default
"""
def get_ordering(self, request, queryset):
ordering = super(ChangeListWithoutPkOrdering, self).get_ordering(request, queryset)
if '-pk' in ordering:
ordering.remove('-pk')
return ordering


class StatsyObjectAdmin(admin.ModelAdmin):
list_display = ('__unicode__', 'object_value', 'user')
search_fields = ('user__username', 'text_value', 'float_value', 'url')
list_filter = ('group', 'event')
date_hierarchy = 'created_at'
# date_hierarchy = 'created_at'
list_select_related = ('group', 'event', 'user')
ordering = ('-created_at',)

Expand All @@ -30,6 +43,9 @@ def object_value(self, obj):

object_value.short_description = 'Value'

def get_changelist(self, request, **kwargs):
return ChangeListWithoutPkOrdering


admin.site.register(StatsyGroup, StatsyGroupAdmin)
admin.site.register(StatsyEvent, StatsyEventAdmin)
Expand Down
23 changes: 13 additions & 10 deletions statsy/core.py
Expand Up @@ -110,7 +110,7 @@ def _clean_kwargs(self, kwargs, clean_template=None):

if hasattr(self, clean_func):
cleaned_kwargs.update(
getattr(self, clean_func)(cleaned_kwargs.pop(kwarg) or None)
getattr(self, clean_func)(cleaned_kwargs.pop(kwarg))
)

return cleaned_kwargs
Expand All @@ -119,13 +119,10 @@ def _clean_kwargs_async(self, kwargs):
return self._clean_kwargs(kwargs, clean_template='_clean_{0}_async')

def _clean_value(self, value):
if not value:
return {
'value': None
}
_, cleaned_value = get_correct_value_field(value)

return {
'value': get_correct_value_field(value)[1]
'value': cleaned_value
}

def _clean_user(self, user):
Expand All @@ -147,14 +144,17 @@ def _clean_group(self, group):
if not group:
return {}

group_class = apps.get_model('statsy', 'StatsyGroup')
group = group[:group_class.NAME_LENGTH_LIMIT]

if self.use_cache:
cache_key = apps.get_model('statsy', 'StatsyGroup').cache_key_string.format(group)
cache_key = group_class.cache_key_string.format(group)
group = cache.setdefault(
cache_key,
lambda: self.groups.get_or_create(name=group)[0]
)
else:
group = self.groups.get_or_create(name=group)[0]
group, _ = self.groups.get_or_create(name=group)

if group.is_active:
return {
Expand All @@ -167,14 +167,17 @@ def _clean_event(self, event):
if not event:
return {}

event_class = apps.get_model('statsy', 'StatsyEvent')
event = event[:event_class.NAME_LENGTH_LIMIT]

if self.use_cache:
cache_key = apps.get_model('statsy', 'StatsyEvent').cache_key_string.format(event)
cache_key = event_class.cache_key_string.format(event)
event = cache.setdefault(
cache_key,
lambda: self.events.get_or_create(name=event)[0]
)
else:
event = self.events.get_or_create(name=event)[0]
event, _ = self.events.get_or_create(name=event)

if event.is_active:
return {
Expand Down
2 changes: 1 addition & 1 deletion statsy/descriptors.py
Expand Up @@ -13,7 +13,7 @@ def __init__(self, value_types):
def __get__(self, obj, objtype):
for value_type in self.value_types:
field_name = self.get_field_name(value_type)
if getattr(obj, field_name):
if getattr(obj, field_name) is not None:
return getattr(obj, field_name)

def __set__(self, obj, value):
Expand Down
5 changes: 2 additions & 3 deletions statsy/helpers.py
Expand Up @@ -30,8 +30,8 @@ def __missing__(self, key):

@memoize
def get_correct_value_field(value):
if value is None:
return 'float_value', value
if value is None or value == 'None':
return 'float_value', None

if isinstance(value, (float, int)) or (isinstance(value, str) and string_is_floatable(value)):
return 'float_value', float(value)
Expand All @@ -42,4 +42,3 @@ def get_correct_value_field(value):
pass

return 'text_value', value

24 changes: 24 additions & 0 deletions statsy/migrations/0004_auto_20151110_0935.py
@@ -0,0 +1,24 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals

from django.db import models, migrations


class Migration(migrations.Migration):

dependencies = [
('statsy', '0003_auto_20150513_0615'),
]

operations = [
migrations.AlterField(
model_name='statsyevent',
name='name',
field=models.CharField(unique=True, max_length=30, verbose_name=b'name'),
),
migrations.AlterField(
model_name='statsygroup',
name='name',
field=models.CharField(unique=True, max_length=30, verbose_name=b'name'),
),
]
24 changes: 24 additions & 0 deletions statsy/migrations/0005_auto_20151111_0316.py
@@ -0,0 +1,24 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals

from django.db import models, migrations


class Migration(migrations.Migration):

dependencies = [
('statsy', '0004_auto_20151110_0935'),
]

operations = [
migrations.AlterField(
model_name='statsyevent',
name='name',
field=models.CharField(unique=True, max_length=100, verbose_name=b'name'),
),
migrations.AlterField(
model_name='statsygroup',
name='name',
field=models.CharField(unique=True, max_length=100, verbose_name=b'name'),
),
]
3 changes: 2 additions & 1 deletion statsy/models.py
Expand Up @@ -15,8 +15,9 @@

class StatsyCategory(models.Model):
""" Abstract base model for Group and Event """
NAME_LENGTH_LIMIT = 100

name = models.CharField(max_length=30, verbose_name='name')
name = models.CharField(max_length=NAME_LENGTH_LIMIT, unique=True, verbose_name='name')
is_active = models.BooleanField(default=True, verbose_name='is active')

class Meta:
Expand Down
8 changes: 7 additions & 1 deletion tests/settings.py
Expand Up @@ -5,11 +5,17 @@

test_value_str = 'test_value'
test_value_int = 123
test_value_int_zero = 0
test_value_float = 123.0
test_value_float_zero = 0.0
test_value_none = None

test_label = 'test_label'

test_value_list = [test_value_str, test_value_int, test_value_float]
test_value_list = [
test_value_str, test_value_int, test_value_float,
test_value_int_zero, test_value_float_zero, test_value_none
]

test_username = 'test'
test_password = 'test'

0 comments on commit 6098f65

Please sign in to comment.