Chapter 4 — Privacy and data protection: core methods
Lesson map
Lesson 04 published. Map, example, EX016.
flowchart TD
N0["Learning outcomes"]
N1["4.1 Data mapping"]
N2["4.2 Retention review"]
N3["4.3 Lawful basis analysis"]
N4["4.4 Recommendations"]
N5["Lab — Candidate CVs past retention"]
N0 --> N1 --> N2 --> N3 --> N4 --> N5
N5 --> EX["Worked example"]
EX --> Q["Exercise EX016"]
Logical drawing
flowchart LR
N0["Learning outcomes"]
N1["4.1 Data mapping"]
N2["4.2 Retention review"]
N3["4.3 Lawful basis analysis"]
N4["4.4 Recommendations"]
N5["Lab — Candidate CVs past retention"]
N0 --> N1 --> N2 --> N3 --> N4 --> N5 --> Q["EX016"]
[Learning outcomes]
|
v
[4.1 Data mapping]
|
v
[4.2 Retention review]
|
v
[4.3 Lawful basis analysis]
|
v
[4.4 Recommendations]
|
v
[Lab — Candidate CVs past retention]
|
v
[Worked example] --> [Exercise EX016]
Learning outcomes
You will (1) apply data mapping, retention review and lawful basis analysis; (2) analyse CV retention with a lab; (3) recommend changes.
4.1 Data mapping
Marta builds a data map for Halden listing each category of data, its source, purpose, system, recipients and retention. Categories include contact details, CVs, interview notes, references, right-to-work documents, background check results and diversity monitoring answers. The map shows that diversity answers are stored with names in the recruitment system although they are used only for anonymous statistics. She recommends storing them separately without names, which supports minimisation and reduces the impact of any breach involving the main candidate database. The IT provider confirms feasibility.
4.2 Retention review
Halden's policy says CVs of unsuccessful candidates are deleted six months after last contact unless the candidate agrees to stay in the talent pool. Marta checks practice with a synthetic copy of the candidate database. The lab shows that 1,792 of 2,500 candidates, 71.7%, are past six months without talent-pool agreement, so the policy has not been applied. It also finds 216 talent-pool candidates with no contact for over two years, whose agreement is probably stale and should be refreshed or ended. Most expired profiles are years old.
4.3 Lawful basis analysis
With the data protection lead, Marta reviews lawful bases. Processing applications for a specific role relies on steps at the candidate's request before a contract, under Article 6(1)(b). Keeping candidates in the talent pool for future roles relies on consent, which must be specific and withdrawable. Right-to-work checks rely on legal obligation. Background checks need careful analysis, especially for criminal records, which Article 10 restricts. She documents each basis so that consultants know which data they may use for which purpose. Consultants receive a summary.
4.4 Recommendations
Marta recommends three changes: run an automated deletion job for expired CVs after a report-only trial, send a refresh request to talent-pool candidates who have not been in contact for two years and delete those who do not reply, and separate diversity data from names. She estimates that the first change alone removes over two-thirds of stored candidate profiles. The managing director approves, and the IT provider schedules the work with Marta preparing the test plan. Each change has an owner and a date, and the deletion job's first live run is scheduled after the trial.
Lab — Candidate CVs past retention
"""Check candidate CVs against a retention rule in a synthetic recruitment database (stdlib only)."""
import random, datetime
random.seed(21)
today = datetime.date(2026, 10, 1)
cands = []
for i in range(2500):
last = today - datetime.timedelta(days=random.randint(0, 1500))
pool = random.random() < 0.18 # candidate agreed to stay in talent pool
cands.append((i, last, pool))
rule = 183 # six months after last contact
expired = [c for c in cands if (today - c[1]).days > rule and not c[2]]
pool_old = [c for c in cands if c[2] and (today - c[1]).days > 730]
print(f"candidates {len(cands)}; past six months without pool consent {len(expired)} ({100*len(expired)/len(cands):.1f}%)")
print(f"talent-pool candidates with no contact for over two years {len(pool_old)}")
Run with python3 lab_cvs.py. Verified output:
candidates 2500; past six months without pool consent 1792 (71.7%)
talent-pool candidates with no contact for over two years 216
Worked example
Marta maps data categories, finds 1,792 of 2,500 candidates (71.7%) past retention and 216 stale talent-pool entries, documents lawful bases and recommends deletion, consent refresh and separating diversity data.
Synthetic case. Records are synthetic; GDPR Articles 6(1)(b) and 10 are real.
Errors and limits
Some records may be needed for legal claims; agree exceptions before deleting.
Exercises
- EX016 — Diversity data. What did the map show about diversity answers? Rubric: 3 = stored with names though used anonymously;; 2 = mentions names;; 1 = vague;; 0 = none.
- EX017 — Expired CVs. How many candidates were past six months without pool consent? Rubric: 3 = 1,792 of 2,500, 71.7%;; 2 = approximate;; 1 = wrong;; 0 = none.
- EX018 — Stale pool. How many talent-pool candidates had no contact for over two years? Rubric: 3 = 216;; 2 = partly correct;; 1 = wrong;; 0 = none.
- EX019 — Talent pool basis. What lawful basis supports the talent pool? Rubric: 3 = consent;; 2 = partly correct;; 1 = contract;; 0 = none.
- EX020 — Criminal data. Which article restricts criminal record data? Rubric: 3 = Article 10;; 2 = partly correct;; 1 = other;; 0 = none.
Continue studying — lesson 04 (chapter 04 of 12)
← Chapter 03 · Course chapter index · Chapter 05 →
Continue to the next authored lesson.