gault-millau/apps/partner/views/back.py
2020-02-10 16:56:11 +03:00

220 lines
5.4 KiB
Python

from django.shortcuts import get_object_or_404
from django_filters.rest_framework import DjangoFilterBackend
from rest_framework import generics
from rest_framework.filters import OrderingFilter
from partner import filters
from partner.models import Partner, PartnerToEstablishment
from partner.serializers import back as serializers
from utils.methods import get_permission_classes
from utils.permissions import IsEstablishmentManager, IsEstablishmentAdministrator
class PartnerLstView(generics.ListCreateAPIView):
"""
## List/Create view
### *GET*
#### Description
Return non-paginated queryset. Available filters:
* establishment () - filter by establishment identifier
* type (`enum`) - filter by partner type
```
Partner - 0
Sponsor - 1
```
* ordering (`str`) - set ordering by `partner_bind_date` field
##### Response
E.g.:
```
[
{
"id": 1,
...
}
]
```
### *POST*
#### Description
Create new partner
##### Request
Available:
* name (`str`) - partner name
* images (`list`) - array of an images
* type (`int`) - partner type
```
Partner - 0
Sponsor - 1
```
* country_id (`int`) - identifier of country
##### Response
E.g.:
```
{
"id": 1,
...
}
```
"""
queryset = Partner.objects.with_base_related()
serializer_class = serializers.BackPartnerSerializer
pagination_class = None
filter_class = filters.PartnerFilterSet
permission_classes = get_permission_classes(
IsEstablishmentManager,
IsEstablishmentAdministrator
)
class EstablishmentPartners(generics.ListAPIView):
"""
## List view
### *GET*
#### Description
Return non-paginated list of establishment partners
by `establishment slug`.
Ordering by a field - `partner_bind_date` (descending).
Available ordering fields: `__all__`
Available filters:
* type (`int`) - partner type
```
Partner - 0
Sponsor - 1
```
#### Response
E.g.:
```
{
"id": 1,
...
}
```
"""
queryset = PartnerToEstablishment.objects.with_base_related()
serializer_class = serializers.PartnersForEstablishmentSerializer
pagination_class = None
filter_class = filters.PartnerToEstablishmentFilterSet
filter_backends = (OrderingFilter, DjangoFilterBackend)
ordering_fields = '__all__'
ordering = '-partner_bind_date'
permission_classes = get_permission_classes(
IsEstablishmentManager,
IsEstablishmentAdministrator
)
def get_queryset(self):
return super().get_queryset().filter(establishment=self.kwargs['establishment_id'])
class PartnerRUDView(generics.RetrieveUpdateDestroyAPIView):
"""
## Retrieve/Update/Destroy view
### *GET*
#### Description
Return serialized object of partner
##### Response
E.g.:
```
{
"id": 1,
...
}
```
### *PUT*/*PATCH*
#### Description
Completely/Partially update a partner object.
##### Request
Available:
* name (`str`) - partner name
* images (`list`) - array of images
* type (`int`) - partner type
```
Partner - 0
Sponsor - 1
```
* country_id (`int`) - identifier of country
##### Response
E.g.:
```
{
"id": 1,
...
}
```
### *DELETE*
#### Description
Delete a partner
##### Response
E.g.:
```
No content
```
"""
queryset = Partner.objects.with_base_related()
serializer_class = serializers.BackPartnerSerializer
lookup_field = 'id'
permission_classes = get_permission_classes(
IsEstablishmentManager,
IsEstablishmentAdministrator
)
class PartnerPicturesListView(generics.RetrieveAPIView):
lookup_field = 'id'
serializer_class = serializers.PartnerPicturesSerializer
queryset = Partner.objects.with_base_related()
permission_classes = get_permission_classes(
IsEstablishmentManager,
IsEstablishmentAdministrator
)
class BindPartnerToEstablishmentView(generics.CreateAPIView):
"""
## Binding a partner to establishment
### *POST*
#### Description
Bind existing partner to an establishment.
##### Request
In `URL kwargs`:
* partner_id (`int`) - identifier of a partner
* establishment_id (`int`) - identifier of an establishment
##### Response
E.g.:
```
{
"id": 1,
...
}
```
"""
serializer_class = serializers.PartnersForEstablishmentSerializer
permission_classes = get_permission_classes(
IsEstablishmentManager,
IsEstablishmentAdministrator
)
class UnbindPartnerFromEstablishmentView(generics.DestroyAPIView):
"""
## Unbinding a partner from establishment
### *DELETE*
#### Description
Unbind an existing partner from an establishment.
##### Request
In `URL kwargs`:
* partner_id (`int`) - identifier of a partner
* establishment_id (`int`) - identifier of an establishment
##### Response
```
No content
```
"""
serializer_class = serializers.PartnersForEstablishmentSerializer
permission_classes = get_permission_classes(
IsEstablishmentManager,
IsEstablishmentAdministrator
)
def get_object(self):
return get_object_or_404(PartnerToEstablishment, pk=self.kwargs['bind_id'])