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)
|