Projet

Général

Profil

0001-base-manage-two-keys-cache-48477.patch

Nicolas Roche, 26 novembre 2020 13:58

Télécharger (3,89 ko)

Voir les différences:

Subject: [PATCH 1/2] base: manage two keys cache (#48477)

 passerelle/base/models.py      | 23 +++++++++++++++++++++++
 tests/test_generic_endpoint.py | 12 ++++++++++++
 2 files changed, 35 insertions(+)
passerelle/base/models.py
9 9
import traceback
10 10
import base64
11 11
import itertools
12 12
import uuid
13 13

  
14 14
from django.apps import apps
15 15
from django.conf import settings
16 16
from django.contrib.postgres.fields import JSONField
17
from django.core.cache import cache
17 18
from django.core.exceptions import ValidationError, PermissionDenied
18 19
from django.core.urlresolvers import reverse
19 20
from django.db import connection, models, transaction
20 21
from django.db.models import Q
21 22
from django.forms.models import modelform_factory
22 23
from django.forms.widgets import ClearableFileInput
23 24
from django.test import override_settings
24 25
from django.utils.text import slugify
......
620 621
    @property
621 622
    def has_open_access_right(self):
622 623
        return AccessRight.objects.filter(
623 624
            resource_type=ContentType.objects.get_for_model(self),
624 625
            resource_pk=self.pk,
625 626
            apiuser__key=''
626 627
        ).exists()
627 628

  
629
    def get_2keys_cache_prefix(self, label, key1, set=False):
630
        cache_prefix_key = '%s-%s-cache-prefix-%s' % (self._meta.app_label, label, key1)
631
        cache_prefix = cache.get(cache_prefix_key)
632
        if not cache_prefix:
633
            cache_prefix = uuid.uuid4().hex
634
            if set:
635
                cache.set(cache_prefix_key, cache_prefix)
636
        return cache_prefix
637

  
638
    def invalidate_2keys_cache(self, label, key1):
639
        cache.delete('%s-%s-cache-prefix-%s' % (self._meta.app_label, label, key1))
640

  
641
    def get_from_2keys_cache(self, label, key1, key2):
642
        cache_prefix = self.get_2keys_cache_prefix(label, key1)
643
        if not cache_prefix:
644
            return None
645
        return cache.get('%s-%s-cache-%s-%s' % (self._meta.app_label, label, cache_prefix, key2))
646

  
647
    def set_to_2keys_cache(self, label, key1, key2, value):
648
        cache_prefix = self.get_2keys_cache_prefix(label, key1, set=True)
649
        cache.set('%s-%s-cache-%s-%s' % (self._meta.app_label, label, cache_prefix, key2), value)
650

  
628 651

  
629 652
@six.python_2_unicode_compatible
630 653
class AccessRight(models.Model):
631 654
    codename = models.CharField(max_length=100, verbose_name='codename')
632 655
    resource_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
633 656
    resource_pk = models.PositiveIntegerField()
634 657
    resource = fields.GenericForeignKey('resource_type', 'resource_pk')
635 658
    apiuser = models.ForeignKey(ApiUser, verbose_name=_('API User'), on_delete=models.CASCADE)
tests/test_generic_endpoint.py
788 788

  
789 789
    assert ['%s%s' % (ep.name, ep.pattern or '') for ep in connector.get_endpoints_infos()] == expected_ordering
790 790

  
791 791

  
792 792
def test_response_schema(db, app):
793 793
    utils.make_resource(APIParticulier, slug='test', platform='test', api_key='xxx')
794 794
    response = app.get('/api-particulier/test/')
795 795
    assert 'nombrePersonnesCharge' in response
796

  
797

  
798
def test_2keys_cache(mdel):
799
    connector = mdel
800

  
801
    # cache a value and retrieve it
802
    connector.set_to_2keys_cache('label', 'key1', 'key2', 'value')
803
    assert connector.get_from_2keys_cache('label', 'key1', 'key2') == 'value'
804

  
805
    # invalidate cache
806
    connector.invalidate_2keys_cache('label', 'key1')
807
    assert not connector.get_from_2keys_cache('label', 'key1', 'key2')
796
-