Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions dockerfiles/r-stat-201/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,9 @@ COPY config/shortcuts.jupyterlab-settings /home/${NB_USER}/.jupyter/lab/user-set
# Copy jupyter_server_config.py which allows students to see and delete hidden files
COPY config/jupyter_server_config.py /home/${NB_USER}/.jupyter

# Copy jupyter_notebook_config.py with automatic backup script
COPY config/jupyter_notebook_config.py /home/${NB_USER}/.jupyter

# Copy gitconfig that sets global default pull strategy to rebase
COPY config/.gitconfig /home/${NB_USER}/

Expand Down
1 change: 0 additions & 1 deletion dockerfiles/r-stat-201/conda-linux-64.lock
Original file line number Diff line number Diff line change
Expand Up @@ -224,7 +224,6 @@ https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_0.conda
https://conda.anaconda.org/conda-forge/linux-64/r-base-4.3.3-he2d9a6e_10.conda#f29b857679e49c026984531249e542fd
https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_0.conda#5ede4753180c7a550a443c430dc8ab52
https://conda.anaconda.org/conda-forge/noarch/jupyter_events-0.10.0-pyhd8ed1ab_0.conda#ed45423c41b3da15ea1df39b1f80c2ca
https://conda.anaconda.org/conda-forge/noarch/jupytext-1.16.4-pyh80e38bb_0.conda#1df7fd1594a7f2f6496ff23834a099bf
https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.0-pyhd8ed1ab_0.conda#15b51397e0fe8ea7d7da60d83eb76ebc
https://conda.anaconda.org/conda-forge/noarch/r-abind-1.4_5-r43hc72bb7e_1006.conda#75d26096ffa98e1cde7b27b9530899a1
https://conda.anaconda.org/conda-forge/noarch/r-assertthat-0.2.1-r43hc72bb7e_5.conda#830d74ef2014697ec7f95922cd6edcef
Expand Down
47 changes: 47 additions & 0 deletions dockerfiles/r-stat-201/config/jupyter_notebook_config.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
# Configuration file for notebook.

c = get_config() #noqa

# When a notebook is saved, save a timestamped copy in directory .history. Clear outputs.
import os
import shutil
import time
import glob
import subprocess
from datetime import datetime
from zoneinfo import ZoneInfo

def post_save(model, os_path, contents_manager):
"""post-save hook for saving backups of jupyter files."""

if model['type'] != 'notebook':
return # only do this for notebooks

directory, filename = os.path.split(os_path)
history_directory = os.path.join(directory, '.history')

if not os.path.isdir(history_directory):
os.mkdir(history_directory)

files = list(filter(os.path.isfile, glob.glob(os.path.join(history_directory, '*'))))
files.sort(key=lambda x: os.path.getctime(x))

# If the last backup was taken less than time_since seconds ago, return and do not save copy
if len(files) > 0:
time_since = 15*60
if time.time() - os.stat(files[-1]).st_ctime < time_since:
return

now = datetime.now(ZoneInfo('America/Vancouver'))
backup_path=os.path.join(history_directory,now.strftime("%d_%m_%Y_%H_%M_%S")+"_"+filename)
shutil.copy2(os_path, backup_path)

# Clear all backup notebook outputs
subprocess.call(["jupyter", "nbconvert", "--clear-output", "--inplace", backup_path])

# Keep num_saved latest saved notebooks
num_saved = 5 # No less than 1
if len(files) + 1 > num_saved:
os.remove(files[0])

c.FileContentsManager.post_save_hook = post_save
151 changes: 148 additions & 3 deletions dockerfiles/r-stat-201/config/shortcuts.jupyterlab-settings
Original file line number Diff line number Diff line change
@@ -1,12 +1,139 @@
{
"shortcuts": [
{
"args": {},
"command": "notebook:change-cell-to-code",
"keys": [
"Y"
],
"selector": ".jp-Notebook.jp-mod-commandMode:not(.jp-mod-readWrite) :focus",
"disabled": true
},
{
"args": {},
"command": "notebook:change-cell-to-heading-1",
"keys": [
"1"
],
"selector": ".jp-Notebook.jp-mod-commandMode:not(.jp-mod-readWrite) :focus",
"disabled": true
},
{
"args": {},
"command": "notebook:change-cell-to-heading-2",
"keys": [
"2"
],
"selector": ".jp-Notebook.jp-mod-commandMode:not(.jp-mod-readWrite) :focus",
"disabled": true
},
{
"args": {},
"command": "notebook:change-cell-to-heading-3",
"keys": [
"3"
],
"selector": ".jp-Notebook.jp-mod-commandMode:not(.jp-mod-readWrite) :focus",
"disabled": true
},
{
"args": {},
"command": "notebook:change-cell-to-heading-4",
"keys": [
"4"
],
"selector": ".jp-Notebook.jp-mod-commandMode:not(.jp-mod-readWrite) :focus",
"disabled": true
},
{
"args": {},
"command": "notebook:change-cell-to-heading-5",
"keys": [
"5"
],
"selector": ".jp-Notebook.jp-mod-commandMode:not(.jp-mod-readWrite) :focus",
"disabled": true
},
{
"args": {},
"command": "notebook:change-cell-to-heading-6",
"keys": [
"6"
],
"selector": ".jp-Notebook.jp-mod-commandMode:not(.jp-mod-readWrite) :focus",
"disabled": true
},
{
"args": {},
"command": "notebook:change-cell-to-markdown",
"keys": [
"M"
],
"selector": ".jp-Notebook.jp-mod-commandMode:not(.jp-mod-readWrite) :focus",
"disabled": true
},
{
"args": {},
"command": "notebook:change-cell-to-raw",
"keys": [
"R"
],
"selector": ".jp-Notebook.jp-mod-commandMode:not(.jp-mod-readWrite) :focus",
"disabled": true
},
{
"args": {},
"command": "notebook:collapse-all-headings",
"keys": [
"Ctrl Shift ArrowLeft"
],
"selector": ".jp-Notebook.jp-mod-commandMode:not(.jp-mod-readWrite) :focus",
"disabled": true
},
{
"args": {},
"command": "notebook:copy-cell",
"keys": [
"C"
],
"selector": ".jp-Notebook.jp-mod-commandMode:not(.jp-mod-readWrite) :focus",
"disabled": true
},
{
"args": {},
"command": "notebook:cut-cell",
"keys": [
"X"
],
"selector": ".jp-Notebook.jp-mod-commandMode:not(.jp-mod-readWrite) :focus",
"disabled": true
},
{
"args": {},
"command": "notebook:delete-cell",
"keys": [
"D",
"D"
],
"selector": ".jp-Notebook.jp-mod-commandMode:not(.jp-mod-readWrite) :focus",
"disabled": true
},
{
"args": {},
"command": "notebook:enter-command-mode",
"keys": [
"Ctrl M"
],
"selector": ".jp-Notebook.jp-mod-editMode",
"disabled": true
},
{
"args": {},
"command": "notebook:merge-cell-above",
"keys": [
"Ctrl Backspace"
],
"selector": ".jp-Notebook:focus",
"selector": ".jp-Notebook.jp-mod-commandMode:not(.jp-mod-readWrite) :focus",
"disabled": true
},
{
Expand All @@ -15,7 +142,7 @@
"keys": [
"Ctrl Shift M"
],
"selector": ".jp-Notebook:focus",
"selector": ".jp-Notebook.jp-mod-commandMode:not(.jp-mod-readWrite) :focus",
"disabled": true
},
{
Expand All @@ -24,7 +151,25 @@
"keys": [
"Shift M"
],
"selector": ".jp-Notebook:focus",
"selector": ".jp-Notebook.jp-mod-commandMode:not(.jp-mod-readWrite) :focus",
"disabled": true
},
{
"args": {},
"command": "notebook:paste-cell-below",
"keys": [
"V"
],
"selector": ".jp-Notebook.jp-mod-commandMode:not(.jp-mod-readWrite) :focus",
"disabled": true
},
{
"args": {},
"command": "notebook:split-cell-at-cursor",
"keys": [
"Ctrl Shift -"
],
"selector": ".jp-Notebook.jp-mod-editMode",
"disabled": true
}
]
Expand Down
1 change: 0 additions & 1 deletion dockerfiles/r-stat-201/environment.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ dependencies:
- jupyterlab
- jupyterlab-git
- jupyter-resource-usage
- jupytext
- nbgitpuller
- python=3.11
- r-aer
Expand Down
Loading