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
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)
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)
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)
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
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)
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)
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)
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)
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)
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)
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)
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)
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)