|
|
|
@ -12,7 +12,8 @@ from utils.pagination import StandardResultsSetPagination, OptionalPagination |
|
|
|
from .models import ( |
|
|
|
Hadis, HadisCategory, HadisCollection, HadisInCollection, HadisCorrection, HadisInterpretation, HadisStatus, HadisTag, HadisSect, HadisTransmitter, |
|
|
|
BookReference, BookReferenceImage, BookReferenceDocument, BookAuthor, BookAttribute, BookSubjectArea, BookType, BookTag, BookEdition, BookVolume, |
|
|
|
Transmitters, TransmitterReliability, NarratorLayer, OpinionStatus, TransmitterOpinion, TransmitterOriginalText |
|
|
|
Transmitters, TransmitterReliability, NarratorLayer, OpinionStatus, TransmitterOpinion, TransmitterOriginalText, |
|
|
|
ContentRelease |
|
|
|
) |
|
|
|
from .serializers.serializers_admin import ( |
|
|
|
AdminHadisCategorySerializer, |
|
|
|
@ -46,6 +47,7 @@ from .serializers.serializers_admin import ( |
|
|
|
AdminTransmitterOriginalTextSerializer, |
|
|
|
AdminBookEditionSerializer, |
|
|
|
AdminBookVolumeSerializer, |
|
|
|
AdminContentReleaseSerializer, |
|
|
|
) |
|
|
|
|
|
|
|
|
|
|
|
@ -805,3 +807,89 @@ class AdminBookVolumeViewSet(ModelViewSet): |
|
|
|
else: |
|
|
|
queryset = queryset.filter(edition_id=edition_id) |
|
|
|
return queryset.order_by("title", "id") |
|
|
|
|
|
|
|
|
|
|
|
import re |
|
|
|
|
|
|
|
def compute_next_version(current_version_str: str) -> str: |
|
|
|
""" |
|
|
|
Increments the last integer part of a version string. |
|
|
|
Examples: |
|
|
|
'V 0.51' -> 'V 0.52' |
|
|
|
'V0.5' -> 'V0.6' |
|
|
|
'1.0.0' -> '1.0.1' |
|
|
|
'1' -> '2' |
|
|
|
'v1.9' -> 'v1.10' |
|
|
|
""" |
|
|
|
if not current_version_str or not str(current_version_str).strip(): |
|
|
|
return "V 1.0" |
|
|
|
|
|
|
|
matches = list(re.finditer(r'\d+', str(current_version_str))) |
|
|
|
if not matches: |
|
|
|
return f"{str(current_version_str).strip()} 2" |
|
|
|
|
|
|
|
last_match = matches[-1] |
|
|
|
start, end = last_match.span() |
|
|
|
num_str = last_match.group() |
|
|
|
next_num = int(num_str) + 1 |
|
|
|
|
|
|
|
if len(num_str) > 1 and num_str.startswith('0'): |
|
|
|
formatted_num = str(next_num).zfill(len(num_str)) |
|
|
|
else: |
|
|
|
formatted_num = str(next_num) |
|
|
|
|
|
|
|
return str(current_version_str)[:start] + formatted_num + str(current_version_str)[end:] |
|
|
|
|
|
|
|
|
|
|
|
class AdminContentReleaseViewSet(ModelViewSet): |
|
|
|
serializer_class = AdminContentReleaseSerializer |
|
|
|
permission_classes = [IsAuthenticated, IsSuperAdmin] |
|
|
|
authentication_classes = [TokenAuthentication] |
|
|
|
pagination_class = None |
|
|
|
|
|
|
|
def get_queryset(self): |
|
|
|
return ContentRelease.objects.all().order_by("-published_at", "-id") |
|
|
|
|
|
|
|
def list(self, request, *args, **kwargs): |
|
|
|
queryset = self.get_queryset() |
|
|
|
current_release = queryset.filter(is_active=True).first() |
|
|
|
current_data = self.get_serializer(current_release).data if current_release else None |
|
|
|
|
|
|
|
current_ver_name = current_release.version_name if current_release else "V 0.5" |
|
|
|
next_suggested = compute_next_version(current_ver_name) |
|
|
|
|
|
|
|
history_data = self.get_serializer(queryset[:50], many=True).data |
|
|
|
|
|
|
|
return Response({ |
|
|
|
"current_version": current_data, |
|
|
|
"next_suggested_version": next_suggested, |
|
|
|
"history": history_data |
|
|
|
}) |
|
|
|
|
|
|
|
@action(detail=False, methods=["post"], url_path="increment") |
|
|
|
def increment(self, request): |
|
|
|
current_release = self.get_queryset().filter(is_active=True).first() |
|
|
|
current_ver_name = current_release.version_name if current_release else "V 0.5" |
|
|
|
|
|
|
|
version_name = request.data.get("version_name") |
|
|
|
if not version_name or not str(version_name).strip(): |
|
|
|
version_name = compute_next_version(current_ver_name) |
|
|
|
else: |
|
|
|
version_name = str(version_name).strip() |
|
|
|
|
|
|
|
description = request.data.get("description", "") or "" |
|
|
|
|
|
|
|
# Create new content release |
|
|
|
new_release = ContentRelease.objects.create( |
|
|
|
version_name=version_name, |
|
|
|
description=description, |
|
|
|
is_active=True |
|
|
|
) |
|
|
|
|
|
|
|
return Response({ |
|
|
|
"status": "success", |
|
|
|
"message": f"Version incremented to {version_name}", |
|
|
|
"release": self.get_serializer(new_release).data, |
|
|
|
"next_suggested_version": compute_next_version(version_name) |
|
|
|
}) |
|
|
|
|