-
Notifications
You must be signed in to change notification settings - Fork 1
/
viewsets.py
67 lines (60 loc) · 2.29 KB
/
viewsets.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
from rest_framework import viewsets, mixins, decorators, response, status
from rest_framework.exceptions import NotAuthenticated
from django.utils.translation import gettext_lazy as _
from drf_yasg.utils import swagger_auto_schema
from mails.models import UserMail
from plans.models import Plan
from plans.serializers import PlanSerializer, ActivePlanSerializer
from plans.plan import Plan as PlanUtil
from docs.responses import NotFoundResponse, UnauthenticatedResponse
class PlanViewSet(mixins.RetrieveModelMixin, mixins.ListModelMixin, viewsets.GenericViewSet):
queryset = Plan.objects.filter(is_visible=True)
serializer_class = PlanSerializer
permission_classes = []
pagination_class = None
@swagger_auto_schema(
responses={
status.HTTP_404_NOT_FOUND: NotFoundResponse,
},
)
def retrieve(self, request, *args, **kwargs):
"""
Retrieve one plan by the Plan ID.
"""
return super(PlanViewSet, self).retrieve(request, *args, **kwargs)
def list(self, request, *args, **kwargs):
"""
Retrieve the list of the visible Plans of the Tunelator.
The plans are created on the admin painel.
"""
return super(PlanViewSet, self).list(request, *args, **kwargs)
@decorators.action(detail=False, methods=["GET"])
@swagger_auto_schema(
responses={
status.HTTP_200_OK: ActivePlanSerializer,
status.HTTP_401_UNAUTHORIZED: UnauthenticatedResponse,
},
)
def active(self, request):
"""
Retrieve the current active plan for the current authenticated
user.
"""
if not request.user.is_authenticated:
raise NotAuthenticated()
plan_util = PlanUtil(request.user)
approval = plan_util.approval
plan = approval.plan
max_mails_count = plan_util.settings.mails
current_mails_count = len(
UserMail.objects.filter(user=request.user).all()
)
free_accounts = max_mails_count - current_mails_count
if free_accounts < 0:
free_accounts = 0
serializer = ActivePlanSerializer(instance=plan)
data = {
**serializer.data,
'free_accounts': free_accounts
}
return response.Response(data)