API
- Add unified filtering interface in resolvers - 3952, 4078 by korycins
- Add mutations for bulk actions - 3935, 3954, 3967, 3969, 3970 by akjanik
- Add mutation for reordering menu items - 3958 by NyanKiyoshi
- Optimize queries for single nodes - 3968 NyanKiyoshi
- Refactor error handling in mutations 3891 by maarcingebala & akjanik
- Specify mutation permissions through Meta classes - 3980 by NyanKiyoshi
- Unify pricing access in products and variants - 3948 by NyanKiyoshi
- Use only_fields instead of exclude_fields in type definitions - 3940 by michaljelonek
- Prefetch collections when getting sales of a bunch of products - 3961 by NyanKiyoshi
- Remove unnecessary dedents from GraphQL schema so new Playground can work - 4045 by salwator
- Restrict resolving payment by ID - 4009 NyanKiyoshi
- Require `checkoutId` for updating checkout's shipping and billing address - 4074 by jxltom
- Handle errors in `TokenVerify` mutation - 3981 by fowczarek
- Unify argument names in types and resolvers - 3942 by NyanKiyoshi
Core
- Use Black as the default code formatting tool - 3852 by krzysztofwolski and NyanKiyoshi
- Dropped Python 3.5 support - 4028 by korycins
- Rename Cart to Checkout - 3963 by michaljelonek
- Use data classes to exchange data with payment gateways - 4028 by korycins
- Refactor order events - 4018 by NyanKiyoshi