From 4cee6afb59e069141f2b1ccce3d8c0bca1a9993f Mon Sep 17 00:00:00 2001
From: adorda <angdmz@gmail.com>
Date: Tue, 30 Jul 2019 12:05:22 -0300
Subject: [PATCH] Validator, field y arreglo de bug de signers

---
 gateway/fields.py     |  8 ++++++++
 gateway/gateway.py    |  5 ++++-
 gateway/utils.py      | 17 +++++++++++++++++
 gateway/validators.py |  9 +++++++++
 setup.py              |  5 +++--
 5 files changed, 41 insertions(+), 3 deletions(-)
 create mode 100644 gateway/validators.py

diff --git a/gateway/fields.py b/gateway/fields.py
index e69de29..4a207e4 100644
--- a/gateway/fields.py
+++ b/gateway/fields.py
@@ -0,0 +1,8 @@
+from django.db.models.fields import CharField
+from gateway.validators import validate_address
+
+
+class AddressField(CharField):
+    def __init__(self, *args, **kwargs):
+        self.default_validators.append(validate_address)
+        super().__init__(*args, **kwargs)
diff --git a/gateway/gateway.py b/gateway/gateway.py
index 621f731..fe43567 100644
--- a/gateway/gateway.py
+++ b/gateway/gateway.py
@@ -159,7 +159,7 @@ class Gateway:
     def block_is_canonical_poa(self, block_number):
         last_block_number = self.get_last_blocknumber()
         tx_block_number = block_number
-        required_block_difference = math.ceil(self.get_signers_count() / 2) + 1
+        required_block_difference = math.ceil(len(self.get_signers()) / 2) + 1
         return (last_block_number - tx_block_number) > required_block_difference
 
     def pending_transactions(self):
@@ -171,6 +171,9 @@ class Gateway:
         return txs
 
     def get_signers_count(self):
+        return len(self.get_signers())
+
+    def get_signers(self):
         return self.w3.manager.request_blocking("clique_getSigners", [])
 
     def get_smart_contract_bytecode(self, smart_contract_address):
diff --git a/gateway/utils.py b/gateway/utils.py
index f81b8a6..c3d2d22 100644
--- a/gateway/utils.py
+++ b/gateway/utils.py
@@ -36,3 +36,20 @@ def hex32bytes_string(some_hex32bytes):
         return Web3.toText(some_hex32bytes.decode().strip('\\\u0000'))
     except UnicodeDecodeError as ude:
         return some_hex32bytes
+
+
+class HexBytesToDict:
+    def dehex_dict(self, dictionary):
+        for k, v in dictionary.items():
+            if isinstance(v, dict):
+                self.dehex_dict(dictionary[k])
+            elif isinstance(v, list):
+                self.dehex_list(dictionary[k])
+            elif isinstance(v, HexBytes):
+                dictionary[k] = v.hex()
+
+    def dehex_list(self, sequence):
+        i = 0
+        while i < len(sequence):
+            sequence[i] = sequence[i].decode()
+            i = i + 1
diff --git a/gateway/validators.py b/gateway/validators.py
new file mode 100644
index 0000000..1e662bb
--- /dev/null
+++ b/gateway/validators.py
@@ -0,0 +1,9 @@
+from django.core.exceptions import ValidationError
+from django.utils.translation import gettext_lazy as _
+from gateway.gateway import AddressValidation
+
+
+def validate_address(value):
+    validator = AddressValidation()
+    if not validator.is_valid(value):
+        raise ValidationError(_('%(value)s is not a valid address'), params={'value': value})
diff --git a/setup.py b/setup.py
index 6df36b3..94ab5a1 100644
--- a/setup.py
+++ b/setup.py
@@ -9,7 +9,7 @@ os.chdir(os.path.normpath(os.path.join(os.path.abspath(__file__), os.pardir)))
 
 setup(
     name='django-ethgateway',
-    version='0.0.2',
+    version='0.0.4',
     packages=find_packages(),
     include_package_data=True,
     license='GNU GPL License',  # example license
@@ -20,7 +20,8 @@ setup(
     author_email='agustindorda@gmail.com',
     install_requires=[
         'aiohttp==3.5.4',
-        'web3==4.6.0'
+        'web3==4.6.0',
+        'Django==2.1.7'
     ],
     classifiers=[
         'Framework :: Django',
-- 
GitLab