Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
This is where you can find Code for Life resources, publications and how to gain industry experience.
Code for Life, an initiative by Ocado Group, provides educators with the resources they need to inspire the next generation of computer scientists. We aim to address the gender disparity in computer science through engaging, gamified learning experiences. In addition to its educational resources, Code for Life also offers coding club packs, robotics workshops, certificates, progress tracking and much, much more.
We are a not-for-profit, open-source initiative that engages with schools and educational institutions to provide career-based activities, and real world learning opportunities for tech enthusiasts.
Check out on how to contribute to this project that freely supports teaching coding in schools.
Please read through the following sections to understand how you can contribute as a developer. If you wish to contribute as a designer, product manager or a researcher, please directly to find out more.
To learn more about the Code for Life mission, .
Here is where we document our various processes, how our system's services work and other useful resources. As we are , anyone following our guidelines is welcome to .
Additional docs can be found in our .
If you have any feedback on how we can improve our docs, please reach out to .
Our incredible internal and external contributors to our mission.
Thank you to everyone - we all made it happen. ❤️
Abdelrahman AbouDeghedy, Adam Kirchberger, Adam Mandel, Alexandre Fernando, Ana Crisan, Anders Schuller, Andre Gomes, Andreia Silva Cabecinhas, Andrew King, Andrew Lucas, Andrew Males, Andrew Miller, Angela Brownsey, Anne Marie Neatham, Aparbek Smailov, Ashley Marshall, Assia Iossifova.
Barry Parker, Ben Cardy, Blazej Strozewski, Bree King.
Cam Mac, Céline Boudier, Cherie Pun, Chi-En Wei, Chris Leach, Chris Mukherjee, Chris Pavli, Christopher Brett, Clifford Bailey, Clyde.
Daniel Hourigan, Daniel Palma, Daniela Ortner, Darcie Gomer, Dave Owen, Dawid Chodura, Delivibot Dee, Devon Alexander, Dioni Zhong, Dhru Sachania, Duncan Russell.
Felix Stephenson, Florian Aucomte.
Gabby Barsoum, George Smith.
Helen Mead.
Jacq Train, James Dimmock, James Holland, James Smyth, Javi Carretero, Jazmin Hempenstall, Jennet Pitch, Joe Slade, Joseph Zammit, Josh Blake, Juan Lucas, Julie Yortson, Julieta Sanguedolce.
Kamil Sosiński, Katarzyna Zych, Kenny MacMillan, Kristian Brugts.
Laura Cumming, Leila Hajaj, Ligia Olmos, Liza Konstantinova, Lloyd Allen, Lucy House, Lucy Light, Lukasz Brzezowski, Luna Cao.
Maciej Zywiol, Mahana Clutha, Marcin Zieba, Maria Skrzypek, Mariana Fonseca, Marius Goubert, Mateusz Gizycki, Matt Whelan, Matthew Daggitt, Matthew Dyachuk, Matthew Harman, Meera Tom, Menelik Collymore, Michael Storey, Miguel Trigueira, Mike Bryant, Mo-anna Tucker, Mykhaylo Marfeychuk.
Olaf Szmidt, Oliver Cartz, Oliver Jeeves.
Rachel Lord, Radhika Gudipati, Rafal Wawryk, Rain Ashford, Razvan Mahu, Rebecca D'Cruz, Ria Jha, Ricardo Mejias, Richard Hughes, Ridwanah, Rishika Varadarajan, Robert Brignull, Rosanna Danza, Roxanne Sammons, Ruby Arenson, Ruth Wall.
Thomas Cassany, Tricy Dino.
Varadh Kalidasan, Vikas Shah.
Wael Al Jeshi, Will Peck, Will Vauclain.
Yongji Zhou.
Zoe Broad.
Ed March, Edd Armitage, Eloise Hopes, Enora Hauduc, .
Isabel Richards, .
Nel Sui, Niall Egan, Niket Shah, .
Paris Goldman-Smith, Patricia Botta-Guasch, Paul Clarke, Paul Heideman, Paul Wright, Paulina Koch, Peter Hancock, Piotr ‘Kru’ Kaczmar, Piotr Repetowski,
Sahba Najafi, Salman Ashraf, Seb Palmer, Sharon Harrison, Shubham Jain, Sophie Whelan, , Steph Lovis, Stephen Kennedy, Suzanne Westlake.
Gaining Industry Experience through partnerships
Some of the reasons we would like to highlight:
Your students will learn a variety of technologies and gain experience developing a production-ready system.
Your students will gain mentoring directly from the team, learn about software development in an Agile environment, and gain insights into working in a fast paced small software team.
The contributions will be directly used by students and teachers worldwide, helping them to flourish in an increasingly digital world.
Your students will build their portfolio and gain industry-experience, which is highly valued by employers.
You and your students will have the satisfaction of making the world a better place, one contribution at a time. 😊
In order to design projects suitable for your students, please get in touch with us at codeforlife@ocado.com and title your email; Industry Experience.
Some previous partners have been Imperial College London and CS in Schools Cadet scheme.
Our Services
Below is the list of microservices we have within our system. Each service has its own documentation and code repository. Read more about how to use each service, their responsibilities and how they work under the hood.
Below is the list of code packages we install across multiple services. Each package has its own documentation and code repository. Read more about the code each package contains.
Below are empty code repositories that were created to track different types of tasks.
As Code for Life is an project, we work with external contributors on all forms of contribution including design and development. This means that we can design short projects for students and partners in order to provide experience in working within software in the EdTech industry.
Find out more about how we collaborate with our partners .
We endorse and extend ; please make sure you are friendly and welcoming.
A library of previous newsletters bringing activities, news and computing history to your classrooms.
Everything we release appears here! Changes released per version.
codeforlife-portal: 8.5.1, rapid-router: 7.4.7
Added list of individual cookies to the privacy notice.
rapid-router: 7.4.5
Now counting number of times users play Rapid Router and Python Den using GTM.
codeforlife-portal: 8.4.10, rapid-router: 7.4.4
Most Rapid Router and Python Den levels can now be accessed only by logged in users
Embedded Gitbook videos no longer keep playing in the background after closing the popup
codeforlife-portal: 8.4.4, rapid-router: 7.3.6
Students can now play their own custom level even if it still hasn't been approved by their teacher
Added missing my_van.deliver()
command to the Python commands popup in PD level 40
codeforlife-portal: 8.4.3, rapid-router: 7.3.4
Fixed a bug in the level access control feature where Episode 8 (Procedures) couldn't be unlocked
codeforlife-portal: 8.4.0, rapid-router: 7.3.2
Linked the "Opportunities with Code for Life" document in the footer and Get Involved page
Links to PDF docs now point to Gitbook URLs instead of GCP assets bucket
Retired our use of Mouseflow
Added a new button in the Play page banner to direct users to the Python Den
Reworded the buttons on the Play page from "Play" to "Try"
Made the level moderation feature proactive instead of reactive, meaning students now need to have custom levels approved by their teacher because they can be shared with others
codeforlife-portal: 8.2.2
Class names can no longer contain special characters
Update to privacy notice around GA4 data collection
codeforlife-portal: 8.2.0, rapid-router: 7.2.9
Improved Python error feedback in Python Den console log.
codeforlife-portal: 8.1.3, rapid-router: 7.2.8
Removed trial "Donate" button
codeforlife-portal: 8.1.2, rapid-router: 7.2.7
Fixed small ordering and layout issues in Python Den's episodes accordion
codeforlife-portal: 8.0.5, rapid-router: 7.2.5
Improve input sanitisation on subtitle, description and hint fields in the Level Editor
codeforlife-portal: 8.0.3, rapid-router: 7.2.3
Allow for Python Den worksheets to be locked from the teacher's level control form.
codeforlife-portal: 8.0.1, rapid-router: 7.1.0
Released Python Den worksheets on 2D lists and Procedures and Functions.
codeforlife-portal: 8.0.0, rapid-router: 7.0.1
BREAKING CHANGE: Upgrade from Django 3.2 to 4.2.
codeforlife-portal: 7.4.9
Fixed broken edit account details forms
codeforlife-portal: 7.4.6, rapid-router: 6.7.1
Switched to PostgreSQL 16 from MySQL 5.7
Transferred all data for all 3 environments to the new instance on GCP
codeforlife-portal: 7.4.4, rapid-router: 6.7.0
Updated the Coding Clubs page to match new structure after Python Den release
Updated the marketing video for the Python Den on the Teach page
Removed the temporary redirect to the Python Den from the old Rapid Router levels
Included the Python Den in our Terms of Use
Fixed the broken level moderation page, teachers can now view and delete custom levels again
codeforlife-portal: 7.4.0
Updated Home Learning page to reflect Rapid Router changes following Python Den release
Added a tester Donate button to the header which links to a contact list in DotDigital
rapid-router: 6.6.0
Released Blockly translations for Bulgarian, Polish, Brazilian Portuguese and Russian.
Amended Python Den level 15 to accept more solutions.
codeforlife-portal: 7.3.7, rapid-router: 6.5.3
Fixed "days left" data binding in inactivity reminder emails
Fixed broken links to the old CSR page, now redirecting to the Sustainability page
Updated migrations to be Postgres-compatible
rapid-router: 6.5.2
Fixed column alignment issue in Python Den scoreboard.
codeforlife-portal: 7.3.3, rapid-router: 6.5.1
Update Python Den web pages to ensure title says "Python Den" instead of "Rapid Router"
Mark some MUI icons in the login dropdown as data-nosnippet
to see if search engines stop rendering their text version
codeforlife-portal: 7.3.2, rapid-router: 6.5.0
Added the scoreboard feature to the Python Den
Fixed link to Blockly phrasebook in Play page
Allow admin teachers to move students from any class in their school
rapid-router: 6.4.4
Replaced cows with pigeons in City theme
Added solar panel options for Snow and City themes
Fixed Python Den banners to match Rapid Router banner height
Fixed links to Blockly phrasebook and Python guides
codeforlife-portal: 7.2.1, rapid-router: 6.3.7
Upgraded to Python 3.12
codeforlife-portal: 7.2.0, rapid-router: 6.3.5
Released Python Den
Changed colour of upper-left hand corner text in Rapid Router game view from black to white.
codeforlife-portal: 7.1.1, rapid-router: 6.0.2
Fixed the "exploding flying van bug" where using an action block / command in front of a cow would cause a crash.
codeforlife-portal: 7.1.0
Added three email alerts for users who haven't been active in a while, warning them that their account is about to be anonymised. The first reminder happens 2 years since last activity, the second 2 years and 8 months, and the final reminder 2 years and 11 months, 1 month before the anonymisation happens at 3 years of inactivity.
codeforlife-portal: 7.0.0, rapid-router: 6.0.0
BREAKING CHANGE: Removed everything Kurono-related, including game dashboard functionality, Kurono-related text, images and videos and deregistered the URLs for Kurono.
Added a migration to clean dirty class data, i.e. to nullify the creation_time
of the few classes that inexplicably had a creation_time
set to before we actually started tracking that data.
Reintroduced the missing buttons to the "Overwrite" popup in Rapid Router's level editor.
Enabled the is_animal_crossing()
and sound_horn()
commands in Python levels.
Gave the "sound horn" action a wait time equal to all other action animations, allowing for the highlighting of the "sound horn" block or the sound_horn()
command to be visible.
rapid-router: 5.27.0
codeforlife-portal: 6.46.0, rapid-router: 5.26.1
Introduced functional cookie to save a user's preferred language in Rapid Router.
Functional cookies are now automatically deleted from the browser after a user withdraws their consent and navigates back to Rapid Router.
10 years celebration page is under construction!
Reintroduce the 2 email reminders for unverified users before their account gets anonymised.
rapid-router: 5.25.0
Added a sounded effect for when the Electric Van starts.
Added a "battery gauge" for the Electric Van, similar to the fuel gauge for the classic van.
rapid-router: 5.23.1
Level subtitle, description and hint can now be customised with creating a level in the level editor.
rapid-router: 5.22.0
Scenery (cows and traffic lights) can now be dragged directly from the sidebar in the level editor!
Added solar panels to grass and farm scenery!
Added the electric van as a character option!
Blocks can now be translated into Catalan and Spanish.
rapid-router: 5.19.0
Scenery (trees, bushes and ponds) can now be dragged directly from the sidebar in the level editor!
Disabled algorithm score for all custom levels
Fix cow placement so they cannot be put on start or destination blocks
codeforlife-portal: 6.45.1, rapid-router: 5.18.2
Added missing translations for the "Do" block
Clarified verification email that gets sent to released school students
De-verify students when they are released as verification of their new email address is required
Clarified error text when requesting to join a class that doesn't exist or isn't accepting join requests
aimmo: 2.11.3, codeforlife-portal: 6.44.9, rapid-router: 5.18.1
Fixed level 36 so the van now drives under the trees instead of over them.
codeforlife-portal: 6.44.5, rapid-router: 5.18.0
Introduced a translation feature for the blocks in Rapid Router! Initial deployment includes English (UK), English (US), French and Hindi.
Updated the level editor to allow for creation of multiple destinations (houses)
Fixed the "wonky" level editor layout
Added the Gmail and Outlook redirection buttons to the password reset request sent page
Updated the contribute page with more up to date figures
codeforlife-portal: 6.44.3, rapid-router: 5.16.25
Transferred all the other emails to DotDigital
Ran migrations to clean illogical data states:
Anonymised "typeless" users
Anonymised empty schools
Verified all returning users
All students are now automatically verified upon their first login
Updated footer layout with social media icons
codeforlife-portal: 6.41.12
Moved the jQuery script tag higher up in the DOM - seems to have fixed, or at least warded off, the ghost bug.
codeforlife-portal: 6.41.11, rapid-router: 5.16.24
Host js-reverse script directly instead of downloading as an attempt to fix the jQuery ghost bug - turned out to be unrelated.
codeforlife-portal: 6.41.10, rapid-router: 5.16.21
Transferred some of our email messages from AWS to DotDigital to help with email authentication:
Email address verification on account creation
Email address verification on account email change
Email address update notification
Parent's / Guardian's email address verification on account creation for independent user under 13
Email address verification first reminder
Email address verification second reminder
Forgotten password reset
Updated Privacy Notice to highlight the use of YouTube embedded videos
Fixed broken Mouseflow cookie
aimmo: 2.11.2, codeforlife-portal: 6.41.5, rapid-router: 5.16.21
Updated main logo to its trademarked version.
Fixed broken mute cookie.
codeforlife-portal: 6.41.3, rapid-router: 5.16.20
Updated text on email verification and reset password pages to highlight need to check spam folder.
Updated solutions to levels 106-109 to replace n
variable with number
.
codeforlife-portal: 6.41.2, rapid-router: 5.16.19
Fixed issues relating to max scores in Rapid Router.
aimmo: 2.11.1, codeforlife-portal: 6.41.1, rapid-router: 5.16.15
Added a button which links to Outlook on the email verification page.
Added the 10-year badge image to the footer.
Slightly amended level and episode names to make them consistent.
Teachers can no longer select Episodes that aren't ready in the scoreboard.
The scoreboard now properly shows the results for all Episodes to the teachers.
codeforlife-portal: 6.40.0
Added a link to the 2023 Impact Report in the footer.
rapid-router: 5.16.12
codeforlife-portal: 6.39.10, rapid-router: 5.16.10
rapid-router: 5.16.9
codeforlife-portal: 6.39.9, rapid-router: 5.16.8
rapid-router: 5.16.6
rapid-router: 5.16.4
Replaced the van with the sleigh in the Start block during the Christmas theme.
Updated the description of level 36 to show example code and cog icon.
The level selection page now remembers which Episode the user was last on and opens that accordion by default.
aimmo: 2.11.0, rapid-router: 5.16.1
Imports in Kurono are now restricted to the ones used in the worksheets.
Cows are now always visible in Rapid Router.
The van now needs to be on the square directly before a cow in order to honk the horn to make it disappear, instead of two squares away.
aimmo: 2.10.15, codeforlife-portal: 6.39.8, rapid-router: 5.15.13
Introduced else
in Level 36 (in level intro and solution)
Fixed and updated styles of missing Level Editor popup buttons
aimmo: 2.10.12, codeforlife-portal: 6.39.4
No longer gathering and processing school postcodes
School countries are now optional
UK schools can be linked to a county, which is also optional
Fixed and issue with the flow for changing emails addresses
Now tracking worksheet usage, worksheet badges and game load time in Kurono
aimmo: 2.10.9, codeforlife-portal: 6.38.1, rapid-router: 5.15.5
Created levels 110-122 in Rapid Router, within Episode 12 as an introduction to While Loops.
Added episodes 13-15 to the levels list and marked them as coming soon.
Added a formal method to capture volunteer acceptance of contributing terms.
Password fields in forms now have a "reveal password" icon.
Removed autocomplete for some password fields.
Increased the size of the Rapid Router level map so it takes up the whole section.
Updated the button styles for the hint and level failure / completion popups in Rapid Router.
aimmo: 2.10.7, codeforlife-portal: 6.37.1, rapid-router: 5.12.3
Introduced cows to levels 38, 39 and 47
Removed the game-creator and moved its logic to the Django aimmo app
codeforlife-portal: 6.37.0
Unverified users are now anonymised instead of deleted.
Keep track of daily and total unverified users anonymisations.
codeforlife-portal: 6.36.2
Implemented a quick fix for the 2FA bug.
codeforlife-portal: 6.36.0
Keep track of total registrations.
codeforlife-portal: 6.35.3, rapid-router: 5.11.3
Added a comma in some of the Rapid Router levels instructions for better readability.
Only the selected road type in the level editor has a border now to improve user experience.
Created two automated email verification reminders for unverified users who registered 7 days ago and 14 days ago.
Created an automated deletion job which deletes unverified users who have registered over 19 days ago.
aimmo: 2.10.6, codeforlife-portal: 6.34.1
UK schools are now linked to a county.
Kurono games are now stopped immediately upon deletion.
Implemented a max limit of 15 for concurrent Kurono running games. Attempting to create or start a 16th game will show the user a friendly error message.
Updated the starter code for worksheet 2 to reflect changes on Gitbook.
aimmo: 2.9.1, codeforlife-portal: 6.33.6, rapid-router: 5.11.1
Fixed a bug with the password strength indicator on password reset.
Fixed a bug with the password reset email form.
rapid-router: 5.11.0
Enabled secure boot for GKE nodes.
aimmo: 2.9.0, codeforlife-portal: 6.33.0
Upgraded to Python 3.8.
Added a check for commonly used passwords upon registration.
aimmo: 2.8.7, codeforlife-portal: 6.31.1
Removed intermediate Teaching Resources pages, dropdowns now link directly to Gitbook.
Shortened email verification links.
Fixed Kurono cross-worksheet badges trigger bug.
Testing out new GA4 script.
codeforlife-portal: 6.30.11
Fixed mistakenly removed riveted.js library.
aimmo: 2.8.5, codeforlife-portal: 6.30.10, rapid-router: 5.10.6
Updated an outdated JS library.
aimmo: 2.7.0, codeforlife-portal: 6.30.4
Updated Kubernetes to 1.26 and Agones to 1.31.
Addressed a number of security issues related to the clusters and node pools.
Added a custom action in the Django admin panel allowing admins to bulk stop Kurono games.
Added text in Terms of Use describing the school admin powers.
aimmo: 2.5.20, codeforlife-portal: 6.30.2
Implemented JWT tokens for the registration process, allowing users to have simultaneous valid email verification tokens on registration.
aimmo: 2.5.19, codeforlife-portal: 6.29.9, rapid-router: 5.10.5
Fixed Avatar auth token generation when creating an Avatar in Kurono.
Teachers can now access the account settings page even if they don't have a school.
Updated the solution for level 43.
Matched the green in the level editor sidebar to the one in the actual game.
Verification emails are now sent before the newsletter confirmation emails.
aimmo: 2.5.18, codeforlife-portal: 6.29.4
Updated text and padding of the Get Involved page.
Added a "pause" functionality to the Kurono game - users can now pause their avatar, effectively stopping their code and the logs while the rest of the game carries on.
aimmo: 2.5.16
Updated the Kurono avatar marker - made it bigger, changed the model to the Kurono logo and added a bounce animation.
rapid-router: 5.10.4
Reverted an issue introduced in the previous deployment which made the map no longer scrollable on tablets.
Fixed the broken coin image that appears in the Episode title when all levels have been completed.
rapid-router: 5.10.2
Fixed some issues with the zoom buttons in Rapid Router, namely, the game doesn't randomly zoom in on the first input, and the buttons remain in the screen for all screen sizes.
rapid-router: 5.10.1
Fixed scoreboard bug whereby custom level names prevented the page from loading.
aimmo: 2.5.15, codeforlife-portal: 6.29.3, rapid-router: 5.10.0
Fixed level editor disappearing scenery bug
Updated introductory videos order in Rapid Router
aimmo: 2.5.12, codeforlife-portal: 6.29.2, rapid-router: 5.9.1
Fixed a broken DB migration.
codeforlife-portal: 6.29.0
Added ratelimit to the student login as well as the tracking for the lockout reset mechanic.
codeforlife-portal: 6.28.3, rapid-router: 5.8.1
Updated Privacy Notice with updated text and correct personal data information.
aimmo: 2.5.11, codeforlife-portal: 6.28.0, rapid-router: 5.8.0
Added cows and cow-related blocks to Rapid Router
Implemented a data tracker for when users reset their passwords to unlock their accounts (teachers and independent students only)
Having no nearby artefacts in worksheet 4 no longer raises an error which blocks the user from progressing, instead it prints out a more user-friendly warning.
codeforlife-portal: 6.27.8, rapid-router: 5.7.4
Removed the snow in Rapid Router.
Coding club page link now opens in the same tab as expected.
codeforlife-portal: 6.27.7
Updated instructions for level control and added a usage tracker for it.
Fixed broken independent student newsletter subscription.
Added a link to the coding clubs page on the Get Involved page.
codeforlife-portal: 6.27.3, rapid-router: 5.7.3
Brought back Rapid Rudolph
Updated incorrect email address in privacy policy.
Update Rapid Router UI including previous and next level buttons.
aimmo: 2.5.10, codeforlife-portal: 6.27.1, rapid-router: 5.6.1
Teachers can now control which levels of Rapid Router are available on a per-class basis.
Fixed missing padding in level editor.
aimmo: 2.5.7, codeforlife-portal: 6.24.1
Fixed a bug where old games would show in the Kurono games table.
aimmo: 2.5.6, codeforlife-portal: 6.23.1, rapid-router: 5.5.2
Upgraded Kubernetes to version 1.23 on all Kurono resources.
Admin teachers can now create Kurono games for their colleagues.
Updated Rapid Router Python levels styles.
aimmo: 2.5.2, codeforlife-portal: 6.22.1, rapid-router: 5.5.1
Made the alert banner on the homepage dynamic.
Fixed some bugs in the level editor.
Admin teachers can now see, play, edit and delete any Kurono game in their school.
codeforlife-portal: 6.21.0, rapid-router: 5.5.0
Admin teachers can now see, play and share any custom level in their school.
codeforlife-portal: 6.20.3
Updated the Data Protection Officer's email address in the Privacy Policy.
codeforlife-portal: 6.20.2
Removed the Kurono maintenance banner.
codeforlife-portal: 6.20.1, rapid-router: 5.4.3
Fixed missing cookie banner and settings
Fixed some UI bugs in Rapid Router
codeforlife-portal: 6.19.1
Added code clubs page with free downloadable content
Updated text to registration forms
Fixed issue where the Kurono preview video would not load on the independent student dashboard
aimmo: 2.4.6, codeforlife-portal: 6.18.3, rapid-router: 5.4.2
Fixed a major issue where deployment was broken by removing the legacy django-autoconfig package
Added a banner on the homepage to warn users of ongoing issues with Kurono
Updated session timeout to 30 minutes and added a 2 minute countdown to warn users of it
Fixed some issues with Rapid Router button designs
Users can now see their scores for custom levels on the scoreboard page
codeforlife-portal: 6.16.0, rapid-router: 5.3.1
Admin teachers can now see and moderate all custom levels in their school
Admin teachers can now see, accept and reject all external requests to their school's classes
Updated Rapid Router icons
Updated Rapid Router Python levels design and made each component resizable
aimmo: 2.4.3, codeforlife-portal: 6.15.4
Admin teachers can now see, edit and delete all the classes in their school
Admin teachers can now create a class for a fellow teacher
Updated the "Make admin" popup
aimmo: 2.4.1, codeforlife-portal: 6.15.3, rapid-router: 5.1.0
Updated Rapid Router levels design
Removed Dee from Python levels
Added Bav the Brain to brainteaser levels
Admin teachers can now see all classes in their school
Gave admin teachers the ability to create classes for other teachers
Updated the "Make teacher admin" popup
Created child-friendly versions of the Privacy Policy and Terms of Use
Independent students under 13 now need to provide their parents' or guardian's email address
aimmo: 2.4.0, codeforlife-portal: 6.12.4, rapid-router: 4.4.1
Gave admin teachers the possibility to invite other teachers directly to their school
Removed the ability to join another teacher's school by looking it up and sending a join request
Added a confirmation popup to the independent student account deletion process
Updated the teacher registration form and added a consent checkbox
Added a one hour screen time warning popup
Made the Rapid Router scoreboard clearer and easier to work with
aimmo: 2.3.5, codeforlife-portal: 6.8.9
Removed newsletter signup for independent students
Fixed registration boxes width
aimmo: 2.3.4, codeforlife-portal: 6.8.8, rapid-router: 4.3.0
Added badges for challenge 1 in Kurono
Independent students can now delete their accounts
Signing up for the newsletter using the footer form now requires the user to be over 18
Rapid Router solutions for levels 101-104 now have a main() method
Teachers can now re-share the levels that are shared with them
Fixed deleting workspaces in Rapid Router
In Kurono, when moving towards is blocked by an avatar, a message is now displayed in logs
Security updates
aimmo: 2.1.2, codeforlife-portal: 6.8.2
Add worksheet 4 for Kurono
Security updates
codeforlife-portal: 6.6.0, rapid-router: 4.1.0
Update Rapid Router level 48 to include multiple houses
Anonymise schools and classes without any active teachers
codeforlife-portal: 6.5.2
School is now anonymised when the last admin leaves and marked as inactive
Fix email display and link
aimmo: 2.0.4, codeforlife-portal: 6.4.4, rapid-router: 4.0.9
Anonymise classes instead of deleting them
Update style and content of emails sent to users
Update Pyodide to fix Kurono issue running on certain browsers
Rename v
variable in Rapid Router to my_van
Fix multiple start blocks bug in Rapid Router
codeforlife-portal: 6.3.1, rapid-router: 4.0.4
Delete account functionality for teacher
Admin role is passed to the next teacher when admin account is deleted
Fix bugs where deleted teachers were showing
Update image credits and alt texts
rapid-router: 4.0.2
Fixed Rapid Router not loading properly
aimmo: 2.0.1, codeforlife-portal: 6.0.1, rapid-router: 4.0.1
Upgraded Django to version 3.2
codeforlife-portal: 5.42.0
Independent student and login update to use email only and no username
Added videos to Educate and Play pages
rapid-router: 3.8.9
Fixed student scoreboard not showing data.
codeforlife-portal: 5.40.0
Added Dotmailer address books integration on registration / newsletter subscription (user types).
codeforlife-portal: 5.39.1, aimmo: 1.4.11, rapid-router: 3.8.8
Scoreboard now does not display everything on page load
Kurono student dashboard update
Fixed Rapid Router freeze issue when using fast play
Fixed Crowdin resources that were blocked
rapid-router: 3.8.5
Fixed Crowdin's In-Context translation tool.
rapid-router: 3.8.3
Fixed bug introduced with previous level 74 improvement.
rapid-router: 3.8.2
Improved Rapid Router level 74 solution.
codeforlife-portal: 5.37.2, aimmo: 1.4.10, rapid-router: 3.8.1
Thickened road divider lines in Rapid Router
Updated remove / leave teacher page
codeforlife-portal: 5.36.1, aimmo: 1.4.9, rapid-router: 3.8.0
Improved registration process
Disabled local storage in Rapid Router
codeforlife-portal: 5.35.1, aimmo: 1.4.7, rapid-router: 3.7.8
Ensure no duplication of email when releasing student
Cookies updates
codeforlife-portal: 5.34.3, aimmo: 1.4.6
Data tracking for join and release of student
Updated starter code for Kurono worksheet 3
codeforlife-portal: 5.33.3
Cleaned up some teacher and independent student accounts that had the same email.
codeforlife-portal: 5.33.0
User sessions will now expire on browser close.
codeforlife-portal: 5.32.3
Updated 2FA pages
New registration for independent student or teacher now require unique email across the different account types
rapid-router: 3.7.1
Removed snow from Rapid Router.
aimmo: 1.4.5, codeforlife-portal: 5.32.0, rapid-router: 3.7.0
Updated OneTrust instance for cookie management
Added scrollbar in Python pane in Rapid Router Python levels
Made Python pane resizeable in Rapid Router Python levels
Made email verification link expiry time explicit on verification page
Redesigned password reset and email verification pages
Redesigned Kurono teacher dashboard
Redesigned level moderation page
Fixed level moderation delete level bug
Scoreboard page now loads all classes and levels data by default
Deleting Kurono games now archives them instead of deleting them completely
Upgraded to Kubernetes 21.7.0
Tidied up independent student duplicate accounts with the same email
aimmo: 1.3.3, codeforlife-portal: 5.28.1, rapid-router: 3.5.7
Account details page updates
Registration page update
Kurono worksheet 2 starter code update
Crashing, running a red light and running out of fuel in Rapid Router now count as an attempt
Scoreboard filter update
codeforlife-portal: 5.27.9, rapid-router: 3.5.5
Fix scoreboard loading issues.
codeforlife-portal: 5.27.8, rapid-router: 3.5.4
Fix alignment and text issues in edit class pages
Fix scoreboard spacing and functional issues
Allow logged in users to view other login pages
codeforlife-portal: 5.27.5, rapid-router: 3.5.3
Update Scoreboard page with new designs and Improvements table
Update all class edit pages
aimmo: 1.3.2, codeforlife-portal: 5.26.14, rapid-router: 3.4.5
Remove Wagtail
Align pages to container width
Fix 2FA QR code not showing bug
Fix 2FA banner bug
Stick website footer to bottom of the screen
Remove all Rapid Router resource pages and link to Gitbook instead
Fix heading sizes on Play page
codeforlife-portal: 5.26.3, rapid-router: 3.4.4
Student login details CSV now includes student passwords and class link
Fix for class code login issue
Rapid Router functions renaming to be more descriptive
Data and error logging
codeforlife-portal: 5.24.2, rapid-router: 3.4.3
Updated Educate page
Updated Play page
Updated teacher and independent student navigation bars
Fixed alignment issues on student Kurono dashboard
Fixed alignment of header and footer
Fixed teacher dashboard and Kurono page
Fixed size of table buttons
codeforlife-portal: 5.21.3, rapid-router: 3.4.1
Further CSP fixes.
aimmo: 1.3.0, codeforlife-portal: 5.21.2, rapid-router: 3.4.0
Home Learning page update and Independent student resources
Fix for deleted students appearing at places
Class code is now case insensitive plus related fixes
Implemented CSP header
Kurono worksheet updates - moved from model to a data file
Privacy policy and Terms of use pages design updates
codeforlife-portal: 5.17.1, rapid-router: 3.3.1
Updated Rapid Router level selection page
Removed django-hijack
codeforlife-portal: 5.17.0
Added student login type data.
rapid-router: 3.2.0, codeforlife-portal: 5.16.3
Moved and linked Kurono resources to Gitbook
Updated teacher onboarding pages
Updated About Us page
Updated student dashboard including independent student
Updated lockout page
Removed Ocado logos from in-game images
Added functionality to import students from CSV file
Fix for class deletion
rapid-router: 3.1.0, codeforlife-portal: 5.10.0
Updated most of the Rapid Router level help texts (morning)
Updated student deletion data (afternoon)
codeforlife-portal: 5.9.0
Added school and class creation time and data.
aimmo: 1.1.0, codeforlife-portal: 5.8.0
Updated reminder cards design
Replaced IndexError
of scan_nearby
returned list with a more meaningful error
Fixed "Update account details" in the account dropdown
Added login metrics
Upgraded reportlab and pillow libraries
codeforlife-portal: 5.6.1, rapid-router: 3.0.5
Student login updated - option with class code or with direct link
Updated page with student login details
Updated class code format and student password policy
Split teacher dashboard in 3 tabs and updated designs
Updated teacher password policy
Updated login pages to have branding shapes
Updated Dotmailer's "Thanks for staying" campaign ID env var to point to the new one, which is aligned to the new design.
codeforlife-portal: 5.2.3, rapid-router: 3.0.4
Fixed some issues with page banners and header styles
Improved 2FA pages UI to match new styles
Disabled Turkish language localisation in Rapid Router after reports of it causing issues in classrooms
codeforlife-portal: 5.2.1, rapid-router: 3.0.3
Added index to Terms of Use
Removed country flag from Update School form
Header image repositioning and other header updates
codeforlife-portal: 5.0.1
Button and table display fixes.
aimmo: 1.0.0, codeforlife-portal: 5.0.0, rapid-router: 3.0.0
Updated website logo, design and style
Removed teacher title
Updated privacy policy
codeforlife-portal: 4.34.0, rapid-router: 2.7.14
codeforlife-portal: 4.33.0
Added Get Involved and Contributor pages.
aimmo: 0.69.19, codeforlife-portal: 4.32.4, rapid-router: 2.7.13
Improved user experience of login forms.
aimmo: 0.69.18, codeforlife-portal: 4.32.3
Kurono games now stop properly
Fixed empty game name bug
Dockerised portal for development
aimmo: 0.69.14, codeforlife-portal: 4.31.4, rapid-router: 2.7.12
Changed Kurono game load text to be more informative
Improved load time of Kurono games
codeforlife-portal: 4.31.2
Enforced account's email verification on login.
codeforlife-portal: 4.31.1, rapid-router: 2.7.11
Additional hint text for Rapid Router level 80 onwards
Top navigation bar fix on onboarding phase
codeforlife-portal: 4.30.13, rapid-router: 2.7.10
Display updates to the Rapid Router 'if else' block: clearer separation, clearer hints
Security header update
codeforlife-portal: 4.30.12, rapid-router: 2.7.7, aimmo: 0.69.11
Upgrade to Django 2.2.24
Prevent changing an account's email address to that of another account's
codeforlife-portal: 4.30.8, rapid-router: 2.7.5, aimmo: 0.69.8
Prevent concurrent login sessions for the same user
Security fixes and documentation updates
codeforlife-portal: 4.29.2, rapid-router: 2.7.4, aimmo: 0.69.3
Added ability to edit saved custom levels
Fixed invalid character bug
Fixed ReCaptcha bypass issue
Added ratelimit to sensitive forms and re-implemented 24 hour lockout
Fixed session not invalidated after password change issue
Removed autocomplete from forms
Added warning banner for email verification
Security fixes and JavaScript updates
Added Dotmailer consent renewal form
Fixed interchangeable GETs/POSTs issues
OneTrust Cookie Management
Updated Privacy Policy
Removed the admin login page! Admin access now requires a superuser profile with 2FA enabled.
Fixed a link in the Worksheet 3 resources.
Made portal only send Google Analytics events in prod environment.
Released Kurono Challenge 3!
Added MoveTowardsAction and scan_nearby methods to Kurono.
Challenge 3 has a new theme and two new different artefacts.
PDFs and solutions file have been updated with Challenge 3.
Not an April Fools, the above actually happened 🙂
Fixed worksheet selection bug.
Fixed Recaptcha dual-script bug.
Revamped the admin login page.
Added 2FA to the admin login form for accounts with 2FA.
Fixed pickups not spawning.
Navigation and text updates on Kurono pages.
Consent data when signing up to newsletter is now saved.
Agones has been integrated to improve game creation and loading.
Stats on Home and About page updated with the latest data.
Copyright year in the footer now updates automatically.
Console update to increase font size and make colour contrast more accessible.
Fixed the "Trash Can" bug.
Finished updating games table on Teacher Kurono Dashboard page.
Added the Kurono solutions file to the Kurono Packs page.
Updated the Teacher Kurono Dashboard page by simplifying the resources section and add the "Add Class" and "Challenge" dropdowns.
Updated Recaptcha script in hope to fix Recaptcha issues in certain countries.
Added Kurono Resources.
Added Kurono Teaching Packs.
Reset Code has been fixed in Kurono - it now resets the code to the Worksheet's starter code.
The sub nav has been fixed - it is now visible on mobile!
We upgraded to Django 2.2!
Rapid Rudolph has returned!
The Kurono "Add Game" form was improved by clarifying the labels
Introduction to coding (England)
Rapid Router can help you to cover the following national curriculum points:
• Understand what algorithms are; how they are implemented as programs on digital devices; and that programs execute by following precise and unambiguous instructions
• Create and debug simple programs
• Use logical reasoning to predict the behaviour of simple programs
• Recognise common uses of technology beyond school
We recommend that you start at Level 1 on Rapid Router.
Contribute to Code for Life
code changes
design
student resources
teacher resources
strategic insights from qualified teachers
process review
cloud infrastructure setup
Some of the reasons we would like to highlight:
Your contributions will be directly used by students and teachers worldwide, helping them to flourish in an increasingly digital world.
You'll learn a variety of technologies and gain experience developing a production-ready system.
You'll build your portfolio and industry-experience, which is highly valued by employers.
You'll have the satisfaction of making the world a better place, one contribution at a time. 😊
Get ready to dig in! 💪 We're hoping that contributing to this project will be as rewarding to you as it is to us. 🚀
Set user.name
to be anything you like.
Set user.email
to be an email address that you own. Note that:
You cannot use a private/noreply email address. If you have a GitHub account, this is enabled by default and can be turned off at Settings > Emails > Keep my email addresses private.
On the main branch of your forked codeforlife-workspace repo, write your email address on a new line at the bottom of CONTRIBUTING.md.
You must not make any other edits!
Replace user.email
with your email address.
Although you're welcome to pick up any task, not all issues are suitable for contributors. This is because some tasks require specialised knowledge or familiarity with how our system works. To help contributors find tasks we believe to be suitable for them, we label some of our tasks with a volunteers tag.
You can search for these with the filters:
Furthermore, we label some tasks with good first issue that we believe to be easy enough for first time contributors:
All dev contributors will need to have these skills to contribute code changes:
git clone
git pull
git commit
git push
It's recommended contributors wishing to contribute to our back end familiarise themselves with:
It's recommended contributors wishing to contribute to our front end familiarise themselves with:
Below is everything you need to know about how to handle tasks as a contributor.
If you have questions or require guidance, we'll do our best to respond promptly and provide you with support.
When you've completed your task, you must request a review from us to determine whether we can accept your contribution. The simplest way to do so is to comment on the task:
If we discover issues in our review, we'll request changes. It's normal to have multiple rounds of review requests (by you) followed by change requests (by us) until the task is completed to our standards. Change requests will usually be commented directly on their respective GitHub task or pull request.
Once a task has been closed by us we'll go through some internal processes which will ultimately result in your contribution getting deployed in the next version of system.
It may take some time before your accepted contributions are live on our system as we batch changes and release them as new versions on our system.
Everything explained
A precise step-by-step set of instructions to solve a problem or complete a specific task.
A picture or cartoon, for example this could be a favourite character that you use to represent yourself online. It is sensible to protect your privacy by not using a recognisable photo of yourself.
A data type with only two values, TRUE or FALSE.
Identifying and correcting the errors in a computer program.
Decomposition is breaking a problem into smaller manageable chunks that can be solved individually. This might mean creating ‘sub-programs’ or procedures that contain the code for a particular part of the task.
Data put into a computer system, for example through the keyboard, mouse, microphone, or other sensors connected to the computer.
A systematic approach to solving problems using a set of consistent rules that apply to the system. For example, when fixing a bug in their Rapid Router program, children might apply the rules they have learnt about the way repeat loops work in this app.
The information produced by a computer system for the user, for example on a screen, printer, through speakers.
A set of programming instructions carried out in a specific and consistent order every time.
A self contained sub program, also called a subroutine, to which you give a unique name, that can be used or ‘called’ by the main program multiple times. Both a function and a procedure can accept inputs.
A function sends information back into the main program, whereas a procedure does not. A multiplication function might, for example, have two number inputs and return an answer to the main program.
A set of instructions encoded in a programming language understood by the computer.
(A program is also an algorithm, but not all algorithms are programs e.g. a recipe in English is an algorithm but it is not a computer program).
A feature of a programming language where sections of code are repeated. This can be a fixed number of times, or until a condition is met (Rapid Router example: repeat 5 times, repeat until at destination).
A feature of a programming language where a choice is made. The instructions followed depend on whether a particular condition is met (Rapid Router example: if traffic lights red, wait).
A general term, also called a subprogram, for a function or procedure.
A programming structure that contains data (often numbers or text) and can change or be changed. Variables are used to keep score in computer games, and in Rapid Router to store the colour of the traffic lights.
Introduction to coding (Scotland)
Thanks for visiting us at the Bett Show this year
This newsletter, we have packed in resources for you to read, enjoy, and get involved with. We want to hear what you think is useful, and how we can make things easier to navigate. Alongside this, we celebrate Bett 2025, our Industry experience scheme and much more!
Two other students from the scheme are also working on tasks. They have picked up development tasks and are being guided by Stefan, one of our Senior software engineers.
Shoutout to : Added new sound effects for Santa in Rapid Router
Shoutout to : Fixed the syntax in the Python Den's split levels so the generated Python is consistent with the commands presented in the Python-only levels
Shoutout to : Added introduction video to variable-type blocks in Python Den level 7
Shoutout to : Teachers outside of a school can now create and save custom levels
Added link to download our in the footer
Shoutout to : Fixed strange highlighting bug when placing cows
Shoutout to : Cows can now be placed on non-road squares as scenery!
Shoutout to : Fixed broken website bar on Safari and tablet devices
Shoutout to : Students' custom levels are no longer still shared with their ex-teacher and classmates after being released from the school
Shoutout to : Removed the direct drive arrows in Rapid Router
Shoutout to : Fixed the broken JS elements in the registration form for invited teachers
Shoutout to : Going back to the levels page from within a Rapid Router / Python Den level using the browser's back arrow now only takes one click instead of several
Shoutout to : Show failure popup when trying to deliver at a non-destination square.
Shoutout to : Updated the Python commands modal so it only shows the commands relevant to the level that's being played.
Shoutout to : Updated the Gmail button links to search for our new email service domain
Shoutout to : Fixed the saving functionality of level workspaces.
Shoutout to : Removed level 14's solution's random block on the side of the workspace.
Shoutout to : The Start block now always spawns at the same location in the game, instead of a random location sometimes too close to the edge.
Shoutout to : Dee no longer appears in the intro popup for level 116.
Shoutout to : fixed the broken student login link in the level editor popups.
Shoutout to : fixed the level editor so the "level language" setting persists through saving & loading.
Shoutout to : videos in Rapid Router popups now stop playing when the popup is closed.
Shoutout to : renamed level 36 to include else if
concept.
Enabled Rapid Rudolph
: Fixed bug with deleting Rapid Router custom level
: Disable saving and loading of workspace when user is not logged in
: Disable save and load buttons in the game template when user is not logged in
The National curriculum for computing can be found . These are the statutory programmes of study and attainment targets for computing at key stages 1 to 4.
As Code for Life is an project, we welcome external contributors and all forms of contribution such as:
running
If you would like to contribute in one of the ways mentioned above or in a way not mentioned above, please reach out at - all help is welcome! 😉
Want more reasons? See .
We endorse and extend ; please make sure you are friendly and welcoming.
Every contributor will need a GitHub account, regardless of whether they wish to contribute code or other types of work to the project. This is because we use GitHub to manage our project's tasks. If you don't already have a personal GitHub account, .
We recommend that you start your journey with us by reaching out to us at and notify us of your intent to contribute. While it's not required to do this, we recommend starting a conversation with us early on so that we may learn more about your individual skill set and suggest tasks that you're suited to.
Before you begin contributing, you must first sign our . This gives CFL permission to use your contributions in our app! 🚀 After reading the agreement, you must sign it by following the below steps. If you have any trouble, please reach out to .
Git's first-time setup docs.
This email address will be forever publicly visible! If you wish to keep your personal email address private, then we recommend you create a new email address for the sole purpose of making contributions. If you have a GitHub account, you can to it.
how to do this on GitHub.
Create a pull request from the main branch of your forked codeforlife-workspace repo to the main branch of .
how to do this on GitHub.
To affirm that you own the email address you provided, an email will be sent to the email address after your pull request has been reviewed and approved by a member of our team. The email will contain a link to the pull request that added the email address as a contributor. You must forward the email to from the same email address and state:
All of our project's tasks are tracked using - we use the words "issue" and "task" interchangeably. Each code repository has an Issues tab where you can browse the various tasks we have for the repo. You can find our list of repos by looking at our .
If you are contributing code changes, we recommend you spend a little time skimming through the docs of our different code repos (see our ). This will give you some insight into how our system is structured and, given that each task is associated to a repo, you'll have a high-level understanding of the area of the system that you'll be working on.
Once you have an overview of our system, .
A basic understanding of what does. You'll need to know what the following commands do:
A basic understanding of what does.
A basic understanding of what does.
The basics of .
The basics of and .
The basics of .
The basics of and .
The basics of .
The basics of .
The basics of and .
The basics of and .
The basics of .
The basics of .
Before you start working on a task, we recommend you reach out to us at so that we may assign the tasks you're working on to your GitHub account.
If you're a dev contributor, you'll first need to fork any repo you wish to develop for. You should have forked all of CFL's repos when you .
Our preferred communication channel is GitHub - we ask you make comments directly on a task so that we may keep all conversations regarding a specific task in a central location. Otherwise, you may reach out to us at or via the email address of any CFL team member you may have previously been in contact with.
If you're a dev contributor, review requests will come in the form of .
You can see when your contributions have been released by keeping an eye on our . However, we're aiming to improve our notifications so you're kept in the loop every step of the way.
Some definitions are adapted from where you can find additional explanations of computing terms.
The Curriculum for Excellence (CfE) initiative highlights as one of the curriculum areas considered to be particularly important. Within the Computing Science section:
Rapid Router can help you to cover the following national curriculum points:
TCH 0-13a - Exploring Computational Thinking in everyday tasks and identifying patterns.
TCH 0-14a - Understanding sequences of instructions.
We recommend that you start at Level 1 on Rapid Router.
Rapid Router can help you to cover the following national curriculum points:
TCH 0-13a - Exploring and commenting on processes in the world around them, making use of computational thinking skills and organising information in a logical way
TCH 0-14a - Understanding instructions in a visual programming language and predicting the outcome of a program using a visual language.
We recommend that you start at Level 1 on Rapid Router.
Rapid Router can help you to cover the following national curriculum points:
TCH 0-13a - Understanding how a process works and its outcome.
TCH 0-14a - Explaining core programming language concepts.
Rapid Router can be used to develop skills with sequence, selection and iteration, as well as debugging.
Please see our resources for textual programming.
We recommend that you start at around Level 13 - 18 on Rapid Router.
Rapid Router can help you to cover the following national curriculum points:
TCH 0-13a - Describing processes and how they can used to solve problems. How information can be used in a real-world system.
Rapid Router can be used to develop skills with sequence, selection and iteration, as well as debugging and modular program development.
We recommend that you start at around Level 13 - 18 on Rapid Router. Please see our resources for textual programming and concepts for TCH 0-14a and TCH 3-15a.
Python Den can also be used to support in Computing Science.
TCH 0-13a - Describing processes used in real-world systems and comparing algorithms for efficiency.
We wanted to check if you visited our website and made use of our FREE programming and technology resources. You haven’t yet? Don’t miss out, .
If you are already using our fantastic resources, let us know by sending your .
This month, we are working with some students from , as part of our Industry experience scheme. We have been shaping this scheme over the last year and it is proving to be a successful way for students to gain experience and mentoring from our core team, whilst helping to contribute to the product itself.
One of our engineering students is working on a UX task, and would like to receive some feedback on her work so far. Please take a minute to feed back .
If you want to take a look behind the scenes, you can see the tickets on Github and .
Safer Internet Day provides resources, quizzes and tips to help educate people on the online risks that exist today. Find their resources !
Check out our own to learn about passwords and security.
We recommend that you start at around Level 13 - 18 on Rapid Router. Please see our resources for textual programming and concepts for TCH 0-14a and TCH 3-15a.
"Hi, I’m Prisha, and I’m a second-year Computer Science student at RMIT. Through my work with Code For Life, I’ve been focusing on improving the user experience for educators by relocating a key feature on the website to make it more accessible. It’s been an incredible ongoing learning experience, especially with the guidance of my mentor, Laura, whose expertise and support have assisted me a lot. I’m looking forward to hearing your feedback!"
On February 11th it is Safer Internet Day!
Technology is constantly changing and evolving. Especially now that AI is at the forefront of everyone's minds, a lot of new possibilities have been created for benevolent technologists and scammers alike. It is important to understand how these technologies work and how they can be used as well as abused, so you know how to detect and defend yourself from a scam.
We had a lovely time at St Francis de Sales school in London, UK, talking to the pupils about the technology at Ocado, and linking coding to robotics. After presenting in assembly, we delivered simultaneous workshops with year 2 pupils.
The kids had a great time and came up with some brilliant ideas including cooking robots, tickling robots, and even robots that went to school instead of them!
Welcome to the Easter Code for Life Newsletter!
This month we are celebrating robots and how we make them move with instructions. We have included real-world applications to interactive coding projects and spotlighting student achievements in a competition. Join us in fostering a passion for STEM education and empowering young minds to shape the future through innovation and creativity. Happy coding!
“AI is the most powerful tool ever invented by humanity.”Demis Hassabis, Co-founder of DeepMind
Ocado's robotic arms make smart decisions on the fly, packing grocery items densely into bags without any prior knowledge of what the products are or what’s coming next.
There are some levels in Rapid Router for those that need a bit more of a challenge.
You can find them in the red section on the levels page.
Code for Life partnered with some talented colleagues at Ocado Technology to create an engaging robotics and coding workshop for primary school students. The event was a resounding success, captivating approximately 90 young minds over a fun-filled afternoon.
“The children were buzzing after the session and found it really exciting to be able to design a robot and to meet real life coding experts. It was great to see them applying their coding knowledge on the Rapid Router game.”
Mr Emanuel, Deputy Headteacher.
Mr Emanuel from The Grove Junior School in Harpenden, arranged for the team to take over three classes, one after the other, initially showing a short presentation and then, encouraging the children to design a robot to solve a problem. If they managed to finish this task they then moved onto coding with Rapid Router, which we demonstrated on the screen beforehand. The feedback we received was fantastic and we all had a great time working with the children.
I live in North London with my family and a labradoodle named Zuko. My first summer job was selling ice cream on a beach in Norfolk. I did it for six years in a row and loved it, despite working long hours as a 13-year-old. One summer, I worked on a local fairground which was seriously tough but a good reference point for hard days in the office.
"Early Ocado was like a rollercoaster whose bolts hadn’t been tightened. If you get the chance to work in a start-up you should do it. The task seemed enormous, but so was the drive and determination."
I studied Physics at UCL before joining the IT department at John Lewis Partnership. They trained me in software development, let me build a procurement team and improve their network infrastructure. I also created their first e-commerce website.
I then moved on to work for Ocado, where I ran the Technology team for ten years. Early Ocado was like a rollercoaster whose bolts hadn’t been tightened. If you get the chance to work in a start-up you should do it. The task seemed enormous, but so was the drive and determination. I have been responsible for Logistics, building new CFCs, creating our own ASRS, and installing it around the world.
Welcome to the Code for Life Newsletter
We are thrilled to announce a momentous milestone in our journey - Code for Life is celebrating its 10th anniversary! 🎉
What started as a small initiative has grown into a thriving community, and we couldn't have done it without the support and enthusiasm of educators like you who share our vision for equipping the next generation with essential coding skills. We've been on an incredible journey, developing innovative teaching resources that cater to learners at various stages, starting with Blockly and progressing to Python.
To celebrate a decade of empowering learners through coding, we have some exciting updates and celebrations in store this year. Stay tuned for new features, enhanced game experiences, and more engaging content to keep the coding journey fresh and inspiring!
Thank you for being an integral part of Code for Life's success story. Here's to another decade of fostering curiosity, creativity, and coding brilliance!
Code For Life is consistently used in over 180 countries, achieving over 600,000 registrations worldwide.
Have you ever clicked on a button expecting it to do one thing but it does another? My role in UX (User Experience) is to capture instances like this, and feed them back to my team so they can make better choices in the design of websites. I do this by running interviews, sending out surveys, and testing prototypes directly with the people who will use the website. My job means I get to learn from new perspectives and ask lots of questions. I find it really exciting knowing that data I collect impacts product decisions and improves what we offer to customers.
"Understanding your user is especially important in a technology company. It takes a lot of time and effort for software engineers to write code for a new feature, programme, or product. So, it's critical to make sure that what is developed is needed and understood by users."
I had a tough time choosing what I wanted to do at university; for my A levels I did Chemistry and Maths, Theatre Studies and English Literature! I then came across Anthropology - a social science where you can study people and their cultures. Anthropology combined my passion for learning about people and reading with my skills for research and analysis. When it came to my career I did not think I would be able to use my degree every day, but now I'm a User Experience Researcher!
Welcome to our December Newsletter
The snow is back in our games, just in time for the festive season! Santa and Rudolph are on hand to help with deliveries, so don’t miss out—get stuck in before the snow melts away for another year!
Technology has completely transformed the way we celebrate festivals over the years. From digital vouchers to virtual promises in e-cards, the internet has made gifting easier and greener. Many digital gifting services now include eco-friendly touches, like planting trees or supporting carbon offset schemes with every purchase. So, while you’re spreading joy, you’re also helping to keep the planet merry and bright!
Have you tried out our solar panels and electric van in the level creator yet? It may not be much, but it is a step towards creating levels more aligned to helping our planet. Every bit we can do to help towards creating a cleaner climate counts.
Judith Donath (MIT Media Lab) created the first E-card site, The Electric Postcard. The award-winning site eventually became open source.
For the past 10 years, Code For Life has been supported, and was initially created by a community of volunteers from within Ocado Group. Now a small dedicated full-time team builds the free-to-use products, drives quality and ensures security of the platform, data and all its users. We are still reliant on our volunteers to contribute to new features, improvements, and help with our multiple outreach programmes.
This includes colleagues that are based all over the world in various departments. Recently, we teamed up with our office in Sofia to continue our 10 year coding and robotics workshop celebrations!
"Joining Code for Life has been an incredibly rewarding experience. It’s inspiring to see students light up as they grasp new concepts and gain confidence in creating something with their own hands. The program’s focus on making technology accessible and engaging ensures that participants are not only learning valuable skills but also developing a love for problem-solving. Being part of this initiative has allowed me to contribute meaningfully to the next generation’s education."
Today, Code for Life has grown into a vibrant coding platform supported by the expertise of Ocado Group’s talented teams. From regular security testing by Ocado’s specialists to ensuring data protection and compliance with the latest regulations, we take safety and privacy seriously. Our solutions benefit from industry-leading advice, ensuring scalability and reliability for classrooms everywhere.
"Helping young students learn about robotics and coding let me share my expertise and passion for technology. This was fulfilling as it hopefully helps inspire the next generation of engineers/STEM workers. Furthermore, teaching these concepts to young students helps develop soft skills such as communication, patience, and adaptability, which are valuable in my professional role."
Welcome to the Code for Life Newsletter
What a year it has been for Code for Life. Our small, dedicated team, housed amongst the roboticists in Ocado Technology, has remained resilient in a tough year. We have continued to push and drive our platform forward, building new features, new teaching resources, and new relationships with companies such as Barclays, CS in Schools, BCS and Barefoot Computing. We are excited to see what the new year brings, and are itching to show you our new features and lessons we are putting together for you.
Our newsletter this quarter is celebrating this time of year and we have packed this stocking of an issue full of fun facts and puzzles to keep you and your students busy in the run up to Christmas.
Among its Christmas fare the BBC broadcast two melodies that, although instantly recognisable, sounded like nothing else on earth. They were Jingle Bells and Good King Wenceslas, played by the mammoth Ferranti Mark I computer that stood in Alan Turing's Computing Machine Laboratory, in Manchester.
Did you know?Now we hear computer generated music all the time, can your students identify any of their favourite Christmas songs that have been created with help from a computer?
"My four years here have been a whirlwind - like all tech organisations, no day is ever the same. My role is responsible for Ocado’s employees- basically ensuring this is an amazing place to work regardless of your background.
The best thing about my job is when I see people grow and develop - here you can do this through your role, through professional courses and by volunteering internally. One great example of this is through Code for Life which benefits the skills and wellbeing of our volunteers, and inspires people to a future career in tech. This combination of learning, wellbeing, diversity and inspiring young people is one of the best ways Ocado builds a stronger organisation for the future."
"The best thing about my job is when I see people grow and develop... One great example of this is through Code for Life which benefits the skills and wellbeing of our volunteers, and inspires people to a future career in tech."
"Prior to Ocado I held senior HR roles with Expedia (online travel) and Premier Farnell (B2B distributor) and before that I worked at a start-up - all were great places where I learned loads. I was lucky enough to live in Chicago for five years which was a fantastic work and life experience. Chicago definitely gave me the travel bug and I love to take trips for holidays or work."
We are very excited about this. We have been busy exploring the open source IDE from Raspberry Pi and we think it's great!
We have a set of lessons ready to test in your classrooms and homes. If you'd like early access, drop us a line and we can share a link with you.
A while ago we mentioned we were partnering up with our Australian friends, CS in Schools. Well, we have a Beta set of lessons for you to test here in the UK too!
Here is what the CEO, Megan Woff says:
"This is the perfect introduction to grade 5 or 6 primary school students to algorithms and block coding! The course contains a full classroom-in-a-box for any teacher to be able to introduce fun & effective coding skills over 6 lessons.
The course includes full lesson slides, classroom based activities, worksheets, assignment, teacher notes & support and of course Rapid Router. The course is mapped to the Australian upper primary school curriculum (ages 8-12) and can be adapted for UK key stage 3."
Welcome to our summer newsletter! 🌞 In this edition of the Code for Life Newsletter we focus on User Experience (UX), a term coined by Don Norman in 1993.
"Computer scientists have so far worked on developing powerful programming languages that make it possible to solve the technical problems of computation. Little effort has gone toward devising the languages of interaction." Don Norman, "The Design of Everyday Things", 1988.
Today, "user experience" (UX) is a widely recognised term, and companies across various industries are increasingly valuing the role of UX designers. Don Norman notes that the term UX has evolved beyond his initial vision. He intended it to encompass everything affecting a person’s experience with a product, even beyond direct interactions.
Now, UX covers more than just websites, apps, and smartphones. It includes emerging technologies like virtual reality, AI, augmented reality, inclusive design, voice technology, and wearables. For example, designing a self-driving car requires considering the entire user experience, from approaching the vehicle to ending the ride.
At Ocado Group, the importance of UX design is paramount. UX designers play a critical role in crafting seamless and enjoyable experiences for not only the customers, but also the Ocado workforce. They are essential in designing intuitive interfaces for the Ocado online grocery platform, efficient systems for the automated warehouses, and innovative solutions in robotics.
Through our partnership with Barefoot Computing, we've crafted engaging lesson plans and videos tailored specifically for students aged 9-11. These activities are designed to spark curiosity and inspire the next generation of technologists.
And the best part? All of these resources are absolutely free! ✨
Ligia Olmos Rossi - Senior UX Designer
I'm a Senior Product Designer at Ocado Technology. My job is to make the website where you can buy groceries online look awesome and easy to use. I've loved drawing and making things look cool since I was really young. I always wondered how the things we use every day are made and how they make us feel. So, I decided to learn how to make them better!
Making websites and apps is like a mix of being super creative, understanding how people think, and knowing how technology works. I kept learning and practising, and now I get to do it as a job! It's not just a job for me, though. Making things look great and work well is like my whole way of life! I feel really lucky to be able to help make the world a better-looking and easier-to-use place for everyone. It's pretty cool to think that something I design can help lots of people buy their groceries with just a few clicks!
Ocado Innovation Limited is registered in England under registered company number 08813912 with its registered office at Buildings One & Two Trident Place, Mosquito Way, Hatfield, Hertfordshire, United Kingdom, AL10 9UL
Welcome back everyone!
We’re excited to welcome you back with some fantastic updates and new features. This term, we’ve introduced a beta release of our Python Den, some updates to Rapid Router, and some new features in the level editor. Our goal is to support you in creating an engaging and effective learning environment for your students. Stay tuned for upcoming events and online sessions to help you get the most out of these new features. Here’s to a successful school year ahead!
"We can track heart rhythm, breathing, temperature, posture and movement, and by applying algorithms, we can use this data to decode symptoms, articulate arrhythmia triggers and generate personalised digital biomarkers."
Bloomer Tech is named after Amelia Bloomer, an activist for women's rights who encouraged women to wear loose-fitting pants!
Have you seen the cows?
Keep a look out for the cows on some levels, they appear in the most inconvenient places!
Our colleagues at Ocado have been helping us out with some translations for our customers in other parts of the world. You now have the ability to translate the blocks in Rapid Router into Catalan, Spanish, French and Hindi, with other translations coming soon. Get in touch and let us know what could help you out too.
Craig n' Dave conference
CAS conference
World Tour - UK Leg
In2Science Contributor session
Upcoming
We have a few events to look forward to this term too. including an adult re-skilling session through Careers you Love. Keep a look out on social media for upcoming sessions.
Salman, a computer science student from Manchester University, worked with us as an intern for 10 weeks this summer. Read about what he got up to in the text below, and what he thinks about learning new digital skills.
"In just 5 weeks, I had the opportunity to dive deep into Python Django and to explore the vast capabilities of AWS and GCP. I've engaged with the senior developers, learned about the technologies at CFL and contributed to a meaningful project. "
I work as a Software Engineer Intern, where I help build computer programs to improve user experience. I got this role by studying hard in school, learning about computers and coding in my free time, and doing well in my classes at the University of Manchester. I enjoy my job because I get to solve puzzles every day by figuring out how to make our programs run faster and better.
Welcome to our Autumn newsletter
A celebrated female in technology to hit the headlines recently was Mira Murati, the CTO of OpenAI.
Mira Murati is currently the chief technology officer of OpenAI, the artificial intelligence research company that develops ChatGPT. She rose to prominence after the release of ChatGPT where she was widely celebrated by women in tech.
We celebrate our female colleagues too here at Ocado Technology, and Carisa Lopez, one of our Business Support Specialists, has helped us highlight how diversity in technology is fundamental in producing high quality products and services:
“Throughout history, women have made notable contributions across diverse fields, including computing, programming, engineering, and more. In the contemporary landscape, the role of women in technology holds unparalleled significance." ... "Women offer distinct viewpoints, ingenuity, and adeptness in problem solving, which fuel innovation and extend the boundaries of possibility." ..."Celebrating the achievements of women in technology, who serve as a continual source of inspiration, has been a truly enriching experience... ” Carisa Lopez, Ocado
Carisa Lopez - Business Support
I am a Business Support Specialist in North America for Ocado. I work as a key player to support the operation of the site. As a woman without a technical background, I’ve had to learn and understand a basic level of technical operations by submerging myself in technology. I work on projects called BOT School, Peripheral school, and Safety Training. These activities are aimed at providing the necessary assistance to ensure smooth site operations and support for my team.
Gaining a foundational understanding of equipment, diverse software systems and achieving expertise in Google Suite has empowered me to constantly advocate for my team members. Furthermore, I can foster a sense of inclusion among my team onsite, which is essential for creating an environment conducive to attracting and retaining top talents.
What I enjoy most about my role is that it has pushed me to become innovative and think outside of the box to become a stronger professional, but the best part of my role is the ability to form a professional relationship with each of my team members onsite and getting to know them individually. I hope to continue to inspire and encourage women and allies to get involved in the technology industry.
Welcome to the Christmas newsletter - Seasons greetings!
🎄🎄🎄🎄🎄🎄🎄🎄🎄🎄🎄🎄🎄🎄🎄🎄🎄🎄🎄🎄🎄🎄🎄🎄🎄🎄🎄🎄🎄🎄🎄🎄🎄🎄🎄🎄🎄
In December 1988, a worm named ‘The Father Christmas worm' was released into a NASA network. The aim of this worm was to send a Christmas greeting from "Father Christmas" from the affected system. The infection, originated in Switzerland, was thought to have spread to more than 6,000 computer nodes through the NASA network! 😱
When discovered, an email was sent out to warn centre managers that a worm had been released. One strategy to prevent infection was to create an empty "Hi.com" file which would stop the worm from being able to create a new version of the same file (this was its own strategy). This prevented mass infection and only 2% of infected devices launched the worm.
Although the Father Christmas worm caused little damage, it greatly increased the awareness of computer security protocol. This was proved in 1989, when a nearly identical worm was released into the Easynet intranet. The network manager was able to quickly prevent the spread of the worm because of the exposure of the Father Christmas worm from the previous month.
Help Santa and Rudolph through a snowy level deliver to the presents to the houses.
Oh no! Rudolph has eaten the labels from three children’s presents. Can you help Santa deliver the presents to the right children?
The children are aged 12, 14 and 15.
Gilly isn’t the youngest and she doesn’t live in Greene Road
The child who received the telescope lives on Birch Grove and is younger than William.
Timothy didn’t receive a bicycle.
The oldest child received a remote-controlled car but doesn’t live on Freeman Avenue.
Anna Len - Automation Development Tester
"Nowadays digital shopping is very popular and in the near future it could possibly dominate the market. I am just happy that I can be part of it."
Anna, an Automation Development Tester, joined the Ocado Technology team from one of Ocado's Customer Fulfilment Centres. "I've received an incredible opportunity to move to the Technology department. This was a great occasion for me to develop my passion as I am fascinated by the large amount of automation within the warehouse. I really enjoy what I am doing as I work with the robots. I get to test them every day to make sure they work perfectly when they are being used. Which helps me be able to learn something new everyday, meet new people from other parts of the world, and be a part of the great team which makes a difference in the technology and future."
Welcome to the Code for Life Easter newsletter.
This month we have a special AI focus, including our colleague's thoughts on ChatGPT. Have you experimented with it yet, are you worried about its capability, or are you celebrating the success of OpenAI?
But lots of teachers and parents are worried about students using it to churn out homework! One camp says this is fine - ChatGPT can be used as a shortcut to produce a solid first draft that a student needs to learn to refine and review. They compare its impact on writing to how using a calculator has made mathematics much easier and quicker.
Others are concerned about cheating and poor quality learning. They point to the fact that ChatGPT’s output isn’t always accurate, and that students won’t learn how to formulate their own, original work.
What do you and your students think about using ChatGPT?
In the US, the New York City education department has even banned ChatGPT on school devices!
The paragraphs below describe types of machine learning.
Question 1: Can you decide which type of machine learning might be suitable for these applications?
Beat this human player at this game
Spam email detection
Image recognition
Recommendation engines
Question 2: How is it possible for a machine trained with millions of correct examples to produce the wrong answer?
Artificial intelligence, or AI, is becoming a key part of how Ocado works: from computer vision systems which allow robots to pick a wide variety of items, to recommendation engines which identify the most relevant products for each customer. It’s critical that we develop and deploy these technologies responsibly.
It’s really motivating to work on such a cutting edge issue. One of my key tasks has been to bring 40+ colleagues together to figure out what responsible AI means to our business - it’s been fascinating to hear their perspectives. And I’m really proud that we got sign-off to publish the commitments we came up with in Ocado’s 2022 Annual Report (see: Ethics of AI and Robotics).
"My role is thinking through how Ocado can use AI and robotic AI technologies in a safe and trustworthy way."
I’m not a technical specialist. My degree was in European Studies, French and German. Prior to joining Ocado, I worked for Foreign Office and the BBC. My career journey has been translating my experience in policy, strategy and human rights to a technology context. So I’m proof that all kinds of people can transition into a career in AI!
"Volunteering for Code for Life allowed me to gain professional experience before graduating. The brief was exciting and helped me to explore a unique user journey from the gamer’s experience. .."
"...Liaising with Laura from the Code for Life team was very smooth and friendly. I can't wait for user testing to see how people react to proposed screens to allow me to improve and iterate my work"
We recently had the pleasure of working with Marie Barsoum who is currently studying UX at the University of Arts London. Marie contacted us in the hope she could volunteer to gain some industry experience and work on a live product. We were delighted to be able to get her onto one of our tasks and support her with the work. Now it's up to you, our teachers, to take it to the next stage.
It's National Coding Week 🎉
"It struck me that whilst there was government investment in a new computer science curriculum for school children, there wasn’t enough being done to support adults."
Richard Watkins - Data Scientist
Richard is a Data Scientist working in Supply Chain at Ocado Technology. His team design forecasting algorithms – helping retailers offer their customers good levels of product availability, while minimising waste. As customers can add items to their orders until just a few hours before delivery, and fresh items can have a very short shelf life, this is a huge challenge.
"It's nice to be able to see your algorithms reducing food waste."
Have a look at the code below. Why does it create an infinite loop?
Answer: The loop is controlled by the value of number but number is never changed.
Therefore which is the correct solution from the examples below?
a) No, number is not being increased. You must assign number + 1 back to number
b) No, number is not being increased. You must assign number + 1 back to number. You can’t do this in a print statement
c) This is correct. 1 is being added to number and that value is being stored back in number
d) Here, the increment to number is not inside the loop. It must be indented to line up with the print()
Code for Life Newsletter
Personal computers are a relatively new invention, believe it or not! The very first one was the Altair 8800 which was released in 1975. These early personal computers weren’t very easy to use though and were only really used by electronic hobbyists. The Altair 8800 came as a build-it-yourself kit which involved soldering!
There was no keyboard, mouse or screen with the Altair 8800! You used switches to enter your program in binary and there were lights on the front for your output.
The ZX Spectrum was programmed using BASIC. It was really easy to learn and I’m sure you can work out what this program does?
The program should only output “Blast off!” once…
Radhika Gudipati - Research Coordinator (Robotics & AI)
My role as a Research Coordinator is to interact with various technology teams within Ocado, understand their current challenges (e.g., what is the best route for an Ocado van to deliver the shopping to a customer) and collaborate with the research teams at Universities to develop a solution.
My biggest challenge is to find a solution and at the same time not give away the secret sauce to the competitors. I enjoy working with roboticists at different organisations. My PhD in robotics and my passion in taking the research to solve real world challenges brought me into this role.
"My first exposure to a computer was in my Yr 8 where a class of 50 students had to share 10 computers in a small room (air conditioned lab was the highlight for the hot tropical weather)."
COBOL was the language we were taught in the classroom and we were asked to handwrite the code in our homework books. As I typed the code in, executed it and saw the special characters printed in shapes appearing on the screen - it made my day! 🙂
Renaming v to my_van
We have updated the variable in Rapid Router so that it makes more sense to the students. It should make your Python lessons easier to follow.
Bett Show 2022
Did any of you come and meet us at the Bett show this year? If so, let us know what you think of our resources so far by feeding back to us through the link below.
Gitbook Resources
It has been some time now since we moved our resources to Gitbook in order to improve your experience.
Scoreboard and tracking progress
You told us that you needed more and we have responded. The new scoreboard allows you to select and focus on particular areas of Rapid Router and highlights areas which may need improvement. We will be updating the scoreboard further still to give you more flexibility and feedback on how your students are doing.
Our newsletters are packed with career stories, events, puzzles and more. You can see .
We have released our Impact Report and it is packed with lots of activities from the year. We are proud of our achievements. In 2023–2024, over 220,000 active users across 187 countries engaged with our interactive tools. You can have a read .
You may have picked up a career poster at Bett from us. If you found it useful, you can find more here and . We also have videos and profiles to show your students.
If you are looking for Industry experience, partnerships or more, take a look at all the other activities we do and how you can get involved.
We have been working on for Python Den and would like would like to get your feedback on how useful they would be.
Please .
We have released our Impact Report and it is packed with lots of activities from the year. We are proud of our achievements. In 2023–2024, over 220,000 active users across 187 countries engaged with our interactive tools. You can have a read .
What a show! We had an amazing time at the Bett Show this year, probably our busiest yet! Educators from all over the world were excited to see how our games and progress tracking worked, along with the teacher dashboard and level control. Let us know if you went to Bett and why .
For workshop enquiries, please contact
It was known as (shown in video below) because of the stuttering way it moved around, but what was most distinguishing about this robot, created by a group of engineers at the Stanford Research Institute, was that it included pioneering artificial intelligence. If you gave Shakey a goal — such as navigating its way across a room or pushing a box along the floor — it could accomplish it by observing the world around it, creating a plan, and executing. With sensors that included a TV camera, a range finder and touch-sensitive metal whiskers, Shakey would gather data that enabled it to build a model of its environment and then use a “planning” program to generate its next moves. This idea of a separate “planning” layer was such a crucial innovation that it is still central to many robotic systems today. - Source:
if you would like us to help run a robotics workshop at your school.
Now we are all on another adventure with . I have always been better at starting than finishing, and it is my very good fortune to have spent most of my career in an organisation that starts so much!
Let us know what you think of our newsletter by and sharing your thoughts and ideas.
You can find out about our privacy notice
As Code for Life turns 10 years old, we are thrilled to share the incredible achievements of our not-for-profit initiative in our first .
We have some exciting releases planned for the year ahead, including our new Python sessions. This is a brand new resource hub that combines Rapid Router with the use of Raspberry Pi's code editor in order to build on the student's learning. If you want early access to the Beta version, .
We are bringing Ocado's technology to the classroom through our AI Collaboration with . There will be lessons and videos. Keep an eye out for updates!
Let us know what you think of our newsletter by and sharing your thoughts and ideas.
!
Have you taken a look at yet? It's got some great challenges, and is supported by videos and plans should any support teacher have to take over a lesson last minute! !
Sustainability is at the heart of what we do, aligning with to responsible resourcing. We have access to a pool of over 2,000 technologists, including experts in robotics, AI, and ethics. With their input, we’re not just teaching coding—we’re connecting classrooms to the future of technology. Together, we’re making computing education secure, exciting, and ready to take on tomorrow’s challenges.
According to Ferranti’s marketing supremo, Vivian Bowden, it was "the most expensive and most elaborate method of playing a tune that has ever been devised". Bowden may have kicked himself for predicting, at this seminal moment, that computer-generated music had no future."
Can you help Santa get the blocks in the correct order so he can deliver to the houses on time?
Last newsletter we showed you that we released a new section based on While Loops. Have you had a try yet? and let us know your feedback.
, and CS in Schools also offers free teacher support and teacher Professional Development.
Let us know what you think of our newsletter by and sharing your thoughts and ideas.
91% of unsatisfied customers don’t complain about their bad experience— they simply leave without giving feedback.
Check out our
Our under the spotlight section focusses on one of our volunteers, Ligia. She has been working on various tasks for us alongside her day job at Ocado, meaning that we are making progress in several areas. One of the tasks she has been looking at is working on some new graphics to have a more eco friendly Rapid Router skin, meaning students can using these elements. We will be adding these shortly in our level editor. Let us know what you think when they arrive!
, Wednesday 3rd July at Bromsgrove School.
, Saturday, 13 July at Ada, the National College for Digital Skills
Let us know what you think of our newsletter by and sharing your thoughts and ideas.
You can find out about our privacy policy
Alicia Chong Rodriguez,
Image:
We have also introduced pigeons to our city scenes! This is thanks to our work experience student that came to us at the beginning of the summer. Énora worked on several new elements for Rapid Router scenes.
Code for Life attended the first Craig n' Dave event up at Bramsgrove School and enjoyed a day of conversation and talks. It was great to meet everyone and we hope we gained a few more schools.
We had a great time at the CAS conference in July where we had a stand, and delivered two workshops for primary and secondary teachers. Lots of great conversations and questions.
We completed the UK leg of the world tour with a fantastic reception from the year 3's at Howe Dell primary school in Hatfield. They were amazed at all the technology and automation behind sorting and packing deliveries for their homes, and got stuck into design and coding exercises with the team.
After selecting 13 students, we spent the afternoon helping everyone get set up and ready to contribute to our initiative as external contributors. Fuelled with pizza and enthusiasm, we managed to get most set up and have had contributions to our code that have made it into production already! Interested in becoming a contributor?
Learning new digital skills is important because it allows us to create tools that help people in their daily lives. With better digital tools, we can make online shopping faster, help doctors keep track of patients, or even help scientists discover new medicines. By improving technology, we make life easier and solve big problems in our world.
Let us know what you think of our newsletter by and sharing your thoughts and ideas.
Murati joined OpenAI in 2018, later becoming its chief technology officer, where she leads the company's work on ChatGPT, Dall-E, and Codex. Her responsibilities include oversight of the company's research, product and safety teams. She is an advocate for the regulation of AI. Source:
It's that time of year again, where we dust off our winter coats and huddle down for some festive family time. This year we have introduced some new features, have you seen them? and see what has changed. We have also turned the snow on again, so get coding!
What a lot of worms! 🪱 You can read how to improve some of your own security measures on our here. .
A computer worm duplicates itself to spread to uninfected computers. It often does this by exploiting parts of an operating system that are automatic and invisible to the user.
Test your powers of logic with this puzzle. Read the clues very carefully and then try to work out which child received which present by a process of elimination. Draw a table to help you work it out. You can find more puzzles on our Code for Life pages.
Santa has dropped some of his presents. Can you help him find his way? You can generate your own mazes .
Let us know what you think of our newsletter by and sharing your thoughts and ideas.
Ever since a company called OpenAI released a website called , there’s been debate on how it will affect how we use it for work, study, and even for coding.
Essentially, it’s a powerful AI model trained on millions of examples from around the internet, which can come up with new content on the basis of a user prompt (question). It can be used to answer questions, compose poems, draft essays and yes, write code. The range and quality of its output is pretty impressive. There’s to ChatGPT from the BBC.
Dale Lane from IBM has created some free teaching resources with worksheets to allow you to try this for yourself. Have a look here:
Marie has put some visuals together tackling a gap in our level creation zone. Please take a look at the visuals here and let us know your .
Let us know what you think of our newsletter by and sharing your thoughts and ideas.
was started in 2013 by Richard Rolfe, an inspiring former head teacher who wanted to help adults learn digital skills. This month, we celebrate his initiative with the hashtag #nationalcodingweek on our social channels. You will find our updates that is related to coding, and use Code For Life to introduce coding skills to drivers and warehouse operatives at Ocado Group.
“It struck me that whilst there was government investment in a new computer science curriculum for school children, there wasn’t enough being done to support adults… there wasn’t enough being done to support teacher training especially for non-specialists. Parents and governors needed training too… most people aren’t in education so I wondered what was being done to support and retrain those who had missed out on digital skills training or for older people who wanted to switch careers or become more cybersecure.”
Python is used in the whole data pipeline of the . .
Test your skills with one of our .
Code for Life has been delivering support to teachers, parents and students around the world since 2014. This month we are releasing our first coding club packs. We have two different packs; the first is based on and suitable for younger students, and our is ideal for introducing teenagers and adults to the principles of the Python language.
We want anyone to be able to set up a club and start delivering the courses. There are guides and resources for you to follow alongside a set of editable slides. how you get on with them and if you have any suggestions to improve them.
If you want to feedback on our resources or any of our updates, you can do so through this .
Supervised Learning
Classifications are known in advance; the machine is trained on labelled known data.
Goal: predict the label for a new piece of data.
Unsupervised Learning
The classifications are not known in advance.
Goal: Determine the pattern or groupings and identify which group a new piece of data belongs to.
Reinforcement Learning
The model tries to maximise the reward and learns from experience.
Goal example: learn over time how to reduce the power consumption of industrial robots.
How we promote code from development to production
Documentation coming soon
How our back end is developed, tested and run
Documentation coming soon
Earlier this year we got together with CS in Schools, a charity in Australia with a similar mission to us, to talk about how we can align Rapid Router to the Australian curriculum. We are excited to announce some new teaching material we will be testing this quarter in the UK and Australia. 🎉
Kirsty has set a challenge for you on Rapid Router. It's not as easy as it seems. Can you get full points?
"I hope to continue to inspire and encourage women and allies to get involved in the technology industry."
In 1982, the Sinclair ZX Spectrum was released. This was a huge step forward and was much more accessible to home users. Many adults today had ZX Spectrum as their first computer and have built their love of programming and computers since then.
This computer plugged into your TV. It had a tape drive for saving your programs, a little printer and you could even get a joystick for playing games.
It's summer time!
No doubt, you will be looking forward to some sunshine and relaxing after school ends for the year. In this newsletter we look at the relationship between holidays and programming - the entire journey from picking your holiday to landing at your destination is filled with computers and coding!
The holiday journey starts with a booking website full of algorithms that suggest your perfect getaway, and compare flights and hotels with your search criteria. Once you are at the airport, all sorts of computing is completed to get you onto a plane, which in turn is guided by air traffic control to guide your plane through the airspace to your destination. Imagine all of the calculations!
For some advanced computing in flight calculations, we celebrate Melba Mouton and her work at NASA’s flight centre. Read more about her below.
Mouton worked at NASA’s Goddard Space Flight Centre, coding computer programs to calculate the trajectories and locations of various aircraft.
She also led the group of "human computers," who tracked the Echo satellites. Mouton and her team's computations helped produce the orbital element timetables by which millions could view the satellite from Earth as it passed overhead.
Just as computers have affected virtually every aspect of modern life, from medicine to sports to education, they have also had a major impact on aviation. Computers are now used in all parts of aviation. They are used to design airplanes, to control them in flight, and to ensure that they reach their destinations safely and (more or less) on time.
The ultimate application of computers may be to take over control of flying completely. Already planes can be flown over long distances, with multiple course changes, entirely by computer. They can also take off and land automatically (although current flight rules prohibit this). It is not a far step to completely automatic operation.
Maybe you can write a program to help…
Can you write a program using Python that asks what animal you’d like to see on your holidays and then outputs one of the counties where you can see that animal in the wild?
E.g.
Solutions to the exercise are here.
I’m a Software Engineer at Ocado, and I work on the systems that run our customer fulfilment centres.
Building software requires planning, organisation, and communication. Just like air traffic controllers managing multiple aircraft, software engineers juggle many complex tasks at once as we design, build, and debug systems.
At Ocado we face the very busy traffic management, based on air traffic control and path planning in real-time. Our robots travel at 15kph along tracks over 7 metres from the ground, and pass one another just 5 millimetres apart. Safety is our number one priority, and we work carefully to keep our complex network of moving machines running smoothly.
What I enjoy most is working as part of a team; it allows me to design things that are much bigger than I could build on my own, and see them come to life - together we can turn big ideas into working systems. It’s an incredibly rewarding feeling.
These books are being created from drawings made in our robotics workshops. The children have come up with some fantastic ideas that we wanted everyone to see.
Have you ever wondered what your rock star name would be? If you became a really famous musician, you might want a really cool name. I can help you. You can go to my website and type in your full name, date of birth, the name of your first pet, your favourite colour and your postcode and I will suggest the best name ever!
Are you happy to do that? We do hope not… What might we do with all that personal information about you? Write down some ideas.
So how do we keep safe online? What scams might we come across and how will we spot them?
The trick you might have fallen for is called social engineering. It is when criminals use psychological tricks to fool you into giving away personal data. It might include free giveaways, quizzes or password generators.
Shoulder surfing is when someone watches you as you enter private information like a password or a pin.
Phishing is when you get fake emails that pretend to come from reputable companies or government organisations. Often they ask you to log in and then steal your login details.
So, what should you look out for if you get an unexpected email?
Unexpected email with a request for information
Message content contains spelling or grammatical errors
Suspicious hyperlinks in email
Text that is hyperlinked to a web address that contains spelling errors and/or lots of random numbers and letters
Text that is hyperlinked to a domain name that you don't recognise and/or isn't connected to the email sender. You can check this by hovering over the link with your mouse cursor.
Emails that don't address you by name or contain any personal information that you would expect the sender to know
For example, what do you notice that is suspicious about this email?
Dear valued customer,
Yours faithfully,
Customer Services
ABC Bank Ltd.
Did you notice that they didn’t use your name? Surely if you have an account with this bank, they know your name? Also, there are spelling and grammatical errors and they ask you to log in STRAIGHTAWAY. Doesn’t that link look odd? It doesn’t even belong to ABC Bank Ltd.
Most of us have lots of different online accounts and it is really tricky to keep track of all our passwords. Which of these things do you think you should or shouldn’t do to keep your details safe?
a) Use the same password for everything. It is much safer than writing lots of different passwords down
b) Replace letters with numbers, e.g pa55w0rd
c) Use your pet name or parts of your birthday, e.g. Toby1990
d) Use a long random password that only you will know and then use it for everything, e.g. S(3kskjhG72639#13e4ks
e) Just use the special secure password for important things like your bank
I hope you said, “None of those! They are all really bad!”
So, what can you do to help you remember all the passwords you need?
Commonly used passwords
The longer your password, the better. This is because of a technique hackers use called brute-forcing. This is when someone tries lots of random combinations to find a password. For example, assuming a password is 5 characters long and contains only lowercase letters, I could try inputting aaaaa, and then aaaab, and then aaaac... and so on until I get to zzzzz.
Manually, this would of course take an extremely long time, but hackers can use software to try many combinations in a short amount of time. Making your password at least 10 characters long, and including numbers and special characters increases the number of possible combinations, which means it'll be a lot harder for the program to go through all the combinations... without being detected by the website as a robot.
In fact, most websites now have a protection against automated brute-forcing by only allowing a certain amount of requests in a given amount of time. At the end of the day however, the main protection comes from the complexity of your password itself!
Code for Life Newsletter
Code for Life is excited to announce we will be at the Bett show again this year. Come and have a chat about our products and meet the team at stand NH71 from March 23rd–25th. We would love to say hello. To help celebrate tech in education, this newsletter is all about digital literacy.
Computer scientists Vinton Cerf and Bob Kahn are credited with inventing the Internet communication protocols that we use today and the system referred to as the Internet. Though other protocols were developed and used before Cerf and Kahn's TCP/IP, such as the file transfer protocol (FTP) and network control protocol (NCP), the Internet as we know it today is built on their basis of a “network of networks.” Source: Source: https://www.britannica.com
Did you know?75% of organisations around the world have experienced some kind of phishing attack and a cyberattack is attempted every 39 seconds! This is even more reason to be careful when you open your emails. source: graphic.ai
Can you debug these pieces of code below? Take a look and see if you can spot the mistakes we have made.
Exercise 1
Exercise 2
Solutions
Dioni Zhong
Dioni is a Senior Software Engineer in our very own Code for Life team! She has been helping us improve our products and keep everything running smoothly. Read more about what she gets up to every day below.
"I love problem solving and building things. I’m passionate about education. I feel a great sense of pride and joy knowing that I play a part in building something that helps students and teachers worldwide."
I work in Code for Life team at Ocado to develop the website and the Rapid Router and Kurono games. In a small team, we have to do a variety of things. Apart from coding, I also work with data, charts, and documentation. I love problem-solving and building things. I’m passionate about education. I feel a great sense of pride and joy knowing that I play a part in building something that helps students and teachers worldwide.
Code for Life Newsletter
It's that time of year again when we switch on the snow in our Rapid Router game and ask Rudolph to help with our deliveries!
Thomas' magical Christmas invention is a stocking with a light signalling the arrival of Santa Claus. The stocking features a light and power source, as well as a switch to connect the light to the power (and therefore light up). A chord or ribbon needs to be pulled for the light to light up. This, of course, is a job for Santa ;)
So, anyone with a stocking invented by Thomas Cane will know if you’ve been good when you wake up on Christmas day and the stocking is lit and there are presents around your tree!
Check out Rapid Router - it's started to snow! Can you help Rudolph and Santa get those deliveries done in time this year?
You have a grid of squares, which must be either filled in black or marked with X. Beside each row of the grid are listed the lengths of the runs of black squares together on that row. Above each column are listed the lengths of the runs of black squares in that column. Your aim is to find all black squares.
Anthony works as a roster analyst in the department responsible for Business Analysis. His role is extremely important in helping Ocado Group get groceries out to its customers. His job is to prepare the 13-week rosters in advance before they are sent out to drivers letting them know when they are working. Having been a driver last year, this year Anthony wanted to help by making such a busy period as easy as possible.
"I'm spending this Christmas trying to give the drivers the present of a roster that fits in with their lifestyle."
Just like our Rapid Router challenges, it is all about efficiency and saving energy wherever possible at Ocado Group, so making sure the drivers know their roster ahead of time means that the full service can be much smoother.
Our Code for Life teaching consultant has been busy at her school this year, and when she showed us this, we had to put it in the newsletter to show you! If you look closely, you can spot all the different computer elements.
Why don't you have a go yourself?
Have you ever wondered how a computer actually works? Have you ever looked inside your computer and wondered what all those parts are? We hope this worksheet will help to answer those questions for you.
A computer is an electronic device that takes input from the outside world, processes it according to a set of instructions, stores some data and produces output. This is true if you are doing your homework: typing your answers (input), formatting and arranging it on a page (processing), storing it on your computer (storage) and showing it on the screen or printing it out (output). It’s also true if you are using your computer to play a game. You give input to the computer with your keyboard, mouse or controller, the computer responds to your input by moving your character around and checking if you have collided with something, for example. It stores your current position and score and the output is the graphics on the screen and sound.
An input device is one that allows you to send data to the computer. An output device is one that the computer sends data to. Can you categorise these devices into input or output devices?
Keyboard
Printer
Screen
Mouse
Microphone
Speakers
Scanner
Projector
Barcode reader
Computers use electric circuits and switches to represent all data and instructions. These switches allow electricity to be on or off in a circuit. We combine lots of circuits and switches to represent data and instructions.
Switches in this state could represent the number 174, the character ® or this colour:
How is this possible and why would we do this?
Computers use electric wires and circuits to carry all information and the electricity in those wires is either on or off. With one wire, you can represent: yes or no; true or false; 1 or 0. We can create codes for colours, text characters and sound and represent them with numbers.
We can then convert these numbers into something called binary. Binary is a counting system that uses two different characters: 0 and 1.
Decimal
Think about the numbers you use every day. You are, of course, happy that with a number like 9999 those 9s have different values because they are in different places in the number. The one on the left is worth 9000 because it is in the 1000s column.
This number system is called decimal or base ten. We have ten digits: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9. The place values are multiplied by ten as you move from right to left.
Binary
Computers use binary to represent all data. Binary is also called base 2. This follows the same system but multiplies by 2 instead of 10. Can you guess how many digits there are in binary? What about the place values, can you fill them in?
If you have got this right, you will have represented the decimal number 15 in binary. Can you see why?
Input and output devices
Keyboard - input device
Printer - output device
Screen - output device (unless it's a touch screen, then it's both input and output)
Mouse - input device
Microphone - input device
Speakers - output device
Scanner - input device
Projector - output device
Barcode reader - input device
Binary place values
We often use binary numbers in groups of 8 bits called a byte. Can you fill in the rest of these place values?
2. Convert this binary number to decimal: 00101001
3. Convert the binary number 00001001 to decimal
4. Convert the binary number 10001000 to decimal
5. Convert the decimal number 7 to binary
6. Convert the decimal number 100 to binary
7. How many different values can you store in two binary digits?
How many kinds of robots do you know?
Did you know that the word "robot" was first used in a play in the 1920s? That is right! The word "robot" was introduced by the work of the Czech writer Karel Capek, entitled R. U. R. (Rossumovi Univerzalni Roboti), which means Universal Robots of Rossum, in English, written in 1920. The word comes from the Czech word Roboti, meaning "hard work". In the play, the robots are machines that look like humans, and invented by them.
A robot is a mechanism that is basically formed by joints and links. The joints have motors and they are programmable so they can move within its environment to perform the desired tasks.
How many joints does the following robot have?
Manipulators, as the name suggests, are robots able to manipulate objects; they can move an object in the environment to another position. The most common examples are industrial robots, and they look like arms, as the examples below.
We can also attach a tool to the robotic arm to help with the manipulation. This tool will act like our hand, but not necessarily need to have the format of a hand, or have fingers.
Manipulator robots can have one arm or more. The ones that have two arms are called bi-manual manipulators. In this case, the world "bi" refers to "two".
The mobile robots are able to move, some have wheels and some have legs.
In the examples below, on the left we have a robot with legs that moves like an insect. On the right, we have a robot with wheels, similar to the vacuum cleaner robots that you might have seen.
The mobile manipulators have the characteristics of a manipulator robot as well as the characteristics of a mobile robot. A robot with wheels and an arm, for instance, is a mobile manipulator.
UAVs is an acronym for “unmanned aerial vehicles”, meaning they are robots that can fly with no pilot on board.
Have you ever seen people taking photos or filming with drones? Drones are examples of an UAV.
Humanoid robots are robots that look like a human. In general, we call humanoids the robots with two legs, two arms, a torso and a head. How cool are they?
What type of robot is the one below?
What type of robot is the one below?
You can squish a sponge and change its shape, but you cannot do this with a chair made of wood, right? In this case, the chair is considered a 'rigid body', and the sponge is a 'deformable' object.
If you pick up a chair by its back and move it, the whole chair moves, not only its back. Why is that? This happens because the chair is a rigid body.
Since rigid bodies are not 'deformable', when you move a part of this object, the whole object (body) moves in the same way. A robot with a rigid body is easier to program because we know the overall shape won't change, whereas if it was squidgy, it is much harder to program how to move it.
Can you tell what object is a rigid body from the list below?
A bottle made of glass.
A pen.
A bag of chips.
A table.
A marble (toy).
Play dough.
(2004) Human-Robot Interaction. In W. S. Bainbridge (Ed.), Berkshire Encyclopedia of Human-computer Interaction. Berkshire Publishing Group.
Download and print posters for your classrooms to inspire your students. Help them to learn about all of the different careers available to them in technology.
Download and print posters for your classrooms to inspire your students. Help them to learn about all of the different careers available to them in technology.
The Code for Life Team Lead asked other women at OcadoTechnology to help inspire the students at St Albans Girls School. It was a fantastic experience.
The Code for Life Team Lead, alongside other colleagues at OcadoTechnology delivered a talk to In2Science alumni on applying for jobs, interviews and writing CVs! Check out the video below.
This is where we store information on all sorts of jobs we do in technology here at Ocado Group and Code for Life. You can find poster versions of these in this section too.
I'm a Senior Product Designer at Ocado Technology. My job is to make the website where you can buy groceries online look awesome and easy to use. I've loved drawing and making things look cool since I was really young. I always wondered how the things we use every day are made and how they make us feel. So, I decided to learn how to make them better!
"I feel really lucky to be able to help make the world a better-looking and easier-to-use place for everyone."
Making websites and apps is like a mix of being super creative, understanding how people think, and knowing how technology works. I kept learning and practising, and now I get to do it as a job! It's not just a job for me, though. Making things look great and work well is like my whole way of life! I feel really lucky to be able to help make the world a better-looking and easier-to-use place for everyone. It's pretty cool to think that something I design can help lots of people buy their groceries with just a few clicks!
I live in North London with my family and a labradoodle named Zuko. My first summer job was selling ice cream on a beach in Norfolk. I did it for six years in a row and loved it, despite working long hours as a 13-year-old. One summer, I worked on a local fairground which was seriously tough but a good reference point for hard days in the office.
"Early Ocado was like a rollercoaster whose bolts hadn’t been tightened. If you get the chance to work in a start-up you should do it. The task seemed enormous, but so was the drive and determination."
I studied Physics at UCL before joining the IT department at John Lewis Partnership. They trained me in software development, let me build a procurement team and improve their network infrastructure. I also created their first e-commerce website.
I then moved on to work for Ocado, where I ran the Technology team for ten years. Early Ocado was like a rollercoaster whose bolts hadn’t been tightened. If you get the chance to work in a start-up you should do it. The task seemed enormous, but so was the drive and determination. I have been responsible for Logistics, building new CFCs, creating our own ASRS, and installing it around the world.
Have you ever clicked on a button expecting it to do one thing but it does another? My role in UX (User Experience) is to capture instances like this, and feed them back to my team so they can make better choices in the design of websites. I do this by running interviews, sending out surveys, and testing prototypes directly with the people who will use the website. My job means I get to learn from new perspectives and ask lots of questions. I find it really exciting knowing that data I collect impacts product decisions and improves what we offer to customers.
"Understanding your user is especially important in a technology company. It takes a lot of time and effort for software engineers to write code for a new feature, programme, or product. So, it's critical to make sure that what is developed is needed and understood by users."
I had a tough time choosing what I wanted to do at university; for my A levels I did Chemistry and Maths, Theatre Studies and English Literature! I then came across Anthropology - a social science where you can study people and their cultures. Anthropology combined my passion for learning about people and reading with my skills for research and analysis. When it came to my career I did not think I would be able to use my degree every day, but now I'm a User Experience Researcher!
"My four years here have been a whirlwind - like all tech organisations, no day is ever the same. My role is responsible for Ocado’s employees- basically ensuring this is an amazing place to work regardless of your background.
The best thing about my job is when I see people grow and develop - here you can do this through your role, through professional courses and by volunteering internally. One great example of this is through Code for Life which benefits the skills and wellbeing of our volunteers, and inspires people to a future career in tech. This combination of learning, wellbeing, diversity and inspiring young people is one of the best ways Ocado builds a stronger organisation for the future."
"The best thing about my job is when I see people grow and develop... One great example of this is through Code for Life which benefits the skills and wellbeing of our volunteers, and inspires people to a future career in tech."
"Prior to Ocado I held senior HR roles with Expedia (online travel) and Premier Farnell (B2B distributor) and before that I worked at a start-up - all were great places where I learned loads. I was lucky enough to live in Chicago for five years which was a fantastic work and life experience. Chicago definitely gave me the travel bug and I love to take trips for holidays or work."
I am a Business Support Specialist in North America for Ocado. I work as a key player to support the operation of the site. As a woman without a technical background, I’ve had to learn and understand a basic level of technical operations by submerging myself in technology. I work on projects called BOT School, Peripheral school, and Safety Training. These activities are aimed at providing the necessary assistance to ensure smooth site operations and support for my team.
"I hope to continue to inspire and encourage women and allies to get involved in the technology industry."
Gaining a foundational understanding of equipment, diverse software systems and achieving expertise in Google Suite has empowered me to constantly advocate for my team members. Furthermore, I can foster a sense of inclusion among my team onsite, which is essential for creating an environment conducive to attracting and retaining top talents.
What I enjoy most about my role is that it has pushed me to become innovative and think outside of the box to become a stronger professional, but the best part of my role is the ability to form a professional relationship with each of my team members onsite and getting to know them individually. I hope to continue to inspire and encourage women and allies to get involved in the technology industry.
I’m a Software Engineer at Ocado, and I work on the systems that run our customer fulfilment centres.
Building software requires planning, organisation, and communication. Just like air traffic controllers managing multiple aircraft, software engineers juggle many complex tasks at once as we design, build, and debug systems.
At Ocado we face the very busy traffic management, based on air traffic control and path planning in real-time. Our robots travel at 15kph along tracks over 7 metres from the ground, and pass one another just 5 millimetres apart. Safety is our number one priority, and we work carefully to keep our complex network of moving machines running smoothly.
"At Ocado we face very busy traffic management, based on air traffic control and path planning in real-time."
What I enjoy most is working as part of a team; it allows me to design things that are much bigger than I could build on my own, and see them come to life - together we can turn big ideas into working systems. It’s an incredibly rewarding feeling.
Artificial intelligence, or AI, is becoming a key part of how Ocado works: from computer vision systems which allow robots to pick a wide variety of items, to recommendation engines which identify the most relevant products for each customer. It’s critical that we develop and deploy these technologies responsibly.
It’s really motivating to work on such a cutting edge issue. One of my key tasks has been to bring 40+ colleagues together to figure out what responsible AI means to our business - it’s been fascinating to hear their perspectives. And I’m really proud that we got sign-off to publish the commitments we came up with in Ocado’s 2022 Annual Report (see: Ethics of AI and Robotics).
"My role is thinking through how Ocado can use AI and robotic AI technologies in a safe and trustworthy way."
I’m not a technical specialist. My degree was in European Studies, French and German. Prior to joining Ocado, I worked for Foreign Office and the BBC. My career journey has been translating my experience in policy, strategy and human rights to a technology context. So I’m proof that all kinds of people can transition into a career in AI!
Anna Len - Automation Development Tester
"Nowadays digital shopping is very popular and in the near future it could possibly dominate the market. I am just happy that I can be part of it."
Anna, an Automation Development Tester, joined the Ocado Technology team from one of Ocado's Customer Fulfilment Centres. "I've received an incredible opportunity to move to the Technology department. This was a great occasion for me to develop my passion as I am fascinated by the large amount of automation within the warehouse. I really enjoy what I am doing as I work with the robots. I get to test them every day to make sure they work perfectly when they are being used. Which helps me be able to learn something new everyday, meet new people from other parts of the world, and be a part of the great team which makes a difference in the technology and future."
Richard Watkins - Data Scientist
Richard is a Data Scientist working in Supply Chain at Ocado Technology. His team design forecasting algorithms – helping retailers offer their customers good levels of product availability, while minimising waste. As customers can add items to their orders until just a few hours before delivery, and fresh items can have a very short shelf life, this is a huge challenge.
"It's nice to be able to see your algorithms reducing food waste."
Radhika Gudipati - Research Coordinator (Robotics & AI)
My role as a Research Coordinator is to interact with various technology teams within Ocado, understand their current challenges (e.g., what is the best route for an Ocado van to deliver the shopping to a customer) and collaborate with the research teams at Universities to develop a solution.
My biggest challenge is to find a solution and at the same time not give away the secret sauce to the competitors. I enjoy working with roboticists at different organisations. My PhD in robotics and my passion in taking the research to solve real world challenges brought me into this role.
"My first exposure to a computer was in my Yr 8 where a class of 50 students had to share 10 computers in a small room (air conditioned lab was the highlight for the hot tropical weather)."
COBOL was the language we were taught in the classroom and we were asked to handwrite the code in our homework books. As I typed the code in, executed it and saw the special characters printed in shapes appearing on the screen - it made my day! 🙂
Dioni Zhong - Senior software Engineer
Dioni is a Senior Software Engineer in our very own Code for Life team! She has been helping us improve our products and keep everything running smoothly. Read more about what she gets up to every day below.
"I love problem solving and building things. I’m passionate about education. I feel a great sense of pride and joy knowing that I play a part in building something that helps students and teachers worldwide."
I work in Code for Life team at Ocado to develop the website and the Rapid Router and Kurono games. In a small team, we have to do a variety of things. Apart from coding, I also work with data, charts, and documentation. I love problem-solving and building things. I’m passionate about education. I feel a great sense of pride and joy knowing that I play a part in building something that helps students and teachers worldwide.
Anthony works as a roster analyst in the department responsible for Business Analysis. His role is extremely important in helping Ocado Group get groceries out to its customers. His job is to prepare the 13-week rosters in advance before they are sent out to drivers letting them know when they are working. Having been a driver last year, this year Anthony wanted to help by making such a busy period as easy as possible.
"I'm spending this Christmas trying to give the drivers the present of a roster that fits in with their lifestyle."
Just like our Rapid Router challenges, it is all about efficiency and saving energy wherever possible at Ocado Group, so making sure the drivers know their roster ahead of time means that the full service can be much smoother.
Set up your dev environment with dev containers for VS Code.
VS Code's dev containers allow us to setup your dev environment for you so you don't have to worry about doing it yourself. Furthermore, anytime we make a change to our dev environment, we will git-push the latest dev container to the workspace repo. Then, you can just simply git-pull the latest dev container and rebuild it.
Follow the below steps to setup the CFL workspace in a dev container.
Git is required to sync your local code changes with our online Git repos.
Docker Engine is required to build and run dev containers.
Note that Docker Desktop is an app built around Docker Engine that provides a user interface and additional tools. You only need Docker Engine.
If you're using an Ocado-issued laptop, DO NOT install Docker Desktop - it's licensed software requiring a paid subscription.
We recommend running the following commands.
Our dev containers are specifically defined to work within the VS Code IDE.
Open the Extensions tab (Ctrl+Shift+X) in VS Code.
Search for the "Dev Containers" extension and install it.
git clone https://github.com/{username}/codeforlife-workspace.git
If you're using Windows as your OS, then you'll need to change the line endings in your cloned workspace before opening the dev container.
Open a Git Bash terminal in the directory of your cloned workspace.
Configure the workspace to use LF as the EOL control character.
Remove all the files tracked by Git in the workspace.
Re-download the files. They should now have LF endings.
To confirm that the files have LF endings, open any file in the workspace in VS Code and look at the bottom right (in the toolbar). You should see "LF" (not "CRLF").
In VS Code, open the command palette (Ctrl+Shift+P or go to View > Command Palette...
).
Search for the command: ">Dev Containers: Open Workspace in Container..." and select it.
Make sure Docker Engine is running before working with dev containers.
Select the codeforlife.code-workspace file in your local codeforlife-workspace folder.
VS Code will now begin building your dev container. If you wish to see the output of the build as it is happening, click the following prompt in the bottom-right:
At some point, VS Code will reload the window so that it may re-open the code-workspace within the dev container.
If the build fails with an error message similar to:
Run this command before opening/building the dev container.
If you get build errors stating that some images or dependencies failed to install, it could be due to any VPN / DDoS mitigation software you might have running on your machine or network. Try disabling those temporarily to see if it helps.
To help you quickly fork and clone the many repos contained within our workspace, we've created a script that runs automatically when you start the workspace's dev container. You'll be prompted to sign into GitHub in VS Code's terminal window.
Follow the on-screen instructions in the terminal. Once you've successfully authenticated with GitHub, each repo within the workspace should be forked and cloned; the once empty folders should now be populated.
With the workspace folder open in VS Code, open the Source Control tab (Ctrl+Shift+G).
Click "Manage Unsafe Repositories". Then, select the one or more CFL repos shown in the drop-down.
In a new terminal in VS Code, run the following command:
This will install all the dependencies the repo requires for the code to run. Then, activate the virtual environment by running:
Finally, to start working on the project locally, run:
This script will:
run the project's database migrations,
collect the static files,
and start a Django server.
Once the script has finished running, you'll be able to run and view the project locally in your browser by going to localhost:8000
.
Enjoy working on the project!
There are a few different ways you can stop running your VS Code window in a dev container and run it on your local machine instead.
Close the VS Code window and open a new window.
Open a local folder in the existing VS Code window ([Ctrl+K Ctrl+O] or go to File > Open Folder...
).
Reopen the current folder locally by either:
Opening the command palette (Ctrl+Shift+P or go to View > Command Palette...
) and typing ">Dev Containers: Reopen Folder Locally".
Clicking the Dev Container toolbox in the bottom-left of your VS Code window and selecting Reopen Folder Locally
.
Close the connection to the dev container by either:
Opening the command palette (Ctrl+Shift+P or go to View > Command Palette...
) and typing ">Remote: Close Remote Connection".
Clicking the Dev Container toolbox in the bottom-left of your VS Code window and selecting Close Remote Connection
.
"...If we think that the answer of the model is incorrect, we can say, “Are you sure? I think actually…” And then the model has an opportunity to go back and forth with you, similar to how we would converse with another human."
We are looking for teaching and learning Volunteers to feedback on our new to be released soon. We have two lesson plans that you can test for us here. The final sessions will be embedded in Rapid Router.
To get involved, however small, and try the resources before release, .
We have been busy creating new resources to introduce robots into the classroom. With help of the roboticists at Ocado Technology we are launching our . Please let us know your thoughts . We will be adding more resources to this section and would love to know what is useful to you in your classrooms!
Share your experiences with our resources on social media and tag us
Check out some of these games you could play on the website !
The latest application of computers (to airplane technology) is for what is called "." Airplanes will be connected by radio and satellite link to a global information system that will provide them with information on the weather and aircraft in their immediate vicinity, as well as their flight plan.
, Kenya
, India
, Sweden
, Canada
Let us know what you think of our newsletter by and sharing your thoughts and ideas.
We have noticed an unexpected login from your account and are worried that someone might be hoping to steel your informations. Please click this and log in STRAIGHTAWAY so that we can protect you safely.
On top of this, you can familiarise yourself with the most commonly used passwords so you make sure never to use those! They include things like 123456, password, qwerty... and variants of those. You can find the list .
Spring is in the air, the daffodils are flowering and... the is back!
We have introduced a new worksheet around online safety and hardware. and let us know what you think.
Let us know what you think of our newsletter by and sharing your thoughts and ideas.
We thought we would celebrate something related to Christmas and what better way to do that than to learn about ? Read about it below.
You could adapt this idea with your class to use the sound sensor in a micro:bit. Here is a that creates a graph on the LED output to show the sound level. You could make a Christmas tune play if anyone pulls on your Santa detector!
Check out and see for yourself.
Here is a Nonogram. . The rules are simple.
Let us know what you think of our newsletter by and sharing your thoughts and ideas. Is there anything else you'd like us to include?
ISO 8373:2012 (en) Robots and robotic devices - Vocabulary. Available from . Accessed on 8th September 2020.
descomplicandoarobotica. Available from . Accessed on 15 August 2023.
The robot images are from the CoppeliaSim simulator. Available from . Accessed on 21 August 2023.
Now we are all on another adventure with . I have always been better at starting than finishing, and it is my very good fortune to have spent most of my career in an organisation that starts so much!
Let us know what you think of our newsletter by and sharing your thoughts and ideas.
Code for Life (CFL) has set up their development environment within . In short, dev containers are containerised virtual machines that come preinstalled with all the software and tools necessary for you to develop.
Follow Git's and .
to download and install Docker Engine's server and client binaries.
Alternatively, you can install .
Check the to find your Linux distro. If you're using Ubuntu, follow .
.
our (only the main branch) first and then, in a folder of your choosing on your local machine, clone your fork:
and Unix-like OS's (like Linux and macOS) use different end of line (EOL) to Windows. Linux distributions (like Ubuntu) use line feed (LF), which is control character "\n", while Windows uses carriage return and line feed (CRLF), which is control characters "\r\n". .
While the workspace is open in VS Code you'll notice there are a few empty folders. These are the repos contained within the workspace, each of which will also need to be forked and cloned ().
How our front end is developed, tested and run
Documentation coming soon
About our front ends
After creating a repo from the template, run a case-insensitive search across all files for replace-me. Replace these strings with the appropriate value; this will most likely be the service's name.
There are 2 main pipelines in each front end service.
This pipeline is responsible for managing the process of contributing to our code base, such as checking our contributors have signed our contributor agreement, auto-assigning/-unassigning contributors to issues, and more.
About our back ends
After creating a repo from the template, run a case-insensitive search across all files for replace-me. Replace these strings with the appropriate value; this will most likely be the service's name.
There are 2 main pipelines in each back end service.
This pipeline is responsible for managing the process of contributing to our code base, such as checking our contributors have signed our contributor agreement, auto-assigning/-unassigning contributors to issues, and more.
Coding patterns we follow on our front end
For each model defined on the back end, create a file named after the model in the directory api
. At the top of the file, define the model on a global level and export it. Use the Model
type constructor.
In addition, the name of each model will need to be registered as a tag in tagTypes
, at api/index.ts
.
If you'd like to define an object containing a subset of a model's fields, you can use Pick
.
When defining the result (i.e. response body) and arg (i.e. request body) for an endpoint, you must define their types as a pair on a global level below the model's type and export them. The result's type should come first, immediately followed by the arg's type. The result & arg types should follow the naming convention {endpoint_name}Result
and {endpoint_name}Arg
. Each result & arg pair should be separated with one newline.
If no data is included in the result or arg, set either to null
.
Documentation coming soon
Endpoints should be defined below the result & arg pairs. Endpoints should be injected into the base API, imported from api/index.ts
. The subset of API endpoints should follow the naming convention {model_name}Api
and be exported as default. In addition, each hook auto-generated from the endpoints should be unpacked and exported as a constant below the default export.
When defining a retrieve endpoint, it's recommended to use the RetrieveResult
and RetrieveArg
type constructors. The endpoint should follow the naming convention retrieve{model_name}
, be defined as a query
, use the method "GET"
, and name the query's arg as id
. To build the URL, the buildUrl
utility should be called, providing the model's detail URL and id as a URL parameter. The tag should be provided by calling the tagData
utility and providing the model's name as an argument.
When defining a list endpoint, it's recommended to use the ListResult
and ListArg
type constructors. The endpoint should follow the naming convention list{model_name_plural}
, be defined as a query
, use the method "GET"
, and name the query's arg as search
. To build the URL, the buildUrl
utility should be called, providing the model's list URL and the search parameters. The tags should be provided by calling the tagData
utility and providing the model's name as an argument and setting includeListTag
to true.
When defining a create endpoint, it's recommended to use the CreateResult
and CreateArg
type constructors. The endpoint should follow the naming convention create{model_name}
, be defined as a mutation
, use the method "POST"
, and name the query's arg as body
. The URL should be set as the model's list URL. The tags should be invalidated by calling the tagData
utility and providing the model's name as an argument and setting includeListTag
to true.
When defining a update endpoint, it's recommended to use the UpdateResult
and UpdateArg
type constructors. The endpoint should follow the naming convention update{model_name}
, be defined as a mutation
, use the method "PATCH"
, and unpack the query's arg as ({ id, ...body })
. To build the URL, the buildUrl
utility should be called, providing the model's detail URL and id as a URL parameter. The tags should be invalidated by calling the tagData
utility and providing the model's name as an argument and setting includeListTag
to true.
When defining a destroy endpoint, it's recommended to use the DestoryResult
and DestroyArg
type constructors. The endpoint should follow the naming convention destroy{model_name}
, be defined as a mutation
, use the method "DELETE"
, and name the query's arg as id
. To build the URL, the buildUrl
utility should be called, providing the model's detail URL and id as a URL parameter. The tags should be invalidated by calling the tagData
utility and providing the model's name as an argument and setting includeListTag
to true.
Documentation coming soon
Documentation coming soon
Documentation coming soon
Documentation coming soon
Documentation coming soon
Documentation coming soon
Documentation coming soon
Documentation coming soon
Documentation coming soon
Documentation coming soon
Documentation coming soon
Documentation coming soon
Documentation coming soon
Documentation coming soon
Documentation coming soon
Documentation coming soon
Documentation coming soon
How we test our back end
When a PR is submitted, a series of tests will be run with Github actions. It is fine to just submit your PR and let the tests run on Github. However, if the tests fail, you may need to run the tests locally to investigate what's going on, then either fix the tests, or fix your code.
To run Python tests, simply run at the top folder of the repository:
The Python tests in Portal also include some snapshot tests. Running pytest
will also automatically run the snapshot tests. When needed, the snapshot tests can be updated by running pytest --snapshot-update
.
How we test our front end
When a PR is submitted, a series of tests will be run with Github actions. It is fine to just submit your PR and let the tests run on Github. However, if the tests fail, you may need to run the tests locally to investigate what's going on, then either fix the tests, or fix your code.
To run Cypress tests locally, you need two shell windows.
Shell #1
The following will run the portal/game on local server.
Shell #2
This will run the Cypress tests in the terminal.
If you want to view the tests as they run using Cypress' test runner window, you can run:
Selenium is a frontend test framework that is used in Rapid Router and in Portal. We aim to gradually migrate Selenium tests to Cypress.
Similar with Cypress, it will launch a browser windows and you should be able to see a series of frontend actions.
We have built our front ends primarily using , , and .
Each service has a front end code repository in the GitHub organisation which follows the naming convention:
our front end repos on GitHub.
To speed up the process of creating a new front end repo, we created the template repo which can be used to scaffold a new service's front end repo. Read on how to create a repo from a template.
In order to avoid repeating the same pipelines in every front end service, we centrally define the pipelines in our , and reference them in each front end service. In GitHub's terminology, these are referred to as .
The main pipeline for each front end service which simply reuses the pipeline located in the workspace. This pipeline is responsible for testing and deploying a front end service.
You can see an example of this pipeline in the .
You can see an example of this pipeline in the .
To avoid repeating code across 2 or more front ends, we have created the repo which automatically tests and releases new version of the package using . These versioned packages can then be installed into our JavaScript environment (node_modules).
Learn more about our JavaScript package .
We have built our back ends primarily using , , and .
Each service has a back end code repository in the GitHub organisation which follows the naming convention:
our back end repos on GitHub.
To speed up the process of creating a new back end repo, we created the template repo which can be used to scaffold a new service's back end repo. Read on how to create a repo from a template.
In order to avoid repeating the same pipelines in every back end service, we centrally define the pipelines in our , and reference them in each back end service. In GitHub's terminology, these are referred to as .
The main pipeline for each back end service which simply reuses the pipeline located in the workspace. This pipeline is responsible for testing and deploying a back end service.
You can see an example of this pipeline in the .
You can see an example of this pipeline in the
To avoid repeating code across 2 or more back ends, we have created the repo which automatically tests and releases new version of the package using . These versioned packages can then be installed into our Python virtual-environments (.venv).
Learn more about our Python package .
We're using (RTK Query) to define our API endpoints and cache the response data.
If the fields of the result or arg are fields of the model, use the Result
and Arg
type constructors. These function similarly to .
If the result and arg are for a , use the default type helper for the specific action. These function similarly to .
The pytest
command will run both the tests written with and those with the built-in python .
For Rapid Router and Portal, pytest
also runs . Check the section below for what you need to install to run it.
is a frontend test framework that is used on part of Portal.
To run Selenium tests you need to install chromedriver. Please check here on for your OS.
Coding patterns we follow on our back end
Each backend consists of 3 layers that build on top of each other. Starting from the bottom layer, the layers are:
Because [data] models are our bottom layer, it can be said that our backend is model-centric. This means (almost) all our serializers and views and are model-serializers and model-views.
Below are the conventions we follow when modelling our data.
For each model, create a file named after the model in the directory models
.
All models should be imported into models/__init__.py
to support importing multiple models from models
.
Any custom logic defined in a model-file should be tested in the directory models
, where each model has its own test-file following the naming convention {model}_test.py
. Model-tests should inherit ModelTestCase
and set their type parameter to be the model they are testing. The name of the model-test-case should follow the convention Test{model}
.
Determine whether the data stored in a model needs to be warehoused. Data should be warehoused if it can contribute to analyzing users' behavior. By default, new models should be warehoused as it's a rare occurrence that meaningful insights cannot be gained from analyzing its data.
Defining a warehouse-model:
Defining a non-warehouse-model:
When defining fields of any type, always set the verbose name and help text. These arguments aid future developers and super-users on the Django admin to understand the purpose of these fields.
When defining a foreign key between 2 models, a few steps need to be taken to inform our static type checker of backward relationships between objects.
Say we have the following models:
The problem is static type checkers do not know attributes for backward relationships are going to being auto-generated. Therefore, we need to add type hints.
We import the model we are type hinting inside of if t.TYPE_CHECKING
to avoid circular-imports. We also define the name of the backward relationships to be the plural of the model's name to improve readability.
Models' meta class should inherit TypedModelMeta
to support type hinted Meta classes.
If you're defining a model with a custom manager:
If you're defining an abstract model with a custom manager:
A model's manager should be defined within the model's class as Manager
. If the model inherits WarehouseModel
, the manager should inherit WarehouseModel.Manager
, providing a string of the model's name as the type parameter to inform the manager of the type of model it will be managing. Below the manager's definition, create a class-level attribute on the model called objects
which has its type set to Manager
and its value set to an instance of the Manager
class.
If you need to create an abstract model with a custom manager, add a generic type parameter to the manager which is bound to the manager's model. A type variable will need to be defined before the abstract model, following the naming convention Any{model}
. However, to bind the type variable to the model before the model is defined, use a lazy binding by referencing the model's name as a string. Below the abstract model's manager, set the type of objects
to be Manager[t.Self]
so that the manager is managing the type of the inherited model (not the abstract model).
When defining constraints, the naming convention is {field}__{condition}
.
Test your custom constraint in models/{model}_test.py
. Your test name should follow the naming convention test_constraint__{constraint_name}
. The unit test should leverage CFL's assertion helper assert_check_constraint
, which will check the constraint is enforced under the expected conditions.
When defining a model, set its verbose names in its meta attributes.
If there are query-sets that are filtered by a model instance's attributes, create properties on the model's class that return the query-sets. This achieves a shorthand that makes the code base less repetitive and more readable. It's only worth doing this if the query-set is used in 2 or more locations in the code base.
We import Song
outside the top level to avoid circular-imports.
If a model has business logic that impacts its functionality based on custom conditions, add class-level settings on the model in all caps to configure the conditions.
For example, if the Person
model has a property which checks if the person is too young:
This will also help to make tests more robust as values can be dynamically calculated.
Below are the conventions we follow when serializing our data.
To avoid repetitively setting the model being serialized to Person
, a base serializer may be created with the naming convention Base{model}Serializer
.
All serializers should be imported into serializers/__init__.py
to support importing multiple serializers from serializers
.
Any custom logic defined in a model-serializer-file should be tested in the directory serializers
, where each model has its own serializer-test-file following the naming convention {model}_test.py
. Model-serializer-test-cases should inherit CFL's ModelSerializerTestCase
, set the type parameter to be the model being serialized and set model_serializer_class
to the model-serializer being tested. The name of the model-serializer-test-case should follow the convention Test{model}Serializer
.
When defining model-list-serializers, follow the naming convention {model}ListSerializer
. Model-list-serializers should inherit CFL's ModelListSerializer
by default to support bulk-creating and bulk-updating model instances.
When overriding validate(self, attrs)
, always call super().validate(attrs)
first before implementing any additional validations. This is necessary to ensure the data is valid before bulk-creating or bulk-updating.
When overriding update(self, instance, validated_data)
, both instance
and validated_data
are of equal length and sorted in the correct order. Therefore, to get the data per model, use zip
on instance
and validated_data
.
When defining validation errors, always set the code
of the validation error so that it may be asserted in a test. Error codes must always be unique per validation function so that they may be individually asserted in tests.
When testing validation errors, the error_code
that is expected to be raised must be provided. When testing the validations of a field, the test must follow the naming convention test_validate_{field}__{validation_error_code}
and use CFL's assert_validate_field
helper. When testing general validations, the test must follow the naming convention test_validate__{validation_error_code}
and use CFL's assert_validate
helper.
If create(self, validated_data)
was overridden in a model-serializer, a test named test_create
will need to be created and use CFL's assert_create
helper. Likewise, if update(self, instance, validated_data)
was overridden in a model-serializer, a test named test_update
will need to be created and use CFL's assert_update
helper.
If create(self, validated_data)
was overridden in a model-list-serializer, a test named test_create_many
will need to be created and use CFL's assert_create_many
helper. Likewise, if update(self, instance, validated_data)
was overridden in a model-list-serializer, a test named test_update_many
will need to be created and use CFL's assert_update_many
helper.
If to_representation(self, instance)
was overridden in a model-serializer, a test named test_to_representation
will need to be created and use CFL's assert_to_representation
helper.
Below are the conventions we follow when viewing our data.
For each model, we create a file with the naming convention {model}.py
in the directory views
. Within a model's view-file, we create one view-set following the naming convention {model}ViewSet
. Each model-view-set should inherit CFL's ModelViewSet
by default and set the type parameter to the model being viewed.
All views should be imported into views/__init__.py
to support importing multiple views from views
.
Any custom logic defined in a model-view-file should be tested in the directory views
, where each model has its own view-test-file following the naming convention {model}_test.py
. Model-view-set-test-cases should inherit CFL's ModelViewSetTestCase
, set the type parameter to be the model being viewed, set model_view_set_class
to the model-view-set being tested and set basename
to the basename used to register the model-view-set in the urls. The name of the model-view-set-test-case should follow the convention Test{model}ViewSet
.
Each model-view-set needs to be registered in urls.py
using DRF's DefaultRouter
. Each registration needs to set prefix
to be the plural name of the model with kebab-casing, viewset
to be the model-view-set being registered and basename
to be the singular of the singular name of the model with kebab-casing.
If a model has a foreign key to another model, it's also acceptable to set prefix
to be a sub-path of the related model, where each model's name is plural with kebab casing.
Permissions must at the very least be set per action in get_permissions
, but further conditions can be specified. All permission must be imported from CFL's package to support unit testing.
If get_permissions
is overridden, a test will need to be created for each action the model-view-set provides where each test follows the naming convention test_get_permissions__{action}
. Each test should use CFL's assert_get_permissions
helper.
The first is by excluding an action's HTTP method from http_method_names
. The is the preferred way if no action with that HTTP method should be allowed.
The second is to not permit some or all users to trigger the action. The is the preferred way if only some actions for a HTTP should be allowed.
In the above example, actions that do not use HTTP GET are not allowed (e.g. The destroy action which uses HTTP DELETE is not allowed). Furthermore, of the 2 actions which use HTTP GET: list and retrieve, list is not allowed and only authenticated users are allowed to retrieve.
If a custom action needs to be created for a model-view-set, use CFL's action
decorator. A custom action should set detail
and methods
.
Each action provided by a model-view-set should have one test case that calls the action as it is intended to be called. Normally, unit tests can be said to test the "unhappy scenarios" - where we are asserting that the bad scenarios we are expecting to encounter are handled as expected. However, we will also test the "happy scenario" of each action to assert that the action does indeed work.
CFL has provided client-helpers to call and assert each of the default actions. Each action-test should follow the naming convention test_{action}
.
If a custom update or bulk-update action needs to be created for a model-view-set, use CFL's ModelViewSet.update_action
or ModelViewSet.bulk_update_action
helpers and pass the name of the action as the first argument. As these actions require a serializer to be provided, you'll also need to override get_serializer_class
.
NOTE: Update actions use HTTP PUT and so it needs to be added to http_method_names
.
If you are overriding a model-view-set's get_queryset
callback, a test will need to be created for each action at the very least where each test follows naming convention test_get_queryset__{action}
. Each test will need to use CFL's assert_get_queryset
helper. Additional test dimensions can be specified if other factors affect a queryset.
In the above example, the default queryset is all insured cars. For the drive action, only insured owners can drive their cars. For the list action, insured or uninsured cars can be listed.
If you are overriding a model-view-set's get_serializer_class
callback, a test will need to be created for each action at the very least where each test follows naming convention test_get_serializer_class__{action}
. Each test will need to use CFL's assert_get_serializer_class
helper.
If you are overriding a model-view-set's get_serializer_context
callback, only the actions that have additional context will need to have a test created. The test should follow the naming convention test_get_serializer_context__{action}
. Each test will need to use CFL's assert_get_serializer_context
helper.
: Defines the data tables (a.k.a. models) and columns (a.k.a. fields).
: Handles converting data to objects and vice versa.
: Defines our API endpoints.
First, understand how to .
Defining a model as a warehouse-model allows us to sync data from our database to our data warehouse before it's deleted from our database. See our .
From this we understand that an instance of Car
has the attribute owner
of type Person
. for "backward relationships" on each related object with the naming convention {model}_set
at runtime. Therefore, Person
has the attribute car_set
which is a set of type Car
.
First, understand how to .
For each model, we create a file with the naming convention {model}.py
in the directory serializers
. Within a model's serializer-file, we create one or more serializers. It's advised to create one serializer per action. Each model-serializer should inherit CFL's ModelSerializer
by default and set the type parameter to the model being serialized.
First, understand how to .
If any of a model's should not be allowed, they can be disallowed in one of 2 ways.
To test the "" of each update action, use CFL's client helpers update
or bulk_update
.