[SEBA-126] Adding xproto support for min and max validators

Change-Id: I6141c678d88a894db2a86132bdbad4e9c6b31b2f
diff --git a/lib/xos-genx/xosgenx/jinja2_extensions/django.py b/lib/xos-genx/xosgenx/jinja2_extensions/django.py
index 464172a..64ab51a 100644
--- a/lib/xos-genx/xosgenx/jinja2_extensions/django.py
+++ b/lib/xos-genx/xosgenx/jinja2_extensions/django.py
@@ -79,18 +79,22 @@
             return 'GenericRelation'
 
 def map_xproto_to_django(f):
-    allowed_keys=['help_text','default','max_length','modifier','blank','choices','db_index','null','editable','on_delete','verbose_name', 'auto_now_add', 'unique']
+    allowed_keys=['help_text','default','max_length','modifier','blank','choices','db_index','null','editable','on_delete','verbose_name', 'auto_now_add', 'unique', 'min_value', 'max_value']
 
-    m = {'modifier':{'optional':True, 'required':False, '_target':'null'}}
+    # TODO evaluate if setting Null = False for all strings
+    m = {'modifier':{'optional':True, 'required':False, '_targets': ['null', 'blank']}}
     out = {}
 
     for k,v in f['options'].items():
-        if (k in allowed_keys):
+        if k in allowed_keys:
             try:
+                # NOTE this will be used to parse xproto optional/required field prefix and apply it to the null and blank fields
                 kv2 = m[k]
-                out[kv2['_target']] = kv2[v]
+                for t in kv2['_targets']:
+                    out[t] = kv2[v]
             except:
                 out[k] = v
+
     return out
 
 def xproto_django_link_options_str(field, dport=None):
@@ -121,17 +125,33 @@
 
     return format_options_string(output_dict)
 
+def use_native_django_validators(k, v):
+
+    validators_map = {
+        'min_value': 'MinValueValidator',
+        'max_value': 'MaxValueValidator'
+    }
+
+    return "%s(%s)" % (validators_map[k], v)
+
 def format_options_string(d):
+
+    known_validators = ['min_value', 'max_value']
+    validator_lst = []
+
     if (not d):
         return ''
     else:
 
         lst = []
         for k,v in d.items():
-            if (type(v)==str and k=='default' and v.endswith('()"')):
+            if k in known_validators:
+                validator_lst.append(use_native_django_validators(k, v))
+            elif (type(v)==str and k=='default' and v.endswith('()"')):
                 lst.append('%s = %s'%(k,v[1:-3]))
             elif (type(v)==str and v.startswith('"')): 
                 try:
+                    # unquote the value if necessary
                     tup = eval(v[1:-1])
                     if (type(tup)==tuple):
                         lst.append('%s = %r'%(k,tup))
@@ -146,8 +166,14 @@
                     lst.append('%s = %r'%(k,int(v)))
                 except ValueError:
                     lst.append('%s = %s'%(k,v))
-
-        return ', '.join(lst)
+        validator_string = "validators=[%s]" % ', '.join(validator_lst)
+        option_string = ', '.join(lst)
+        if len(validator_lst) == 0:
+            return option_string
+        elif len(lst) == 0:
+            return validator_string
+        else:
+            return  option_string + ", " + validator_string
 
 def xproto_django_options_str(field, dport=None):
     output_dict = map_xproto_to_django(field)