Exemple #1
0
 def mail_last_30_days(self, obj):
     all_mails = get_count(
         Mail.query.filter_by(time=datetime.now(pytz.utc)))
     mails_till_last_30_day = get_count(
         Mail.query.filter(
             Mail.time <= datetime.now(pytz.utc) - timedelta(days=30)))
     return all_mails - mails_till_last_30_day
Exemple #2
0
    def before_post(self, args, kwargs, data):
        """
        before post method to check for required relationship and proper permission
        :param args:
        :param kwargs:
        :param data:
        :return:
        """
        require_relationship(['event'], data)
        if not has_access('is_coorganizer', event_id=data['event']):
            raise ObjectNotFound({'parameter': 'event_id'},
                                 "Event: {} not found".format(data['event']))

        if get_count(
                db.session.query(Ticket.id).filter_by(name=data['name'],
                                                      event_id=int(
                                                          data['event']),
                                                      deleted_at=None)) > 0:
            raise ConflictException({'pointer': '/data/attributes/name'},
                                    "Ticket already exists")

        if get_count(
                db.session.query(Event).filter_by(
                    id=int(data['event']), is_ticketing_enabled=False)) > 0:
            raise MethodNotAllowed({'parameter': 'event_id'},
                                   "Ticketing is disabled for this Event")
Exemple #3
0
 def total_requests_past_minute(self, obj):
     all_processes = get_count(
         Process.query.filter_by(time=datetime.now(pytz.utc)))
     processes_till_last_1_min = get_count(
         Process.query.filter(
             Process.time <= datetime.now(pytz.utc) - timedelta(minutes=1)))
     return all_processes - processes_till_last_1_min
    def before_post(self, args, kwargs, data=None):
        """
        method to add user_id to view_kwargs before post
        :param args:
        :param kwargs:
        :param data:
        :return:
        """
        require_relationship(['event', 'user'], data)

        if not has_access('is_coorganizer', event_id=data['event']):
            event = db.session.query(Event).filter_by(id=data['event']).one()
            if event.state == "draft":
                raise ObjectNotFound({'parameter': 'event_id'},
                                     "Event: {} not found".format(data['event_id']))

        if get_count(db.session.query(Event).filter_by(id=int(data['event']), is_sessions_speakers_enabled=False)) > 0:
            raise ForbiddenException({'pointer': ''}, "Speakers are disabled for this Event")

        if get_count(db.session.query(Speaker).filter_by(event_id=int(data['event']), email=data['email'],
                                                         deleted_at=None)) > 0:
            raise ForbiddenException({'pointer': ''}, 'Speaker with this Email ID already exists')

        if 'sessions' in data:
            session_ids = data['sessions']
            for session_id in session_ids:
                if not has_access('is_session_self_submitted', session_id=session_id):
                    raise ObjectNotFound({'parameter': 'session_id'},
                                         "Session: {} not found".format(session_id))
Exemple #5
0
    def before_post(self, args, kwargs, data=None):
        """
        method to add user_id to view_kwargs before post
        :param args:
        :param kwargs:
        :param data:
        :return:
        """
        data['user'] = current_user.id
        require_relationship(['event', 'user'], data)

        if not has_access('is_coorganizer', event_id=data['event']):
            event = db.session.query(Event).filter_by(id=data['event']).one()
            if event.state == "draft":
                raise ObjectNotFound(
                    {'parameter': 'event_id'},
                    "Event: {} not found".format(data['event']),
                )

        if (get_count(
                db.session.query(Event).filter_by(
                    id=int(data['event']), is_sessions_speakers_enabled=False))
                > 0):
            raise ForbiddenError({'pointer': ''},
                                 "Speakers are disabled for this Event")

        if (not data.get('is_email_overridden') and get_count(
                db.session.query(Speaker).filter_by(event_id=int(
                    data['event']),
                                                    email=data['email'],
                                                    deleted_at=None)) > 0):
            raise ForbiddenError({'pointer': ''},
                                 'Speaker with this Email ID already exists')

        if data.get('is_email_overridden') and not has_access(
                'is_organizer', event_id=data['event']):
            raise ForbiddenError(
                {'pointer': 'data/attributes/is_email_overridden'},
                'Organizer access required to override email',
            )
        if (data.get('is_email_overridden')
                and has_access('is_organizer', event_id=data['event'])
                and not data.get('email')):
            data['email'] = current_user.email

        if 'sessions' in data:
            session_ids = data['sessions']
            for session_id in session_ids:
                if not has_access('is_session_self_submitted',
                                  session_id=session_id):
                    raise ObjectNotFound(
                        {'parameter': 'session_id'},
                        f"Session: {session_id} not found",
                    )

        data[
            'complex_field_values'] = validate_custom_form_constraints_request(
                'speaker', self.schema, Speaker(event_id=data['event']), data)
def is_email_available():
    email = request.json.get('email', None)
    if email:
        if get_count(db.session.query(User).filter_by(email=email)):
            return jsonify(result="False")
        return jsonify(result="True")
    abort(make_response(jsonify(error="Email field missing"), 422))
def get_new_slug(name):
    slug = name.lower().replace("& ", "").replace(",", "").replace("/","-").replace(" ","-")
    count = get_count(EventTopic.query.filter_by(slug=slug))
    if count == 0:
        return slug
    else:
        return '{}-{}'.format(slug, uuid.uuid4().hex)
def get_new_identifier():
    identifier = str(uuid.uuid4())
    count = get_count(EventInvoice.query.filter_by(identifier=identifier))
    if count == 0:
        return identifier
    else:
        return get_new_identifier()
Exemple #9
0
 def test_get_count(self):
     """Check DBHelper: get count"""
     with app.test_request_context():
         with mixer.ctx(commit=False):
             user = mixer.blend(User)
         save_to_db(user)
         self.assertEqual(get_count(User.query), 1)
Exemple #10
0
    def test_get_count(self):
        """Method to test the number of queries concerning a Model"""

        with self.app.test_request_context():
            attendee = AttendeeFactory()
            save_to_db(attendee)
            self.assertEqual(get_count(TicketHolder.query), 1)
def get_new_order_identifier():
    identifier = str(uuid.uuid4())
    count = get_count(Order.query.filter_by(identifier=identifier))
    if count == 0:
        return identifier
    else:
        return get_new_order_identifier()
Exemple #12
0
def get_new_event_identifier(length=8):
    identifier = str(binascii.b2a_hex(os.urandom(int(length / 2))), 'utf-8')
    if (not identifier.isdigit()
            and get_count(Event.query.filter_by(identifier=identifier)) == 0):
        return identifier
    else:
        return get_new_event_identifier(length)
Exemple #13
0
def get_new_order_identifier():
    identifier = str(uuid.uuid4())
    count = get_count(Order.query.filter_by(identifier=identifier))
    if count == 0:
        return identifier
    else:
        return get_new_order_identifier()
Exemple #14
0
def get_new_event_identifier(length=8):
    identifier = str(binascii.b2a_hex(os.urandom(int(length / 2))), 'utf-8')
    count = get_count(Event.query.filter_by(identifier=identifier))
    if count == 0:
        return identifier
    else:
        return get_new_event_identifier(length)
 def test_should_create_attendee_forms(self):
     """Method to test custom forms for attendees of an event."""
     with app.test_request_context():
         event = EventFactoryBasic()
         save_to_db(event)
         create_custom_forms_for_attendees(event)
         self.assertEqual(get_count(CustomForms.query), 3)
Exemple #16
0
 def test_should_create_attendee_forms(self):
     """Method to test custom forms for attendees of an event."""
     with app.test_request_context():
         event = EventFactoryBasic()
         save_to_db(event)
         create_custom_forms_for_attendees(event)
         self.assertEqual(get_count(CustomForms.query), 3)
def get_new_identifier():
    identifier = str(uuid.uuid4())
    count = get_count(EventInvoice.query.filter_by(identifier=identifier))
    if count == 0:
        return identifier
    else:
        return get_new_identifier()
def get_new_event_identifier(length=8):
    identifier = str(binascii.b2a_hex(os.urandom(int(length / 2))), 'utf-8')
    count = get_count(Event.query.filter_by(identifier=identifier))
    if count == 0:
        return identifier
    else:
        return get_new_event_identifier(length)
def create_onsite_attendees_for_order(data):
    """
    Creates on site ticket holders for an order and adds it into the request data.
    :param data: data initially passed in the POST request for order.
    :return:
    """
    on_site_tickets = data.get('on_site_tickets')

    if not on_site_tickets:
        raise UnprocessableEntityError(
            {'pointer': 'data/attributes/on_site_tickets'},
            'on_site_tickets info missing')

    data['ticket_holders'] = []

    for on_site_ticket in on_site_tickets:
        ticket_id = on_site_ticket['id']
        quantity = int(on_site_ticket['quantity'])

        ticket = safe_query_without_soft_deleted_entries(
            Ticket, 'id', ticket_id, 'ticket_id')

        ticket_sold_count = get_count(
            db.session.query(TicketHolder.id).filter_by(ticket_id=int(
                ticket.id),
                                                        deleted_at=None))

        # Check if the ticket is already sold out or not.
        if ticket_sold_count + quantity > ticket.quantity:
            # delete the already created attendees.
            for holder in data['ticket_holders']:
                ticket_holder = (db.session.query(TicketHolder).filter(
                    id == int(holder)).one())
                db.session.delete(ticket_holder)
                try:
                    db.session.commit()
                except Exception:
                    logging.exception('DB Exception!')
                    db.session.rollback()

            raise ConflictError(
                {'pointer': '/data/attributes/on_site_tickets'},
                "Ticket with id: {} already sold out. You can buy at most {} tickets"
                .format(ticket_id, ticket.quantity - ticket_sold_count),
            )

        for _ in range(1, quantity):
            ticket_holder = TicketHolder(
                firstname='onsite',
                lastname='attendee',
                email='*****@*****.**',
                ticket_id=ticket.id,
                event_id=data.get('event'),
            )
            save_to_db(ticket_holder)
            data['ticket_holders'].append(ticket_holder.id)

    # delete from the data.
    del data['on_site_tickets']
 def orders_count(self, obj):
     obj_id = obj.id
     total = get_count(db.session.query(Order).join(Order.order_tickets).filter(OrderTicket.ticket_id == obj_id))
     draft = get_count(db.session.query(Order).join(Order.order_tickets).filter(OrderTicket.ticket_id == obj_id,
                                                                                Order.status == 'draft'))
     cancelled = get_count(db.session.query(Order).join(Order.order_tickets).filter(OrderTicket.ticket_id == obj_id,
                                                                                    Order.status == 'cancelled'))
     pending = get_count(db.session.query(Order).join(Order.order_tickets).filter(OrderTicket.ticket_id == obj_id,
                                                                                  Order.status == 'pending'))
     expired = get_count(db.session.query(Order).join(Order.order_tickets).filter(OrderTicket.ticket_id == obj_id,
                                                                                  Order.status == 'expired'))
     placed = get_count(db.session.query(Order).join(Order.order_tickets).filter(OrderTicket.ticket_id == obj_id,
                                                                                 Order.status == 'placed'))
     completed = get_count(db.session.query(Order).join(Order.order_tickets).filter(OrderTicket.ticket_id == obj_id,
                                                                                    Order.status == 'completed'))
     result = {
         'total': total or 0,
         'draft': draft or 0,
         'cancelled': cancelled or 0,
         'pending': pending or 0,
         'expired': expired or 0,
         'placed': placed or 0,
         'completed': completed or 0
     }
     return result
Exemple #21
0
 def orders_count(self, obj):
     obj_id = obj.id
     total = get_count(
         db.session.query(Order).join(
             Order.order_tickets).filter(OrderTicket.ticket_id == obj_id))
     draft = get_count(
         db.session.query(Order).join(Order.order_tickets).filter(
             OrderTicket.ticket_id == obj_id, Order.status == 'draft'))
     cancelled = get_count(
         db.session.query(Order).join(Order.order_tickets).filter(
             OrderTicket.ticket_id == obj_id, Order.status == 'cancelled'))
     pending = get_count(
         db.session.query(Order).join(Order.order_tickets).filter(
             OrderTicket.ticket_id == obj_id, Order.status == 'pending'))
     expired = get_count(
         db.session.query(Order).join(Order.order_tickets).filter(
             OrderTicket.ticket_id == obj_id, Order.status == 'expired'))
     placed = get_count(
         db.session.query(Order).join(Order.order_tickets).filter(
             OrderTicket.ticket_id == obj_id, Order.status == 'placed'))
     completed = get_count(
         db.session.query(Order).join(Order.order_tickets).filter(
             OrderTicket.ticket_id == obj_id, Order.status == 'completed'))
     result = {
         'total': total or 0,
         'draft': draft or 0,
         'cancelled': cancelled or 0,
         'pending': pending or 0,
         'expired': expired or 0,
         'placed': placed or 0,
         'completed': completed or 0
     }
     return result
Exemple #22
0
 def has_order_tickets(self):
     """Returns True if ticket has already placed orders.
     Else False.
     """
     from app.api.helpers.db import get_count
     orders = Order.id.in_(OrderTicket.query.with_entities(OrderTicket.order_id).filter_by(ticket_id=self.id).all())
     count = get_count(Order.query.filter(orders).filter(Order.status != 'deleted'))
     # Count is zero if no completed orders are present
     return bool(count > 0)
 def has_order_tickets(self):
     """Returns True if ticket has already placed orders.
     Else False.
     """
     from app.api.helpers.db import get_count
     orders = Order.id.in_(OrderTicket.query.with_entities(OrderTicket.order_id).filter_by(ticket_id=self.id).all())
     count = get_count(Order.query.filter(orders).filter(Order.status != 'deleted'))
     # Count is zero if no completed orders are present
     return bool(count > 0)
Exemple #24
0
 def before_create_object(self, data, view_kwargs):
     if data.get('used_for') == 'ticket' and (event_id :=
                                              data.get('event')):
         discount_codes = DiscountCode.query.filter_by(event_id=event_id,
                                                       code=data['code'],
                                                       deleted_at=None)
         if get_count(discount_codes) > 0:
             raise ConflictError({'pointer': '/data/attributes/code'},
                                 'Discount Code already exists')
Exemple #25
0
def is_email_available():
    email = request.json.get('email', None)
    if email:
        if get_count(
                db.session.query(User).filter_by(deleted_at=None,
                                                 email=email)):
            return jsonify(exists=True)
        return jsonify(exists=False)
    abort(make_response(jsonify(error="Email field missing"), 422))
    def before_post(self, args, kwargs, data):
        """
        before post method to check for required relationship and proper permission
        :param args:
        :param kwargs:
        :param data:
        :return:
        """
        require_relationship(['event'], data)
        if not has_access('is_coorganizer', event_id=data['event']):
            raise ObjectNotFound({'parameter': 'event_id'},
                                 "Event: {} not found".format(data['event']))

        if get_count(db.session.query(Ticket.id).filter_by(name=data['name'], event_id=int(data['event']),
                                                           deleted_at=None)) > 0:
            raise ConflictException({'pointer': '/data/attributes/name'}, "Ticket already exists")

        if get_count(db.session.query(Event).filter_by(id=int(data['event']), is_ticketing_enabled=False)) > 0:
            raise MethodNotAllowed({'parameter': 'event_id'}, "Ticketing is disabled for this Event")
def get_new_social_link_identifier(length=8):
    """
    returns a new social link identifier.
    :param length:
    :return:
    """
    identifier = str(binascii.b2a_hex(os.urandom(int(length / 2))), 'utf-8')
    count = get_count(SocialLink.query.filter_by(identifier=identifier))
    if count == 0:
        return identifier
    return get_new_social_link_identifier(length)
 def before_post(self, args, kwargs, data):
     """
     before post method to check for required relationship and proper permission
     :param args:
     :param kwargs:
     :param data:
     :return:
     """
     require_relationship(['event', 'track'], data)
     data['creator_id'] = current_identity.id
     if get_count(db.session.query(Event).filter_by(id=int(data['event']), is_sessions_speakers_enabled=False)) > 0:
         raise ForbiddenException({'pointer': ''}, "Sessions are disabled for this Event")
def get_new_social_link_identifier(length=8):
    """
    returns a new social link identifier.
    :param length:
    :return:
    """
    identifier = str(binascii.b2a_hex(os.urandom(int(length / 2))), 'utf-8')
    count = get_count(SocialLink.query.filter_by(identifier=identifier))
    if count == 0:
        return identifier
    else:
        return get_new_social_link_identifier(length)
Exemple #30
0
 def before_post(self, args, kwargs, data):
     """
     before post method to check for required relationship and proper permission
     :param args:
     :param kwargs:
     :param data:
     :return:
     """
     require_relationship(['event', 'track'], data)
     data['creator_id'] = current_user.id
     if get_count(db.session.query(Event).filter_by(id=int(data['event']), is_sessions_speakers_enabled=False)) > 0:
         raise ForbiddenException({'pointer': ''}, "Sessions are disabled for this Event")
    def before_post(self, args, kwargs, data):
        """
        before post method to check for required relationship and proper permission
        :param args:
        :param kwargs:
        :param data:
        :return:
        """
        require_relationship(['user'], data)

        if get_count(db.session.query(UserEmail.id).filter_by(email_address=data.get('email-address'),
                    user_id=int(data['user']), deleted_at=None)) > 0:
            raise ConflictException({'pointer': '/data/attributes/name'}, "Email already exists")
 def before_post(self, args, kwargs, data):
     """
     before post method to check for required relationship and proper permission
     :param args:
     :param kwargs:
     :param data:
     :return:
     """
     require_relationship(['event'], data)
     if not has_access('is_coorganizer', event_id=data['event']):
         raise ForbiddenException({'source': ''}, 'Co-organizer access is required.')
     if get_count(db.session.query(Event).filter_by(id=int(data['event']), is_tax_enabled=False)) > 0:
         raise MethodNotAllowed({'parameter': 'event_id'}, "Tax is disabled for this Event")
    def match_discount_quantity(discount_code, ticket_holders=None):
        qty = 0
        old_holders = get_count(TicketHolder.query.filter(TicketHolder.ticket_id.in_(discount_code.tickets.split(","))))

        for holder in ticket_holders:
            ticket_holder = TicketHolder.query.filter_by(id=holder).one()
            if ticket_holder.ticket.id in discount_code.tickets.split(","):
                qty += 1
        if (qty+old_holders) <= discount_code.tickets_number and \
           discount_code.min_quantity <= qty <= discount_code.max_quantity:
            return True

        return False
 def before_post(self, args, kwargs, data):
     """
     before post method to check for required relationship and proper permission
     :param args:
     :param kwargs:
     :param data:
     :return:
     """
     require_relationship(['event'], data)
     if not has_access('is_organizer', event_id=data['event']):
         raise ForbiddenException({'source': ''}, "Minimum Organizer access required")
     if get_count(db.session.query(Event).filter_by(id=int(data['event']), can_pay_by_stripe=False)) > 0:
         raise ForbiddenException({'pointer': ''}, "Stripe payment is disabled for this Event")
Exemple #35
0
    def before_post(self, args, kwargs, data):
        """
        Before post method to check for required relationship and proper permissions
        :param args:
        :param kwargs:
        :param data:
        :return:
        """
        require_relationship(['ticket', 'event'], data)

        ticket = db.session.query(Ticket).filter_by(
            id=int(data['ticket']), deleted_at=None
            ).first()
        if ticket is None:
            raise UnprocessableEntity(
                {'pointer': '/data/relationships/ticket'}, "Invalid Ticket"
                )
        if ticket.event_id != int(data['event']):
            raise UnprocessableEntity(
                {'pointer': '/data/relationships/ticket'},
                "Ticket belongs to a different Event"
            )
        # Check if the ticket is already sold out or not.
        if get_count(db.session.query(TicketHolder.id).
                     filter_by(ticket_id=int(data['ticket']), deleted_at=None)) >= ticket.quantity:
            raise ConflictException(
                {'pointer': '/data/attributes/ticket_id'},
                "Ticket already sold out"
            )

        if 'device_name_checkin' in data and data['device_name_checkin'] is not None:
            if 'is_checked_in' not in data or not data['is_checked_in']:
                raise UnprocessableEntity(
                    {'pointer': '/data/attributes/device_name_checkin'},
                    "Attendee needs to be checked in first"
                )
            elif 'checkin_times' not in data or data['checkin_times'] is None:
                raise UnprocessableEntity(
                    {'pointer': '/data/attributes/device_name_checkin'},
                    "Check in Times missing"
                )
            elif len(data['checkin_times'].split(",")) != len(data['device_name_checkin'].split(",")):
                raise UnprocessableEntity(
                    {'pointer': '/data/attributes/device_name_checkin'},
                    "Check in Times missing for the corresponding device name"
                )

        if 'checkin_times' in data:
            if 'device_name_checkin' not in data or data['device_name_checkin'] is None:
                data['device_name_checkin'] = '-'
    def before_post(self, args, kwargs, data):
        """
        Before post method to check for required relationship and proper permissions
        :param args:
        :param kwargs:
        :param data:
        :return:
        """
        require_relationship(['ticket', 'event'], data)

        ticket = db.session.query(Ticket).filter_by(
            id=int(data['ticket']), deleted_at=None
            ).first()
        if ticket is None:
            raise UnprocessableEntity(
                {'pointer': '/data/relationships/ticket'}, "Invalid Ticket"
                )
        if ticket.event_id != int(data['event']):
            raise UnprocessableEntity(
                {'pointer': '/data/relationships/ticket'},
                "Ticket belongs to a different Event"
            )
        # Check if the ticket is already sold out or not.
        if get_count(db.session.query(TicketHolder.id).
                     filter_by(ticket_id=int(data['ticket']), deleted_at=None)) >= ticket.quantity:
            raise ConflictException(
                {'pointer': '/data/attributes/ticket_id'},
                "Ticket already sold out"
            )

        if 'device_name_checkin' in data and data['device_name_checkin'] is not None:
            if 'is_checked_in' not in data or not data['is_checked_in']:
                raise UnprocessableEntity(
                    {'pointer': '/data/attributes/device_name_checkin'},
                    "Attendee needs to be checked in first"
                )
            elif 'checkin_times' not in data or data['checkin_times'] is None:
                raise UnprocessableEntity(
                    {'pointer': '/data/attributes/device_name_checkin'},
                    "Check in Times missing"
                )
            elif len(data['checkin_times'].split(",")) != len(data['device_name_checkin'].split(",")):
                raise UnprocessableEntity(
                    {'pointer': '/data/attributes/device_name_checkin'},
                    "Check in Times missing for the corresponding device name"
                )

        if 'checkin_times' in data:
            if 'device_name_checkin' not in data or data['device_name_checkin'] is None:
                data['device_name_checkin'] = '-'
def create_onsite_attendees_for_order(data):
    """
    Creates on site ticket holders for an order and adds it into the request data.
    :param data: data initially passed in the POST request for order.
    :return:
    """
    on_site_tickets = data.get('on_site_tickets')

    if not on_site_tickets:
        raise UnprocessableEntity({'pointer': 'data/attributes/on_site_tickets'}, 'on_site_tickets info missing')

    data['ticket_holders'] = []

    for on_site_ticket in on_site_tickets:
        ticket_id = on_site_ticket['id']
        quantity = int(on_site_ticket['quantity'])

        ticket = safe_query_without_soft_deleted_entries(db, Ticket, 'id', ticket_id, 'ticket_id')

        ticket_sold_count = get_count(db.session.query(TicketHolder.id).
                                      filter_by(ticket_id=int(ticket.id), deleted_at=None))

        # Check if the ticket is already sold out or not.
        if ticket_sold_count + quantity > ticket.quantity:
            # delete the already created attendees.
            for holder in data['ticket_holders']:
                ticket_holder = db.session.query(TicketHolder).filter(id == int(holder)).one()
                db.session.delete(ticket_holder)
                try:
                    db.session.commit()
                except Exception as e:
                    logging.error('DB Exception! %s' % e)
                    db.session.rollback()

            raise ConflictException(
                {'pointer': '/data/attributes/on_site_tickets'},
                "Ticket with id: {} already sold out. You can buy at most {} tickets".format(ticket_id,
                                                                                             ticket.quantity -
                                                                                             ticket_sold_count)
            )

        for _ in range(1, quantity):
            ticket_holder = TicketHolder(firstname='onsite', lastname='attendee', email='*****@*****.**',
                                         ticket_id=ticket.id, event_id=data.get('event'))
            save_to_db(ticket_holder)
            data['ticket_holders'].append(ticket_holder.id)

    # delete from the data.
    del data['on_site_tickets']
Exemple #38
0
    def match_discount_quantity(discount_code, ticket_holders=None):
        qty = 0
        old_holders = get_count(
            TicketHolder.query.filter(
                TicketHolder.ticket_id.in_(discount_code.tickets.split(","))))

        for holder in ticket_holders:
            ticket_holder = TicketHolder.query.filter_by(id=holder).one()
            if ticket_holder.ticket.id in discount_code.tickets.split(","):
                qty += 1
        if (qty + old_holders) <= discount_code.tickets_number and \
            discount_code.min_quantity <= qty <= discount_code.max_quantity:
            return True

        return False
def is_email_available():
    email = request.json.get('email', None)
    if email:
        if get_count(db.session.query(User).filter_by(email=email)):
            return jsonify(
                result="False"
            )
        else:
            return jsonify(
                result="True"
            )
    else:
        abort(
            make_response(jsonify(error="Email field missing"), 422)
        )
Exemple #40
0
 def before_post(self, args, kwargs, data):
     """
     before post method to check for required relationship and proper permission
     :param args:
     :param kwargs:
     :param data:
     :return:
     """
     require_relationship(['event'], data)
     if not has_access('is_coorganizer', event_id=data['event']):
         raise ForbiddenException({'source': ''},
                                  'Co-organizer access is required.')
     if get_count(
             db.session.query(Event).filter_by(
                 id=int(data['event']), is_sponsors_enabled=False)) > 0:
         raise ForbiddenException({'pointer': ''},
                                  "Sponsors are disabled for this Event")
 def before_post(self, args, kwargs, data):
     """
     before post method to check for required relationship and proper permission
     :param args:
     :param kwargs:
     :param data:
     :return:
     """
     require_relationship(['event'], data)
     if not has_access('is_organizer', event_id=data['event']):
         raise ForbiddenError({'source': ''},
                              "Minimum Organizer access required")
     if (get_count(
             db.session.query(Event).filter_by(
                 id=int(data['event']), can_pay_by_stripe=False)) > 0):
         raise ForbiddenError({'pointer': ''},
                              "Stripe payment is disabled for this Event")
Exemple #42
0
 def before_post(self, args, kwargs, data):
     """
     before post method to check for required relationship and proper permission
     :param args:
     :param kwargs:
     :param data:
     :return:
     """
     require_relationship(['event'], data)
     if not has_access('is_coorganizer', event_id=data['event']):
         raise ForbiddenError({'source': ''},
                              'Co-organizer access is required.')
     if (get_count(
             db.session.query(Event).filter_by(id=int(data['event']),
                                               is_tax_enabled=False)) > 0):
         raise MethodNotAllowed({'parameter': 'event_id'},
                                "Tax is disabled for this Event")
Exemple #43
0
    def before_post(self, args, kwargs, data):
        """
        before post method to check for required relationship and proper permission
        :param args:
        :param kwargs:
        :param data:
        :return:
        """
        require_relationship(['user'], data)

        if (get_count(
                db.session.query(UserEmail.id).filter_by(
                    email_address=data.get('email-address'),
                    user_id=int(data['user']),
                    deleted_at=None,
                )) > 0):
            raise ConflictError({'pointer': '/data/attributes/name'},
                                "Email already exists")
Exemple #44
0
    def before_post(self, args, kwargs, data):
        """
        before post method to check for required relationship and proper permission
        :param args:
        :param kwargs:
        :param data:
        :return:
        """
        require_relationship(['event', 'track'], data)
        data['creator_id'] = current_user.id
        if (get_count(
                db.session.query(Event).filter_by(
                    id=int(data['event']), is_sessions_speakers_enabled=False))
                > 0):
            raise ForbiddenError({'pointer': ''},
                                 "Sessions are disabled for this Event")

        data[
            'complex_field_values'] = validate_custom_form_constraints_request(
                'session', self.schema, Session(event_id=data['event']), data)
Exemple #45
0
def is_discount_available(discount_code, tickets=None, ticket_holders=None):
    """
    Validation of discount code belonging to the tickets and events should be done
    before calling this method
    """
    qty = 0
    # TODO(Areeb): Extremely confusing here what should we do about deleted tickets here
    ticket_ids = [ticket.id for ticket in discount_code.tickets]
    old_holders = discount_code.confirmed_attendees_count
    if ticket_holders:
        # pytype: disable=attribute-error
        qty = get_count(
            TicketHolder.query.filter(
                TicketHolder.id.in_(ticket_holders),
                TicketHolder.ticket_id.in_(ticket_ids),
            )
        )
        # pytype: enable=attribute-error
    elif tickets:
        for ticket in tickets:
            if int(ticket['id']) in ticket_ids:
                qty += ticket.get('quantity', 1)

    max_quantity = qty if discount_code.max_quantity < 0 else discount_code.max_quantity

    available = (
        (qty + old_holders) <= discount_code.tickets_number
        and discount_code.min_quantity <= qty <= max_quantity
    )
    if not available:
        logger.warning(
            "Discount code usage exhausted",
            extra=dict(
                discount_code=discount_code,
                ticket_ids=ticket_ids,
                ticket_holders=ticket_holders,
                quantity=qty,
                old_holders=old_holders,
            ),
        )
    return available
 def match_discount_quantity(discount_code,
                             tickets=None,
                             ticket_holders=None):
     qty = 0
     ticket_ids = [ticket.id for ticket in discount_code.tickets]
     old_holders = get_count(
         TicketHolder.query.filter(
             TicketHolder.ticket_id.in_(ticket_ids)).join(Order).filter(
                 Order.status.in_(['completed', 'placed'])))
     if ticket_holders:
         for holder in ticket_holders:
             ticket_holder = TicketHolder.query.filter_by(id=holder).one()
             if ticket_holder.ticket.id in ticket_ids:
                 qty += 1
     elif tickets:
         for ticket in tickets:
             if int(ticket['id']) in ticket_ids:
                 qty += ticket['quantity']
     if (qty + old_holders) <= discount_code.tickets_number and \
         discount_code.min_quantity <= qty <= discount_code.max_quantity:
         return True
     return False
Exemple #47
0
 def track_organizer_count(self, obj):
     return get_count(self.get_all_user_roles('track_organizer'))
Exemple #48
0
 def coorganizer_count(self, obj):
     return get_count(self.get_all_user_roles('coorganizer'))
 def mail_last_30_days(self, obj):
     all_mails = get_count(Mail.query.filter_by(time=datetime.now(pytz.utc)))
     mails_till_last_30_day = get_count(Mail.query.filter(Mail.time <= datetime.now(pytz.utc) - timedelta(days=30)))
     return all_mails - mails_till_last_30_day
Exemple #50
0
 def unverified_count(self, obj):
     return get_count(User.query.filter_by(is_verified=False))
Exemple #51
0
 def verified_count(self, obj):
     return get_count(User.query.filter_by(is_verified=True))
 def get_unread_notif_count(self):
     return get_count(Notification.query.filter_by(user=self, is_read=False))
Exemple #53
0
 def mail_last_30_days(self, obj):
     return get_count(Mail.query.filter(datetime.now(pytz.utc) - Mail.time <= timedelta(days=30)))
 def test_get_count(self):
     with app.test_request_context():
         attendee = AttendeeFactory()
         save_to_db(attendee)
         self.assertEqual(get_count(TicketHolder.query), 1)
Exemple #55
0
 def admin_count(self, obj):
     return get_count(User.query.filter_by(is_admin=True))
Exemple #56
0
 def events_past_count(self, obj):
     return get_count(Event.query.filter(Event.ends_at < datetime.now(pytz.utc)))
Exemple #57
0
 def events_published_count(self, obj):
     return get_count(Event.query.filter_by(state='published'))
Exemple #58
0
 def events_draft_count(self, obj):
     return get_count(Event.query.filter_by(state='draft'))
Exemple #59
0
 def attendee_count(self, obj):
     return get_count(self.get_all_user_roles('attendee'))