Merge branch 'master' of git+ssh://maxious.lambdacomplex.org/git/ckanext-datagovau
Merge branch 'master' of git+ssh://maxious.lambdacomplex.org/git/ckanext-datagovau

file:b/admin/data.gov.au (new)
--- /dev/null
+++ b/admin/data.gov.au
@@ -1,1 +1,96 @@
+<VirtualHost 127.0.0.1:8080>
+	ServerAdmin webmaster@localhost
 
+	ServerName data.gov.au
+	ServerAlias www.data.gov.au, opendata.linkdigital.com.au
+
+
+        #allow access to local static content eg. logos
+        Alias /index.html /var/www/index.html
+        Alias /logos      /var/www/logos
+        Alias /tools      /var/www/tools.shtml
+        Alias /opendata   /var/www/opendata.shtml
+        Alias /opengov    /var/www/opengov.shtml
+
+	DocumentRoot /var/www
+<IfModule mod_expires.c>
+          <FilesMatch "\.(jpe?g|png|gif|js|css)$">
+                      ExpiresActive On
+                      ExpiresDefault "access plus 1 week"
+          </FilesMatch>
+</IfModule>
+
+	<Directory />
+		Options FollowSymLinks
+		AllowOverride None
+	</Directory>
+
+	<Directory /var/www/>
+		Options -Indexes -FollowSymLinks -MultiViews +Includes
+		AllowOverride None
+
+		Order allow,deny
+		allow from all
+
+                AddType text/html .shtml
+                AddOutputFilter INCLUDES .shtml
+	</Directory>
+
+	ErrorLog ${APACHE_LOG_DIR}/error.log
+
+	# Possible values include: debug, info, notice, warn, error, crit, alert, emerg.
+	LogLevel warn
+
+	CustomLog ${APACHE_LOG_DIR}/access.log varnishcombined
+	RewriteEngine On
+
+	RewriteMap lc int:tolower
+
+#	RewriteRule ^/apps/antenna-mate/?$													http://antennamate.com/ 											[PT]
+#	RewriteRule ^/apps/postcode-finder/?$													http://www.aus-emaps.com/postcode_finder.php									[PT]
+#	RewriteRule ^/apps/the-australian-cost-of-living-heatmap/?$										http://www.creditcardcompare.com.au/tools/cost-of-living-heatmap/						[PT]
+	RewriteRule ^/catalogues/?$														/organization													[PT]
+	RewriteRule ^/dataset/“cycling-in-new-south-wales-what-the-data-tells-us”-and-related-data/?						/dataset/2809cycling-in-new-south-wales-what-the-data-tells-us2809-and-related-data				[PT]
+	RewriteRule ^/dataset/apvma-pubcris-dataset-for-registered-agricultural-and-veterinary-chemical-products-and-approved-actives/? 	/dataset/apvma-pubcris-dataset-for-registered-agricultural-and-veterinary-chemical-products-and-approved-acti	[PT]
+	RewriteRule ^/dataset_category/business/?$												/group/business 												[PT]
+	RewriteRule ^/dataset_category/community/?$												/group/community												[PT]
+	RewriteRule ^/dataset_category/geography/?$												/group/geography												[PT]
+	RewriteRule ^/dataset_category/government/?$												/group/government												[PT]
+	RewriteRule ^/dataset_category/health/?$												/group/health													[PT]
+	RewriteRule ^/dataset_category/?$													/group														[PT]
+	RewriteRule ^/feed/?$															/feeds/dataset.atom														[PT]
+	RewriteRule ^/jurisdiction/australian-capital-territory/?$										/dataset?q=act													[PT]
+	RewriteRule ^/jurisdiction/new-south-wales/?$												/dataset?q=new+south+wales											[PT]
+	RewriteRule ^/jurisdiction/queensland/?$ 												/dataset?q=queensland												[PT]
+	RewriteRule ^/jurisdiction/south-australia/?$												/dataset?q=south+australia											[PT]
+	RewriteRule ^/jurisdiction/victoria/?$													/dataset?q=victoria												[PT]
+	RewriteRule ^/jurisdiction/western-australia/?$ 											/dataset?q=western+australia											[PT]
+	RewriteRule ^/jurisdiction/?$														/dataset													[PT]
+
+#	RewriteCond %{QUERY_STRING}	^category=([a-z]+)
+#	RewriteRule ^/data/?$															/group/${lc:%1}?												[PT]
+
+#	RewriteCond %{QUERY_STRING}	^format=Shapefile
+#	RewriteRule ^/data/?$															/dataset?res_format=shp 											[PT]
+
+	RewriteRule ^/data/?$															/dataset?													[PT]
+
+	RewriteCond %{QUERY_STRING}	^s=(.*)
+	RewriteRule ^/			/dataset?q=%1																										[PT]
+
+
+        FilterDeclare OPENDATA
+        FilterProvider OPENDATA SUBSTITUTE resp=Content-Type $text/
+        FilterProvider OPENDATA SUBSTITUTE resp=Content-Type $/javascript
+        FilterProvider OPENDATA SUBSTITUTE resp=Content-Type $/json
+        FilterProvider OPENDATA SUBSTITUTE resp=Content-Type $/xml
+        FilterChain OPENDATA
+        Substitute "s#//opendata.linkdigital.com.au#//data.gov.au#"
+
+	WSGIScriptAlias / /var/lib/ckan/dga/pyenv/bin/dga.py
+	WSGIPassAuthorization On
+
+	ErrorLog /var/log/apache2/ckandga.error.log
+	CustomLog /var/log/apache2/ckandga.custom.log combined
+</VirtualHost>
+

file:b/admin/default.vcl (new)
--- /dev/null
+++ b/admin/default.vcl
@@ -1,1 +1,164 @@
+# This is a basic VCL configuration file for varnish.  See the vcl(7)
+# man page for details on VCL syntax and semantics.
+# 
+# Default backend definition.  Set this to point to your content
+# server.
+# 
+backend default {
+    .host = "127.0.0.1";
+    .port = "8080";
+}
 
+sub vcl_fetch {
+    set beresp.grace = 1h;
+ 
+    if (beresp.http.content-type ~ "(text|application)") {
+        set beresp.do_gzip = true;
+    }
+ if (req.url ~ "\.(png|gif|jpg|jpeg|swf|css|js|woff|eot)$") {
+   unset beresp.http.set-cookie;
+ }
+}
+sub vcl_recv {
+  if (req.url ~ "^/_tracking") {
+    return (pass);
+  }
+ if (req.url ~ "\.(png|gif|jpg|jpeg|swf|css|js|woff|eot)$") {
+    return(lookup);
+ }
+  if (req.http.Cookie) {
+    set req.http.Cookie = regsuball(req.http.Cookie, "(^|; ) *__utm.=[^;]+;? *", "\1"); # removes all cookies named __utm? (utma, utmb...) - tracking thing
+
+    if (req.http.Cookie == "") {
+        remove req.http.Cookie;
+    }
+  }
+} 
+sub vcl_deliver {
+    if (!resp.http.Vary) {
+        set resp.http.Vary = "Accept-Encoding";   
+    } else if (resp.http.Vary !~ "(?i)Accept-Encoding") {
+        set resp.http.Vary = resp.http.Vary + ",Accept-Encoding";
+    }    
+    if (obj.hits > 0) {
+        set resp.http.X-Cache = "HIT";
+    } else {
+        set resp.http.X-Cache = "MISS";
+    }
+}   
+
+# 
+# Below is a commented-out copy of the default VCL logic.  If you
+# redefine any of these subroutines, the built-in logic will be
+# appended to your code.
+# sub vcl_recv {
+#     if (req.restarts == 0) {
+# 	if (req.http.x-forwarded-for) {
+# 	    set req.http.X-Forwarded-For =
+# 		req.http.X-Forwarded-For + ", " + client.ip;
+# 	} else {
+# 	    set req.http.X-Forwarded-For = client.ip;
+# 	}
+#     }
+#     if (req.request != "GET" &&
+#       req.request != "HEAD" &&
+#       req.request != "PUT" &&
+#       req.request != "POST" &&
+#       req.request != "TRACE" &&
+#       req.request != "OPTIONS" &&
+#       req.request != "DELETE") {
+#         /* Non-RFC2616 or CONNECT which is weird. */
+#         return (pipe);
+#     }
+#     if (req.request != "GET" && req.request != "HEAD") {
+#         /* We only deal with GET and HEAD by default */
+#         return (pass);
+#     }
+#     if (req.http.Authorization || req.http.Cookie) {
+#         /* Not cacheable by default */
+#         return (pass);
+#     }
+#     return (lookup);
+# }
+# 
+# sub vcl_pipe {
+#     # Note that only the first request to the backend will have
+#     # X-Forwarded-For set.  If you use X-Forwarded-For and want to
+#     # have it set for all requests, make sure to have:
+#     # set bereq.http.connection = "close";
+#     # here.  It is not set by default as it might break some broken web
+#     # applications, like IIS with NTLM authentication.
+#     return (pipe);
+# }
+# 
+# sub vcl_pass {
+#     return (pass);
+# }
+# 
+# sub vcl_hash {
+#     hash_data(req.url);
+#     if (req.http.host) {
+#         hash_data(req.http.host);
+#     } else {
+#         hash_data(server.ip);
+#     }
+#     return (hash);
+# }
+# 
+# sub vcl_hit {
+#     return (deliver);
+# }
+# 
+# sub vcl_miss {
+#     return (fetch);
+# }
+# 
+# sub vcl_fetch {
+#     if (beresp.ttl <= 0s ||
+#         beresp.http.Set-Cookie ||
+#         beresp.http.Vary == "*") {
+# 		/*
+# 		 * Mark as "Hit-For-Pass" for the next 2 minutes
+# 		 */
+# 		set beresp.ttl = 120 s;
+# 		return (hit_for_pass);
+#     }
+#     return (deliver);
+# }
+# 
+# sub vcl_deliver {
+#     return (deliver);
+# }
+# 
+# sub vcl_error {
+#     set obj.http.Content-Type = "text/html; charset=utf-8";
+#     set obj.http.Retry-After = "5";
+#     synthetic {"
+# <?xml version="1.0" encoding="utf-8"?>
+# <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+#  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+# <html>
+#   <head>
+#     <title>"} + obj.status + " " + obj.response + {"</title>
+#   </head>
+#   <body>
+#     <h1>Error "} + obj.status + " " + obj.response + {"</h1>
+#     <p>"} + obj.response + {"</p>
+#     <h3>Guru Meditation:</h3>
+#     <p>XID: "} + req.xid + {"</p>
+#     <hr>
+#     <p>Varnish cache server</p>
+#   </body>
+# </html>
+# "};
+#     return (deliver);
+# }
+# 
+# sub vcl_init {
+# 	return (ok);
+# }
+# 
+# sub vcl_fini {
+# 	return (ok);
+# }
+

--- /dev/null
+++ b/admin/deflate.conf
@@ -1,1 +1,12 @@
+<IfModule mod_deflate.c>
+        AddOutputFilterByType DEFLATE text/html application/xhtml+xml text/plain text/xml text/css application/json text/javascript application/javascript application/x-javascript
+        BrowserMatch ^Mozilla/4 gzip-only-text/html
+        BrowserMatch ^Mozilla/4\.0[678] no-gzip
+        BrowserMatch \bMSIE !no-gzip !gzip-only-text/htm
 
+        # Don't compress images
+        SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png)$ no-gzip dont-vary
+
+        # DeflateCompressionLevel 9
+</IfModule>
+

--- a/ckanext/datagovau/plugin.py
+++ b/ckanext/datagovau/plugin.py
@@ -1,21 +1,29 @@
 import logging
 
 import ckan.plugins as plugins
+import ckan.lib as lib
+import ckan.lib.dictization.model_dictize as model_dictize
 import ckan.plugins.toolkit as tk
+import ckan.model as model
 
+#parse the activity feed for last active non-system user
+def get_last_active_user(id):
+    system_user = "de0ba262-83fe-45e2-adda-41bb9f0c86d8"
+    user_list = [x for x in lib.helpers.get_action('package_activity_list',{'id':id}) if x['user_id'] != system_user]
+    user = user_list[0]['user_id']
+    if user is None:
+	return lib.helpers.get_action('user_show',{'id':system_user})
+    else:
+	return lib.helpers.get_action('user_show',{'id':user})
 
-# get_action will be deprecated soon, this is the replacement
-def get_user(user):
-    user_name = unicode(user)
-    if user_name:
-        user_obj = model.User.get(id)
-        context['user_obj'] = user_obj
-        if user_obj is None:
-            raise NotFound
-    else:
-        raise NotFound
-
-    return model_dictize.user_dictize(user_obj,context)
+# get user created datasets and those they have edited
+def get_user_datasets(user_dict):
+    created_datasets_list = user_dict['datasets']
+    active_datasets_id_list = [x['data']['package'] for x in 
+				lib.helpers.get_action('user_activity_list',{'id':user_dict['id']}) if x['data'].get('package')]
+    active_datasets_list = active_datasets_id_list #if you need more detail, fetch each dataset here
+    print active_datasets_list
+    return created_datasets_list + active_datasets_list
 
 
 class ExampleIDatasetFormPlugin(plugins.SingletonPlugin,
@@ -53,7 +61,7 @@
         # config['licenses_group_url'] = 'http://%(ckan.site_url)/licenses.json'
 
     def get_helpers(self):
-        return {'getuser': get_user}
+        return {'get_last_active_user': get_last_active_user, 'get_user_datasets': get_user_datasets}
 
     def is_fallback(self):
         # Return True to register this plugin as the default handler for

--- a/ckanext/datagovau/templates/package/read.html
+++ b/ckanext/datagovau/templates/package/read.html
@@ -137,19 +137,26 @@
         </tr>
         {% endif %}
 
-        {% if pkg.maintainer_email %}
+{% set email =h.get_last_active_user(c.pkg_dict['id']).get('email','') %}
         <tr>
             <th scope="row" class="dataset-label">{{ _('Maintainer') }}</th>
             <td class="dataset-details" property="dc:contributor">{{
-                h.mail_to(email_address=pkg.maintainer_email, name=pkg.maintainer) }}
+		  h.mail_to(email_address=(email or ' '), name=h.get_last_active_user(c.pkg_dict['id']).get("display_name",'')) }}
             </td>
         </tr>
-        {% elif pkg.maintainer %}
         <tr>
-            <th scope="row" class="dataset-label">{{ _('Maintainer') }}</th>
-            <td class="dataset-details" property="dc:contributor">{{ pkg.maintainer }}</td>
+            <th scope="row" class="dataset-label">Publisher/Agency</th>
+            <td class="dataset-details" property="dc:publisher">{{ c.pkg_dict['organization']['title']}}
+            </td>
         </tr>
-        {% endif %}
+        <tr>
+            <th scope="row" class="dataset-label">Type</th>
+            <td class="dataset-details" property="dc:type">Dataset</td>
+        </tr>
+        <tr>
+            <th scope="row" class="dataset-label">Language</th>
+            <td class="dataset-details" property="dc:language">English</td>
+        </tr>
 
         </tbody>
     </table>

--- a/ckanext/datagovau/templates/package/read.rdf
+++ b/ckanext/datagovau/templates/package/read.rdf
@@ -24,7 +24,17 @@
         <dct:issued>${c.pkg_dict['metadata_created']}</dct:issued>
         <dct:modified>${c.pkg_dict['metadata_modified']}</dct:modified>
         <dct:language>en</dct:language>
+
+<py:choose>
+  <py:when test="c.pkg_dict.get('license_url',None)">
         <dct:license>${c.pkg_dict['license_url']}</dct:license>
+        <dct:rights rdf:resource="${c.pkg_dict['license_url']}"/>
+  </py:when>
+  <py:otherwise>
+        <dct:license>${c.pkg_dict['license_id']}</dct:license>
+        <dct:rights rdf:resource="${c.pkg_dict['license_id']}"/>
+  </py:otherwise>
+</py:choose>
         <py:for each="tag_dict in c.pkg_dict.get('tags',[])">
             <dcat:keyword>${ tag_dict["name"] }</dcat:keyword>
         </py:for>
@@ -69,16 +79,14 @@
                 <foaf:name>${ c.pkg_dict['organization']['title'] }</foaf:name>
             </rdf:Description>
         </dct:creator>
-        <dct:contributor
-                py:with="username = h.get_action('package_activity_list',{'id':c.pkg_dict['id']})[0]['user_id']">
+        <dct:contributor>
             <rdf:Description>
-                <foaf:name>${h.get_action("user_show",{"id":username})["display_name"]}</foaf:name>
-                <foaf:mbox py:if="h.get_action('user_show',{'id':username}).get('email', None)"
-                           rdf:resource="mailto:${h.get_action('user_show',{'id':username})['email']}"/>
+                <foaf:name>${h.get_last_active_user(c.pkg_dict['id'])["display_name"]}</foaf:name>
+                <foaf:mbox py:if="h.get_last_active_user(c.pkg_dict['id']).get('email', None)"
+                           rdf:resource="mailto:${h.get_last_active_user(c.pkg_dict['id'])['email']}"/>
             </rdf:Description>
         </dct:contributor>
 
-        <dct:rights py:if="c.pkg_dict.get('license_url', None)" rdf:resource="${c.pkg_dict['license_url']}"/>
 
         <foaf:homepage py:if="h.get_pkg_dict_extra(c.pkg_dict,'DCTERMS.Source.URI')">${h.get_pkg_dict_extra(c.pkg_dict,'DCTERMS.Source.URI') }
         </foaf:homepage>

--- /dev/null
+++ b/ckanext/datagovau/templates/user/dashboard_datasets.html
@@ -1,1 +1,16 @@
+{% ckan_extends %}
 
+{% block primary_content_inner %}
+  <h2 class="page-heading">{{ _('My Datasets') }}</h2>
+  {% if h.get_user_datasets(c.user_dict) %}
+    {% snippet 'snippets/package_list.html', packages=h.get_user_datasets(c.user_dict) %}
+  {% else %}
+    <p class="empty">
+      You haven\'t created/edited any datasets.
+      {% if h.check_access('package_create') %}
+        {% link_for _('Create one now?'), controller='package', action='new' %}
+      {% endif %}
+    </p>
+  {% endif %}
+{% endblock %}
+

--- /dev/null
+++ b/ckanext/datagovau/templates/user/read.html
@@ -1,1 +1,29 @@
+{% ckan_extends %}
 
+
+{% block primary_content_inner %}
+  <h2 class="hide-heading">
+    {% block page_heading %}{{ _('Datasets') }}{% endblock %}
+  </h2>
+  {% block package_list %}
+  {% if h.get_user_datasets(c.user_dict) %}
+    {% snippet 'snippets/package_list.html', packages=h.get_user_datasets(c.user_dict) %}
+  {% else %}
+
+    {% if c.is_myself %}
+      <p class="empty">
+        {{ _('You haven\'t created any datasets.') }}
+        {% if h.check_access('package_create') %}
+          {% link_for _('Create one now?'), controller='package', action='new' %}
+        {% endif %}
+      </p>
+    {% else %}
+      <p class="empty">
+        {{ _('User hasn\'t created any datasets.') }}
+      </p>
+    {% endif %}
+  {% endif %}
+  {% endblock %}
+{% endblock %}
+
+