Merge pull request #7 from ribaguifi/dev/django2.1
Upgrade to Django 2.1
This commit is contained in:
commit
18a41d507b
|
@ -1,12 +1,12 @@
|
||||||
from rest_framework import status
|
from rest_framework import status
|
||||||
from rest_framework.decorators import detail_route
|
from rest_framework.decorators import action
|
||||||
from rest_framework.response import Response
|
from rest_framework.response import Response
|
||||||
|
|
||||||
from .serializers import SetPasswordSerializer
|
from .serializers import SetPasswordSerializer
|
||||||
|
|
||||||
|
|
||||||
class SetPasswordApiMixin(object):
|
class SetPasswordApiMixin(object):
|
||||||
@detail_route(methods=['post'], serializer_class=SetPasswordSerializer)
|
@action(detail=True, methods=['post'], serializer_class=SetPasswordSerializer)
|
||||||
def set_password(self, request, pk):
|
def set_password(self, request, pk):
|
||||||
obj = self.get_object()
|
obj = self.get_object()
|
||||||
data = request.data
|
data = request.data
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
from django.http import HttpResponse
|
from django.http import HttpResponse
|
||||||
from rest_framework import viewsets
|
from rest_framework import viewsets
|
||||||
from rest_framework.decorators import detail_route
|
from rest_framework.decorators import action
|
||||||
|
|
||||||
from orchestra.api import router, LogApiMixin
|
from orchestra.api import router, LogApiMixin
|
||||||
from orchestra.contrib.accounts.api import AccountApiMixin
|
from orchestra.contrib.accounts.api import AccountApiMixin
|
||||||
|
@ -14,8 +14,8 @@ from .serializers import BillSerializer
|
||||||
class BillViewSet(LogApiMixin, AccountApiMixin, viewsets.ModelViewSet):
|
class BillViewSet(LogApiMixin, AccountApiMixin, viewsets.ModelViewSet):
|
||||||
queryset = Bill.objects.all()
|
queryset = Bill.objects.all()
|
||||||
serializer_class = BillSerializer
|
serializer_class = BillSerializer
|
||||||
|
|
||||||
@detail_route(methods=['get'])
|
@action(detail=True, methods=['get'])
|
||||||
def document(self, request, pk):
|
def document(self, request, pk):
|
||||||
bill = self.get_object()
|
bill = self.get_object()
|
||||||
content_type = request.META.get('HTTP_ACCEPT')
|
content_type = request.META.get('HTTP_ACCEPT')
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
from rest_framework import viewsets
|
from rest_framework import viewsets
|
||||||
from rest_framework.decorators import detail_route
|
from rest_framework.decorators import action
|
||||||
from rest_framework.response import Response
|
from rest_framework.response import Response
|
||||||
|
|
||||||
from orchestra.api import router
|
from orchestra.api import router
|
||||||
|
@ -14,18 +14,18 @@ class DomainViewSet(AccountApiMixin, viewsets.ModelViewSet):
|
||||||
serializer_class = DomainSerializer
|
serializer_class = DomainSerializer
|
||||||
filter_fields = ('name',)
|
filter_fields = ('name',)
|
||||||
queryset = Domain.objects.all()
|
queryset = Domain.objects.all()
|
||||||
|
|
||||||
def get_queryset(self):
|
def get_queryset(self):
|
||||||
qs = super(DomainViewSet, self).get_queryset()
|
qs = super(DomainViewSet, self).get_queryset()
|
||||||
return qs.prefetch_related('records')
|
return qs.prefetch_related('records')
|
||||||
|
|
||||||
@detail_route()
|
@action(detail=True)
|
||||||
def view_zone(self, request, pk=None):
|
def view_zone(self, request, pk=None):
|
||||||
domain = self.get_object()
|
domain = self.get_object()
|
||||||
return Response({
|
return Response({
|
||||||
'zone': domain.render_zone()
|
'zone': domain.render_zone()
|
||||||
})
|
})
|
||||||
|
|
||||||
def options(self, request):
|
def options(self, request):
|
||||||
metadata = super(DomainViewSet, self).options(request)
|
metadata = super(DomainViewSet, self).options(request)
|
||||||
names = ['DOMAINS_DEFAULT_A', 'DOMAINS_DEFAULT_MX', 'DOMAINS_DEFAULT_NS']
|
names = ['DOMAINS_DEFAULT_A', 'DOMAINS_DEFAULT_MX', 'DOMAINS_DEFAULT_NS']
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
from rest_framework import viewsets, mixins
|
from rest_framework import viewsets, mixins
|
||||||
from rest_framework.decorators import detail_route
|
from rest_framework.decorators import action
|
||||||
from rest_framework.response import Response
|
from rest_framework.response import Response
|
||||||
|
|
||||||
from orchestra.api import router, LogApiMixin
|
from orchestra.api import router, LogApiMixin
|
||||||
|
@ -12,19 +12,19 @@ from .serializers import TicketSerializer, QueueSerializer
|
||||||
class TicketViewSet(LogApiMixin, viewsets.ModelViewSet):
|
class TicketViewSet(LogApiMixin, viewsets.ModelViewSet):
|
||||||
queryset = Ticket.objects.all()
|
queryset = Ticket.objects.all()
|
||||||
serializer_class = TicketSerializer
|
serializer_class = TicketSerializer
|
||||||
|
|
||||||
@detail_route()
|
@action(detail=True)
|
||||||
def mark_as_read(self, request, pk=None):
|
def mark_as_read(self, request, pk=None):
|
||||||
ticket = self.get_object()
|
ticket = self.get_object()
|
||||||
ticket.mark_as_read_by(request.user)
|
ticket.mark_as_read_by(request.user)
|
||||||
return Response({'status': 'Ticket marked as read'})
|
return Response({'status': 'Ticket marked as read'})
|
||||||
|
|
||||||
@detail_route()
|
@action(detail=True)
|
||||||
def mark_as_unread(self, request, pk=None):
|
def mark_as_unread(self, request, pk=None):
|
||||||
ticket = self.get_object()
|
ticket = self.get_object()
|
||||||
ticket.mark_as_unread_by(request.user)
|
ticket.mark_as_unread_by(request.user)
|
||||||
return Response({'status': 'Ticket marked as unread'})
|
return Response({'status': 'Ticket marked as unread'})
|
||||||
|
|
||||||
def get_queryset(self):
|
def get_queryset(self):
|
||||||
qs = super(TicketViewSet, self).get_queryset()
|
qs = super(TicketViewSet, self).get_queryset()
|
||||||
qs = qs.select_related('creator', 'queue')
|
qs = qs.select_related('creator', 'queue')
|
||||||
|
|
|
@ -1,3 +1,7 @@
|
||||||
|
from django.utils.text import format_lazy
|
||||||
|
from django.utils.translation import ugettext_lazy
|
||||||
|
|
||||||
|
|
||||||
def get_chunks(porders, ini, end, ix=0):
|
def get_chunks(porders, ini, end, ix=0):
|
||||||
if ix >= len(porders):
|
if ix >= len(porders):
|
||||||
return [[ini, end, []]]
|
return [[ini, end, []]]
|
||||||
|
@ -41,10 +45,10 @@ class Interval(object):
|
||||||
self.ini = ini
|
self.ini = ini
|
||||||
self.end = end
|
self.end = end
|
||||||
self.order = order
|
self.order = order
|
||||||
|
|
||||||
def __len__(self):
|
def __len__(self):
|
||||||
return max((self.end-self.ini).days, 0)
|
return max((self.end-self.ini).days, 0)
|
||||||
|
|
||||||
def __sub__(self, other):
|
def __sub__(self, other):
|
||||||
remaining = []
|
remaining = []
|
||||||
if self.ini < other.ini:
|
if self.ini < other.ini:
|
||||||
|
@ -52,13 +56,13 @@ class Interval(object):
|
||||||
if self.end > other.end:
|
if self.end > other.end:
|
||||||
remaining.append(Interval(max(self.ini,other.end), self.end, self.order))
|
remaining.append(Interval(max(self.ini,other.end), self.end, self.order))
|
||||||
return remaining
|
return remaining
|
||||||
|
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
return "<ini:{ini}/end:{end}>".format(
|
return "<ini:{ini}/end:{end}>".format(
|
||||||
ini=self.ini.strftime('%Y-%-m-%-d'),
|
ini=self.ini.strftime('%Y-%-m-%-d'),
|
||||||
end=self.end.strftime('%Y-%-m-%-d')
|
end=self.end.strftime('%Y-%-m-%-d')
|
||||||
)
|
)
|
||||||
|
|
||||||
def intersect(self, other, remaining_self=None, remaining_other=None):
|
def intersect(self, other, remaining_self=None, remaining_other=None):
|
||||||
if remaining_self is not None:
|
if remaining_self is not None:
|
||||||
remaining_self += (self - other)
|
remaining_self += (self - other)
|
||||||
|
@ -69,7 +73,7 @@ class Interval(object):
|
||||||
return result
|
return result
|
||||||
else:
|
else:
|
||||||
return None
|
return None
|
||||||
|
|
||||||
def intersect_set(self, others, remaining_self=None, remaining_other=None):
|
def intersect_set(self, others, remaining_self=None, remaining_other=None):
|
||||||
intersections = []
|
intersections = []
|
||||||
for interval in others:
|
for interval in others:
|
||||||
|
@ -130,3 +134,16 @@ def compensate(order, compensations):
|
||||||
for __, compensation in ordered_intersections:
|
for __, compensation in ordered_intersections:
|
||||||
remaining_compensations.append(compensation)
|
remaining_compensations.append(compensation)
|
||||||
return remaining_compensations, applied_compensations
|
return remaining_compensations, applied_compensations
|
||||||
|
|
||||||
|
|
||||||
|
def get_rate_methods_help_text(rate_class):
|
||||||
|
method_help_texts = [
|
||||||
|
format_lazy('{}' * 4, *['<br> ', method.verbose_name, ': ', method.help_text])
|
||||||
|
for method in rate_class.get_methods().values()
|
||||||
|
]
|
||||||
|
prefix = ugettext_lazy("Algorithm used to interprete the rating table.")
|
||||||
|
help_text_items = [prefix] + method_help_texts
|
||||||
|
return format_lazy(
|
||||||
|
'{}' * len(help_text_items),
|
||||||
|
*help_text_items
|
||||||
|
)
|
||||||
|
|
|
@ -1,18 +1,20 @@
|
||||||
import calendar
|
import calendar
|
||||||
import decimal
|
import decimal
|
||||||
|
from orchestra.contrib.services import helpers
|
||||||
|
|
||||||
from django.contrib.contenttypes.models import ContentType
|
from django.contrib.contenttypes.models import ContentType
|
||||||
from django.db import models
|
from django.db import models
|
||||||
from django.apps import apps
|
from django.apps import apps
|
||||||
from django.utils.functional import cached_property
|
from django.utils.functional import cached_property
|
||||||
from django.utils.module_loading import autodiscover_modules
|
from django.utils.module_loading import autodiscover_modules
|
||||||
from django.utils.translation import string_concat, ugettext_lazy as _
|
from django.utils.translation import ugettext_lazy as _
|
||||||
|
|
||||||
from orchestra.core import caches, validators
|
from orchestra.core import caches, validators
|
||||||
from orchestra.utils.python import import_class
|
from orchestra.utils.python import import_class
|
||||||
|
|
||||||
from . import settings
|
from . import settings
|
||||||
from .handlers import ServiceHandler
|
from .handlers import ServiceHandler
|
||||||
|
from .helpers import get_rate_methods_help_text
|
||||||
|
|
||||||
|
|
||||||
autodiscover_modules('handlers')
|
autodiscover_modules('handlers')
|
||||||
|
@ -145,13 +147,12 @@ class Service(models.Model):
|
||||||
(ANUAL, _("Anual data")),
|
(ANUAL, _("Anual data")),
|
||||||
),
|
),
|
||||||
default=BILLING_PERIOD)
|
default=BILLING_PERIOD)
|
||||||
rate_algorithm = models.CharField(_("rate algorithm"), max_length=64,
|
rate_algorithm = models.CharField(
|
||||||
|
_("rate algorithm"), max_length=64,
|
||||||
choices=rate_class.get_choices(),
|
choices=rate_class.get_choices(),
|
||||||
default=rate_class.get_default(),
|
default=rate_class.get_default(),
|
||||||
help_text=string_concat(_("Algorithm used to interprete the rating table."), *[
|
help_text=get_rate_methods_help_text(rate_class),
|
||||||
string_concat('<br> ', method.verbose_name, ': ', method.help_text)
|
)
|
||||||
for name, method in rate_class.get_methods().items()
|
|
||||||
]))
|
|
||||||
on_cancel = models.CharField(_("on cancel"), max_length=16,
|
on_cancel = models.CharField(_("on cancel"), max_length=16,
|
||||||
help_text=_("Defines the cancellation behaviour of this service."),
|
help_text=_("Defines the cancellation behaviour of this service."),
|
||||||
choices=(
|
choices=(
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
from django.utils.translation import string_concat
|
from django.utils.text import format_lazy
|
||||||
|
|
||||||
from ..utils.python import AttrDict
|
from ..utils.python import AttrDict
|
||||||
|
|
||||||
|
@ -7,16 +7,16 @@ class Register(object):
|
||||||
def __init__(self, verbose_name=None):
|
def __init__(self, verbose_name=None):
|
||||||
self._registry = {}
|
self._registry = {}
|
||||||
self.verbose_name = verbose_name
|
self.verbose_name = verbose_name
|
||||||
|
|
||||||
def __contains__(self, key):
|
def __contains__(self, key):
|
||||||
return key in self._registry
|
return key in self._registry
|
||||||
|
|
||||||
def __getitem__(self, key):
|
def __getitem__(self, key):
|
||||||
return self._registry[key]
|
return self._registry[key]
|
||||||
|
|
||||||
def __iter__(self):
|
def __iter__(self):
|
||||||
return iter(self._registry.values())
|
return iter(self._registry.values())
|
||||||
|
|
||||||
def register(self, model, **kwargs):
|
def register(self, model, **kwargs):
|
||||||
if model in self._registry:
|
if model in self._registry:
|
||||||
raise KeyError("%s already registered" % model)
|
raise KeyError("%s already registered" % model)
|
||||||
|
@ -31,14 +31,15 @@ class Register(object):
|
||||||
}
|
}
|
||||||
defaults.update(kwargs)
|
defaults.update(kwargs)
|
||||||
self._registry[model] = AttrDict(**defaults)
|
self._registry[model] = AttrDict(**defaults)
|
||||||
|
|
||||||
def register_view(self, view_name, **kwargs):
|
def register_view(self, view_name, **kwargs):
|
||||||
if 'verbose_name' not in kwargs:
|
if 'verbose_name' not in kwargs:
|
||||||
raise KeyError("%s verbose_name is required for views" % view_name)
|
raise KeyError("%s verbose_name is required for views" % view_name)
|
||||||
if 'verbose_name_plural' not in kwargs:
|
if 'verbose_name_plural' not in kwargs:
|
||||||
kwargs['verbose_name_plural'] = string_concat(kwargs['verbose_name'], 's')
|
kwargs['verbose_name_plural'] = format_lazy('{}' * 2, *[kwargs['verbose_name'], 's'])
|
||||||
|
|
||||||
self.register(view_name, **kwargs)
|
self.register(view_name, **kwargs)
|
||||||
|
|
||||||
def get(self, *args):
|
def get(self, *args):
|
||||||
if args:
|
if args:
|
||||||
return self._registry[args[0]]
|
return self._registry[args[0]]
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
Django==2.0
|
Django==2.1
|
||||||
django-fluent-dashboard==1.0.1
|
django-fluent-dashboard==1.0.1
|
||||||
django-admin-tools==0.9.1
|
django-admin-tools==0.9.1
|
||||||
django-extensions==2.1.1
|
django-extensions==2.1.1
|
||||||
|
@ -7,10 +7,10 @@ celery==3.1.23
|
||||||
kombu==3.0.35
|
kombu==3.0.35
|
||||||
billiard==3.3.0.23
|
billiard==3.3.0.23
|
||||||
Markdown==2.4
|
Markdown==2.4
|
||||||
djangorestframework==3.9.3
|
djangorestframework==3.10.3
|
||||||
ecdsa==0.11
|
ecdsa==0.11
|
||||||
Pygments==1.6
|
Pygments==1.6
|
||||||
django-filter==1.1
|
django-filter==2.2.0
|
||||||
jsonfield==0.9.22
|
jsonfield==0.9.22
|
||||||
python-dateutil==2.2
|
python-dateutil==2.2
|
||||||
https://github.com/glic3rinu/passlib/archive/master.zip
|
https://github.com/glic3rinu/passlib/archive/master.zip
|
||||||
|
|
Loading…
Reference in a new issue