SpartaHack/SpartaHack-API

View on GitHub
common/json_schema.py

Summary

Maintainability
D
2 days
Test Coverage
from marshmallow import Schema,fields,ValidationError,validates_schema,validate
import ipaddress
import math
import string

"""
schema.dump = used for converting the automap.faqs object to a dictionary good for returning ie cleaning unnecessary fields
schema.validate(request.get_json(force=True)) = used to validate if all the data required for updating and creating the faq is present.4
dump_only = Fields that we need to display when returning the item
load_only = Fields that we need only while dumping from python objects. We use it to stop marshmallow from dumping it while using dump()
"""
def ip_test(obj):
    try:
        ipaddress.ip_address(obj)
        return True
    except ValueError:
        return False

def password_check(obj):
        if obj.password == obj.password_confirmation:
            return True

class Faq_Schema(Schema):
    id = fields.Integer()
    question = fields.String(required=True)
    answer = fields.String(required=True)
    display = fields.Boolean(required=True)
    priority = fields.Integer(required=True)
    placement = fields.String(required=True)
    user_id = fields.Integer()

class Announcement_Schema(Schema):
    id = fields.Integer()
    title = fields.String(required=True)
    description = fields.String(required=True)
    pinned = fields.Boolean(required=True)
    created_at = fields.DateTime(dump_only=True)
    updated_at = fields.DateTime(dump_only=True)

class Hardware_Schema(Schema):
    id = fields.Integer()
    item = fields.String(required=True)
    lender = fields.String(required=True)
    quantity = fields.String(required=True)
    created_at = fields.DateTime(load_only=True)
    updated_at = fields.DateTime(load_only=True)

class Sponsor_Schema(Schema):
    id = fields.Integer()
    name = fields.String(required=True)
    level = fields.String(required=True)
    url = fields.URL(required=True)
    logo_svg_light = fields.String(required=True)
    logo_svg_dark = fields.String()
    logo_png_light = fields.String(required=True)
    logo_png_dark = fields.String()
    created_at = fields.DateTime(load_only=True)
    updated_at = fields.DateTime(load_only=True)

class Schedule_Schema(Schema):
    id = fields.Integer()
    title = fields.String(required=True)
    description = fields.String(required=True)
    time = fields.DateTime(required=True)
    location = fields.String(required=True)
    created_at = fields.DateTime(load_only=True)
    updated_at = fields.DateTime(dump_only=True)

class Application_Schema(Schema):
    id = fields.Integer()
    user_id = fields.Integer()
    birth_day = fields.Integer(required=True)
    birth_month = fields.Integer(required=True)
    birth_year = fields.Integer(required=True)
    education = fields.String(required=True)
    university = fields.String()
    other_university = fields.String()
    travel_origin = fields.String()
    graduation_season = fields.String(required=True)
    graduation_year = fields.Integer(required=True)
    major = fields.List(fields.String())
    hackathons = fields.Integer(required=True)
    github = fields.URL(allow_none=True)
    linkedin = fields.URL(allow_none=True)
    website = fields.URL(allow_none=True)
    devpost = fields.URL(allow_none=True)
    other_link = fields.URL(allow_none=True)
    statement = fields.String()
    created_at = fields.DateTime()
    updated_at = fields.DateTime()
    race = fields.List(fields.String())
    gender = fields.String()
    outside_north_america = fields.String()
    status = fields.String()
    accepted_date = fields.DateTime()
    reimbursement = fields.Boolean(required=True)
    phone = fields.String(required=True)

class User_Schema(Schema):
    def role_convert(self,obj):
        roles = ["director","judge","mentor","sponsor","organizer","volunteer","hacker"]
        return roles[int(math.log(int(obj.role),2))]

    id = fields.Integer(dump_only=True)
    email = fields.Email(dump_only=True,required=True)
    encrypted_password = fields.String()
    reset_password_token = fields.String(dump_only=True)
    reset_password_sent_at = fields.DateTime()
    remember_created_at = fields.DateTime()
    auth_id = fields.String()
    current_sign_in_at = fields.DateTime()
    last_sign_in_at = fields.DateTime()
    current_sign_in_ip = fields.String(validate=ip_test)
    last_sign_in_ip = fields.String(validate=ip_test)
    created_at = fields.DateTime(dump_only=True)
    updated_at = fields.DateTime(dump_only=True)
    auth_token = fields.String(dump_only=True)
    confirmation_token = fields.String()
    confirmed_at = fields.DateTime()
    confirmation_sent_at = fields.DateTime()
    role = fields.Method("role_convert")
    first_name = fields.String(dump_only=True)
    last_name = fields.String(dump_only=True)
    checked_in = fields.Boolean(dump_only=True)

class User_Input_Schema(Schema):
    email = fields.String(required=True)
    first_name = fields.String(allow_none=True)
    last_name = fields.String(allow_none=True)
    auth_id = fields.String(required=True)
    ID_Token = fields.String(required=True)

    @validates_schema
    def check_all_fields(self,data, **kwargs):

        errors = {}
        try:
            validator = validate.Email()
            validator(data["email"])
        except ValidationError:
            errors["email"] = "Not an valid email!"

        #checking if first and last name have any special characters or numbers
        if (data.get("first_name") is not None and any(char in string.digits for char in data["first_name"])):
            errors["first_name"] = "Not a valid first name"

        if (data.get("first_name") is not None and any(char in string.digits for char in data["last_name"])):
            errors["last_name"] = "Not a valid last name"

        if errors:
            raise ValidationError(errors)

class User_Change_Role_Schema(Schema):
    role_change_password = fields.String()
    role = fields.String()
    email = fields.String()

    @validates_schema
    def check_all_fields(self,data, **kwargs):
        errors = {}

        try:
            validator = validate.Email()
            validator(data["email"])
        except ValidationError:
            errors["email"] = "Not an valid email!"

        if not data.get("role_change_password"):
            errors["role_change_pass"] = "Role change password required"

        if data["role"] not in ["director","judge","mentor","sponsor","organizer","volunteer","hacker"]:
            errors["role"] = "Not a valid role"

        if errors:
            raise ValidationError(errors)

class User_Reset_Password_Schema(Schema):
    password = fields.String()
    password_confirmation = fields.String()

    @validates_schema
    def check_all_fields(self,data, **kwargs):
        errors = {}

        if data.get("password") and data.get("password_confirmation") and data["password"] != data["password_confirmation"]:
            errors["password_confirmation"] = "Passsword and Confirm password don't match"

        if errors:
            raise ValidationError(errors)

class Sessions_Schema(Schema):
    email = fields.Email(required=True)
    ID_Token = fields.Str(required=True)

class RSVP_Schema(Schema):

    id = fields.Integer(dump_only=True)
    user_id = fields.Integer(dump_only=True)
    attending = fields.String(required=True)
    dietary_restrictions = fields.List(fields.String(),required=True)
    other_dietary_restrictions = fields.String(required=True)
    resume = fields.String(required=True)
    shirt_size = fields.String(required=True)
    carpool_sharing = fields.String(required=True)
    jobs = fields.String(required=True)

class Authorize_Schema(Schema):
    ID_token = fields.Str(required=True)