feat: add RBAC migrations, user modules, admin API updates, and utility scripts
This commit is contained in:
@@ -682,6 +682,8 @@ def _serialize_event(e):
|
||||
'isFeatured': bool(e.is_featured),
|
||||
'isTopEvent': bool(e.is_top_event),
|
||||
'source': e.source or 'eventify',
|
||||
'eventTypeId': e.event_type_id,
|
||||
'eventTypeName': e.event_type.event_type if e.event_type_id and e.event_type else '',
|
||||
}
|
||||
|
||||
|
||||
@@ -740,11 +742,13 @@ class EventListView(APIView):
|
||||
def get(self, request):
|
||||
from events.models import Event
|
||||
from django.db.models import Q
|
||||
qs = Event.objects.select_related('partner').all()
|
||||
qs = Event.objects.select_related('partner', 'event_type').all()
|
||||
if s := request.GET.get('status'):
|
||||
reverse_map = {v: k for k, v in _EVENT_STATUS_MAP.items()}
|
||||
backend_status = reverse_map.get(s, s)
|
||||
qs = qs.filter(event_status=backend_status)
|
||||
if etid := request.GET.get('event_type'):
|
||||
qs = qs.filter(event_type_id=etid)
|
||||
if pid := request.GET.get('partner_id'):
|
||||
qs = qs.filter(partner_id=pid)
|
||||
if q := request.GET.get('search'):
|
||||
@@ -2238,3 +2242,91 @@ class PartnerStaffCreateView(APIView):
|
||||
},
|
||||
status=status.HTTP_201_CREATED,
|
||||
)
|
||||
|
||||
|
||||
# ─── Gamification Dashboard (stub) ───────────────────────────────────────────
|
||||
class GamificationDashboardView(APIView):
|
||||
permission_classes = [] # public for now; restrict when auth is wired up
|
||||
|
||||
def get(self, request):
|
||||
user_id = request.GET.get('user_id', '')
|
||||
return Response({
|
||||
'status': 'success',
|
||||
'profile': {
|
||||
'user_id': user_id,
|
||||
'current_tier': 'BRONZE',
|
||||
'current_ep': 0,
|
||||
'current_rp': 0,
|
||||
'lifetime_ep': 0,
|
||||
},
|
||||
'submissions': [],
|
||||
})
|
||||
|
||||
|
||||
# ─── Gamification: Event Submission (stub) ────────────────────────────────────
|
||||
class GamificationSubmitEventView(APIView):
|
||||
permission_classes = []
|
||||
|
||||
def post(self, request):
|
||||
data = request.data
|
||||
return Response({
|
||||
'status': 'success',
|
||||
'submission': {
|
||||
'id': 1,
|
||||
'event_name': data.get('event_name', ''),
|
||||
'status': 'PENDING',
|
||||
'total_ep_awarded': 0,
|
||||
'created_at': __import__('datetime').datetime.now().isoformat(),
|
||||
},
|
||||
'message': 'Event submitted for review. You will earn EP once approved!',
|
||||
})
|
||||
|
||||
|
||||
# ─── Reward Shop: List Items (stub) ──────────────────────────────────────────
|
||||
class ShopItemsView(APIView):
|
||||
permission_classes = []
|
||||
|
||||
def get(self, request):
|
||||
return Response({
|
||||
'status': 'success',
|
||||
'items': [
|
||||
{
|
||||
'id': 1,
|
||||
'name': 'BookMyShow Voucher',
|
||||
'description': 'Get a Rs.100 BookMyShow gift card',
|
||||
'rp_cost': 50,
|
||||
'stock_quantity': 10,
|
||||
},
|
||||
{
|
||||
'id': 2,
|
||||
'name': 'Event Priority Listing',
|
||||
'description': 'Feature your next event at the top for 7 days',
|
||||
'rp_cost': 30,
|
||||
'stock_quantity': 5,
|
||||
},
|
||||
{
|
||||
'id': 3,
|
||||
'name': 'Eventify Merch Pack',
|
||||
'description': 'Exclusive stickers, badge & notebook',
|
||||
'rp_cost': 100,
|
||||
'stock_quantity': 3,
|
||||
},
|
||||
],
|
||||
})
|
||||
|
||||
|
||||
# ─── Reward Shop: Redeem (stub) ──────────────────────────────────────────────
|
||||
class ShopRedeemView(APIView):
|
||||
permission_classes = []
|
||||
|
||||
def post(self, request):
|
||||
import uuid
|
||||
item_id = request.data.get('item_id')
|
||||
return Response({
|
||||
'status': 'success',
|
||||
'voucher': {
|
||||
'item_id': item_id,
|
||||
'voucher_code_issued': 'EVF-' + uuid.uuid4().hex[:8].upper(),
|
||||
},
|
||||
'message': 'Reward redeemed successfully!',
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user