예제 #1
0
    def get(self):
        params = _ARGUMENTS.parse_args()
        account_id = params.get('account_id')
        credit_debit = params.get('credit_debit')
        user = AccountModel.find(account_id)
        credits = []
        debits = []
        if user is None:
            return errors._USER_NOT_FOUND, server_code.NOT_FOUND
        if credit_debit is None:
            credits = CreditModel.find_all_credits(account_id)
            debits = DebitModel.find_all_credits(account_id)
        elif credit_debit == 0:
            credits = CreditModel.find_all_credits(account_id)
        elif credit_debit == 1:
            debits = DebitModel.find_all_credits(account_id)

        result = user.json()
        result["debits"] = [debit.json() for debit in debits]
        result["credits"] = [credit.json() for credit in credits]
        result["amount_credits"] = amount_credits = self.__sum(credits)
        result["amount_debits"] = amount_debits = self.__sum(debits)
        result[
            "amount"] = user.initial_balance + amount_credits - amount_debits
        return result, server_code.OK
예제 #2
0
 def post(self):
     arguments_data = _ARGUMENTS.parse_args()
     error, code = self.__validate_value(arguments_data)
     if error is not None:
         return error, code
     credit = CreditModel(**arguments_data)
     try:
         credit.save()
     except Exception as e:
         traceback.print_exc()
         return errors._SAVE_ERROR, server_code.INTERNAL_SERVER_ERROR
     return credit.json(), server_code.OK
예제 #3
0
 def get(self):
     userID = get_jwt_identity()
     user = UserModel.find_by_id(userID)
     if not user:
         return {'message': 'User Not Found'}, 404
     credit = CreditModel.find_by_user_id(userID)
     if not credit:
         return {'message': 'Credits not found'}, 404
     return {'credit': credit.json()}, 200
예제 #4
0
 def post(self):
     _parser = reqparse.RequestParser()
     _parser.add_argument('raterID',
                          type=str,
                          required=True,
                          help="This field cannot be blank.")
     _parser.add_argument('rateeID',
                          type=str,
                          required=True,
                          help="This field cannot be blank.")
     _parser.add_argument('deliveryID',
                          type=str,
                          required=True,
                          help="This field cannot be blank.")
     _parser.add_argument('rating',
                          type=int,
                          required=True,
                          help="This field cannot be blank.")
     _parser.add_argument('feedback',
                          type=str,
                          required=True,
                          help="This field cannot be blank.")
     _parser.add_argument('date')
     data = _parser.parse_args()
     d = datetime.strptime(data['date'], '%Y-%m-%dT%H:%M:%S.%fZ')
     delivery = DeliveryModel.find_by_id(data['deliveryID'])
     if not delivery:
         return {'message': 'Delivery not found'}, 404
     if not delivery.delivered:
         return {
             'message': 'Delivery needs to be confirmed by deliverer first'
         }, 400
     rating = RatingModel.find_by_delivery_id(data['deliveryID'])
     if rating:
         return {'message': 'Delivery already rated'}, 400
     ratee = UserModel.find_by_id(data['rateeID'])
     if not ratee:
         return {'message': 'Ratee not found'}
     rating = RatingModel(raterID=data['raterID'],
                          rateeID=data['rateeID'],
                          deliveryID=data['deliveryID'],
                          rating=data['rating'],
                          feedback=data['feedback'],
                          date=d)
     rating.save_to_db()
     if not ratee.noOfRatings:
         ratee.totalRating = data['rating']
         ratee.noOfRatings = 1
     else:
         ratee.totalRating = ratee.totalRating + data['rating']
         ratee.noOfRatings = ratee.noOfRatings + 1
     ratee.save_to_db()
     credits = calculateFeedbackCredits(data['rating'])
     credit = CreditModel.find_by_user_id(data['rateeID'])
     credit.credits = credit.credits + credits
     credit.save_to_db()
     return {"message": "Rating saved successfully"}, 200
예제 #5
0
 def post(self):
     _parser = reqparse.RequestParser()
     _parser.add_argument('categoryTypeID',
                          type=str,
                          required=True,
                          help="This field cannot be blank.")
     _parser.add_argument('imageLink1', type=str, required=False)
     _parser.add_argument('imageLink2', type=str, required=False)
     _parser.add_argument('imageLink3', type=str, required=False)
     _parser.add_argument('imageLink4', type=str, required=False)
     _parser.add_argument('imageLink5', type=str, required=False)
     _parser.add_argument('quantity',
                          type=int,
                          required=True,
                          help="This field cannot be blank.")
     _parser.add_argument('description',
                          type=str,
                          required=True,
                          help="This field cannot be blank.")
     _parser.add_argument('expiryDate', type=str, required=False)
     _parser.add_argument('tags', type=list, required=True, location='json')
     userID = get_jwt_identity()
     data = _parser.parse_args()
     expiryDate = datetime.strptime(
         data['expiryDate'],
         '%Y-%m-%dT%H:%M:%S.%fZ') if data['expiryDate'] else None
     quantityLeft = ItemModel.get_category_type_items_quantity(
         data['categoryTypeID'])
     if quantityLeft == None:
         quantityLeft = 0
     categoryType = CategoryTypeModel.find_by_id(data['categoryTypeID'])
     credits = calculateDonationCredits(quantityLeft, categoryType.price,
                                        data['quantity'])
     credit = CreditModel.find_by_user_id(userID)
     credit.credits += credits
     credit.save_to_db()
     # See if user has already donated an item for that categoryTypeID
     item = ItemModel(userID=userID,
                      categoryTypeID=data['categoryTypeID'],
                      imageLink1=data['imageLink1'],
                      imageLink2=data['imageLink2'],
                      imageLink3=data['imageLink3'],
                      imageLink4=data['imageLink4'],
                      imageLink5=data['imageLink5'],
                      quantity=data['quantity'],
                      description=data['description'],
                      expiryDate=expiryDate)
     item.save_to_db()
     for name in data['tags']:
         tag = TagModel.find_by_name(name)
         if not tag:
             tag = TagModel(name=name)
             tag.save_to_db()
         itemTag = ItemTagModel(itemID=item.id, tagID=tag.id)
         itemTag.save_to_db()
     return {"message": "Item saved successfully"}, 201
예제 #6
0
    def post(self):
        data = _register_parser.parse_args()

        if UserModel.find_by_email(data['email']):
            return {"message": "Email already registered"}, 400

        # Determine if address given is valid or not
        conn = http.client.HTTPConnection('api.positionstack.com')
        address = '{}, {}, Singapore {}'.format(data['addressLine1'],
                                                data['addressLine2'],
                                                data['addressPostalCode'])
        params = urllib.parse.urlencode({
            'access_key': 'bc0e165286c05e84509479ea679117eb',
            'query': address,
            'region': 'Singapore',
            'limit': 1,
        })
        conn.request('GET', '/v1/forward?{}'.format(params))
        res = conn.getresponse()
        returnData = res.read()
        response = json.loads(returnData.decode('utf-8'))
        if len(response['data']) == 0:
            return {"message": "Invalid Address"}, 400
        user = UserModel(lat=response['data'][0]['latitude'],
                         lng=response['data'][0]['longitude'],
                         **data)
        user.save_to_db()
        birthday = datetime.datetime.strptime(data['birthday'], '%Y-%m-%d')
        today = datetime.date.today()
        age = today.year - birthday.year - ((today.month, today.day) <
                                            (birthday.month, birthday.day))
        credits = calculateSignUpCredits(age, data['income'],
                                         data['householdCount'],
                                         data['householdType'])
        credit = CreditModel(userID=user.id, credits=credits)
        credit.save_to_db()
        return {"message": "User created successfully."}, 201
예제 #7
0
 def put(self):
     _parser = reqparse.RequestParser()
     _parser.add_argument('userID',
                          type=str,
                          required=True,
                          help="This field cannot be blank.")
     _parser.add_argument('creditsToAdd',
                          type=int,
                          required=True,
                          help="This field cannot be blank.")
     data = _parser.parse_args()
     user = UserModel.find_by_id(data['userID'])
     if not user:
         return {'message': 'User not found'}, 404
     credit = CreditModel.find_by_user_id(data['userID'])
     if not credit:
         return {'message': 'Credits not found'}, 404
     credit.credits = credit.credits + int(data['creditsToAdd'])
     credit.save_to_db()
     return {'message': 'User credits successfully updated'}, 200
예제 #8
0
 def post(self,deliveryID):
     delivery = DeliveryModel.find_by_id(deliveryID)
     if not delivery:
         return {'message' : 'Delivery not found'}, 404
     _parser = reqparse.RequestParser()
     _parser.add_argument('confirmationCode',type=str,required=True,help="This field cannot be blank.")
     data = _parser.parse_args()
     if data['confirmationCode'] != delivery.confirmationCode:
         return {'message' : 'Incorrect confirmation code'}, 400
     delivery.setDelivered()
     credits = calculateDeliveryCredits(delivery.deliveryDateTime, datetime.now())
     credit = CreditModel.find_by_user_id(delivery.delivererID)
     credit.credits = credit.credits + credits
     credit.save_to_db()
     item = delivery.item
     categoryType = item.categoryType
     quantityLeft = ItemModel.get_category_type_items_quantity(item.categoryTypeID)
     creditsToSubstract = calculateCreditsSpentOnDelivery(quantityLeft, float(categoryType.price), delivery.quantity)
     beneficiaryCredit = delivery.request.user.credit[0]
     beneficiaryCredit.credits -= creditsToSubstract
     beneficiaryCredit.save_to_db()
     return {'message' : 'Delivery updated successfully'}, 200
예제 #9
0
 def get(self):
     params = _ARGUMENTS_FILTER.parse_args()
     credits = CreditModel.find_credits(params.get('account_id'), params.get('limit'), params.get('offset'))
     if credits is None:
         return errors._NOT_FOUND
     return {"credits": [credit.json() for credit in credits]}, server_code.OK