{22} Trac tickets (2647 matches)
Results (1401 - 1500 of 2647)
Id | Type | Owner | Reporter | Milestone | Status | Resolution | Summary | Description | Posixtime | Modifiedtime | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
#1262 | enhancement | pudo | ckan-backlog | new | Enforce "create-user" permission |
This does not seem to have any implications at the moment, it should lock down registration and remove all related links. |
1312375296000000 | 1323090112000000 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#1261 | defect | pudo | ckan-backlog | new | Investigate dots in extras search |
It seems that searching for extras_foo:value works with solr, but extras_foo.bar:value doesn't. No theory on why. |
1312366768000000 | 1312366768000000 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#1260 | enhancement | pudo | ckan-backlog | new | Remove duplicate functions from _util.html |
There seems to be both a list view for dictized and non dictized data structures for all entities in _util.html at the moment. Probably in the back of someone's mind already, but cleanup here would be nice. |
1312366652000000 | 1313401499000000 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#1259 | enhancement | johnglover | pudo | ckan-backlog | new | "Add a row" for Extras on Package form |
The default package form offers 4 empty extras fields. Like the resource section, it should have an "add more" button to add another row. |
1312302693000000 | 1312907056000000 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#1258 | enhancement | kindly | kindly | ckan-sprint-2011-10-28 | closed | fixed | Bring purge revision into ckan repo from vdm |
In order to make purge revision work correctly with the moderated edits we need to modify purge revision in vdm. This is best modified in ckan so we will override the vdm one in the reposotory. |
1312289539000000 | 1319812452000000 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#1257 | enhancement | dread | ckan-backlog | new | Anti-Spam tools |
We are getting more and more spam on ckan.net and we need to improve our strategy of combating it. It is bad because google ranks who we link to (which we do want for legitimate links), and our front page contains the latest package edits, so spam is immediately very visible. Spam:
Systems to consider:
General thoughts:
|
1312283565000000 | 1339774129000000 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#1256 | defect | kindly | kindly | ckan-sprint-2011-10-28 | closed | fixed | fix modification extension for moderation |
Solr is not working for moderation, pending changes are not being indexed. |
1312280026000000 | 1319812556000000 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#1255 | enhancement | kindly | kindly | ckan-backlog | assigned | Drupal consistancy checks. |
Make a robust way to make sure the drupal database is consistent with the ckan data. |
1312219968000000 | 1313400054000000 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#1254 | task | dread | dread | ckan-sprint-2011-10-28 | closed | fixed | Feature sheet |
Compose a feature list for CKAN. Use the existing Feature Matrix. Basic explanation of terms. For use by customers. |
1312211925000000 | 1313401629000000 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#1253 | enhancement | amercader | amercader | ckan-sprint-2011-10-28 | closed | fixed | Authz refactor |
We agreed on a system that allows overriding the authz checks at a logic function level (e.g. package_create, user_show) and supports the old (current) authz system. |
1312199491000000 | 1313401367000000 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#1252 | enhancement | rgrp | rgrp | ckan-v1.5 | closed | fixed | Deprecate ckan.net in favour of thedatahub.org |
Deprecate ckan.net in favour of thedatahub.org
Also redirect wiki.ckan.net to wiki.ckan.org |
1311965339000000 | 1318160334000000 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#1251 | enhancement | rgrp | rgrp | ckan-backlog | closed | fixed | Rename wiki.ckan.net to wiki.ckan.org |
Inline with general naming policy going forward. |
1311965147000000 | 1317315159000000 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#1250 | enhancement | pudo | rgrp | ckan-v1.5 | closed | fixed | Search results should be sorted by score rather than alphabetical |
At the moment we sort search results alphabetically. While this is useful for doing 'browse' case where no search bad for all other cases. Adopt default sort order of 'score' though may wish to keep alphabetical for no search term (i.e. wildcard). Options:
Aside: may also wish to support search in query api but that is for later! |
1311964752000000 | 1312370201000000 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#1249 | enhancement | pudo | rgrp | ckan-v1.5 | closed | fixed | Exclude script tag from extraction for i18n |
Currently have this script section put in for i18n. It shouldn't be. <script type="text/javascript"> //<![CDATA[ (function($){ $.fn.ajaxCreateSlug = function(name, url) { var title = this; var updater = { init: function(title, name) { // Add a new element where the validity of the package name can be displayed this.name_field = name; this.title_field = title; this.name_field.parent().append('<div id="package_name_valid_msg"></div>'); this.title_field.blur(this.title_change_handler()) this.title_field.keyup(this.title_change_handler()) this.name_field.keyup(this.name_change_handler()); this.name_field.blur(this.name_blur_handler()); this.url = url; }, .... |
1311958536000000 | 1311959356000000 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#1248 | defect | dread | dread | ckan-sprint-2011-11-07 | closed | fixed | License exception |
Exception received on test.ckan.net at 10.12 on 29/7/11 http://test.ckan.net/package?__cache=2759373&page=4 Module pylons.controllers.core:60 in _perform_call << """Hide the traceback for everything above this method""" __traceback_hide__ = 'before_and_this' return func(**args) def _inspect_call(self, func): >> return func(**args) Module ckan.controllers.package:153 in search << } query = get.package_search(context,data_dict) c.page = h.Page( >> query = get.package_search(context,data_dict) Module ckan.logic.action.get:514 in package_search << for package in query.results: result_dict = table_dictize(package, context) result_dict = _extend_package_dict(result_dict,context) results.append(result_dict) >> result_dict = _extend_package_dict(result_dict,context) Module ckan.logic.action.get:537 in _extend_package_dict << license_id = package_dict['license_id'] if license_id: isopen = model.Package.get_license_register()[license_id].isopen() package_dict['isopen'] = isopen else: >> isopen = model.Package.get_license_register()[license_id].isopen() Module ckan.model.license:59 in __getitem__ << return default else: raise KeyError, "License not found: %s" % key def get(self, key, default=None): >> raise KeyError, "License not found: %s" % key KeyError: u'License not found: None' and a similar one: http://test.ckan.net/tag/barbecue Module pylons.wsgiapp:324 in dispatch << if log_debug: log.debug("Calling controller class with WSGI interface") return controller(environ, start_response) def load_test_env(self, environ): >> return controller(environ, start_response) Module ckan.lib.base:118 in __call__ << # available in environ['pylons.routes_dict'] try: return WSGIController.__call__(self, environ, start_response) finally: model.Session.remove() >> return WSGIController.__call__(self, environ, start_response) Module pylons.controllers.core:221 in __call__ << return response(environ, self.start_response) response = self._dispatch_call() if not start_response_called: self.start_response = start_response >> response = self._dispatch_call() Module pylons.controllers.core:172 in _dispatch_call << req.environ['pylons.action_method'] = func response = self._inspect_call(func) else: if log_debug: >> response = self._inspect_call(func) Module pylons.controllers.core:107 in _inspect_call << func.__name__, args) try: result = self._perform_call(func, args) except HTTPException, httpe: if log_debug: >> result = self._perform_call(func, args) Module pylons.controllers.core:60 in _perform_call << """Hide the traceback for everything above this method""" __traceback_hide__ = 'before_and_this' return func(**args) def _inspect_call(self, func): >> return func(**args) Module ckan.controllers.tag:2 in read Module ckan.lib.cache:167 in wrapper << log = __import__("logging").getLogger("proxy_cache") def wrapper(func, *args, **kwargs): result = func(*args, **kwargs) pylons = get_pylons(args) >> result = func(*args, **kwargs) Module ckan.controllers.tag:64 in read << data_dict = {'id':id} try: c.tag = get.tag_show(context,data_dict) except NotFound: abort(404, _('Tag not found')) >> c.tag = get.tag_show(context,data_dict) Module ckan.logic.action.get:341 in tag_show << extended_packages = [] for package in tag_dict['packages']: extended_packages.append(_extend_package_dict(package,context)) tag_dict['packages'] = extended_packages >> extended_packages.append(_extend_package_dict(package,context)) Module ckan.logic.action.get:537 in _extend_package_dict << license_id = package_dict['license_id'] if license_id: isopen = model.Package.get_license_register()[license_id].isopen() package_dict['isopen'] = isopen else: >> isopen = model.Package.get_license_register()[license_id].isopen() Module ckan.model.license:59 in __getitem__ << return default else: raise KeyError, "License not found: %s" % key def get(self, key, default=None): >> raise KeyError, "License not found: %s" % key KeyError: u'License not found: CreativeCommonsAttributionCCBY25' |
1311954136000000 | 1319797763000000 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#1247 | task | rgrp | dread | ckan-sprint-2011-10-28 | closed | fixed | Put docs on ReadTheDocs |
Put docs on ReadTheDocs? instead of eu13. |
1311941948000000 | 1311955185000000 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#1246 | defect | pudo | adrian.pohl@… | ckan-sprint-2011-10-28 | closed | fixed | Search results on ckan.net are mistakenly all 'open' |
All package search results on ckan.net are labelled as 'open' even when their license is closed or unknown: http://ckan.net/package |
1311863353000000 | 1311892816000000 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#1245 | task | rgrp | ckan-v1.5 | closed | fixed | Reorganise ckan.org pages |
Here is Rufus' plan for ckan.org reorganisation from http://ckan.okfnpad.org/documentation (22/7/11) (ticket made by dread): /solutions /overview <--- current 'about' page (the software) /customers <-- say "in addition to our clients..." /features <-- needs most work (pictures etc) /pricing/ <-- simplest thing possible ... talk with Ira (cover pricing and support) /developers <--- links to http://docs.ckan.org/, getting the software, the wiki, the mailing list /contact /blog Tasks:
|
1311861708000000 | 1317422640000000 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#1244 | enhancement | dread | assigned | Notes field carriage-returns converted to CRLF |
When you edit a package in the web form, if the notes field had \n as the End Of Line symbol, it gets lost when you preview or save the package, and the notes field is displayed all on one line. This can be seen when editing annakarenina (as created by 'paster create-test-data'). The diff shows for example: - Some test notes + Some test notes ? + but it would more clearly be shown as: - Some test notes\n + Some test notes ? ++ This is a significant problem with DGU, since a lot comes in via the API. It's not clear what we should do about it. We could standardise on \n or \r\n when the form submission comes in. Do different browsers on different platforms do different things with EOLs? AnalysisDisplaying the package: the Markdown processor respects both EOLs when displaying the field, putting each line in a <p> tag. Creating the package edit form: placed into <textfield>. Browser displaying package edit form: <textfield> displays \n and \r\n as EOL. But \n\n gets compressed to one EOL. But on submission, both are returned as \r\n. Receiving the edited package: Somewhere along the line the EOL gets converted to \n\n. |
1311689456000000 | 1340191253000000 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#1243 | enhancement | timmcnamara | closed | invalid | [thedatahub.org] "Upload Data" should provide a nicer |
If someone who is not logged in clicks on "Upload Data", they are presented with Not authorized to upload files. This is in emboldened red text. That is, the system is telling a user that they're doing something illegitimate, even though they're actually following an invitation from the main menu. I propose two options for resolving this:
ENV: thedatahub.org, CKAN 1.4.2b |
1311577466000000 | 1328000405000000 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#1242 | enhancement | timmcnamara | closed | fixed | thedatahub.org's login page |
The right hand side of thedatahub.org login screen is a little confusing: Not a member? Join CKAN to contribute packages under your own name. - Register - Reset your password - Privacy Policy Suggested improvements to make:
|
1311569218000000 | 1323173292000000 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#1241 | task | timmcnamara | timmcnamara | closed | wontfix | Overview video of http://thedatahub.org |
Produce a video explaining some of the things which can be done on the datahub.org |
1311567813000000 | 1340632688000000 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#1240 | enhancement | kindly | rgrp | ckan-backlog | assigned | [super] API v4 |
(Just creating this ticket as somewhere to keep notes)
|
1311525660000000 | 1325473312000000 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#1239 | defect | rgrp | rgrp | ckan-sprint-2011-10-28 | closed | fixed | Remove and re-add tag on package not working |
See reports on list at:
Tracked this to issue in dictization/model_save whereby was ignoring case where Package Tag already there but in deleted state. Rather than describe at length see fix. |
1311441020000000 | 1312453156000000 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#1238 | defect | kindly | dread | ckan-sprint-2011-10-28 | closed | invalid | Viewing a package @date misses non-PackageRevisions |
There's a problem with getting old versions of packages using @date. The query looks for the PackageRevision? related to the date, but ignores TagRevisions? etc. So for example if you compare this table: http://ckan.net/package/history/osm with this view: http://ckan.net/package/osm%402010-11-30%2000%3A21%3A49.627830 you actually see the 2010-01-13 11:13 revision - the wrong revision. |
1311351303000000 | 1311759784000000 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#1236 | enhancement | dread | dread | ckan-sprint-2011-11-07 | closed | fixed | View a package at a given revision |
As a user I want to view a package at a given revision:
|
1311269333000000 | 1330019788000000 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#1235 | enhancement | thejimmyg | ckan-future | new | [super] Search Improvements |
Child tickets:
Broadly speaking though we need to choose PostgreSQL, Solr or something else. We don't want to invest our time maintaining two search backends with a limited abstraction layer between the two. |
1311182641000000 | 1311182641000000 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#1234 | enhancement | dread | dread | ckan-sprint-2011-10-28 | closed | fixed | Setting locale error conditions handled badly |
Needs tests for error conditions for bad locale and redirect parameters. |
1311179871000000 | 1311183328000000 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#1233 | enhancement | thejimmyg | ckan-backlog | new | [super] Improve wiki-style functionality for history |
At the moment we have a good revisioning system but a poor history interface. We need to improve this in a number of areas:
|
1311179392000000 | 1315948668000000 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#1232 | enhancement | thejimmyg | ckan-backlog | new | [super] Interface improvements |
Child tickets:
|
1311178296000000 | 1315948536000000 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#1231 | requirement | kindly | thejimmyg | ckan-backlog | closed | wontfix | [super] Management Information Reporting |
Child tickets:
We have a spreadsheet from UKLP of statistics we'd like to generate |
1311173919000000 | 1325474447000000 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#1230 | enhancement | kindly | ckan-sprint-2011-10-28 | closed | fixed | Make sure plugins tables work in tests. |
Dgu tests failed as harvesting table are not created at the correct point. |
1311100811000000 | 1311154142000000 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#1229 | enhancement | dread | thejimmyg | ckan-sprint-2011-10-24 | closed | fixed | Refactor all database code out of the controllers and into the logic layer |
Progress can be tracked in this document: |
1311093924000000 | 1319645778000000 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#1228 | enhancement | dread | dread | ckan-sprint-2011-10-28 | closed | fixed | Display OpenID login errors |
When there are errors when logging into OpenID, these don't get displayed. You just get the login screen again. |
1311086562000000 | 1311325161000000 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#1227 | enhancement | timmcnamara | ckan-backlog | new | Display packages' tags in search results |
In when displaying search results, it would be useful to also display the tags of a package. Sometimes it's difficult to infer the scope of what the package does from the title and the first sentence of the description. Tags are quite concise way to display rich information. ENV=datacatalos.org, with CKAN 1.4.2a |
1311034262000000 | 1339774147000000 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#1226 | defect | dread | closed | worksforme | Genshi stream exception |
IndexError? exception in genshi.filters.i18n keeps popping up daily. e.g. ... Module ckan.controllers.authorization_group:28 in index << items_per_page=20 ) return render('authorization_group/index.html') def read(self, id): >> return render('authorization_group/index.html') Module ckan.lib.base:74 in render << return cached_template(template_name, render_template, cache_key=cache_key, cache_type=cache_type, cache_expire=cache_expire) #, ns_options=('method'), method=method) >> cache_type=cache_type, cache_expire=cache_expire) Module pylons.templating:249 in cached_template << return content else: return render_func() >> return render_func() Module ckan.lib.base:63 in render_template << stream = item.filter(stream) return literal(stream.render(method=method, encoding=None)) if 'Pragma' in response.headers: >> return literal(stream.render(method=method, encoding=None)) Module genshi.core:183 in render << method = self.serializer or 'xml' generator = self.serialize(method=method, **kwargs) return encode(generator, method=method, encoding=encoding, out=out) def select(self, path, namespaces=None, variables=None): >> return encode(generator, method=method, encoding=encoding, out=out) Module genshi.output:57 in encode << _encode = lambda string: string if out is None: return _encode(''.join(list(iterator))) for chunk in iterator: out.write(_encode(chunk)) >> return _encode(''.join(list(iterator))) Module genshi.output:339 in __call__ << for filter_ in self.filters: stream = filter_(stream) for kind, data, pos in stream: cached = cache_get((kind, data)) if cached is not None: >> for kind, data, pos in stream: Module genshi.output:670 in __call__ << _gen_prefix = _gen_prefix().next for kind, data, pos in stream: output = cache_get((kind, data)) if output is not None: >> for kind, data, pos in stream: Module genshi.output:771 in __call__ << push_text = textbuf.append pop_text = textbuf.pop for kind, data, pos in chain(stream, [(None, None, None)]): if kind is TEXT: >> for kind, data, pos in chain(stream, [(None, None, None)]): Module genshi.output:586 in __call__ << def __call__(self, stream): prev = (None, None, None) for ev in stream: if prev[0] is START: if ev[0] is END: >> for ev in stream: Module genshi.core:288 in _ensure << # unchanged yield event for event in stream: yield event >> for event in stream: Module genshi.core:288 in _ensure << # unchanged yield event for event in stream: yield event >> for event in stream: Module genshi.filters.transform:686 in _unmark << def _unmark(self, stream): for mark, event in stream: kind = event[0] if not (kind is None or kind is ATTR or kind is BREAK): >> for mark, event in stream: Module genshi.filters.transform:1145 in __call__ << :param stream: The marked event stream to filter """ for mark, event in stream: yield mark, event if mark is ENTER: >> for mark, event in stream: Module genshi.filters.transform:714 in __call__ << stream = iter(stream) next = stream.next for mark, event in stream: if mark is None: yield mark, event >> for mark, event in stream: Module genshi.filters.transform:682 in _mark << def _mark(self, stream): for event in stream: yield OUTSIDE, event >> for event in stream: Module genshi.core:288 in _ensure << # unchanged yield event for event in stream: yield event >> for event in stream: Module genshi.filters.transform:686 in _unmark << def _unmark(self, stream): for mark, event in stream: kind = event[0] if not (kind is None or kind is ATTR or kind is BREAK): >> for mark, event in stream: Module ckanext.googleanalytics.plugin:62 in download_adder << (downloaded %s times)</span>''' count = None for mark, (kind, data, pos) in stream: if mark and kind == START: href = data[1].get('href') >> for mark, (kind, data, pos) in stream: Module genshi.filters.transform:714 in __call__ << stream = iter(stream) next = stream.next for mark, event in stream: if mark is None: yield mark, event >> for mark, event in stream: Module genshi.filters.transform:682 in _mark << def _mark(self, stream): for event in stream: yield OUTSIDE, event >> for event in stream: Module genshi.core:288 in _ensure << # unchanged yield event for event in stream: yield event >> for event in stream: Module genshi.filters.transform:686 in _unmark << def _unmark(self, stream): for mark, event in stream: kind = event[0] if not (kind is None or kind is ATTR or kind is BREAK): >> for mark, event in stream: Module genshi.filters.transform:1175 in __call__ << """ callable_value = hasattr(self.value, '__call__') for mark, (kind, data, pos) in stream: if mark is ENTER: if callable_value: >> for mark, (kind, data, pos) in stream: Module genshi.filters.transform:714 in __call__ << stream = iter(stream) next = stream.next for mark, event in stream: if mark is None: yield mark, event >> for mark, event in stream: Module genshi.filters.transform:682 in _mark << def _mark(self, stream): for event in stream: yield OUTSIDE, event >> for event in stream: Module genshi.core:288 in _ensure << # unchanged yield event for event in stream: yield event >> for event in stream: Module genshi.filters.transform:686 in _unmark << def _unmark(self, stream): for mark, event in stream: kind = event[0] if not (kind is None or kind is ATTR or kind is BREAK): >> for mark, event in stream: Module genshi.filters.transform:1145 in __call__ << :param stream: The marked event stream to filter """ for mark, event in stream: yield mark, event if mark is ENTER: >> for mark, event in stream: Module genshi.filters.transform:714 in __call__ << stream = iter(stream) next = stream.next for mark, event in stream: if mark is None: yield mark, event >> for mark, event in stream: Module genshi.filters.transform:682 in _mark << def _mark(self, stream): for event in stream: yield OUTSIDE, event >> for event in stream: Module genshi.template.base:618 in _include << tmpl = self.loader.load(href, relative_to=event[2][0], cls=cls or self.__class__) for event in tmpl.generate(ctxt, **vars): yield event except TemplateNotFound: >> for event in tmpl.generate(ctxt, **vars): Module genshi.template.base:618 in _include << tmpl = self.loader.load(href, relative_to=event[2][0], cls=cls or self.__class__) for event in tmpl.generate(ctxt, **vars): yield event except TemplateNotFound: >> for event in tmpl.generate(ctxt, **vars): Module genshi.template.base:618 in _include << tmpl = self.loader.load(href, relative_to=event[2][0], cls=cls or self.__class__) for event in tmpl.generate(ctxt, **vars): yield event except TemplateNotFound: >> for event in tmpl.generate(ctxt, **vars): Module genshi.template.base:605 in _include << from genshi.template.loader import TemplateNotFound for event in stream: if event[0] is INCLUDE: href, cls, fallback = event[1] >> for event in stream: Module genshi.template.markup:378 in _match << for event in self._match(self._flatten(template, ctxt, **vars), ctxt, start=idx + 1, **vars): yield event >> ctxt, start=idx + 1, **vars): Module genshi.template.markup:327 in _match << break for event in stream: # We (currently) only care about start and end events for matching >> for event in stream: Module genshi.template.base:545 in _flatten << while 1: for kind, data, pos in stream: if kind is START and data[1]: >> for kind, data, pos in stream: Module genshi.filters.i18n:177 in _generate << msgbuf.append(*previous) previous = None for event in msgbuf.translate(gettext(msgbuf.format())): yield event if previous: >> for event in msgbuf.translate(gettext(msgbuf.format())): Module genshi.filters.i18n:1029 in translate << ) parts = parse_msg(string) parts_counter = {} for order, string in parts: >> parts = parse_msg(string) Module genshi.filters.i18n:1143 in parse_msg << if string: parts.append((stack[-1], string)) return parts >> parts.append((stack[-1], string)) IndexError: list index out of range |
1311008861000000 | 1314029434000000 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#1225 | enhancement | dread | dread | ckan-sprint-2011-10-28 | closed | fixed | Tool for mass tag changes |
Using ckanapi |
1310642161000000 | 1310642407000000 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#1223 | enhancement | pudo | pudo | closed | fixed | Caching of static files |
StaticURLParser can have caching - use it |
1310573854000000 | 1310573893000000 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#1222 | defect | dread | dread | ckan-sprint-2011-10-28 | closed | fixed | Mailer has no tests | 1310479136000000 | 1310556618000000 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#1221 | defect | dread | dread | ckan-sprint-2011-10-28 | closed | fixed | Password reset tidy up |
|
1310475661000000 | 1310556607000000 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#1219 | defect | timmcnamara | closed | fixed | CSS issues on IE7 |
As reported on ckan-dev:
|
1310423688000000 | 1310740534000000 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#1218 | enhancement | dread | minspamboks@… | ckan-sprint-2011-10-28 | closed | fixed | Colour the History tab icon |
Change the color of the "History" tab icon to yellowish, like the rest of the icons in the other tabs ("View" and "Edit", "Authorization"). ReasoningWhen you view a data package, for instance http://ckan.net/package/thesaurus-w, you will see "View", "Edit", "History" tabs on the top. "History" tab has a black-and-white icon which makes it look like an inactive/disabled tab (since the text is also grayed out when the tab is not selected). This is not a major issue, but it is a little bit confusing for the users. This icon exists in v1.3.2 and also in v1.4.1a (that runs on ckan.net). The simple solution would be to change the color of the "History" tab icon and give it the same yellowish color like the rest of the icons in the other tabs (e.g. "View" and "Edit"). |
1310375768000000 | 1310389390000000 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#1217 | defect | dread | dread | ckan-sprint-2011-11-07 | closed | invalid | Diff exception |
Exception raised doing this particular diff. ... Module ckan.controllers.revision:142 in diff << if c.diff_entity == 'package': c.pkg = model.Package.by_name(id) diff = c.pkg.diff(c.revision_to, c.revision_from) elif c.diff_entity == 'group': c.group = model.Group.by_name(id) >> diff = c.pkg.diff(c.revision_to, c.revision_from) Module ckan.model.package:449 in diff << display_id = to_obj_rev.tag.name elif obj_class.__name__ == 'PackageExtra': display_id = to_obj_rev.key else: display_id = related_obj_id[:4] >> display_id = to_obj_rev.key AttributeError: 'NoneType' object has no attribute 'key' Seems to be to do with this particular extra key: [<PackageExtraRevision id=ba1f3b3e-f61f-4924-bae0-ec3dd2163ae4 package_id=febe4da9-5874-4411-a7da-b497fdebf739 key=namespace value=http://www.sudoc.fr/ state=active revision_id=5ec8e730-c73d-4f1c-989b-2e015eb3d315 continuity_id=ba1f3b3e-f61f-4924-bae0-ec3dd2163ae4 expired_id=None revision_timestamp=2011-07-08 13:48:11.027260 expired_timestamp=9999-12-31 00:00:00 current=True>] Is it because it was created between the from_revision and to_revision? |
1310375498000000 | 1320663277000000 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#1215 | defect | dread | closed | fixed | Edit Resources table - removing all rows prevents adding them again |
I'm not sure if this was reported earlier, but I have found a minor bug in the "Add new package" form. As far as I can see this bug exists in v1.3.2 and also in v1.4.1a (that runs on ckan.net). This is a problem with adding new resources in "Resources" section. To reproduce the bug do the following:
The simplest solution to this bug will be to hide the "Remove this row" link if there is only one row. |
1310133224000000 | 1310385485000000 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#1214 | defect | dread | dread | closed | worksforme | API improvements (following javascript use) |
Notes on the CKAN API from Aron:
|
1309975222000000 | 1314029628000000 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#1211 | enhancement | kindly | kindly | ckan-v1.5 | closed | fixed | [super] Drupal integration |
Sub-tasks / tickets:
|
1309958442000000 | 1315948703000000 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#1210 | defect | dread | dread | ckan-v1.5-sprint-4 | closed | fixed | POST application/json error handling with newer WebOb |
WebOb? from v1.0.7 has some interesting new behaviour with reading request data for different Content-Types:
Example: Module ckan.controllers.api:206 in create << log.debug('create: %s' % (context)) try: request_data = self._get_request_data() except ValueError, inst: response.status_int = 400 >> request_data = self._get_request_data() Module ckan.lib.base:149 in _get_request_data << cls.log.debug('Retrieving request params: %r' % request.params) cls.log.debug('Retrieving request POST: %r' % request.POST) cls.log.debug('Retrieving request POST body: %r' % request.body) if request.POST: try: >> cls.log.debug('Retrieving request POST body: %r' % request.body) Module paste.registry:137 in __getattr__ << def __getattr__(self, attr): return getattr(self._current_obj(), attr) def __setattr__(self, attr, value): >> return getattr(self._current_obj(), attr) Module webob.request:470 in _body__get << Return the content of the request body. """ self.make_body_seekable() # we need this to have content_length r = self.body_file.read(self.content_length) self.body_file.seek(0) >> self.make_body_seekable() # we need this to have content_length Module webob.request:697 in make_body_seekable << self.body_file_raw.seek(0) else: self.copy_body() >> self.copy_body() Module webob.request:714 in copy_body << self.body = self.body_file_raw.read(length) elif self.is_body_readable: self.body = self.body_file_raw.read() self._copy_body_tempfile() else: >> self.body = self.body_file_raw.read() Module webob.request:1190 in read << def read(self, size=-1): body = self._get_body() if size < 0: v = body[self.position:] >> body = self._get_body() Module webob.request:1207 in _get_body << self._body = _encode_multipart(self.vars, self.content_type) else: assert 0, ('Bad content type: %r' % self.content_type) return self._body >> assert 0, ('Bad content type: %r' % self.content_type) AssertionError: Bad content type: '; charset=utf-8' |
1309949451000000 | 1309974781000000 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#1209 | defect | kindly | closed | fixed | sort out rendering of formalchemy package preview |
Got broken due to the moderated edits changes #1141. Need to make sure preview works. |
1309817240000000 | 1310571715000000 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#1208 | enhancement | rgrp | rgrp | ckan-sprint-2011-10-28 | closed | fixed | Webstore: a datastore with web API |
Current code is here: https://github.com/okfn/webstore. API SpecReadTwo basic ways to query:: GET: /{owner}/{db-name}/?sql=... GET: /{owner}/{db-name}/?table=...&attr=value&attr=value&limit=... Returns:: { u'keys': [u'id', u'name'], u'data': [ [1, u'jones'], [u'aaa', u'jones'] ] } WritePOST to::
Payload is json data structured as follows::
Authentication and AuthorizationAuthentication: use basic auth header. Authorization:
Possible future: config file can specify a python method (TODO: method signature) Integration with Other SystemsTODO: Specify how to delegate authenatication to user database in some other system. |
1309804460000000 | 1312191646000000 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#1207 | enhancement | dread | dread | closed | fixed | ckanclient.package_entity_get should raise more specific exception |
When package does not exist in ckan catalogue, ckanclient.package_entity_get should raise more specific exception, such as CkanNotFoundError? instead of generic CkanApiError?. |
1309515582000000 | 1311325343000000 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#1206 | defect | wwaites | dread | closed | fixed | "Content-Type json" header scuppers package POST |
Compare these two requests to create a package: curl http://test.ckan.net/api/rest/package -d '{name:"test"}' -H 'Content-Type: application/json' -H 'X-CKAN-API-KEY: tester' curl http://test.ckan.net/api/rest/package -d '{name:"test"}' -H 'X-CKAN-API-KEY: tester' The second one gets the payload through (ckan log): Retrieving request params: UnicodeMultiDict([('{name:"test"}', u'')]) But the first one causes a ServerError? because the payload (name:"test") doesn't make it to request.POST or request.params: Retrieving request params: UnicodeMultiDict([]) The only difference is the "ContentType?: application/json" header, which seems a reasonable thing to include. Javascript lib backbone.js (for example) inserts this automatically. So why does this header cause the payload to not get through to the request object? |
1309344348000000 | 1309450216000000 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#1205 | defect | kindly | dread | closed | fixed | db upgrade problem on cz.ckan.net |
When upgrading database for cz.ckan.net (psql.okfn.org/cz.okfn.org) an error occurred (see below). cz.ckan.net has been running on eu3 and this updrade was part of moving it to eu19, with a more recent version of ckan. In the meantime I've reverted the db to the old version (pre-upgrade). cz.ckan.net is not working properly until this is fixed. okfn@eu19:~$ paster --plugin ckan db upgrade --config=/etc/ckan/cz/cz.ini /usr/lib/pymodules/python2.6/ckan_deps/sqlalchemy/engine/url.py:105: SADeprecationWarning: The SQLAlchemy PostgreSQL dialect has been renamed from 'postgres' to 'postgresql'. The new URL format is postgresql[+driver]://<user>:<pass>@<host>/<dbname> module = __import__('sqlalchemy.dialects.%s' % (dialect, )).dialects 2011-06-29 09:07:41,294 INFO [migrate.versioning.api] 28 -> 29... /usr/lib/pymodules/python2.6/ckan_deps/sqlalchemy/engine/reflection.py:46: SAWarning: Skipped unsupported reflection of expression-based index idx_pkg_lname ret = fn(self, con, *args, **kw) /usr/lib/pymodules/python2.6/ckan_deps/sqlalchemy/engine/reflection.py:46: SAWarning: Skipped unsupported reflection of expression-based index idx_pkg_slname ret = fn(self, con, *args, **kw) /usr/lib/pymodules/python2.6/ckan_deps/sqlalchemy/engine/reflection.py:46: SAWarning: Skipped unsupported reflection of expression-based index idx_pkg_suname ret = fn(self, con, *args, **kw) /usr/lib/pymodules/python2.6/ckan_deps/sqlalchemy/engine/reflection.py:46: SAWarning: Skipped unsupported reflection of expression-based index idx_pkg_uname ret = fn(self, con, *args, **kw) Traceback (most recent call last): File "/usr/bin/paster", line 18, in <module> command.run() File "/usr/lib/pymodules/python2.6/paste/script/command.py", line 84, in run invoke(command, command_name, options, args[1:]) File "/usr/lib/pymodules/python2.6/paste/script/command.py", line 123, in invoke exit_code = runner.run(args) File "/usr/lib/pymodules/python2.6/paste/script/command.py", line 218, in run result = self.command() File "/usr/lib/pymodules/python2.6/ckan/lib/cli.py", line 84, in command model.repo.upgrade_db() File "/usr/lib/pymodules/python2.6/ckan/model/__init__.py", line 163, in upgrade_db mig.upgrade(self.metadata.bind, self.migrate_repository, version=version) File "/usr/lib/pymodules/python2.6/ckan_deps/migrate/versioning/api.py", line 185, in upgrade return _migrate(url, repository, version, upgrade=True, err=err, **opts) File "<string>", line 2, in _migrate File "/usr/lib/pymodules/python2.6/ckan_deps/migrate/versioning/util/__init__.py", line 160, in with_engine return f(*a, **kw) File "/usr/lib/pymodules/python2.6/ckan_deps/migrate/versioning/api.py", line 364, in _migrate schema.runchange(ver, change, changeset.step) File "/usr/lib/pymodules/python2.6/ckan_deps/migrate/versioning/schema.py", line 83, in runchange change.run(self.engine, step) File "/usr/lib/pymodules/python2.6/ckan_deps/migrate/versioning/script/py.py", line 140, in run script_func(engine) File "/usr/lib/pymodules/python2.6/ckan/migration/versions/029_version_groups.py", line 152, in upgrade migrate_engine.execute(q) File "/usr/lib/pymodules/python2.6/ckan_deps/sqlalchemy/engine/base.py", line 1788, in execute return connection.execute(statement, *multiparams, **params) File "/usr/lib/pymodules/python2.6/ckan_deps/sqlalchemy/engine/base.py", line 1191, in execute params) File "/usr/lib/pymodules/python2.6/ckan_deps/sqlalchemy/engine/base.py", line 1271, in _execute_clauseelement return self.__execute_context(context) File "/usr/lib/pymodules/python2.6/ckan_deps/sqlalchemy/engine/base.py", line 1302, in __execute_context context.parameters[0], context=context) File "/usr/lib/pymodules/python2.6/ckan_deps/sqlalchemy/engine/base.py", line 1401, in _cursor_execute context) File "/usr/lib/pymodules/python2.6/ckan_deps/sqlalchemy/engine/base.py", line 1394, in _cursor_execute context) File "/usr/lib/pymodules/python2.6/ckan_deps/sqlalchemy/engine/default.py", line 299, in do_execute cursor.execute(statement, parameters) sqlalchemy.exc.IntegrityError: (IntegrityError) insert or update on table "package_group_revision" violates foreign key constraint "package_group_revision_continuity_id_fkey" DETAIL: Key (continuity_id)=(7f373978-40a0-4848-bdc9-018ad213aa0b) is not present in table "package_group". 'INSERT INTO package_group_revision (id, package_id, group_id, state, revision_id, continuity_id) VALUES (%(id)s, %(package_id)s, %(group_id)s, %(state)s, %(revision_id)s, %(continuity_id)s)' {'state': u'active', 'package_id': u'14d76e9e-028c-49c1-955b-ef30d4abb970', 'continuity_id': u'7f373978-40a0-4848-bdc9-018ad213aa0b', 'revision_id': u'24a11f58-2ff9-46f3-b113-0bf7f0baf254', 'group_id': u'4b832199-b8e3-4989-9b5d-de8dd6322612', 'id': u'7a3863bd-3054-40c8-bb3d-68b73096c108'} |
1309339700000000 | 1310568631000000 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#1204 | enhancement | timmcnamara | closed | invalid | renaming packages seems to result in a server error |
When renaming a package, and doing other changes at the same time an error is reported. However, the changes seem to go through fine. ENV:
|
1309303816000000 | 1311179980000000 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#1203 | defect | johnglover | rolf | ckan-backlog | new | Moderated edits: html code shows as "changed" although it is not |
I've installed the Moderated Edits extension (ckanext-moderatededits) and am editing a package imported from IATIregistry.org, with an extra field which contains a bit of HTML. The editor indicates the field has changed, although the content hasn't (see screenshot). All I can find so far is a minor difference: in the field content, there is a code — and in the rendered table that is an — |
1309274970000000 | 1313401579000000 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#1202 | enhancement | rgrp | rolf | closed | invalid | Links to datapkg utility don't lead to info about it |
In the presentation of data packages, the link in "The information on this page and the downloads / resources are also available using the datapkg command line utility." (http://knowledgeforge.net/ckan/doc/datapkg/install.html) ends up at the home page of ckan.org Perhaps link it to https://bitbucket.org/okfn/datapkg/overview for now, to save some searching for people who want to find out more? |
1309263613000000 | 1315821804000000 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#1201 | enhancement | kindly | ckan-backlog | new | seperate out logic in atom feeds to logic layer. |
Simplify the logic in the atom feed an make all feeds use logic layer to return lists. |
1308928892000000 | 1310124297000000 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#1200 | enhancement | pudo | closed | duplicate | Port PDEU theme to CKAN.net |
PDEU has a newer layout which could be adapted to also be used on ckan.net. For this, things should be cleaned up, copied to the ckanext-ckan.net repo as needed and re-colored the core CKAN color scheme. Maybe we could have this coincide with a CKAN rename? |
1308824017000000 | 1311180218000000 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#1199 | enhancement | pudo | pudo | closed | fixed | Implement an email function for users. |
We need an email function in CKAN to accept messages sent to users. The basic signature will be:
This has a number of use cases:
Finally, the mail function should be exposed in the API for sysadmin clients. This way we can have scripts traverse CKAN for 404s, invalid data or missing fields and ping users about that automatically (requires traversal by revision, not package, to get the associated users). ImplementationNote we have already written code like this (*and* tested it) in isitopen: |
1308821986000000 | 1310555589000000 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#1198 | enhancement | dread | ckan-backlog | new | Publisher hierarchy |
'Publisher' entities in the model. They are hierarchical. 'User-Publisher' connections with one or more roles (e.g. drafter, moderator). Authorization settings can control who can set what values in a 'published by' type field. Publishers and User-Publishers available to read in the API. Future tickets will provide:
(This feature deprecates authorization groups) |
1308820592000000 | 1339774200000000 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#1197 | enhancement | timmcnamara | ckan-backlog | closed | wontfix | Add JavaScript guide for CKAN |
A new library, guiders.js, has been open sourced that seems to be great at unobtrusively introducing new users to features of websites. The library drives Optimizely's website. The GitHub repo is here: https://github.com/jeff-optimizely/Guiders-JS Some examples: |
1308801032000000 | 1340020357000000 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#1196 | defect | dread | dread | ckan-v1.5-sprint-3 | closed | fixed | Markdown logging ignores config settings |
Markdown produces Debug logging, even when the pylons logging config is set to level of Info or Warning. This clogs up the logfile. |
1308743476000000 | 1308743857000000 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#1195 | defect | rgrp | dread | ckan-sprint-2011-10-28 | closed | fixed | Storage extension to handle incorrect routes better |
We've seen exceptions caused by people getting the file storage link wrong, adding a slash to the end. e.g. http://ckan.net/storage/f/file/e696d857-e997-41c8-be08-408697168ca8/ We should aim to handle all requests better than causing exception. 404 (or even 302 in this case) is better than 500. |
1308576769000000 | 1311964374000000 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#1194 | defect | dread | closed | fixed | "Welcome back" message for newly registered user |
|
1308563392000000 | 1317053688000000 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#1193 | enhancement | kindly | kindly | closed | fixed | bug with new formalchemy causing all resouces to be deleted |
The new formalchemy stores dict in a new format. |
1308525655000000 | 1309768960000000 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#1192 | task | annapowellsmith | annapowellsmith | ckan-sprint-2011-10-28 | closed | fixed | Convert CKAN Sphinx docs into admin/reference manual |
As part of the general documentation overhaul (ticket:1142) we (APS and RGRP) want to convert the current Sphinx docs into:
The current chapters of the Sphinx docs should be moved as follows:
|
1308324593000000 | 1312191462000000 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#1191 | defect | dread | dread | ckan-v1.5-sprint-3 | closed | fixed | Unicode in user password gives 500 error on user registration |
Create/register a user with a unicode character in the password. It creates the user, but the redirect to the user page doesn't work and results in 500 error. |
1308312895000000 | 1308650930000000 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#1190 | enhancement | rgrp | rgrp | ckan-v1.5 | closed | fixed | [super] CREP 0004 Data API and Data Processing System |
For some time (e.g. 1y+!) we have known that we want to integrate some kind of datastore / data processing system with CKAN. We've had a CREP in progress on this for some months (may copy that here at some point): We can distinguish 3 modules that are needed:
Suggestion is this would be sqlite based with a simple sql based API. http://ckan.net/api/data/{user|org}/{datastore_name}?q={some-read-sql-query}
get a long way with simple javascript running in the browser for development with this javascript then run offline using something like nodejs. Alternatively one could allow one to specify a url to e.g. a python file which would then be run in a sandbox (with access to some specified set of python modules) - #1432 More info |
1308227611000000 | 1323270522000000 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#1189 | enhancement | timmcnamara | closed | invalid | Spideroak support in CKAN Storage |
Spideroak is a bulk storage platform by a company that releases quite a lot of free software, has an extensive developer API with pricing of $10/100GB/month. The data store is optimised for bulk data storage and retrieval. This is the kind of use case that CKAN packages require. We don't need low latency. We are after low cost, high reliability solution. |
1308187104000000 | 1323173227000000 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#1188 | enhancement | nickstenning | ckan-backlog | new | Allow diffing against initial (blank) package version |
Currently the history page only allows diffing between different versions of a package, but there doesn't appear to be any easy way to see the changes introduced by the first version of a package. I'm requesting the ability to diff against a "blank slate" initial state of a project, so I can see the content of the first project commit. Not sure if this is a vdm feature, so I'm putting this ticket in against ckan. |
1308153160000000 | 1339774275000000 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#1187 | enhancement | dread | dread | ckan-v1.5-sprint-3 | closed | fixed | Stop spam users with links in the 'about' field |
When you edit a user, you should be stopped from putting links in the 'about' field, because this is a common tactic by spammers. |
1308142999000000 | 1308143605000000 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#1186 | enhancement | dread | closed | fixed | Password reset facility |
You can register a user with password and (optional) email address. But if you forget the password you can't then log in again. We need a password reset facility that sends and email with a new password. |
1308142766000000 | 1310556519000000 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#1185 | defect | timmcnamara | ckan-backlog | new | Administrators can't delete packages from web UI |
Administrators have "View", "Edit" and "History" tabs. However, I can't see a way to delete a package from the web UI. Version: CKAN.net as of today |
1308111818000000 | 1339774289000000 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#1184 | enhancement | timmcnamara | ckan-backlog | new | Support Wuala as CKAN storage option |
Most of CKANs storage options are tied to the USA. This brings concerns of data security for some organisations who may wish to adopt the system. Wuala is a distributed file system that stores data in a peer-to-peer manner. The company behind it, LaCie? sells storage for a fee. However, they also enable clients to have 'free' storage space when machines act as a storage node. In order to be a storage node, a machine needs to be online for more than 14% of the time - roughly 4h per day. Most CKAN servers are likely to have a far greater uptime than this. Supporting Wuala would go some way to enabling CKAN to be used in a secure manner. That is, CKAN could be promoted for organisational use where there is lots of data to be stored and large geographic distances to be managed. There is a Python client available and a fairly long Google Tech Talk that overviews the system. |
1308034751000000 | 1339774306000000 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#1183 | defect | johnglover | nickstenning | ckan-sprint-2011-10-28 | closed | fixed | Downloads "Preview" button doesn't preview. |
The "Preview" button is a nice idea, but it doesn't seem to actually "preview" anything if the file MIME type would ordinarily cause the browser to download the file. If so, the browser does indeed just download the file. This is notable in the context of most hosted file services (including Google Storage) which will deliberately serve a MIME type of application/x-some-junk-here in order to force a download. |
1307701669000000 | 1311771069000000 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#1182 | defect | timmcnamara | ckan-backlog | new | Comments from deleted packages appear in "Recent Comments" feed |
When a package has been deleted, say for spam moderation, comments still appear in the recent comments section. This is a problem because non-admin users will be shown a warning that they're not authorised to view the package if they click on the link. At CKAN.net currently, this affects the most recent comment. |
1307658251000000 | 1339774319000000 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#1181 | defect | dread | dread | closed | fixed | Link spam vulnerability in Notes and User-About fields |
When viewing a user and a package, the about/notes fields contain Markdown, which may have links. These should have rel="nofollow" to discourage link spam. |
1307523160000000 | 1307532816000000 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#1180 | defect | dread | dread | ckan-v1.5-sprint-3 | closed | fixed | Links in markdown can be badly formed |
User can insert bad anchor tags into the User-About and Package-Notes fields and when you view them (web interface) it causes a 500 error. Need to improve filtering for anchors in markdown. <a href="http://xxxsex.com>nasty/website Also check this related exception: Module ckan.controllers.user:59 in read << c.is_myself = user.name == c.user c.api_key = user.apikey c.about_formatted = self._format_about(user.about) revisions_q = model.Session.query(model.Revision ).filter_by(author=user.name) >> c.about_formatted = self._format_about(user.about) Module ckan.controllers.user:167 in _format_about << def _format_about(self, about): about_formatted = ckan.misc.MarkdownFormat().to_html(about) return genshi.HTML(about_formatted) def _get_form_password(self): >> return genshi.HTML(about_formatted) WebApp Error: <class 'genshi.input.ParseError'>: junk characters in start tag: u'\u201dhttp://www.settingu': line 1, column 3 |
1307469037000000 | 1307544223000000 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#1179 | enhancement | timmcnamara | ckan-backlog | new | Support tag aliases |
A small number of tags are near-duplicates of each other. Perhaps we could support word stemming from NLTK and/or manual tag aliases:
|
1307429221000000 | 1339774332000000 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#1178 | defect | fccoelho | closed | fixed | Local storage issue with ckanext-storage |
I have followed the instruction for installation a configuration of ckanext-storage, but I am getting this error when I try to access the /storage/upload url: URL: http://ckan.emap.fgv.br/storage/upload Module weberror.errormiddleware:162 in call << traceback_supplement = Supplement, self, environ
Module beaker.middleware:73 in call << self.cache_manager)
Module beaker.middleware:152 in call << headers.append(('Set-cookie', cookie))
Module routes.middleware:130 in call << environSCRIPT_NAME? = environSCRIPT_NAME?[:-1]
Module pylons.wsgiapp:124 in call << return % paste.registry.restorer.get_request_id(environ)?
Module pylons.wsgiapp:263 in resolve << if self.log_debug:
Module ckan.config.environment:39 in find_controller << # Check to see if its a dotted name
Module pkg_resources:1954 in load << def load(self, require=True, env=None, installer=None):
Module ?:87 in <module> << class StorageAPIController(BaseController?):
Module ?:88 in StorageAPIController << class StorageAPIController(BaseController?):
Module ?:69 in get_ofs << continue
Module ofs.local.pairtreestore:26 in init << self.hashing_type = hashing_type
Module ofs.local.pairtreestore:30 in _open_store << def _open_store(self):
Module pairtree.pairtree_client:91 in init << self._decode = re.compile(r"\(..)", re.U)
Module pairtree.pairtree_client:264 in _init_store << self.uri_base = prefix
NotAPairtreeStoreException: CGI Variables AUTH_TYPE 'cookie' DOCUMENT_ROOT '/etc/apache2/htdocs' GATEWAY_INTERFACE 'CGI/1.1' HTTP_ACCEPT 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8' HTTP_ACCEPT_CHARSET 'ISO-8859-1,utf-8;q=0.7,*;q=0.7' HTTP_ACCEPT_ENCODING 'gzip, deflate' HTTP_ACCEPT_LANGUAGE 'pt-br,pt;q=0.8,en-us;q=0.5,en;q=0.3' HTTP_CONNECTION 'keep-alive' HTTP_COOKIE 'utma=4669863.1260802706.1295364409.1306935693.1306960483.86; utmz=4669863.1295364409.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); SESS61faf7f7d2406929b2f9eb4cbfff17d2=a3306f5d1194cf0d8a51dbf7b42c1259; ckan=d4951177ef995d92f0f987d481bd9180aa0f89e4518921db9cd9b6ac75fdd3fab4a25d06; auth_tkt="c6c3c3e0b3fe7bb765356659992760b24da43221flaviouserid_type:unicode"; auth_tkt="c6c3c3e0b3fe7bb765356659992760b24da43221flaviouserid_type:unicode"; ckan_user="flavio"; ckan_display_name="Fl\xc3\xa1vio Code\xc3\xa7o Coelho"; ckan_apikey="c139718d-918f-4a2b-b219-e33cb05cbe23"; utmc=4669863; hide_welcome_message=1' HTTP_HOST 'ckan.emap.fgv.br' HTTP_KEEP_ALIVE '115' HTTP_USER_AGENT 'Mozilla/5.0 (X11; Linux x86_64; rv:2.0.1) Gecko/20100101 Firefox/4.0.1' PATH_INFO '/storage/upload' PATH_TRANSLATED '/home/flavio/var/srvc/ckan.emap.fgv.br/pyenv/bin/ckan.emap.fgv.br.py/storage/upload' REMOTE_ADDR '10.250.48.110' REMOTE_PORT '57426' REMOTE_USER u'flavio' REMOTE_USER_DATA 'userid_type:unicode' REMOTE_USER_TOKENS [] REQUEST_METHOD 'GET' REQUEST_URI '/storage/upload' SCRIPT_FILENAME '/home/flavio/var/srvc/ckan.emap.fgv.br/pyenv/bin/ckan.emap.fgv.br.py' SERVER_ADDR '10.252.2.60' SERVER_ADMIN '[no address given]' SERVER_NAME 'ckan.emap.fgv.br' SERVER_PORT '80' SERVER_PROTOCOL 'HTTP/1.1' SERVER_SIGNATURE '<address>Apache/2.2.16 (Debian) Server at ckan.emap.fgv.br Port 80</address>\n' SERVER_SOFTWARE 'Apache/2.2.16 (Debian)' WSGI Variables application <beaker.middleware.CacheMiddleware? object at 0x7fc2999a6cd0> beaker.cache <beaker.cache.CacheManager? object at 0x7fc2999a6d90> beaker.get_session <bound method SessionMiddleware?._get_session of <beaker.middleware.SessionMiddleware? object at 0x7fc2999a6d10>> beaker.session {'locale': u'pt_BR', '_accessed_time': 1307373458.4790759, '_creation_time': 1302605470.0245121} mod_wsgi.application_group 'dck093|' mod_wsgi.callable_object 'application' mod_wsgi.handler_script mod_wsgi.input_chunked '0' mod_wsgi.listener_host mod_wsgi.listener_port '80' mod_wsgi.process_group 'ckan' mod_wsgi.request_handler 'wsgi-script' mod_wsgi.script_reloading '1' mod_wsgi.version (3, 3) paste.cookies (<SimpleCookie: SESS61faf7f7d2406929b2f9eb4cbfff17d2='a3306f5d1194cf0d8a51dbf7b42c1259' __utma='4669863.1260802706.1295364409.1306935693.1306960483.86' __utmc='4669863' __utmz='4669863.1295364409.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none)' auth_tkt='c6c3c3e0b3fe7bb765356659992760b24da43221flavio!userid_type:unicode' ckan='d4951177ef995d92f0f987d481bd9180aa0f89e4518921db9cd9b6ac75fdd3fab4a25d06' ckan_apikey='c139718d-918f-4a2b-b219-e33cb05cbe23' ckan_display_name='Fl\xc3\xa1vio Code\xc3\xa7o Coelho' ckan_user='flavio' hide_welcome_message='1'>, 'utma=4669863.1260802706.1295364409.1306935693.1306960483.86; utmz=4669863.1295364409.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); SESS61faf7f7d2406929b2f9eb4cbfff17d2=a3306f5d1194cf0d8a51dbf7b42c1259; ckan=d4951177ef995d92f0f987d481bd9180aa0f89e4518921db9cd9b6ac75fdd3fab4a25d06; auth_tkt="c6c3c3e0b3fe7bb765356659992760b24da43221flavio!userid _type:unicode"; auth_tkt="c6c3c3e0b3fe7bb765356659992760b24da43221fla...lcome_message=1') paste.registry <paste.registry.Registry object at 0x7fc299de4f50> paste.throw_errors True pylons.environ_config {'session': 'beaker.session', 'cache': 'beaker.cache'} pylons.pylons <pylons.util.PylonsContext? object at 0x7fc299e27d50> pylons.routes_dict {'action': u'index', 'controller': u'ckanext.storage.controller:StorageController'} repoze.who.identity <repoze.who identity (hidden, dict-like) at 140473773131872> repoze.who.logger <logging.Logger instance at 0x7fc2999a3b48> repoze.who.plugins {'openid': <OpenIdIdentificationPlugin? 140473779397008>, 'friendlyform': <FriendlyFormPlugin? 140473777417040>, 'ckan.lib.authenticator:UsernamePasswordAuthenticator': <ckan.lib.authenticator.UsernamePasswordAuthenticator? object at 0x7fc299b93a50>, 'auth_tkt': <AuthTktCookiePlugin? 140473779397136>, 'ckan.lib.authenticator:OpenIDAuthenticator': <ckan.lib.authenticator.OpenIDAuthenticator object at 0x7fc299b934d0>} routes.route <routes.route.Route object at 0x7fc299864090> routes.url <routes.util.URLGenerator object at 0x7fc299e27ed0> webob._parsed_query_vars (GET([]), ) webob.adhoc_attrs {'language': 'en-us'} wsgi process 'Multi process AND threads (?)' wsgi.file_wrapper <built-in method file_wrapper of mod_wsgi.Adapter object at 0x7fc299dae4e0> wsgi.version (1, 1) wsgiorg.routing_args (<routes.util.URLGenerator object at 0x7fc299e27ed0>, {'action': u'index', 'controller': u'ckanext.storage.controller:StorageController'}) Reply Reply to all Forward Reply to all paste@localhost to fccoelho show details 10:17 (2 hours ago)
CGI Variables AUTH_TYPE 'cookie' DOCUMENT_ROOT '/etc/apache2/htdocs' GATEWAY_INTERFACE 'CGI/1.1' HTTP_ACCEPT 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8' HTTP_ACCEPT_CHARSET 'ISO-8859-1,utf-8;q=0.7,*;q=0.7' HTTP_ACCEPT_ENCODING 'gzip, deflate' HTTP_ACCEPT_LANGUAGE 'pt-br,pt;q=0.8,en-us;q=0.5,en;q=0.3' HTTP_CONNECTION 'keep-alive' HTTP_COOKIE 'utma=4669863.1260802706.1295364409.1306935693.1306960483.86; utmz=4669863.1295364409.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); SESS61faf7f7d2406929b2f9eb4cbfff17d2=a3306f5d1194cf0d8a51dbf7b42c1259; ckan=d4951177ef995d92f0f987d481bd9180aa0f89e4518921db9cd9b6ac75fdd3fab4a25d06; auth_tkt="c6c3c3e0b3fe7bb765356659992760b24da43221flaviouserid_type:unicode"; auth_tkt="c6c3c3e0b3fe7bb765356659992760b24da43221flaviouserid_type:unicode"; ckan_user="flavio"; ckan_display_name="Fl\xc3\xa1vio Code\xc3\xa7o Coelho"; ckan_apikey="c139718d-918f-4a2b-b219-e33cb05cbe23"; utmc=4669863; hide_welcome_message=1' HTTP_HOST 'ckan.emap.fgv.br' HTTP_KEEP_ALIVE '115' HTTP_USER_AGENT 'Mozilla/5.0 (X11; Linux x86_64; rv:2.0.1) Gecko/20100101 Firefox/4.0.1' PATH_INFO '/storage/upload' PATH_TRANSLATED '/home/flavio/var/srvc/ckan.emap.fgv.br/pyenv/bin/ckan.emap.fgv.br.py/storage/upload' REMOTE_ADDR '10.250.48.110' REMOTE_PORT '57429' REMOTE_USER u'flavio' REMOTE_USER_DATA 'userid_type:unicode' REMOTE_USER_TOKENS [] REQUEST_METHOD 'GET' REQUEST_URI '/storage/upload' SCRIPT_FILENAME '/home/flavio/var/srvc/ckan.emap.fgv.br/pyenv/bin/ckan.emap.fgv.br.py' SERVER_ADDR '10.252.2.60' SERVER_ADMIN '[no address given]' SERVER_NAME 'ckan.emap.fgv.br' SERVER_PORT '80' SERVER_PROTOCOL 'HTTP/1.1' SERVER_SIGNATURE '<address>Apache/2.2.16 (Debian) Server at ckan.emap.fgv.br Port 80</address>\n' SERVER_SOFTWARE 'Apache/2.2.16 (Debian)' WSGI Variables application <beaker.middleware.CacheMiddleware? object at 0x7fc2999a6cd0> beaker.cache <beaker.cache.CacheManager? object at 0x7fc2999a6d90> beaker.get_session <bound method SessionMiddleware?._get_session of <beaker.middleware.SessionMiddleware? object at 0x7fc2999a6d10>> beaker.session {'locale': u'pt_BR', '_accessed_time': 1307373466.085686, '_creation_time': 1302605470.0245121} mod_wsgi.application_group 'dck093|' mod_wsgi.callable_object 'application' mod_wsgi.handler_script mod_wsgi.input_chunked '0' mod_wsgi.listener_host mod_wsgi.listener_port '80' mod_wsgi.process_group 'ckan' mod_wsgi.request_handler 'wsgi-script' mod_wsgi.script_reloading '1' mod_wsgi.version (3, 3) paste.cookies (<SimpleCookie: SESS61faf7f7d2406929b2f9eb4cbfff17d2='a3306f5d1194cf0d8a51dbf7b42c1259' __utma='4669863.1260802706.1295364409.1306935693.1306960483.86' __utmc='4669863' __utmz='4669863.1295364409.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none)' auth_tkt='c6c3c3e0b3fe7bb765356659992760b24da43221flavio!userid_type:unicode' ckan='d4951177ef995d92f0f987d481bd9180aa0f89e4518921db9cd9b6ac75fdd3fab4a25d06' ckan_apikey='c139718d-918f-4a2b-b219-e33cb05cbe23' ckan_display_name='Fl\xc3\xa1vio Code\xc3\xa7o Coelho' ckan_user='flavio' hide_welcome_message='1'>, 'utma=4669863.1260802706.1295364409.1306935693.1306960483.86; utmz=4669863.1295364409.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); SESS61faf7f7d2406929b2f9eb4cbfff17d2=a3306f5d1194cf0d8a51dbf7b42c1259; ckan=d4951177ef995d92f0f987d481bd9180aa0f89e4518921db9cd9b6ac75fdd3fab4a25d06; auth_tkt="c6c3c3e0b3fe7bb765356659992760b24da43221flavio!userid _type:unicode"; auth_tkt="c6c3c3e0b3fe7bb765356659992760b24da43221fla...lcome_message=1') paste.registry <paste.registry.Registry object at 0x7fc29a9da850> paste.throw_errors True pylons.environ_config {'session': 'beaker.session', 'cache': 'beaker.cache'} pylons.pylons <pylons.util.PylonsContext? object at 0x7fc29a9ef950> pylons.routes_dict {'action': u'index', 'controller': u'ckanext.storage.controller:StorageController'} repoze.who.identity <repoze.who identity (hidden, dict-like) at 140473790084352> repoze.who.logger <logging.Logger instance at 0x7fc2999a3b48> repoze.who.plugins {'openid': <OpenIdIdentificationPlugin? 140473779397008>, 'friendlyform': <FriendlyFormPlugin? 140473777417040>, 'ckan.lib.authenticator:UsernamePasswordAuthenticator': <ckan.lib.authenticator.UsernamePasswordAuthenticator? object at 0x7fc299b93a50>, 'auth_tkt': <AuthTktCookiePlugin? 140473779397136>, 'ckan.lib.authenticator:OpenIDAuthenticator': <ckan.lib.authenticator.OpenIDAuthenticator object at 0x7fc299b934d0>} routes.route <routes.route.Route object at 0x7fc299864090> routes.url <routes.util.URLGenerator object at 0x7fc29a9efcd0> webob._parsed_query_vars (GET([]), ) webob.adhoc_attrs {'language': 'en-us'} wsgi process 'Multi process AND threads (?)' wsgi.file_wrapper <built-in method file_wrapper of mod_wsgi.Adapter object at 0x7fc29a9d7d50> wsgi.version (1, 1) wsgiorg.routing_args (<routes.util.URLGenerator object at 0x7fc29a9efcd0>, {'action': u'index', 'controller': u'ckanext.storage.controller:StorageController'}) |
1307373810000000 | 1308045351000000 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#1177 | defect | fccoelho | closed | fixed | routes.util.GenerationException |
I have done a recent update to mu ckan install, and I am now getting this error for all my packages: URL: http://ckan.emap.fgv.br/package/dengue-net Module weberror.errormiddleware:162 in __call__ << __traceback_supplement__ = Supplement, self, environ sr_checker = ResponseStartChecker(start_response) app_iter = self.application(environ, sr_checker) return self.make_catching_iter(app_iter, environ, sr_checker) except: >> app_iter = self.application(environ, sr_checker) Module beaker.middleware:73 in __call__ << self.cache_manager) environ[self.environ_key] = self.cache_manager return self.app(environ, start_response) >> return self.app(environ, start_response) Module beaker.middleware:152 in __call__ << headers.append(('Set-cookie', cookie)) return start_response(status, headers, exc_info) return self.wrap_app(environ, session_start_response) def _get_session(self): >> return self.wrap_app(environ, session_start_response) Module routes.middleware:130 in __call__ << environ['SCRIPT_NAME'] = environ['SCRIPT_NAME'][:-1] response = self.app(environ, start_response) # Wrapped in try as in rare cases the attribute will be gone already >> response = self.app(environ, start_response) Module pylons.wsgiapp:125 in __call__ << controller = self.resolve(environ, start_response) response = self.dispatch(controller, environ, start_response) if 'paste.testing_variables' in environ and hasattr(response, >> response = self.dispatch(controller, environ, start_response) Module pylons.wsgiapp:324 in dispatch << if log_debug: log.debug("Calling controller class with WSGI interface") return controller(environ, start_response) def load_test_env(self, environ): >> return controller(environ, start_response) Module ckan.lib.base:118 in __call__ << # available in environ['pylons.routes_dict'] try: return WSGIController.__call__(self, environ, start_response) finally: model.Session.remove() >> return WSGIController.__call__(self, environ, start_response) Module pylons.controllers.core:221 in __call__ << return response(environ, self.start_response) response = self._dispatch_call() if not start_response_called: self.start_response = start_response >> response = self._dispatch_call() Module pylons.controllers.core:172 in _dispatch_call << req.environ['pylons.action_method'] = func response = self._inspect_call(func) else: if log_debug: >> response = self._inspect_call(func) Module pylons.controllers.core:107 in _inspect_call << func.__name__, args) try: result = self._perform_call(func, args) except HTTPException, httpe: if log_debug: >> result = self._perform_call(func, args) Module pylons.controllers.core:60 in _perform_call << """Hide the traceback for everything above this method""" __traceback_hide__ = 'before_and_this' return func(**args) def _inspect_call(self, func): >> return func(**args) Module ?:2 in read Module ckan.lib.cache:167 in wrapper << log = __import__("logging").getLogger("proxy_cache") def wrapper(func, *args, **kwargs): result = func(*args, **kwargs) pylons = get_pylons(args) >> result = func(*args, **kwargs) Module ckan.controllers.package:208 in read << #render the package PackageSaver().render_package(c.pkg) return render('package/read.html') def comments(self, id): >> return render('package/read.html') Module ckan.lib.base:74 in render << return cached_template(template_name, render_template, cache_key=cache_key, cache_type=cache_type, cache_expire=cache_expire) #, ns_options=('method'), method=method) >> cache_type=cache_type, cache_expire=cache_expire) Module pylons.templating:249 in cached_template << return content else: return render_func() >> return render_func() Module ckan.lib.base:63 in render_template << stream = item.filter(stream) return literal(stream.render(method=method, encoding=None)) if 'Pragma' in response.headers: >> return literal(stream.render(method=method, encoding=None)) Module genshi.core:183 in render << method = self.serializer or 'xml' generator = self.serialize(method=method, **kwargs) return encode(generator, method=method, encoding=encoding, out=out) def select(self, path, namespaces=None, variables=None): >> return encode(generator, method=method, encoding=encoding, out=out) Module genshi.output:57 in encode << _encode = lambda string: string if out is None: return _encode(''.join(list(iterator))) for chunk in iterator: out.write(_encode(chunk)) >> return _encode(''.join(list(iterator))) Module genshi.output:339 in __call__ << for filter_ in self.filters: stream = filter_(stream) for kind, data, pos in stream: cached = cache_get((kind, data)) if cached is not None: >> for kind, data, pos in stream: Module genshi.output:670 in __call__ << _gen_prefix = _gen_prefix().next for kind, data, pos in stream: output = cache_get((kind, data)) if output is not None: >> for kind, data, pos in stream: Module genshi.output:771 in __call__ << push_text = textbuf.append pop_text = textbuf.pop for kind, data, pos in chain(stream, [(None, None, None)]): if kind is TEXT: >> for kind, data, pos in chain(stream, [(None, None, None)]): Module genshi.output:586 in __call__ << def __call__(self, stream): prev = (None, None, None) for ev in stream: if prev[0] is START: if ev[0] is END: >> for ev in stream: Module genshi.core:288 in _ensure << # unchanged yield event for event in stream: yield event >> for event in stream: Module genshi.template.base:618 in _include << tmpl = self.loader.load(href, relative_to=event[2][0], cls=cls or self.__class__) for event in tmpl.generate(ctxt, **vars): yield event except TemplateNotFound: >> for event in tmpl.generate(ctxt, **vars): Module genshi.template.base:618 in _include << tmpl = self.loader.load(href, relative_to=event[2][0], cls=cls or self.__class__) for event in tmpl.generate(ctxt, **vars): yield event except TemplateNotFound: >> for event in tmpl.generate(ctxt, **vars): Module genshi.template.base:618 in _include << tmpl = self.loader.load(href, relative_to=event[2][0], cls=cls or self.__class__) for event in tmpl.generate(ctxt, **vars): yield event except TemplateNotFound: >> for event in tmpl.generate(ctxt, **vars): Module genshi.template.base:605 in _include << from genshi.template.loader import TemplateNotFound for event in stream: if event[0] is INCLUDE: href, cls, fallback = event[1] >> for event in stream: Module genshi.template.markup:378 in _match << for event in self._match(self._flatten(template, ctxt, **vars), ctxt, start=idx + 1, **vars): yield event >> ctxt, start=idx + 1, **vars): Module genshi.template.markup:327 in _match << break for event in stream: # We (currently) only care about start and end events for matching >> for event in stream: Module genshi.template.base:565 in _flatten << elif kind is EXPR: result = _eval_expr(data, ctxt, vars) if result is not None: # First check for a string, otherwise the iterable test >> result = _eval_expr(data, ctxt, vars) Module genshi.template.base:277 in _eval_expr << if vars: ctxt.push(vars) retval = expr.evaluate(ctxt) if vars: ctxt.pop() >> retval = expr.evaluate(ctxt) Module genshi.template.eval:178 in evaluate << __traceback_hide__ = 'before_and_this' _globals = self._globals(data) return eval(self.code, _globals, {'__data__': data}) >> return eval(self.code, _globals, {'__data__': data}) Module ?:16 in <Expression u"h.subnav_link(c, h.icon('comments') + _('Comments & Questions'), controller='package', action='comments', id=c.pkg.name)"> << </li> <li py:if="g.has_commenting"> ${h.subnav_link(c, h.icon('comments') + _('Comments & Questions'), controller='package', action='comments', id=c.pkg.name)} </li> <li>${h.subnav_link(c, h.icon('page_white_stack') + _('History'), controller='package', action='history', id=c.pkg.name)}</li> >> ${h.subnav_link(c, h.icon('comments') + _('Comments & Questions'), controller='package', action='comments', id=c.pkg.name)} Module ckan.lib.helpers:126 in subnav_link << return link_to( text, url_for(action=action, **kwargs), class_=('active' if c.action == action else '') ) >> url_for(action=action, **kwargs), Module routes.util:280 in url_for << raise GenerationException( "url_for could not generate URL. Called with args: %s %s" % \ (args, kargs)) return url >> (args, kargs)) GenerationException: url_for could not generate URL. Called with args: () {'action': 'comments', 'controller': 'package', 'id': 'dengue-net'} CGI Variables AUTH_TYPE 'cookie' DOCUMENT_ROOT '/etc/apache2/htdocs' GATEWAY_INTERFACE 'CGI/1.1' HTTP_ACCEPT 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8' HTTP_ACCEPT_CHARSET 'ISO-8859-1,utf-8;q=0.7,*;q=0.7' HTTP_ACCEPT_ENCODING 'gzip, deflate' HTTP_ACCEPT_LANGUAGE 'pt-br,pt;q=0.8,en-us;q=0.5,en;q=0.3' HTTP_CONNECTION 'keep-alive' HTTP_COOKIE '__utma=4669863.1260802706.1295364409.1306935693.1306960483.86; __utmz=4669863.1295364409.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); SESS61faf7f7d2406929b2f9eb4cbfff17d2=a3306f5d1194cf0d8a51dbf7b42c1259; ckan=d4951177ef995d92f0f987d481bd9180aa0f89e4518921db9cd9b6ac75fdd3fab4a25d06; auth_tkt="c6c3c3e0b3fe7bb765356659992760b24da43221flavio!userid_type:unicode"; auth_tkt="c6c3c3e0b3fe7bb765356659992760b24da43221flavio!userid_type:unicode"; ckan_user="flavio"; ckan_display_name="Fl\xc3\xa1vio Code\xc3\xa7o Coelho"; ckan_apikey="c139718d-918f-4a2b-b219-e33cb05cbe23"; __utmc=4669863' HTTP_HOST 'ckan.emap.fgv.br' HTTP_KEEP_ALIVE '115' HTTP_REFERER 'http://ckan.emap.fgv.br/' HTTP_USER_AGENT 'Mozilla/5.0 (X11; Linux x86_64; rv:2.0.1) Gecko/20100101 Firefox/4.0.1' PATH_INFO '/package/dengue-net' PATH_TRANSLATED '/home/flavio/var/srvc/ckan.emap.fgv.br/pyenv/bin/ckan.emap.fgv.br.py/package/dengue-net' REMOTE_ADDR '10.250.48.110' REMOTE_PORT '47624' REMOTE_USER u'flavio' REMOTE_USER_DATA 'userid_type:unicode' REMOTE_USER_TOKENS [''] REQUEST_METHOD 'GET' REQUEST_URI '/package/dengue-net' SCRIPT_FILENAME '/home/flavio/var/srvc/ckan.emap.fgv.br/pyenv/bin/ckan.emap.fgv.br.py' SERVER_ADDR '10.252.2.60' SERVER_ADMIN '[no address given]' SERVER_NAME 'ckan.emap.fgv.br' SERVER_PORT '80' SERVER_PROTOCOL 'HTTP/1.1' SERVER_SIGNATURE '<address>Apache/2.2.16 (Debian) Server at ckan.emap.fgv.br Port 80</address>\n' SERVER_SOFTWARE 'Apache/2.2.16 (Debian)' WSGI Variables application <beaker.middleware.CacheMiddleware object at 0x7f051c802690> beaker.cache <beaker.cache.CacheManager object at 0x7f051c802750> beaker.get_session <bound method SessionMiddleware._get_session of <beaker.middleware.SessionMiddleware object at 0x7f051c8026d0>> beaker.session {'locale': u'pt_BR', '_accessed_time': 1307358102.6266389, '_creation_time': 1302605470.0245121} mod_wsgi.application_group 'dck093|' mod_wsgi.callable_object 'application' mod_wsgi.handler_script '' mod_wsgi.input_chunked '0' mod_wsgi.listener_host '' mod_wsgi.listener_port '80' mod_wsgi.process_group 'ckan' mod_wsgi.request_handler 'wsgi-script' mod_wsgi.script_reloading '1' mod_wsgi.version (3, 3) paste.cookies (<SimpleCookie: SESS61faf7f7d2406929b2f9eb4cbfff17d2='a3306f5d1194cf0d8a51dbf7b42c1259' __utma='4669863.1260802706.1295364409.1306935693.1306960483.86' __utmc='4669863' __utmz='4669863.1295364409.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none)' auth_tkt='c6c3c3e0b3fe7bb765356659992760b24da43221flavio!userid_type:unicode' ckan='d4951177ef995d92f0f987d481bd9180aa0f89e4518921db9cd9b6ac75fdd3fab4a25d06' ckan_apikey='c139718d-918f-4a2b-b219-e33cb05cbe23' ckan_display_name='Fl\xc3\xa1vio Code\xc3\xa7o Coelho' ckan_user='flavio'>, '__utma=4669863.1260802706.1295364409.1306935693.1306960483.86; __utmz=4669863.1295364409.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); SESS61faf7f7d2406929b2f9eb4cbfff17d2=a3306f5d1194cf0d8a51dbf7b42c1259; ckan=d4951177ef995d92f0f987d481bd9180aa0f89e4518921db9cd9b6ac75fdd3fab4a25d06; auth_tkt="c6c3c3e0b3fe7bb765356659992760b24da43221flavio!userid_type:unicode"; auth_tkt="c6c3c3e0b3fe7bb765356659992760b24da43221flavio!userid_type:unicode";... __utmc=4669863') paste.registry <paste.registry.Registry object at 0x7f051d7e5710> paste.throw_errors True pylons.action_method <bound method PackageController.read of <ckan.controllers.package.PackageController object at 0x7f051d7e5b10>> pylons.controller <ckan.controllers.package.PackageController object at 0x7f051d7e5b10> pylons.environ_config {'session': 'beaker.session', 'cache': 'beaker.cache'} pylons.pylons <pylons.util.PylonsContext object at 0x7f051d7e5a50> pylons.routes_dict {'action': u'read', 'controller': u'package', 'id': u'dengue-net'} repoze.who.identity <repoze.who identity (hidden, dict-like) at 139659946193344> repoze.who.logger <logging.Logger instance at 0x7f051c801128> repoze.who.plugins {'openid': <OpenIdIdentificationPlugin 139659931643152>, 'friendlyform': <FriendlyFormPlugin 139659929725584>, 'ckan.lib.authenticator:UsernamePasswordAuthenticator': <ckan.lib.authenticator.UsernamePasswordAuthenticator object at 0x7f051c9e7610>, 'auth_tkt': <AuthTktCookiePlugin 139659931643280>, 'ckan.lib.authenticator:OpenIDAuthenticator': <ckan.lib.authenticator.OpenIDAuthenticator object at 0x7f051c9dcfd0>} routes.route <routes.route.Route object at 0x7f051c69fd50> routes.url <routes.util.URLGenerator object at 0x7f051d7e57d0> webob._parsed_cookies ({'ckan': 'd4951177ef995d92f0f987d481bd9180aa0f89e4518921db9cd9b6ac75fdd3fab4a25d06', '__utmz': '4669863.1295364409.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none)', 'auth_tkt': 'c6c3c3e0b3fe7bb765356659992760b24da43221flavio!userid_type:unicode', 'ckan_display_name': 'Fl\xc3\xa1vio Code\xc3\xa7o Coelho', 'ckan_apikey': 'c139718d-918f-4a2b-b219-e33cb05cbe23', 'ckan_user': 'flavio', '__utma': '4669863.1260802706.1295364409.1306935693.1306960483.86', '__utmc': '4669863', 'SESS61faf7f7d2406929b2f9eb4cbfff17d2': 'a3306f5d1194cf0d8a51dbf7b42c1259'}, '__utma=4669863.1260802706.1295364409.1306935693.1306960483.86; __utmz=4669863.1295364409.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); SESS61faf7f7d2406929b2f9eb4cbfff17d2=a3306f5d1194cf0d8a51dbf7b42c1259; ckan=d4951177ef995d92f0f987d481bd9180aa0f89e4518921db9cd9b6ac75fdd3fab4a25d06; auth_tkt="c6c3c3e0b3fe7bb765356659992760b24da43221flavio!userid_type:unicode"< wbr>; auth_tkt="c6c3c3e0b3fe7bb765356659992760b24da43221flavio!... __utmc=4669863') webob._parsed_query_vars (GET([]), '') webob.adhoc_attrs {'language': 'en-us'} wsgi process 'Multi process AND threads (?)' wsgi.file_wrapper <built-in method file_wrapper of mod_wsgi.Adapter object at 0x7f051cc1ad50> wsgi.version (1, 1) wsgiorg.routing_args (<routes.util.URLGenerator object at 0x7f051d7e57d0>, {'action': u'read', 'controller': u'package', 'id': u'dengue-net'}) |
1307358586000000 | 1307374897000000 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#1176 | defect | thejimmyg | dread | ckan-sprint-2011-10-28 | closed | fixed | unicode_body exception |
We seem to occasionally get this exception on ckan.net. User agents causing this include:
Module ckan.controllers.error:32 in document << return original_response.body # Otherwise, decorate original response with error template. c.content = literal(original_response.unicode_body) or cgi.escape(request.GET.get('message', '')) c.prefix=request.environ.get('SCRIPT_NAME', ''), c.code=cgi.escape(request.GET.get('code', str(original_response.status_int))), >> c.content = literal(original_response.unicode_body) or cgi.escape(request.GET.get('message', '')) AttributeError: 'NoneType' object has no attribute 'unicode_body' |
1307351562000000 | 1314273012000000 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#1175 | defect | dread | fccoelho@… | closed | invalid | Stats extension not working |
Hi, I get a 500, Internal server error when I enable ckanext-stats. Flavio |
1307350823000000 | 1325355170000000 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#1174 | enhancement | pudo | pudo | pdeu-1 | closed | wontfix | API Representation Registry |
As CKAN grows, more and more optional representations of packages will become used. Besides RDF (which is the motivation for this ticket), support for DSPL, home-grown XML, or CSV listings is imaginable. To properly support this CKAN should have an extensible representation registry that can be extended when new output types become available (and without changing the API in the process). This needs to integrate in two places:
To support this we should have a registry with two registers:
This should be set up on load_environment so that IConfigurer plugins can feed into it. The registry should then first be added to _finish in the REST API (which needs to be refactored to be passed the {format} part of the URL if one is given. Based on the format part and HTTP headers, an appropriate representation can be generated by the registry and then be returned to the user. Forwarding of requests to the regular WUI controllers with Accept headers set or a format specified can be implemented in a separate effort. |
1307050992000000 | 1307615200000000 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#1173 | enhancement | amercader | amercader | pdeu-1 | closed | fixed | Offer a DCat representation for packages in the API |
/api/rest/package/foo.rdf should return a DCat representation of the package. To create it, we will use the functions in ckanext-rdf. |
1306939639000000 | 1307615271000000 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#1172 | defect | dread | thejimmyg | ckan-sprint-2011-10-28 | closed | fixed | Remove all try: except: blocks that don't re-raise the original exception |
The current codebase has one or two try: except; blocks that don't catch specific exceptions. Under no circumstances should any broad try: except: blocks be allowed unless the exceptions they catch are immediately re-raised. Uncaught exceptions are wasting us quite a lot of time when trying to track down problems. |
1306926049000000 | 1314118883000000 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#1171 | enhancement | mark.wainwright | dread | ckan 2.0 | assigned | Citation instructions on dataset and resource view pages |
Some sort of citation helper. Something small on the dataset and resource page that would show how to cite. wwaites: Some related thoughts on this from opb: http://homepages.inf.ed.ac.uk/opb/papers/ssdbm2006.pdf timclicks: I'm looking at Dataverse for the first time[0]. It seems very popular in the social sciences. I noticed that there is a recommended citation for each dataset. For example, [1] is has this one: "Targeted Input Programme (TIP) 2000-01", http://hdl.handle.net/1902.1/SSC-MWI-TIP2000-01-M1 V1 [Version]" ImplementationAdd a small box at bottom of dataset / resource page (or in sidebar on dataset page) with title "Cite this" with contents like: %title. %author. Retrieved %date. %site_title. For resource: %title = %dataset_title. %resource_name. Could also add export to ref managers (e.g. to bibtex) but that is for later. |
1306920799000000 | 1347358705000000 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#1170 | defect | dread | dread | ckan-v1.5-sprint-2 | closed | fixed | Production deployment docs out of date |
Need to cover pip-requirements.txt on different branches in the doc/deployment.rst. Also could do with tidying up upgrade.txt into this document too. |
1306864171000000 | 1306864422000000 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#1169 | enhancement | dread | dread | ckan-v1.5-sprint-2 | closed | fixed | Link to csv/json dumps on ckan.net | 1306749768000000 | 1306754833000000 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#1168 | enhancement | thejimmyg | dread | ckan-backlog | assigned | Test system for deb packaging |
Get buildbot to:
|
1306441994000000 | 1330990423000000 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#1167 | task | nils.toedtmann | closed | fixed | Create a standard CKAN system image for Amazon EC2 (AMI) |
We should create a public AMI with CKAN pre-installed and configured such that users can easily create their own EC2 machine with a running CKAN to play with. There are three phases:
I am happy to do first and last. Who is installing and configuring CKAN? Unfortunately AMIs are specific to region, architecture and storage type. We cannot maintain too many images, so a number of choices have to be made:
|
1306423016000000 | 1311178516000000 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#1166 | enhancement | amercader | amercader | ckan-sprint-2011-10-10 | closed | fixed | Less stringent filters for displaying the WMS preview |
Right now, for the "View available WMS layers" link to be displayed, the package needs to have an "INSPIRE=True" extra, a "resource-type=service" extra and a resource of type "WMS". This is due to DGU (the project this was developed for) related reasons, but for a generic support, the resource type should probably be enough. (The repository for this is ckanext-spatial, but it's not on the list) |
1306422646000000 | 1317381932000000 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#1165 | enhancement | nils.toedtmann | ckan-future | new | Add multi-site support to ckan |
Currently, each ckan site needs its own ckan wsgi process. That eats a lot of resources where many ckan sites are served from one machine (e.g. eu3). That would dramatically change if a ckan process could behave like multiple ckans (e.g. like Apache's "<VirtualHost?>", or tracd). Depending on the "Host:" header in the HTTP1.1 request, it would choose which local ckan ini file to obey. I see two ways to constitute the map hostname-to-ini-file map:
In either case there should be a global ckan ini having the default settings for all local ckan sites. Each site ini could be very short then, just having e.g. title, name, database credentials, active plugins etc. |
1306413667000000 | 1339774466000000 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#1164 | enhancement | amercader | amercader | pdeu-1 | closed | fixed | Cloropleth Map of European Data Availability for PDEU |
A nice map in the homepage showing the availability of data across Europe |
1306408824000000 | 1308647224000000 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#1163 | enhancement | rgrp | rgrp | ckan-backlog | new | Improvements to Storage Extension |
Storage is now working but there are
Different Backend IssuesLocal file store is rather different from 'remote' storage in various ways:
|
1306408778000000 | 1310133808000000 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#1162 | enhancement | amercader | amercader | pdeu-1 | closed | fixed | Define a common extra for storing the geographic extent |
We need a common extra across the different harvested sources that defines the extent of the data. We will have mainly national level catalogues, but also at a lower level (region, city). Relevant discussion: http://lists.okfn.org/pipermail/ckan-discuss/2011-May/001245.html |
1306408704000000 | 1308647187000000 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#1161 | requirement | pudo | amercader | pdeu-1 | closed | duplicate | Build a simplified theme for PDEU |
We need to offer a strongly simplified version, read-only of CKAN under publicdata.eu, with a focus on its role as search engine instead of a data catalogue. This ticket relates to work on the PDEU theme only! |
1306407835000000 | 1306408026000000 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#1160 | enhancement | amercader | amercader | pdeu-1 | closed | wontfix | Havest CSW servers on PDEU |
It could be interesting for the publicdata.eu project to add some CSW datasources. Thanks to the INSPIRE directive, there are quite a few national catalogs of geodata that could be worth harvesting. Work on this should include:
First point is being performed in this GDoc: https://spreadsheets.google.com/spreadsheet/ccc?key=0Atp3cZFjuIOAdDBVQWRINnlfN1d0b2lleHVEdjBSb2c&authkey=CNu4hsEB&hl=en_US#gid=0 |
1306407271000000 | 1309804038000000 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#1159 | enhancement | pudo | pudo | pdeu-1 | closed | fixed | Add RDFa to CKAN package pages |
RDFa can be used as a simple way to expose linked data or at least sameAs the API version of the data but we need to make sure we do not expose anything different from the "official" representation. |
1306337907000000 | 1307615133000000 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#1158 | enhancement | pudo | pudo | pdeu-1 | closed | fixed | Put PDEU into read-only mode and remove unneeded functions |
PDEU should be in a mode where:
|
1306337786000000 | 1309804060000000 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#1157 | enhancement | pudo | pudo | pdeu-1 | closed | fixed | A simple theme for publicdata.eu, CKAN |
Change the visual style of CKAN to be more like these sites:
This does not include major UX work. |
1306337573000000 | 1309804029000000 |