Beispiel #1
0
def mincontacts():
    if request.method == 'POST':
        req_json = request.get_json()
        web_logging.debug('req_json= {}'.format(req_json))

        # -------- request to spiders -------
        url = 'http://localhost:9080/command'
        data = {**{'Mcontact': req_json}, **req_template}
        headers = {'content_type': 'application/json'}
        doc_json = requests.get(url, headers=headers, json=data,
                                timeout=40).json()
        web_logging.debug('doc_json= {}'.format(doc_json))
        # ===================================

        resp = make_response(json.dumps(doc_json))
        resp.headers['Content-Type'] = 'application/json'

        phone = doc_json['contact']
        print('phone=', phone)
        # put real nuumber in DB
        data_active.update_one({
            'bid': req_json['bid'],
            'source': 'm'
        }, {'$set': {
            'phone': phone
        }})
        return resp
Beispiel #2
0
def edit_contact(_id: str):
    """
    edit created early contact info
    :param _id: in DB
    :return:
    """
    # ------- GET ------------
    title = 'Edit contact -- ' + _id
    doc = numbers.find_one(ObjectId(_id), projection={'_id': False, 'create_time': False, 'update_time': False})
    # convert array in to string separated by coma
    doc = {key: (', '.join(val) if type(val) == list else val) for key, val in doc.items()}
    form = SaveNumber(**doc)
    # ========================

    if form.validate_on_submit():
        web_logging.debug('request to edit _id= {}'.format(_id))
        # prepare for mongo
        form_recieved = Contact()
        form_recieved.from_form(form.data)
        form_recieved.update_time = datetime.utcnow()

        result = form_recieved.mongo_update(_id)
        match_count, modified_count = result
        flash("match_count= {}, modified_count= {}".format(match_count, modified_count))
        return redirect(url_for('add_edit_number'))

    return render_template('save_contact.html', title=title, form=form)
Beispiel #3
0
def save_contact():
    title = 'Save contacts'
    form = SaveNumber(user=current_user.username)

    form_recieved = Contact()
    form_recieved.from_form(form.data)

    if form.validate_on_submit():
        web_logging.debug('request to save number')
        flash(
            'nic= {nic}; contact_typ= {contact_type}; org_type= {org_type}; names= {names}; numbers= {numbers};'
            'comment= {comment};'
            'city= {city}; street= {street}, building={building}, loc_comments={loc_comments}'
            .format(nic=form_recieved.nic,
                    contact_type=form_recieved.contact_type,
                    org_type=form_recieved.org_type,
                    names=form_recieved.names,
                    numbers=form_recieved.numbers,
                    city=form_recieved.city,
                    street=form_recieved.street,
                    building=form_recieved.building,
                    loc_comments=form_recieved.loc_comments,
                    comment=form_recieved.comment))
        form_recieved.create_time = datetime.utcnow()
        form_recieved.update_time = form_recieved.create_time

        result = form_recieved.mongo_insert()
        flash('_id= {}'.format(result))
        # return list_numbers()
        return redirect(url_for('add_edit_number'))
    return render_template('save_contact.html', title=title, form=form)
Beispiel #4
0
def save_contact():
    title = 'Save contacts'
    form = SaveNumber(user=current_user.username)

    form_recieved = Contact()
    form_recieved.from_form(form.data)

    if form.validate_on_submit():
        web_logging.debug('request to save number')
        flash('nic= {nic}; contact_typ= {contact_type}; org_type= {org_type}; names= {names}; numbers= {numbers};'
              'comment= {comment};'
              'city= {city}; street= {street}, building={building}, loc_comments={loc_comments}'
              .format(nic=form_recieved.nic, contact_type=form_recieved.contact_type,
                      org_type=form_recieved.org_type, names=form_recieved.names,
                      numbers=form_recieved.numbers, city=form_recieved.city, street=form_recieved.street,
                      building=form_recieved.building, loc_comments=form_recieved.loc_comments,
                      comment=form_recieved.comment))
        form_recieved.create_time = datetime.utcnow()
        form_recieved.update_time = form_recieved.create_time

        result = form_recieved.mongo_insert()
        flash('_id= {}'.format(result))
        # return list_numbers()
        return redirect(url_for('add_edit_number'))
    return render_template('save_contact.html', title=title, form=form)
Beispiel #5
0
def mincontacts():
    if request.method == 'POST':
        req_json = request.get_json()
        web_logging.debug('req_json= {}'.format(req_json))

        # -------- request to spiders -------
        url = 'http://localhost:9080/command'
        data = {**{'Mcontact': req_json}, **req_template}
        headers = {'content_type': 'application/json'}
        doc_json = requests.get(url, headers=headers, json=data, timeout=40).json()
        web_logging.debug('doc_json= {}'.format(doc_json))
        # ===================================

        resp = make_response(json.dumps(doc_json))
        resp.headers['Content-Type'] = 'application/json'

        phone = doc_json['contact']
        print('phone=', phone)
        # put real nuumber in DB
        data_active.update_one({'bid': req_json['bid'], 'source': 'm'}, {'$set': {'phone': phone}})
        return resp
Beispiel #6
0
def list_contracts():
    """
    list and filter exists contract
    :return:
    """
    title = 'Contracts'
    # create empty filter and sorting
    mongo_filter = {}
    sort_mongo = []
    # ===============================
    form = Contracts()
    delete_contract = DeleteContract()

    if delete_contract.delete.data and delete_contract.validate_on_submit():
        web_logging.debug('pushed delete contract id= {}'.format(delete_contract.record_id.data))
        del_mongo_req = {'_id': ObjectId(delete_contract.record_id.data)}

        # deleted_count = 0
        deleted_count = contracts.delete_one(del_mongo_req).deleted_count
        flash('deleleted id= {}, count= {}'.format(del_mongo_req, deleted_count))
        return redirect(url_for('list_contracts'))

    elif form.validate_on_submit() or request.method == 'GET':
        form_copy = dict(form.data)
        del form_copy['csrf_token']
        del form_copy['filter']
        sort_options = form_copy.pop('sort_field'), form_copy.pop('sort_direction')
        # sorting
        direction_dict = {'ASCENDING': pymongo.ASCENDING, 'DESCENDING': pymongo.DESCENDING}
        if sort_options[0] is not None:
            sort_mongo = [(sort_options[0], direction_dict[sort_options[1]])]

        patern = {'contract_time_low': lambda val: {"contract_time": {'$gte': val.astimezone(timezone.utc)}},
                  'contract_time_high': lambda val: {"contract_time": {'$lte': val.astimezone(timezone.utc)}},
                  'contract_rate': lambda val: {'contract_rate': val},
                  'contract_currency': lambda val: {'contract_currency': val},
                  'contract_amount': lambda val: {'contract_amount': val},
                  # remove spaces and create list fom string, separetor == ','
                  'contract_phones': lambda val: {'contract_phones': val.replace(' ', '').split(',')},
                  'finished': lambda val: {'done_time': {'$exists': val}},
                  'done_time': lambda val: {'done_time': {'$gte': val.astimezone(timezone.utc)}},
                  'contract_comments': lambda val: {'$text': {'$search': val}},
                  }
        form_received = {key: val for key, val in form_copy.items() if val != '' and val is not None and val != 'None'}
        for key, val in form_received.items():
            # create $and key for filtering time period
            if key == 'contract_time_low' or key == 'contract_time_high':
                mongo_filter.update({'$and': [patern[key](val)]
                                    if mongo_filter.get('$and') is None
                                    else mongo_filter.get('$and') + [(patern[key](val))]})
                continue
            mongo_filter.update(patern[key](val))
        web_logging.debug('mongo_filter= {}'.format(mongo_filter))

    # create list according to previos if
    web_logging.debug('mongo_filter= {}'.format(mongo_filter))
    docs = contracts.find(mongo_filter, sort=sort_mongo)
    return render_template('contracts.html', title=title, docs=docs, form=form, delete_contract=delete_contract)
Beispiel #7
0
def edit_contact(_id: str):
    """
    edit created early contact info
    :param _id: in DB
    :return:
    """
    # ------- GET ------------
    title = 'Edit contact -- ' + _id
    doc = numbers.find_one(ObjectId(_id),
                           projection={
                               '_id': False,
                               'create_time': False,
                               'update_time': False
                           })
    # convert array in to string separated by coma
    doc = {
        key: (', '.join(val) if type(val) == list else val)
        for key, val in doc.items()
    }
    form = SaveNumber(**doc)
    # ========================

    if form.validate_on_submit():
        web_logging.debug('request to edit _id= {}'.format(_id))
        # prepare for mongo
        form_recieved = Contact()
        form_recieved.from_form(form.data)
        form_recieved.update_time = datetime.utcnow()

        result = form_recieved.mongo_update(_id)
        match_count, modified_count = result
        flash("match_count= {}, modified_count= {}".format(
            match_count, modified_count))
        return redirect(url_for('add_edit_number'))

    return render_template('save_contact.html', title=title, form=form)
Beispiel #8
0
def lists_fun(**kwargs):

    # hidden_filter = kwargs.get('hidden', {'$or': [{'hidden': {'$exists': False}}, {'hidden': False}]})
    hidden_filter = kwargs.get('hidden', {})
    title = kwargs.get('title', '')

    # modify a form dynamically in your view. This is possible by creating internal subclasses
    # http://wtforms.simplecodes.com/docs/1.0.1/specific_problems.html#dynamic-form-composition
    class Filter(FilterBase):
        pass

    setattr(
        Filter, 'sort_order',
        FieldList(FormField(SortForm), min_entries=3, validators=[Optional()]))
    # ------------------------------
    form_update = Update_db()
    form_filter = Filter()
    filter_recieved = {
        'location': form_filter.locations.data,
        'operation': form_filter.operations.data,
        'currency': form_filter.currencies.data,
        'source': form_filter.sources.data,
        '$text': {
            '$search': form_filter.text.data
        }
    }
    filter_recieved.update(hidden_filter)
    direction_dict = {
        'ASCENDING': pymongo.ASCENDING,
        'DESCENDING': pymongo.DESCENDING
    }
    # --- filter for top orders ---
    current_time = datetime.now(tz=local_tz)
    try:
        time_delta = timedelta(hours=form_filter.top_hours.data)
    except TypeError:
        time_delta = timedelta(hours=1)
    top_start_time = current_time - time_delta
    top_filter = {**filter_recieved, 'time': {'$gte': top_start_time}}
    top_limit = form_filter.top_limit.data
    if form_filter.operations.data == 'buy':
        top_sort = [('rate', pymongo.DESCENDING)]
    else:
        top_sort = [('rate', pymongo.ASCENDING)]

    sort_list = [(group_order.form.sort_field.data,
                  direction_dict[group_order.form.sort_direction.data])
                 for group_order in form_filter.sort_order
                 if group_order.form.sort_field.data != 'None']
    print(sort_list)

    # sort_list = [('time', pymongo.DESCENDING)]
    def mongo_request(original: dict) -> dict:

        mongo_dict = dict(original)
        for key, val in original.items():
            if (val == 'None' or val == 'all') and key != '$text':
                del mongo_dict[key]
            elif key == '$text' and (val == {
                    '$search': ''
            } or val == {
                    '$search': None
            }):
                del mongo_dict[key]
        return mongo_dict

    if form_update.db.data:
        web_logging.debug('update db button pushed')
        flash(json.dumps(update('lists')))
        # active_deleted = update_lists()
        # flash('recived db= {}, deleted docs={}'.format(str(form_update.db.data), active_deleted))
        flash('top_filter: {}, top_sort: {}, top_limit: {}'.format(
            top_filter, top_sort, top_limit))
        result = data_active.find(mongo_request(filter_recieved))
        result_top = data_active.find(mongo_request(top_filter),
                                      sort=top_sort,
                                      limit=top_limit)
        # replace validate_on_submit to is_submitted in reason sort_order in class Filter
        # TODO: form validation !!!, currently buldin form validators=[Optional()]
    elif form_filter.validate_on_submit():
        web_logging.debug('filter pushed')
        flash(
            'filter: City={city}, currency={currency},  Operation={operation}, source={source}, '
            'text={text}'.format(text=filter_recieved['$text'],
                                 city=filter_recieved['location'],
                                 operation=filter_recieved['operation'],
                                 currency=filter_recieved['currency'],
                                 source=filter_recieved['source']))
        flash('filter={}'.format(mongo_request(filter_recieved)))
        flash('Sort: {sort_list}'.format(sort_list=sort_list))
        flash('top_filter: {}, top_sort: {}, top_limit: {}'.format(
            top_filter, top_sort, top_limit))
        result = data_active.find(mongo_request(filter_recieved),
                                  sort=sort_list)
        result_top = data_active.find(mongo_request(top_filter),
                                      sort=top_sort,
                                      limit=top_limit)
    elif request.method == 'POST' and not form_filter.validate():
        result = []
        result_top = []
        # result = data_active.find(mongo_request(filter_recieved), sort=([('time', pymongo.DESCENDING)]))
        # result_top = data_active.find(mongo_request(top_filter), sort=top_sort, limit=top_limit)
    else:
        # default (initial) page
        result = data_active.find(mongo_request(filter_recieved),
                                  sort=([('time', pymongo.DESCENDING)]))
        result_top = data_active.find(mongo_request(top_filter),
                                      sort=top_sort,
                                      limit=top_limit)

    return render_template('lists.html',
                           title=title,
                           form_update=form_update,
                           form_filter=form_filter,
                           result=result,
                           result_top=result_top)
Beispiel #9
0
def lists_fun(**kwargs):

    # hidden_filter = kwargs.get('hidden', {'$or': [{'hidden': {'$exists': False}}, {'hidden': False}]})
    hidden_filter = kwargs.get('hidden', {})
    title = kwargs.get('title', '')
    # modify a form dynamically in your view. This is possible by creating internal subclasses
    # http://wtforms.simplecodes.com/docs/1.0.1/specific_problems.html#dynamic-form-composition
    class Filter(FilterBase):
        pass
    setattr(Filter, 'sort_order', FieldList(FormField(SortForm), min_entries=3, validators=[Optional()]))
    # ------------------------------
    form_update = Update_db()
    form_filter = Filter()
    filter_recieved = {'location': form_filter.locations.data, 'operation': form_filter.operations.data,
                        'currency': form_filter.currencies.data, 'source': form_filter.sources.data,
                        '$text': {'$search': form_filter.text.data}}
    filter_recieved.update(hidden_filter)
    direction_dict = {'ASCENDING': pymongo.ASCENDING, 'DESCENDING': pymongo.DESCENDING}
    # --- filter for top orders ---
    current_time = datetime.now(tz=local_tz)
    try:
        time_delta = timedelta(hours=form_filter.top_hours.data)
    except TypeError:
        time_delta = timedelta(hours=1)
    top_start_time = current_time - time_delta
    top_filter = {**filter_recieved, 'time': {'$gte': top_start_time}}
    top_limit = form_filter.top_limit.data
    if form_filter.operations.data == 'buy':
        top_sort = [('rate', pymongo.DESCENDING)]
    else:
        top_sort = [('rate', pymongo.ASCENDING)]


    sort_list = [(group_order.form.sort_field.data, direction_dict[group_order.form.sort_direction.data])
                 for group_order in form_filter.sort_order if group_order.form.sort_field.data != 'None']
    print(sort_list)
    # sort_list = [('time', pymongo.DESCENDING)]
    def mongo_request(original: dict) -> dict:

        mongo_dict = dict(original)
        for key, val in original.items():
            if (val == 'None' or val == 'all') and key != '$text':
                del mongo_dict[key]
            elif key == '$text' and (val == {'$search': ''} or val == {'$search': None}):
                del mongo_dict[key]
        return mongo_dict

    if form_update.db.data:
        web_logging.debug('update db button pushed')
        flash(json.dumps(update('lists')))
        # active_deleted = update_lists()
        # flash('recived db= {}, deleted docs={}'.format(str(form_update.db.data), active_deleted))
        flash('top_filter: {}, top_sort: {}, top_limit: {}'.format(top_filter, top_sort, top_limit))
        result = data_active.find(mongo_request(filter_recieved))
        result_top = data_active.find(mongo_request(top_filter), sort=top_sort, limit=top_limit)
        # replace validate_on_submit to is_submitted in reason sort_order in class Filter
        # TODO: form validation !!!, currently buldin form validators=[Optional()]
    elif form_filter.validate_on_submit():
        web_logging.debug('filter pushed')
        flash('filter: City={city}, currency={currency},  Operation={operation}, source={source}, '
              'text={text}'.format(text=filter_recieved['$text'], city=filter_recieved['location'],
                                   operation=filter_recieved['operation'], currency=filter_recieved['currency'],
                                   source=filter_recieved['source']))
        flash('filter={}'.format(mongo_request(filter_recieved)))
        flash('Sort: {sort_list}'.format(sort_list=sort_list))
        flash('top_filter: {}, top_sort: {}, top_limit: {}'.format(top_filter, top_sort, top_limit))
        result = data_active.find(mongo_request(filter_recieved), sort=sort_list)
        result_top = data_active.find(mongo_request(top_filter), sort=top_sort, limit=top_limit)
    elif request.method == 'POST' and not form_filter.validate():
        result = []
        result_top = []
        # result = data_active.find(mongo_request(filter_recieved), sort=([('time', pymongo.DESCENDING)]))
        # result_top = data_active.find(mongo_request(top_filter), sort=top_sort, limit=top_limit)
    else:
        # default (initial) page
        result = data_active.find(mongo_request(filter_recieved), sort=([('time', pymongo.DESCENDING)]))
        result_top = data_active.find(mongo_request(top_filter), sort=top_sort, limit=top_limit)

    return render_template('lists.html',
                           title=title,
                           form_update=form_update,
                           form_filter=form_filter,
                           result=result,
                           result_top=result_top)
Beispiel #10
0
def save_contract(bid):
    """
    combined form to save contract and contact
    :param bid:
    :return:
    """
    title = 'Create contract -- ' + bid
    doc = data_active.find_one({'bid': bid})
    if doc is None:
        # error exit from function
        web_logging.error('bid= {} not found in "data_active"'.format(bid))
        flash('bid= {} not found in "data_active"'.format(bid))
        return redirect(url_for('lists'))

    # take only 10 chars as number
    doc['phone'] = doc['phone'].replace('-', '')
    doc['phone'] = doc['phone'][len(doc['phone'])-10:]

    search_number = numbers.find_one({'numbers': {'$eq': doc['phone']}})
    contract = Contract()
    contract.from_lists(doc)

    if search_number is None:
        # no contacts with such number, call create new contact form
        form_doc = {'city': doc['location'], 'numbers': doc['phone'], 'comment': doc['comment'],
                    'loc_comments': doc['comment']}
        info = '--------- New Contact ------------'
    else:
        form_doc = Contact().to_form(search_number)
        info = '========= Contact already known, please check ======'

    form_doc.update(contract.as_dict())
    web_logging.debug('data for form= {}'.format(form_doc))
    form = Transaction(**form_doc)

    if form.validate_on_submit():
        contact_info = Contact()
        contact_info.from_form(form.data)

        contract_info = Contract()
        contract_info.from_form(form.data)

        if contact_info.contact_id is None:
            # contact is new
            contact_info.create_time = datetime.utcnow()
            contact_info.update_time = contact_info.create_time
            web_logging.debug('inserting contact_info= {}'.format(contact_info.as_dict()))
            web_logging.debug('inserting contract_info= {}'.format(contract_info))
            flash('inserting contact_info= {}, contract_info= {}'.format(contact_info.as_dict(), contract_info))
            result_contract = contract_info.mongo_insert()
            result_contact = contact_info.mongo_insert()
            # add contact id into document
            result_contract_upd = contracts.update_one({'_id': ObjectId(result_contract)},
                                               {'$set': {'contact': ObjectId(result_contact)}})
            result_contact_upd = numbers.update_one({'_id': ObjectId(result_contact)},
                                                {'$addToSet': {'contracts': ObjectId(result_contract)}})
        else:
            # contact already exists
            contact_info.update_time = datetime.utcnow()
            web_logging.debug('inserting contact_info= {}'.format(contact_info.as_dict()))
            web_logging.debug('inserting contract_info= {}'.format(contract_info))
            flash('updating contact_info= {}, creating contract_info= {}'.format(contact_info.as_dict(), contract_info))
            result_contract = contract_info.mongo_insert()
            result_contact = numbers.update_one({'_id': ObjectId(contact_info.contact_id)},
                                                {'$addToSet': {'contracts': ObjectId(result_contract)}})

        return redirect('/contracts')

    return render_template('contract.html', title=title, form=form, info=info)
Beispiel #11
0
def add_edit_number():
    # TODO: correct sorting
    # ---------- initial settings for GET
    title = 'Numbers'
    form_filter = FilterNumbers()
    del_number = DeleteNumber()
    # ===================================
    filter_mongo_req = {'contact_type': form_filter.contact_type.data,
                        #  for serch more then one number, need correction in mongo_request function
                        # 'number': {'$in': [form_filter.number.data.split(',')]},
                        'numbers': {'$eq': form_filter.number.data},
                        '$text': {'$search': form_filter.comment.data}}
    direction_dict = {'ASCENDING': pymongo.ASCENDING, 'DESCENDING': pymongo.DESCENDING}
    sort_mongo = [(group_order.form.sort_field.data, direction_dict[group_order.form.sort_direction.data])
                  for group_order in form_filter.sort_order if group_order.form.sort_field.data != 'None']

    if del_number.delete.data and del_number.validate_on_submit():
        # don't forget about csrf - validate_on_submit not working without it
        web_logging.debug('pushed delete number id= {}'.format(del_number.record_id.data))
        del_mongo_req = {'_id': ObjectId(del_number.record_id.data)}
        flash('saved filter= {}'.format(del_number.filters.data))

        deleted_count = 0
        deleted_count = numbers.delete_one(del_mongo_req).deleted_count
        flash('deleleted id= {}, count= {}'.format(del_mongo_req, deleted_count))

        # put saved in del_number form value into form_filter
        for key, val in json.loads(del_number.filters.data).items():
            if key == 'sort_order':
                sort_mongo = [(group_order['sort_field'], direction_dict[group_order['sort_direction']])
                             for group_order in val if group_order != 'None']
                # put sort_field values into form_filter
                for index, sort_field in enumerate(val):
                    for k, v in sort_field.items():
                        getattr(form_filter.sort_order[index], k).data = v
                continue
            if key == 'csrf_token':
                # ignore csrf_token inside form_filter object
                continue
            getattr(form_filter, key).data = val

        filter_mongo_req = {'contact_type': form_filter.contact_type.data,
                            'numbers': {'$eq': form_filter.number.data},
                            '$text': {'$search': form_filter.comment.data}}
        result = numbers.find(mongo_request(filter_mongo_req), sort=sort_mongo)
    elif form_filter.filter.data and form_filter.validate_on_submit():
        web_logging.debug('filter pushed')
        flash('filter: number={number}, contact_typ={contact_type}, text={comment}'
              .format(number=filter_mongo_req['numbers'],
                      contact_type=filter_mongo_req['contact_type'],
                      comment=filter_mongo_req['$text']))
        flash('Sort: {sort_list}'.format(sort_list=sort_mongo))
        flash('filter_received={}'.format(filter_mongo_req))
        flash('find req= {}'.format(mongo_request(filter_mongo_req)))
        del_number.filters.data = json.dumps(form_filter.data)
        result = numbers.find(mongo_request(filter_mongo_req), sort=sort_mongo)
    else:
        del_number.filters.data = json.dumps(form_filter.data)
        result = numbers.find(mongo_request(filter_mongo_req), sort=(('time', pymongo.DESCENDING),))
    flash('found count={}'.format(result.count()))
    return render_template('numbers.html', title=title, form_filter=form_filter, result=result,
                           form_del_number=del_number)
Beispiel #12
0
def list_contracts():
    """
    list and filter exists contract
    :return:
    """
    title = 'Contracts'
    # create empty filter and sorting
    mongo_filter = {}
    sort_mongo = []
    # ===============================
    form = Contracts()
    delete_contract = DeleteContract()

    if delete_contract.delete.data and delete_contract.validate_on_submit():
        web_logging.debug('pushed delete contract id= {}'.format(
            delete_contract.record_id.data))
        del_mongo_req = {'_id': ObjectId(delete_contract.record_id.data)}

        # deleted_count = 0
        deleted_count = contracts.delete_one(del_mongo_req).deleted_count
        flash('deleleted id= {}, count= {}'.format(del_mongo_req,
                                                   deleted_count))
        return redirect(url_for('list_contracts'))

    elif form.validate_on_submit() or request.method == 'GET':
        form_copy = dict(form.data)
        del form_copy['csrf_token']
        del form_copy['filter']
        sort_options = form_copy.pop('sort_field'), form_copy.pop(
            'sort_direction')
        # sorting
        direction_dict = {
            'ASCENDING': pymongo.ASCENDING,
            'DESCENDING': pymongo.DESCENDING
        }
        if sort_options[0] is not None:
            sort_mongo = [(sort_options[0], direction_dict[sort_options[1]])]

        patern = {
            'contract_time_low': lambda val: {
                "contract_time": {
                    '$gte': val.astimezone(timezone.utc)
                }
            },
            'contract_time_high': lambda val: {
                "contract_time": {
                    '$lte': val.astimezone(timezone.utc)
                }
            },
            'contract_rate': lambda val: {
                'contract_rate': val
            },
            'contract_currency': lambda val: {
                'contract_currency': val
            },
            'contract_amount': lambda val: {
                'contract_amount': val
            },
            # remove spaces and create list fom string, separetor == ','
            'contract_phones': lambda val: {
                'contract_phones': val.replace(' ', '').split(',')
            },
            'finished': lambda val: {
                'done_time': {
                    '$exists': val
                }
            },
            'done_time': lambda val: {
                'done_time': {
                    '$gte': val.astimezone(timezone.utc)
                }
            },
            'contract_comments': lambda val: {
                '$text': {
                    '$search': val
                }
            },
        }
        form_received = {
            key: val
            for key, val in form_copy.items()
            if val != '' and val is not None and val != 'None'
        }
        for key, val in form_received.items():
            # create $and key for filtering time period
            if key == 'contract_time_low' or key == 'contract_time_high':
                mongo_filter.update({
                    '$and':
                    [patern[key](val)] if mongo_filter.get('$and') is None else
                    mongo_filter.get('$and') + [(patern[key](val))]
                })
                continue
            mongo_filter.update(patern[key](val))
        web_logging.debug('mongo_filter= {}'.format(mongo_filter))

    # create list according to previos if
    web_logging.debug('mongo_filter= {}'.format(mongo_filter))
    docs = contracts.find(mongo_filter, sort=sort_mongo)
    return render_template('contracts.html',
                           title=title,
                           docs=docs,
                           form=form,
                           delete_contract=delete_contract)
Beispiel #13
0
def save_contract(bid):
    """
    combined form to save contract and contact
    :param bid:
    :return:
    """
    title = 'Create contract -- ' + bid
    doc = data_active.find_one({'bid': bid})
    if doc is None:
        # error exit from function
        web_logging.error('bid= {} not found in "data_active"'.format(bid))
        flash('bid= {} not found in "data_active"'.format(bid))
        return redirect(url_for('lists'))

    # take only 10 chars as number
    doc['phone'] = doc['phone'].replace('-', '')
    doc['phone'] = doc['phone'][len(doc['phone']) - 10:]

    search_number = numbers.find_one({'numbers': {'$eq': doc['phone']}})
    contract = Contract()
    contract.from_lists(doc)

    if search_number is None:
        # no contacts with such number, call create new contact form
        form_doc = {
            'city': doc['location'],
            'numbers': doc['phone'],
            'comment': doc['comment'],
            'loc_comments': doc['comment']
        }
        info = '--------- New Contact ------------'
    else:
        form_doc = Contact().to_form(search_number)
        info = '========= Contact already known, please check ======'

    form_doc.update(contract.as_dict())
    web_logging.debug('data for form= {}'.format(form_doc))
    form = Transaction(**form_doc)

    if form.validate_on_submit():
        contact_info = Contact()
        contact_info.from_form(form.data)

        contract_info = Contract()
        contract_info.from_form(form.data)

        if contact_info.contact_id is None:
            # contact is new
            contact_info.create_time = datetime.utcnow()
            contact_info.update_time = contact_info.create_time
            web_logging.debug('inserting contact_info= {}'.format(
                contact_info.as_dict()))
            web_logging.debug(
                'inserting contract_info= {}'.format(contract_info))
            flash('inserting contact_info= {}, contract_info= {}'.format(
                contact_info.as_dict(), contract_info))
            result_contract = contract_info.mongo_insert()
            result_contact = contact_info.mongo_insert()
            # add contact id into document
            result_contract_upd = contracts.update_one(
                {'_id': ObjectId(result_contract)},
                {'$set': {
                    'contact': ObjectId(result_contact)
                }})
            result_contact_upd = numbers.update_one(
                {'_id': ObjectId(result_contact)},
                {'$addToSet': {
                    'contracts': ObjectId(result_contract)
                }})
        else:
            # contact already exists
            contact_info.update_time = datetime.utcnow()
            web_logging.debug('inserting contact_info= {}'.format(
                contact_info.as_dict()))
            web_logging.debug(
                'inserting contract_info= {}'.format(contract_info))
            flash(
                'updating contact_info= {}, creating contract_info= {}'.format(
                    contact_info.as_dict(), contract_info))
            result_contract = contract_info.mongo_insert()
            result_contact = numbers.update_one(
                {'_id': ObjectId(contact_info.contact_id)},
                {'$addToSet': {
                    'contracts': ObjectId(result_contract)
                }})

        return redirect('/contracts')

    return render_template('contract.html', title=title, form=form, info=info)
Beispiel #14
0
def add_edit_number():
    # TODO: correct sorting
    # ---------- initial settings for GET
    title = 'Numbers'
    form_filter = FilterNumbers()
    del_number = DeleteNumber()
    # ===================================
    filter_mongo_req = {
        'contact_type': form_filter.contact_type.data,
        #  for serch more then one number, need correction in mongo_request function
        # 'number': {'$in': [form_filter.number.data.split(',')]},
        'numbers': {
            '$eq': form_filter.number.data
        },
        '$text': {
            '$search': form_filter.comment.data
        }
    }
    direction_dict = {
        'ASCENDING': pymongo.ASCENDING,
        'DESCENDING': pymongo.DESCENDING
    }
    sort_mongo = [(group_order.form.sort_field.data,
                   direction_dict[group_order.form.sort_direction.data])
                  for group_order in form_filter.sort_order
                  if group_order.form.sort_field.data != 'None']

    if del_number.delete.data and del_number.validate_on_submit():
        # don't forget about csrf - validate_on_submit not working without it
        web_logging.debug('pushed delete number id= {}'.format(
            del_number.record_id.data))
        del_mongo_req = {'_id': ObjectId(del_number.record_id.data)}
        flash('saved filter= {}'.format(del_number.filters.data))

        deleted_count = 0
        deleted_count = numbers.delete_one(del_mongo_req).deleted_count
        flash('deleleted id= {}, count= {}'.format(del_mongo_req,
                                                   deleted_count))

        # put saved in del_number form value into form_filter
        for key, val in json.loads(del_number.filters.data).items():
            if key == 'sort_order':
                sort_mongo = [(group_order['sort_field'],
                               direction_dict[group_order['sort_direction']])
                              for group_order in val if group_order != 'None']
                # put sort_field values into form_filter
                for index, sort_field in enumerate(val):
                    for k, v in sort_field.items():
                        getattr(form_filter.sort_order[index], k).data = v
                continue
            if key == 'csrf_token':
                # ignore csrf_token inside form_filter object
                continue
            getattr(form_filter, key).data = val

        filter_mongo_req = {
            'contact_type': form_filter.contact_type.data,
            'numbers': {
                '$eq': form_filter.number.data
            },
            '$text': {
                '$search': form_filter.comment.data
            }
        }
        result = numbers.find(mongo_request(filter_mongo_req), sort=sort_mongo)
    elif form_filter.filter.data and form_filter.validate_on_submit():
        web_logging.debug('filter pushed')
        flash(
            'filter: number={number}, contact_typ={contact_type}, text={comment}'
            .format(number=filter_mongo_req['numbers'],
                    contact_type=filter_mongo_req['contact_type'],
                    comment=filter_mongo_req['$text']))
        flash('Sort: {sort_list}'.format(sort_list=sort_mongo))
        flash('filter_received={}'.format(filter_mongo_req))
        flash('find req= {}'.format(mongo_request(filter_mongo_req)))
        del_number.filters.data = json.dumps(form_filter.data)
        result = numbers.find(mongo_request(filter_mongo_req), sort=sort_mongo)
    else:
        del_number.filters.data = json.dumps(form_filter.data)
        result = numbers.find(mongo_request(filter_mongo_req),
                              sort=(('time', pymongo.DESCENDING), ))
    flash('found count={}'.format(result.count()))
    return render_template('numbers.html',
                           title=title,
                           form_filter=form_filter,
                           result=result,
                           form_del_number=del_number)