# Path: djangovirtualpos/util.py
# def dictlist(node):
#     res = {}
#     res[node.tag] = []
#     xmltodict(node, res[node.tag])
#     reply = {}
#     reply[node.tag] = {'value': res[node.tag], 'attribs': node.attrib, 'tail': node.tail}
# 
#     return reply
# 
# def localize_datetime(_datetime):
#     """Localiza la marca de tiempo en función de la zona de tiempo del servidor. Sólo y exclusivamente si no está localizada ya."""
#     if timezone.is_naive(_datetime):
#         return as_server_datetime(_datetime)
#     return _datetime


import base64
import json
import re
import cgi
import random
import urllib2, urllib
import urlparse
import hashlib
import datetime
import time
import requests
from bs4 import BeautifulSoup
from debug import dlprint
from django.core.exceptions import ObjectDoesNotExist
from django.db import models
from django.conf import settings
from django.core.validators import MinLengthValidator, MaxLengthValidator, RegexValidator
from django.db.models import Sum
from django.http import HttpResponse
from django.utils import timezone
from django.shortcuts import redirect
from django.core.urlresolvers import reverse
from django.utils import translation
from Crypto.Cipher import DES3
from Crypto.Hash import SHA256, HMAC
from lxml import etree
from decimal import Decimal
from djangovirtualpos.util import dictlist, localize_datetime
from django.utils.translation import ugettext_lazy as _
from bs4 import BeautifulSoup
        from forms import VPOSCecaForm
        from forms import VPOSRedsysForm
        from forms import VPOSPaypalForm
        from forms import VPOSSantanderElavonForm
        # Usado para recuperar los datos la referencia
        vpos.delegated.ds_merchantparameters = operation_data

        ## Datos que llegan por POST
        # Firma enviada por RedSys, que más tarde compararemos con la generada por el comercio
        vpos.delegated.firma = request.POST.get("Ds_Signature")

        # Versión del método de firma utilizado
        vpos.delegated.signature_version = request.POST.get("Ds_SignatureVersion")

        # Parámetros de la operación (en base64 + JSON)
        vpos.delegated.merchant_parameters = request.POST.get("Ds_MerchantParameters")

        ## Datos decodificados de Ds_MerchantParameters
        # Respuesta de la pasarela de pagos. Indica si la operación se autoriza o no
        vpos.delegated.ds_response = operation_data.get("Ds_Response")

        return vpos.delegated

    ####################################################################
    ## Paso 3.1.b  Procesar notificación SOAP
    @staticmethod
    def _receiveConfirmationSOAP(request):
        dlprint(u"Notificación Redsys SOAP:")
        body = request.body
        dlprint(body)

        root = etree.fromstring(body)
        tree = etree.ElementTree(root)


# Path: djangovirtualpos/util.py
# def dictlist(node):
#     res = {}
#     res[node.tag] = []
#     xmltodict(node, res[node.tag])
#     reply = {}
#     reply[node.tag] = {'value': res[node.tag], 'attribs': node.attrib, 'tail': node.tail}
# 
#     return reply
# 
# def localize_datetime(_datetime):
#     """Localiza la marca de tiempo en función de la zona de tiempo del servidor. Sólo y exclusivamente si no está localizada ya."""
#     if timezone.is_naive(_datetime):
#         return as_server_datetime(_datetime)
#     return _datetime


# Path: djangovirtualpos/models.py
import base64
import json
import re
import cgi
import random
import urllib2, urllib
import urlparse
import hashlib
import datetime
import time
import requests
from bs4 import BeautifulSoup
from debug import dlprint
from django.core.exceptions import ObjectDoesNotExist
from django.db import models
from django.conf import settings
from django.core.validators import MinLengthValidator, MaxLengthValidator, RegexValidator
from django.db.models import Sum
from django.http import HttpResponse
from django.utils import timezone
from django.shortcuts import redirect
from django.core.urlresolvers import reverse
from django.utils import translation
from Crypto.Cipher import DES3
from Crypto.Hash import SHA256, HMAC
from lxml import etree
from decimal import Decimal
from djangovirtualpos.util import dictlist, localize_datetime
from django.utils.translation import ugettext_lazy as _
from bs4 import BeautifulSoup
        from forms import VPOSCecaForm
        from forms import VPOSRedsysForm
        from forms import VPOSPaypalForm
        from forms import VPOSSantanderElavonForm

        # Usado para recuperar los datos la referencia
        vpos.delegated.ds_merchantparameters = operation_data

        ## Datos que llegan por POST
        # Firma enviada por RedSys, que más tarde compararemos con la generada por el comercio
        vpos.delegated.firma = request.POST.get("Ds_Signature")

        # Versión del método de firma utilizado
        vpos.delegated.signature_version = request.POST.get("Ds_SignatureVersion")

        # Parámetros de la operación (en base64 + JSON)
        vpos.delegated.merchant_parameters = request.POST.get("Ds_MerchantParameters")

        ## Datos decodificados de Ds_MerchantParameters
        # Respuesta de la pasarela de pagos. Indica si la operación se autoriza o no
        vpos.delegated.ds_response = operation_data.get("Ds_Response")

        return vpos.delegated

    ####################################################################
    ## Paso 3.1.b  Procesar notificación SOAP
    @staticmethod
    def _receiveConfirmationSOAP(request):
        dlprint(u"Notificación Redsys SOAP:")
        body = request.body
        dlprint(body)

        root = etree.fromstring(body)
        tree = etree.ElementTree(root)


        soapdict = dictlist(tree.getroot())