diff --git a/apps/queries/api.py b/apps/queries/api.py index 788e4e86..bc3b6516 100644 --- a/apps/queries/api.py +++ b/apps/queries/api.py @@ -3,8 +3,23 @@ from rest_framework.response import Response from rest_framework.views import APIView +from directaward.models import DirectAward from mainsite.permissions import TeachPermission +permissions_query = """ +( + (exists (select 1 from staff_institutionstaff insst where insst.institution_id = ins.id and insst.user_id = %(u_id)s and insst.may_award = 1)) + or + (exists (select 1 from staff_facultystaff facst where facst.faculty_id = f.id and facst.user_id = %(u_id)s and facst.may_award = 1)) + or + (exists (select 1 from staff_issuerstaff issst where issst.issuer_id = i.id and issst.user_id = %(u_id)s and issst.may_award = 1)) + or + (exists (select 1 from staff_badgeclassstaff bcst where bcst.badgeclass_id = bc.id and bcst.user_id = %(u_id)s and bcst.may_award = 1)) + or + (exists (select 1 from users us where us.id = %(u_id)s and us.is_superuser = 1)) +) +""" + def dict_fetch_all(cursor): desc = cursor.description @@ -17,9 +32,11 @@ class DirectAwards(APIView): permission_classes = (TeachPermission,) def get(self, request, **kwargs): - + unclaimed = request.GET.get("status", "unclaimed") == "unclaimed" + status_param = [DirectAward.STATUS_UNACCEPTED, DirectAward.STATUS_SCHEDULED] if unclaimed else [ + DirectAward.STATUS_DELETED] with connection.cursor() as cursor: - cursor.execute(""" + cursor.execute(f""" select da.created_at, da.resend_at, da.delete_at, da.recipient_email as recipientEmail, da.eppn, da.entity_id as entityId, bc.name, bc.entity_id as bc_entity_id, i.name_english as i_name_english, i.name_dutch as i_name_dutch, i.entity_id as i_entity_id, @@ -30,17 +47,58 @@ def get(self, request, **kwargs): inner join issuer_issuer i on i.id = bc.issuer_id inner join institution_faculty f on f.id = i.faculty_id inner join institution_institution ins on ins.id = f.institution_id -where ins.id = %(ins_id)s and -( - (exists (select 1 from staff_institutionstaff insst where insst.institution_id = ins.id and insst.user_id = %(u_id)s and insst.may_award = 1)) - or - (exists (select 1 from staff_facultystaff facst where facst.faculty_id = f.id and facst.user_id = %(u_id)s and facst.may_award = 1)) - or - (exists (select 1 from staff_issuerstaff issst where issst.issuer_id = i.id and issst.user_id = %(u_id)s and issst.may_award = 1)) - or - (exists (select 1 from staff_badgeclassstaff bcst where bcst.badgeclass_id = bc.id and bcst.user_id = %(u_id)s and bcst.may_award = 1)) - or - (exists (select 1 from users us where us.id = %(u_id)s and us.is_superuser = 1)) -) ; +where ins.id = %(ins_id)s and da.status in %(status)s and {permissions_query} ; +""", {"ins_id": request.user.institution.id, "u_id": request.user.id, "status": status_param}) + return Response(dict_fetch_all(cursor), status=status.HTTP_200_OK) + + +class BadgeClasses(APIView): + permission_classes = (TeachPermission,) + + def get(self, request, **kwargs): + with connection.cursor() as cursor: + cursor.execute(""" +select bc.created_at, bc.name, bc.image, bc.entity_id, bc.archived, bc.image, bc.entity_id as bc_entity_id, + bc.badge_class_type, + i.name_english as i_name_english, i.name_dutch as i_name_dutch, i.entity_id as i_entity_id, + i.image_dutch as i_image_dutch, i.image_english as i_image_english, + f.name_english as f_name_english, f.name_dutch as f_name_dutch, f.entity_id as f_entity_id, + f.on_behalf_of, f.on_behalf_of_display_name, f.image_dutch as f_image_dutch, f.image_english as f_image_english, + (SELECT GROUP_CONCAT(DISTINCT isbt.name) FROM institution_badgeclasstag isbt + INNER JOIN issuer_badgeclass_tags ibt ON ibt.badgeclasstag_id = isbt.id + WHERE ibt.badgeclass_id = bc.id) AS tags, + (select count(id) from issuer_badgeinstance WHERE badgeclass_id = bc.id AND award_type = 'requested') as count_requested, + (select count(id) from issuer_badgeinstance WHERE badgeclass_id = bc.id AND award_type = 'direct_award') as count_direct_award, + (select 1 from staff_institutionstaff insst where insst.institution_id = ins.id and insst.user_id = %(u_id)s and insst.may_award = 1) as ins_staff, + (select 1 from staff_facultystaff facst where facst.faculty_id = f.id and facst.user_id = %(u_id)s and facst.may_award = 1) as fac_staff, + (select 1 from staff_issuerstaff issst where issst.issuer_id = i.id and issst.user_id = %(u_id)s and issst.may_award = 1) as iss_staff, + (select 1 from staff_badgeclassstaff bcst where bcst.badgeclass_id = bc.id and bcst.user_id = %(u_id)s and bcst.may_award = 1) as bc_staff +from issuer_badgeclass bc +inner join issuer_issuer i on i.id = bc.issuer_id +inner join institution_faculty f on f.id = i.faculty_id +inner join institution_institution ins on ins.id = f.institution_id +where ins.id = %(ins_id)s ; """, {"ins_id": request.user.institution.id, "u_id": request.user.id}) return Response(dict_fetch_all(cursor), status=status.HTTP_200_OK) + + +class CatalogBadgeClasses(APIView): + + def get(self, request, **kwargs): + with connection.cursor() as cursor: + cursor.execute(""" +select bc.created_at, bc.name, bc.image, bc.entity_id, bc.archived, bc.image, bc.entity_id as bc_entity_id, + bc.badge_class_type, + i.name_english as i_name_english, i.name_dutch as i_name_dutch, i.entity_id as i_entity_id, + i.image_dutch as i_image_dutch, i.image_english as i_image_english, + f.name_english as f_name_english, f.name_dutch as f_name_dutch, f.entity_id as f_entity_id, + f.on_behalf_of, f.on_behalf_of_display_name, f.image_dutch as f_image_dutch, f.image_english as f_image_english, + ins.name_english as ins_name_english, ins.name_dutch as ins_name_dutch, ins.entity_id as ins_entity_id, + ins.institution_type +from issuer_badgeclass bc +inner join issuer_issuer i on i.id = bc.issuer_id +inner join institution_faculty f on f.id = i.faculty_id +inner join institution_institution ins on ins.id = f.institution_id +where bc.is_private = 0; + """, {}) + return Response(dict_fetch_all(cursor), status=status.HTTP_200_OK) diff --git a/apps/queries/api_urls.py b/apps/queries/api_urls.py index 25129a74..7644770e 100644 --- a/apps/queries/api_urls.py +++ b/apps/queries/api_urls.py @@ -1,8 +1,10 @@ from django.conf.urls import url -from queries.api import DirectAwards +from queries.api import DirectAwards, BadgeClasses, CatalogBadgeClasses urlpatterns = [ url(r'^direct-awards', DirectAwards.as_view(), name='api_queries_da'), + url(r'^badge-classes', BadgeClasses.as_view(), name='api_queries_bc'), + url(r'^catalog/badge-classes', CatalogBadgeClasses.as_view(), name='api_queries_bc'), ]