def before_get(self, args, kwargs): if kwargs.get('ticket_id'): if has_access('is_coorganizer'): ticket = safe_query_kwargs(Ticket, kwargs, 'ticket_id') if ticket.discount_code_id: kwargs['id'] = ticket.discount_code_id else: kwargs['id'] = None else: raise UnprocessableEntityError( {'source': ''}, "Please verify your permission. You must have coorganizer " "privileges to view ticket discount code details", ) if kwargs.get('event_id'): if has_access('is_admin'): event = safe_query_kwargs(Event, kwargs, 'event_id') if event.discount_code_id: kwargs['id'] = event.discount_code_id else: kwargs['id'] = None else: raise UnprocessableEntityError( {'source': ''}, "Please verify your permission. You must be admin to view event discount code details", ) if kwargs.get('event_identifier'): event = safe_query_kwargs(Event, kwargs, 'event_identifier', 'identifier') kwargs['event_id'] = event.id if kwargs.get('discount_event_identifier'): event = safe_query( Event, 'identifier', kwargs['discount_event_identifier'], 'event_identifier', ) kwargs['discount_event_id'] = event.id if kwargs.get('event_id') and has_access('is_admin'): event = safe_query_kwargs(Event, kwargs, 'event_id') if event.discount_code_id: kwargs['id'] = event.discount_code_id else: kwargs['id'] = None # Any registered user can fetch discount code details using the code. if kwargs.get('code'): # filter on deleted_at is required to catch the id of a # discount code which has not been deleted. discount = (db.session.query(DiscountCode).filter_by( code=kwargs.get('code'), event_id=kwargs.get('discount_event_id'), deleted_at=None, ).first()) if discount: kwargs['id'] = discount.id if discount.valid_from: discount_tz = discount.valid_from.tzinfo current_time = datetime.now().replace( tzinfo=discount_tz or timezone('UTC')) if not discount.is_active: raise MethodNotAllowed({'parameter': '{code}'}, "Discount Code is not active") if (current_time < discount.valid_from or current_time > discount.valid_expire_time): raise MethodNotAllowed( {'parameter': '{code}'}, "Discount Code is not active in current time frame", ) else: raise ObjectNotFound({'parameter': '{code}'}, "DiscountCode: not found") self.schema = DiscountCodeSchemaTicket return if kwargs.get('id'): try: discount = (db.session.query(DiscountCode).filter_by( id=kwargs.get('id')).one()) except NoResultFound: raise ObjectNotFound({'parameter': '{id}'}, "DiscountCode: not found") # if discount.used_for == 'ticket' and has_access('is_coorganizer', event_id=discount.event_id): if discount.used_for == 'ticket': self.schema = DiscountCodeSchemaTicket # elif discount.used_for == 'event' and has_access('is_admin'): elif discount.used_for == 'event': self.schema = DiscountCodeSchemaEvent else: raise UnprocessableEntityError({'source': ''}, "Please verify your permission")
def before_get_object(self, view_kwargs): """ before get method for Discount Code detail :param view_kwargs: :return: """ if view_kwargs.get('event_identifier'): event = safe_query_kwargs( Event, view_kwargs, 'event_identifier', 'identifier', ) view_kwargs['event_id'] = event.id if view_kwargs.get('event_id') and has_access('is_admin'): event = safe_query_kwargs(Event, view_kwargs, 'event_id') if event.discount_code_id: view_kwargs['id'] = event.discount_code_id else: view_kwargs['id'] = None if view_kwargs.get('event_invoice_id') and has_access('is_admin'): event_invoice = safe_query_kwargs( EventInvoice, view_kwargs, 'event_invoice_id', ) if event_invoice.discount_code_id: view_kwargs['id'] = event_invoice.discount_code_id else: view_kwargs['id'] = None if view_kwargs.get('event_invoice_identifier') and has_access( 'is_admin'): event_invoice = safe_query_kwargs(EventInvoice, view_kwargs, 'event_invoice_identifier', 'identifier') if event_invoice.discount_code_id: view_kwargs['id'] = event_invoice.discount_code_id else: view_kwargs['id'] = None if view_kwargs.get('id'): try: discount = (self.session.query(DiscountCode).filter_by( id=view_kwargs.get('id')).one()) except NoResultFound: raise ObjectNotFound({'parameter': '{id}'}, "DiscountCode: not found") if 'code' in view_kwargs: # usage via discount code is public self.schema = DiscountCodeSchemaPublic return # if discount.used_for == 'ticket' and has_access('is_coorganizer', event_id=discount.event_id): if discount.used_for == 'ticket': self.schema = DiscountCodeSchemaTicket # elif discount.used_for == 'event' and has_access('is_admin'): elif discount.used_for == 'event': self.schema = DiscountCodeSchemaEvent else: raise UnprocessableEntityError({'source': ''}, "Please verify your permission") elif not view_kwargs.get('id') and not has_access('is_admin'): raise UnprocessableEntityError( {'source': ''}, "Please verify your permission. You must be admin to view event\ discount code details", )
def after_get_object(self, stream, view_kwargs): if stream and not stream.user_can_access: raise ObjectNotFound({'parameter': 'id'}, f"Video Stream: {stream.id} not found")
def calculate_order_amount(tickets, discount_code=None): from app.api.helpers.ticketing import validate_discount_code, validate_tickets from app.models.discount_code import DiscountCode ticket_ids = {ticket['id'] for ticket in tickets} ticket_map = {int(ticket['id']): ticket for ticket in tickets} fetched_tickets = validate_tickets(ticket_ids) if tickets and discount_code: discount_code = validate_discount_code(discount_code, tickets=tickets) event = tax = tax_included = fees = None total_amount = total_tax = total_discount = 0.0 ticket_list = [] for ticket in fetched_tickets: ticket_tax = discounted_tax = 0.0 ticket_info = ticket_map[ticket.id] discount_amount = 0.0 discount_data = None ticket_fee = 0.0 quantity = ticket_info.get('quantity', 1) # Default to single ticket if not event: event = ticket.event if event.deleted_at: raise ObjectNotFound({'pointer': 'tickets/event'}, f'Event: {event.id} not found') fees = TicketFees.query.filter_by( currency=event.payment_currency).first() if not tax and event.tax: tax = event.tax tax_included = tax.is_tax_included_in_price if ticket.type in ['donation', 'donationRegistration']: price = ticket_info.get('price') if not price or price > ticket.max_price or price < ticket.min_price: raise UnprocessableEntityError( {'pointer': 'tickets/price'}, f"Price for donation ticket should be present and within range " f"{ticket.min_price} to {ticket.max_price}", ) else: price = ticket.price if ticket.type not in [ 'free', 'freeRegistration' ] else 0.0 if tax: if tax_included: ticket_tax = price - price / (1 + tax.rate / 100) else: ticket_tax = price * tax.rate / 100 if discount_code and ticket.type not in ['free', 'freeRegistration']: code = (DiscountCode.query.with_parent(ticket).filter_by( id=discount_code.id).first()) if code: if discount_code.id == code.id: if code.type == 'amount': discount_amount = min(code.value, price) discount_percent = (discount_amount / price) * 100 if tax: if tax_included: discounted_tax = (price - discount_amount) - ( price - discount_amount) / (1 + tax.rate / 100) else: discounted_tax = ((price - discount_amount) * tax.rate / 100) else: discount_amount = (price * code.value) / 100 if tax: discounted_tax = ticket_tax - (ticket_tax * code.value / 100) discount_percent = code.value discount_data = { 'code': discount_code.code, 'percent': round(discount_percent, 2), 'amount': round(discount_amount, 2), 'total': round(discount_amount * quantity, 2), 'type': code.type, } total_discount += round(discount_amount * quantity, 2) if fees and not ticket.is_fee_absorbed: ticket_fee = fees.service_fee * (price * quantity) / 100 if ticket_fee > fees.maximum_fee: ticket_fee = fees.maximum_fee sub_total = ticket_fee + (price - discount_amount) * quantity total_amount = total_amount + sub_total ticket_list.append({ 'id': ticket.id, 'name': ticket.name, 'price': price, 'quantity': quantity, 'discount': discount_data, 'ticket_fee': round(ticket_fee, 2), 'sub_total': round(sub_total, 2), 'ticket_tax': round(ticket_tax, 2), 'discounted_tax': round(discounted_tax, 2), }) sub_total = total_amount tax_dict = None if tax: if tax_included: total_tax = total_amount - total_amount / (1 + tax.rate / 100) else: total_tax = total_amount * tax.rate / 100 total_amount += total_tax tax_dict = dict( included=tax_included, amount=round(total_tax, 2), percent=tax.rate if tax else 0.0, name=tax.name, ) return dict( tax=tax_dict, sub_total=round(sub_total, 2), total=round(total_amount, 2), discount=round(total_discount, 2), tickets=ticket_list, )
def before_get(self, args, kwargs): if kwargs.get('ticket_id'): if has_access('is_coorganizer'): ticket = safe_query(db, Ticket, 'id', kwargs['ticket_id'], 'ticket_id') if ticket.discount_code_id: kwargs['id'] = ticket.discount_code_id else: kwargs['id'] = None else: raise UnprocessableEntity( {'source': ''}, "Please verify your permission. You must have coorganizer " "privileges to view ticket discount code details") if kwargs.get('event_id'): if has_access('is_admin'): event = safe_query(db, Event, 'id', kwargs['event_id'], 'event_id') if event.discount_code_id: kwargs['id'] = event.discount_code_id else: kwargs['id'] = None else: raise UnprocessableEntity( {'source': ''}, "Please verify your permission. You must be admin to view event discount code details") if kwargs.get('event_identifier'): event = safe_query( db, Event, 'identifier', kwargs['event_identifier'], 'event_identifier') kwargs['event_id'] = event.id if kwargs.get('event_id') and has_access('is_admin'): event = safe_query(db, Event, 'id', kwargs['event_id'], 'event_id') if event.discount_code_id: kwargs['id'] = event.discount_code_id else: kwargs['id'] = None # Any registered user can fetch discount code details using the code. if kwargs.get('code'): # filter on deleted_at is required to catch the id of a # discount code which has not been deleted. discount = db.session.query(DiscountCode).filter_by(code=kwargs.get('code'), deleted_at=None).first() if discount: kwargs['id'] = discount.id else: raise ObjectNotFound({'parameter': '{code}'}, "DiscountCode: not found") self.schema = DiscountCodeSchemaTicket return if kwargs.get('id'): try: discount = db.session.query( DiscountCode).filter_by(id=kwargs.get('id')).one() except NoResultFound: raise ObjectNotFound( {'parameter': '{id}'}, "DiscountCode: not found") if discount.used_for == 'ticket' and has_access('is_coorganizer', event_id=discount.event_id): self.schema = DiscountCodeSchemaTicket elif discount.used_for == 'event' and has_access('is_admin'): self.schema = DiscountCodeSchemaEvent else: raise UnprocessableEntity({'source': ''}, "Please verify your permission")
def update_relationship(self, json_data, relationship_field, related_id_field, view_kwargs): """Update a relationship :param dict json_data: the request params :param str relationship_field: the model attribute used for relationship :param str related_id_field: the identifier field of the related model :param dict view_kwargs: kwargs from the resource view :return boolean: True if relationship have changed else False """ self.before_update_relationship(json_data, relationship_field, related_id_field, view_kwargs) obj = self.get_object(view_kwargs) if obj is None: url_field = getattr(self, 'url_field', 'id') filter_value = view_kwargs[url_field] raise ObjectNotFound('{}: {} not found'.format( self.model.__name__, filter_value), source={'parameter': url_field}) if not hasattr(obj, relationship_field): raise RelationNotFound("{} has no attribute {}".format( obj.__class__.__name__, relationship_field)) related_model = getattr(obj.__class__, relationship_field).property.mapper.class_ updated = False if isinstance(json_data['data'], list): related_objects = [] for obj_ in json_data['data']: related_objects.append( self.get_related_object(related_model, related_id_field, obj_)) obj_ids = { getattr(obj__, related_id_field) for obj__ in getattr(obj, relationship_field) } new_obj_ids = { getattr(related_object, related_id_field) for related_object in related_objects } if obj_ids != new_obj_ids: setattr(obj, relationship_field, related_objects) updated = True else: related_object = None if json_data['data'] is not None: related_object = self.get_related_object( related_model, related_id_field, json_data['data']) obj_id = getattr(getattr(obj, relationship_field), related_id_field, None) new_obj_id = getattr(related_object, related_id_field, None) if obj_id != new_obj_id: setattr(obj, relationship_field, related_object) updated = True try: self.session.commit() except JsonApiException as e: self.session.rollback() raise e except Exception as e: self.session.rollback() raise JsonApiException("Update relationship error: " + str(e)) self.after_update_relationship(obj, updated, json_data, relationship_field, related_id_field, view_kwargs) return obj, updated
def after_get_object(self, event, view_kwargs): if event.state == "draft": if not is_logged_in() or not has_access('is_coorganizer', event_id=event.id): raise ObjectNotFound({'parameter': '{id}'}, "Event: not found")
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', ) elif ( 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'}, "Session: {} not found".format(session_id), ) data['complex_field_values'] = validate_custom_form_constraints_request( 'speaker', SpeakerSchema, Speaker(event_id=data['event']), data )
def get_id(view_kwargs): """ method to get the resource id for fetching details :param view_kwargs: :return: """ if view_kwargs.get('identifier'): event = safe_query_kwargs(Event, view_kwargs, 'identifier', 'identifier') view_kwargs['id'] = event.id if view_kwargs.get('sponsor_id') is not None: sponsor = safe_query_kwargs(Sponsor, view_kwargs, 'sponsor_id') if sponsor.event_id is not None: view_kwargs['id'] = sponsor.event_id else: view_kwargs['id'] = None if view_kwargs.get('user_favourite_event_id') is not None: user_favourite_event = safe_query_kwargs( UserFavouriteEvent, view_kwargs, 'user_favourite_event_id', ) if user_favourite_event.event_id is not None: view_kwargs['id'] = user_favourite_event.event_id else: view_kwargs['id'] = None if view_kwargs.get('copyright_id') is not None: copyright = safe_query_kwargs(EventCopyright, view_kwargs, 'copyright_id') if copyright.event_id is not None: view_kwargs['id'] = copyright.event_id else: view_kwargs['id'] = None if view_kwargs.get('track_id') is not None: track = safe_query_kwargs(Track, view_kwargs, 'track_id') if track.event_id is not None: view_kwargs['id'] = track.event_id else: view_kwargs['id'] = None if view_kwargs.get('session_type_id') is not None: session_type = safe_query_kwargs(SessionType, view_kwargs, 'session_type_id') if session_type.event_id is not None: view_kwargs['id'] = session_type.event_id else: view_kwargs['id'] = None if view_kwargs.get('faq_type_id') is not None: faq_type = safe_query_kwargs(FaqType, view_kwargs, 'faq_type_id') if faq_type.event_id is not None: view_kwargs['id'] = faq_type.event_id else: view_kwargs['id'] = None if view_kwargs.get('event_invoice_id') is not None: event_invoice = safe_query_kwargs(EventInvoice, view_kwargs, 'event_invoice_id') if event_invoice.event_id is not None: view_kwargs['id'] = event_invoice.event_id else: view_kwargs['id'] = None if view_kwargs.get('event_invoice_identifier') is not None: event_invoice = safe_query_kwargs(EventInvoice, view_kwargs, 'event_invoice_identifier', 'identifier') if event_invoice.event_id is not None: view_kwargs['id'] = event_invoice.event_id else: view_kwargs['id'] = None if view_kwargs.get('discount_code_id') is not None: discount_code = safe_query_kwargs(DiscountCode, view_kwargs, 'discount_code_id') if discount_code.event_id is not None: view_kwargs['id'] = discount_code.event_id else: view_kwargs['id'] = None if view_kwargs.get('session_id') is not None: sessions = safe_query_kwargs(Session, view_kwargs, 'session_id') if sessions.event_id is not None: view_kwargs['id'] = sessions.event_id else: view_kwargs['id'] = None if view_kwargs.get('social_link_id') is not None: social_link = safe_query_kwargs(SocialLink, view_kwargs, 'social_link_id') if social_link.event_id is not None: view_kwargs['id'] = social_link.event_id else: view_kwargs['id'] = None if view_kwargs.get('tax_id') is not None: tax = safe_query_kwargs(Tax, view_kwargs, 'tax_id') if tax.event_id is not None: view_kwargs['id'] = tax.event_id else: view_kwargs['id'] = None if view_kwargs.get('stripe_authorization_id') is not None: stripe_authorization = safe_query_kwargs( StripeAuthorization, view_kwargs, 'stripe_authorization_id', ) if stripe_authorization.event_id is not None: view_kwargs['id'] = stripe_authorization.event_id else: view_kwargs['id'] = None if view_kwargs.get('user_id') is not None: try: discount_code = (db.session.query(DiscountCode).filter_by( id=view_kwargs['discount_code_id']).one()) except NoResultFound: raise ObjectNotFound( {'parameter': 'discount_code_id'}, "DiscountCode: {} not found".format( view_kwargs['discount_code_id']), ) else: if discount_code.event_id is not None: view_kwargs['id'] = discount_code.event_id else: view_kwargs['id'] = None if view_kwargs.get('speakers_call_id') is not None: speakers_call = safe_query_kwargs(SpeakersCall, view_kwargs, 'speakers_call_id') if speakers_call.event_id is not None: view_kwargs['id'] = speakers_call.event_id else: view_kwargs['id'] = None if view_kwargs.get('ticket_id') is not None: ticket = safe_query_kwargs(Ticket, view_kwargs, 'ticket_id') if ticket.event_id is not None: view_kwargs['id'] = ticket.event_id else: view_kwargs['id'] = None if view_kwargs.get('ticket_tag_id') is not None: ticket_tag = safe_query_kwargs(TicketTag, view_kwargs, 'ticket_tag_id') if ticket_tag.event_id is not None: view_kwargs['id'] = ticket_tag.event_id else: view_kwargs['id'] = None if view_kwargs.get('role_invite_id') is not None: role_invite = safe_query_kwargs(RoleInvite, view_kwargs, 'role_invite_id') if role_invite.event_id is not None: view_kwargs['id'] = role_invite.event_id else: view_kwargs['id'] = None if view_kwargs.get('users_events_role_id') is not None: users_events_role = safe_query_kwargs( UsersEventsRoles, view_kwargs, 'users_events_role_id', ) if users_events_role.event_id is not None: view_kwargs['id'] = users_events_role.event_id if view_kwargs.get('access_code_id') is not None: access_code = safe_query_kwargs(AccessCode, view_kwargs, 'access_code_id') if access_code.event_id is not None: view_kwargs['id'] = access_code.event_id else: view_kwargs['id'] = None if view_kwargs.get('speaker_id'): try: speaker = (db.session.query(Speaker).filter_by( id=view_kwargs['speaker_id']).one()) except NoResultFound: raise ObjectNotFound( {'parameter': 'speaker_id'}, "Speaker: {} not found".format(view_kwargs['speaker_id']), ) else: if speaker.event_id: view_kwargs['id'] = speaker.event_id else: view_kwargs['id'] = None if view_kwargs.get('email_notification_id'): try: email_notification = ( db.session.query(EmailNotification).filter_by( id=view_kwargs['email_notification_id']).one()) except NoResultFound: raise ObjectNotFound( {'parameter': 'email_notification_id'}, "Email Notification: {} not found".format( view_kwargs['email_notification_id']), ) else: if email_notification.event_id: view_kwargs['id'] = email_notification.event_id else: view_kwargs['id'] = None if view_kwargs.get('microlocation_id'): try: microlocation = (db.session.query(Microlocation).filter_by( id=view_kwargs['microlocation_id']).one()) except NoResultFound: raise ObjectNotFound( {'parameter': 'microlocation_id'}, "Microlocation: {} not found".format( view_kwargs['microlocation_id']), ) else: if microlocation.event_id: view_kwargs['id'] = microlocation.event_id else: view_kwargs['id'] = None if view_kwargs.get('attendee_id'): attendee = safe_query_kwargs(TicketHolder, view_kwargs, 'attendee_id') if attendee.event_id is not None: view_kwargs['id'] = attendee.event_id else: view_kwargs['id'] = None if view_kwargs.get('custom_form_id') is not None: custom_form = safe_query_kwargs(CustomForms, view_kwargs, 'custom_form_id') if custom_form.event_id is not None: view_kwargs['id'] = custom_form.event_id else: view_kwargs['id'] = None if view_kwargs.get('faq_id') is not None: faq = safe_query_kwargs(Faq, view_kwargs, 'faq_id') if faq.event_id is not None: view_kwargs['id'] = faq.event_id else: view_kwargs['id'] = None if view_kwargs.get('order_identifier') is not None: order = safe_query_kwargs(Order, view_kwargs, 'order_identifier', 'identifier') if order.event_id is not None: view_kwargs['id'] = order.event_id else: view_kwargs['id'] = None if view_kwargs.get('feedback_id') is not None: feedback = safe_query_kwargs(Feedback, view_kwargs, 'feedback_id') if feedback.event_id is not None: view_kwargs['id'] = feedback.event_id else: view_kwargs['id'] = None return view_kwargs
def create_object(self, data, view_kwargs): """ create_object method for the Charges layer charge the user using paypal or stripe :param data: :param view_kwargs: :return: """ if view_kwargs.get('order_identifier').isdigit(): # when id is passed order = Order.query.filter_by( id=view_kwargs['order_identifier']).first() else: # when identifier is passed order = Order.query.filter_by( identifier=view_kwargs['order_identifier']).first() if not order: raise ObjectNotFound( {'parameter': 'order_identifier'}, "Order with identifier: {} not found".format( view_kwargs['order_identifier']), ) if (order.status == 'cancelled' or order.status == 'expired' or order.status == 'completed'): raise ConflictError( {'parameter': 'id'}, "You cannot charge payments on a cancelled, expired or completed order", ) if (not order.amount) or order.amount == 0: raise ConflictError({'parameter': 'id'}, "You cannot charge payments on a free order") data['id'] = order.id # charge through stripe if order.payment_mode == 'stripe': if not order.event.can_pay_by_stripe: raise ConflictError( {'': ''}, "This event doesn't accept payments by Stripe") success, response = TicketingManager.create_payment_intent_for_order_stripe( order) data['status'] = success data['message'] = response # charge through paypal elif order.payment_mode == 'paypal': if (not data.get('paypal_payer_id')) or ( not data.get('paypal_payment_id')): raise UnprocessableEntityError( {'source': ''}, "paypal_payer_id or paypal_payment_id or both missing") if not order.event.can_pay_by_paypal: raise ConflictError( {'': ''}, "This event doesn't accept payments by Paypal") success, response = TicketingManager.charge_paypal_order_payment( order, data['paypal_payer_id'], data['paypal_payment_id']) data['status'] = success data['message'] = response return data
def get_object(self, kwargs, qs): obj = self._data_layer.get_object(kwargs, qs=qs) if not obj: raise ObjectNotFound( f"{self.schema.Meta.type_}: {kwargs['id']} not found") return obj
def after_get_object(self, session, view_kwargs): is_speaker_or_admin = is_logged_in() and has_access( 'is_speaker_for_session', id=session.id ) if session.state not in ['accepted', 'confirmed'] and not is_speaker_or_admin: raise ObjectNotFound({'parameter': '{id}'}, "Session: not found")
def after_get(self, result): if result['data'] is None: raise ObjectNotFound(detail='', source={})