Skip to content

Instantly share code, notes, and snippets.

View jaroel's full-sized avatar

Roel Bruggink jaroel

View GitHub Profile
@jaroel
jaroel / ftpproxy.py
Created July 16, 2023 15:39
ftp proxy with FastAPI
import aioftp
from fastapi import FastAPI, HTTPException, Request
from fastapi.responses import StreamingResponse
app = FastAPI()
@app.get('/fetch/{filename}', name='fetch')
async def ftp_fetch(request: Request, filename: str):
return StreamingResponse(
stream_file(filename),
@jaroel
jaroel / solid-start-form-post-ssr.tsx
Created February 24, 2023 00:18
Use POST data in forms in SSR with SolidStart
import {isServer} from 'solid-js/web'
import {createRouteData} from 'solid-start'
import {useRequest} from 'solid-start/server'
export default function FormPage() {
const postData = createRouteData(async () => {
const event = useRequest()
if (!isServer || event.request.method !== 'POST') {
return undefined
}
@jaroel
jaroel / site.zcml
Created April 4, 2016 20:21
Minimal site.zcml to make my Plone 5 instance running without z3c.autoinclude.
<configure
xmlns="http://namespaces.zope.org/zope"
xmlns:meta="http://namespaces.zope.org/meta"
xmlns:five="http://namespaces.zope.org/five">
<include package="Zope2.App" />
<include package="Products.Five" />
<meta:redefinePermission from="zope2.Public" to="zope.Public" />
<!-- Load the meta -->
@jaroel
jaroel / make_constraintstxt.py
Created April 4, 2016 20:02
Outputs a constraints.txt compatible pinning from a Plone versions.cfg. Requires zc.buildout for parsing the .cfg files, naturally.
from pkg_resources import parse_version
from zc.buildout.buildout import Buildout
def get_buildout(version):
versions_url = 'http://dist.plone.org/release/{version}/versions.cfg'
url = versions_url.format(version=version)
buildout = Buildout(
config_file=url,
[settings]
multi_line_output=3
known_first_party=ames
default_section=THIRDPARTY
@jaroel
jaroel / gist:5345403
Created April 9, 2013 12:42
Parameterised dynamic vocabulary. Shows unique values for catalog index. Pass in the index name in the schema.
Definition:
===========
from zope.schema.interfaces import IContextSourceBinder, IBaseVocabulary
class CatalogIndexValuesSource(object):
grok.implements(IContextSourceBinder, IBaseVocabulary)
def __init__(self, index_name):
self.index_name = index_name
@jaroel
jaroel / gist:5345392
Last active December 16, 2015 00:09
Parameterised dynamic vocabulary. Shows content of catalog using query with object_provides. Pass in the interface in the schema.
Definition:
===========
from zope.schema.interfaces import IContextSourceBinder, IBaseVocabulary
class CatalogObjectProvidesSource(object):
grok.implements(IContextSourceBinder, IBaseVocabulary)
def __init__(self, interface):
self.interface = interface
@jaroel
jaroel / add_hotfix.sh
Last active December 8, 2015 17:16
Unpack Plone hotfixes into parts/products
#!/bin/bash
# ./add_hotfix.sh url md5hash [target basedir]
# i.e. ./add_hotfix.sh http://plone.org/products/plone-hotfix/releases/20110928/PloneHotfix20110928-1.0.zip aab87c2904754a2f6374f52c441fb97f /zeoclients/
PATCHFILE="/tmp/$(basename $0).$$"
rm -rf "$PATCHFILE"
curl "$1" > "$PATCHFILE"
MD5=`openssl md5 "$PATCHFILE"|cut -d " " -f 2`
[[ $MD5 != $2 ]] && echo "Hashes do not match." && exit 1
@jaroel
jaroel / gist:1688278
Created January 27, 2012 10:59
Count words in Plone html
catalog = context.portal_catalog
lexicon = catalog.htmlwordsplitter_lexicon
brains = catalog(Language='nl', portal_type='CoolPage')
words = dict(Title=0, Description=0, getText=0)
for brain in brains:
ob = brain.getObject()
words['Title'] = ob.Title().split()
words['Description'] = ob.Description().split()
words['getText'] = lexicon.parseTerms(ob.getText())
[buildout]
extends =
http://x.aclark.net/plone/4.1.x/develop.cfg
http://good-py.appspot.com/release/dexterity/1.1
auto-checkout =
collective.z3cform.datagridfield
plone.app.relationfield
collective.z3cform.datagridfield_demo