85 lines
2.4 KiB
Python
85 lines
2.4 KiB
Python
from __future__ import unicode_literals
|
|
|
|
import json
|
|
import logging
|
|
|
|
from django.db import models
|
|
from django.utils.encoding import force_text
|
|
from django.utils.module_loading import import_string
|
|
from django.utils.translation import ugettext_lazy as _
|
|
|
|
from .handlers import handler_process_signal
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
class Quota(models.Model):
|
|
backend_path = models.CharField(
|
|
max_length=255,
|
|
help_text=_('The dotted Python path to the backend class.'),
|
|
verbose_name=_('Backend path')
|
|
)
|
|
backend_data = models.TextField(
|
|
blank=True, verbose_name=_('Backend data')
|
|
)
|
|
enabled = models.BooleanField(default=True, verbose_name=_('Enabled'))
|
|
editable = models.BooleanField(
|
|
default=True, editable=False, verbose_name=_('Editable')
|
|
)
|
|
|
|
class Meta:
|
|
verbose_name = _('Quota')
|
|
verbose_name_plural = _('Quotas')
|
|
|
|
def __str__(self):
|
|
return force_text(self.backend_label())
|
|
|
|
def save(self, *args, **kwargs):
|
|
result = super(Quota, self).save(*args, **kwargs)
|
|
self.update_receiver()
|
|
return result
|
|
|
|
def backend_display(self):
|
|
return self.get_backend_instance().display()
|
|
|
|
def backend_label(self):
|
|
return self.get_backend_instance().label
|
|
|
|
def backend_usage(self):
|
|
return self.get_backend_instance().usage()
|
|
|
|
def dispatch_uid(self):
|
|
return 'quote_{}'.format(self.pk)
|
|
|
|
def dumps(self, data):
|
|
self.backend_data = json.dumps(data)
|
|
self.save()
|
|
|
|
def get_backend_class(self):
|
|
return import_string(self.backend_path)
|
|
|
|
def get_backend_instance(self):
|
|
return self.get_backend_class()(**self.loads())
|
|
|
|
def loads(self):
|
|
return json.loads(self.backend_data)
|
|
|
|
def update_receiver(self):
|
|
backend_instance = self.get_backend_instance()
|
|
|
|
if self.enabled:
|
|
backend_instance.signal.disconnect(
|
|
dispatch_uid=self.dispatch_uid(),
|
|
sender=backend_instance.sender
|
|
)
|
|
backend_instance.signal.connect(
|
|
handler_process_signal,
|
|
dispatch_uid=self.dispatch_uid(),
|
|
sender=backend_instance.sender
|
|
)
|
|
else:
|
|
backend_instance.signal.disconnect(
|
|
dispatch_uid=self.dispatch_uid(),
|
|
sender=backend_instance.sender
|
|
)
|