[dw-free] Business statistics
[commit: http://hg.dwscoalition.org/dw-free/rev/352f57a7ecbf]
http://bugs.dwscoalition.org/show_bug.cgi?id=124
Pie graphs and bar charts for stats on /stats/site
Patch by
anarres.
Files modified:
http://bugs.dwscoalition.org/show_bug.cgi?id=124
Pie graphs and bar charts for stats on /stats/site
Patch by
![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Files modified:
- cgi-bin/DW/Controller/Graphs.pm
- cgi-bin/DW/Controller/SiteStats.pm
- htdocs/stc/sitestats.css
- views/stats/site.tt
- views/stats/site.tt.text
-------------------------------------------------------------------------------- diff -r f4cdf352d249 -r 352f57a7ecbf cgi-bin/DW/Controller/Graphs.pm --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/cgi-bin/DW/Controller/Graphs.pm Tue Sep 07 16:17:49 2010 +0800 @@ -0,0 +1,267 @@ +#!/usr/bin/perl +# +# DW::Controller::Graphs +# +# Controller module for graphs to be displayed on /stats/site +# +# Authors: +# Anarres <anarres@dreamwidth.org> +# +# Copyright (c) 2010 by Dreamwidth Studios, LLC. +# +# This program is free software; you may redistribute it and/or modify it under +# the same terms as Perl itself. For a copy of the license, please reference +# 'perldoc perlartistic' or 'perldoc perlgpl'. +# +# How it works: +# For each graph a url is registered - e.g. www.dreamwidth.org/stats/accounts_by_type.tt +# (the graphs are placed within www.dreamwidth.org/stats/site.tt, but they have their own +# urls). The data to be graphed is generated by DW::Controller::SiteStats, the controller +# module for www.dreamwidth.org/stats/site.tt. In site.tt the data is passed to this module +# in urls like this: <img src="accounts_by_type?personal=x&community=..." />, where x is +# the number of personal accounts. The data is available in this module in the variable $r. + +=head1 NAME + +DW::Controller::Graphs - Controller module for graphs to be displayed on /stats/site. + +=head1 SYNOPSIS + + use DW::Controller::Graphs; + +=cut + +package DW::Controller::Graphs; + +use strict; +use warnings; +use DW::Routing; +use DW::Graphs; + +DW::Routing->register_string("/stats/accounts_by_type", \&accounts_by_type, app => 1); + +DW::Routing->register_string("/stats/active_community_accounts", + \&active_community_accounts, app => 1); + +DW::Routing->register_string("/stats/active_identity_accounts", + \&active_identity_accounts, app => 1); + +DW::Routing->register_string("/stats/active_personal_accounts", + \&active_personal_accounts, app => 1); + +DW::Routing->register_string("/stats/paid_accounts", \&paid_accounts, app => 1); + +=head2 C<< DW::Controller::Graphs::accounts_by_type( ) >> + +Generates a pie chart displaying Accounts by type, which is displayed at /stats/site + +=cut + +sub accounts_by_type { + my $r = DW::Request->get; + + # Get the values to be graphed + my $personal = $r->get_args->{personal}; + my $identity = $r->get_args->{identity}; + my $community = $r->get_args->{community}; + my $syndicated = $r->get_args->{syndicated}; + + # Get labels for the graph + my $personal_label = $r->get_args->{personal_label}; + my $identity_label = $r->get_args->{identity_label}; + my $community_label = $r->get_args->{community_label}; + my $syndicated_label = $r->get_args->{syndicated_label}; + + # Package the input for the DW::Graphs + my $hashref = { + "$personal_label\n $personal" => $personal, + "$identity_label\n $identity" => $identity, + "$community_label\n $community" => $community, + "$syndicated_label\n $syndicated" => $syndicated, + }; + + # create an image + my $gd = DW::Graphs::pie( $hashref ); + + # return the image + $r->content_type("image/png"); + $r->print( $gd->png ); + return $r->OK; +} + +=head2 C<< DW::Controller::Graphs::active_community_accounts( ) >> + +Generates a bar chart displaying Active community accounts, +divided into paid and free accounts, which is displayed at /stats/site. + +=cut + +sub active_community_accounts { + my $r = DW::Request->get; + + # Get the values to be graphed + my $active_free_c = $r->get_args->{active_free_c}; + my $active_allpaid_c = $r->get_args->{active_allpaid_c}; + + my $active_7d_free_c = $r->get_args->{active_7d_free_c}; + my $active_7d_allpaid_c = $r->get_args->{active_7d_allpaid_c}; + + my $active_1d_free_c = $r->get_args->{active_1d_free_c}; + my $active_1d_allpaid_c = $r->get_args->{active_1d_allpaid_c}; + + # Get various labels for the graph + my $bar_paid_label = $r->get_args->{bar_paid_label}; + my $bar_free_label = $r->get_args->{bar_free_label}; + my $bar_30d_label = $r->get_args->{bar_30d_label}; + my $bar_7d_label = $r->get_args->{bar_7d_label}; + my $bar_1d_label = $r->get_args->{bar_1d_label}; + + # Two datasets: paid and free + my @paid_dataset = ( $active_1d_allpaid_c, $active_7d_allpaid_c, $active_allpaid_c ); + my @free_dataset = ( $active_1d_free_c, $active_7d_free_c, $active_free_c ); + + my @labels = ( $bar_1d_label, $bar_7d_label, $bar_30d_label ); + my $names = [ $bar_free_label, $bar_paid_label ]; + + # Package the input for the Graphs module + my $input = [ [@labels], [@free_dataset], [@paid_dataset] ]; + + # create an image (x and y labels not wanted so pass empty strings) + my $gd = DW::Graphs::bar2($input, '', '', $names); + + # return the image + $r->content_type("image/png"); + $r->print( $gd->png ); + return $r->OK; +} + +=head2 C<< DW::Controller::Graphs::active_identity_accounts( ) >> + +Generates a bar chart displaying Active identity accounts, +divided into paid and free accounts, which is displayed at /stats/site. + +=cut + +sub active_identity_accounts { + my $r = DW::Request->get; + + # Get the values to be graphed + my $active_free_i = $r->get_args->{active_free_i}; + my $active_allpaid_i = $r->get_args->{active_allpaid_i}; + + my $active_7d_free_i = $r->get_args->{active_7d_free_i}; + my $active_7d_allpaid_i = $r->get_args->{active_7d_allpaid_i}; + + my $active_1d_free_i = $r->get_args->{active_1d_free_i}; + my $active_1d_allpaid_i = $r->get_args->{active_1d_allpaid_i}; + + # Get labels for the graph + my $bar_paid_label = $r->get_args->{bar_paid_label}; + my $bar_free_label = $r->get_args->{bar_free_label}; + my $bar_30d_label = $r->get_args->{bar_30d_label}; + my $bar_7d_label = $r->get_args->{bar_7d_label}; + my $bar_1d_label = $r->get_args->{bar_1d_label}; + + # Two datasets: paid and free + my @paid_dataset = ( $active_1d_allpaid_i, $active_7d_allpaid_i, $active_allpaid_i ); + my @free_dataset = ( $active_1d_free_i, $active_7d_free_i, $active_free_i ); + + my @labels = ( $bar_1d_label, $bar_7d_label, $bar_30d_label ); + my $names = [ $bar_free_label, $bar_paid_label ]; + + # Package the input for the Graphs module + my $input = [ [@labels], [@free_dataset], [@paid_dataset] ]; + + # create an image (x and y labels not wanted so pass empty strings) + my $gd = DW::Graphs::bar2($input, '', '', $names); + + # return the image + $r->content_type("image/png"); + $r->print( $gd->png ); + return $r->OK; +} + +=head2 C<< DW::Controller::Graphs::active_personal_accounts( ) >> + +Generates a bar chart displaying Active personal accounts, +divided into paid and free accounts, which is displayed at /stats/site. + +=cut + +sub active_personal_accounts { + my $r = DW::Request->get; + + # Get values to be graphed + my $active_free_p = $r->get_args->{active_free_p}; + my $active_allpaid_p = $r->get_args->{active_allpaid_p}; + + my $active_7d_free_p = $r->get_args->{active_7d_free_p}; + my $active_7d_allpaid_p = $r->get_args->{active_7d_allpaid_p}; + + my $active_1d_free_p = $r->get_args->{active_1d_free_p}; + my $active_1d_allpaid_p = $r->get_args->{active_1d_allpaid_p}; + + # Get labels for the graph + my $bar_paid_label = $r->get_args->{bar_paid_label}; + my $bar_free_label = $r->get_args->{bar_free_label}; + my $bar_30d_label = $r->get_args->{bar_30d_label}; + my $bar_7d_label = $r->get_args->{bar_7d_label}; + my $bar_1d_label = $r->get_args->{bar_1d_label}; + + # Two datasets: paid and free + my @paid_dataset = ( $active_1d_allpaid_p, $active_7d_allpaid_p, $active_allpaid_p ); + my @free_dataset = ( $active_1d_free_p, $active_7d_free_p, $active_free_p ); + + my @labels = ( $bar_1d_label, $bar_7d_label, $bar_30d_label ); + my $names = [ $bar_free_label, $bar_paid_label ]; + + # Package the input for the Graphs module + my $input = [ [@labels], [@free_dataset], [@paid_dataset] ]; + + # create an image (x and y labels not wanted so pass empty strings) + my $gd = DW::Graphs::bar2($input, '', '', $names); + + # return the image + $r->content_type("image/png"); + $r->print( $gd->png ); + return $r->OK; +} + +=head2 C<< DW::Controller::Graphs::paid_accounts( ) >> + +Generates a pie chart displaying Paid accounts, which is displayed at /stats/site. + +=cut + +sub paid_accounts { + my $r = DW::Request->get; + + # Get values to be graphed + my $paid = $r->get_args->{paid}; + my $premium = $r->get_args->{premium}; + my $seed = $r->get_args->{seed}; + my $active_30d_free = $r->get_args->{active_30d_free}; + + # Get labels for the graph + my $paid_label = $r->get_args->{paid_label}; + my $premium_label = $r->get_args->{premium_label}; + my $seed_label = $r->get_args->{seed_label}; + my $active_free_label = $r->get_args->{active_free_label}; + + # Package the input for DW::Graphs + my $input = { + "$paid_label\n $paid" => $paid, + "$premium_label\n $premium" => $premium, + "$seed_label\n $seed" => $seed, + "$active_free_label\n $active_30d_free" => $active_30d_free, + }; + # create an image + my $gd = DW::Graphs::pie( $input ); + + # return the image + $r->content_type("image/png"); + $r->print( $gd->png ); + return $r->OK; +} + +1; diff -r f4cdf352d249 -r 352f57a7ecbf cgi-bin/DW/Controller/SiteStats.pm --- a/cgi-bin/DW/Controller/SiteStats.pm Tue Sep 07 15:45:57 2010 +0800 +++ b/cgi-bin/DW/Controller/SiteStats.pm Tue Sep 07 16:17:49 2010 +0800 @@ -102,8 +102,10 @@ sub _dashes_to_underlines { Public stats data -Returns hashref of variables to pass to the template. Note: doesn't check -or care whether user should have access. That's for the caller to do. +Returns hashref of variables to pass to the template. For example, +$vars->{accounts_by_type}->{personal} has a value equal to the number of +personal accounts. Note: doesn't check or care whether user should have +access. That's for the caller to do. =cut @@ -134,6 +136,84 @@ sub public_data { @{$paid->keylist} } if defined $paid; + # Now we have all the raw data we need, but need to calculate some quantities: + + # Total personal and community accounts + $vars->{accounts_by_type}->{total_PC} = + $vars->{accounts_by_type}->{personal} + + $vars->{accounts_by_type}->{community}; + + # Total active personal and community accounts + $vars->{active_accounts}->{active_PC} = + $vars->{active_accounts}->{active_30d_free_P} + + $vars->{active_accounts}->{active_30d_paid_P} + + $vars->{active_accounts}->{active_30d_premium_P} + + $vars->{active_accounts}->{active_30d_seed_P} + + $vars->{active_accounts}->{active_30d_free_C} + + $vars->{active_accounts}->{active_30d_paid_C} + + $vars->{active_accounts}->{active_30d_premium_C} + + $vars->{active_accounts}->{active_30d_seed_C}; + + # Total active allpaid (paid, premium, and seed) accounts + $vars->{active_accounts}->{active_allpaid} = + $vars->{active_accounts}->{active_30d_paid} + + $vars->{active_accounts}->{active_30d_premium} + + $vars->{active_accounts}->{active_30d_seed}; + + # Total active allpaid (paid, premium, and seed) personal accounts + $vars->{active_accounts}->{active_allpaid_P} = + $vars->{active_accounts}->{active_30d_paid_P} + + $vars->{active_accounts}->{active_30d_premium_P} + + $vars->{active_accounts}->{active_30d_seed_P}; + + # Total allpaid personal accounts active in the past 7 days + $vars->{active_accounts}->{active_7d_allpaid_P} = + $vars->{active_accounts}->{active_7d_paid_P} + + $vars->{active_accounts}->{active_7d_premium_P} + + $vars->{active_accounts}->{active_7d_seed_P}; + + # Total allpaid personal accounts active in the past 1 day + $vars->{active_accounts}->{active_1d_allpaid_P} = + $vars->{active_accounts}->{active_1d_paid_P} + + $vars->{active_accounts}->{active_1d_premium_P} + + $vars->{active_accounts}->{active_1d_seed_P}; + + # Total active allpaid community accounts + $vars->{active_accounts}->{active_allpaid_C} = + $vars->{active_accounts}->{active_30d_paid_C} + + $vars->{active_accounts}->{active_30d_premium_C} + + $vars->{active_accounts}->{active_30d_seed_C}; + + # Total allpaid community accounts active in the past 7 days + $vars->{active_accounts}->{active_7d_allpaid_C} = + $vars->{active_accounts}->{active_7d_paid_C} + + $vars->{active_accounts}->{active_7d_premium_C} + + $vars->{active_accounts}->{active_7d_seed_C}; + + # Total allpaid community accounts active in the past 1 day + $vars->{active_accounts}->{active_1d_allpaid_C} = + $vars->{active_accounts}->{active_1d_paid_C} + + $vars->{active_accounts}->{active_1d_premium_C} + + $vars->{active_accounts}->{active_1d_seed_C}; + + # Total active allpaid identity accounts + $vars->{active_accounts}->{active_allpaid_I} = + $vars->{active_accounts}->{active_30d_paid_I} + + $vars->{active_accounts}->{active_30d_premium_I} + + $vars->{active_accounts}->{active_30d_seed_I}; + + # Total allpaid identity accounts active in the past 7 days + $vars->{active_accounts}->{active_7d_allpaid_I} = + $vars->{active_accounts}->{active_7d_paid_I} + + $vars->{active_accounts}->{active_7d_premium_I} + + $vars->{active_accounts}->{active_7d_seed_I}; + + # Total allpaid identity accounts active in the past 1 day + $vars->{active_accounts}->{active_1d_allpaid_I} = + $vars->{active_accounts}->{active_1d_paid_I} + + $vars->{active_accounts}->{active_1d_premium_I} + + $vars->{active_accounts}->{active_1d_seed_I}; + return $vars; } @@ -151,7 +231,7 @@ sub admin_data { <<COMMENT; -FIXME: remove this when you have implemented them all +FIXME: remove this when you have implemented them all * Number of accounts, total (done) * Number of accounts active (done) diff -r f4cdf352d249 -r 352f57a7ecbf htdocs/stc/sitestats.css --- a/htdocs/stc/sitestats.css Tue Sep 07 15:45:57 2010 +0800 +++ b/htdocs/stc/sitestats.css Tue Sep 07 16:17:49 2010 +0800 @@ -3,3 +3,8 @@ table.stats-matrix { border-collapse: co table.stats-matrix { border-collapse: collapse; } table.stats-matrix th { width: 10em; } table.stats-matrix td { padding: 0.3em 3em; text-align: center; } + +img.piechart { width: 200px; padding-top: 0.5em; padding-bottom: 1em; } +img.bargraph { width: 300px; } + +.graphtitle { font-size: 1.1em; font-weight: normal; color:#c1272d; padding-top: 2em; } diff -r f4cdf352d249 -r 352f57a7ecbf views/stats/site.tt --- a/views/stats/site.tt Tue Sep 07 15:45:57 2010 +0800 +++ b/views/stats/site.tt Tue Sep 07 16:17:49 2010 +0800 @@ -22,13 +22,33 @@ the same terms as Perl itself. For a cop <h2>[% '.accounts.title' | ml %]</h2> [%# number of accounts (total+by type) %] + [% IF accounts_by_type.defined %] <ul> - [% FOREACH t = [ 'total' 'personal' 'identity' ] %] + [% FOREACH t = [ 'total' 'personal' 'identity' 'community' 'syndicated' ] %] <li>[% ".accounts.bytype.$t" | ml %] [% accounts_by_type.$t %]</li> [% END %] </ul> [% total_pc = accounts_by_type.personal + accounts_by_type.community %] + +[%# Accounts by type pie chart %] +<h3 class="graphtitle">[% '.graphtitle.accounts' | ml %]</h3> +<img src="accounts_by_type?personal=[% accounts_by_type.personal ~%] + &community=[% accounts_by_type.community ~%] + &identity=[% accounts_by_type.identity ~%] + &syndicated=[% accounts_by_type.syndicated ~%] + &personal_label=[% '.label.personal' | ml ~%] + &community_label=[% '.label.community' | ml ~%] + &identity_label=[% '.label.identity' | ml ~%] + &syndicated_label=[% '.label.syndicated' | ml %]" +class="piechart" alt="" /> +<p> +[% '.accounts.explanation.personal' | ml %] +[% '.accounts.explanation.community' | ml %] +[% '.accounts.explanation.identity' | ml %] +[% '.accounts.explanation.syndicated' | ml %] +</p> + [% ELSE %] [% '.error.notavailable' | ml %] [% END %] @@ -56,8 +76,72 @@ the same terms as Perl itself. For a cop [% '.error.notavailable' | ml %] [% END %] +[%# Active personal accounts bar chart %] +<h3 class="graphtitle">[% '.graphtitle.active.personal' | ml %]</h3> +<img src="active_personal_accounts?active_free_p=[% active_accounts.active_30d_free_P ~%] + &active_allpaid_p=[% active_accounts.active_allpaid_P ~%] + &active_7d_free_p=[% active_accounts.active_7d_free_P ~%] + &active_7d_allpaid_p=[% active_accounts.active_7d_allpaid_P ~%] + &active_1d_free_p=[% active_accounts.active_1d_free_P ~%] + &active_1d_allpaid_p=[% active_accounts.active_1d_allpaid_P ~%] + &bar_paid_label=[% '.label.bar.paid' | ml ~%] + &bar_free_label=[% '.label.bar.free' | ml ~%] + &bar_30d_label=[% '.label.bar.30d' | ml ~%] + &bar_7d_label=[% '.label.bar.7d' | ml ~%] + &bar_1d_label=[% '.label.bar.1d' | ml %]" +alt="[% '.active.free30' | ml %] [% active_accounts.active_30d_free_P %]; + [%= '.active.paid30' | ml %] [% active_accounts.active_allpaid_P %]; + [%= '.active.free7' | ml %] [% active_accounts.active_7d_free_P %]; + [%= '.active.paid7' | ml %] [% active_accounts.active_7d_allpaid_P %]; + [%= '.active.free1' | ml %] [% active_accounts.active_1d_free_P %]; + [%= '.active.paid1' | ml %] [% active_accounts.active_1d_allpaid_P %]" +class="bargraph" /> + +[%# Active community accounts bar chart %] +<h3 class="graphtitle">[% '.graphtitle.active.community' | ml %]</h3> +<img src="active_community_accounts?active_free_c=[% active_accounts.active_30d_free_C ~%] + &active_allpaid_c=[% active_accounts.active_allpaid_C ~%] + &active_7d_free_c=[% active_accounts.active_7d_free_C ~%] + &active_7d_allpaid_c=[% active_accounts.active_7d_allpaid_C ~%] + &active_1d_free_c=[% active_accounts.active_1d_free_C ~%] + &active_1d_allpaid_c=[% active_accounts.active_1d_allpaid_C ~%] + &bar_paid_label=[% '.label.bar.paid' | ml ~%] + &bar_free_label=[% '.label.bar.free' | ml ~%] + &bar_30d_label=[% '.label.bar.30d' | ml ~%] + &bar_7d_label=[% '.label.bar.7d' | ml ~%] + &bar_1d_label=[% '.label.bar.1d' | ml %]" +alt="[% '.active.free30' | ml %] [% active_accounts.active_30d_free_C %]; + [%= '.active.paid30' | ml %] [% active_accounts.active_allpaid_C %]; + [%= '.active.free7' | ml %] [% active_accounts.active_7d_free_C %]; + [%= '.active.paid7' | ml %] [% active_accounts.active_7d_allpaid_C %]; + [%= '.active.free1' | ml %] [% active_accounts.active_1d_free_C %]; + [%= '.active.paid1' | ml %] [% active_accounts.active_1d_allpaid_C %]" +class="bargraph" /> + +[%# Active identity accounts bar graph %] +<h3 class="graphtitle">[% '.graphtitle.active.identity' | ml %]</h3> +<img src="active_identity_accounts?active_free_i=[% active_accounts.active_30d_free_I ~%] + &active_allpaid_i=[% active_accounts.active_allpaid_I ~%] + &active_7d_free_i=[% active_accounts.active_7d_free_I ~%] + &active_7d_allpaid_i=[% active_accounts.active_7d_allpaid_I ~%] + &active_1d_free_i=[% active_accounts.active_1d_free_I ~%] + &active_1d_allpaid_i=[% active_accounts.active_1d_allpaid_I ~%] + &bar_paid_label=[% '.label.bar.paid' | ml ~%] + &bar_free_label=[% '.label.bar.free' | ml ~%] + &bar_30d_label=[% '.label.bar.30d' | ml ~%] + &bar_7d_label=[% '.label.bar.7d' | ml ~%] + &bar_1d_label=[% '.label.bar.1d' | ml %]" +alt="[% '.active.free30' | ml %] [% active_accounts.active_30d_free_I %]; + [%= '.active.paid30' | ml %] [% active_accounts.active_allpaid_I %]; + [%= '.active.free7' | ml %] [% active_accounts.active_7d_free_I %]; + [%= '.active.paid7' | ml %] [% active_accounts.active_7d_allpaid_I %]; + [%= '.active.free1' | ml %] [% active_accounts.active_1d_free_I %]; + [%= '.active.paid1' | ml %] [% active_accounts.active_1d_allpaid_I %]" +class="bargraph" /> + [%# Paid accounts (by level), with % of total (P+C) and active %] <h2>[% '.paid.title' | ml %]</h2> +<p>[% '.paid.explanation' | ml %]</p> [% IF paid.defined %] <table class='stats-matrix'><tr> [% FOREACH h = [ 'level' 'number' 'pct_total' 'pct_active' ] %] @@ -85,3 +169,15 @@ the same terms as Perl itself. For a cop [% ELSE %] [% '.error.notavailable' | ml %] [% END %] + +[%# Paid accounts pie chart %] +<h3 class="graphtitle">[% '.graphtitle.paid' | ml %]</h3> +<img src="paid_accounts?paid=[% active_accounts.active_30d_paid ~%] + &premium=[% active_accounts.active_30d_premium ~%] + &seed=[% active_accounts.active_30d_seed ~%] + &active_30d_free=[% active_accounts.active_30d_free ~%] + &paid_label=[% '.label.active_paid' | ml ~%] + &premium_label=[% '.label.active_premium' | ml ~%] + &seed_label=[% '.label.active_seed' | ml ~%] + &active_free_label=[% '.label.active_free' | ml %]" +alt="" class='piechart' /> diff -r f4cdf352d249 -r 352f57a7ecbf views/stats/site.tt.text --- a/views/stats/site.tt.text Tue Sep 07 15:45:57 2010 +0800 +++ b/views/stats/site.tt.text Tue Sep 07 16:17:49 2010 +0800 @@ -1,12 +1,4 @@ ;; -*- coding: utf-8 -*- - -.accounts.bytype.total=Total: - -.accounts.bytype.personal=Personal (users): - -.accounts.bytype.identity=External identity (OpenID, etc.): - -.accounts.title=Number of accounts .active.bytime.active_1d=Last 24 hours: @@ -14,11 +6,85 @@ .active.bytime.active_30d=Last 30 days: +.accounts.bytype.community=Community: + +.accounts.bytype.identity=External identity (OpenID, etc.): + +.accounts.bytype.personal=Personal (users): + +.accounts.bytype.syndicated=Syndicated: + +.accounts.bytype.total=Total: + +.accounts.explanation.community=<em>Community</em>: communities based around some shared interest.<br /> + +.accounts.explanation.identity=<em>External identity</em>: accounts where the user doesn't have a Dreamwidth user name, but instead logs in with <a href="http://www.dreamwidth.org/openid/">OpenID</a>.<br /> + +.accounts.explanation.personal=<em>Personal</em>: personal accounts.<br /> + +.accounts.explanation.syndicated=<em>Syndicated</em>: accounts which display an Atom or RSS feed originatingfrom some other site.<br /> + +.accounts.title=Number of accounts + .active.desc=These are accounts who logged in, posted an entry, commented, or edited a comment during the period indicated. For entries posted to communities, both the poster and the community are counted. + +.active.free1=free accounts active in the past 1 day: + +.active.paid1=paid accounts active in the past 1 day: + +.active.free7=free accounts active in the past 7 days: + +.active.paid7=paid accounts active in the past 7 days: + +.active.free30=free accounts active in the past 30 days: + +.active.paid30=paid accounts active in the past 30 days: .active.title=Active accounts .error.notavailable=(Sorry, those statistics aren't available right now.) + +.graphtitle.active.community=Bar graph: Community accounts which have<br /> been active in the past 1 day, 7 days, and 30 days + +.graphtitle.active.identity=Bar graph: Identity accounts which have<br /> been active in the past 1 day, 7 days, and 30 days + +.graphtitle.active.personal=Bar graph: Personal accounts which have been active<br /> in the past 1 day, 7 days, and 30 days + +.graphtitle.accounts=Pie chart: Dreamwidth accounts,<br /> divided by account type: + +.graphtitle.paid=Pie chart: Active accounts: paid,<br />paid-premium, paid-seed, and free: + +.label.active_free=active free + +.label.active_paid=active paid + +.label.active_premium=active prem. + +.label.active_seed=active seed + +.label.bar.1d=1 day + +.label.bar.7d=7 days + +.label.bar.30d=30 days + +.label.bar.free=free + +.label.bar.paid=paid + +.label.community=community + +.label.identity=identity + +.label.paid=paid + +.label.personal=personal + +.label.premium=premium + +.label.seed=seed + +.label.syndicated=syndicated .note.roundedtonearesttenthofpct=Note: all percentages are rounded (up or down) to the nearest 0.1%. @@ -29,6 +95,8 @@ .paid.colhdr.pct_total=% of total accounts .paid.colhdr.pct_active=% of active accounts + +.paid.explanation=There are two levels of paid accounts, 'paid' and 'premium paid', which offer extra services compared to free accounts. 'Seed' accounts offer the level of services as 'premium paid', but are permanent. <a href="http://www.dreamwidth.org/support/faqbrowse?faqid=4">Information on paid accounts</a>. .paid.rowhdr.activepaid=Active paid/premium/seed --------------------------------------------------------------------------------