Beispiel #1
0
class TaxSchemaPublic(Schema):
    class Meta:
        type_ = 'tax'
        self_view = 'v1.tax_detail'
        self_view_kwargs = {'id': '<id>'}
        inflect = dasherize

    id = fields.Str(dump_only=True)
    name = fields.Str(required=True)
    rate = fields.Float(validate=lambda n: 0 <= n <= 100, required=True)
    is_tax_included_in_price = fields.Boolean(default=False)
    event = Relationship(attribute='event',
                         self_view='v1.tax_event',
                         self_view_kwargs={'id': '<id>'},
                         related_view='v1.event_detail',
                         related_view_kwargs={'tax_id': '<id>'},
                         schema='EventSchemaPublic',
                         type_='event')
class DiscountCodeSchemaPublic(SoftDeletionSchema):
    """
    API Schema for discount_code Model
    For endpoints which allow somebody other than co-organizer/admin to access the resource.
    """
    class Meta:
        type_ = 'discount-code'
        self_view = 'v1.discount_code_detail'
        self_view_kwargs = {'id': '<id>'}
        inflect = dasherize

    id = fields.Integer()
    code = fields.Str(required=True)
    discount_url = fields.Url(allow_none=True)
    value = fields.Float(required=True)
    type = fields.Str(validate=validate.OneOf(choices=["amount", "percent"]),
                      required=True)
    is_active = fields.Boolean()
    tickets_number = fields.Integer(validate=lambda n: n >= 0, allow_none=True)
    min_quantity = fields.Integer(validate=lambda n: n >= 0, allow_none=True)
    max_quantity = fields.Integer(validate=lambda n: n >= 0, allow_none=True)
    valid_from = fields.DateTime(allow_none=True)
    valid_till = fields.DateTime(allow_none=True)
    used_for = fields.Str(validate=validate.OneOf(choices=["event", "ticket"]),
                          allow_none=False)
    created_at = fields.DateTime(allow_none=True)

    event = Relationship(attribute='event',
                         self_view='v1.discount_code_event',
                         self_view_kwargs={'id': '<id>'},
                         related_view='v1.event_detail',
                         related_view_kwargs={'discount_code_id': '<id>'},
                         schema='EventSchemaPublic',
                         type_='event')

    @classmethod
    def quantity_validation_helper(obj, data):
        min_quantity = data.get('min_quantity', None)
        max_quantity = data.get('max_quantity', None)
        if min_quantity is not None and max_quantity is not None:
            if min_quantity > max_quantity:
                raise UnprocessableEntity(
                    {'pointer': '/data/attributes/min-quantity'},
                    "min-quantity cannot be more than max-quantity")
Beispiel #3
0
class FeedbackSchema(SoftDeletionSchema):
    """
    Api schema for Feedback Model
    """
    class Meta:
        """
        Meta class for Feedback Api Schema
        """

        type_ = 'feedback'
        self_view = 'v1.feedback_detail'
        self_view_kwargs = {'id': '<id>'}
        inflect = dasherize

    id = fields.Str(dump_only=True)
    rating = fields.Float(required=True, validate=Range(min=1, max=5))
    comment = fields.Str(required=False)
    event = Relationship(
        attribute='event',
        self_view='v1.feedback_event',
        self_view_kwargs={'id': '<id>'},
        related_view='v1.event_detail',
        related_view_kwargs={'feedback_id': '<id>'},
        schema='EventSchemaPublic',
        type_='event',
    )
    session = Relationship(
        attribute='session',
        self_view='v1.feedback_session',
        self_view_kwargs={'id': '<id>'},
        related_view='v1.session_detail',
        related_view_kwargs={'feedback_id': '<id>'},
        schema='SessionSchema',
        type_='session',
    )
    user = Relationship(
        attribute='user',
        self_view='v1.feedback_user',
        self_view_kwargs={'id': '<id>'},
        related_view='v1.user_detail',
        related_view_kwargs={'feedback_id': '<id>'},
        schema='UserSchema',
        type_='user',
    )
Beispiel #4
0
class ConsumptionSchema(Schema):
    id = fields.String(dump_only=True)
    consuming_size = fields.Float()
    consuming_unit = fields.String()
    consuming_date = fields.DateTime(dump_only=True)

    inventory = fields.Relationship(
        related_url='/inventories/{inventory_id}',
        related_url_kwargs={'inventory_id': '<id>'},
        many=False,
        schema=inventories.InventorySchema,
        include_resource_linkage=True,
        type_='inventories',
        dump_only=True)
    stock = fields.Relationship(related_url='/stocks/{stock_id}',
                                related_url_kwargs={'stock_id': '<id>'},
                                many=False,
                                schema=stocks.StockSchema,
                                include_resource_linkage=True,
                                type_='stocks',
                                dump_only=True)
    item = fields.Relationship(related_url='/items/{item_id}',
                               related_url_kwargs={'item_id': '<id>'},
                               many=False,
                               schema=items.ItemSchema,
                               include_resource_linkage=True,
                               type_='items',
                               dump_only=True)
    consumer = fields.Relationship(related_url='/users/{user_id}',
                                   related_url_kwargs={'user_id': '<id>'},
                                   many=False,
                                   schema=common.UserSchema,
                                   include_resource_linkage=True,
                                   type_='users',
                                   dump_only=True)
    status = fields.String()

    class Meta:
        type_ = 'consumptions'
        strict = True
        inflect = common.dasherize
Beispiel #5
0
class ActorsSchema(Schema):
    id = fields.Integer(dump_only=True)
    aka = fields.String()
    biography = fields.String()
    birthday = fields.String()
    deathday = fields.String()
    gender = fields.String()
    homepage = fields.String()
    tmdbid = fields.String()
    imdbid = fields.String()
    name = fields.String()
    place_of_birth = fields.String()
    popularity = fields.Float()
    profile_pic = fields.String()

    movies = fields.Nested('MoviesSchema',
                           many=True,
                           exclude=('actors', ),
                           only=('id', 'title', 'poster', 'year'),
                           dump_to='known_for')

    class Meta:
        type_ = 'actor'
        ordered = True
Beispiel #6
0
class RouteSchema(Schema):

    not_blank = validate.Length(min=1, error='Field cannot be blank')
    # add validate=not_blank in required fields
    id = fields.Integer(required=True)
    name = fields.String(required=True)
    length_in_meters = fields.Float(required=True)
    elevation_gain_in_meters = fields.Float(required=True)
    start_lat = fields.Float(required=True)
    start_lon = fields.Float(required=True)
    end_lat = fields.Float(required=True)
    end_lon = fields.Float(required=True)
    route_type = fields.Integer(required=True)
    sub_type = fields.Integer(required=True)
    popularity = fields.Float(required=True)

    # self links
    def get_top_level_links(self, data, many):
        return {'error': False, 'self': "/api/v2/routes/query"}

    #The below type object is a resource identifier object as per http://jsonapi.org/format/#document-resource-identifier-objects
    class Meta:
        type_ = 'route'
class SessionSchema(SoftDeletionSchema):
    """
    Api schema for Session Model
    """
    class Meta:
        """
        Meta class for Session Api Schema
        """

        type_ = 'session'
        self_view = 'v1.session_detail'
        self_view_kwargs = {'id': '<id>'}
        inflect = dasherize

    @validates_schema(pass_original=True)
    def validate_fields(self, data, original_data):
        is_patch_request = 'id' in original_data['data']
        if is_patch_request:
            try:
                session = Session.query.filter_by(
                    id=original_data['data']['id']).one()
            except NoResultFound:
                raise ObjectNotFound({'parameter': '{id}'},
                                     "Session: not found")

            if 'starts_at' not in data:
                data['starts_at'] = session.starts_at

            if 'ends_at' not in data:
                data['ends_at'] = session.ends_at

            if 'event' not in data:
                data['event'] = session.event_id

        if data['starts_at'] and data['ends_at']:
            if data['starts_at'] >= data['ends_at']:
                raise UnprocessableEntityError(
                    {'pointer': '/data/attributes/ends-at'},
                    "ends-at should be after starts-at",
                )
            if not is_patch_request and datetime.timestamp(
                    data['starts_at']) <= datetime.timestamp(datetime.now()):
                raise UnprocessableEntityError(
                    {'pointer': '/data/attributes/starts-at'},
                    "starts-at should be after current date-time",
                )

        if 'state' in data:
            if data['state'] not in ('draft', 'pending'):
                if not has_access('is_coorganizer', event_id=data['event']):
                    raise ForbiddenError({'source': ''},
                                         'Co-organizer access is required.')

        if 'track' in data:
            if not has_access('is_coorganizer', event_id=data['event']):
                raise ForbiddenError({'source': ''},
                                     'Co-organizer access is required.')

        if 'microlocation' in data:
            if not has_access('is_coorganizer', event_id=data['event']):
                raise ForbiddenError({'source': ''},
                                     'Co-organizer access is required.')

        validate_complex_fields_json(self, data, original_data)

    id = fields.Str(dump_only=True)
    title = fields.Str(required=True)
    subtitle = fields.Str(allow_none=True)
    level = fields.Str(allow_none=True)
    short_abstract = fields.Str(allow_none=True)
    long_abstract = fields.Str(allow_none=True)
    comments = fields.Str(allow_none=True)
    starts_at = fields.DateTime(allow_none=True)
    ends_at = fields.DateTime(allow_none=True)
    language = fields.Str(allow_none=True)
    slides_url = fields.Url(allow_none=True)
    video_url = fields.Url(allow_none=True)
    audio_url = fields.Url(allow_none=True)
    signup_url = fields.Url(allow_none=True)
    state = fields.Str(
        validate=validate.OneOf(
            choices=["pending", "accepted", "confirmed", "rejected", "draft"]),
        allow_none=True,
        default='draft',
    )
    created_at = fields.DateTime(dump_only=True)
    deleted_at = fields.DateTime(dump_only=True)
    submitted_at = fields.DateTime(allow_none=True)
    is_mail_sent = fields.Boolean()
    is_locked = fields.Boolean(default=False)
    last_modified_at = fields.DateTime(dump_only=True)
    send_email = fields.Boolean(load_only=True, allow_none=True)
    average_rating = fields.Float(dump_only=True)
    complex_field_values = CustomFormValueField(allow_none=True)
    microlocation = Relationship(
        attribute='microlocation',
        self_view='v1.session_microlocation',
        self_view_kwargs={'id': '<id>'},
        related_view='v1.microlocation_detail',
        related_view_kwargs={'session_id': '<id>'},
        schema='MicrolocationSchema',
        type_='microlocation',
    )
    track = Relationship(
        attribute='track',
        self_view='v1.session_track',
        self_view_kwargs={'id': '<id>'},
        related_view='v1.track_detail',
        related_view_kwargs={'session_id': '<id>'},
        schema='TrackSchema',
        type_='track',
    )
    session_type = Relationship(
        attribute='session_type',
        self_view='v1.session_session_type',
        self_view_kwargs={'id': '<id>'},
        related_view='v1.session_type_detail',
        related_view_kwargs={'session_id': '<id>'},
        schema='SessionTypeSchema',
        type_='session-type',
    )
    event = Relationship(
        attribute='event',
        self_view='v1.session_event',
        self_view_kwargs={'id': '<id>'},
        related_view='v1.event_detail',
        related_view_kwargs={'session_id': '<id>'},
        schema='EventSchemaPublic',
        type_='event',
    )
    feedbacks = Relationship(
        attribute='feedbacks',
        self_view='v1.session_feedbacks',
        self_view_kwargs={'id': '<id>'},
        related_view='v1.feedback_list',
        related_view_kwargs={'session_id': '<id>'},
        schema='FeedbackSchema',
        many=True,
        type_='feedback',
    )
    speakers = Relationship(
        attribute='speakers',
        many=True,
        self_view='v1.session_speaker',
        self_view_kwargs={'id': '<id>'},
        related_view='v1.speaker_list',
        related_view_kwargs={'session_id': '<id>'},
        schema='SpeakerSchema',
        type_='speaker',
    )
    creator = Relationship(
        attribute='user',
        self_view='v1.session_user',
        self_view_kwargs={'id': '<id>'},
        related_view='v1.user_detail',
        related_view_kwargs={'session_id': '<id>'},
        schema='UserSchemaPublic',
        type_='user',
    )
Beispiel #8
0
class OrderSchema(Schema):
    class Meta:
        type_ = 'order'
        self_view = 'v1.order_detail'
        self_view_kwargs = {'order_identifier': '<identifier>'}
        inflect = dasherize

    @post_dump
    def generate_payment_url(self, data):
        if 'POST' in request.method or ('GET' in request.method and 'regenerate' in request.args) and 'completed' != \
           data["status"]:
            if data['payment_mode'] == 'stripe':
                data['payment_url'] = 'stripe://payment'
            elif data['payment_mode'] == 'paypal':
                order = Order.query.filter_by(id=data['id']).first()
                data['payment_url'] = PayPalPaymentsManager.get_checkout_url(
                    order)
        return data

    @validates_schema
    def initial_values(self, data):
        if data.get('payment_mode') is None and 'POST' in request.method:
            data['payment_mode'] = 'free'
        return data

    id = fields.Str(dump_only=True)
    identifier = fields.Str(dump_only=True)
    amount = fields.Float(validate=lambda n: n > 0)
    address = fields.Str()
    city = fields.Str()
    state = fields.Str(db.String)
    country = fields.Str(required=True)
    zipcode = fields.Str()
    completed_at = fields.DateTime(dump_only=True)
    transaction_id = fields.Str(dump_only=True)
    payment_mode = fields.Str(default="free", required=True)
    paid_via = fields.Str(dump_only=True)
    brand = fields.Str(dump_only=True)
    exp_month = fields.Str(dump_only=True)
    exp_year = fields.Str(dump_only=True)
    last4 = fields.Str(dump_only=True)
    status = fields.Str(validate=validate.OneOf(
        choices=["pending", "cancelled", "confirmed", "deleted"]))
    discount_code_id = fields.Str()
    payment_url = fields.Str(dump_only=True)
    cancel_note = fields.Str()

    attendees = Relationship(
        attribute='ticket_holders',
        self_view='v1.order_attendee',
        self_view_kwargs={'order_identifier': '<identifier>'},
        related_view='v1.attendee_list',
        related_view_kwargs={'order_identifier': '<identifier>'},
        schema='AttendeeSchemaPublic',
        many=True,
        type_='attendee')

    tickets = Relationship(
        self_view='v1.order_ticket',
        self_view_kwargs={'order_identifier': '<identifier>'},
        related_view='v1.ticket_list',
        related_view_kwargs={'order_identifier': '<identifier>'},
        schema='TicketSchemaPublic',
        many=True,
        type_="ticket")

    user = Relationship(self_view='v1.order_user',
                        self_view_kwargs={'order_identifier': '<identifier>'},
                        related_view='v1.user_detail',
                        related_view_kwargs={'id': '<user_id>'},
                        schema='UserSchemaPublic',
                        type_="user")

    event = Relationship(self_view='v1.order_event',
                         self_view_kwargs={'order_identifier': '<identifier>'},
                         related_view='v1.event_detail',
                         related_view_kwargs={'id': '<event_id>'},
                         schema='EventSchemaPublic',
                         type_="event")

    marketer = Relationship(
        self_view='v1.order_marketer',
        self_view_kwargs={'order_identifier': '<identifier>'},
        related_view='v1.user_detail',
        related_view_kwargs={'id': '<marketer_id>'},
        schema='UserSchemaPublic',
        type_="user")

    discount_code = Relationship(
        self_view='v1.order_discount',
        self_view_kwargs={'order_identifier': '<identifier>'},
        related_view='v1.discount_code_detail',
        related_view_kwargs={'id': '<discount_code_id>'},
        schema='DiscountCodeSchemaPublic',
        type_="discount-code")
Beispiel #9
0
class DeviceSchema(Schema):
    class Meta:
        type_ = 'devices'
        self_view = 'api_app.device_detail'
        self_view_kwargs = {'device_id': '<id>'}
        self_view_many = 'api_app.devices_list'
        strict = True

    id = fields.Int(dump_only=True)
    udid = fields.Str(dump_only=True)
    topic = fields.Str()

    build_version = fields.Str()
    device_name = fields.Str()
    model = fields.Str()
    model_name = fields.Str()
    os_version = fields.Str()
    product_name = fields.Str()
    serial_number = fields.Str()

    awaiting_configuration = fields.Bool()
    last_seen = fields.DateTime(dump_only=True)
    hostname = fields.Str()
    local_hostname = fields.Str()
    available_device_capacity = fields.Float()
    device_capacity = fields.Float()
    wifi_mac = fields.Str()
    bluetooth_mac = fields.Str()

    # private
    # push_magic = fields.Str()
    # token = fields.Str()
    # unlock_token = fields.Str()
    tokenupdate_at = fields.DateTime()

    # SecurityInfo
    passcode_present = fields.Bool()
    passcode_compliant = fields.Bool()
    passcode_compliant_with_profiles = fields.Bool()
    fde_enabled = fields.Bool()
    fde_has_prk = fields.Bool()
    fde_has_irk = fields.Bool()
    firewall_enabled = fields.Bool()
    block_all_incoming = fields.Bool()
    stealth_mode_enabled = fields.Bool()
    sip_enabled = fields.Bool()

    # TODO: Relationship to dep_config

    # certificate = Relationship(
    #     self_view='api_app.device_certificate',
    #     self_view_kwargs={'certificate_id': '<id>'},
    #     related_view='api_app.certificate_detail',
    #     related_view_kwargs={'certificate_id': '<id>'},
    # )

    commands = Relationship(related_view='api_app.command_detail',
                            related_view_kwargs={'command_id': '<id>'},
                            many=True,
                            schema='CommandSchema',
                            type_='commands')

    installed_certificates = Relationship(
        related_view='api_app.installed_certificate_detail',
        related_view_kwargs={'installed_certificate_id': '<id>'},
        many=True,
        schema='InstalledCertificateSchema',
        type_='installed_certificates')

    installed_applications = Relationship(
        related_view='api_app.installed_application_detail',
        related_view_kwargs={'installed_application_id': '<id>'},
        many=True,
        schema='InstalledApplicationSchema',
        type_='installed_applications')

    groups = Relationship(related_view='api_app.device_group_detail',
                          related_view_kwargs={'device_group_id': '<id>'},
                          many=True,
                          schema='DeviceGroupSchema',
                          type_='device_groups')

    tags = Relationship(related_view='api_app.tag_detail',
                        related_view_kwargs={'tag_id': '<id>'},
                        many=True,
                        schema='TagSchema',
                        type_='tags')
Beispiel #10
0
class XMLSeasonPercentilesSchema(Schema):
    id = fields.Integer()
    league_tier = fields.Integer()
    season = fields.String()
    percentile = fields.Float()
    primary_position = fields.String()
    total_goals = fields.Integer()
    average_x = fields.Float()
    average_y = fields.Float()
    shots_p90 = fields.Float()
    box_shots_p90 = fields.Float()
    outside_box_shots_p90 = fields.Float()
    scoring_contribution_p90 = fields.Float()
    percentage_of_own_created_shots = fields.Float()
    scoring_percentage = fields.Float()
    touches_in_box = fields.Float()
    assists_p90 = fields.Float()
    key_passes_acc_p90 = fields.Float()
    throughballs_p90 = fields.Float()
    lost_balls_p90 = fields.Float()
    passes_p90 = fields.Float()
    passes_completion = fields.Float()
    acc_passes_to_the_box_p90 = fields.Float()
    passes_to_the_box_p90 = fields.Float()
    danger_zone_entries_p90 = fields.Float()
    long_balls_p90 = fields.Float()
    long_balls_completion = fields.Float()
    crosses_succ_p90 = fields.Float()
    crosses_completion = fields.Float()
    dribbles_succ_p90 = fields.Float()
    dribbles_completion = fields.Float()
    space_defending_p90 = fields.Float()
    tackles_completion = fields.Float()
    padj_tackles_p90 = fields.Float()
    padj_interceptions_p90 = fields.Float()
    won_balls_p90 = fields.Float()
    won_balls_opp_half_p90 = fields.Float()
    challenges_p90 = fields.Float()
    challenges_succ_p90 = fields.Float()
    challenges_succ_rate = fields.Float()
    long_balls_received_p90 = fields.Float()
    air_challenges_succ_rate = fields.Float()
    air_challenges_p90 = fields.Float()
    air_challenges_succ_p90 = fields.Float()
    own_created_shots_p90 = fields.Float()
    acc_passes_p90 = fields.Float()
    crosses_p90 = fields.Float()
    dribbles_p90 = fields.Float()
    won_challenges_p90 = fields.Float()
    won_air_challenges_p90 = fields.Float()
    opp_half_touches = fields.Float()
    opp_half_touches_ratio = fields.Float()
    non_penalty_goals = fields.Float()
    long_balls_succ_p90 = fields.Float()
    conversion_rate = fields.Float()
    picking_up_second_balls_p90 = fields.Float()
    xG = fields.Float()
    xA = fields.Float()
    xG_p90 = fields.Float()
    xG_per_shot = fields.Float()
    xGA_p90 = fields.Float()
    np_xG = fields.Float()
    np_xA = fields.Float()
    np_xG_p90 = fields.Float()
    np_xG_per_shot = fields.Float()
    np_xGA_p90 = fields.Float()
    
    
    # self links
    def get_top_level_links(self, data, many):
        if many:
            self_link = "/data/"
        else:
            self_link = "/data/{}".format(data['id'])
        return {'self': self_link}

    class Meta:
        type_ = 'data'
class TicketSchemaPublic(SoftDeletionSchema):
    class Meta:
        type_ = 'ticket'
        self_view = 'v1.ticket_detail'
        self_view_kwargs = {'id': '<id>'}
        inflect = dasherize

    @validates_schema(pass_original=True)
    def validate_date(self, data, original_data):
        if 'id' in original_data['data']:
            ticket = Ticket.query.filter_by(
                id=original_data['data']['id']).one()

            if 'sales_starts_at' not in data:
                data['sales_starts_at'] = ticket.sales_starts_at

            if 'sales_ends_at' not in data:
                data['sales_ends_at'] = ticket.sales_ends_at

            # if 'event_ends_at' not in data:
            #     data['event_ends_at'] = ticket.event.ends_at

        if data['sales_starts_at'] >= data['sales_ends_at']:
            raise UnprocessableEntity(
                {'pointer': '/data/attributes/sales-ends-at'},
                "sales-ends-at should be after sales-starts-at")

        # if 'event_ends_at' in data and data['sales_starts_at'] > data['event_ends_at']:
        #     raise UnprocessableEntity({'pointer': '/data/attributes/sales-starts-at'},
        #                               "ticket sales-starts-at should be before event ends-at")

        # if 'event_ends_at' in data and data['sales_ends_at'] > data['event_ends_at']:
        #     raise UnprocessableEntity({'pointer': '/data/attributes/sales-ends-at'},
        #                               "ticket sales-ends-at should be before event ends-at")

    @validates_schema
    def validate_quantity(self, data):
        if 'max_order' in data and 'min_order' in data:
            if data['max_order'] < data['min_order']:
                raise UnprocessableEntity(
                    {'pointer': '/data/attributes/max-order'},
                    "max-order should be greater than or equal to min-order")

        if 'quantity' in data and 'min_order' in data:
            if data['quantity'] < data['min_order']:
                raise UnprocessableEntity(
                    {'pointer': '/data/attributes/quantity'},
                    "quantity should be greater than or equal to min-order")

        if 'min_price' in data and 'max_price' in data and data[
                'type'] == 'donation':
            if data['min_price'] > data['max_price']:
                raise UnprocessableEntity(
                    {'pointer': '/data/attributes/min-price'},
                    "minimum price should be lesser than or equal to maximum price"
                )

        if 'quantity' in data and 'max_order' in data:
            if data['quantity'] < data['max_order']:
                raise UnprocessableEntity(
                    {'pointer': '/data/attributes/quantity'},
                    "quantity should be greater than or equal to max-order")

    @validates_schema(pass_original=True)
    def validate_discount_code(self, data, original_data):
        if 'relationships' in original_data and 'discount-codes' in original_data[
                'data']['relationships']:
            discount_codes = original_data['data']['relationships'][
                'discount-codes']
            for code in discount_codes['data']:
                try:
                    DiscountCode.query.filter_by(id=code['id']).one()
                except NoResultFound:
                    raise UnprocessableEntity(
                        {'pointer': '/data/relationships/discount-codes'},
                        "Discount code does not exist")

    id = fields.Str(dump_only=True)
    name = fields.Str(required=True)
    description = fields.Str(allow_none=True)
    type = fields.Str(required=True)
    price = fields.Float(validate=lambda n: n >= 0, allow_none=True)
    min_price = fields.Float(validate=lambda n: n >= 0)
    max_price = fields.Float(validate=lambda n: n >= 0, allow_none=True)
    quantity = fields.Integer(validate=lambda n: n >= 0, allow_none=True)
    is_description_visible = fields.Boolean(default=False)
    position = fields.Integer(allow_none=True)
    is_fee_absorbed = fields.Boolean()
    sales_starts_at = fields.DateTime(required=True)
    sales_ends_at = fields.DateTime(required=True)
    is_hidden = fields.Boolean(default=False)
    min_order = fields.Integer(validate=lambda n: n >= 0, allow_none=True)
    max_order = fields.Integer(validate=lambda n: n >= 0, allow_none=True)
    is_checkin_restricted = fields.Boolean(default=True)
    auto_checkin_enabled = fields.Boolean(default=False)
    event = Relationship(attribute='event',
                         self_view='v1.ticket_event',
                         self_view_kwargs={'id': '<id>'},
                         related_view='v1.event_detail',
                         related_view_kwargs={'ticket_id': '<id>'},
                         schema='EventSchemaPublic',
                         type_='event')

    ticket_tags = Relationship(attribute='tags',
                               self_view='v1.ticket_ticket_tag',
                               self_view_kwargs={'id': '<id>'},
                               related_view='v1.ticket_tag_list',
                               related_view_kwargs={'ticket_id': '<id>'},
                               schema='TicketTagSchema',
                               many=True,
                               type_='ticket-tag')

    discount_codes = Relationship(attribute='discount_codes',
                                  self_view='v1.ticket_discount_codes',
                                  self_view_kwargs={'id': '<id>'},
                                  related_view='v1.discount_code_list',
                                  related_view_kwargs={'ticket_id': '<id>'},
                                  schema='DiscountCodeSchemaTicket',
                                  many=True,
                                  type_='discount-code')
Beispiel #12
0
class DeviceSchema(Schema):
    class Meta:
        type_ = 'devices'
        self_view = 'api_app.device_detail'
        self_view_kwargs = {'device_id': '<id>'}
        self_view_many = 'api_app.devices_list'
        strict = True

    id = fields.Int(dump_only=True)
    udid = fields.Str(dump_only=True)
    topic = fields.Str()

    build_version = fields.Str()

    # device_name and hostname are "pseudo" read-only in that writing them does not affect the field but enqueues
    # an MDM command to change the name.
    device_name = fields.Str()
    hostname = fields.Str()
    local_hostname = fields.Str(dump_only=True)

    model = fields.Str()
    model_name = fields.Str()
    os_version = fields.Str()
    product_name = fields.Str()
    serial_number = fields.Str()

    awaiting_configuration = fields.Bool()
    last_seen = fields.DateTime(dump_only=True)

    available_device_capacity = fields.Float()
    device_capacity = fields.Float()
    wifi_mac = fields.Str()
    bluetooth_mac = fields.Str()

    # private
    # push_magic = fields.Str()
    # token = fields.Str()
    # unlock_token = fields.Str()
    tokenupdate_at = fields.DateTime()

    # SecurityInfo
    passcode_present = fields.Bool()
    passcode_compliant = fields.Bool()
    passcode_compliant_with_profiles = fields.Bool()
    fde_enabled = fields.Bool()
    fde_has_prk = fields.Bool()
    fde_has_irk = fields.Bool()
    firewall_enabled = fields.Bool()
    block_all_incoming = fields.Bool()
    stealth_mode_enabled = fields.Bool()
    sip_enabled = fields.Bool()

    battery_level = fields.Float(dump_only=True)
    imei = fields.Str(dump_only=True)

    is_cloud_backup_enabled = fields.Bool(dump_only=True)
    itunes_store_account_is_active = fields.Bool(dump_only=True)

    last_cloud_backup_date = fields.DateTime(dump_only=True)

    # TODO: Relationship to dep_config

    # certificate = Relationship(
    #     self_view='api_app.device_certificate',
    #     self_view_kwargs={'certificate_id': '<id>'},
    #     related_view='api_app.certificate_detail',
    #     related_view_kwargs={'certificate_id': '<id>'},
    # )

    # DEP
    is_dep = fields.Bool()
    description = fields.Str(dump_only=True)
    color = fields.Str(dump_only=True)
    asset_tag = fields.Str(dump_only=True)
    profile_status = fields.Str(dump_only=True)
    profile_uuid = fields.UUID(dump_only=True)
    profile_assign_time = fields.DateTime(dump_only=True)
    profile_push_time = fields.DateTime(dump_only=True)
    device_assigned_date = fields.DateTime(dump_only=True)
    device_assigned_by = fields.Str(dump_only=True)
    os = fields.Str(dump_only=True)
    device_family = fields.Str(dump_only=True)

    commands = Relationship(related_view='api_app.commands_list',
                            related_view_kwargs={'device_id': '<id>'},
                            many=True,
                            schema='CommandSchema',
                            type_='commands')

    installed_certificates = Relationship(
        related_view='api_app.installed_certificates_list',
        related_view_kwargs={'device_id': '<id>'},
        many=True,
        schema='InstalledCertificateSchema',
        type_='installed_certificates')

    installed_applications = Relationship(
        related_view='api_app.installed_applications_list',
        related_view_kwargs={'device_id': '<id>'},
        many=True,
        schema='InstalledApplicationSchema',
        type_='installed_applications')

    tags = Relationship(related_view='api_app.tags_list',
                        related_view_kwargs={'device_id': '<id>'},
                        many=True,
                        schema='TagSchema',
                        type_='tags')

    available_os_updates = Relationship(
        related_view='api_app.available_os_updates_list',
        related_view_kwargs={'device_id': '<id>'},
        many=True,
        schema='AvailableOSUpdateSchema',
        type_='available_os_updates')

    dep_profile = Relationship(
        related_view='dep_app.dep_profile_detail',
        related_view_kwargs={'dep_profile_id': '<dep_profile_id>'},
        many=False,
        schema='DEPProfileSchema',
        type_='dep_profiles',
    )
class EventInvoiceSchema(SoftDeletionSchema):
    """
    Event Invoice API Schema based on event invoice model
    """
    class Meta:
        type_ = 'event-invoice'
        self_view = 'v1.event_invoice_detail'
        self_view_kwargs = {'id': '<id>'}
        inflect = dasherize

    id = fields.Str(dump_only=True)
    identifier = fields.Str(allow_none=True)
    amount = fields.Float(validate=lambda n: n >= 0, allow_none=True)
    address = fields.Str(allow_none=True)
    city = fields.Str(allow_none=True)
    state = fields.Str(allow_none=True)
    country = fields.Str(validate=validate.OneOf(choices=PAYMENT_COUNTRIES),
                         allow_none=True)
    zipcode = fields.Str(allow_none=True)
    created_at = fields.DateTime(allow_none=True)
    completed_at = fields.DateTime(default=None)
    transaction_id = fields.Str(allow_none=True)
    paid_via = fields.Str(validate=validate.OneOf(
        choices=["free", "stripe", "paypal", "transfer", "onsite", "cheque"]),
                          allow_none=True)
    payment_mode = fields.Str(allow_none=True)
    brand = fields.Str(allow_none=True)
    exp_month = fields.Integer(validate=lambda n: 0 <= n <= 12,
                               allow_none=True)
    exp_year = fields.Integer(validate=lambda n: n >= 2015, allow_none=True)
    last4 = fields.Str(allow_none=True)
    stripe_token = fields.Str(allow_none=True)
    paypal_token = fields.Str(allow_none=True)
    status = fields.Str(validate=validate.OneOf(choices=[
        "expired", "deleted", "initialized"
        "completed", "placed", "pending", "cancelled"
    ]),
                        allow_none=True)
    invoice_pdf_url = fields.Url(allow_none=True)
    user = Relationship(attribute='user',
                        self_view='v1.event_invoice_user',
                        self_view_kwargs={'id': '<id>'},
                        related_view='v1.user_detail',
                        related_view_kwargs={'event_invoice_id': '<id>'},
                        schema='UserSchemaPublic',
                        type_='user')
    order = Relationship(attribute='order',
                         self_view='v1.event_invoice_order',
                         self_view_kwargs={'id': '<id>'},
                         related_view='v1.order_detail',
                         related_view_kwargs={'id': '<id>'},
                         schema='OrderSchema',
                         type_='order')
    event = Relationship(attribute='event',
                         self_view='v1.event_invoice_event',
                         self_view_kwargs={'id': '<id>'},
                         related_view='v1.event_detail',
                         related_view_kwargs={'event_invoice_id': '<id>'},
                         schema='EventSchemaPublic',
                         type_='event')
    discount_code = Relationship(
        attribute='discount_code',
        self_view='v1.event_invoice_discount_code',
        self_view_kwargs={'id': '<id>'},
        related_view='v1.discount_code_detail',
        related_view_kwargs={'event_invoice_id': '<id>'},
        schema='DiscountCodeSchemaPublic',
        type_='discount-code')
Beispiel #14
0
class XMLModelsSeasonPlayerAggSchema(Schema):
    id = fields.Integer()   
    league_name = fields.String()
    league_country = fields.String()
    league_tier = fields.Integer()
    league_instatid = fields.Integer()    
    player_instatid = fields.Integer()
    team_instatid = fields.Integer()
    team_name = fields.String()
    player_name = fields.String()
    nationality = fields.String()
    birthday = fields.Date()
    height = fields.Integer()
    weight = fields.Integer()
    left_foot = fields.Integer()
    right_foot = fields.Integer()   
    season = fields.String()
    league_id = fields.Integer()       
    team_id = fields.Integer()
    player_id = fields.Integer()
    instat_creation_time = fields.Date()
    transfermarkt_creation_time = fields.Date()
    instat_contract = fields.String()
    transfermarkt_contract = fields.String()
    market_value_tm = fields.Float()
    matches_count = fields.Integer()
    average_minutes = fields.Float()
    minutes = fields.Float()
    xG_minutes = fields.Float()
    padj_tackles_minutes = fields.Float()
    padj_interceptions_minutes = fields.Float()
    primary_position = fields.String()
    secondary_position = fields.String()
    primary_position_percentage = fields.Float()
    secondary_position_percentage = fields.Float()
    total_goals = fields.Integer()
    average_x = fields.Float()
    average_y = fields.Float()
    shots_p90 = fields.Float()
    box_shots_p90 = fields.Float()
    outside_box_shots_p90 = fields.Float()
    scoring_contribution_p90 = fields.Float()
    percentage_of_own_created_shots = fields.Float()
    scoring_percentage = fields.Float()
    touches_in_box = fields.Float()
    assists_p90 = fields.Float()
    key_passes_acc_p90 = fields.Float()
    throughballs_p90 = fields.Float()
    lost_balls_p90 = fields.Float()
    passes_p90 = fields.Float()
    passes_completion = fields.Float()
    acc_passes_to_the_box_p90 = fields.Float()
    passes_to_the_box_p90 = fields.Float()
    danger_zone_entries_p90 = fields.Float()
    long_balls_p90 = fields.Float()
    long_balls_completion = fields.Float()
    crosses_succ_p90 = fields.Float()
    crosses_completion = fields.Float()
    dribbles_succ_p90 = fields.Float()
    dribbles_completion = fields.Float()
    space_defending_p90 = fields.Float()
    tackles_completion = fields.Float()
    padj_tackles_p90 = fields.Float()
    padj_interceptions_p90 = fields.Float()
    won_balls_p90 = fields.Float()
    won_balls_opp_half_p90 = fields.Float()
    challenges_p90 = fields.Float()
    challenges_succ_rate = fields.Float()
    challenges_succ_p90 = fields.Float()
    long_balls_received_p90 = fields.Float()
    air_challenges_succ_rate = fields.Float()
    air_challenges_p90 = fields.Float()
    air_challenges_succ_p90 = fields.Float()
    own_created_shots_p90 = fields.Float()
    acc_passes_p90 = fields.Float()
    crosses_p90 = fields.Float()
    dribbles_p90 = fields.Float()
    won_challenges_p90 = fields.Float()
    won_air_challenges_p90 = fields.Float()
    opp_half_touches = fields.Float()
    opp_half_touches_ratio = fields.Float()
    non_penalty_goals = fields.Float()
    long_balls_succ_p90 = fields.Float()
    conversion_rate = fields.Float()
    picking_up_second_balls_p90 = fields.Float()
    xG = fields.Float()
    xG_p90 = fields.Float()
    xG_per_shot = fields.Float()
    np_xG = fields.Float()
    np_xG_p90 = fields.Float()
    np_xG_per_shot = fields.Float()
    version = fields.Float()
    padj_air_challenges_p90 = fields.Float()
    patch_average_time_duration_p90 = fields.Float()
    patch_time_duration_sum_p90 = fields.Float()
    patch_position_gain_sum_p90 = fields.Float()
    patch_value_p90 = fields.Float()
    patch_total_offensive_actions_p90 = fields.Float()
    patch_defensive_rectangularity_p90 = fields.Float()
    patch_defensive_yrange_p90 = fields.Float()
    patch_defensive_xrange_p90 = fields.Float()
    patch_defensive_area_p90 = fields.Float()
    throughballs_shot_p90 = fields.Float()
    cross_shot_p90 = fields.Float()
    long_balls_shot_p90 = fields.Float()
    opp_half_touches_p90 = fields.Float()

    def get_top_level_links(self, data, many):
        if many:
            self_link = "/data/"
        else:
            self_link = "/data/{}".format(data['id'])
        return {'self': self_link}

    class Meta:
        type_ = 'data'
Beispiel #15
0
class XMLModelsMatchTeamSchema(Schema):
    id = fields.Integer()
    match_instatid = fields.Integer()
    team_instatid = fields.Integer()
    season = fields.String()
    creation_time = fields.Date()
    match_date = fields.Date()
    minutes = fields.Float()
    points = fields.Integer()
    xPoints = fields.Integer()
    xPoints_ours = fields.Integer()
    goals_for = fields.Integer()
    goals_against = fields.Integer()
    xG_for_p90 = fields.Float()
    xG_against_p90 = fields.Float()
    shots_for_p90 = fields.Float()
    shots_against_p90 = fields.Float()
    shots_for = fields.Integer()
    shots_against = fields.Integer()
    shots_on_target = fields.Integer()
    shots_on_target_againts = fields.Integer()
    headed_shots = fields.Integer()
    dangerzone_shots_p90 = fields.Float()
    dangerzone_shots = fields.Float()
    dangerzone_shots_against_p90 = fields.Float()
    xG_per_shot = fields.Float()
    xG_per_shot_against = fields.Float()
    average_distance_of_shots = fields.Float()
    average_distance_of_shots_against = fields.Float()
    passes_p90 = fields.Float()
    passes_succes_rate = fields.Float()
    forward_passes = fields.Float()
    backward_passes = fields.Float()
    total_passes_into_the_box_p90 = fields.Float()
    total_passes_into_the_box = fields.Float()
    acc_passes_into_the_box_p90 = fields.Float()
    acc_passes_into_the_box = fields.Float()
    passes_to_the_box_against_p90 = fields.Float()
    dangerzone_entries_p90 = fields.Float()
    dangerzone_entries = fields.Float()
    crosses_p90 = fields.Float()
    shots_from_crosses = fields.Float()
    avg_number_of_passes_before_shot = fields.Float()
    passes_in_buildup = fields.Float()
    passes_in_middle_third = fields.Float()
    passes_in_final_third = fields.Float()
    long_balls = fields.Float()
    lost_balls = fields.Float()
    touches_inside_box = fields.Float()
    touches_inside_box_p90 = fields.Float()
    events_inside_box = fields.Float()
    buildup = fields.Float()
    maintenance = fields.Float()
    counter_attacking = fields.Float()
    sustainable_threat = fields.Float()
    fast_tempo = fields.Float()
    high_press = fields.Float()
    tts_for = fields.Float()
    tts_against = fields.Float()
    tts_difference = fields.Float()
    tts_tackle = fields.Float()
    tts_interception = fields.Float()
    tts_turnover = fields.Float()
    won_balls_opp_half = fields.Float()
    won_balls_final_third = fields.Float()
    won_balls_middle_third = fields.Float()
    won_balls_own_third = fields.Float()
    avg_height_of_turnover = fields.Float()
    tackles_total = fields.Float()
    tackles_success_rate = fields.Float()
    headers_total = fields.Float()
    headers_success_rate = fields.Float()
    challenges_total = fields.Float()
    challenges_success_rate = fields.Float()
    tackles_padj = fields.Float()
    interceptions = fields.Float()
    interceptions_padj = fields.Float()
    # self links
    def get_top_level_links(self, data, many):
        if many:
            self_link = "/data/"
        else:
            self_link = "/data/{}".format(data['id'])
        return {'self': self_link}

    class Meta:
        type_ = 'data'
class TicketSchemaPublic(Schema):
    class Meta:
        type_ = 'ticket'
        self_view = 'v1.ticket_detail'
        self_view_kwargs = {'id': '<id>'}
        inflect = dasherize

    @validates_schema(pass_original=True)
    def validate_date(self, data, original_data):
        if 'id' in original_data['data']:
            ticket = Ticket.query.filter_by(
                id=original_data['data']['id']).one()

            if 'sales_starts_at' not in data:
                data['sales_starts_at'] = ticket.sales_starts_at

            if 'sales_ends_at' not in data:
                data['sales_ends_at'] = ticket.sales_ends_at

        if data['sales_starts_at'] >= data['sales_ends_at']:
            raise UnprocessableEntity(
                {'pointer': '/data/attributes/sales-ends-at'},
                "sales-ends-at should be after sales-starts-at")

    @validates_schema
    def validate_quantity(self, data):
        if 'max_order' in data and 'min_order' in data:
            if data['max_order'] < data['min_order']:
                raise UnprocessableEntity(
                    {'pointer': '/data/attributes/max-order'},
                    "max-order should be greater than min-order")

        if 'quantity' in data and 'min_order' in data:
            if data['quantity'] < data['min_order']:
                raise UnprocessableEntity(
                    {'pointer': '/data/attributes/quantity'},
                    "quantity should be greater than min-order")

    id = fields.Str(dump_only=True)
    name = fields.Str(required=True)
    description = fields.Str(allow_none=True)
    type = fields.Str(required=True)
    price = fields.Float(validate=lambda n: n >= 0, allow_none=True)
    quantity = fields.Integer(validate=lambda n: n >= 0, allow_none=True)
    is_description_visible = fields.Boolean(default=False)
    position = fields.Integer(allow_none=True)
    is_fee_absorbed = fields.Boolean()
    sales_starts_at = fields.DateTime(required=True)
    sales_ends_at = fields.DateTime(required=True)
    is_hidden = fields.Boolean(default=False)
    min_order = fields.Integer(validate=lambda n: n >= 0, allow_none=True)
    max_order = fields.Integer(validate=lambda n: n >= 0, allow_none=True)
    event = Relationship(attribute='event',
                         self_view='v1.ticket_event',
                         self_view_kwargs={'id': '<id>'},
                         related_view='v1.event_detail',
                         related_view_kwargs={'ticket_id': '<id>'},
                         schema='EventSchemaPublic',
                         type_='event')
    ticket_tags = Relationship(attribute='tags',
                               self_view='v1.ticket_ticket_tag',
                               self_view_kwargs={'id': '<id>'},
                               related_view='v1.ticket_tag_list',
                               related_view_kwargs={'ticket_id': '<id>'},
                               schema='TicketTagSchema',
                               many=True,
                               type_='ticket-tag')
Beispiel #17
0
class OrderSchema(SoftDeletionSchema):
    class Meta:
        type_ = 'order'
        self_view = 'v1.order_detail'
        self_view_kwargs = {'order_identifier': '<identifier>'}
        inflect = dasherize

    @post_dump
    def generate_payment_url(self, data):
        """
        generate payment url for an order
        :param data:
        :return:
        """
        if 'POST' in request.method or ('GET' in request.method and 'regenerate' in request.args) and 'completed' != \
           data["status"]:
            if data['payment_mode'] == 'stripe':
                data['payment_url'] = 'stripe://payment'
        return data

    @validates_schema
    def initial_values(self, data):
        if data.get('payment_mode') is None and 'POST' in request.method:
            data['payment_mode'] = 'free'
        return data

    id = fields.Str(dump_only=True)
    identifier = fields.Str(dump_only=True)
    amount = fields.Float(validate=lambda n: n >= 0,
                          allow_none=False,
                          default=0)
    address = fields.Str(allow_none=True)
    city = fields.Str(allow_none=True)
    state = fields.Str(db.String, allow_none=True)
    country = fields.Str(allow_none=True)
    zipcode = fields.Str(allow_none=True)
    company = fields.Str(allow_none=True)
    tax_business_info = fields.Str(allow_none=True)
    completed_at = fields.DateTime(dump_only=True)
    created_at = fields.DateTime(dump_only=True)
    transaction_id = fields.Str(dump_only=True)
    payment_mode = fields.Str(default="free",
                              validate=validate.OneOf(choices=[
                                  "free", "stripe", "paypal", "bank", "cheque",
                                  "onsite", "omise", "alipay"
                              ]),
                              allow_none=True)
    paid_via = fields.Str(dump_only=True)
    is_billing_enabled = fields.Boolean(default=False)
    brand = fields.Str(dump_only=True)
    exp_month = fields.Str(dump_only=True)
    exp_year = fields.Str(dump_only=True)
    last4 = fields.Str(dump_only=True)
    status = fields.Str(validate=validate.OneOf(choices=[
        "initializing", "pending", "cancelled", "completed", "placed",
        "expired"
    ]))
    discount_code_id = fields.Str(allow_none=True)
    payment_url = fields.Str(dump_only=True)
    cancel_note = fields.Str(allow_none=True)
    order_notes = fields.Str(allow_none=True)
    tickets_pdf_url = fields.Url(dump_only=True)

    # only used in the case of an on site attendee.
    on_site_tickets = fields.List(
        cls_or_instance=fields.Nested(OnSiteTicketSchema),
        load_only=True,
        allow_none=True)

    attendees = Relationship(
        attribute='ticket_holders',
        self_view='v1.order_attendee',
        self_view_kwargs={'order_identifier': '<identifier>'},
        related_view='v1.attendee_list',
        related_view_kwargs={'order_identifier': '<identifier>'},
        schema='AttendeeSchemaPublic',
        many=True,
        type_='attendee')

    tickets = Relationship(
        attribute='tickets',
        self_view='v1.order_ticket',
        self_view_kwargs={'order_identifier': '<identifier>'},
        related_view='v1.ticket_list',
        related_view_kwargs={'order_identifier': '<identifier>'},
        schema='TicketSchemaPublic',
        many=True,
        type_="ticket")

    user = Relationship(attribute='user',
                        self_view='v1.order_user',
                        self_view_kwargs={'order_identifier': '<identifier>'},
                        related_view='v1.user_detail',
                        related_view_kwargs={'id': '<user_id>'},
                        schema='UserSchemaPublic',
                        type_="user")

    event = Relationship(attribute='event',
                         self_view='v1.order_event',
                         self_view_kwargs={'order_identifier': '<identifier>'},
                         related_view='v1.event_detail',
                         related_view_kwargs={'id': '<event_id>'},
                         schema='EventSchemaPublic',
                         type_="event")

    marketer = Relationship(
        attribute='marketer',
        self_view='v1.order_marketer',
        self_view_kwargs={'order_identifier': '<identifier>'},
        related_view='v1.user_detail',
        related_view_kwargs={'id': '<marketer_id>'},
        schema='UserSchemaPublic',
        type_="user")

    discount_code = Relationship(
        attribute='discount_code',
        self_view='v1.order_discount',
        self_view_kwargs={'order_identifier': '<identifier>'},
        related_view='v1.discount_code_detail',
        related_view_kwargs={'id': '<discount_code_id>'},
        schema='DiscountCodeSchemaPublic',
        type_="discount-code")
Beispiel #18
0
class UserSchema(Schema):
    @post_dump(pass_many=True)
    def remove_private_attributes(self, data, many):
        if data['data'] is None:
            return data
        if many:
            for item in data['data']:
                if not has_access('is_user_itself', user_id=item['id']):
                    item = drop_private_attributes(item)
            return data
        if not has_access('is_user_itself', user_id=data['data']['id']):
            data['data'] = drop_private_attributes(data['data'])
        return data

    @pre_load()
    def set_default_language(self, data):
        if 'language' not in data or not data['language']:
            data['language'] = 'en'

    @pre_load()
    def set_default_country(self, data):
        if 'country' not in data or not data['country']:
            data['country'] = None

    @validates('name')
    def validate_username_uniqueness(self, data):
        if User.query.filter_by(name=data).count():
            raise UnprocessableEntity("Username already taken",
                                      {'pointer': '/data/attributes/name'})

    @validates('email')
    def validate_email_uniqueness(self, data):
        if User.query.filter_by(email=data).count():
            raise UnprocessableEntity("Email already taken",
                                      {'pointer': '/data/attributes/email'})

    @validates('language')
    def validate_language_value(self, data):
        if data not in LANGUAGES.keys():
            raise UnprocessableEntity("Invalid language",
                                      {'pointer': '/data/attributes/language'})

    @validates('country')
    def validate_country_value(self, data):
        if data is not None and data not in COUNTRIES.keys():
            raise UnprocessableEntity("Invalid country",
                                      {'pointer': '/data/attributes/country'})

    @validates('observation_radius')
    def validate_observation_radius_value(self, data):
        if data is None:
            return
        if data < 0 or data > 10:
            raise UnprocessableEntity(
                "Observation radius must be between 0 and 10",
                {'pointer': '/data/attributes/observation-radius'})

    @validates('hour')
    def validate_hour_value(self, data):
        if data is None:
            return
        if data < 0 or data > 23:
            raise UnprocessableEntity("Hour must be between 0 and 23",
                                      {'pointer': '/data/attributes/hour'})

    @validates('latitude')
    def validate_latitude_valid(self, data):
        if data is not None and not REG_LATITUDE.match(str(data)):
            raise UnprocessableEntity("Latitude is invalid",
                                      {'pointer': '/data/attributes/latitude'})

    @validates('longitude')
    def validate_longitude_valid(self, data):
        if data is not None and not REG_LONGITUDE.match(str(data)):
            raise UnprocessableEntity(
                "Longitude is invalid",
                {'pointer': '/data/attributes/longitude'})

    class Meta:
        type_ = 'user'
        self_view = 'v1.user_details'
        self_view_kwargs = {'id': '<id>'}
        self_view_many = 'v1.users_list'
        inflect = dasherize
        ordered = True

    id = fields.Integer(as_string=True, dump_only=True)
    name = fields.Str(required=True)
    language = fields.Str(validate=validate.Length(max=2), allow_none=True)
    country = fields.Str(allow_none=True)
    join_datetime = fields.Date(dump_only=True)

    email = EmailOrBlank(required=True)
    password = fields.Str(load_only=True, required=True)
    latitude = fields.Float(allow_none=True)
    longitude = fields.Float(allow_none=True)
    daily_mails = fields.Boolean(allow_none=True)
    observation_radius = fields.Integer(allow_none=True)
    hour = fields.Integer(allow_none=True)
    secid = fields.Str(dump_only=True)
    # ip = fields.Str(dump_only=True)  # Do not use this field a all GDPR?
    statpic_id = fields.Integer()
    last_update_datetime = fields.Date(dump_only=True)
    last_mail_datetime = fields.Date(dump_only=True)
    last_login_datetime = fields.Date(dump_only=True)

    # statpic = Relationship()
    news = Relationship(self_view='v1.user_news',
                        self_view_kwargs={'id': '<id>'},
                        related_view='v1.news_list',
                        related_view_kwargs={'author_id': '<id>'},
                        many=True,
                        schema='NewsSchema',
                        type_='news')

    news_comments = Relationship(
        self_view='v1.user_news_comments',
        self_view_kwargs={'id': '<id>'},
        related_view='v1.news_comments_list',
        related_view_kwargs={'author_id': '<id>'},
        many=True,
        schema='NewsCommentSchema',
        type_='news-comment',
        # include_resource_linkage=True
    )

    news_subscriptions = Relationship(
        self_view='v1.user_news_subscriptions',
        self_view_kwargs={'id': '<id>'},
        related_view='v1.news_subscriptions_list',
        related_view_kwargs={'user_id': '<id>'},
        many=True,
        schema='NewsSubscriptionSchema',
        type_='news-subscription',
        # include_resource_linkage=True
    )

    geokrety_owned = Relationship(
        self_view='v1.user_geokrety_owned',
        self_view_kwargs={'id': '<id>'},
        related_view='v1.geokrety_list',
        related_view_kwargs={'owner_id': '<id>'},
        many=True,
        schema='GeokretSchemaPublic',
        type_='geokret',
    )

    geokrety_held = Relationship(
        self_view='v1.user_geokrety_held',
        self_view_kwargs={'id': '<id>'},
        related_view='v1.geokrety_list',
        related_view_kwargs={'holder_id': '<id>'},
        many=True,
        schema='GeokretSchemaPublic',
        type_='geokret',
    )

    moves = Relationship(
        self_view='v1.user_moves',
        self_view_kwargs={'id': '<id>'},
        related_view='v1.moves_list',
        related_view_kwargs={'user_id': '<id>'},
        many=True,
        schema='MoveWithCoordinatesSchema',
        type_='move',
    )

    moves_comments = Relationship(
        self_view='v1.user_moves_comments',
        self_view_kwargs={'id': '<id>'},
        related_view='v1.move_comment_list',
        related_view_kwargs={'author_id': '<id>'},
        many=True,
        schema='MoveCommentSchema',
        type_='move-comment',
        # include_resource_linkage=True
    )
class EventSchemaPublic(SoftDeletionSchema):
    class Meta:
        type_ = 'event'
        self_view = 'v1.event_detail'
        self_view_kwargs = {'id': '<id>'}
        self_view_many = 'v1.event_list'
        inflect = dasherize

    @validates_schema(pass_original=True)
    def validate_timezone(self, data, original_data):
        if 'id' in original_data['data']:
            try:
                event = Event.query.filter_by(
                    id=original_data['data']['id']).one()
            except NoResultFound:
                raise ObjectNotFound({'source': 'data/id'},
                                     "Event id not found")

            if 'timezone' not in data:
                data['timezone'] = event.timezone
        try:
            timezone(data['timezone'])
        except pytz.exceptions.UnknownTimeZoneError:
            raise UnprocessableEntity({'pointer': '/data/attributes/timezone'},
                                      "Unknown timezone: '{}'".format(
                                          data['timezone']))

    id = fields.Str(dump_only=True)
    identifier = fields.Str(dump_only=True)
    name = fields.Str(required=True)
    external_event_url = fields.Url(allow_none=True)
    starts_at = fields.DateTime(required=True, timezone=True)
    ends_at = fields.DateTime(required=True, timezone=True)
    timezone = fields.Str(required=True)
    is_event_online = fields.Boolean(default=False)
    latitude = fields.Float(validate=lambda n: -90 <= n <= 90, allow_none=True)
    longitude = fields.Float(validate=lambda n: -180 <= n <= 180,
                             allow_none=True)
    logo_url = fields.Url(allow_none=True)
    location_name = fields.Str(allow_none=True)
    searchable_location_name = fields.Str(allow_none=True)
    description = fields.Str(allow_none=True)
    original_image_url = fields.Url(allow_none=True)
    thumbnail_image_url = fields.Url(dump_only=True)
    large_image_url = fields.Url(dump_only=True)
    icon_image_url = fields.Url(dump_only=True)
    show_remaining_tickets = fields.Bool(allow_none=False, default=False)
    owner_name = fields.Str(allow_none=True)
    is_map_shown = fields.Bool(default=False)
    has_owner_info = fields.Bool(default=False)
    owner_description = fields.Str(allow_none=True)
    is_sessions_speakers_enabled = fields.Bool(default=False)
    privacy = fields.Str(default="public")
    state = fields.Str(validate=validate.OneOf(choices=["published", "draft"]),
                       allow_none=True,
                       default='draft')
    ticket_url = fields.Url(allow_none=True)
    code_of_conduct = fields.Str(allow_none=True)
    schedule_published_on = fields.DateTime(allow_none=True)
    is_featured = fields.Bool(default=False)
    is_promoted = fields.Bool(default=False)
    is_ticket_form_enabled = fields.Bool(default=True)
    payment_country = fields.Str(allow_none=True)
    payment_currency = fields.Str(allow_none=True)
    paypal_email = fields.Str(allow_none=True)
    is_tax_enabled = fields.Bool(default=False)
    is_billing_info_mandatory = fields.Bool(default=False)
    is_donation_enabled = fields.Bool(default=False)
    can_pay_by_paypal = fields.Bool(default=False)
    can_pay_by_stripe = fields.Bool(default=False)
    can_pay_by_cheque = fields.Bool(default=False)
    can_pay_by_bank = fields.Bool(default=False)
    can_pay_onsite = fields.Bool(default=False)
    can_pay_by_omise = fields.Bool(default=False)
    can_pay_by_alipay = fields.Bool(default=False)
    can_pay_by_paytm = fields.Bool(default=False)
    cheque_details = fields.Str(allow_none=True)
    bank_details = fields.Str(allow_none=True)
    onsite_details = fields.Str(allow_none=True)
    is_sponsors_enabled = fields.Bool(default=False)
    created_at = fields.DateTime(dump_only=True, timezone=True)
    pentabarf_url = fields.Url(dump_only=True)
    ical_url = fields.Url(dump_only=True)
    xcal_url = fields.Url(dump_only=True)
    refund_policy = fields.String(
        dump_only=True,
        default='All sales are final. No refunds shall be issued in any case.')
    is_stripe_linked = fields.Boolean(dump_only=True,
                                      allow_none=True,
                                      default=False)

    tickets = Relationship(attribute='tickets',
                           self_view='v1.event_ticket',
                           self_view_kwargs={'id': '<id>'},
                           related_view='v1.ticket_list',
                           related_view_kwargs={'event_id': '<id>'},
                           schema='TicketSchemaPublic',
                           many=True,
                           type_='ticket')
    faqs = Relationship(attribute='faqs',
                        self_view='v1.event_faqs',
                        self_view_kwargs={'id': '<id>'},
                        related_view='v1.faq_list',
                        related_view_kwargs={'event_id': '<id>'},
                        schema='FaqSchema',
                        many=True,
                        type_='faq')
    faq_types = Relationship(attribute='faq_types',
                             self_view='v1.event_faq_types',
                             self_view_kwargs={'id': '<id>'},
                             related_view='v1.faq_type_list',
                             related_view_kwargs={'event_id': '<id>'},
                             schema='FaqTypeSchema',
                             many=True,
                             type_='faq_type')
    feedbacks = Relationship(attribute='feedbacks',
                             self_view='v1.event_feedbacks',
                             self_view_kwargs={'id': '<id>'},
                             related_view='v1.feedback_list',
                             related_view_kwargs={'event_id': '<id>'},
                             schema='FeedbackSchema',
                             many=True,
                             type_='feedback')
    ticket_tags = Relationship(attribute='ticket_tags',
                               self_view='v1.event_ticket_tag',
                               self_view_kwargs={'id': '<id>'},
                               related_view='v1.ticket_tag_list',
                               related_view_kwargs={'event_id': '<id>'},
                               schema='TicketTagSchema',
                               many=True,
                               type_='ticket-tag')
    microlocations = Relationship(attribute='microlocation',
                                  self_view='v1.event_microlocation',
                                  self_view_kwargs={'id': '<id>'},
                                  related_view='v1.microlocation_list',
                                  related_view_kwargs={'event_id': '<id>'},
                                  schema='MicrolocationSchema',
                                  many=True,
                                  type_='microlocation')
    social_links = Relationship(attribute='social_link',
                                self_view='v1.event_social_link',
                                self_view_kwargs={'id': '<id>'},
                                related_view='v1.social_link_list',
                                related_view_kwargs={'event_id': '<id>'},
                                schema='SocialLinkSchema',
                                many=True,
                                type_='social-link')
    tracks = Relationship(attribute='track',
                          self_view='v1.event_tracks',
                          self_view_kwargs={'id': '<id>'},
                          related_view='v1.track_list',
                          related_view_kwargs={'event_id': '<id>'},
                          schema='TrackSchema',
                          many=True,
                          type_='track')
    sponsors = Relationship(attribute='sponsor',
                            self_view='v1.event_sponsor',
                            self_view_kwargs={'id': '<id>'},
                            related_view='v1.sponsor_list',
                            related_view_kwargs={'event_id': '<id>'},
                            schema='SponsorSchema',
                            many=True,
                            type_='sponsor')
    speakers_call = Relationship(attribute='speakers_call',
                                 self_view='v1.event_speakers_call',
                                 self_view_kwargs={'id': '<id>'},
                                 related_view='v1.speakers_call_detail',
                                 related_view_kwargs={'event_id': '<id>'},
                                 schema='SpeakersCallSchema',
                                 type_='speakers-call')
    session_types = Relationship(attribute='session_type',
                                 self_view='v1.event_session_types',
                                 self_view_kwargs={'id': '<id>'},
                                 related_view='v1.session_type_list',
                                 related_view_kwargs={'event_id': '<id>'},
                                 schema='SessionTypeSchema',
                                 many=True,
                                 type_='session-type')
    event_copyright = Relationship(attribute='copyright',
                                   self_view='v1.event_copyright',
                                   self_view_kwargs={'id': '<id>'},
                                   related_view='v1.event_copyright_detail',
                                   related_view_kwargs={'event_id': '<id>'},
                                   schema='EventCopyrightSchema',
                                   type_='event-copyright')
    tax = Relationship(attribute='tax',
                       self_view='v1.event_tax',
                       self_view_kwargs={'id': '<id>'},
                       related_view='v1.tax_detail',
                       related_view_kwargs={'event_id': '<id>'},
                       schema='TaxSchema',
                       type_='tax')
    sessions = Relationship(attribute='session',
                            self_view='v1.event_session',
                            self_view_kwargs={'id': '<id>'},
                            related_view='v1.session_list',
                            related_view_kwargs={'event_id': '<id>'},
                            schema='SessionSchema',
                            many=True,
                            type_='session')
    speakers = Relationship(attribute='speaker',
                            self_view='v1.event_speaker',
                            self_view_kwargs={'id': '<id>'},
                            related_view='v1.speaker_list',
                            related_view_kwargs={'event_id': '<id>'},
                            schema='SpeakerSchema',
                            many=True,
                            type_='speaker')
    event_type = Relationship(attribute='event_type',
                              self_view='v1.event_event_type',
                              self_view_kwargs={'id': '<id>'},
                              related_view='v1.event_type_detail',
                              related_view_kwargs={'event_id': '<id>'},
                              schema='EventTypeSchema',
                              type_='event-type')
    event_topic = Relationship(attribute='event_topic',
                               self_view='v1.event_event_topic',
                               self_view_kwargs={'id': '<id>'},
                               related_view='v1.event_topic_detail',
                               related_view_kwargs={'event_id': '<id>'},
                               schema='EventTopicSchema',
                               type_='event-topic')
    event_sub_topic = Relationship(attribute='event_sub_topic',
                                   self_view='v1.event_event_sub_topic',
                                   self_view_kwargs={'id': '<id>'},
                                   related_view='v1.event_sub_topic_detail',
                                   related_view_kwargs={'event_id': '<id>'},
                                   schema='EventSubTopicSchema',
                                   type_='event-sub-topic')
    custom_forms = Relationship(attribute='custom_form',
                                self_view='v1.event_custom_forms',
                                self_view_kwargs={'id': '<id>'},
                                related_view='v1.custom_form_list',
                                related_view_kwargs={'event_id': '<id>'},
                                schema='CustomFormSchema',
                                many=True,
                                type_='custom-form')
    owner = Relationship(attribute='owner',
                         self_view='v1.event_owner',
                         self_view_kwargs={'id': '<id>'},
                         related_view='v1.user_detail',
                         schema='UserSchemaPublic',
                         related_view_kwargs={'event_id': '<id>'},
                         type_='user')
    organizers = Relationship(attribute='organizers',
                              self_view='v1.event_organizers',
                              self_view_kwargs={'id': '<id>'},
                              related_view='v1.user_list',
                              schema='UserSchemaPublic',
                              type_='user',
                              many=True)
    coorganizers = Relationship(attribute='coorganizers',
                                self_view='v1.event_coorganizers',
                                self_view_kwargs={'id': '<id>'},
                                related_view='v1.user_list',
                                schema='UserSchemaPublic',
                                type_='user',
                                many=True)
    stripe_authorization = Relationship(
        attribute='stripe_authorization',
        self_view='v1.stripe_authorization_event',
        self_view_kwargs={'id': '<id>'},
        related_view='v1.stripe_authorization_detail',
        related_view_kwargs={'event_id': '<id>'},
        schema='StripeAuthorizationSchema',
        type_='stripe-authorization')
    order_statistics = Relationship(
        self_view='v1.event_order_statistics',
        self_view_kwargs={'id': '<id>'},
        related_view='v1.order_statistics_event_detail',
        related_view_kwargs={'id': '<id>'},
        schema='OrderStatisticsEventSchema',
        type_='order-statistics-event')
    general_statistics = Relationship(
        self_view='v1.event_general_statistics',
        self_view_kwargs={'id': '<id>'},
        related_view='v1.event_statistics_general_detail',
        related_view_kwargs={'id': '<id>'},
        schema='EventStatisticsGeneralSchema',
        type_='general-statistics-event')
Beispiel #20
0
class GeokretSchemaPublic(Schema):

    @validates('name')
    def validate_name_blank(self, data):
        data = characterentities.decode(data).replace('\x00', '').strip()
        if not data:
            raise UnprocessableEntity("GeoKrety name cannot be blank",
                                      {'pointer': '/data/attributes/name'})

    @validates('type')
    def validate_geokrety_type_id_valid(self, data):
        if data not in GEOKRETY_TYPES_LIST:
            raise UnprocessableEntity("GeoKrety Type Id is invalid",
                                      {'pointer': '/data/relationships/type'})

    class Meta:
        type_ = 'geokret'
        self_view = 'v1.geokret_details'
        self_view_kwargs = {'id': '<id>'}
        self_view_many = 'v1.geokrety_list'
        inflect = dasherize
        ordered = True

    id = fields.Integer(as_string=True, dump_only=True)
    name = fields.Str(required=True)
    description = fields.Str(allow_none=True)
    missing = fields.Boolean(dump_only=True)
    distance = fields.Integer(dump_only=True)
    archived = fields.Boolean(dump_only=True)
    caches_count = fields.Integer(dump_only=True)
    pictures_count = fields.Integer(dump_only=True)
    average_rating = fields.Float(dump_only=True)
    created_on_datetime = fields.Date(dump_only=True)
    updated_on_datetime = fields.Date(dump_only=True)

    owner = Relationship(
        attribute='owner',
        self_view='v1.geokret_owner',
        self_view_kwargs={'id': '<id>'},
        related_view='v1.user_details',
        related_view_kwargs={'geokret_owned_id': '<id>'},
        schema='UserSchema',
        type_='user',
        include_resource_linkage=True,
    )

    holder = Relationship(
        attribute='holder',
        self_view='v1.geokret_holder',
        self_view_kwargs={'id': '<id>'},
        related_view='v1.user_details',
        related_view_kwargs={'geokret_held_id': '<id>'},
        schema='UserSchema',
        type_='user',
        include_resource_linkage=True,
    )

    type = Relationship(
        attribute='type',
        self_view='v1.geokret_type',
        self_view_kwargs={'id': '<id>'},
        related_view='v1.geokrety_type_details',
        related_view_kwargs={'geokret_id': '<id>'},
        schema='GeoKretyTypesSchema',
        type_='geokrety-type',
        include_resource_linkage=True,
    )

    moves = Relationship(
        self_view='v1.geokret_moves',
        self_view_kwargs={'id': '<id>'},
        related_view='v1.moves_list',
        related_view_kwargs={'geokret_id': '<id>'},
        many=True,
        schema='DefaultMoveSchema',
        type_='move',
    )

    last_position = Relationship(
        attribute='last_position',
        self_view='v1.geokret_last_position',
        self_view_kwargs={'id': '<id>'},
        related_view='v1.move_details',
        related_view_kwargs={'geokret_last_position_id': '<id>'},
        schema='DefaultMoveSchema',
        type_='move',
        include_resource_linkage=True,
    )

    last_move = Relationship(
        attribute='last_move',
        self_view='v1.geokret_last_move',
        self_view_kwargs={'id': '<id>'},
        related_view='v1.move_details',
        related_view_kwargs={'geokret_last_move_id': '<id>'},
        schema='DefaultMoveSchema',
        type_='move',
        include_resource_linkage=True,
    )

    tracking_code = TrackingCodeField(attribute='tracking_code')