def inner(request): try: return func(request) except Exception as e: ResponseError.log_error(request, e) raise e
def home(request): c = request.body logging.debug(c) if request.method == "GET": logging.debug("kdhohdjdhdj") return HttpResponse('The request need to be POST') url = 'file://' + os.path.join(settings.BASE_DIR, 'quickbooks', 'qb.wsdl') # FIXME: huge_tree allow this thing to eat up your memory! parser = etree.XMLParser(huge_tree=True) contents = etree.parse(request, parser) root = contents.getroot() request_type = get_request_type(root) # Log the message QWCMessage.objects.create(request_type=request_type, message=etree.tostring(root, pretty_print=True) ) print('REQUEST TYPE RECEIVED IS: %s ========================================' % (request_type or 'Unkown')) if request_type: print etree.tostring(root, pretty_print=True) # Dispatch the signal qbxml = None if request_type == REQUEST_RECEIVE_REQUEST: qbxml = etree.fromstring(root[0].find(tag('receiveResponseXML'))[1].text) request_received.send(sender=type(request), request_type=request_type, root=root, qbxml=qbxml) if request_type == REQUEST_GET_LAST_ERROR: last_error = ResponseError.get_last_error() message = last_error.content if last_error else "" return HttpResponse(get_last_error % message, content_type='text/xml') # We need to listen to authenticate, token or error. cont = root[0][0] ticket = cont.find(tag('ticket')) if request_type == REQUEST_AUTHENTICATE: logging.debug('Authentication call detected') username = cont.find(tag('strUserName')).text password = cont.find(tag('strPassword')).text # Authenticate with database a = authenticate(username=username, password=password) if a: session_started.send(sender=type(request), start_time=timezone.localtime(timezone.now()), authenticated=True) logging.debug('Valid Authentication username and password user: %s' % (a.username)) # everything active need to be inactive ac = QWCTicket.objects.filter(user=a, active=True) if ac != None: for ca in ac: ca.active = False ca.save() ti = QWCTicket.objects.create(user=a) logging.debug('Ticket has been created ticket: %s' % (ti.ticket)) # resp = client.service.authenticateResponse(ti.ticket).envelope s = '' try: s = a.userprofile.company_file logging.debug('company file detected: %s' % (s)) except: logging.debug('Company file not found') logging.debug("Authenticated xml message sent") return HttpResponse(authenticated % (ti.ticket, s), content_type='text/xml') else: logging.debug('invalid user detected username: %s password %s' % (username, password)) session_started.send(sender=type(request), start_time=timezone.localtime(timezone.now()), authenticated=False) session_ended.send(sender=type(request), end_time=timezone.localtime(timezone.now()), result=False, message="Invalid username or password supplied") return HttpResponse(failed, content_type='text/xml') if ticket is not None: t = QWCTicket.objects.get(ticket=ticket.text) if t is not None: # all_fancy_stuff = cont.find(tag('strHCPResponse')).text profile = None company_file_location = cont.find(tag('strCompanyFileName')) # update the company_file location if it's not updated. try: profile = t.user.userprofile except Exception as e: profile = UserProfile.objects.create(user=t.user) if company_file_location is not None: if company_file_location != profile.company_file: profile.company_file = company_file_location.text profile.save() logging.debug("Dealing with ticket: %s" % (ticket.text)) receive_response = root[0].find(tag('receiveResponseXML')) logging.debug(root.findall(tag('receiveResponseXML'))) logging.debug(root.find(tag('receiveResponseXML'))) logging.debug(root.findtext(tag('receiveResponseXML'))) send_request = root[0].find(tag('sendRequestXML')) list_id = None logging.debug('LIST ID ====>> %s', str(list_id)) logging.debug(send_request) if request_type == REQUEST_SEND_REQUEST: logging.debug("sendRequestXML detected tags will appear below:") for child in send_request: logging.debug(child.tag) mq = MessageQue.objects.filter(user=t.user, active=True) if len(mq) != 0: logging.debug("MessageQue has one or more messages awaiting") m = mq[0] ms = m.message logging.debug("sending message in que: %s" % (m.id)) # Mark message as consumed m.active = False m.save() return HttpResponse(qrequest % (xml_soap(ms)), content_type='text/xml') else: logging.debug("No message in messageQue") logging.info("activating everything that is set to repeat") logging.debug('Finished') repeats = MessageQue.objects.filter(repeat=True, active=False) for repeat in repeats: repeat.active = True repeat.save() # delete tickets and messages that are not in use: MessageQue.objects.filter(repeat=False, active=False).delete() QWCTicket.objects.filter(active=False).delete() session_ended.send(sender=type(request), end_time=timezone.localtime(timezone.now()), result=True, message="All messages processed successfully") return HttpResponse(close_connection % ("Finished!"), content_type='text/xml') return HttpResponse(close_connection % (100), content_type='text/xml') else: logging.debug("sendRequestXML Not detected") if request_type == REQUEST_RECEIVE_REQUEST: logging.debug(receive_response.text) tick = QWCTicket.objects.get(ticket=ticket.text) response = receive_response[1].text request_id = None try: receive_plain = etree.fromstring(response) receive_query_name = receive_plain[0][0].tag[:-2] except Exception, e: logging.debug("Error it apears like response is empty") logging.error(e) if response != None: logging.debug('response is %s' % (response)) resp = ReceiveResponse.objects.create(ticket=tick, response=response, name=receive_query_name) # Let's try to do something with this response now! qn = "".join(re.sub("([A-Z])", " \g<0>", receive_query_name).split(" ")[1:-1]) print("RESPONSE TYPE: %s" % receive_query_name) logging.info("THAT IS ===> %s" %(qn)) if qn in QBXML.NAMES: # does that model name exists ? if so enter data in that thing m = get_model(qn) if m != None: logging.debug("Model does exist") print("Model exists for %s" % qn) items = receive_plain[0][0] logging.debug('items are ==> %s', str(items)) print('items are ==> %s', str(items)) list_id, txn_id = None, None ids = {} for item in items: t = {} m2m_data = {} for it in item: converted_tag = convert(it.tag) logging.debug('items => %s' %(str(it.tag))) if it.tag == 'ListID': list_id = it.text ids["list_id"] = list_id logging.debug("listid is %s" %(str(list_id))) elif it.tag == 'TxnID': txn_id = it.text ids["txn_id"] = txn_id if len(it): # This is a nested item if has_related_field(m, converted_tag): print("HEYYY %s has %s as a related field" % (m, converted_tag)) nested_attr = {} related_model = get_related_fk_model(m, converted_tag) related_field = get_related_field(m, converted_tag) related_name = related_field.related_query_name() nested_list_ids = {} for itt in it: converted_nested_tag = convert(itt.tag) if itt.tag == "ListID": print("Found nested list ID: %s" % itt.text) nested_list_ids[converted_nested_tag] = itt.text if has_field(related_model, converted_nested_tag): # only save fields, not fk fields or m2m fields nested_attr.update({converted_nested_tag: itt.text}) else: print("%s isn't a normal field on %s, it maybe a relation... we're not currently doing nested relations tho..." % (converted_nested_tag, related_model)) if not nested_list_ids and ids: # If the nested model doesn't have a ListID on it, try and find it by the relationship for _id, val in ids.items(): nested_list_ids["%s__%s" % (related_name, _id)] = val if nested_attr and nested_list_ids: related_obj, created = related_model.objects.update_or_create(defaults=nested_attr, **nested_list_ids) t[converted_tag] = related_obj elif has_m2m_field(m, converted_tag): print("HEYYY %s has a M2M field" % converted_tag) elif has_field(m, converted_tag): t.update({converted_tag: it.text}) # but first.. does that already exists ? logging.debug("qbwc %s" %(t)) print("Will look for objects matching %s and update with the following attributes... " % ids) pprint(t) if ids: obj, created = m.objects.update_or_create(defaults=t, **ids) # Deal with the m2m models else: logging.debug("no list_id or txn_id strange ?? ") # Do something if this response was a Response , maybe update the database with relationship? logging.debug('Check if we need to do something after handling with a response') # First get related objects of the selected model hope it is only one. request_id = receive_plain[0][0].attrib['requestID'] if ids and request_id: logging.debug(request_id) for md in m._meta.get_all_related_objects(): logging.debug('Looking for models') logging.debug(md) try: mod = md.model.objects.filter(pk=request_id)[0] except IndexError: mod = None if mod: pk = ids.get(ids.keys()[0]) if pk: mod.quickbooks = m.objects.get(pk=pk) mod.save() else: print("No model found to object") else: logging.debug('Nothing found in settings') else: if settings.DEBUG: logging.debug("Model does not exist") print('No model exists for %s' % qn) # this model does not exist, what about making a file with all it's data maybe we can use it # Dump it only if debug is set to True (DEBUG=True) # if it does not catch here remember to look in qbxml().names items = receive_plain[0][0] with(open(os.path.join(settings.BASE_DIR, '..', str(qn) + '_model.txt'), 'w+')) as f: f.write("class QB%s(models.Model):\n" %(qn)) keys = [] for item in items: t = {} for it in item: keys.append(it.tag) for key in set(keys): if key == 'ListID': f.write(" %s = models.CharField(max_length=2500, primary_key=True) # %s\n" %(convert(key), key)) else: f.write(" %s = models.CharField(max_length=2500, blank=True, null=True) # %s\n" %(convert(key), key)) logging.debug('writed the class in a txt file please copy and paste it in your models') return HttpResponse(close_connection % ('ssss'), content_type='text/xml') else: logging.debug("This message does not contain response")
def home(request): c = request.body logging.debug(c) if request.method == "GET": logging.debug("kdhohdjdhdj") return HttpResponse('The request need to be POST') url = 'file://' + os.path.join(settings.BASE_DIR, 'quickbooks', 'qb.wsdl') # FIXME: huge_tree allow this thing to eat up your memory! parser = etree.XMLParser(huge_tree=True) contents = etree.parse(request, parser) root = contents.getroot() request_type = get_request_type(root) # Log the message QWCMessage.objects.create(request_type=request_type, message=etree.tostring(root, pretty_print=True)) print( 'REQUEST TYPE RECEIVED IS: %s ========================================' % (request_type or 'Unkown')) if request_type: print etree.tostring(root, pretty_print=True) # Dispatch the signal qbxml = None if request_type == REQUEST_RECEIVE_REQUEST: qbxml = etree.fromstring(root[0].find( tag('receiveResponseXML'))[1].text) request_received.send(sender=type(request), request_type=request_type, root=root, qbxml=qbxml) if request_type == REQUEST_GET_LAST_ERROR: last_error = ResponseError.get_last_error() message = last_error.content if last_error else "" return HttpResponse(get_last_error % message, content_type='text/xml') # We need to listen to authenticate, token or error. cont = root[0][0] ticket = cont.find(tag('ticket')) if request_type == REQUEST_AUTHENTICATE: logging.debug('Authentication call detected') username = cont.find(tag('strUserName')).text password = cont.find(tag('strPassword')).text # Authenticate with database a = authenticate(username=username, password=password) if a: session_started.send(sender=type(request), start_time=timezone.localtime(timezone.now()), authenticated=True) logging.debug( 'Valid Authentication username and password user: %s' % (a.username)) # everything active need to be inactive ac = QWCTicket.objects.filter(user=a, active=True) if ac != None: for ca in ac: ca.active = False ca.save() ti = QWCTicket.objects.create(user=a) logging.debug('Ticket has been created ticket: %s' % (ti.ticket)) # resp = client.service.authenticateResponse(ti.ticket).envelope s = '' try: s = a.userprofile.company_file logging.debug('company file detected: %s' % (s)) except: logging.debug('Company file not found') logging.debug("Authenticated xml message sent") return HttpResponse(authenticated % (ti.ticket, s), content_type='text/xml') else: logging.debug('invalid user detected username: %s password %s' % (username, password)) session_started.send(sender=type(request), start_time=timezone.localtime(timezone.now()), authenticated=False) session_ended.send(sender=type(request), end_time=timezone.localtime(timezone.now()), result=False, message="Invalid username or password supplied") return HttpResponse(failed, content_type='text/xml') if ticket is not None: t = QWCTicket.objects.get(ticket=ticket.text) if t is not None: # all_fancy_stuff = cont.find(tag('strHCPResponse')).text profile = None company_file_location = cont.find(tag('strCompanyFileName')) # update the company_file location if it's not updated. try: profile = t.user.userprofile except Exception as e: profile = UserProfile.objects.create(user=t.user) if company_file_location is not None: if company_file_location != profile.company_file: profile.company_file = company_file_location.text profile.save() logging.debug("Dealing with ticket: %s" % (ticket.text)) receive_response = root[0].find(tag('receiveResponseXML')) logging.debug(root.findall(tag('receiveResponseXML'))) logging.debug(root.find(tag('receiveResponseXML'))) logging.debug(root.findtext(tag('receiveResponseXML'))) send_request = root[0].find(tag('sendRequestXML')) list_id = None logging.debug('LIST ID ====>> %s', str(list_id)) logging.debug(send_request) if request_type == REQUEST_SEND_REQUEST: logging.debug("sendRequestXML detected tags will appear below:") for child in send_request: logging.debug(child.tag) mq = MessageQue.objects.filter(user=t.user, active=True) if len(mq) != 0: logging.debug("MessageQue has one or more messages awaiting") m = mq[0] ms = m.message logging.debug("sending message in que: %s" % (m.id)) # Mark message as consumed m.active = False m.save() return HttpResponse(qrequest % (xml_soap(ms)), content_type='text/xml') else: logging.debug("No message in messageQue") logging.info("activating everything that is set to repeat") logging.debug('Finished') repeats = MessageQue.objects.filter(repeat=True, active=False) for repeat in repeats: repeat.active = True repeat.save() # delete tickets and messages that are not in use: MessageQue.objects.filter(repeat=False, active=False).delete() QWCTicket.objects.filter(active=False).delete() session_ended.send( sender=type(request), end_time=timezone.localtime(timezone.now()), result=True, message="All messages processed successfully") return HttpResponse(close_connection % ("Finished!"), content_type='text/xml') return HttpResponse(close_connection % (100), content_type='text/xml') else: logging.debug("sendRequestXML Not detected") if request_type == REQUEST_RECEIVE_REQUEST: logging.debug(receive_response.text) tick = QWCTicket.objects.get(ticket=ticket.text) response = receive_response[1].text request_id = None try: receive_plain = etree.fromstring(response) receive_query_name = receive_plain[0][0].tag[:-2] except Exception, e: logging.debug("Error it apears like response is empty") logging.error(e) if response != None: logging.debug('response is %s' % (response)) resp = ReceiveResponse.objects.create(ticket=tick, response=response, name=receive_query_name) # Let's try to do something with this response now! qn = "".join( re.sub("([A-Z])", " \g<0>", receive_query_name).split(" ")[1:-1]) print("RESPONSE TYPE: %s" % receive_query_name) logging.info("THAT IS ===> %s" % (qn)) if qn in QBXML.NAMES: # does that model name exists ? if so enter data in that thing m = get_model(qn) if m != None: logging.debug("Model does exist") print("Model exists for %s" % qn) items = receive_plain[0][0] logging.debug('items are ==> %s', str(items)) print('items are ==> %s', str(items)) list_id, txn_id = None, None ids = {} for item in items: t = {} m2m_data = {} for it in item: converted_tag = convert(it.tag) logging.debug('items => %s' % (str(it.tag))) if it.tag == 'ListID': list_id = it.text ids["list_id"] = list_id logging.debug("listid is %s" % (str(list_id))) elif it.tag == 'TxnID': txn_id = it.text ids["txn_id"] = txn_id if len(it): # This is a nested item if has_related_field(m, converted_tag): print( "HEYYY %s has %s as a related field" % (m, converted_tag)) nested_attr = {} related_model = get_related_fk_model( m, converted_tag) related_field = get_related_field( m, converted_tag) related_name = related_field.related_query_name( ) nested_list_ids = {} for itt in it: converted_nested_tag = convert( itt.tag) if itt.tag == "ListID": print( "Found nested list ID: %s" % itt.text) nested_list_ids[ converted_nested_tag] = itt.text if has_field( related_model, converted_nested_tag ): # only save fields, not fk fields or m2m fields nested_attr.update({ converted_nested_tag: itt.text }) else: print( "%s isn't a normal field on %s, it maybe a relation... we're not currently doing nested relations tho..." % (converted_nested_tag, related_model)) if not nested_list_ids and ids: # If the nested model doesn't have a ListID on it, try and find it by the relationship for _id, val in ids.items(): nested_list_ids["%s__%s" % (related_name, _id)] = val if nested_attr and nested_list_ids: related_obj, created = related_model.objects.update_or_create( defaults=nested_attr, **nested_list_ids) t[converted_tag] = related_obj elif has_m2m_field(m, converted_tag): print("HEYYY %s has a M2M field" % converted_tag) elif has_field(m, converted_tag): t.update({converted_tag: it.text}) # but first.. does that already exists ? logging.debug("qbwc %s" % (t)) print( "Will look for objects matching %s and update with the following attributes... " % ids) pprint(t) if ids: obj, created = m.objects.update_or_create( defaults=t, **ids) # Deal with the m2m models else: logging.debug( "no list_id or txn_id strange ?? ") # Do something if this response was a Response , maybe update the database with relationship? logging.debug( 'Check if we need to do something after handling with a response' ) # First get related objects of the selected model hope it is only one. request_id = receive_plain[0][0].attrib[ 'requestID'] if ids and request_id: logging.debug(request_id) for md in m._meta.get_all_related_objects(): logging.debug('Looking for models') logging.debug(md) try: mod = md.model.objects.filter( pk=request_id)[0] except IndexError: mod = None if mod: pk = ids.get(ids.keys()[0]) if pk: mod.quickbooks = m.objects.get( pk=pk) mod.save() else: print("No model found to object") else: logging.debug('Nothing found in settings') else: if settings.DEBUG: logging.debug("Model does not exist") print('No model exists for %s' % qn) # this model does not exist, what about making a file with all it's data maybe we can use it # Dump it only if debug is set to True (DEBUG=True) # if it does not catch here remember to look in qbxml().names items = receive_plain[0][0] with (open( os.path.join(settings.BASE_DIR, '..', str(qn) + '_model.txt'), 'w+')) as f: f.write("class QB%s(models.Model):\n" % (qn)) keys = [] for item in items: t = {} for it in item: keys.append(it.tag) for key in set(keys): if key == 'ListID': f.write( " %s = models.CharField(max_length=2500, primary_key=True) # %s\n" % (convert(key), key)) else: f.write( " %s = models.CharField(max_length=2500, blank=True, null=True) # %s\n" % (convert(key), key)) logging.debug( 'writed the class in a txt file please copy and paste it in your models' ) return HttpResponse(close_connection % ('ssss'), content_type='text/xml') else: logging.debug("This message does not contain response")