(core) updates from grist-core

pull/610/head
Paul Fitzpatrick 9 months ago
commit 2e4a8ab8e0

@ -43,7 +43,7 @@ Here are some specific feature highlights of Grist:
- Any tool that can read SQLite can read numeric and text data from a Grist file.
- Great format for [backups](https://support.getgrist.com/exports/#backing-up-an-entire-document) that you can be confident you can restore in full.
- Great format for moving between different hosts.
- Can be displayed on a static website with [grist-static](https://github.com/gristlabs/grist-static).
- Can be displayed on a static website with [grist-static](https://github.com/gristlabs/grist-static), no special server needed.
- There's a self-contained desktop app available for viewing and editing: [grist-electron](https://github.com/gristlabs/grist-electron).
* Convenient editing and formatting features.
- Choices and [choice lists](https://support.getgrist.com/col-types/#choice-list-columns), for adding colorful tags to records without fuss.
@ -65,6 +65,7 @@ Here are some specific feature highlights of Grist:
- A [REST API](https://support.getgrist.com/api/), [Zapier actions/triggers](https://support.getgrist.com/integrators/#integrations-via-zapier), and support from similar [integrators](https://support.getgrist.com/integrators/).
- Import/export to Google drive, Excel format, CSV.
- Can link data with custom widgets hosted externally.
- You can set up outgoing webhooks.
* [Many templates](https://templates.getgrist.com/) to get you started, from investment research to organizing treasure hunts.
* Access control options.
- (You'll need SSO logins set up to make use of these options; [grist-omnibus](https://github.com/gristlabs/grist-omnibus) has a prepackaged solution if configuring this feels daunting)
@ -78,8 +79,11 @@ Here are some specific feature highlights of Grist:
[gVisor](https://github.com/google/gvisor) sandboxing at the individual
document level.
- On OSX, you can use native sandboxing.
- On any OS, including Windows, you can use a wasm-based sandbox.
- On any OS, including Windows, you can use a wasm-based sandbox.
* Translated to many languages.
* Support for an AI Formula Assistant (using OpenAI gpt-3.5-turbo).
* `F1` key brings up some quick help. This used to go without saying. In general Grist has good keyboard support.
* We post progress on [𝕏 or Twitter or whatever](https://twitter.com/getgrist).
If you are curious about where Grist is going heading,
see [our roadmap](https://github.com/gristlabs/grist-core/projects/1), drop a

@ -1,6 +1,6 @@
{
"name": "grist-core",
"version": "1.1.2",
"version": "1.1.3",
"license": "Apache-2.0",
"description": "Grist is the evolution of spreadsheets",
"homepage": "https://github.com/gristlabs/grist-core",

@ -740,12 +740,12 @@ class Response(object):
"""
Similar to the Response class from the `requests` library.
"""
def __init__(self, content, status, statusText, headers, encoding):
def __init__(self, content, status, statusText, headers, encoding=None):
self.content = content # raw bytes
self.status_code = status # e.g. 404
self.reason = statusText # e.g. "Not Found"
self.headers = CaseInsensitiveDict(headers)
self.encoding = encoding or self.apparent_encoding
self.encoding = encoding or self.apparent_encoding or "utf-8"
@property
def text(self):

@ -73,6 +73,13 @@ class TestResponse(unittest.TestCase):
self.assertEqual(r.content, content)
self.assertEqual(r.text, text)
def test_unknown_undetectable_encoding(self):
content = b''
r = Response(content, 200, "OK", {}, encoding=None)
# Not knowing the encoding should not break text
self.assertEqual(r.text, "")
class TestRequestsPostInterface(unittest.TestCase):
def test_no_post_args(self):

@ -1,18 +1,26 @@
# This number should be bumped up if making a non-additive change
# to python packages.
GRIST_PYODIDE_VERSION = 2
default:
echo "Welcome to the pyodide sandbox"
echo "make fetch_packages # gets python packages prepared earlier"
echo "make build_packages # build python packages from scratch"
echo "make save_packages # upload python packages to fetch later"
echo "setup # get pyodide node package"
echo "make clean_packages # remove local cache of python packages"
echo "setup # get pyodide node package, and python packages"
fetch_packages:
node ./packages.js https://s3.amazonaws.com/grist-pynbox/pyodide/packages/ _build/packages/
node ./packages.js https://s3.amazonaws.com/grist-pynbox/pyodide/packages/v$(GRIST_PYODIDE_VERSION)/ _build/packages/
build_packages:
./build_packages.sh
save_packages:
aws s3 sync _build/packages s3://grist-pynbox/pyodide/packages/
aws s3 sync _build/packages s3://grist-pynbox/pyodide/packages/v$(GRIST_PYODIDE_VERSION)
clean_packages:
rm -rf _build/packages
setup:
./setup.sh

@ -17,14 +17,16 @@ echo "###############################################################"
echo "## Prepare python packages"
cd _build/pyodide
git checkout 0.23.4 || (git fetch && git checkout 0.23.4)
./run_docker make
cp ../../../requirements3.txt .
./run_docker pyodide build -r requirements3.txt --output-lockfile result.txt
cat result.txt
./run_docker "source emsdk/emsdk/emsdk_env.sh && pyodide build -r requirements3.txt --outdir grist-packages"
./run_docker pyodide py-compile grist-packages
cd ../..
echo ""
echo "###############################################################"
echo "## Copy out python packages"
node ./packages.js _build/pyodide/dist/ _build/packages/
rm -rf _build/packages/
node ./packages.js _build/pyodide/grist-packages/ _build/packages/

@ -0,0 +1,21 @@
[
"astroid-2.14.2-cp311-none-any.whl",
"asttokens-2.2.1-cp311-none-any.whl",
"chardet-4.0.0-cp311-none-any.whl",
"et_xmlfile-1.0.1-cp311-none-any.whl",
"executing-1.1.1-cp311-none-any.whl",
"friendly_traceback-0.7.48-cp311-none-any.whl",
"iso8601-0.1.12-cp311-none-any.whl",
"lazy_object_proxy-1.6.0-cp311-cp311-emscripten_3_1_32_wasm32.whl",
"openpyxl-3.0.10-cp311-none-any.whl",
"phonenumberslite-8.12.57-cp311-none-any.whl",
"pure_eval-0.2.2-cp311-none-any.whl",
"python_dateutil-2.8.2-cp311-none-any.whl",
"roman-3.3-cp311-none-any.whl",
"six-1.16.0-cp311-none-any.whl",
"sortedcontainers-2.4.0-cp311-none-any.whl",
"stack_data-0.5.1-cp311-none-any.whl",
"typing_extensions-4.4.0-cp311-none-any.whl",
"unittest_xml_reporting-2.0.0-cp311-none-any.whl",
"wrapt-1.15.0-cp311-none-any.whl"
]

@ -61,6 +61,8 @@ async function findOnDisk(src, dest) {
});
}
libs = await listLibs(dest);
fs.writeFileSync(path.join(__dirname, `package_filenames.json`),
JSON.stringify(libs.available.map(lib => lib.fileName), null, 2));
console.log(`Cached`, {libs: libs.available.map(lib => lib.name)});
console.log(`Missing`, {libs: libs.misses.map(lib => lib.name)});
}

@ -10,6 +10,6 @@ if [[ ! -e _build/worker ]]; then
mkdir -p _build/worker
cd _build/worker
yarn init --yes
yarn add pyodide@0.22.1
yarn add pyodide@0.23.4
cd ../..
fi

@ -77,7 +77,10 @@
"Activation": "Aktivierung",
"Billing Account": "Abrechnungskonto",
"Support Grist": "Grist Support",
"Upgrade Plan": "Upgrade-Plan"
"Upgrade Plan": "Upgrade-Plan",
"Sign Up": "Registrieren Sie sich",
"Use This Template": "Diese Vorlage verwenden",
"Sign In": "Anmelden"
},
"ActionLog": {
"Action Log failed to load": "Aktionsprotokoll konnte nicht geladen werden",
@ -108,7 +111,8 @@
"Home Page": "Startseite",
"Legacy": "Hinterlassenschaft",
"Personal Site": "Persönliche Seite",
"Team Site": "Teamseite"
"Team Site": "Teamseite",
"Grist Templates": "Grist Vorlagen"
},
"AppModel": {
"This team site is suspended. Documents can be read, but not modified.": "Diese Teamseite ist gesperrt. Die Dokumente können gelesen, aber nicht geändert werden."
@ -428,7 +432,8 @@
"GristDoc": {
"Added new linked section to view {{viewName}}": "Neuer verlinkter Abschnitt zur Ansicht hinzugefügt {{viewName}}",
"Import from file": "Aus Datei importieren",
"Saved linked section {{title}} in view {{name}}": "Gespeicherter verlinkter Abschnitt {{title}} in Ansicht {{name}}"
"Saved linked section {{title}} in view {{name}}": "Gespeicherter verlinkter Abschnitt {{title}} in Ansicht {{name}}",
"go to webhook settings": "gehen sie zu webhook Einstellungen"
},
"HomeIntro": {
", or find an expert via our ": ", oder finden Sie einen Experten über unseren",

@ -72,7 +72,10 @@
"Activation": "Activación",
"Billing Account": "Cuenta de facturación",
"Support Grist": "Soporte Grist",
"Upgrade Plan": "Actualizar el Plan"
"Upgrade Plan": "Actualizar el Plan",
"Sign In": "Ingresar",
"Sign Up": "Regístrate",
"Use This Template": "Usa esta plantilla"
},
"AddNewButton": {
"Add New": "Agregar Nuevo"
@ -97,7 +100,8 @@
"Home Page": "Portada",
"Legacy": "Legado",
"Personal Site": "Sitio Personal",
"Team Site": "Sitio de Equipo"
"Team Site": "Sitio de Equipo",
"Grist Templates": "Plantillas Grist"
},
"CellContextMenu": {
"Clear cell": "Borrar celda",
@ -699,7 +703,8 @@
"GristDoc": {
"Added new linked section to view {{viewName}}": "Añadido nueva sección vinculada a la vista {{viewName}}",
"Import from file": "Importar desde archivo",
"Saved linked section {{title}} in view {{name}}": "Sección vinculada guardada {{title}} a la vista {{name}}"
"Saved linked section {{title}} in view {{name}}": "Sección vinculada guardada {{title}} a la vista {{name}}",
"go to webhook settings": "ir a la configuración webhook"
},
"ACUserManager": {
"Enter email address": "Introduzca la dirección de correo electrónico",

@ -289,7 +289,11 @@
"Errors in {{numErrors}} of {{numCells}} cells": "Errori in {{numErrors}} su {{numCells}} celle",
"Column or field is required": "Richiesta una colonna o un campo",
"Errors in all {{numErrors}} cells": "Errori in {{numErrors}} celle",
"editingFormula is required": "editingFormula è necessario"
"editingFormula is required": "editingFormula è necessario",
"Enter formula or {{button}}.": "Inserisci una formula o {{button}}.",
"Enter formula.": "Inserisci una formula.",
"Expand Editor": "Espandi l'editor",
"use AI Assistant": "usa l'assistente IA"
},
"FieldEditor": {
"It should be impossible to save a plain data value into a formula column": "Non dovrebbe essere possibile salvare un valore semplice in una colonna di formule",
@ -445,7 +449,9 @@
"Type a message...": "Inserisci un messaggio…",
"User Attributes": "Attributi dell'utente",
"Seed rules": "Regole pre-inserite",
"When adding table rules, automatically add a rule to grant OWNER full access.": "Quando si mettono regole per la tabella, inserire sempre una che dà pieno accesso a OWNER."
"When adding table rules, automatically add a rule to grant OWNER full access.": "Quando si mettono regole per la tabella, inserire sempre una che dà pieno accesso a OWNER.",
"This default should be changed if editors' access is to be limited. ": "Questo valore di default può essere cambiato se si vuole limitare l'accesso agli editor. ",
"Allow editors to edit structure (e.g. modify and delete tables, columns, layouts), and to write formulas, which give access to all data regardless of read restrictions.": "Permette agli editor di modificare la struttura (es., modificare ed eliminare tabelle, colonne, viste) e scrivere formule, cosa che permette l'accesso ai dati indipendentemente dalle restrizioni in lettura."
},
"ACUserManager": {
"Enter email address": "Inserisci indirizzo e-mail",
@ -785,7 +791,8 @@
"Send to Google Drive": "Invia a Google Drive",
"Show in folder": "Mostra nella cartella",
"Unsaved": "Non salvato",
"Work on a Copy": "Lavora su una copia"
"Work on a Copy": "Lavora su una copia",
"Share": "Condividi"
},
"SiteSwitcher": {
"Create new team site": "Crea un nuovo sito per il team",
@ -908,7 +915,8 @@
"Find Next ": "Trova successivo ",
"Find Previous ": "Trova precedente ",
"No results": "Nessun risultato",
"Search in document": "Cerca nel documento"
"Search in document": "Cerca nel documento",
"Search": "Cerca"
},
"sendToDrive": {
"Sending file to Google Drive": "Invio i file a Google Drive"
@ -979,7 +987,9 @@
"Access rules give you the power to create nuanced rules to determine who can see or edit which parts of your document.": "Le regole di accesso ti danno il potere di creare regole sofisticate per decidere chi può vedere o modificare il tuo documento, e quali parti.",
"Reference columns are the key to {{relational}} data in Grist.": "Le colonne con riferimenti sono il motore {{relational}} dei dati in Grist.",
"Anchor Links": "Link interno",
"Custom Widgets": "Widget personalizzati"
"Custom Widgets": "Widget personalizzati",
"You can choose one of our pre-made widgets or embed your own by providing its full URL.": "Puoi scegliere uno dei nostri widget pronti all'uso, o inserirne uno fatto da te, immettendo la sua URL completa.",
"To make an anchor link that takes the user to a specific cell, click on a row and press {{shortcut}}.": "Per creare un link che porta l'utente a una cella specifica, fai clic su una riga e premi {{shortcut}}."
},
"DescriptionConfig": {
"DESCRIPTION": "DESCRIZIONE"
@ -1031,7 +1041,20 @@
"Save": "Salva",
"Tips": "Suggerimenti",
"Grist's AI Formula Assistance. ": "Assistenza dalla IA di Grist per le formule. ",
"See our {{helpFunction}} and {{formulaCheat}}, or visit our {{community}} for more help.": "Vedi {{helpFunction}} e {{formulaCheat}}, o visita la {{community}} per ulteriore aiuto."
"See our {{helpFunction}} and {{formulaCheat}}, or visit our {{community}} for more help.": "Vedi {{helpFunction}} e {{formulaCheat}}, o visita la {{community}} per ulteriore aiuto.",
"Cancel": "Annulla",
"Clear Conversation": "Cancella conversazione",
"AI Assistant": "Assistente IA",
"Apply": "Applica",
"Code View": "Vista codice",
"Hi, I'm the Grist Formula AI Assistant.": "Ciao, sono l'assistente IA per le formule di Grist.",
"I can only help with formulas. I cannot build tables, columns, and views, or write access rules.": "Posso solo aiutare con le formule. Non posso costruire tabelle, colonne e viste, o scrivere regole di accesso.",
"Learn more": "Per saperne di più",
"Press Enter to apply suggested formula.": "Premi Invio per applicare la formula suggerita.",
"Sign Up for Free": "Iscriviti gratis",
"There are some things you should know when working with me:": "Ecco alcune cose da sapere quando lavori con me:",
"What do you need help with?": "In che cosa posso aiutarti?",
"Sign up for a free Grist account to start using the Formula AI Assistant.": "Iscriviti a un account gratuito di Grist per usare l'Assistente IA per le formule."
},
"GridView": {
"Click to insert": "Clicca per inserire"
@ -1072,5 +1095,67 @@
"No row selected in {{title}}": "Nessuna riga selezionata in {{title}}",
"Not all data is shown": "Non tutti i dati sono mostrati",
"No data": "Nessun dato"
},
"DescriptionTextArea": {
"DESCRIPTION": "DESCRIZIONE"
},
"UserManager": {
"Add {{member}} to your team": "Aggiungi {{member}} al tuo team",
"Allow anyone with the link to open.": "Consenti l'accesso a chiunque ha il link.",
"Anyone with link ": "Chiunque ha il link ",
"Cancel": "Annulla",
"Copy Link": "Copia link",
"Create a team to share with more people": "Crea un team per condividere con più persone",
"Grist support": "Supporto di Grist",
"Guest": "Ospite",
"Invite multiple": "Invita più persone",
"Invite people to {{resourceType}}": "Invita delle persone a {{resourceType}}",
"Link copied to clipboard": "Link copiato negli Appunti",
"Off": "Spento",
"Manage members of team site": "Gestisci i membri del tuo team",
"No default access allows access to be granted to individual documents or workspaces, rather than the full team site.": "Nessun accesso di default, permette di autorizzare l'accesso a singoli documenti o spazi di lavoro, invece che a tutto il sito del team.",
"On": "Acceso",
"Once you have removed your own access, you will not be able to get it back without assistance from someone else with sufficient access to the {{name}}.": "Se togli l'accesso a te stesso, non potrai riaverlo senza l'aiuto di qualcuno con permessi sufficienti a {{name}}.",
"Open Access Rules": "Apri le regole di accesso",
"Outside collaborator": "Collaboratore esterno",
"Public Access": "Accesso pubblico",
"Public access: ": "Accesso pubblico: ",
"Public access": "Accesso pubblico",
"User inherits permissions from {{parent})}. To remove, set 'Inherit access' option to 'None'.": "L'utente eredita i permessi da {{parent})}. Per rimuoverli, imposta l'opzione 'Eredita l'accesso' a 'Nessuno'.",
"User inherits permissions from {{parent}}. To remove, set 'Inherit access' option to 'None'.": "L'utente eredita i permessi da {{parent}}. Per rimuoverli, imposta l'opzione 'Eredita l'accesso' a 'Nessuno'.",
"You are about to remove your own access to this {{resourceType}}": "Stai per rimuovere il tuo stesso accesso da questa {{resourceType}}",
"Close": "Chiudi",
"Collaborator": "Collaboratore",
"Remove my access": "Rimuovi il mio accesso",
"Confirm": "Conferma",
"Save & ": "Salva e ",
"Public access inherited from {{parent}}. To remove, set 'Inherit access' option to 'None'.": "Accesso pubblico ereditato da {{parent}}. Per rimuoverlo, imposta l'opzione 'Eredita l'accesso' a 'Nessuno'.",
"Team member": "Membro del team",
"User may not modify their own access.": "L'utente non può modificare le sue stesse opzioni di accesso.",
"Your role for this team site": "Il tuo ruolo per questo sito del team",
"Your role for this {{resourceType}}": "Il tuo ruolo per {{resourceType}}",
"free collaborator": "collaboratore libero",
"guest": "ospite",
"member": "membro",
"team site": "sito del team",
"{{collaborator}} limit exceeded": "limite superato per {{collaborator}}",
"{{limitAt}} of {{limitTop}} {{collaborator}}s": "{{limitAt}} di {{limitTop}} {{collaborator}}",
"No default access allows access to be granted to individual documents or workspaces, rather than the full team site.": "Nessun accesso di default, permette di autorizzare l'accesso a singoli documenti o spazi di lavoro, invece che a tutto il sito del team.",
"Once you have removed your own access, you will not be able to get it back without assistance from someone else with sufficient access to the {{resourceType}}.": "Se togli l'accesso a te stesso, non potrai riaverlo senza l'aiuto di qualcuno con permessi sufficienti a {{resourceType}}.",
"User has view access to {{resource}} resulting from manually-set access to resources inside. If removed here, this user will lose access to resources inside.": "L'utente può visualizzare {{resource}} a causa di regole di accesso alle risorse interne impostate manualmente. Se rimuovi qui, l'utente perderà l'accesso alle risorse interne."
},
"SearchModel": {
"Search all pages": "Cerca in tutte le pagine",
"Search all tables": "Cerca in tutte le tabelle"
},
"searchDropdown": {
"Search": "Cerca"
},
"FloatingEditor": {
"Collapse Editor": "Contrai l'editor"
},
"FloatingPopup": {
"Maximize": "Espandi",
"Minimize": "Riduci"
}
}

@ -77,7 +77,10 @@
"Activation": "Ativação",
"Billing Account": "Conta de faturamento",
"Support Grist": "Suporte Grist",
"Upgrade Plan": "Atualizar o Plano"
"Upgrade Plan": "Atualizar o Plano",
"Sign Up": "Cadastre-se",
"Use This Template": "Use este modelo",
"Sign In": "Ingressar"
},
"ActionLog": {
"Action Log failed to load": "Falha ao carregar o Log de Ações",
@ -108,7 +111,8 @@
"Home Page": "Página inicial",
"Legacy": "Legado",
"Personal Site": "Site pessoal",
"Team Site": "Site da Equipe"
"Team Site": "Site da Equipe",
"Grist Templates": "Modelos de Grist"
},
"AppModel": {
"This team site is suspended. Documents can be read, but not modified.": "Este site da equipe está suspenso. Os documentos podem ser lidos, mas não modificados."
@ -428,7 +432,8 @@
"GristDoc": {
"Added new linked section to view {{viewName}}": "Adicionada nova seção vinculada para visualizar {{viewName}}}",
"Import from file": "Importação de arquivo",
"Saved linked section {{title}} in view {{name}}": "Seção vinculada salva {{title}} em exibição {{name}}"
"Saved linked section {{title}} in view {{name}}": "Seção vinculada salva {{title}} em exibição {{name}}",
"go to webhook settings": "ir para configurações webhook"
},
"HomeIntro": {
", or find an expert via our ": ", ou encontre um especialista através do nosso",
@ -1114,8 +1119,8 @@
"Hi, I'm the Grist Formula AI Assistant.": "Olá, sou o Assistente de IA de Fórmula Grist.",
"I can only help with formulas. I cannot build tables, columns, and views, or write access rules.": "Só posso ajudar com fórmulas. Não posso criar tabelas, colunas e exibições, nem escrever regras de acesso.",
"Press Enter to apply suggested formula.": "Pressione Enter para aplicar a fórmula sugerida.",
"Sign Up for Free": "Inscreva-se gratuitamente",
"Sign up for a free Grist account to start using the Formula AI Assistant.": "Inscreva-se para uma conta gratuita do Grist para começar a usar o Assistente de Fórmula AI.",
"Sign Up for Free": "Cadastre-se gratuitamente",
"Sign up for a free Grist account to start using the Formula AI Assistant.": "Cadastre-se para uma conta gratuita do Grist para começar a usar o Assistente de Fórmula AI.",
"What do you need help with?": "Em que você precisa de ajuda?",
"There are some things you should know when working with me:": "Há algumas coisas que você deve saber ao trabalhar comigo:",
"Learn more": "Saiba mais"

Loading…
Cancel
Save