{ "info": { "author": "Matt Yoder", "author_email": "mattyoder@groundwire.org", "bugtrack_url": null, "classifiers": [ "Development Status :: 5 - Production/Stable", "Framework :: Plone", "Framework :: Plone :: 4.3", "Framework :: Plone :: 5.0", "Framework :: Plone :: 5.1", "Intended Audience :: System Administrators", "License :: OSI Approved :: GNU General Public License (GPL)", "Operating System :: OS Independent", "Programming Language :: JavaScript", "Programming Language :: Python", "Programming Language :: Python :: 2.7", "Topic :: Internet :: Log Analysis", "Topic :: Internet :: WWW/HTTP :: Site Management", "Topic :: Software Development :: Libraries :: Python Modules" ], "description": "Introduction\n============\ncollective.googleanalytics is a product that integrates Plone with Google\nAnalytics. It includes both tracking and reporting functionality. The product\nenables easy tracking of the standard Google statistics as well as external\nlinks, e-mail address clicks and file downloads. It also defines Analytics\nreports that are used to query Google and display the results using Google\nVisualizations. Reports are Zope objects that can be imported and exported\nusing GenericSetup XML and modified on a site-by-site basis. The product\ncurrently provides a portlet that can display results of reports as well\nas a control panel for authorizing your site and configuring settings.\n\n.. contents::\n\n\n.. image:: https://secure.travis-ci.org/collective/collective.googleanalytics.png\n :target: http://travis-ci.org/collective/collective.googleanalytics\n\n\nInstallation\n============\nTo install collective.googleanalytics, add it to the eggs section of your buildout. Then\nre-run buildout and restart Zope.\n\nOn Plone 3\n----------\n\nOn Plone 3 it is recommended to use the following version pins::\n\n [versions]\n collective.googleanalytics = 1.4.1\n gdata = 2.0.17\n simplejson = 2.3.3\n\nConfiguration\n=============\nWhen you install the product from the Plone Add-ons control panel, a new\ncontrol panel called Google Analytics will be added to your Plone site.\nIn this control panel, you can authorize the site to access your Google\nAnalytics data. If you receive an error when you attempt to authorize, see\nthe section on `Registering a Domain`_ below.\n\nAfter authorizing your site, you can select the profile where you want to\ntrack analytics for this site. Choose a profile from the dropdown menu. If you\ndo not see any profiles listed, make sure that your Google Analytics account\nhas access to at least one profile. Also, be sure to remove any Google\nAnalytics tracking code that you may have pasted in the Site control panel.\n\nOnce you have selected a profile for tracking, you can choose which tracking\nplugins to enable. Tracking plugins allow you to track events on your site\nin Google Analytics in addition to the normal data on page views and visits.\nWhich plugins you have available to you depends on which products you have\ninstalled. For information on the default tracking plugins, see the\nsection on `Tracking Plugins`_ below.\n\nFinally, you can choose roles to exclude from tracking. Google Analytics\ndata will not be recorded for users with the selected roles. Note that this\nsetting does not affect the inclusion of scripts specified in the Site\ncontrol panel.\n\nOn the settings tab, you can also configure the amount of time, in minutes,\nthat account information and report results will be cached, reducing the need\nto query Google. Sixty minutes is the default caching interval.\n\nRegistering a Domain\n====================\nWhen you authorize your site to access your Google Analytics data, you may\nreceive an error::\n\n The site \"http://example.com\" has not been registered.\n\nWhen this happens, you need to register your domain with Google before you\ncan authorize your site. Follow steps 1-3 of Google's `directions for\nregistering a new domain`__. In step two, you can upload the file provided\nby Google to your Plone site root. Be sure to use the File content type, and\nmake sure that the short name matches the filename specified by Google.\n\n__ http://code.google.com/apis/accounts/docs/RegistrationForWebAppsAuto.html#new\n\nTracking Plugins\n================\n\ncollective.googleanalytics ships with four tracking plugins:\n\nComments\n This plugin records a tracking event in Google Analytics for each comment\n created on your site.\n\nEmail links\n This plugin records a tracking event in Google Analytics each time a\n visitor clicks on a \"mailto:\" link.\n\nExternal links\n This plugin records a tracking event in Google Analytics each at time a\n visitor clicks on a link with a domain name different from the domain\n name of your site.\n\nFile downloads\n This plugin records a tracking event in Google Analytics each time a\n visitor clicks on a link to a file with one of these extensions: avi, css,\n doc, eps, exe, jpg, js, mov, mp3, pdf, png, ppt, rar, svg, txt, vsd, vxd,\n wma, wmv, xls, zip.\n\nUsing Reports\n=============\nAfter you have authorized your site in the control panel, you can begin using\nAnalytics reports. First navigate to the page where you would like to display\nthe report results. Where you place the portlet depends on your goals and the\ntype of reports you are displaying. Even if you place a portlet on a public\npage, the portlet will only be visible to users who have the \"View Google\nAnalytics Reports\" permission, which, by default is assigned to Managers.\n\nNext, place the portlet as you normally would, using the manage portlets page\nand selecting Google Analytics from the list of available portlets. In the\nportlet add form, you can set the title of the portlet, the profile the portlet\nwill use and the reports it will display. Note that the title of the portlet is\nnot the same as the title of the report, which is displayed inside the portlet.\nThe profile is the Google property where the statistics that you want to access\nlive. Which profiles you can select within the portlet depends on which\nprofiles the Analytics account you provide to Plone can access. If you do not\nsee any profiles in the dropdown menu, check to be sure that you have\nauthorized your site in the Google Analytics control panel.\n\nYou can select more than one report to display within a single portlet. Each\nreport performs its own query to Google, however, so including many reports\non a single page may cause a decrease in performance. To change the order of\nthe reports within a portlet, see the section on `Managing Reports`_ below.\n\nOnce you have set the portlet title and profile and selected one or more\nreports, click save to add the portlet. When you navigate to the page where\nyou assigned the portlet, you should see the results of your report.\n\nManaging Reports\n================\ncollective.googleanalytics ships with twelve default reports:\n\nSite-Wide Reports\n-----------------\n* Site Visits: Line Chart\n* Top 5 Pages: Table\n* Top 5 Sources: Table\n* Site Page Views: Line Chart\n* Time on Site: Line Chart\n* Site Unique Visitors: Line Chart\n\nPage-Specific Reports\n---------------------\n* Page Views: Sparkline\n* Time on Page: Sparkline\n* Top 10 Page Sources: Table\n* Top 10 Keywords: Table\n* Top 5 Previous Pages: Table\n* Top 5 Next Pages: Table\n\nReports live in a Plone tool called portal_analytics. To view and modify\nreports, navigate to the root of the site in the ZMI and click on the\nportal_analytics utility. Since they are standard Zope objects, reports can\nbe copied, pasted, renamed, deleted, imported and exported using the Zope\nbuttons beneath the list of reports. They can also be moved up and down in\nthe list using the up, down, top and bottom buttons. The order of reports\nin portal_analytics controls the order that they will appear in portlets\nthroughout the site.\n\nThe Report Rendering Process\n============================\n\nBy default, Analytics reports are rendered asynchronously using jQuery. This\nimproves site performance by allowing the body of page to render without\nwaiting for a response from Google Analytics. The basic flow of a request\nthat renders an Analytics report might go as follows:\n\n1. A user requests the content item front-page, which has a Google Analytics\n portlet assigned in the right column.\n\n2. Plone renders front-page as usual. When it renders the Google Analytics\n portlet, it looks up a loader component.\n\n3. Instead of requesting the actual results, the loader produces javascript\n that will load the results after the page has finished loading. It also\n produces javascript to load the visualization modules that the reports\n will require.\n\n4. The javascript from the loader is included with front-page when it is\n rendered. As soon as the page has finished loading, the javascript produced\n by the loader is activated. It sends another request to the server that\n includes the requested reports and any options for evaluating them.\n\n5. A browser view associated with the loader is called as part of the\n asynchronous request. (The context for this browser view is still\n front-page.) This browser view loads the specified reports.\n\n6. For each report in the request, the browser view looks up a renderer,\n which is a multi-adapter on the current context (front-page), request\n (the asynchronous request) and the report.\n\n7. The renderer renders the report or returns a cached result if one exists.\n The browser view combines the results from all of the requested reports and\n returns them.\n\n8. The results returned by the renderer are injected into the portlet. In the\n process, jQuery evaluates any javascript in the results, including the\n javascript that produces the visualization.\n\nReport Properties\n=================\nAnalytics reports are persistent Zope objects that store the arguments used to\nquery Google and the options needed to display the query result as a Google\nVisualization. They store this information as properties on themselves. These\nproperties can be set using GenericSetup XML or through the web in the ZMI.\n\nIt may be helpful to think of Analytics reports as having five logical\nsections, each of which has its own properties:\n\n* `Report settings`_\n* `Query criteria`_\n* `Table builder`_\n* `Visualization settings`_\n* `Report body`_\n\nReport settings\n---------------\n\nThe report settings section consists of five properties that control the\ndisplay and behavior of the report. None of these properties accept\nTAL or TALES.\n\nTitle\n\tThe title of the report in the management interface. This is the title that\n\tthat the user selects when assigning a portlet.\n\nDescription\n\tA brief description of the report. The description is mainly for developer\n\treference and never appears in the Plone user interface.\n\nI18n Domain\n\tThe domain for translating the report.\n\nCategories\n A list of categories to which the report belongs. Categories are used to\n determine where the report can be displayed.\n\nPlugins\n Plugins are multi-adapters on the context, the request and the report\n that extend the default functionality of the report. Two plugins ship\n with collective.googleanalytics. See the sections on `Contextual Results\n Plugin`_ and `Variable Date Range Plugin`_ for more details.\n\n Note that some plugins add additional dimension, metric and visualization\n choices, which are not available until the report is saved. As a result,\n it is generally a good idea to save the report immediately after adding\n or removing any plugin.\n\nQuery criteria\n--------------\n\nThe query criteria section of the report is made up of all the properties\nthat begin with the word query. These properties determine the query that is\nsent to Google to retrieve Analytics data. All of these properties accept\nTALES expressions. They have access to the TALES variables defined in the\nsection on `Using TAL and TALES in Reports`_ as well as any TALES objects\nprovided by the selected plugins.\n\nQuery Metrics\n\tA list of Google Analytics metrics to use in the query.\n\nQuery Dimensions\n\tA list of Google Analytics dimensions to return in the query. This list can\n\tinclude the special dimension variables date_range_dimension and\n\tdate_range_sort_dimension. For more information on using these dimension,\n\tsee the section on the `Variable Date Range Plugin`_.\n\nQuery Filters\n\tA list of filters to use in the query. Filters are defined as strings or\n\tTALES expressions that evaluate to strings in the format METRIC==VALUE,\n\twhere METRIC is the name of a Google Analytics metric or dimension,\n\tVALUE is the desired value, and == is the appropriate logical operator.\n\nQuery Sort\n\tA list of metrics or dimensions on which to sort the query results. Sort\n\tparameters are defined using strings or TALES expressions that evaluate to\n\tstrings containing the name of a Google Analytics dimension or metric. In\n\taddition, the name of the dimension or metric can be preceded by a minus\n\tsign (-) to change the sort order from ascending to descending.\n\nQuery Start Date\n The start date for query results. It must be a TALES expression that\n evaluates to a Python datetime.date object. In reports that use the\n `Variable Date Range Plugin`_, it is not necessary to specify the\n start date or end date.\n\nQuery End Date\n The end date for the query results. See Query Start Date above for more\n information.\n\nQuery Maximum Results\n\tThe maximum number of results that the query can return. It must be a TALES\n\texpression that evaluates to a positive integer.\n\nTable builder\n-------------\n\nThe table builder section of the report includes three properties. Together\nthese properties are responsible for taking the query results returned by\nGoogle and transforming them into a results table that can be used in as the\ndata source for a visualization or otherwise displayed in the report body.\n\nIn order to perform this transformation, these three properties use TALES\nexpressions that return Python lists. The TALES expressions have access to\nthree special functions that allow them to extract data from the data feed\nreturned by Google:\n\ndimension(dimension, specified={}, aggregate=unique_list, default=[])\n Returns the value of the given dimension across the specified\n dimensions and metrics using the specified aggregation method\n (unique_list by default). If no values are found, the default value,\n an empty list by default, is returned.\n\n For example, the following TALES expression would return a list of all\n the browsers returned by the query::\n\n python:dimension('ga:browser')\n\nmetric(metric, specified={}, aggregate=sum, default=0)\n Returns the value of the given metric across the specified\n dimensions and metrics using the specified aggregation method (sum by\n default). If no values are found, the default value, 0 by default, is\n returned.\n\n To get the sum of the values of 'ga:visits' in records where\n 'ga:browser' equals 'Mozilla,' we could use this expression::\n\n python:metric('ga:visits', {'ga:browser': 'Mozilla'})\n\n In reports that use the `Variable Date Range Plugin`_, the value\n of the specified argument is often set to an element in the list\n returned by the possible_dates method.\n\npossible_dates(dimensions=[], aggregate=unique_list)\n Returns a list of dictionaries containing all possible values for\n the given date dimension in the current date range. If no dimensions\n are specified, all of the date dimensions in the query are used.\n\n This method is commonly used in place of the dimension method in\n reports that include date dimensions to ensure that the table contains\n one row for each date unit in the date range.\n\nThese three properties make up the table builder section of the report:\n\nTable Columns Expression\n\tThe titles for the table columns. It must be a TALES expression that evaluates\n\tto a Python list of strings. If and where these titles appear depends on\n\tthe type of visualization. For the Table visualization, for example, they\n\tappear as the table column headings.\n\n\tIn most reports, the table columns expression is a static Python list::\n\n\t python:['Visits']\n\n\tIt is, of course, possible to use TALES variables to populate the\n\tcolumns list::\n\n\t python:[date_range_unit, 'Visits']\n\n\tIn complex tables, the number of columns may be determined by the results\n\treturned by the query. In this example, the first column is \"Date\" and the\n\tnames of the remaining columns are the names of the browsers returned\n\tby the query::\n\n\t python:['Date'] + dimension('ga:browser')\n\nTable Row Repeat Expression\n The expression that produces the set of row keys used generate the rows in\n the results table. It is specified as a TALES expression that evaluates to\n a Python iterable with one element for each row in the final table.\n\n When the report renderer is asked for the results table rows, it first\n evaluates the row repeat expression. It then iterates over each element\n in the resulting list and evaluates the table rows expression with\n the current element assigned to the variable \"row.\"\n\n Typically the values of the row repeat expression are generated using the\n dimension function or the possible_dates function::\n\n python:dimension('ga:pagePath')\n\n or::\n\n possible_dates\n\n See the section on `Using TAL and TALES in Reports`_ for more information\n about the use of these functions.\n\nTable Rows Expression\n The contents of each table row. It is must be a TALES expression that\n evaluates to a Python list containing the value of the \"cells\" for that\n table row. The table rows expression has access to two special TALES\n varables:\n\n row\n The value of the row key for the row that is currently being evaluated.\n These values come from the list produced by evaluating the table row\n repeat expression.\n\n columns\n The list of table column headings produced by evaluating the table\n columns expression.\n\n In tables with only one column, the value of the rows expression is\n often the same as the value of the row key::\n\n python:[row]\n\n In two column tables, the value of one column is typically the row key,\n and the other is a metric value looked up using the row key::\n\n python:[row, metric('ga:visits', {'ga:browser': row})]\n\n In complex, multi-column tables, it may be necessary to iterate over the\n columns variable using a Python list comprehension::\n\n python:[row] + [metric('ga:visits', {'ga:browser': row, 'ga:operatingSystem': c}) for c in columns[1:]]\n\nVisualization settings\n----------------------\n\nThe visualizaiton settings section of the report consists of the\nvisualization type and visualization options properties. These properties\nare used to create javascript that uses the Google Visualizations API\nto render the data table produced by the table builder section above.\n\nVisualization Type\n\tThe type of Google Visualization to use to display the report results.\n\tThis property can be set to the name of any of the default visualizations\n\tprovided by Google.\n\nVisualization Options\n\tA list of options and values, in the format of TAL defines, that specify\n\tthe options for the visualization. The available options depend on the\n\ttype of visualization selected. It is important that the option expressions\n\tevaluate to the data type that the visualization expects.\n\n\tFor example, the height of a visualization that accepts an integer height\n\toption could be set as follows::\n\n\t\theight python:300\n\nReport body\n-----------\n\nThe report body consists of a single property that contains the TAL template\nfor the report. This block of TAL code is evaluated when the report is\nrendered. TALES expressions within this code have access to the normal objects\ndescribed in the section on `Using TAL and TALES in Reports`_. They also\ncan access all of the public methods provided by the report renderer. In the\nreport body, these methods must be accessed using view/method_name or\npython:view.method_name():\n\nprofile_ids()\n Returns a list of Google Analytics profiles for which the report\n is being evaluated.\n\nquery_criteria()\n Returns the evaluated query criteria.\n\ndata()\n Returns a list of dictionaries containing the values of the\n dimensions and metrics for each entry in the data feed returned\n by Google.\n\ncolumns()\n Returns the evaluated table column headings.\n\nrows()\n Returns the evaluated table rows.\n\nvisualization()\n Returns the rendered visualization.\n\ndimension(dimension, specified={}, aggregate=unique_list, default=[])\n Returns the value of the given metric across the specified\n dimensions and metrics using the specified aggregation method. See\n the description in the `Table builder`_ section above.\n\nmetric(metric, specified={}, aggregate=sum, default=0)\n Returns the value of the given metric across the specified\n dimensions and metrics using the specified aggregation method. See\n the description in the `Table builder`_ section above.\n\npossible_dates(dimensions=[], aggregate=unique_list)\n Returns a list of dictionaries containing all possible values for\n the given date dimension in the current date range. See the description\n in the `Table builder`_ section above.\n\nUsing TAL and TALES in Reports\n==============================\n\nMany of the properties of the Analytics report object accept TALES expressions\nor TAL as their values. (For information about which properties accept TALES\nand TAL, see the section on `Report Properties`_ above.) All of the TAL code\nand TALES expressions have access to a standard set of Python objects and\nvariables:\n\ncontext\n\tThe object on which the current view is being called. In most cases, this\n\tis the content object next to which the report will be displayed.\n\nrequest\n\tThe current request object. Since Analytics reports are rendered\n\tasynchronously, this request object is the asynchronous report request,\n\tnot the user's original request. The URL of the original request can be\n\tobtained by using request/request_url.\n\ndate\n\tAn alias for the datetime.date function.\n\ntimedelta\n\tAn alias for the datetime.timedelta function.\n\nunique_list\n A helper function that takes a Python list and returns a corresponding\n list where all duplicated elements in the original list have been removed.\n It differs from the Python set type in that it preserves the order of the\n original list.\n\nContextual Results Plugin\n=========================\n\nThis plugin provides tools to make reports page specific. It modifies the\ndefault caching policy to cache report results on a per-page basis instead\nof for the entire site. It also provides several helper TALES variables that\nsimplify the process of creating page-specific reports:\n\npage_url\n\tThe relative URL of the current request. This is most commonly used in\n\tthe query filters property for creating page-specific reports.\n\npage_filter\n A Google Analytics filter expression that matches records where the\n ga:pagePath record matches the current relative URL. It uses regular\n expression matching to match both URLs with and without the trailing\n slash.\n\nnextpage_filter\n A Google Analytics filter expression that matches records where the\n ga:nextPagePath record matches the current relative URL. It uses regular\n expression matching to match both URLs with and without the trailing\n slash.\n\npreviouspage_filter\n A Google Analytics filter expression that matches records where the\n ga:previousPagePath record matches the current relative URL. It uses regular\n expression matching to match both URLs with and without the trailing\n slash.\n\nVariable Date Range Plugin\n==========================\n\nAnalytics reports can specify fixed start and end dates for their queries.\nIt is generally more useful, however, to allow the date range to be set when\nthe report is evaluated. The Variable Date Range Plugin provides this\nfunctionality. In order to set the date range, it looks in the request for\none of these special keys:\n\nstart_date and end_date\n Dates in the form of YYYYMMDD.\n\ndate_range\n An integer specifying the number of days prior to the current date to use\n as the report start date. The end date is assumed to be the current date.\n The date_range argument can also accept a string keyword that evaluates\n to a particular date range depending on the current context. Current\n keywords include:\n\n week\n Last seven days.\n\n month\n Last 30 days.\n\n quarter\n Last 90 days.\n\n year\n Last 356 days.\n\n mtd\n Month-to-date.\n\n ytd\n Year-to-date.\n\n published\n Since the item was published.\n\nSince Analytics reports are rendered asynchronously, these keys must be set\nin the request sent by the asynchronous loader, not in the original request.\n\nSince dates for reports are dynamic, the plugin also provides two special\ndimensions that are date sensitive. This allows the granularity of the report\nresults to be set based on the date range selected. (For example, if you specify\na date range of a year, you probably don't want to segment your results by day.\nInstead, viewing results by month would be a more appropriate choice.) The two\nspecial dimensions are:\n\ndate_range_dimension\n This is the dimension, selected based on the date range, that will be used\n to segment the results.\n\ndate_range_sort_dimension\n This is the date-related dimension that is used as a helper to ensure that\n results segmented by date_range_dimension can be sorted chronologically.\n For example, if date_range_dimension evaluates to ga:week,\n date_rage_sort_dimension would evalute to ga:year. Using\n date_range_sort_dimension (along with date_range_dimension) when sorting\n prevents a situation in which week 52 of 2009 gets sorted before week 1\n of 2010.\n\nNote that that these two dimensions must be selected from the list of query\ndimensions to be included in the query. If they are not available in the list\nof possible dimensions, be sure to save the report after selecting the Variable\nDate Range Plugin from the list of plugins.\n\nThe plugin also provides two helper variables that are useful in report\ntemplates:\n\ndate_range_unit\n A string containing the human-readable name of the dimension specified\n by date_range_dimension (e.g. 'Day', 'Month', etc.)\n\ndate_range_unit_plural\n A convenience variable that contains date_range_unit with the letter\n 's' appended.\n\nCreating a New Report\n=====================\n\nNow that you are familiar with the properties that make up an Analytics report,\nit's time to try creating a new report from scratch. In this example, we will\ncreate a report that calculates and displays the site-wide bounce rate\nover a period of time segmented by browser.\n\nThis example presents a fairly complex report. For examples of simpler reports,\nconsult the default reports in portal_analytics. In many cases, you can\nprobably modify one of these reports to suit your needs by substituting\ndimensions and metrics. If, however, you find that you need to create a more\ncomplicated multi-dimensional report, read on:\n\n1. Navigate to the root of the site in the ZMI and click on the\n portal_analytics tool.\n\n2. Click the Add Google Analytics Report button.\n\n3. We'll give our new report the ID site-bounce-rate-browser-line,\n following the naming convention of the default reports. This naming\n convention is optional, but it helps to keep things organized. Then\n click the add button.\n\n4. Click on the new report to edit it. Give it a title of Site Bounce Rate\n By Browser: Line Chart and this description:\n\n This report displays the site-wide bounce rate segmented by the user's\n browser. It is useful for gauging how effective our site's new multimedia\n features are in each browser.\n\n5. Leave the i18n domain as collective.googleanalytics, the default value. If we\n were going to translate this report, we might use the domain defined in our\n site's theme product.\n\n6. From the list of categories, select Site Wide.\n\n7. From the list of plugins, select Variable Date Range. After making your\n selection, click the Save button to populate the list of dimensions with\n the new options.\n\n8. Now the difficult part: determining the arguments for our query. If we\n consult the common calculations page in the Google's Dimensions and Metrics\n Reference (see the section on `Where to Learn More`_ for the link), we see\n that bounce rate is calculated as follows::\n\n\t\tga:bounces/ga:entrances\n\n So, set the query metrics to ga:bounces and ga:entrances.\n\n9. We also know that we want to segment our results by browser, so we'll set\n our query dimension to ga:browser. Be sure to also select\n date_range_dimension and date_range_sort_dimension from the bottom\n of the dimensions list.\n\n10. In the query filters enter::\n\n ga:entrances>10\n\n Strictly speaking, we wouldn't need this filter. But for a site with a lot\n of traffic, we probably don't care about the results browsers for that\n have fewer than 10 entrances in a given period of time. So, we use this\n filter to eliminate them from the results.\n\n11. In the query sort box, enter the dimensions provided by the Variable Date\n Range Plugin::\n\n date_range_dimension\n date_range_sort_dimension\n\n12. In query maximum results, leave the default value, python:1000.\n\n13. Now that our query arguments are complete, we can work on our results\n table. Let's begin by drawing out what our table should look like:\n\n +-------+-----------+---------------------+----------+----------+\n | \"Day\" | \"Firefox\" | \"Internet Explorer\" | \"Safari\" | \"Chrome\" |\n +=======+===========+=====================+==========+==========+\n | \"5\" | 60 | 70 | 54 | 63 |\n +-------+-----------+---------------------+----------+----------+\n | \"6\" | 64 | 69 | 59 | 68 |\n +-------+-----------+---------------------+----------+----------+\n | \"7\" | 63 | 72 | 65 | 68 |\n +-------+-----------+---------------------+----------+----------+\n | Etc. |\n +-------+-----------+---------------------+----------+----------+\n\n Note that the day column contains strings, not integers. This is necessary\n so that the line chart visualization will treat these values as labels\n instead of data.\n\n14. Great! Now we can write the expressions to generate the table. Enter this\n expression in the table columns expression field::\n\n python:[date_range_unit] + dimension('ga:browser')\n\n This expression combines the value of the date_range_unit, which is\n provided by the Variable Date Range Plugin, with all of the possible\n values of the ga:browser dimension.\n\n15. For the table row repeat expression, enter::\n\n possible_dates\n\n This expression will populate the row keys with dictionaries that contain\n the values of date_range_dimension and date_range_sort_dimension. We use\n possible_dates instead of dimension(date_range_dimension) because we want\n one entry for every period of time in the current date range, even if there\n aren't any results for that particular period of time.\n\n16: In the table rows expression field, enter the following expression,\n removing the line breaks::\n\n python:[str(row[date_range_dimension])] +\n [int(100*float(metric('ga:bounces', row))/(float(metric('ga:entrances', row)) + 0.0001))\n for c in columns[1:] if not row.update({'ga:browser': c})]\n\n Whoa! That looks complicated! If we break down the expression into its\n parts, however, it's easy to see what's going on::\n\n [str(row[date_range_dimension])]\n\n This part of the expression creates a list with a single element: the value\n of date_range_dimension as a string. Recall that, in this expression, row\n is a dictionary that contains key-value pairs for date_range_expression\n and date_range_sort_expression.\n\n Now let's skip to the end of the expression::\n\n for c in columns[1:]\n\n This code serves as the repeat expression in a Python list comprehension\n that generates the bounce rate for each browser for the specified date.\n columns[1:] represents the list of browser names generated by\n dimension('ga:browser')::\n\n if not row.update({'ga:browser': c})\n\n This tricky bit of code updates the row dictionary to include the value of\n the current browser as it iterates over the list of browsers. That way we\n can pass row to the metric() method to get value of the metric for the\n date and browser we are currently evaluating. We use 'if not' because\n the update method returns None, which evaluates to False.\n\n Finally, the rest of the expression is just the math used to calculate\n the bounce rate::\n\n int(100*float(metric('ga:bounces', row))/(float(metric('ga:entrances', row)) + 0.0001))\n\n We have to convert the values we get back from metric() into floating point\n numbers so that the division operates as we expect. We also add a tiny\n number to the denominator to avoid getting a divide by zero error if the\n value of ga:entrances is zero. Finally, we multiply the result by 100 to\n get a percentage and round the result to the nearest integer.\n\n17. We're almost done! From the visualization type drop down menu, choose\n LineChart.\n\n18. In the visualization options box, enter these option definitions, one\n per line::\n\n title string:Bounce Rate By Browser\n height python:250\n titleX python:date_range_unit\n titleY string:Bounce Rate (%)\n smoothLine python:True\n\n These options are all aesthetic. Once you become familiar with Google\n visualizations, you can adjust them to fit your personal preferences. For\n a full list of the options available for each visualization, visit the\n Google Visualization Gallery referenced in the section on `Where to Learn\n More`_.\n\n19. In the report body field, enter this block of TAL code, which renders the\n line chart visualization::\n\n
\n\n18. You're done! Click the save button in the ZMI. Then test out your new\n report on the site as described in the section about `Using Reports`_.\n\nDefining Reports in a Filesystem Product\n========================================\n\nAny product that imports a GenericSetup profile can define Analytics reports.\nThese reports should be defined in a file called analytics.xml in the\nproduct's GenericSetup profile directory. The easiest way to generate the XML\nfor a report is to create the report through the web and then export it.\n\nFor example, after following the instructions above for creating a new report,\nyou could use the portal_setup tool in the ZMI to create a snapshot of the\nsite. Then you could navigate to the analytics.xml file in the snapshot and\ncopy and paste the appropriate XML into your product's analytics.xml file.\n\nIf you find that you need to write the GenericSetup XML for a report by hand,\nconsult the analytics.xml file in this product's profiles/default directory\nfor guidance. Keep in mind that any XML or XML reserved characters must be\nproperly escaped.\n\nWhere to Learn More\n===================\n\nCreating and managing Analytics reports requires knowledge of the Google\nAnalytics API, the Google Visualizations API, and Zope and Plone technologies\nsuch as TAL and TALES. These are resources that you may find helpful in\nlearning these technologies:\n\nGoogle Analytics API\n--------------------\n\n* `Google Analytics Data Export API Documentation`__\n\n __ http://code.google.com/apis/analytics/docs/gdata/gdataDeveloperGuide.html\n\n This is the best place to start for learning the ins and outs of Google\n Analytics. Of particular interest are these pages:\n\n - `Data Feed Reference`__\n\n __ http://code.google.com/apis/analytics/docs/gdata/gdataReferenceDataFeed.html\n\n This reference describes the arguments used to query Google.\n\n - `Data Feed Query Explorer`__\n\n __ http://code.google.com/apis/analytics/docs/gdata/gdataExplorer.html\n\n This tool allows you to try out queries interactively, which can be\n extremely helpful in the process of creating and debugging reports.\n\n - `Dimensions and Metrics Reference`__\n\n __ http://code.google.com/apis/analytics/docs/gdata/gdataReferenceDimensionsMetrics.html\n\n This page describes each available dimension and metric. Also see the\n subpages on valid combinations and common calculations.\n\n* gdata API Reference\n\n gdata is the Python module that interacts with the Google API. This\n documentation is most useful for developers who wish to contribute to or\n extend collective.googleanalytics. The relevant documentation is divided into\n two sections:\n\n - `gdata.analtyics.service Reference`__\n\n __ http://gdata-python-client.googlecode.com/svn/trunk/pydocs/gdata.analytics.service.html\n\n This documentation describes the API for the analytics service objects\n that gdata provides. collective.googleanalytics uses both the AccountsService and\n the AnalyticsDataService.\n\n - `gdata.analytics Reference`__\n\n __ http://gdata-python-client.googlecode.com/svn/trunk/pydocs/gdata.analytics.html\n\n This reference documents the response objects returned by a query to Google\n Analytics.\n\nGoogle Visualizations API\n-------------------------\n\n* `Google Visualizations API Documentation`__\n\n __ http://code.google.com/apis/visualization/documentation/index.html\n\n The visualizations API documentation provides an overview of what Google\n Visualizations are and how they work.\n\n* `Google Visualizations Gallery`__\n\n __ http://code.google.com/apis/visualization/documentation/gallery.html\n\n This gallery provides examples of each type of visualization and documents\n the options the options that each accepts.\n\nTAL and TALES\n-------------\n\n* `Using Zope Page Templates`__\n\n __ http://docs.zope.org/zope2/zope2book/ZPT.html\n\n This chapter from the Zope2 Book offers and introduction to TAL, TALES\n and related technologies.\n\n* `Advanced Page Templates`__\n\n __ http://docs.zope.org/zope2/zope2book/AdvZPT.html\n\n This chapter from the Zope2 Book describes some of the more advanced\n features of the TAL specification.\n\n* `Zope Page Template Reference`__\n\n __ http://docs.zope.org/zope2/zope2book/AppendixC.html\n\n This appendix from the Zope2 Book provides a comprehensive overview of\n TAL and TALES as they are used in Zope page templates.\n\nCredits\n=======\n\nDevelopment\n-----------\n\n* `Matt Yoder `_\n* `Tom Gross `_\n\nCode Review\n-----------\n\n* `David Glick `_\n\nUser Documentation\n------------------\n\n* `Jon Stahl `_\n\nOther\n-----\n\n* Thanks to FamFamFam for the graph icons, which are part of the Silk_ set.\n\n.. _Silk: http://www.famfamfam.com/lab/icons/silk/\n\n\n\nChangelog\n=========\n\n1.6.1 (2017-08-22)\n------------------\n\n- Log virtual error page views based on HTTP response status\n rather than Python exc_info (which is set even for handled\n exceptions).\n [davisagli]\n\n- Use jQuery global instead of jq.\n [davisagli]\n\n- Plone 5.1 compatibility\n [alecm]\n\n- Port to plone.app.testing\n [tomgross]\n\n- Remove unused egg dependencies\n [tomgross]\n\n- implements -> implementer\n [tomgross]\n\n1.6.0 (2017-02-21)\n------------------\n\n- Plone 5 compatibility\n [enfold-josh, tomgross]\n\n\n1.5.0 (2016-07-27)\n------------------\n\n- Add virtual page views for search and error pages [tomgross]\n \n- Use Python json instead of custom one [tomgross]\n\n- Updated Spanish translations [macagua]\n\n- Added more improvements about i18n [macagua]\n\n- Move to OAuth2 credential authentication [frapell]\n\n\n1.4.4 (2014-10-15)\n------------------\n\n- Added more improvements about i18n [macagua]\n\n- Added Spanish translations [macagua]\n\n- Updated the core GA code with the latest snippet from Google [spanktar]\n\n- Prepend \"Copy of\" if copy&paste a report. [frapell]\n\n- Use SimpleTerm when creating the reports vocabulary. [frapell]\n\n- Crop overlong profile names [tomgross]\n \n- Pass viewlet view and manager [tomgross]\n\n\n1.4.3 (2013-05-28)\n------------------\n\n- french translations [kiorky]\n\n\n1.4.2 (2013-05-28)\n------------------\n\n- Fix release, add .mo [kiorky]\n\n\n1.4.1 (2013-05-28)\n------------------\n\n* Add dependency on unittest2 to support advance testing features under\n Python 2.6.\n [2013-04-06 - hvelarde]\n\n* Add dependency on plone.app.testing and some tests for the control panel\n configlet.\n [2013-04-05 - hvelarde]\n\n* Package distribution refactoring: package classifiers were updated;\n documentation files were renamed as .rst; MANIFEST.in was fixed and some\n missing testing dependencies were added.\n [2013-04-05 - hvelarde]\n\n* Add .docx, .pptx, and .xlsx to extensions tracked by the file\n download plugin.\n [2013-03-28 - davisagli]\n\n* Improve i18n and include first version of the pt-br translation.\n [2012-10-19 - tcurvelo]\n\n* Improve handling of unicode values in vocabularies\n [2012-10-23 - kiorky]\n\n* Release & QA Stuff\n [2013-05-28 - kiorky]\n\n1.4.1 - 2012-08-29\n------------------\n\n* Avoid calling Google to retrieve vocabularies if there's no valid auth_token.\n This should help avoid conflict errors on the analytics tool.\n [2012-08-29 - davisagli]\n\n1.4 - 2012-08-27\n----------------\n\n* Update to continue working with Google's new Management API and some bugs\n in their backwards-compatibility for the Data Export API.\n [2012-08-27 - davisagli]\n\n* Avoid trying to look up the list of available web properties when simply\n rendering the tracking code.\n [2012-08-23 - davisagli]\n\n* When a Forbidden exception is encountered and the stored access_token is\n removed, also be sure to clear the reports_profile so that a new\n authorization won't encounter the same Forbidden exception immediately.\n [2012-08-23 - davisagli]\n\n1.3 - 2012-04-09\n----------------\n\n* Add Plone 4.1 compatibility\n [2012-03-28 - encolpe]\n\n* Fixed leap day bug in date range calculation.\n [2012-03-01 - yomatters]\n\n* Updated file download tracking plugin to track at_download links.\n [2011-07-26 - yomatters]\n\n1.2 - 2011-05-31\n----------------\n\n* Escaped CDATA tags to keep Chameleon happy.\n [2011-05-27 - yomatters]\n\n* Reject AuthSub tokens that generate a forbidden response.\n [2011-04-27 - yomatters]\n\n* Moved page view tracking after plugins so that custom variables get sent\n along with the page view.\n [2011-04-04 - yomatters]\n\n* Added a plugin for tracking user type in a custom variable.\n [2011-04-04 - yomatters]\n\n* Update tracking code\n [2011-04-15 - garbas]\n\n* Added a plugin for tracking page load time.\n [2011-05-05 - toutpt]\n\n1.1 - 2011-03-24\n----------------\n\n* Documented the domain registration process.\n [2011-03-24 - yomatters]\n\n* Made vocabularies safe for profiles containing non-ASCII characters.\n [2010-12-23 - yomatters]\n\n1.0 - 2010-12-07\n----------------\n\n* Added icon expression for control panel in Plone 4.\n [2010-12-07 - yomatters]\n\n* Fixed permission bug so that the Google Analytics portlet can be made visible\n to non-managers.\n [2010-12-07 - yomatters]\n\n* Allowed requesting Google API javascript over HTTPS if the current page is\n being served securely.\n [2010-11-04 - yomatters]\n\n* Reduced logging level for query messages.\n [2010-08-13 - yomatters]\n\n* wrap inline javascript in CDATA, making it easier to use with Deliverance.\n [2010-08-13 - garbas]\n\n1.0b3 - 2010-06-30\n------------------\n\n* Stored connections to Google Analytics on the ZODB connection instead\n of the Analytics tool.\n [2010-06-30 - yomatters]\n\n* Resolved conflict between Analytics tools on multiple Plone sites on the\n same Zope instance.\n [2010-06-30 - yomatters]\n\n1.0b2 - 2010-06-18\n------------------\n\n* Changed to comma-separated strings in asynchronous loader for Plone 4\n compatibility.\n [2010-06-18 - yomatters]\n\n* Fixed divide by zero error in Time on Site: Line Chart report.\n [2010-06-18 - yomatters]\n\n* Added basic timeout handling so that a request to Google can't tie up a Zope\n thread indefinitely.\n [2010-06-15 - yomatters]\n\n* Limited regular expressions generated by the contextual results plugin to\n 128 characters to conform to Google API restrictions.\n [2010-06-07 - yomatters]\n\n* Added upgrade step to 1.0b2.\n [2010-06-07 - yomatters]\n\n* Changed to AuthSub authentication.\n [2010-06-04 - yomatters]\n\n* Add tracking functionality, including external links, e-mail addresses,\n comments and file downloads.\n [2010-05-11 - yomatters]\n\n* @@analytics-controlpanel failing to display under Plone 4 because of trying to\n access self.context.request which for some reason is not availiable. Accesing\n self.context.REQUEST works for for Plone 3.3.5 and Plone 4b2. Didn't have time\n to investigate this further, but I made it work.\n [2010-05-07 garbas]\n\n1.0b1 - 2010-05-05\n------------------\n\nNote: 1.0b1 changes the syntax for the table-building section of the report\n(previously the report column labels and expressions) and the report body. The\nupgrade step overwrites these properties for the default reports that ship with\nthe product. If you have customized these properties on the default reports, be\nsure to rename the customized reports in portal_analytics before running the\nupgrade step to avoid losing your changes.\n\n* Changed loader to call @@analytics_async on the current context.\n [2010-05-05 - yomatters]\n\n* Added a link to Google Analytics in the control panel.\n [2010-05-04 - yomatters]\n\n* Standardized i18n domain to collective.googleanalytics.\n [2010-04-30 - yomatters]\n\n* Added possible_dates helper function to solve the problem where date-based\n reports do not have results for every date in the range.\n [2010-04-28 - yomatters]\n\n* Make it Plone4 compatible.\n [2010-04-26 - garbas]\n\n* Changed table building interface so that rows are not directly tied to\n results returned by Google. Added dimension and metric value-getter\n functions.\n [2010-04-22 - yomatters]\n\n* Improved reporting when there is no data.\n [2010-04-09 - yomatters]\n\n* Refactored monolithic report into pluggable components.\n [2010-04-09 - yomatters]\n\n* Moved utility functions off of report class.\n [2010-04-01 - yomatters]\n\n1.0a4 - 2010-03-24\n------------------\n\n* Only show the portlet on the context's view template.\n [2010-03-24 - yomatters]\n\n* Add an upgrade step from 1.0a3 to 1.0a4.\n [2010-03-24 - yomatters]\n\n* Modify tests to match asynchronous javascript.\n [2010-03-24 - yomatters]\n\n* Use asynchronous view for the site-wide analytics viewlet.\n [2010-03-24 - yomatters]\n\n* Add a view for asynchronous results, and modify the portlet to use it.\n [2010-03-19 - yomatters]\n\n1.0a3 - 2010-03-05\n------------------\n\n* Add upgrade step from 1.0a2 to 1.0a3.\n [2010-03-05 - yomatters]\n\n* Modify javascript registration and configuration javascript to be compatible\n with Plone 3.1.\n [2010-03-05 - yomatters]\n\n* Add more default reports.\n [2010-03-05 - yomatters]\n\n* Load external javascript through a viewlet instead of through the\n registry to add support for Plone < 3.3.\n [2010-03-05 - yomatters]\n\n1.0a2 - 2010-02-10\n------------------\n\n* Add security assertions for report categories.\n [2010-02-10 - yomatters]\n\n* Update documentation to reflect date range changes.\n [2010-02-10 - yomatters]\n\n* Make date range independent of report and update tests and default reports\n to reflect the new reality; add javascript to set the width of the\n visualization based on the width of the container; add categories to reports\n and adjust vocabularies to be category-specific; handle auth token expiration\n error.\n [2010-02-03 - yomatters]\n\n* Make report IDs unique so that the same page can contain multiple copies\n of the same report.\n [2010-01-19 - yomatters]\n\n* Fix a bug that caused an error if the query returned no results.\n [2010-01-19 - yomatters]\n\n* Fix bug in older Zopes that required the user to reenter the password every\n time the configlet form was saved.\n [2010-01-14 - yomatters]\n\n* Add fallback for importing InitializeClass in Zopes prior to 2.12.\n [2010-01-05 - yomatters]\n\n1.0a1 - 2009-12-23\n------------------\n\n* Initial release", "description_content_type": null, "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/collective/collective.googleanalytics", "keywords": "Google Analytics Plone statistics portlet integration", "license": "GPL", "maintainer": "", "maintainer_email": "", "name": "collective.googleanalytics", "package_url": "https://pypi.org/project/collective.googleanalytics/", "platform": "", "project_url": "https://pypi.org/project/collective.googleanalytics/", "project_urls": { "Homepage": "https://github.com/collective/collective.googleanalytics" }, "release_url": "https://pypi.org/project/collective.googleanalytics/1.6.1/", "requires_dist": null, "requires_python": "", "summary": "Tools for pulling statistics from Google Analytics.", "version": "1.6.1" }, "last_serial": 3115526, "releases": { "1.0": [ { "comment_text": "", "digests": { "md5": "2cd90b249d3ab70b4535ff891b709419", "sha256": "f8bbfb2af8b1f1febf6c4b3ae0f3592b2dca122dacb21098a9028446781d9d09" }, "downloads": -1, "filename": "collective.googleanalytics-1.0.zip", "has_sig": false, "md5_digest": "2cd90b249d3ab70b4535ff891b709419", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 122676, "upload_time": "2010-12-07T17:25:55", "url": "https://files.pythonhosted.org/packages/9d/21/89ac4e95e2060d7fa0e898d9aa80d558ca68d15e1acbd382e1c987067cef/collective.googleanalytics-1.0.zip" } ], "1.0a1": [ { "comment_text": "", "digests": { "md5": "3839f76bf9aaedcda771823fde353ca3", "sha256": "491a2669fc2793aafe53240b91ddf3b33fa006a8310893ebfff30e77c400b740" }, "downloads": -1, "filename": "collective.googleanalytics-1.0a1.zip", "has_sig": false, "md5_digest": "3839f76bf9aaedcda771823fde353ca3", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 76132, "upload_time": "2009-12-23T23:09:06", "url": "https://files.pythonhosted.org/packages/37/e6/73f7c4439a622eaa395b1a8b7138d6745f1a37599b3d4e1b93e3e3e77b2f/collective.googleanalytics-1.0a1.zip" } ], "1.0a2": [ { "comment_text": "", "digests": { "md5": "2ae7152f9af7050c7296f3909a798ee4", "sha256": "c4f77e7a2596ecdc9099373421ae20340ff3565404ae84cd2f390984d601f7a3" }, "downloads": -1, "filename": "collective.googleanalytics-1.0a2.zip", "has_sig": false, "md5_digest": "2ae7152f9af7050c7296f3909a798ee4", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 82288, "upload_time": "2010-02-10T21:02:06", "url": "https://files.pythonhosted.org/packages/9d/fd/a5e50f57163cdcb3b0d4032bd414683274b51e5815fd864973f628e51145/collective.googleanalytics-1.0a2.zip" } ], "1.0a3": [ { "comment_text": "", "digests": { "md5": "6003832755671b4f4c28654bc23526c1", "sha256": "d89b3ae7eae00a6cd0ff0a53da900f4d290387e91331a937f1cda1d91010f189" }, "downloads": -1, "filename": "collective.googleanalytics-1.0a3.zip", "has_sig": false, "md5_digest": "6003832755671b4f4c28654bc23526c1", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 87465, "upload_time": "2010-03-05T22:45:09", "url": "https://files.pythonhosted.org/packages/25/f9/c822a9c0e77f48afedd4a8e51d442682f2c3eeb44d7c54f872418ac35d29/collective.googleanalytics-1.0a3.zip" } ], "1.0a4": [ { "comment_text": "", "digests": { "md5": "80274c7b26a0908de5c34f250f04fdc1", "sha256": "70422d89e87c8e503afa5bc69a07d3135b01b015b202b74d9a02db6194510655" }, "downloads": -1, "filename": "collective.googleanalytics-1.0a4.zip", "has_sig": false, "md5_digest": "80274c7b26a0908de5c34f250f04fdc1", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 92398, "upload_time": "2010-03-24T20:29:17", "url": "https://files.pythonhosted.org/packages/1d/be/c255a4db07e79fce743ff331ab38086d8452ff566d8edcb7efe7f66b9afd/collective.googleanalytics-1.0a4.zip" } ], "1.0b1": [ { "comment_text": "", "digests": { "md5": "cff6db2a269502c678e5736d0a3fad66", "sha256": "528d7c40d19b4e14181b9e82490dbf21ef1a5d6d5b61bf910ed73f56d7b02981" }, "downloads": -1, "filename": "collective.googleanalytics-1.0b1.zip", "has_sig": false, "md5_digest": "cff6db2a269502c678e5736d0a3fad66", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 108757, "upload_time": "2010-05-06T19:04:19", "url": "https://files.pythonhosted.org/packages/bf/f6/cb027cba101d32d0e22ed80461d72fec473e356e5b3eac898dcd5021f958/collective.googleanalytics-1.0b1.zip" } ], "1.0b2": [ { "comment_text": "", "digests": { "md5": "83024a50f55fbdda4bc9d8131c8ce907", "sha256": "19ab0ca6ba9b2b2f5d054900d6a6616b9ad4b9aeefe7ba4f5bf5e9537e13cde8" }, "downloads": -1, "filename": "collective.googleanalytics-1.0b2.zip", "has_sig": false, "md5_digest": "83024a50f55fbdda4bc9d8131c8ce907", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 120412, "upload_time": "2010-06-18T19:32:43", "url": "https://files.pythonhosted.org/packages/45/51/4b8ecf2d246b56a8b4bcab17e129301821e3e49cc7197b4b1203d4f6df8a/collective.googleanalytics-1.0b2.zip" } ], "1.0b3": [ { "comment_text": "", "digests": { "md5": "1dac580f8f03ae9dd94e4addd98f4d00", "sha256": "6f0451958b9f1f96516e87965903e047d3b267d0ddd0f485a60d39b03e71b576" }, "downloads": -1, "filename": "collective.googleanalytics-1.0b3.zip", "has_sig": false, "md5_digest": "1dac580f8f03ae9dd94e4addd98f4d00", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 121028, "upload_time": "2010-06-30T21:37:40", "url": "https://files.pythonhosted.org/packages/43/dc/2fece837a49b7e65b24f18ea9cffdbdaf218b5a46ded3bba6ea76315fae4/collective.googleanalytics-1.0b3.zip" } ], "1.1": [ { "comment_text": "", "digests": { "md5": "7aa72c4b911c7cc02f26a136077c24cd", "sha256": "4c7c967d2834dd12591429fa89a992327cade2a0b0436083b81e9f2e9d93889d" }, "downloads": -1, "filename": "collective.googleanalytics-1.1.zip", "has_sig": false, "md5_digest": "7aa72c4b911c7cc02f26a136077c24cd", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 125797, "upload_time": "2011-03-24T16:37:02", "url": "https://files.pythonhosted.org/packages/26/d4/55ccc256fa358001d4f2841e94706f5887f7011b6f0c0c4de01587458765/collective.googleanalytics-1.1.zip" } ], "1.2": [ { "comment_text": "", "digests": { "md5": "88e2f1bc2f89ab807b25438e726028b7", "sha256": "de41aec013d14a1431b41f3640d9d8d9695bdf2b99f21227c773e050606d2574" }, "downloads": -1, "filename": "collective.googleanalytics-1.2.zip", "has_sig": false, "md5_digest": "88e2f1bc2f89ab807b25438e726028b7", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 127587, "upload_time": "2011-05-31T17:55:45", "url": "https://files.pythonhosted.org/packages/a1/32/a38479403d52ac40a0397b85c04def03a123d4496c28ef6323f91b640dce/collective.googleanalytics-1.2.zip" } ], "1.3": [ { "comment_text": "", "digests": { "md5": "18043aa77dac5a75a622b63d412eb198", "sha256": "ebbf71cd1fb3498b20b2b7186b7e082e26f08f61161d5d81152cdf13ca966449" }, "downloads": -1, "filename": "collective.googleanalytics-1.3.zip", "has_sig": false, "md5_digest": "18043aa77dac5a75a622b63d412eb198", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 127910, "upload_time": "2012-04-09T15:26:53", "url": "https://files.pythonhosted.org/packages/df/f9/e8eaee5032f406fbd31778e73ea060687212049687bbad43d57f6d8d94d3/collective.googleanalytics-1.3.zip" } ], "1.4": [ { "comment_text": "", "digests": { "md5": "6b9d1790ac954091ce967b6e851ec7ef", "sha256": "97a6aae90394dd0ca0965bb313419064481e5a1d2aa2db798673d2e45f21925e" }, "downloads": -1, "filename": "collective.googleanalytics-1.4.zip", "has_sig": false, "md5_digest": "6b9d1790ac954091ce967b6e851ec7ef", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 129196, "upload_time": "2012-08-27T19:38:35", "url": "https://files.pythonhosted.org/packages/ec/7f/3180e77bda74ac07835d1d0a676478d92f165bad3156026b737601679725/collective.googleanalytics-1.4.zip" } ], "1.4.1": [ { "comment_text": "", "digests": { "md5": "6020a84ec810a9d55ee951f149a14b5b", "sha256": "56df1207323ce2afab22c2ebc667801f6611ed223599b9ca3ac2685c2009e335" }, "downloads": -1, "filename": "collective.googleanalytics-1.4.1.zip", "has_sig": false, "md5_digest": "6020a84ec810a9d55ee951f149a14b5b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 129846, "upload_time": "2012-08-29T17:51:44", "url": "https://files.pythonhosted.org/packages/c5/0c/6ee044d9ff9f4137d447202313bd6fe4610e25a801332bb0f81997be2a0b/collective.googleanalytics-1.4.1.zip" } ], "1.4.2": [ { "comment_text": "", "digests": { "md5": "3ea21a69a18c217e625ba494ef34e304", "sha256": "9ded27e42071112872038cf52ef46f0fc7849d04a2a305d2e5512a94b767f4c8" }, "downloads": -1, "filename": "collective.googleanalytics-1.4.2.zip", "has_sig": false, "md5_digest": "3ea21a69a18c217e625ba494ef34e304", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 140443, "upload_time": "2013-05-28T09:42:42", "url": "https://files.pythonhosted.org/packages/0b/64/19a7a0aa4a59ab7823c0a611147d9ddbc499d76bad0f0b9c25a1b6406b39/collective.googleanalytics-1.4.2.zip" } ], "1.4.3": [ { "comment_text": "", "digests": { "md5": "da2c69c9a865006402af695c90246855", "sha256": "98188128ea4ed2a5f9cdbf47178094c4c5a3ff7c1cc510148e80a58809ac3af8" }, "downloads": -1, "filename": "collective.googleanalytics-1.4.3.zip", "has_sig": false, "md5_digest": "da2c69c9a865006402af695c90246855", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 145687, "upload_time": "2013-05-28T10:07:05", "url": "https://files.pythonhosted.org/packages/8b/18/5cb0f03956adf428ee9395843917eae6d4950bda01e1d101001e6ef09842/collective.googleanalytics-1.4.3.zip" } ], "1.4.4": [ { "comment_text": "", "digests": { "md5": "a96af8cfe71680dcadb57f782af5d138", "sha256": "2ee41ba45644e4dda6e2d2c8e27b405f7c9f6ce5abbf50c01dad89a2f01d7614" }, "downloads": -1, "filename": "collective.googleanalytics-1.4.4.zip", "has_sig": false, "md5_digest": "a96af8cfe71680dcadb57f782af5d138", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 156933, "upload_time": "2014-10-15T17:55:52", "url": "https://files.pythonhosted.org/packages/37/97/5c4fcd42fa06231f24af13e72475bb8745ec6f7bf2b72524244df0388e53/collective.googleanalytics-1.4.4.zip" } ], "1.5.0": [ { "comment_text": "", "digests": { "md5": "5618e5704b62ee4f8561820557991043", "sha256": "1bc802c1bcada4640d9247fc1cd3a742e251bf7544231a961e212fc1a08ceda0" }, "downloads": -1, "filename": "collective.googleanalytics-1.5.0.tar.gz", "has_sig": false, "md5_digest": "5618e5704b62ee4f8561820557991043", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 106906, "upload_time": "2016-07-27T17:46:29", "url": "https://files.pythonhosted.org/packages/f6/bd/38b469e83a91d4611e83df3154339dacbafb412e05865f1ca3715bb74d82/collective.googleanalytics-1.5.0.tar.gz" } ], "1.6.0": [ { "comment_text": "", "digests": { "md5": "d39a85308a1cd509998ab9a243266373", "sha256": "80d63033fcf06ce836446e21b4947061fa0cbcbcc02bebfba4474e8ebfdba536" }, "downloads": -1, "filename": "collective.googleanalytics-1.6.0.tar.gz", "has_sig": false, "md5_digest": "d39a85308a1cd509998ab9a243266373", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 108899, "upload_time": "2017-02-21T18:14:17", "url": "https://files.pythonhosted.org/packages/4b/a2/a5e90b34e9f536ddf9242d783e704bee3cb2eae2b296c086bff3adcf4ec2/collective.googleanalytics-1.6.0.tar.gz" } ], "1.6.1": [ { "comment_text": "", "digests": { "md5": "e6b8021d991448627738f87636c5229d", "sha256": "5c5f15e6dbe0ff1020af3f45b9a4374b63f138f74e3e8b7eaae843bc8f09a180" }, "downloads": -1, "filename": "collective.googleanalytics-1.6.1.tar.gz", "has_sig": false, "md5_digest": "e6b8021d991448627738f87636c5229d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 104753, "upload_time": "2017-08-22T19:44:00", "url": "https://files.pythonhosted.org/packages/6c/73/dc05806e5484ec911dada58f5068c6e492219f0bea6c03f51ca53a3138c1/collective.googleanalytics-1.6.1.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "e6b8021d991448627738f87636c5229d", "sha256": "5c5f15e6dbe0ff1020af3f45b9a4374b63f138f74e3e8b7eaae843bc8f09a180" }, "downloads": -1, "filename": "collective.googleanalytics-1.6.1.tar.gz", "has_sig": false, "md5_digest": "e6b8021d991448627738f87636c5229d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 104753, "upload_time": "2017-08-22T19:44:00", "url": "https://files.pythonhosted.org/packages/6c/73/dc05806e5484ec911dada58f5068c6e492219f0bea6c03f51ca53a3138c1/collective.googleanalytics-1.6.1.tar.gz" } ] }