add config files
add config files

file:b/admin/data.gov.au (new)
  <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)
  # 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);
  # }
 
  <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>
 
import logging import logging
   
import ckan.plugins as plugins 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.plugins.toolkit as tk
  import ckan.model as model
   
  #parse the activity feed for last active non-system user
# get_action will be deprecated soon, this is the replacement def get_last_active_user(id):
def get_user(user): system_user = "de0ba262-83fe-45e2-adda-41bb9f0c86d8"
user_name = unicode(user) user_list = [x for x in lib.helpers.get_action('package_activity_list',{'id':id}) if x['user_id'] != system_user]
if user_name: user = user_list[0]['user_id']
user_obj = model.User.get(id) if user is None:
context['user_obj'] = user_obj return lib.helpers.get_action('user_show',{'id':system_user})
if user_obj is None:  
raise NotFound  
else: else:
raise NotFound return lib.helpers.get_action('user_show',{'id':user})
   
return model_dictize.user_dictize(user_obj,context)  
   
   
class ExampleIDatasetFormPlugin(plugins.SingletonPlugin, class ExampleIDatasetFormPlugin(plugins.SingletonPlugin,
tk.DefaultDatasetForm): tk.DefaultDatasetForm):
'''An example IDatasetForm CKAN plugin. '''An example IDatasetForm CKAN plugin.
   
Uses a tag vocabulary to add a custom metadata field to datasets. Uses a tag vocabulary to add a custom metadata field to datasets.
   
''' '''
plugins.implements(plugins.IConfigurer, inherit=False) plugins.implements(plugins.IConfigurer, inherit=False)
plugins.implements(plugins.IDatasetForm, inherit=False) plugins.implements(plugins.IDatasetForm, inherit=False)
plugins.implements(plugins.ITemplateHelpers, inherit=False) plugins.implements(plugins.ITemplateHelpers, inherit=False)
   
# These record how many times methods that this plugin's methods are # These record how many times methods that this plugin's methods are
# called, for testing purposes. # called, for testing purposes.
num_times_new_template_called = 0 num_times_new_template_called = 0
num_times_read_template_called = 0 num_times_read_template_called = 0
num_times_edit_template_called = 0 num_times_edit_template_called = 0
num_times_search_template_called = 0 num_times_search_template_called = 0
num_times_history_template_called = 0 num_times_history_template_called = 0
num_times_package_form_called = 0 num_times_package_form_called = 0
num_times_check_data_dict_called = 0 num_times_check_data_dict_called = 0
num_times_setup_template_variables_called = 0 num_times_setup_template_variables_called = 0
   
   
def update_config(self, config): def update_config(self, config):
# Add this plugin's templates dir to CKAN's extra_template_paths, so # Add this plugin's templates dir to CKAN's extra_template_paths, so
# that CKAN will use this plugin's custom templates. # that CKAN will use this plugin's custom templates.
# here = os.path.dirname(__file__) # here = os.path.dirname(__file__)
# rootdir = os.path.dirname(os.path.dirname(here)) # rootdir = os.path.dirname(os.path.dirname(here))
   
tk.add_template_directory(config, 'templates') tk.add_template_directory(config, 'templates')
tk.add_public_directory(config, 'theme/public') tk.add_public_directory(config, 'theme/public')
tk.add_resource('theme/public', 'ckanext-datagovau') tk.add_resource('theme/public', 'ckanext-datagovau')
# config['licenses_group_url'] = 'http://%(ckan.site_url)/licenses.json' # config['licenses_group_url'] = 'http://%(ckan.site_url)/licenses.json'
   
def get_helpers(self): def get_helpers(self):
return {'getuser': get_user} return {'get_last_active_user': get_last_active_user}
   
def is_fallback(self): def is_fallback(self):
# Return True to register this plugin as the default handler for # Return True to register this plugin as the default handler for
# package types not handled by any other IDatasetForm plugin. # package types not handled by any other IDatasetForm plugin.
return True return True
   
def package_types(self): def package_types(self):
# This plugin doesn't handle any special package types, it just # This plugin doesn't handle any special package types, it just
# registers itself as the default (above). # registers itself as the default (above).
return [] return []
   
   
def create_package_schema(self): def create_package_schema(self):
schema = super(ExampleIDatasetFormPlugin, self).create_package_schema() schema = super(ExampleIDatasetFormPlugin, self).create_package_schema()
schema = self._modify_package_schema(schema) schema = self._modify_package_schema(schema)
return schema return schema
   
def update_package_schema(self): def update_package_schema(self):
schema = super(ExampleIDatasetFormPlugin, self).update_package_schema() schema = super(ExampleIDatasetFormPlugin, self).update_package_schema()
schema = self._modify_package_schema(schema) schema = self._modify_package_schema(schema)
return schema return schema
   
def show_package_schema(self): def show_package_schema(self):
schema = super(ExampleIDatasetFormPlugin, self).show_package_schema() schema = super(ExampleIDatasetFormPlugin, self).show_package_schema()
   
# Don't show vocab tags mixed in with normal 'free' tags # Don't show vocab tags mixed in with normal 'free' tags
# (e.g. on dataset pages, or on the search page) # (e.g. on dataset pages, or on the search page)
schema['tags']['__extras'].append(tk.get_converter('free_tags_only')) schema['tags']['__extras'].append(tk.get_converter('free_tags_only'))
   
# Add our custom_text field to the dataset schema. # Add our custom_text field to the dataset schema.
# ignore_missing == optional # ignore_missing == optional
# ignore_empty == mandatory but not for viewing # ignore_empty == mandatory but not for viewing
# !!! always convert_from_extras first # !!! always convert_from_extras first
schema.update({ schema.update({
'agency_program': [tk.get_converter('convert_from_extras'), 'agency_program': [tk.get_converter('convert_from_extras'),
tk.get_validator('ignore_missing')], tk.get_validator('ignore_missing')],
'contact_point': [tk.get_converter('convert_from_extras'), 'contact_point': [tk.get_converter('convert_from_extras'),
tk.get_validator('ignore_empty')], tk.get_validator('ignore_empty')],
'spatial_coverage': [tk.get_converter('convert_from_extras'), 'spatial_coverage': [tk.get_converter('convert_from_extras'),
tk.get_validator('ignore_empty')], tk.get_validator('ignore_empty')],
'granularity': [tk.get_converter('convert_from_extras'), 'granularity': [tk.get_converter('convert_from_extras'),
tk.get_validator('ignore_empty')], tk.get_validator('ignore_empty')],
'jurisdiction': [tk.get_converter('convert_from_extras'), 'jurisdiction': [tk.get_converter('convert_from_extras'),
tk.get_validator('ignore_empty')], tk.get_validator('ignore_empty')],
'temporal_coverage': [tk.get_converter('convert_from_extras'), 'temporal_coverage': [tk.get_converter('convert_from_extras'),
tk.get_validator('ignore_empty')], tk.get_validator('ignore_empty')],
'data_state': [tk.get_converter('convert_from_extras'), 'data_state': [tk.get_converter('convert_from_extras'),
tk.get_validator('ignore_empty')], tk.get_validator('ignore_empty')],
'