from __future__ import annotations from collections.abc import Iterable, Iterator, Sequence Choice = tuple[str, str] ChoiceGroup = tuple[str, tuple[Choice, ...]] TITLE_CHOICES: tuple[ChoiceGroup, ...] = ( ( "Field service & support", ( ("it field engineer", "IT Field Engineer"), ("field service engineer", "Field Service Engineer"), ("it engineer", "IT Engineer"), ("it support engineer", "IT Support Engineer"), ("support engineer", "Support Engineer"), ("onsite support engineer", "On-site Support Engineer"), ("service desk engineer", "Service Desk Engineer"), ("technical support engineer", "Technical Support Engineer"), ("it technician", "IT Technician"), ("pc technician", "PC Technician"), ), ), ( "Systemen & infrastructuur", ( ("system engineer", "System Engineer"), ("system network engineer", "System & Network Engineer"), ("infrastructure engineer", "Infrastructure Engineer"), ("system administrator", "System Administrator"), ("systeembeheerder", "Systeembeheerder"), ("network engineer", "Network Engineer"), ("network administrator", "Network Administrator"), ("netwerkbeheerder", "Netwerkbeheerder"), ("infrastructure consultant", "Infrastructure Consultant"), ("implementation engineer", "Implementation Engineer"), ), ), ( "Modern Workplace & endpoint", ( ("workplace engineer", "Workplace Engineer"), ("modern workplace engineer", "Modern Workplace Engineer"), ("microsoft 365 engineer", "Microsoft 365 Engineer"), ("microsoft 365 consultant", "Microsoft 365 Consultant"), ("modern workplace consultant", "Modern Workplace Consultant"), ("endpoint engineer", "Endpoint Engineer"), ("intune engineer", "Intune Engineer"), ), ), ( "Andere IT-richtingen", ( ("cloud engineer", "Cloud Engineer"), ("devops engineer", "DevOps Engineer"), ("security engineer", "Security Engineer"), ("platform engineer", "Platform Engineer"), ("software engineer", "Software Engineer"), ("data engineer", "Data Engineer"), ("solution architect", "Solution Architect"), ("project manager", "IT-projectmanager"), ), ), ) EXCLUDED_TITLE_CHOICES: tuple[ChoiceGroup, ...] = ( ( "Commercieel & werving", ( ("sales", "Sales"), ("recruiter", "Recruiter"), ("account manager", "Accountmanager"), ("business developer", "Business Developer"), ("callcenter", "Callcenter"), ), ), ( "Software, data & analyse", ( ("software developer", "Software Developer"), ("software engineer", "Software Engineer"), ("web developer", "Web Developer"), ("developer", "Developmentfuncties (breed)"), ("software", "Softwarefuncties (breed)"), ("backend", "Backendfuncties"), ("frontend", "Frontendfuncties"), ("php", "PHP-ontwikkeling"), ("data engineer", "Data Engineer"), ("data scientist", "Data Scientist"), ("data", "Datafuncties (breed)"), ("ai engineer", "AI Engineer"), ("ai", "AI-functies (breed)"), ("machine learning", "Machine Learning"), ("functional analyst", "Functional Analyst"), ("functioneel analist", "Functioneel Analist"), ("business analyst", "Business Analyst"), ), ), ( "Management & starters", ( ("product owner", "Product Owner"), ("project manager", "Projectmanager"), ("architect", "Architectrollen"), ("service delivery manager", "Service Delivery Manager"), ("team lead", "Teamlead"), ("head of", "Head-of-rollen"), ("procurement", "Procurement"), ("stage", "Stage"), ("internship", "Internship"), ("student", "Studentenjob"), ), ), ( "Niet-IT-techniek", ( ("electromechanical", "Elektromechanica"), ("maintenance technician", "Onderhoudstechnieker"), ("process engineer", "Process Engineer"), ("automation engineer", "Automation Engineer"), ), ), ( "Onderzoek & beeldverwerking", ( ("research", "Onderzoeksfuncties"), ("scientist", "Scientist"), ("image processing", "Beeldverwerking"), ("remote sensing", "Remote sensing"), ), ), ( "Cloud & businessplatformen", ( ("cloud", "Cloudfuncties (breed)"), ("devops", "DevOps"), ("azure consultant", "Azure Consultant"), ("sap", "SAP"), ("power platform", "Power Platform"), ), ), ( "Onderwijs", ( ("lecturer", "Lecturer"), ("lector", "Lector"), ("docent", "Docent"), ("gastdocent", "Gastdocent"), ), ), ) SKILL_CHOICES: tuple[ChoiceGroup, ...] = ( ( "Field service & uitvoering", ( ("troubleshooting", "Troubleshooting"), ("onsite support", "On-site support"), ("hardware", "Hardware & randapparatuur"), ("installations", "Installaties & roll-outs"), ("migrations", "Migraties"), ("technical documentation", "Technische documentatie"), ("customer support", "Klantondersteuning"), ("second line support", "Tweede- en derdelijnssupport"), ("customer experience", "Klanttevredenheid / CSAT"), ), ), ( "Microsoft & endpoint", ( ("microsoft 365", "Microsoft 365"), ("exchange online", "Exchange Online"), ("sharepoint", "SharePoint"), ("microsoft teams", "Microsoft Teams"), ("entra id", "Entra ID"), ("intune", "Microsoft Intune"), ("autopilot", "Windows Autopilot"), ("windows server", "Windows Server"), ("active directory", "Active Directory"), ("group policy", "Group Policy / GPO"), ("dynamics 365", "Microsoft Dynamics 365"), ("microsoft copilot", "Microsoft Copilot"), ("microsoft defender", "Microsoft Defender"), ("microsoft sentinel", "Microsoft Sentinel"), ("conditional access", "Conditional Access"), ), ), ( "Netwerk & security", ( ("networking", "Netwerken"), ("tcp/ip", "TCP/IP"), ("vlan", "VLAN"), ("vpn", "VPN"), ("dhcp", "DHCP"), ("dns", "DNS"), ("firewalls", "Firewalls"), ("watchguard", "WatchGuard"), ("cisco", "Cisco"), ("ubiquiti", "Ubiquiti"), ("wi-fi", "Wi-Fi"), ("routing", "Routing"), ("switching", "Switching"), ("sd-wan", "SD-WAN"), ("fortinet", "Fortinet / FortiGate"), ("palo alto", "Palo Alto Networks"), ("aruba", "HPE Aruba"), ("meraki", "Cisco Meraki"), ("sophos", "Sophos"), ("zero trust", "Zero Trust"), ), ), ( "Back-up & monitoring", ( ("backup and restore", "Back-up & restore"), ("veeam", "Veeam"), ("windows server backup", "Windows Server Backup"), ("synology", "Synology"), ("zabbix", "Zabbix"), ("monitoring", "Infrastructuurmonitoring"), ("observability", "Observability"), ("high availability", "High availability"), ("disaster recovery", "Disaster recovery"), ), ), ( "Virtualisatie & platform", ( ("vmware", "VMware"), ("proxmox", "Proxmox"), ("hyper-v", "Hyper-V"), ("docker", "Docker"), ("azure", "Microsoft Azure"), ("aws", "AWS"), ("linux", "Linux"), ("kubernetes", "Kubernetes"), ("terraform", "Terraform"), ("ci/cd", "CI/CD"), ("deployment", "Deployment & uitrol"), ("reliability", "Platform reliability"), ("scalability", "Schaalbaarheid"), ), ), ( "VoIP & telefonie", ( ("voip", "VoIP"), ("3cx", "3CX"), ("innovaphone", "Innovaphone"), ("teams telephony", "Teams-telefonie"), ("yealink", "Yealink"), ("snom", "Snom"), ), ), ( "Automation & scripting", ( ("powershell", "PowerShell"), ("bash", "Bash"), ("python", "Python"), ("c#", "C#"), ), ), ( "IT-servicemanagement", ( ("itil", "ITIL / IT-servicemanagement"), ("incident management", "Incidentmanagement"), ("problem management", "Problemmanagement"), ("change management", "Changemanagement"), ("servicenow", "ServiceNow"), ("jira service management", "Jira Service Management"), ), ), ( "Digitale werkplek & adoptie", ( ("digital workplace", "Digital Workplace"), ("m365 governance", "Microsoft 365-governance"), ("document management", "Documentmanagement"), ("data governance", "Datagovernance"), ("user adoption", "Gebruikersadoptie"), ("training and workshops", "Training & workshops"), ), ), ) EXCLUDED_SKILL_CHOICES: tuple[ChoiceGroup, ...] = ( ( "Commerciƫle voorwaarden", ( ("cold calling", "Cold calling"), ("door to door", "Deur-aan-deurverkoop"), ("commission only", "Alleen commissieloon"), ), ), ( "Werkregeling", ( ("night shift", "Nachtwerk"), ("rotating shifts", "Ploegendienst"), ("on-call duty", "Structurele wachtdienst"), ), ), ) def iter_choices(choices: Iterable[Choice | tuple[str, Sequence[Choice]]]) -> Iterator[Choice]: """Flatten Django optgroups while retaining compatibility with legacy flat choices.""" for value, label_or_choices in choices: if isinstance(label_or_choices, tuple | list): yield from iter_choices(label_or_choices) else: yield str(value), str(label_or_choices)