Skip to content

Commit

Permalink
WIP for raw queries
Browse files Browse the repository at this point in the history
  • Loading branch information
oharsta committed Jan 31, 2025
1 parent 9f28e7f commit 9906361
Show file tree
Hide file tree
Showing 2 changed files with 75 additions and 15 deletions.
86 changes: 72 additions & 14 deletions apps/queries/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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,

Check warning

Code scanning / Bandit

Possible SQL injection vector through string-based query construction. Warning

Possible SQL injection vector through string-based query construction.
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,
Expand All @@ -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)
4 changes: 3 additions & 1 deletion apps/queries/api_urls.py
Original file line number Diff line number Diff line change
@@ -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'),

]

0 comments on commit 9906361

Please sign in to comment.