Browse Source

sync version added for updating data.

master
Mohsen Taba 5 months ago
parent
commit
623db0ca64
  1. 3
      apps/hadis/admin/__init__.py
  2. 29
      apps/hadis/admin/version.py
  3. 65
      apps/hadis/docs.py
  4. 26
      apps/hadis/migrations/0086_alter_opinionstatus_options_and_more.py
  5. 44
      apps/hadis/migrations/0087_contentrelease.py
  6. 3
      apps/hadis/models/__init__.py
  7. 13
      apps/hadis/models/version.py
  8. 3
      apps/hadis/serializers/__init__.py
  9. 16
      apps/hadis/serializers/version.py
  10. 2
      apps/hadis/urls.py
  11. 1
      apps/hadis/views/hadis.py
  12. 20
      apps/hadis/views/version.py

3
apps/hadis/admin/__init__.py

@ -1,4 +1,5 @@
from .category import *
from .hadis import *
from .transmitter import *
from .reference import *
from .reference import *
from .version import *

29
apps/hadis/admin/version.py

@ -0,0 +1,29 @@
from django.contrib import admin
from django.utils.translation import gettext_lazy as _
from unfold.admin import ModelAdmin
from utils.admin import project_admin_site
from ..models import ContentRelease
class ContentReleaseAdmin(ModelAdmin):
"""Admin for ContentRelease model"""
list_display = ('version_name', 'published_at', 'is_active')
list_filter = ('is_active', 'published_at')
search_fields = ('version_name', 'description')
readonly_fields = ('published_at',)
ordering = ('-published_at',)
fieldsets = (
(None, {
'fields': ('version_name', 'description', 'is_active')
}),
(_('Timestamps'), {
'fields': ('published_at',),
'classes': ('collapse',)
}),
)
# Register model with the custom admin site
project_admin_site.register(ContentRelease, ContentReleaseAdmin)

65
apps/hadis/docs.py

@ -2400,4 +2400,67 @@ hadis_main_list_swagger = swagger_auto_schema(
description="Internal server error occurred while processing the request"
)
}
)
)
# # Swagger documentation for ContentReleaseSyncView
# content_release_sync_swagger = swagger_auto_schema(
# operation_description="Get list of all active content releases for offline mode sync",
# operation_summary="List Content Releases",
# tags=[
# 'Hadis'
# ],
# responses={
# status.HTTP_200_OK: openapi.Response(
# description="List of active content releases with pagination info",
# examples={
# "application/json": {
# "count": 2,
# "results": [
# {
# "id": 1,
# "version_name": "v1.2 - Muharram Update",
# "published_at": "2024-01-15T10:30:00Z",
# "description": "New hadis content added for Muharram month",
# "is_active": True
# },
# {
# "id": 2,
# "version_name": "v1.1 - Initial Release",
# "published_at": "2024-01-01T00:00:00Z",
# "description": "Initial release of the hadis database",
# "is_active": True
# }
# ]
# }
# }
# ),
# status.HTTP_500_INTERNAL_SERVER_ERROR: openapi.Response(
# description="Internal server error"
# )
# }
# )
# Swagger documentation for ContentReleaseSyncView
content_release_sync_swagger = swagger_auto_schema(
operation_description='Get the latest active content release for offline mode sync',
operation_summary='Get Latest Content Release',
tags=['Hadis'],
responses={
status.HTTP_200_OK: openapi.Response(
description='Latest active content release object',
examples={
'application/json': {
'id': 1,
'version_name': 'v1.2 - Muharram Update',
'published_at': '2024-01-15T10:30:00Z',
'description': 'New hadis content added for Muharram month',
'is_active': True
}
}
),
status.HTTP_500_INTERNAL_SERVER_ERROR: openapi.Response(
description='Internal server error'
)
}
)

26
apps/hadis/migrations/0086_alter_opinionstatus_options_and_more.py

@ -0,0 +1,26 @@
# Generated by Django 4.2.27 on 2025-12-27 09:42
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
("hadis", "0085_hadistransmitter_hadis_hadis_hadis_i_d04e3a_idx_and_more"),
]
operations = [
migrations.AlterModelOptions(
name="opinionstatus",
options={
"verbose_name": "Opinion Status",
"verbose_name_plural": "Opinion Statuses",
},
),
migrations.AlterModelOptions(
name="transmitterreliability",
options={
"verbose_name": "Transmitter Reliability",
"verbose_name_plural": "Transmitter Reliabilities",
},
),
]

44
apps/hadis/migrations/0087_contentrelease.py

@ -0,0 +1,44 @@
# Generated by Django 4.2.27 on 2025-12-27 10:32
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("hadis", "0086_alter_opinionstatus_options_and_more"),
]
operations = [
migrations.CreateModel(
name="ContentRelease",
fields=[
(
"id",
models.BigAutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
(
"version_name",
models.CharField(max_length=50, verbose_name="Version Name"),
),
(
"published_at",
models.DateTimeField(
auto_now_add=True, verbose_name="Published Date"
),
),
(
"description",
models.TextField(blank=True, verbose_name="Release Description"),
),
("is_active", models.BooleanField(default=True, verbose_name="Active")),
],
options={
"ordering": ["-published_at"],
},
),
]

3
apps/hadis/models/__init__.py

@ -1,4 +1,5 @@
from .category import *
from .hadis import *
from .transmitter import *
from .reference import *
from .reference import *
from .version import *

13
apps/hadis/models/version.py

@ -0,0 +1,13 @@
from django.db import models
from django.utils.translation import gettext_lazy as _
class ContentRelease(models.Model):
version_name = models.CharField(max_length=50, verbose_name=_('Version Name')) # e.g., "v1.2 - Muharram Update"
published_at = models.DateTimeField(auto_now_add=True, verbose_name=_("Published Date"))
description = models.TextField(blank=True, verbose_name=_("Release Description"))
# Optional: is_active to easily rollback updates if something breaks
is_active = models.BooleanField(default=True, verbose_name=_("Active"))
class Meta:
ordering = ['-published_at']

3
apps/hadis/serializers/__init__.py

@ -1,2 +1,3 @@
from .category import *
from .hadis import *
from .hadis import *
from .version import *

16
apps/hadis/serializers/version.py

@ -0,0 +1,16 @@
from rest_framework import serializers
from ..models import ContentRelease
class ContentReleaseSyncSerializer(serializers.ModelSerializer):
"""Serializer for syncing content release data for offline mode"""
class Meta:
model = ContentRelease
fields = [
'id',
'version_name',
'published_at',
'description',
'is_active'
]

2
apps/hadis/urls.py

@ -3,6 +3,7 @@ from .views.category import HadisCategorySectListView, HadisCategoryTreeView, Ca
from .views.hadis import HadisCollectionListView, HadisListView, HadisBasicView, HadisDetailView, HadisSyncView, HadisTransmittersView, HadisCorrectionsView,HadisMainListView, HadisFiltersView
from .views.transmitter import TransmitterView ,TransmitterDetailView, TransmitterSyncView,TransmitterOpinionView, TransmitterOriginalTextView, TransmitterFiltersView
from .views.reference import BookDetailView, BookReferencesView, BookReferenceSyncView, BookAttributeView
from .views.version import ContentReleaseSyncView
from .views.info import HadisInfoView
from django.views.decorators.cache import cache_page
from django.views.decorators.vary import vary_on_headers
@ -20,6 +21,7 @@ urlpatterns = [
path('sync/hadis/', cached_view(HadisSyncView.as_view()), name='hadis-sync'),
path('sync/narrators/', cached_view(TransmitterSyncView.as_view()), name='transmitter-sync'),
path('sync/references/', cached_view(BookReferenceSyncView.as_view()), name='reference-sync'),
path('sync/version/', ContentReleaseSyncView.as_view(), name='content-release-sync'),
path('info/', cached_view(HadisInfoView.as_view()), name='hadis-info'),
# Category paths (more specific first)

1
apps/hadis/views/hadis.py

@ -116,6 +116,7 @@ class HadisMainListView(ListAPIView):
serializer_class = HadisListSerializer
pagination_class = PageNumberPagination
@hadis_main_list_swagger
def get(self, request, *args, **kwargs):
return self.list(request, *args, **kwargs)

20
apps/hadis/views/version.py

@ -0,0 +1,20 @@
from rest_framework.generics import RetrieveAPIView
from rest_framework.response import Response
from ..models import ContentRelease
from ..serializers import ContentReleaseSyncSerializer
from ..docs import content_release_sync_swagger
class ContentReleaseSyncView(RetrieveAPIView):
"""
API view to get the latest content release for offline mode sync
"""
serializer_class = ContentReleaseSyncSerializer
@content_release_sync_swagger
def get(self, request, *args, **kwargs):
return self.retrieve(request, *args, **kwargs)
def get_object(self):
return ContentRelease.objects.filter(is_active=True).order_by('-published_at').first()
Loading…
Cancel
Save