Exemplo n.º 1
0
def test_first_save_registers_publication():
    for account in Account.get_many():
        account.delete()
    for article in Article.get_many():
        article.delete()
    user_id = 'user_id'
    score = random.randint(0, 100)
    account_id = Account({
        'user_id': user_id,
        'email': fake.email(),
        'name': fake.sentence(),
        'score': score
    }).save()
    article_id = Article({
        'name': fake.word(),
        'description': fake.sentence(),
        'available_units': fake.pyint(),
        'price': 20.0,
        'latitude': 0.0,
        'longitude': 0.0,
        'user': user_id,
    }).save()
    assert Account.get_one(account_id).score() == score + 1
    Article.get_one(article_id).save()
    assert Account.get_one(account_id).score() == score + 1
Exemplo n.º 2
0
def create_question(_id):
    try:
        article = Article.get_one(_id)
    except ValueError as e:
        return response(message=str(e), ok=False), 400

    if not article:
        return response(message=f"Article {_id} not found", ok=False), 400

    account = Account.current()
    resp, status_code = create(Question,
                               additional_fields={
                                   'created_at': datetime.utcnow(),
                                   'article_id': _id,
                                   'user_id': account.get_id()
                               })

    if status_code == 200:
        question = Question.get_one(resp.json['_id'])
        FirebaseMessage(
            {
                'title': f'Nueva pregunta de {account["name"]}',
                'message': f'{question["question"]}',
                'question': question.get_id(),
                'type': 'new_question'
            },
            to=article.account()).send()

    return resp, status_code
Exemplo n.º 3
0
 def append_article_to_questions(self, queryset):
     result = []
     for question in queryset:
         question = question.to_json()
         question['article'] = \
             Article.get_one(question.pop('article_id')).to_json()
         result.append(question)
     return result
Exemplo n.º 4
0
 def expand(cls, purchases):
     result = []
     for purchase in purchases:
         purchase = purchase.to_json()
         purchase['article'] = Article.get_one(  # N database calls, i know
             str(purchase.pop('article_id'))).to_json()
         result.append(purchase)
     return result
Exemplo n.º 5
0
def get_article(body):
    article_id = body.get('article_id')
    try:
        article = Article.get_one(article_id)
        if article is None:
            return None, response("article was not found", ok=False), 400
    except ValueError:
        return None, response(f"article_id not specified", ok=False), 400
    return article, None
Exemplo n.º 6
0
def patch_question():
    resp, status_code = patch(Question)
    if status_code == 200:
        question = Question.get_one(resp.json['data']['_id'])
        article = Article.get_one(question['article_id'])
        FirebaseMessage(
            {
                'title': f'Nueva respuesta sobre {article["name"]}',
                'message': f'{question["answer"]}',
                'article_id': question['article_id'],
                'type': 'new_answer'
            },
            to=Account.get_one(question['user_id'])).send()
    return resp, status_code
Exemplo n.º 7
0
def questions(_id):
    try:
        article = Article.get_one(_id)
    except ValueError as e:
        return response(message=str(e), ok=False), 400

    if not article:
        return response(message=f"Article {_id} not found", ok=False), 400

    return jsonify({
        'data': [q.to_json() for q in Question.get_many(article_id=_id)],
        'ok':
        True
    })
Exemplo n.º 8
0
def delete_article(_id):
    try:
        article = Article.get_one(_id)
    except ValueError as e:
        return response(message=str(e), ok=False), 400

    if not article:
        return response(message=f"Article {_id} not found", ok=False), 400

    if article['user'] != user_id():
        return response(message=f"User {user_id()} is not the "
                        f"owner of article {_id}",
                        ok=False), 401

    deleted = article.delete()
    if not deleted.deleted_count:
        return response(message=f"Error deleting article", ok=False), 500
    return response(message=f"Successfully deleted article {_id}",
                    ok=True), 200
Exemplo n.º 9
0
def answer_question(article_id, question_id):
    try:
        article = Article.get_one(article_id)
    except ValueError as e:
        return response(message=str(e), ok=False), 400

    if not article:
        return response(message=f"Article {article_id} not found",
                        ok=False), 400

    try:
        question = Question.get_one(question_id)
    except ValueError as e:
        return response(message=str(e), ok=False), 400

    body = request.get_json(silent=True)
    if not body:
        return response("Invalid or empty request body", ok=False), 400

    answer = body.get('answer')
    if not answer:
        return response("No answer specified", ok=False), 400

    answered_at = datetime.utcnow()

    question.update(**{'answer': answer, 'answered_at': answered_at})
    account = Account.current()
    FirebaseMessage(
        {
            'title': f'Nueva respuesta de {account["name"]}',
            'message': f'{question["answer"]}',
            'article_id': article_id,
            'type': 'new_answer'
        },
        to=Account.get_one(question['user_id'])).send()

    return jsonify({"ok": True, "data": question.to_json()}), 200
Exemplo n.º 10
0
def test_post_purchase(client, article):
    with mock.patch('server.shared_server.shared_server.request'):
        with mock.patch('server.libs.firebase.FirebaseMessage.send'):
            resp = client.post('/purchase/',
                               data=json.dumps({
                                   "article_id":
                                   article.get_id(),
                                   "units":
                                   article['available_units'],
                                   "price":
                                   1000,
                                   "payment_method":
                                   "cash"
                               }),
                               content_type='application/json')

            assert resp.status_code == 200
            resp_article = Article.get_one(article.get_id()).to_json()
            article = article.to_json()
            for key in article:
                if key == 'available_units':
                    assert resp_article[key] == 0  # all units were bought
                else:
                    assert resp_article[key] == article[key]
Exemplo n.º 11
0
def shipment_cost(_id):
    args = request.args
    lat = args.get('my_lat')
    lon = args.get('my_lon')
    if not (lat and lon):
        return response(message=f"latitude and longitude missing",
                        ok=False), 400
    try:
        lat = float(lat)
        lon = float(lon)
    except ValueError:
        return response(message="latitude and longitude must be numbers",
                        ok=False), 400
    try:
        article = Article.get_one(_id)
    except ValueError as e:
        return response(message=str(e), ok=False), 400
    if not article:
        return response(message=f"Article {_id} not found", ok=False), 400
    cash_response = shared_server.shipment_cost(article, lat, lon, 'cash')
    credit_response = shared_server.shipment_cost(article, lat, lon, 'credit')
    debit_response = shared_server.shipment_cost(article, lat, lon, 'debit')
    cash_data = cash_response.json()
    credit_data = credit_response.json()
    debit_data = debit_response.json()
    success = cash_data["success"]
    success = success and credit_data["success"]
    success = success and debit_data["success"]
    return jsonify({
        'ok': success,
        'data': {
            'cash': cash_data["cost"],
            'credit': credit_data["cost"],
            'debit': debit_data["cost"]
        }
    }), 200 if success else 500
Exemplo n.º 12
0
 def article(self) -> Optional[Article]:
     return Article.get_one(self['article_id'])
Exemplo n.º 13
0
def get_single_article(_id):
    try:
        return jsonify(Article.get_one(_id).to_json())
    except ValueError:
        return response(f"invalid id {_id}", ok=False), 400