From 93df33485214aef9bd76d42d1e0c7cfd15cd5ade Mon Sep 17 00:00:00 2001
From: anonymous <anonymous>
Date: Thu, 21 Mar 2019 09:30:00 +0100
Subject: [PATCH] start refactor validation

---
 ckanext/odsh/helpers.py                       |   2 +
 .../odsh/i18n/de/LC_MESSAGES/ckanext-odsh.mo  | Bin 6459 -> 6632 bytes
 .../odsh/i18n/de/LC_MESSAGES/ckanext-odsh.po  |   6 +++
 ckanext/odsh/plugin.py                        |   1 -
 .../snippets/package_basic_fields.html        |   6 +--
 ckanext/odsh/validation.py                    |  50 ++++++++++++++----
 6 files changed, 51 insertions(+), 14 deletions(-)

diff --git a/ckanext/odsh/helpers.py b/ckanext/odsh/helpers.py
index d2d07cfb..92ee251f 100644
--- a/ckanext/odsh/helpers.py
+++ b/ckanext/odsh/helpers.py
@@ -160,6 +160,8 @@ def odsh_extract_error(key, errors, field='extras'):
                     return error.replace(key+':', '')
 
 def odsh_extract_error_new(key, errors):
+    print('ERRORS')
+    print(errors)
     if not errors or not ('__extras' in errors):
         return None
     error = errors['__extras'][0].get(key,None)
diff --git a/ckanext/odsh/i18n/de/LC_MESSAGES/ckanext-odsh.mo b/ckanext/odsh/i18n/de/LC_MESSAGES/ckanext-odsh.mo
index 6c58f6b551b398f3a3e09aed54d9584bf7cb6417..621d249dadacd7b628fc15fa6ccd6f87096605a4 100644
GIT binary patch
delta 1833
zcmdmO^uoCQo)F7a1_lO(90mpk83qQ18fFj=f$y*}Fo1;aLg|N4`Y9U&0}BHK!%Hat
z9UB9K5Ca3lCpHEKZUzPhR(6Pag6s?otPBhcdh84g><kPHChQP-8+HZ;eg=km1`l=y
z1}+8$h6r{B20;b}hGcdI1_cHNhEjG021y16hG|go4N!H5paz_U8hn!-V)1=;1_m~e
z1K1fDI2jliezG$#NH8!kFmph}WjGiZ1Q-|?lsO>wm~b#Kh%wYNFt~9*To%g#aY!l$
z#Ki?rjb$7R415d>47D5#45ADS3_TnS45|za42w7z7<d^N7*237FsLvvFkItcU=U$o
zVEE0!z#z-Oz#za0k=Nsdc*KSiVon$*#Qanczn+1CA)6DTv5FJo@_r~ilM@nDi#fqT
z#ju`}fkBFafnh%<B<OE(GBEHkFfiN)8N|TA@P?CtK^NozPKZM_xgZwVb1^V*FfcH<
zazR4Ej|<|EP%Z|BdXPj47XyPh0|P@Y7sR4gE{Kb#azQLw57n>*Du0*@;?T=bgYR-d
zLhcz<-AAZCP(lF3IV(5B0lZLJj2jZ-^4tvd;5bv~h6WWkB+hKOAwCb~h9tg3Zb+P^
zazh+c&dtCe3`(rr5T8!qhIn8ZHze)s<Ay}heQpK@O;BRwf$;TtAo8I+3=DD%3=CyF
z^$>xnJdo77jRz8!mw6y@_=5)$5@Ngz4Dt*N3<kUqegH2d(PcsDT3$$qOyFf;U}9ik
zm<3fgmzRM-nt_2~J1+x+9s>izWnKmbF9rq%CO!rR3kC)T-+Dd<h6#)e3~hXn5D*uD
zM1iURB#um>w2J^FM1ln%>f!|;A(blt@mU*Ge2oAkP3(fw#|0oEbVUG^+8G#LLHUe=
z3=C=v3=H++f)JnC2|^5x6NG5U5rjCPNe~iO69pmJXQm(|5v>x0#Q8=+NJ#8~^3Mx0
zFeo!HFx(PkU{GRUVE88p32H?lh&~4>?JfjPob?QTP=OF3NG^yLf&^KC5CelYD7y(k
z9I`_QV$g9RNK`!&f;gO67!oqd!jLG_7lx!2Utvg^h!=)<s2s}g6^3|ZsW8aH^$ZN#
zgduTvL>Lmc=Y%1N<^@;*1A~wVB(W)oKnyYwVPG&~U|{ePfjFR61nd)rxgrpA7K=c9
zx)#dcA_7UY`$Ql?epm$J(N`i23_76v|6c?W#5$r7mz#(}T<9hWF)$oTCyIhx%)pQh
zRaYqr$sOIIknGhDRW}1lFM`r*L?LNvn<%7wI3~)#V9vn6@I{n?p&nEu>WD#nU@Hc3
zfU_9H2ccpRhs206Fld0v2Qi2N)5IVK91(*=$saLD>XsIVBt|cBNK_PvLqe)g9OCnX
z;tUL03=9k}#2FYA85kIZB^c7cC6=iKB(9Ss7#Iv07#R8`AVGal0^)${5|BjpLIUE`
z-x3g?vq(ZpL=H(vnoyQxV6bFhU~rIRU~pz&V5pLWMCHECJJ~{6)G~{UOH)&<6jE~w
sN-7y(yuADpg+zt2#GK3&g_OjS)XluyMO>2~iHlDDCmOi9UUUyL09?PTe*gdg

delta 1754
zcmaE1yxXY$o)F7a1_lO(ECvP!83qQ19A*#?f%mX6Fo1;iLg|B0`Y0O%0}BHK!$~Or
z92*0J5Ca3lB{l{IZUzR1r)&`OKC&?|ure?(@Ub&6urn|)h_FNCW!M=Q_!$`L88p}#
z7`PZ17%bQs7z7y@7@XM|7!(*77(&?@7$g}O7|NjH6QJrAK@C{T4l#HqJH+Ds><kQS
zAP2BBFmN(3Fx+HkV31&7V0a7_|HIC}Ai%)Dz{~-$M}&icL5!iEfkBM};xbzfh(laC
zAO;6;Knx7yU|`^5U|@*lU|<jhg%Ae=gDL|9LlXxB11|#u!wL=t1{DSdhHV@S3?d8+
z47WKL7-Sh37(PJd`8XjSk>P}xW5x+F-xb8KXJBCP=7eaB;)J+7A4*qpLV~K96C6|w
z{hSO8QVa|X^En|wzl)QBfro*CVL!+q1_p*RoD2-QAO~<l9LmWBu}Geafq{d8fkBlE
z;vqdQh(k=d7#Qk75-wZ}4B`w748B|ti&D8DE-vMQSkw>IFa;{Vm<!_2%}|5)azR4w
z7*yRwsJ;hWkdS=}RreN3e}jtu=VGV_#~C{}#HW1Rki;g%4T&Q;ZioX6xEUCP85kH$
zxgkFD<c2sno*R-@%DEv?GJ~6eL6d=jVIP$L0xHkP!@wZNz`&r-15xkC14*3uJoS*c
z>*0aK*+w3S&(HHPFvv47Fua8FIe8(8Oc_d>@j^ntlb3;kiGhJ3m=~fijF*8ynt_3#
zfR}+mkAZ=qhnIoDi-Cb*H!lN&1p@;E8y^G11V#o1dp=0oxlqp!3G#dVkT`h<rT_9n
zLWD;EqEJErlA6^7AU?H+il+)d(m*kkZV-TkP_F<ebu%z5hVpj_FfgbwFfd#YfOzaX
zRDZp=AVh<zAjARIf{-}#5`<)zAVEl?Nfv~}ah4z?Bub(D4nYP6Wd;U@$$|_FN(>AP
z+XW#(eG97ZCzJ*i4xn;?T?k?xuMjxV*E5I+L4r(Eh=D<yfq}tQ2;z`JA&5Z@LXfzc
zF9dP<9wA7`+!2CA*$W{^T4580qzMUOh=&ZId^cf;N8*GbA(<}>iMm>0P?Xg(FtiIp
z63s%Wg44o~#C8*E&|6^!1|v|xAp&uLnFu6Xg^556iV=bMC=JTb6@et$auG<7*NA|9
z%CK03fkB6XfnkRTB!r)eFfa&$^8Z^AhztKi4G<887%U|Uaj}Xh#D_+rklf)S3dzqN
zP<4S&IvPr+ibB#<z9_`pdQpgjCqT`aCJJ%z3Q-1zdQg$LUX+1BgMoqJfGDH@c`3@k
zV9vn6AT9=p0)H_`YR(gbB)+*~kf1*-1__ymVi2E-h%+!~F)%P#i!(4NGB7Zti9^im
z5QjwVHgN_9Lk0$hN8*qu5|LnV1DDBK5|Bh?EdlYFp9I9G;S!J%FIobU2FfHD7%V}F
hO@e{JnSp`ftOO+L1UKJg3uW0H%3a8{Sx0OSGXN5BktP5D

diff --git a/ckanext/odsh/i18n/de/LC_MESSAGES/ckanext-odsh.po b/ckanext/odsh/i18n/de/LC_MESSAGES/ckanext-odsh.po
index 950414e8..65fedcd3 100644
--- a/ckanext/odsh/i18n/de/LC_MESSAGES/ckanext-odsh.po
+++ b/ckanext/odsh/i18n/de/LC_MESSAGES/ckanext-odsh.po
@@ -207,10 +207,16 @@ msgstr "Bitte geben Sie einen Titel ein"
 msgid "odsh_issued_error_label"
 msgstr "Bitte wählen Sie ein Veröffentlichungsdatum"
 
+msgid "issued: empty"
+msgstr "Bitte wählen Sie ein Veröffentlichungsdatum"
+
 
 msgid "odsh_issued_not_date_error_label"
 msgstr "Bitte wählen Sie ein korrektes Veröffentlichungsdatum"
 
+msgid "issued: not a valid date"
+msgstr "Bitte wählen Sie ein korrektes Veröffentlichungsdatum"
+
 msgid "Tag string: Fehlender Wert"
 msgstr "Bitte wählen Sie geeignete Schlagwörter"
 
diff --git a/ckanext/odsh/plugin.py b/ckanext/odsh/plugin.py
index 71ecf35f..52d4e62a 100644
--- a/ckanext/odsh/plugin.py
+++ b/ckanext/odsh/plugin.py
@@ -253,7 +253,6 @@ class OdshPlugin(plugins.SingletonPlugin, DefaultTranslation, DefaultDatasetForm
 
         schema['extras'].update({
             'key': [
-                toolkit.get_converter('odsh_validate_issued'),
                 toolkit.get_converter('odsh_validate_temporal_start'),
                 toolkit.get_converter('odsh_validate_temporal_end'),
                 toolkit.get_converter('known_spatial_uri'),
diff --git a/ckanext/odsh/templates/package/snippets/package_basic_fields.html b/ckanext/odsh/templates/package/snippets/package_basic_fields.html
index 5426a680..29ba4e24 100644
--- a/ckanext/odsh/templates/package/snippets/package_basic_fields.html
+++ b/ckanext/odsh/templates/package/snippets/package_basic_fields.html
@@ -158,8 +158,8 @@ is_required=true,placeholder=_('Enter title')) }}
 
     {% set field = 'issued' %}
     {% set data_issued = h.odsh_extract_value_from_extras(data.extras,field) %}
-    {% set value = data_issued.split('T')[0] if data_issued else h.odsh_now()%}
-    {% set error = h.odsh_extract_error(field, errors) %}
+    {% set error = h.odsh_extract_error_new(field, errors) %}
+    {% set value = data_issued.split('T')[0] if data_issued else (h.odsh_now() if not error else '')%}
     <div class="control-group {{ " error" if error }} control-full">
         <label class="control-label" for="field-{{field}}">Veröffentlichungsdatum: <span title="Dieses Feld ist erforderlich" class="control-required">*</span> </label>
         <div class="controls">
@@ -172,7 +172,7 @@ is_required=true,placeholder=_('Enter title')) }}
                 </div>
                 <div class="span6 inline-error">
                     {% if error %} 
-                    {{_(error)}}
+                    {{_('issued: ' + error)}}
                     {% endif %}
                 </div>
             </div>
diff --git a/ckanext/odsh/validation.py b/ckanext/odsh/validation.py
index 3a6d6ef8..4b9c0db7 100644
--- a/ckanext/odsh/validation.py
+++ b/ckanext/odsh/validation.py
@@ -24,7 +24,7 @@ def _extract_value(data, field):
 def validate_extra_groups(data):
     value = _extract_value(data, 'groups')
     if not value:
-        raise toolkit.Invalid({'groups':'at least one group needed'})
+        return 'at least one group needed'
 
     groups = [g.strip() for g in value.split(',') if value.strip()]
     for k in data.keys():
@@ -32,13 +32,24 @@ def validate_extra_groups(data):
             data[k]=''
             # del data[k]
     if len(groups)==0:
-        raise toolkit.Invalid({'groups':'at least one group needed'})
+        return 'at least one group needed'
 
     for num, tag in zip(range(len(groups)), groups):
         data[('groups', num, 'id')] = tag
 
 def validate_extras(key, data, errors, context):
-    validate_extra_groups(data)
+    pass
+    extra_errors = {}
+    error = validate_extra_groups(data)
+    if error:
+        extra_errors['groups'] = error
+
+    error = validate_extra_date_new(key, 'issued', data, False)
+    if error:
+        extra_errors['issued'] = error
+
+    if extra_errors:
+        raise toolkit.Invalid(extra_errors)
 
 def _set_value(data, field, value):
     key = None
@@ -50,12 +61,32 @@ def _set_value(data, field, value):
         return None
     data[(key[0], key[1], 'value')] = value
 
-def validate_extra_date(key, field, data, errors, context):
+def validate_extra_date_new(key, field, data, optional=False):
+    value = _extract_value(data, field)
+
+    if not value:
+        if optional:
+            return 
+        # Statistikamt Nord does not always provide temporal_start/end,
+        # but their datasets have to be accepted as they are.
+        if not ('id',) in data or data[('id',)][:7] != 'StaNord':
+            return 'empty'
+    else:
+        if re.match(r'\d\d\d\d-\d\d-\d\d', value):
+            try:
+                dt=parse(value)
+                _set_value(data, field, dt.isoformat())
+                return
+            except ValueError:
+                pass
+        return 'not a valid date'
+
+def validate_extra_date(key, field, data, optional=False):
     value = _extract_value(data, field)
 
     if not value:
-        if field == 'temporal_end':
-            return # temporal_end is optional
+        if optional:
+            return 
         # Statistikamt Nord does not always provide temporal_start/end,
         # but their datasets have to be accepted as they are.
         if not ('id',) in data or data[('id',)][:7] != 'StaNord':
@@ -71,8 +102,8 @@ def validate_extra_date(key, field, data, errors, context):
         raise toolkit.Invalid(field+':odsh_'+field+'_not_date_error_label')
 
 
-def validate_extra_date_factory(field):
-    return lambda key, data, errors, context: validate_extra_date(key, field, data, errors, context)
+def validate_extra_date_factory(field, optional=False):
+    return lambda key, data, errors, context: validate_extra_date(key, field, data, optional)
 
 def validate_licenseAttributionByText(key, data, errors, context):
     register = model.Package.get_license_register()
@@ -172,9 +203,8 @@ def get_validators():
     return {
             'licenseAttributionByText': validate_licenseAttributionByText,
             'known_spatial_uri': known_spatial_uri,
-            'odsh_validate_issued': validate_extra_date_factory('issued'),
             'odsh_validate_temporal_start': validate_extra_date_factory('temporal_start'),
-            'odsh_validate_temporal_end': validate_extra_date_factory('temporal_end'),
+            'odsh_validate_temporal_end': validate_extra_date_factory('temporal_end', True),
             'odsh_tag_name_validator': tag_name_validator,
             'odsh_validate_extras':validate_extras
             }
\ No newline at end of file
-- 
GitLab