Skip to content
This repository has been archived by the owner on Jul 25, 2018. It is now read-only.

Commit

Permalink
Add various useful stats to the admin interface.
Browse files Browse the repository at this point in the history
fix bug 772239
  • Loading branch information
Michael Kelly committed Sep 4, 2012
1 parent 6b57d2c commit 229efa6
Show file tree
Hide file tree
Showing 4 changed files with 153 additions and 1 deletion.
35 changes: 34 additions & 1 deletion apps/facebook/admin.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,16 @@
from datetime import datetime, timedelta

from django.conf import settings
from django.contrib.admin.filterspecs import FilterSpec

from funfactory.admin import site

from facebook.forms import FacebookBannerAdminForm
from facebook.models import (FacebookBanner, FacebookBannerInstance,
FacebookBannerLocale, FacebookUser)
FacebookBannerLocale, FacebookClickStats,
FacebookUser)
from shared.admin import BaseModelAdmin
from stats.options import ModelStats


class TotalClicksGoalFilterSpec(FilterSpec):
Expand Down Expand Up @@ -132,3 +136,32 @@ class FacebookUserAdmin(BaseModelAdmin):
('Leaderboard', {'fields': ('leaderboard_position', 'total_clicks')}),
)
site.register(FacebookUser, FacebookUserAdmin)


class FacebookBannerInstanceStats(ModelStats):
display_name = 'FacebookBannerInstances created'
datetime_field = 'created'
filters = ['banner', 'user__country']
site.register_stats(FacebookBannerInstance, FacebookBannerInstanceStats)


class FacebookClickStatsDisplay(ModelStats):
display_name = 'FacebookBanner clicks'
datetime_field = 'hour'
filters = ['banner_instance__banner', 'banner_instance__user__country']
default_interval = 'hours'

def default_start(self):
return datetime.now() - timedelta(days=100)
site.register_stats(FacebookClickStats, FacebookClickStatsDisplay)


class FacebookUserStats(ModelStats):
display_name = "App authorizations"
datetime_field = 'created'
filters = ['country']
default_interval = 'days'

def default_start(self):
return datetime.now() - timedelta(days=7)
site.register_stats(FacebookUser, FacebookUserStats)
116 changes: 116 additions & 0 deletions apps/facebook/migrations/0021_auto__add_field_facebookuser_created.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,116 @@
# -*- coding: 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 field 'FacebookUser.created'
db.add_column('facebook_facebookuser', 'created',
self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime.now),
keep_default=False)


def backwards(self, orm):
# Deleting field 'FacebookUser.created'
db.delete_column('facebook_facebookuser', 'created')


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': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", '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'}),
'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'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': '255'}),
'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': {'ordering': "('name',)", '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'})
},
'facebook.facebookaccountlink': {
'Meta': {'object_name': 'FacebookAccountLink'},
'activation_code': ('django.db.models.fields.CharField', [], {'max_length': '128', 'blank': 'True'}),
'affiliates_user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'account_links'", 'to': "orm['auth.User']"}),
'facebook_user': ('django.db.models.fields.related.OneToOneField', [], {'related_name': "'_account_link'", 'unique': 'True', 'to': "orm['facebook.FacebookUser']"}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'False'})
},
'facebook.facebookbanner': {
'Meta': {'object_name': 'FacebookBanner'},
'_alt_text': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '256', 'blank': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'image': ('django.db.models.fields.files.ImageField', [], {'max_length': '250'}),
'link': ('django.db.models.fields.URLField', [], {'default': "'https://www.mozilla.org/firefox'", 'max_length': '200'}),
'name': ('django.db.models.fields.CharField', [], {'default': "'Banner'", 'unique': 'True', 'max_length': '255'}),
'thumbnail': ('django.db.models.fields.files.ImageField', [], {'max_length': '250'})
},
'facebook.facebookbannerinstance': {
'Meta': {'object_name': 'FacebookBannerInstance'},
'banner': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'to': "orm['facebook.FacebookBanner']"}),
'can_be_an_ad': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
'custom_image': ('django.db.models.fields.files.ImageField', [], {'default': "''", 'max_length': '250', 'blank': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'processed': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'review_status': ('django.db.models.fields.SmallIntegerField', [], {'default': '0'}),
'text': ('django.db.models.fields.CharField', [], {'max_length': '90'}),
'total_clicks': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'banner_instance_set'", 'to': "orm['facebook.FacebookUser']"})
},
'facebook.facebookbannerlocale': {
'Meta': {'object_name': 'FacebookBannerLocale'},
'banner': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'locale_set'", 'to': "orm['facebook.FacebookBanner']"}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'locale': ('shared.models.LocaleField', [], {'default': "'en-US'", 'max_length': '32'})
},
'facebook.facebookclickstats': {
'Meta': {'object_name': 'FacebookClickStats'},
'banner_instance': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['facebook.FacebookBannerInstance']"}),
'clicks': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
'hour': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2012, 8, 29, 0, 0)'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'})
},
'facebook.facebookuser': {
'Meta': {'object_name': 'FacebookUser'},
'country': ('django.db.models.fields.CharField', [], {'max_length': '16', 'blank': 'True'}),
'created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
'first_name': ('django.db.models.fields.CharField', [], {'max_length': '256', 'blank': 'True'}),
'full_name': ('django.db.models.fields.CharField', [], {'max_length': '256', 'blank': 'True'}),
'id': ('django.db.models.fields.CharField', [], {'max_length': '128', 'primary_key': 'True'}),
'last_name': ('django.db.models.fields.CharField', [], {'max_length': '256', 'blank': 'True'}),
'leaderboard_position': ('django.db.models.fields.IntegerField', [], {'default': '-1'}),
'locale': ('django.db.models.fields.CharField', [], {'max_length': '32', 'blank': 'True'}),
'total_clicks': ('django.db.models.fields.IntegerField', [], {'default': '0'})
}
}

complete_apps = ['facebook']
2 changes: 2 additions & 0 deletions apps/facebook/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,8 @@ class FacebookUser(CachingMixin, ModelBase):
country = models.CharField(max_length=16, blank=True,
choices=settings.COUNTRIES.items())

created = models.DateTimeField(default=datetime.now)

objects = managers.FacebookUserManager()

@property
Expand Down
1 change: 1 addition & 0 deletions media/css/admin_stats.css
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,7 @@
background: #EFEFEF;
border-left: 1px solid #DDD;
height: 100%;
overflow: auto;
position: absolute;
right: 0px;
top: 0px;
Expand Down

0 comments on commit 229efa6

Please sign in to comment.