Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
50 changes: 48 additions & 2 deletions api/functions/generate_enums.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import graphene
import enum
from sqlalchemy.orm import load_only
from model_enums import create_enum_app, create_enum_db
from models import (
Expand Down Expand Up @@ -40,9 +41,54 @@ def create_enums(Table, enum_name, column):
enum_dict.update({select[1]: select[1]})

if not len(enum_dict):
return graphene.Enum(enum_name, 'EMPTY')
ret_enum = enum.Enum(enum_name, 'EMPTY')
else:
return graphene.Enum(enum_name, enum_dict)
ret_enum = enum.Enum(enum_name, enum_dict)

return graphene.Enum.from_enum(ret_enum)


def create_enum_with_descriptions(Table, enum_name, enum_column, description_column):
Comment thread
nsdeschenes marked this conversation as resolved.
"""
Function to allow the creation of enums with descriptions for various uses. Function takes in SQLAlchemy Model,
and the Column that you would like your enums to be created. The value of the enum is equal to that of the name
"""
app = create_enum_app()
db = create_enum_db(app)

with app.app_context():
query = db.session.query(Table).options(load_only(enum_column))
rows = db.session.execute(query).fetchall()

enum_dict = dict()

for select in rows:
enum_dict.update({select[1]: select[1]})

if not len(enum_dict):
ret_enum = enum.Enum(enum_name, 'EMPTY')
else:
ret_enum = enum.Enum(enum_name, enum_dict)

description_dict = dict()

for e in ret_enum:
with app.app_context():
query = db.session.query(Table).filter(getattr(Table, enum_column) == e.name).options(load_only(description_column))
row = db.session.execute(query).first()

try:
description_dict.update({e.name: row[1]})
except:
description_dict.update({e.name: "Error loading description"})
Comment thread
nsdeschenes marked this conversation as resolved.

@property
def description(self):
return description_dict.get(self.name)

setattr(ret_enum, 'description', description)

return graphene.Enum.from_enum(ret_enum)

# Example of how to create enums for a given table
# from functions.generate_enums import create_enums
Expand Down
4 changes: 4 additions & 0 deletions api/model_enums/organiztions.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
from models import Organizations
from functions.generate_enums import create_enum_with_descriptions

OrganizationsEnum = create_enum_with_descriptions(Organizations, 'OrganizationsEnum', 'organization', 'description')
28 changes: 27 additions & 1 deletion api/queries.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,13 @@

from model_enums.sectors import SectorEnums, ZoneEnums
from model_enums.groups import GroupEnums
from model_enums.organiztions import OrganizationsEnum

from schemas.user import *

from schemas.sectors import Sectors
from schemas.groups import Groups
from schemas.organizations import Organizations


from resolvers.sectors import (
Expand All @@ -26,6 +28,12 @@
resolve_get_group_by_sector
)

from resolvers.organizations import (
resolve_get_org_by_id,
resolve_get_org_by_org,
resolve_get_orgs_by_group
)


class Query(graphene.ObjectType):
"""The central gathering point for all of the GraphQL queries."""
Expand Down Expand Up @@ -54,7 +62,7 @@ class Query(graphene.ObjectType):
)
get_group_by_id = graphene.List(
of_type=Groups,
id=graphene.Argument(graphene.Int, required=False),
id=graphene.Argument(graphene.Int, required=True),
resolver=resolve_get_group_by_id,
description="Allows selection of a group from a given group ID"
)
Expand All @@ -70,6 +78,24 @@ class Query(graphene.ObjectType):
resolver=resolve_get_group_by_sector,
description="Allows selection of groups from a given sector enum"
)
get_org_by_id = graphene.List(
of_type=Organizations,
id=graphene.Argument(graphene.Int, required=True),
resolver=resolve_get_org_by_id,
description="Allows the selection of an organization from a given ID"
)
get_org_by_org = graphene.List(
of_type=Organizations,
org=graphene.Argument(OrganizationsEnum, required=True),
resolver=resolve_get_org_by_org,
description="Allows the selection of an organization from its given organization code"
Comment thread
nsdeschenes marked this conversation as resolved.
)
get_org_by_group = graphene.List(
of_type=Organizations,
group=graphene.Argument(GroupEnums, required=True),
resolver=resolve_get_orgs_by_group,
description="Allows the selection of organizations from a given group"
)

generate_otp_url = String(email=String(required=True))

Expand Down
53 changes: 53 additions & 0 deletions api/resolvers/organizations.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
from graphql import GraphQLError
from sqlalchemy.orm import load_only

from schemas.organizations import (
Organizations,
OrganizationsModel
)

from schemas.groups import (
Groups,
GroupsModel
)


# Resolvers
def resolve_get_org_by_id(self, info, **kwargs):
"""Return an organization by its id"""
org_id = kwargs.get('id')
query = Organizations.get_query(info).filter(
OrganizationsModel.id == org_id
)
if not len(query.all()):
raise GraphQLError("Error, Invalid ID")
Comment thread
nsdeschenes marked this conversation as resolved.
return query.all()


def resolve_get_org_by_org(self, info, **kwargs):
"""Return an organization by its organization code"""
org_code = kwargs.get('org')
query = Organizations.get_query(info).filter(
OrganizationsModel.organization == org_code
)
if not len(query.all()):
raise GraphQLError("Error, Invalid Organization")
return query.all()


def resolve_get_orgs_by_group(self, info, **kwargs):
group = kwargs.get('group')
group_id = Groups.get_query(info).filter(
GroupsModel.s_group == group
).options(load_only('id'))

if not len(group_id.all()):
raise GraphQLError("Error, no group associated with that enum")

query = Organizations.get_query(info).filter(
OrganizationsModel.group_id == group_id
)

if not len(query.all()):
raise GraphQLError("Error, no organizations associated with that group")
return query.all()
22 changes: 16 additions & 6 deletions api/tests/test_groups_resolver.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,9 @@

from unittest import TestCase

import model_enums
model_enums._called_from_test = True

from app import app
from db import db
from models import Sectors, Groups
Expand All @@ -23,6 +26,9 @@ def group_test_resolver_db_init():
"""Build database for group resolver testing"""
db.init_app(app)

sector_added = False
group_added = False

with app.app_context():
if Sectors.query.first() is None:
sector = Sectors(
Expand All @@ -33,6 +39,7 @@ def group_test_resolver_db_init():
)
db.session.add(sector)
db.session.commit()
sector_added = True

if Groups.query.first() is None:
group = Groups(
Expand All @@ -43,14 +50,17 @@ def group_test_resolver_db_init():
)
db.session.add(group)
db.session.commit()
group_added = True

yield
yield

with app.app_context():
Groups.query.filter(Groups.id == 1).delete()
db.session.commit()
Sectors.query.filter(Sectors.id == 1).delete()
db.session.commit()
with app.app_context():
if group_added:
Groups.query.filter(Groups.id == 1).delete()
db.session.commit()
if sector_added:
Sectors.query.filter(Sectors.id == 1).delete()
db.session.commit()


@pytest.mark.usefixtures('group_test_resolver_db_init')
Expand Down
Loading