From 16bd3b61bffbc647fbffe7b466a9cebc13dccdca Mon Sep 17 00:00:00 2001
From: anonymous <anonymous>
Date: Thu, 21 Mar 2019 13:41:02 +0100
Subject: [PATCH] ODPSH-319: fix date handling

---
 .../odsh/i18n/de/LC_MESSAGES/ckanext-odsh.mo  | Bin 6854 -> 7236 bytes
 .../odsh/i18n/de/LC_MESSAGES/ckanext-odsh.po  |  12 ++++
 ckanext/odsh/plugin.py                        |   2 -
 .../snippets/package_basic_fields.html        |   4 +-
 ckanext/odsh/validation.py                    |  56 ++++++++----------
 5 files changed, 38 insertions(+), 36 deletions(-)

diff --git a/ckanext/odsh/i18n/de/LC_MESSAGES/ckanext-odsh.mo b/ckanext/odsh/i18n/de/LC_MESSAGES/ckanext-odsh.mo
index f6ea89603905f9e8c34163ed34e4c37f6745d5fb..6a4f231e3fe3eb077e58edd541d7f9df437152ed 100644
GIT binary patch
delta 2049
zcmX?Rdc>mso)F7a1_lO(A_fKq83qQ1HOwF$0^6`NFo1+?p|m5Ec4cQ^U}0cj@PzXH
z*cljv7#J9W*clkO85kH+*&*f?vNJHSGB7aou`@8RGcYhrfy&QeXJFuGV5nzU!Op<I
z#lXO@gPnmvkb!~WFgpW-0s{lXRdxmjNd^XnZ%}ao4v0D>4u}Q191w#oIUp9>b1*Ql
zfgHfWz`)7Cz!1s7z#zfEz>o|Tui;=|5MW?nXy$;}GlheJL5!iEfnga3#ASP-7952d
zd;zNQ8V3Ud9|Hr!T@D5YQ3eKvHyjKMstgPaOq>i1ybKHs8k`IaDhvz^W}FNRA`A=+
z(VPqnvJ4Ci1yK1uPKZb5a6-)4#tCuwQ4qhLfq~&PRO2m9h|AwY>7SespE7fSgNlKl
zi-AFkfq_Au3lj8JTnr363=9nRTo8kOxEL68K@Q-8IJA=sV$pmq1_llW28N|vkPuo2
zRlk*sfuSBGafFM3L7ahs;Vjgmr%(&NLKXgkigR*994N^RF;JNs5+yp^5C@oZLmcMD
z&A_0@z`)?m4GGy?sQOYUT?Z9!=Vqt}$5}r&Bq*nGL*i@+H^k?AxfvL=85kH&ax*Yk
zGcYiG<%T3iLmo&Rn({y_bmw7U5N2Rt@Zo{@Jb?$|p)wvwTI%D0MA>>C1_n(~+Jf@`
z^VCBWsPZx}$T2W5xbZ^xsl1TX+r|rt+r_+)I6c7&iOXla3=Hz1Ou`4@EAT-Qp%s+&
z<%2jVfe&JC2_M8^lldU#ujGS-<f(c-1_mYu28Jt8gRb*2Fi0~nFnr`=V9;Y=VBqCv
zVDMsKV6fq5V6b3dU})!OV3@$jz;J*c5@LaZkhBpm2#JDxC|xHA3Bg`Lh`O1AkdR$2
z2nmS;Q1SX_f{;Y?1xhmtL0rlw1j-%^3@T8*wGab?8Uq7Epb*686+#e$XF%nb2|*mN
zM+g$<r-dNd?XnOg(LE7@q?Ok~kdXQY;ny>83NtV$GcYiS2s1D!F)%P#2t$G_S{S0S
z3Q9K$LsD}Gl;0-|$!=4HAtAO(7?M_w2}2z632F|b2qY>ML?8~g6@i3ItOzJd>lqj_
zMIec(T?CS7W{N;UU?Y@&Tm<5i`yvn@e-MGh-9HgX+;fOR5|xrDMBYaf68BM}5OeZG
z85oQh7#LbaAr9Cs3h~HwQ3eK1Q2xIw3i0W4kN^V%!#hz(s{SDg3G%<95TB}uL4wv&
z4B}u%F^I#0#UKt!fzo+m5QkJi)wPL1a?K1e1_m7l28KCeknDR>jDevZR8(GqYP<ub
zpNT;d)dw+1fdVQV%o!LM^u!?+rinwMs9YS9NT-QId~{SC;;_@=5D(pjs(&KRz@P!j
zzTyz`<RlmvK<4>KFw}#yU5f<7pv4l9)Okq)6gLbEKO`VQCngCA2~SA|1}#w0DhVlI
zW=ld0+$#x*``3~T42BF04B}Fdp!bx5I5=JklIRMgAnKc?AP(3l<pI&~QVLSQNJ~S4
zCR`d4WC_xcA~!`El8EZ185k@<K`70@;LO0la7`K#_fj&Of3c~vXQbv9<QFC8#HZ$^
zSSh6D7L-&nl%R;^<(DWVDwHMWWTq&jB$lKiq>D=ui%KvwK}FHEZI<WT#XWhExY%S(
zNx8`@#05Ch5AVq-$xKfzo~$7$KY4{X|Kuh~xyg&gMR-&56kw8h3X|tcin1sqmKIOG
HA^8pf@R#NJ

delta 1819
zcmX?Nam=*-o)F7a1_lO(JO%~^83qQ19%c{^f&Z{EFo1;qLTN^J2%nXmfq{jAfq@gs
z=VNDJ5Mp3p5MpOw;AUW8P-TahXUNXLz{<eD;K$Cuz|O$H5CWBtVP|0AXJDvj$Y5t+
z;9_84s9<Mc5M*FrXl7?%P+(wSn99z;Aj!bMunj7H0jlm1)PT28gMUIT{?E?9zy@*v
z2Ll5q0|SF32Lpoy0|SFH2SnV4gMmSSfq}u917c4I2Lpo`Lp=jS8VAH>wHy$Kv~oaP
zJOQe48V3Ud9|Hr!Tn+{XQ3eKvH5?2KstgPahd3A*co`TNUT`ols4y@veB)qX5Mf|o
zkmh7ykY!+CFyMs9`*A`%62l2Gr;HO~ek+Jy&%nUY%?Z&sixcAV^-y{zCnP8jbAp44
z;XEe;gA@Y;!+lOj(Es9OVBle3VE7L*h=GBDhl_zh7vumgh(kTOAQr`QF)(m2FfgQY
zK|&&r3*wMcE(V5rkVFd?1A{mN14Azt#G<8K5DT_K74CwHpX7o#@Fvv2$6SyQdjnPX
z9jcFwn}I=*fq{XW8xpd*+z<ztLTNjwxH~sPJvh$%xgkLn#tn(H6mE#mYq=R1v>6x}
zI=LAbtQi;>wsJ!f-$!mp9De17IFy}-fk7A)0z43(EAT)(WX1zYOMX0%D9h(zV9*4m
zEhv9KPd!AzQyvBeIR*v>HeLu{l^2qF-FP8!o6HM|(+*xpTrT5fV322EU^oEfKj4L=
z{$Eg<mk$zB3VaL<ObiSRT6_?Fx_k@_(hLj??tBakdJGH<$@P2;3|<Tj43qd67%UhV
z81C{hFic=%U=ZVngvfFMNR(_9fW+BRD1Ai$5<-s!AnM)=Ktk@X0K}(af)H^VK}Z_$
zg3{rFkPu1{1f_lkhWaX~z(hd?1~mo-hUJ0~pPhpm@D3{fM-buwAt6YdDhffelco?P
zQCSH=(t@K9BqV&G{CFV-24w~YhAbfl1|<dthCU%kNN<Gbt7o_XVK7`5f~3}aQ2rAk
zNUnG-1PL-w1cTCoj4;F@9>NfV!i6DGRVEB^_+(*7$ZQsdMA?2}NLslo3`rC3g&`rp
zE&}4$Gcd@CKzw2<0tqrV5lGyHh(O{jP6U!@DxmU<L?DT6g9yZ+BO(k8MhpxLw?rTg
z;1z{<L{}7Ij<F~tglwUF7g0!}^%G@aPy^-vU{Q!qt3)9|+b;@n@pMs$!&X8y?t;=s
zL?I462UT}R6p}06i83(gFfcHD5`|<pc`=9sG@!H*l(rFrq$xKs28Mc2fe|Lgz+le6
zz|bNFv2c$VBxuiyK~m`(F^G?(#UTz;6o>f8SRA6>N}Pc~gMop;TO3jVm54*kTO<xK
z=ax9coS)*5#Hk?xi5fo%hI(+&<w!sh-+T!M1}z2#hGP<t0_39v#6V$5NIBpr$-rR9
zz`&3z2?_f7k`M=Mm4qa^W0DY`-;{)e$RkNeiTO+tl13P%7#J)W7#QTF7#N%x7#Jd?
ZI3RI5M{2VbyE^;k(|kL)Cx=VF1ps=>oTdN(

diff --git a/ckanext/odsh/i18n/de/LC_MESSAGES/ckanext-odsh.po b/ckanext/odsh/i18n/de/LC_MESSAGES/ckanext-odsh.po
index 9fc567af..94c7e9e3 100644
--- a/ckanext/odsh/i18n/de/LC_MESSAGES/ckanext-odsh.po
+++ b/ckanext/odsh/i18n/de/LC_MESSAGES/ckanext-odsh.po
@@ -177,9 +177,21 @@ msgstr "Bitte geben Sie einen räumlichen Bezug an"
 msgid "odsh_temporal_start_error_label"
 msgstr "Bitte wählen Sie einen Beginn des Zeitraumes aus"
 
+msgid "temporal_start: empty"
+msgstr "Bitte wählen Sie einen Beginn des Zeitraumes aus"
+
 msgid "odsh_temporal_end_error_label"
 msgstr "Bitte wählen Sie ein Ende des Zeitraumes aus"
 
+msgid "temporal_end: empty"
+msgstr "Bitte wählen Sie ein Ende des Zeitraumes aus"
+
+msgid "temporal_start: not a valid date"
+msgstr "Bitte wählen Sie einen gültigen Beginn des Zeitraumes aus"
+
+msgid "temporal_end: not a valid date"
+msgstr "Bitte wählen Sie ein gültiges Ende des Zeitraumes aus"
+
 msgid "odsh_temporal_error_label"
 msgstr "Bitte geben Sie einen gültigen Zeitraum an"
 
diff --git a/ckanext/odsh/plugin.py b/ckanext/odsh/plugin.py
index a60136bd..744e6066 100644
--- a/ckanext/odsh/plugin.py
+++ b/ckanext/odsh/plugin.py
@@ -247,8 +247,6 @@ class OdshPlugin(plugins.SingletonPlugin, DefaultTranslation, DefaultDatasetForm
 
         schema['extras'].update({
             'key': [
-                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 8371d5d7..4445b81a 100644
--- a/ckanext/odsh/templates/package/snippets/package_basic_fields.html
+++ b/ckanext/odsh/templates/package/snippets/package_basic_fields.html
@@ -107,8 +107,8 @@ is_required=true,placeholder=_('Enter title')) }}
     {% endblock %}
 
     <!-- timerange -->
-    {% set error_start = h.odsh_extract_error('temporal_start', errors) %}
-    {% set error_end = h.odsh_extract_error('temporal_end', errors) %}
+    {% set error_start = h.odsh_extract_error_new('temporal_start', errors) %}
+    {% set error_end = h.odsh_extract_error_new('temporal_end', errors) %}
     {% set error_string = 'odsh_temporal_error_label' if error_start and error_end else (error_start if error_start else (error_end if error_end))%}
     <label for="start-end" class="control-label">{{ _('timerange') }}:
         <span title="{{ _("This field is required") }}" class="control-required">*</span>
diff --git a/ckanext/odsh/validation.py b/ckanext/odsh/validation.py
index 05fd5ade..0c2177f3 100644
--- a/ckanext/odsh/validation.py
+++ b/ckanext/odsh/validation.py
@@ -21,12 +21,12 @@ def _extract_value(data, field):
         return None
     return data[(key[0], key[1], 'value')]
 
-def validate_extra_groups(data, requireAtLeastOne):
+def validate_extra_groups(data, requireAtLeastOne, errors):
     value = _extract_value(data, 'groups')
     if not value:
-        if not requireAtLeastOne:
-            return None
-        return 'at least one group needed'
+        if requireAtLeastOne:
+            errors['groups']= 'at least one group needed'  
+        return 
 
     groups = [g.strip() for g in value.split(',') if value.strip()]
     for k in data.keys():
@@ -34,29 +34,24 @@ def validate_extra_groups(data, requireAtLeastOne):
             data[k]=''
             # del data[k]
     if len(groups)==0:
-        if not requireAtLeastOne:
-            return None
-        return 'at least one group needed'
+        if requireAtLeastOne:
+            errors['groups']= 'at least one group needed'  
+        return 
 
     for num, tag in zip(range(len(groups)), groups):
         data[('groups', num, 'id')] = tag
 
 def validate_extras(key, data, errors, context):
-    pass
     extra_errors = {}
-    error = validate_extra_groups(data,False)
-    if error:
-        extra_errors['groups'] = error
+    isStaNord = ('id',) in data and data[('id',)][:7] == 'StaNord'
 
-    error = validate_extra_date_new(key, 'issued', data, False)
-    if error:
-        extra_errors['issued'] = error
+    validate_extra_groups(data, False, extra_errors)
+    validate_extra_date_new(key, 'issued', data, False, extra_errors)
+    validate_extra_date_new(key, 'temporal_start', data, isStaNord, extra_errors)
+    validate_extra_date_new(key, 'temporal_end', data, True, extra_errors)
+    validate_licenseAttributionByText(data, extra_errors)
 
-    error = validate_licenseAttributionByText(data)
-    if error:
-        extra_errors['licenseAttributionByText'] = error
-
-    if extra_errors:
+    if len(extra_errors.values()):
         raise toolkit.Invalid(extra_errors)
 
 def _set_value(data, field, value):
@@ -69,25 +64,24 @@ def _set_value(data, field, value):
         return None
     data[(key[0], key[1], 'value')] = value
 
-def validate_extra_date_new(key, field, data, optional=False):
+def validate_extra_date_new(key, field, data, optional, errors):
     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'
+        if not optional:
+            errors[field] = 'empty'
+        return
     else:
         if re.match(r'\d\d\d\d-\d\d-\d\d', value):
             try:
+                print('parse')
+                print(value)
                 dt=parse(value)
                 _set_value(data, field, dt.isoformat())
                 return
             except ValueError:
                 pass
-        return 'not a valid date'
+        errors[field] = 'not a valid date'
 
 def validate_extra_date(key, field, data, optional=False):
     value = _extract_value(data, field)
@@ -113,7 +107,7 @@ def validate_extra_date(key, field, data, optional=False):
 def validate_extra_date_factory(field, optional=False):
     return lambda key, data, errors, context: validate_extra_date(key, field, data, optional)
 
-def validate_licenseAttributionByText(data):
+def validate_licenseAttributionByText(data, errors):
     register = model.Package.get_license_register()
     isByLicense=False
     for k in data:
@@ -133,9 +127,9 @@ def validate_licenseAttributionByText(data):
                 hasAttribution = value != ''
                 break
     if isByLicense and not hasAttribution:
-        return 'empty not allowed'
+        errors['licenseAttributionByText'] = 'empty not allowed'
     if not isByLicense and hasAttribution:
-        return 'text not allowed for this license'
+        errors['licenseAttributionByText'] = 'text not allowed for this license'
 
 def known_spatial_uri(key, data, errors, context):
     value = _extract_value(data, 'spatial_uri')
@@ -210,8 +204,6 @@ def tag_string_convert(key, data, errors, context):
 def get_validators():
     return {
             'known_spatial_uri': known_spatial_uri,
-            'odsh_validate_temporal_start': validate_extra_date_factory('temporal_start'),
-            '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