def create_vendor(self):
		location = Auth.get_location()
		name, tel, address, is_active, contact_person = self.request_params(
			'name', 'tel', 'address', 'isActive', 'contactPerson')

		vendor = self.vendor_repo.new_vendor(name, address, tel, is_active, contact_person, location).serialize()
		return self.handle_response('OK', payload={'vendor': vendor}, status_code=201)
Beispiel #2
0
	def create_order(self):
		"""
		creates an order
		:return: order object
		"""
		user_id = Auth.user('id')
		location_id = Auth.get_location()
		date_booked_for, channel, meal_period, meal_items, menu_id = self.request_params(
			'dateBookedFor', 'channel', 'mealPeriod', 'mealItems', 'menuId'
		)
		if self.order_repo.user_has_order(user_id, date_booked_for, meal_period):
			return self.handle_response('You have already booked for this meal period.', status_code=400)
		
		location = LocationRepo().get(location_id)
		current_time = current_time_by_zone(location.zone)

		if datetime.strptime(date_booked_for, "%Y-%m-%d") < datetime.now():
			return self.handle_response('You are not allowed to book for a date in the past', status_code=400)

		if int(current_time_by_zone(location.zone).strftime('%H')) > 15:
			if check_date_current_vs_date_for(current_time, datetime.strptime(date_booked_for, "%Y-%m-%d")):
				return self.handle_response('It is too late to book a meal for the selected date ', status_code=400)

		meal_object_items = self.meal_item_repo.get_meal_items_by_ids(meal_items)
		
		new_order = self.order_repo.create_order(
			user_id, date_booked_for, meal_object_items, location_id, menu_id, channel, meal_period).serialize()
		
		new_order['mealItems'] = [
			item.to_dict(only=OrderController.default_meal_item_return_fields)
			for item in meal_object_items
		]
		return self.handle_response('OK', payload={'order': new_order}, status_code=201)
    def test_get_location_header_returns_int_value_when_location_header_present(
            self):
        with self.app.test_request_context(path='/api/v1/vendors',
                                           method='GET',
                                           headers=self.headers()) as request:
            location = Auth.get_location()
            self.assertIsInstance(location, int)
            self.assertIsNotNone(location)

    # def test_has_permission_checks_valid_permissions(self):
    # 	'''To test the has_permission method, We need to create a mock role, user role maping and role-permission mapping '''
    #
    #
    # 	with self.app.test_request_context(path='/api/v1/vendors', method='GET', headers=self.headers()) as request:
    # 		user_id = Auth.user('id')
    #
    # 		role = RoleFactory(id=1)
    # 		user_role = UserRoleFactory(role_id=role.id, user_id=user_id)
    # 		perm = PermissionFactory(id=1, role_id=role.id, keyword='login')
    #
    # 		r = Auth.has_permission('create_account')
    #
    #
    # 		# print(user_id, role.id, role.name, user_role.role_id, user_role.user_id, perm.role_id, r.data.decode('utf-8'))
    #
    # 		assert False
Beispiel #4
0
	def list_orders_date_range(self, start_date, end_date):
		"""
		List all orders for a particular date
		:param start_date:
		:param end_date:
		:return:
		"""
		params = self.get_int_params()
		location_id = Auth.get_location()
		orders = self.order_repo.get_range_paginated_options_all(
			start_date=start_date, end_date=end_date, location_id=location_id, **params)

		order_list = []
		if len(orders.items) > 0:
			for order in orders.items:
				meal_items = self.order_repo.get(order.id).meal_item_orders
				try:
					user = self.andela_service.get_user_by_email_or_id(order.user_id)
				except Exception as e:
					return str(e)
				order_item = order.serialize()
				order_item['mealItems'] = [
					item.to_dict(only=OrderController.default_meal_item_return_fields)
					for item in meal_items]
				order_item['user'] = '******'.format(user['first_name'], user['last_name']) if user else None


				rating = self.order_repo.get_rating(user['id'], 'order', order.id) if user else None

				order_item['user_rating'] = rating

				order_list.append(order_item)
		return self.handle_response('OK', payload={'orders': order_list})
 def create_user_role(self):
     location = Auth.get_location()
     role_id, email_address = self.request_params('roleId', 'emailAddress')
     user = self.andela_service.get_user_by_email_or_id(email_address)
     if user is None:
         return self.handle_response('This user record does not exist',
                                     status_code=400)
     user_id = user['id']
     user_role = self.user_role_repo.get_unpaginated(role_id=role_id,
                                                     user_id=user_id,
                                                     is_deleted=False)
     if not user_role:
         role = self.role_repo.get(role_id)
         if role:
             user_role = self.user_role_repo.new_user_role(
                 role_id=role_id,
                 user_id=user_id,
                 location_id=location,
                 email=email_address)
             user_role_data = user_role.serialize()
             user_role_data.update({'name': user.get('name')})
             return self.handle_response(
                 'OK',
                 payload={'user_role': user_role_data},
                 status_code=201)
         return self.handle_response('This role does not exist',
                                     status_code=400)
     return self.handle_response('This User has this Role already',
                                 status_code=400)
    def list_orders_date_range(self, start_date, end_date):
        """
		List all orders for a particular date
		:param start_date:
		:param end_date:
		:return:
		"""
        location_id = Auth.get_location()
        orders = self.order_repo.get_range_paginated_options_all(
            start_date=start_date, end_date=end_date, location_id=location_id)

        order_list = []
        if len(orders.items) > 0:
            for order in orders.items:
                meal_items = self.order_repo.get(order.id).meal_item_orders
                user = self.andela_service.get_user_by_email_or_id(
                    order.user_id)
                order_item = order.serialize()
                order_item['mealItems'] = [{
                    'name': item.name,
                    'image': item.image,
                    'id': item.id
                } for item in meal_items]
                order_item['user'] = '******'.format(user['first_name'],
                                                    user['last_name'])
                order_list.append(order_item)
        return self.handle_response('OK', payload={'orders': order_list})
    def list_orders(self):
        """
		List all orders in the application: should rarely be should
		:return:
		"""
        location_id = Auth.get_location()
        current_date = datetime.now()
        current_date += timedelta(days=1)
        orders = self.order_repo.filter_by(
            is_deleted=False,
            date_booked_for=current_date.strftime('%Y-%m-%d'),
            location_id=location_id)

        order_list = []
        if len(orders.items) > 0:
            for order in orders.items:
                meal_items = self.order_repo.get(order.id).meal_item_orders
                user = self.andela_service.get_user_by_email_or_id(
                    order.user_id)
                order_item = order.serialize()
                order_item['mealItems'] = [{
                    'name': item.name,
                    'image': item.image,
                    'id': item.id
                } for item in meal_items]
                order_item['user'] = '******'.format(user['first_name'],
                                                    user['last_name'])
                order_list.append(order_item)

        return self.handle_response('OK',
                                    payload={
                                        'orders': order_list,
                                        'meta': self.pagination_meta(orders)
                                    })
Beispiel #8
0
 def test_get_location_header_returns_int_value_when_location_header_present(
         self):
     with self.app.test_request_context(path='/api/v1/vendors',
                                        method='GET',
                                        headers=self.headers()) as request:
         location = Auth.get_location()
         self.assertIsInstance(location, int)
         self.assertIsNotNone(location)
	def list_vendors(self):
		location = Auth.get_location()
		vendors = self.vendor_repo.filter_by_asc(
			self.vendor_repo._model.name,
			is_deleted=False,
			is_active=True,
			location_id=location)
		vendors_list = [vendor.serialize() for vendor in vendors.items]
		return self.handle_response('OK', payload={'vendors': vendors_list, 'meta': self.pagination_meta(vendors)})
    def validate_meal_session_details(self, **kwargs):
        """
        Validate all data before creating a meal session
        :return tuple:
        """

        location_id = kwargs.get('location_id')

        if not location_id:
            location_id = Auth.get_location()

        error_message_mapper = self.return_error_message_mapper()

        tz = self.get_location_time_zone(location_id)
        exception_message = error_message_mapper.get(tz)

        if exception_message:
            return exception_message, None

        start_time = self.return_as_object(kwargs.get('start_time'), "time")
        end_time = self.return_as_object(kwargs.get('end_time'), "time")

        date_sent = self.return_as_object(kwargs.get('date'), "date")
        current_date = datetime.now(tz)

        message = self.validate_times_and_dates_not_greater_than_each_other(
            start_time, end_time,
            datetime(year=current_date.year,
                     month=current_date.month,
                     day=current_date.day), date_sent)

        error_message = error_message_mapper.get(message)

        if error_message:
            return error_message, None

        message = self.validate_meal_session_times(
            **{
                "name": kwargs.get('name'),
                "date_sent": date_sent,
                "location_id": location_id,
                "start_time": start_time,
                "end_time": end_time,
            })

        message = error_message_mapper.get(message)

        if message:
            return message, None

        return None, {
            "name": kwargs.get('name'),
            "date_sent": date_sent,
            "location_id": location_id,
            "start_time": start_time,
            "end_time": end_time,
        }
    def create(self):
        location = Auth.get_location()
        name, meal_period, description = self.request_params(
            'name', 'mealPeriod', 'description')
        # check unique together attirbutes
        if self.repo.exists(name=name, location_id=location):
            return self.handle_response('error', payload={
                'message': "Meal Template with name  exists in your center"}, status_code=400)

        template = self.repo.create(
            name, location, meal_period, description)
        return self.handle_response('OK', payload=template.serialize(), status_code=201)
Beispiel #12
0
	def upcoming_vendor_engagements(self):
		location = Auth.get_location()
		engagements = self.vendor_engagement_repo.get_engagement_by_date()

		engagements_list = []
		for e in engagements.items:
			if e.location_id == location:
				engagement = e.serialize()
				engagement['vendor'] = e.vendor.serialize()
				engagements_list.append(engagement)

		return self.handle_response(
			'OK', payload={'engagements': engagements_list, 'meta': self.pagination_meta(engagements)}
		)
Beispiel #13
0
	def list_vendor_engagements(self):
		location = Auth.get_location()

		engagements = self.vendor_engagement_repo.filter_by_desc(
			self.vendor_engagement_repo._model.start_date,
			is_deleted=False, location_id=location
		)

		engagements_list = []
		for e in engagements.items:
			engagement = e.serialize()
			engagement['vendor'] = e.vendor.serialize()
			engagements_list.append(engagement)

		return self.handle_response(
			'OK', payload={'engagements': engagements_list, 'meta': self.pagination_meta(engagements)}
		)
Beispiel #14
0
    def create_user(self):
        push_id = PushID()
        next_id = push_id.next_id()

        user_info = self.request_params('firstName', 'lastName', 'imageUrl',
                                        'slackId', 'userId', 'roleId')

        first_name, last_name, image_url, slack_id, user_id, role_id = user_info

        role = self.role_repo.find_first(id=role_id)

        if not role:
            return self.handle_response(
                f"Role with userTypeId(roleId) {role_id} does not exist",
                status_code=400)

        if self.user_repo.exists(slack_id=slack_id):
            return self.handle_response(
                f"User with slackId '{slack_id}' already exists",
                status_code=400)

        if self.user_repo.exists(user_id=user_id) and user_id is not None:
            return self.handle_response(
                f"User with userId '{user_id}' already exists",
                status_code=400)

        slack_id = slack_id if slack_id else next_id
        user_id = user_id if user_id else slack_id

        user_type = self.user_role_repo.find_first(user_id=user_id) or \
                    self.user_role_repo.new_user_role(
                        role_id=role_id, user_id=user_id, location_id=Auth.get_location(),email=None)

        user = self.user_repo.new_user(*user_info,
                                       user_id=user_id,
                                       slack_id=slack_id,
                                       user_type=user_type).serialize()

        user.__setitem__(
            'userRoles',
            [role.to_dict(only=['id', 'name', 'help', "timestamps"])])
        user.pop('userTypeId')

        return self.handle_response('OK',
                                    payload={'user': user},
                                    status_code=201)
    def list_orders(self):
        """
		List all orders in the application: should rarely be should
		:return:
		"""
        location_id = Auth.get_location()
        yesterday = date.today() - timedelta(days=1)
        tomorrow = date.today() + timedelta(days=1)

        orders = self.order_repo.get_range_paginated_options_all(
            start_date=yesterday, end_date=tomorrow, location_id=location_id)
        order_list = []
        if len(orders.items) > 0:
            for order in orders.items:
                meal_items = self.order_repo.get(order.id).meal_item_orders
                try:
                    user = self.andela_service.get_user_by_email_or_id(
                        order.user_id)
                except Exception as e:
                    return str(e)

                order_item = order.serialize()
                order_item['mealItems'] = [
                    item.to_dict(
                        only=OrderController.default_meal_item_return_fields)
                    for item in meal_items
                ]

                order_item['user'] = '******'.format(
                    user['first_name'], user['last_name']) if user else None

                rating = self.order_repo.get_rating(user['id'], 'order',
                                                    order.id) if user else None

                order_item['user_rating'] = rating

                order_list.append(order_item)

        return self.handle_response('OK',
                                    payload={
                                        'orders': order_list,
                                        'meta': self.pagination_meta(orders)
                                    })
Beispiel #16
0
 def test_get_location_throws_exception_for_invalid_location_id(self):
     try:
         Auth.get_location('A')
         assert False
     except Exception as e:
         assert True
    def update_session(self, meal_session_id):
        """
        Updates a meal session if all data sent meets specified requirements

        :return: Json Response
        """
        meal_session = self.meal_session_repo.get(meal_session_id)

        if not meal_session:
            return self.handle_response("Meal session Not Found",
                                        status_code=404)

        name, start_time, end_time, date, location_id = self.request_params(
            'name', 'startTime', 'endTime', 'date', 'locationId')

        if not location_id:
            location_id = Auth.get_location()

        meal_session_data = {
            "name": name,
            "start_time": start_time,
            "end_time": end_time,
            "date": date,
            "location_id": location_id,
            "meal_session_id": meal_session.id,
            "meal_session": meal_session,
        }

        validated_data = self.business_logic.validate_update_of_meal_session(
            **meal_session_data)

        error_message = validated_data.get("error_message")

        if error_message:
            return make_response(jsonify({'msg': error_message}), 400)

        meal_session_updated = self.meal_session_repo.update_meal_session(
            meal_session,
            name=validated_data.get("name"),
            start_time=validated_data.get("start_time"),
            stop_time=validated_data.get("end_time"),
            date=validated_data.get("date"),
            location_id=validated_data.get("location_id"))

        meal_session_updated.name = meal_session_updated.name.value

        meal_session_updated.start_time = self.business_logic.get_time_as_string(
            meal_session_updated.start_time.hour,
            meal_session_updated.start_time.minute)

        meal_session_updated.stop_time = self.business_logic.get_time_as_string(
            meal_session_updated.stop_time.hour,
            meal_session_updated.stop_time.minute)

        meal_session_updated.date = meal_session_updated.date.strftime(
            "%Y-%m-%d")

        return self.handle_response(
            'OK',
            payload={'mealSession': meal_session_updated.serialize()},
            status_code=200)
Beispiel #18
0
    def dashboard_summary(self):
        params = self.get_params_dict()
        location = Auth.get_location()
        vendors = self.vendor_repo.get_unpaginated(is_deleted=False)
        engagements = self.engagement_repo.get_unpaginated(
            is_deleted=False, location_id=location)

        if 'all_vendor_comparison' in params:
            orders = self.order_repo.fetch_all()
            vendor_orders = []
            for vendor in vendors:
                vendor_info = {}
                vendor_info['id'] = vendor.id
                vendor_info['name'] = vendor.name
                vendor_info['collectedOrders'] = len([
                    order for order in orders.items
                    if order.order_status == 'collected' and Menu.query.get(
                        order.menu_id).vendor_engagement.vendor_id == vendor.id
                ])
                vendor_info['uncollectedOrders'] = len([
                    order for order in orders.items
                    if order.order_status == 'booked' and Menu.query.get(
                        order.menu_id).vendor_engagement.vendor_id == vendor.id
                ])
                vendor_info['cancelledOrders'] = len([
                    order for order in orders.items
                    if order.order_status == 'cancelled' and Menu.query.get(
                        order.menu_id).vendor_engagement.vendor_id == vendor.id
                ])
                vendor_orders.append(vendor_info)

            return self.handle_response('ok', payload=vendor_orders)

        str_start_date = params.get('start_date', None)
        start_date = datetime.now().date(
        ) if str_start_date is None else datetime.strptime(
            str_start_date, '%Y-%m-%d').date()

        str_end_date = params.get('end_date', None)
        end_date = (
            datetime.now().date() -
            timedelta(14)) if str_end_date is None else datetime.strptime(
                str_end_date, '%Y-%m-%d').date()

        if start_date < end_date:
            return self.handle_response(
                'Start date must not be less than end date', status_code=400)

        result = []
        orders = Order.query.filter(
            and_(Order.date_booked_for >= end_date,
                 Order.date_booked_for <= start_date))

        if orders and vendors and engagements:
            orders_collected = [
                order for order in orders if order.order_status == 'collected'
            ]
            orders_cancelled = [
                order for order in orders if order.order_status == 'cancelled'
            ]
            orders_uncollected = [
                order for order in orders if order.order_status == 'booked'
            ]

            dates = [
                date.date() for date in pd.bdate_range(end_date, start_date)
            ]
            for date in dates:
                date_info = {
                    'date':
                    date,
                    'collectedOrders':
                    len([
                        order for order in orders_collected
                        if order.date_booked_for == date
                    ]),
                    'uncollectedOrders':
                    len([
                        order for order in orders_uncollected
                        if order.date_booked_for == date
                    ]),
                    'cancelledOrders':
                    len([
                        order for order in orders_cancelled
                        if order.date_booked_for == date
                    ]),
                    'averageRating':
                    self.rating_repo.daily_average_rating(date),
                    'vendor':
                    self.engagement_repo.vendor_of_the_day(date)
                }
                result.append(date_info)

        return self.handle_response('OK', payload=result)
Beispiel #19
0
 def test_get_location_throws_exception_when_location_header_missing(self):
     try:
         Auth.get_location()
         assert False
     except Exception as e:
         assert True