| 266 | |
| 267 | @classmethod |
| 268 | def get_from_cache(cls, api_key: str | None) -> "Environment | None": |
| 269 | if not api_key: |
| 270 | logger.warning("Requested environment with null api_key.") |
| 271 | return None |
| 272 | |
| 273 | if cls.is_bad_key(api_key): |
| 274 | return None |
| 275 | |
| 276 | environment: "Environment" = environment_cache.get(api_key) |
| 277 | if not environment: |
| 278 | select_related_args = ( |
| 279 | "project", |
| 280 | "project__organisation", |
| 281 | *IDENTITY_INTEGRATIONS_RELATION_NAMES, |
| 282 | ) |
| 283 | base_qs = cls.objects.select_related(*select_related_args).defer( |
| 284 | "description" |
| 285 | ) |
| 286 | qs_for_embedded_api_key = base_qs.filter(api_key=api_key) |
| 287 | qs_for_fk_api_key = base_qs.filter(api_keys__key=api_key) |
| 288 | |
| 289 | try: |
| 290 | environment = qs_for_embedded_api_key.union(qs_for_fk_api_key).get() |
| 291 | except cls.DoesNotExist: |
| 292 | cls.set_bad_key(api_key) |
| 293 | logger.info("Environment with api_key %s does not exist" % api_key) |
| 294 | return None |
| 295 | else: |
| 296 | environment_cache.set( |
| 297 | api_key, |
| 298 | environment, |
| 299 | timeout=settings.ENVIRONMENT_CACHE_SECONDS, |
| 300 | ) |
| 301 | |
| 302 | return environment |
| 303 | |
| 304 | @classmethod |
| 305 | def write_environment_documents( |